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 */