Hi, Previous diff made src-node have a reference for the kif. My colleague pointed out that incrementing the reference count of the kif is required.
ok? Fix previous commit which made src-node have a reference for the kif. Src-node should use the reference counter since it might live longer than its table entry, rule or the associated states. Index: sys/net/pf.c =================================================================== RCS file: /cvs/src/sys/net/pf.c,v retrieving revision 1.1083 diff -u -p -r1.1083 pf.c --- sys/net/pf.c 2 Jul 2019 09:04:53 -0000 1.1083 +++ sys/net/pf.c 5 Jul 2019 07:57:57 -0000 @@ -589,6 +589,7 @@ pf_insert_src_node(struct pf_src_node ** (*sn)->kif = kif; pf_status.scounters[SCNT_SRC_NODE_INSERT]++; pf_status.src_nodes++; + pfi_kif_ref(kif, PFI_KIF_REF_SRCNODE); } else { if (rule->max_src_states && (*sn)->states >= rule->max_src_states) { @@ -612,6 +613,7 @@ pf_remove_src_node(struct pf_src_node *s RB_REMOVE(pf_src_tree, &tree_src_tracking, sn); pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++; pf_status.src_nodes--; + pfi_kif_unref(sn->kif, PFI_KIF_REF_SRCNODE); pool_put(&pf_src_tree_pl, sn); } Index: sys/net/pf_if.c =================================================================== RCS file: /cvs/src/sys/net/pf_if.c,v retrieving revision 1.96 diff -u -p -r1.96 pf_if.c --- sys/net/pf_if.c 10 Dec 2018 16:48:15 -0000 1.96 +++ sys/net/pf_if.c 5 Jul 2019 07:57:57 -0000 @@ -147,6 +147,9 @@ pfi_kif_ref(struct pfi_kif *kif, enum pf case PFI_KIF_REF_ROUTE: kif->pfik_routes++; break; + case PFI_KIF_REF_SRCNODE: + kif->pfik_srcnodes++; + break; default: panic("pfi_kif_ref with unknown type"); } @@ -185,6 +188,14 @@ pfi_kif_unref(struct pfi_kif *kif, enum } kif->pfik_routes--; break; + case PFI_KIF_REF_SRCNODE: + if (kif->pfik_srcnodes <= 0) { + DPFPRINTF(LOG_ERR, + "pfi_kif_unref: src-node refcount <= 0"); + return; + } + kif->pfik_srcnodes--; + break; default: panic("pfi_kif_unref with unknown type"); } @@ -192,7 +203,8 @@ pfi_kif_unref(struct pfi_kif *kif, enum if (kif->pfik_ifp != NULL || kif->pfik_group != NULL || kif == pfi_all) return; - if (kif->pfik_rules || kif->pfik_states || kif->pfik_routes) + if (kif->pfik_rules || kif->pfik_states || kif->pfik_routes || + kif->pfik_srcnodes) return; RB_REMOVE(pfi_ifhead, &pfi_ifs, kif); Index: sys/net/pfvar.h =================================================================== RCS file: /cvs/src/sys/net/pfvar.h,v retrieving revision 1.491 diff -u -p -r1.491 pfvar.h --- sys/net/pfvar.h 2 Jul 2019 09:04:53 -0000 1.491 +++ sys/net/pfvar.h 5 Jul 2019 07:57:58 -0000 @@ -1162,6 +1162,7 @@ struct pfi_kif { int pfik_states; int pfik_rules; int pfik_routes; + int pfik_srcnodes; TAILQ_HEAD(, pfi_dynaddr) pfik_dynaddrs; }; @@ -1169,7 +1170,8 @@ enum pfi_kif_refs { PFI_KIF_REF_NONE, PFI_KIF_REF_STATE, PFI_KIF_REF_RULE, - PFI_KIF_REF_ROUTE + PFI_KIF_REF_ROUTE, + PFI_KIF_REF_SRCNODE }; #define PFI_IFLAG_SKIP 0x0100 /* skip filtering on interface */