The branch main has been updated by kp:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=5dea523bd241fea07dc28c067b124d607dc96948

commit 5dea523bd241fea07dc28c067b124d607dc96948
Author:     Kristof Provost <[email protected]>
AuthorDate: 2023-12-06 13:55:33 +0000
Commit:     Kristof Provost <[email protected]>
CommitDate: 2024-01-16 08:45:53 +0000

    pflow: netstat statistics
    
    Expose pflow counters via netstat.
    
    Sponsored by:   Rubicon Communications, LLC ("Netgate")
    Differential Revision:  https://reviews.freebsd.org/D43107
---
 sys/netpfil/pf/pflow.c        | 10 ++++++++--
 usr.bin/netstat/if.c          | 26 ++++++++++++++++++++++++++
 usr.bin/netstat/main.c        |  2 ++
 usr.bin/netstat/netstat.h     |  1 +
 usr.bin/netstat/nlist_symbols |  1 +
 5 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/sys/netpfil/pf/pflow.c b/sys/netpfil/pf/pflow.c
index 855ebe5ca98c..2dc612bd9e07 100644
--- a/sys/netpfil/pf/pflow.c
+++ b/sys/netpfil/pf/pflow.c
@@ -128,13 +128,19 @@ VNET_DEFINE(CK_LIST_HEAD(, pflow_softc), pflowif_list);
 #define        V_pflowif_list  VNET(pflowif_list)
 VNET_DEFINE(struct mtx, pflowif_list_mtx);
 #define        V_pflowif_list_mtx      VNET(pflowif_list_mtx)
-VNET_DEFINE(struct pflowstats,  pflowstats);
-#define        V_pflowstats    VNET(pflowstats)
+VNET_DEFINE(struct pflowstats,  pflowstat);
+#define        V_pflowstats    VNET(pflowstat)
 
 #define        PFLOW_LOCK(_sc)         mtx_lock(&(_sc)->sc_lock)
 #define        PFLOW_UNLOCK(_sc)       mtx_unlock(&(_sc)->sc_lock)
 #define        PFLOW_ASSERT(_sc)       mtx_assert(&(_sc)->sc_lock, MA_OWNED)
 
+SYSCTL_NODE(_net, OID_AUTO, pflow, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
+    "PFLOW");
+SYSCTL_STRUCT(_net_pflow, OID_AUTO, stats, CTLFLAG_VNET | CTLFLAG_RW,
+    &VNET_NAME(pflowstat), pflowstats,
+    "PFLOW statistics (struct pflowstats, net/if_pflow.h)");
+
 static void
 vnet_pflowattach(void)
 {
diff --git a/usr.bin/netstat/if.c b/usr.bin/netstat/if.c
index 7aafdf78b296..172ea5324ccb 100644
--- a/usr.bin/netstat/if.c
+++ b/usr.bin/netstat/if.c
@@ -45,6 +45,7 @@
 #include <arpa/inet.h>
 #ifdef PF
 #include <net/pfvar.h>
+#include <net/pflow.h>
 #include <net/if_pfsync.h>
 #endif
 
@@ -181,6 +182,31 @@ pfsync_stats(u_long off, const char *name, int af1 
__unused, int proto __unused)
 #undef p
        xo_close_container(name);
 }
+
+void
+pflow_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
+{
+       struct pflowstats pflowstat;
+
+       if (fetch_stats("net.pflow.stats", off, &pflowstat,
+           sizeof(pflowstat), kread) != 0)
+               return;
+
+       xo_emit("{T:/%s}:\n", name);
+       xo_open_container(name);
+
+#define        p(f, m) if (pflowstat.f || sflag <= 1) \
+       xo_emit(m, (uintmax_t)pflowstat.f, plural(pflowstat.f))
+
+       p(pflow_flows, "\t{:flows/%ju} {N:/flow%s sent}\n");
+       p(pflow_packets, "\t{:packets/%ju} {N:/packet%s sent}\n");
+       p(pflow_onomem, "\t{:nomem/%ju} "
+           "{N:/send failed due to mbuf memory error}\n");
+       p(pflow_oerrors, "\t{:send-error/%ju} {N:/send error}\n");
+#undef p
+
+       xo_close_container(name);
+}
 #endif /* PF */
 
 /*
diff --git a/usr.bin/netstat/main.c b/usr.bin/netstat/main.c
index b5d8754777cb..2ed6eca4626e 100644
--- a/usr.bin/netstat/main.c
+++ b/usr.bin/netstat/main.c
@@ -116,6 +116,8 @@ static struct protox {
 #ifdef PF
        { -1,           N_PFSYNCSTATS,  1,      NULL,
          pfsync_stats, NULL,           "pfsync", 1,    0 },
+       { -1,           N_PFLOWSTATS,   1,      NULL,
+         pflow_stats,  NULL,           "pflow", 1,     0 },
 #endif
        { -1,           N_ARPSTAT,      1,      NULL,
          arp_stats,    NULL,           "arp", 1,       0 },
diff --git a/usr.bin/netstat/netstat.h b/usr.bin/netstat/netstat.h
index fd8171734c97..c41862d9fbdd 100644
--- a/usr.bin/netstat/netstat.h
+++ b/usr.bin/netstat/netstat.h
@@ -96,6 +96,7 @@ void  igmp_stats(u_long, const char *, int, int);
 void   pim_stats(u_long, const char *, int, int);
 void   carp_stats(u_long, const char *, int, int);
 void   pfsync_stats(u_long, const char *, int, int);
+void   pflow_stats(u_long, const char *, int, int);
 #ifdef IPSEC
 void   ipsec_stats(u_long, const char *, int, int);
 void   esp_stats(u_long, const char *, int, int);
diff --git a/usr.bin/netstat/nlist_symbols b/usr.bin/netstat/nlist_symbols
index 7d7fcdc4c249..30cdd69bc54b 100644
--- a/usr.bin/netstat/nlist_symbols
+++ b/usr.bin/netstat/nlist_symbols
@@ -31,6 +31,7 @@ all   _nws_array
 all    _nws_count
 all    _pfkeystat
 all    _pfsyncstats
+all    _pflowstats
 all    _pim6stat
 all    _pimstat
 all    _rip6stat

Reply via email to