|
63 | 63 | } |
64 | 64 | #endif |
65 | 65 |
|
| 66 | +/* On a dispatch failure the action_results are not trustworthy. Fall back to |
| 67 | + * the context's configured default policy: reject only if that policy rejects, |
| 68 | + * or if it can't be determined (including a NULL context). |
| 69 | + */ |
| 70 | +static int lwip_ws_failure_rejects(WOLFSENTRY_CONTEXT_ARGS_IN) { |
| 71 | + wolfsentry_action_res_t default_policy; |
| 72 | + wolfsentry_errcode_t ws_ret; |
| 73 | + if (wolfsentry == NULL) |
| 74 | + return 1; |
| 75 | + ws_ret = wolfsentry_context_lock_shared(WOLFSENTRY_CONTEXT_ARGS_OUT); |
| 76 | + if (WOLFSENTRY_IS_FAILURE(ws_ret)) |
| 77 | + return 1; |
| 78 | + ws_ret = wolfsentry_route_default_policy_get(WOLFSENTRY_CONTEXT_ARGS_OUT, &default_policy); |
| 79 | + (void)wolfsentry_context_unlock(WOLFSENTRY_CONTEXT_ARGS_OUT); |
| 80 | + if (WOLFSENTRY_IS_FAILURE(ws_ret)) |
| 81 | + return 1; |
| 82 | + return WOLFSENTRY_MASKIN_BITS(default_policy, WOLFSENTRY_ACTION_RES_REJECT) ? 1 : 0; |
| 83 | +} |
| 84 | + |
66 | 85 | #if LWIP_ARP || LWIP_ETHERNET |
67 | 86 |
|
68 | 87 | #include "netif/ethernet.h" |
@@ -101,7 +120,7 @@ static err_t ethernet_filter_with_wolfsentry( |
101 | 120 | #endif |
102 | 121 |
|
103 | 122 | if (wolfsentry == NULL) |
104 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 123 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
105 | 124 |
|
106 | 125 | switch(event->reason) { |
107 | 126 | case FILT_RECEIVING: |
@@ -132,7 +151,7 @@ static err_t ethernet_filter_with_wolfsentry( |
132 | 151 | case FILT_LISTENING: |
133 | 152 | case FILT_STOP_LISTENING: |
134 | 153 | /* can't happen. */ |
135 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 154 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
136 | 155 | } |
137 | 156 |
|
138 | 157 | remote.remote.sa_family = WOLFSENTRY_AF_LINK; |
@@ -182,7 +201,9 @@ static err_t ethernet_filter_with_wolfsentry( |
182 | 201 |
|
183 | 202 | WOLFSENTRY_WARN_ON_FAILURE(ws_ret); |
184 | 203 |
|
185 | | - if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
| 204 | + if (WOLFSENTRY_IS_FAILURE(ws_ret)) |
| 205 | + ret = lwip_ws_failure_rejects(WOLFSENTRY_CONTEXT_ARGS_OUT) ? ERR_ABRT : ERR_OK; |
| 206 | + else if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
186 | 207 | ret = ERR_ABRT; |
187 | 208 | else |
188 | 209 | ret = ERR_OK; |
@@ -238,7 +259,7 @@ static err_t ip4_filter_with_wolfsentry( |
238 | 259 | #endif |
239 | 260 |
|
240 | 261 | if (wolfsentry == NULL) |
241 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 262 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
242 | 263 |
|
243 | 264 | switch(event->reason) { |
244 | 265 | case FILT_RECEIVING: |
@@ -272,7 +293,7 @@ static err_t ip4_filter_with_wolfsentry( |
272 | 293 | case FILT_LISTENING: |
273 | 294 | case FILT_STOP_LISTENING: |
274 | 295 | /* can't happen. */ |
275 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 296 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
276 | 297 | } |
277 | 298 |
|
278 | 299 | remote.remote.sa_family = WOLFSENTRY_AF_INET; |
@@ -322,7 +343,9 @@ static err_t ip4_filter_with_wolfsentry( |
322 | 343 |
|
323 | 344 | WOLFSENTRY_WARN_ON_FAILURE(ws_ret); |
324 | 345 |
|
325 | | - if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
| 346 | + if (WOLFSENTRY_IS_FAILURE(ws_ret)) |
| 347 | + ret = lwip_ws_failure_rejects(WOLFSENTRY_CONTEXT_ARGS_OUT) ? ERR_ABRT : ERR_OK; |
| 348 | + else if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
326 | 349 | ret = ERR_ABRT; |
327 | 350 | else |
328 | 351 | ret = ERR_OK; |
@@ -373,7 +396,7 @@ static err_t ip6_filter_with_wolfsentry( |
373 | 396 | #endif |
374 | 397 |
|
375 | 398 | if (wolfsentry == NULL) |
376 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 399 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
377 | 400 |
|
378 | 401 | switch(event->reason) { |
379 | 402 | case FILT_RECEIVING: |
@@ -407,7 +430,7 @@ static err_t ip6_filter_with_wolfsentry( |
407 | 430 | case FILT_LISTENING: |
408 | 431 | case FILT_STOP_LISTENING: |
409 | 432 | /* can't happen. */ |
410 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 433 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
411 | 434 | } |
412 | 435 |
|
413 | 436 | remote.remote.sa_family = WOLFSENTRY_AF_INET6; |
@@ -457,7 +480,9 @@ static err_t ip6_filter_with_wolfsentry( |
457 | 480 |
|
458 | 481 | WOLFSENTRY_WARN_ON_FAILURE(ws_ret); |
459 | 482 |
|
460 | | - if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
| 483 | + if (WOLFSENTRY_IS_FAILURE(ws_ret)) |
| 484 | + ret = lwip_ws_failure_rejects(WOLFSENTRY_CONTEXT_ARGS_OUT) ? ERR_ABRT : ERR_OK; |
| 485 | + else if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
461 | 486 | ret = ERR_ABRT; |
462 | 487 | else |
463 | 488 | ret = ERR_OK; |
@@ -511,7 +536,7 @@ static err_t tcp_filter_with_wolfsentry( |
511 | 536 | #endif |
512 | 537 |
|
513 | 538 | if (wolfsentry == NULL) |
514 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 539 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
515 | 540 |
|
516 | 541 | switch(event->reason) { |
517 | 542 | case FILT_ACCEPTING: |
@@ -589,7 +614,7 @@ static err_t tcp_filter_with_wolfsentry( |
589 | 614 | case FILT_DISSOCIATE: |
590 | 615 | case FILT_ADDR_UNREACHABLE: |
591 | 616 | /* can't happen. */ |
592 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 617 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
593 | 618 | } |
594 | 619 |
|
595 | 620 | #if LWIP_IPV6 |
@@ -658,10 +683,12 @@ static err_t tcp_filter_with_wolfsentry( |
658 | 683 |
|
659 | 684 | WOLFSENTRY_WARN_ON_FAILURE(ws_ret); |
660 | 685 |
|
661 | | - if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_PORT_RESET)) |
662 | | - ret = ERR_RST; |
| 686 | + if (WOLFSENTRY_IS_FAILURE(ws_ret)) |
| 687 | + ret = lwip_ws_failure_rejects(WOLFSENTRY_CONTEXT_ARGS_OUT) ? ERR_ABRT : ERR_OK; |
663 | 688 | else if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
664 | 689 | ret = ERR_ABRT; |
| 690 | + else if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_PORT_RESET)) |
| 691 | + ret = ERR_RST; |
665 | 692 | else |
666 | 693 | ret = ERR_OK; |
667 | 694 |
|
@@ -723,7 +750,7 @@ static err_t udp_filter_with_wolfsentry( |
723 | 750 | #endif |
724 | 751 |
|
725 | 752 | if (wolfsentry == NULL) |
726 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 753 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
727 | 754 |
|
728 | 755 | switch(event->reason) { |
729 | 756 | case FILT_BINDING: |
@@ -778,7 +805,7 @@ static err_t udp_filter_with_wolfsentry( |
778 | 805 | case FILT_ADDR_UNREACHABLE: |
779 | 806 | case FILT_CLOSE_WAIT: |
780 | 807 | /* can't happen. */ |
781 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 808 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
782 | 809 | } |
783 | 810 |
|
784 | 811 | #if LWIP_IPV6 |
@@ -847,10 +874,12 @@ static err_t udp_filter_with_wolfsentry( |
847 | 874 |
|
848 | 875 | WOLFSENTRY_WARN_ON_FAILURE(ws_ret); |
849 | 876 |
|
850 | | - if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_PORT_RESET)) |
851 | | - ret = ERR_RST; |
| 877 | + if (WOLFSENTRY_IS_FAILURE(ws_ret)) |
| 878 | + ret = lwip_ws_failure_rejects(WOLFSENTRY_CONTEXT_ARGS_OUT) ? ERR_ABRT : ERR_OK; |
852 | 879 | else if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
853 | 880 | ret = ERR_ABRT; |
| 881 | + else if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_PORT_RESET)) |
| 882 | + ret = ERR_RST; |
854 | 883 | else |
855 | 884 | ret = ERR_OK; |
856 | 885 |
|
@@ -910,7 +939,7 @@ static err_t icmp4_filter_with_wolfsentry( |
910 | 939 | #endif |
911 | 940 |
|
912 | 941 | if (wolfsentry == NULL) |
913 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 942 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
914 | 943 |
|
915 | 944 | switch(event->reason) { |
916 | 945 | case FILT_RECEIVING: |
@@ -945,7 +974,7 @@ static err_t icmp4_filter_with_wolfsentry( |
945 | 974 | case FILT_STOP_LISTENING: |
946 | 975 | case FILT_CLOSE_WAIT: |
947 | 976 | /* can't happen. */ |
948 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 977 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
949 | 978 | } |
950 | 979 |
|
951 | 980 | remote.remote.sa_family = WOLFSENTRY_AF_INET; |
@@ -995,7 +1024,9 @@ static err_t icmp4_filter_with_wolfsentry( |
995 | 1024 |
|
996 | 1025 | WOLFSENTRY_WARN_ON_FAILURE(ws_ret); |
997 | 1026 |
|
998 | | - if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
| 1027 | + if (WOLFSENTRY_IS_FAILURE(ws_ret)) |
| 1028 | + ret = lwip_ws_failure_rejects(WOLFSENTRY_CONTEXT_ARGS_OUT) ? ERR_ABRT : ERR_OK; |
| 1029 | + else if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
999 | 1030 | ret = ERR_ABRT; |
1000 | 1031 | else |
1001 | 1032 | ret = ERR_OK; |
@@ -1046,7 +1077,7 @@ static err_t icmp6_filter_with_wolfsentry( |
1046 | 1077 | #endif |
1047 | 1078 |
|
1048 | 1079 | if (wolfsentry == NULL) |
1049 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 1080 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
1050 | 1081 |
|
1051 | 1082 | switch(event->reason) { |
1052 | 1083 | case FILT_RECEIVING: |
@@ -1081,7 +1112,7 @@ static err_t icmp6_filter_with_wolfsentry( |
1081 | 1112 | case FILT_STOP_LISTENING: |
1082 | 1113 | case FILT_CLOSE_WAIT: |
1083 | 1114 | /* can't happen. */ |
1084 | | - WOLFSENTRY_RETURN_VALUE(ERR_OK); |
| 1115 | + WOLFSENTRY_RETURN_VALUE(ERR_ABRT); |
1085 | 1116 | } |
1086 | 1117 |
|
1087 | 1118 | remote.remote.sa_family = WOLFSENTRY_AF_INET6; |
@@ -1131,7 +1162,9 @@ static err_t icmp6_filter_with_wolfsentry( |
1131 | 1162 |
|
1132 | 1163 | WOLFSENTRY_WARN_ON_FAILURE(ws_ret); |
1133 | 1164 |
|
1134 | | - if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
| 1165 | + if (WOLFSENTRY_IS_FAILURE(ws_ret)) |
| 1166 | + ret = lwip_ws_failure_rejects(WOLFSENTRY_CONTEXT_ARGS_OUT) ? ERR_ABRT : ERR_OK; |
| 1167 | + else if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) |
1135 | 1168 | ret = ERR_ABRT; |
1136 | 1169 | else |
1137 | 1170 | ret = ERR_OK; |
|
0 commit comments