| 1049 | } |
| 1050 | |
| 1051 | static int |
| 1052 | pfr_walktree(struct radix_node *rn, void *arg) |
| 1053 | { |
| 1054 | struct pfr_kentry *ke = (struct pfr_kentry *)rn; |
| 1055 | struct pfr_walktree *w = arg; |
| 1056 | |
| 1057 | switch (w->pfrw_op) { |
| 1058 | case PFRW_MARK: |
| 1059 | ke->pfrke_mark = 0; |
| 1060 | break; |
| 1061 | case PFRW_SWEEP: |
| 1062 | if (ke->pfrke_mark) |
| 1063 | break; |
| 1064 | /* FALLTHROUGH */ |
| 1065 | case PFRW_ENQUEUE: |
| 1066 | SLIST_INSERT_HEAD(w->pfrw_workq, ke, pfrke_workq); |
| 1067 | w->pfrw_cnt++; |
| 1068 | break; |
| 1069 | case PFRW_GET_ADDRS: |
| 1070 | if (w->pfrw_free-- > 0) { |
| 1071 | pfr_copyout_addr(w->pfrw_addr, ke); |
| 1072 | w->pfrw_addr++; |
| 1073 | } |
| 1074 | break; |
| 1075 | case PFRW_GET_ASTATS: |
| 1076 | if (w->pfrw_free-- > 0) { |
| 1077 | struct pfr_astats as; |
| 1078 | |
| 1079 | pfr_copyout_astats(&as, ke, w); |
| 1080 | |
| 1081 | bcopy(&as, w->pfrw_astats, sizeof(as)); |
| 1082 | w->pfrw_astats++; |
| 1083 | } |
| 1084 | break; |
| 1085 | case PFRW_POOL_GET: |
| 1086 | if (ke->pfrke_not) |
| 1087 | break; /* negative entries are ignored */ |
| 1088 | if (!w->pfrw_cnt--) { |
| 1089 | w->pfrw_kentry = ke; |
| 1090 | return (1); /* finish search */ |
| 1091 | } |
| 1092 | break; |
| 1093 | case PFRW_DYNADDR_UPDATE: |
| 1094 | { |
| 1095 | union sockaddr_union pfr_mask; |
| 1096 | |
| 1097 | if (ke->pfrke_af == AF_INET) { |
| 1098 | if (w->pfrw_dyn->pfid_acnt4++ > 0) |
| 1099 | break; |
| 1100 | pfr_prepare_network(&pfr_mask, AF_INET, ke->pfrke_net); |
| 1101 | w->pfrw_dyn->pfid_addr4 = *SUNION2PF(&ke->pfrke_sa, |
| 1102 | AF_INET); |
| 1103 | w->pfrw_dyn->pfid_mask4 = *SUNION2PF(&pfr_mask, |
| 1104 | AF_INET); |
| 1105 | } else if (ke->pfrke_af == AF_INET6){ |
| 1106 | if (w->pfrw_dyn->pfid_acnt6++ > 0) |
| 1107 | break; |
| 1108 | pfr_prepare_network(&pfr_mask, AF_INET6, ke->pfrke_net); |
nothing calls this directly
no test coverage detected