MCPcopy Create free account
hub / github.com/F-Stack/f-stack / pfr_walktree

Function pfr_walktree

freebsd/netpfil/pf/pf_table.c:1051–1118  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1049}
1050
1051static int
1052pfr_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);

Callers

nothing calls this directly

Calls 3

pfr_copyout_addrFunction · 0.85
pfr_copyout_astatsFunction · 0.85
pfr_prepare_networkFunction · 0.85

Tested by

no test coverage detected