git: 73ef1f7462e9 - stable/12 - pf: ensure we populate dyncnt/tblcnt in struct pf_addr_wrap

From: Kristof Provost <kp_at_FreeBSD.org>
Date: Wed, 01 Dec 2021 17:10:08 UTC
The branch stable/12 has been updated by kp:

URL: https://cgit.FreeBSD.org/src/commit/?id=73ef1f7462e95f12747a6ff33c0cbb2bc4f848b7

commit 73ef1f7462e95f12747a6ff33c0cbb2bc4f848b7
Author:     Kristof Provost <kp@FreeBSD.org>
AuthorDate: 2021-11-08 12:25:20 +0000
Commit:     Kristof Provost <kp@FreeBSD.org>
CommitDate: 2021-12-01 12:43:25 +0000

    pf: ensure we populate dyncnt/tblcnt in struct pf_addr_wrap
    
    PR:             259689
    MFC after:      3 weeks
    Sponsored by:   Rubicon Communications, LLC ("Netgate")
    Differential Revision:  https://reviews.freebsd.org/D32892
    
    (cherry picked from commit 218a8a491c4980dcc941908f9505d37e7f052868)
---
 lib/libpfctl/libpfctl.c | 10 ++++++++--
 sys/netpfil/pf/pf_nv.c  | 21 +++++++++++++++++++--
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/lib/libpfctl/libpfctl.c b/lib/libpfctl/libpfctl.c
index 96f5ea620f4d..6613708b183c 100644
--- a/lib/libpfctl/libpfctl.c
+++ b/lib/libpfctl/libpfctl.c
@@ -287,14 +287,20 @@ pfctl_nv_add_addr_wrap(nvlist_t *nvparent, const char *name,
 static void
 pf_nvaddr_wrap_to_addr_wrap(const nvlist_t *nvl, struct pf_addr_wrap *addr)
 {
+	bzero(addr, sizeof(*addr));
+
 	addr->type = nvlist_get_number(nvl, "type");
 	addr->iflags = nvlist_get_number(nvl, "iflags");
-	if (addr->type == PF_ADDR_DYNIFTL)
+	if (addr->type == PF_ADDR_DYNIFTL) {
 		strlcpy(addr->v.ifname, nvlist_get_string(nvl, "ifname"),
 		    IFNAMSIZ);
-	if (addr->type == PF_ADDR_TABLE)
+		addr->p.dyncnt = nvlist_get_number(nvl, "dynctl");
+	}
+	if (addr->type == PF_ADDR_TABLE) {
 		strlcpy(addr->v.tblname, nvlist_get_string(nvl, "tblname"),
 		    PF_TABLE_NAME_SIZE);
+		addr->p.tblcnt = nvlist_get_number(nvl, "tblcnt");
+	}
 
 	pf_nvaddr_to_addr(nvlist_get_nvlist(nvl, "addr"), &addr->v.a.addr);
 	pf_nvaddr_to_addr(nvlist_get_nvlist(nvl, "mask"), &addr->v.a.mask);
diff --git a/sys/netpfil/pf/pf_nv.c b/sys/netpfil/pf/pf_nv.c
index b6676be645d7..573544972952 100644
--- a/sys/netpfil/pf/pf_nv.c
+++ b/sys/netpfil/pf/pf_nv.c
@@ -327,6 +327,8 @@ pf_addr_wrap_to_nvaddr_wrap(const struct pf_addr_wrap *addr)
 {
 	nvlist_t *nvl;
 	nvlist_t *tmp;
+	uint64_t num;
+	struct pfr_ktable *kt;
 
 	nvl = nvlist_create(0);
 	if (nvl == NULL)
@@ -334,10 +336,25 @@ pf_addr_wrap_to_nvaddr_wrap(const struct pf_addr_wrap *addr)
 
 	nvlist_add_number(nvl, "type", addr->type);
 	nvlist_add_number(nvl, "iflags", addr->iflags);
-	if (addr->type == PF_ADDR_DYNIFTL)
+	if (addr->type == PF_ADDR_DYNIFTL) {
 		nvlist_add_string(nvl, "ifname", addr->v.ifname);
-	if (addr->type == PF_ADDR_TABLE)
+		num = 0;
+		if (addr->p.dyn != NULL)
+			num = addr->p.dyn->pfid_acnt4 +
+			    addr->p.dyn->pfid_acnt6;
+		nvlist_add_number(nvl, "dyncnt", num);
+	}
+	if (addr->type == PF_ADDR_TABLE) {
 		nvlist_add_string(nvl, "tblname", addr->v.tblname);
+		num = -1;
+		kt = addr->p.tbl;
+		if ((kt->pfrkt_flags & PFR_TFLAG_ACTIVE) &&
+		    kt->pfrkt_root != NULL)
+			kt = kt->pfrkt_root;
+		if (kt->pfrkt_flags & PFR_TFLAG_ACTIVE)
+			num = kt->pfrkt_cnt;
+		nvlist_add_number(nvl, "tblcnt", num);
+	}
 
 	tmp = pf_addr_to_nvaddr(&addr->v.a.addr);
 	if (tmp == NULL)