Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F115772135
D43116.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D43116.diff
View Options
diff --git a/sys/net/pflow.h b/sys/net/pflow.h
--- a/sys/net/pflow.h
+++ b/sys/net/pflow.h
@@ -244,7 +244,7 @@
unsigned int sc_maxcount4;
unsigned int sc_maxcount6;
unsigned int sc_maxcount_nat4;
- u_int64_t sc_gcounter;
+ u_int32_t sc_gcounter;
u_int32_t sc_sequence;
struct callout sc_tmo;
struct callout sc_tmo6;
diff --git a/sys/netpfil/pf/pflow.c b/sys/netpfil/pf/pflow.c
--- a/sys/netpfil/pf/pflow.c
+++ b/sys/netpfil/pf/pflow.c
@@ -89,6 +89,7 @@
static int pflow_sendout_ipfix(struct pflow_softc *, enum pflow_family_t);
static int pflow_sendout_ipfix_tmpl(struct pflow_softc *);
static int pflow_sendout_mbuf(struct pflow_softc *, struct mbuf *);
+static int sysctl_pflowstats(SYSCTL_HANDLER_ARGS);
static void pflow_timeout(void *);
static void pflow_timeout6(void *);
static void pflow_timeout_tmpl(void *);
@@ -119,6 +120,17 @@
static const char pflowname[] = "pflow";
+enum pflowstat_counters {
+ pflow_flows,
+ pflow_packets,
+ pflow_onomem,
+ pflow_oerrors,
+ pflow_ncounters,
+};
+struct pflowstats_ctr {
+ counter_u64_t c[pflow_ncounters];
+};
+
/**
* Locking concept
*
@@ -139,7 +151,7 @@
#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, pflowstat);
+VNET_DEFINE(struct pflowstats_ctr, pflowstat);
#define V_pflowstats VNET(pflowstat)
#define PFLOW_LOCK(_sc) mtx_lock(&(_sc)->sc_lock)
@@ -148,10 +160,16 @@
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,
+SYSCTL_PROC(_net_pflow, OID_AUTO, stats, CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE,
+ 0, 0, sysctl_pflowstats, "S,pflowstats",
"PFLOW statistics (struct pflowstats, net/if_pflow.h)");
+static inline void
+pflowstat_inc(enum pflowstat_counters c)
+{
+ counter_u64_add(V_pflowstats.c[c], 1);
+}
+
static void
vnet_pflowattach(void)
{
@@ -159,6 +177,9 @@
mtx_init(&V_pflowif_list_mtx, "pflow interface list mtx", NULL, MTX_DEF);
V_pflow_unr = new_unrhdr(0, INT_MAX, &V_pflowif_list_mtx);
+
+ for (int i = 0; i < pflow_ncounters; i++)
+ V_pflowstats.c[i] = counter_u64_alloc(M_WAITOK);
}
VNET_SYSINIT(vnet_pflowattach, SI_SUB_PROTO_FIREWALL, SI_ORDER_ANY,
vnet_pflowattach, NULL);
@@ -175,6 +196,9 @@
MPASS(CK_LIST_EMPTY(&V_pflowif_list));
delete_unrhdr(V_pflow_unr);
mtx_destroy(&V_pflowif_list_mtx);
+
+ for (int i = 0; i < pflow_ncounters; i++)
+ counter_u64_free(V_pflowstats.c[i]);
}
VNET_SYSUNINIT(vnet_pflowdetach, SI_SUB_PROTO_FIREWALL, SI_ORDER_FOURTH,
vnet_pflowdetach, NULL);
@@ -538,14 +562,14 @@
MGETHDR(m, M_NOWAIT, MT_DATA);
if (m == NULL) {
- V_pflowstats.pflow_onomem++;
+ pflowstat_inc(pflow_onomem);
return (NULL);
}
MCLGET(m, M_NOWAIT);
if ((m->m_flags & M_EXT) == 0) {
m_free(m);
- V_pflowstats.pflow_onomem++;
+ pflowstat_inc(pflow_onomem);
return (NULL);
}
@@ -808,8 +832,7 @@
(sc->sc_count * sizeof(struct pflow_flow)),
sizeof(struct pflow_flow), (caddr_t)flow);
- if (V_pflowstats.pflow_flows == sc->sc_gcounter)
- V_pflowstats.pflow_flows++;
+ pflowstat_inc(pflow_flows);
sc->sc_gcounter++;
sc->sc_count++;
@@ -839,8 +862,7 @@
(sc->sc_count4 * sizeof(struct pflow_ipfix_flow4)),
sizeof(struct pflow_ipfix_flow4), (caddr_t)flow);
- if (V_pflowstats.pflow_flows == sc->sc_gcounter)
- V_pflowstats.pflow_flows++;
+ pflowstat_inc(pflow_flows);
sc->sc_gcounter++;
sc->sc_count4++;
@@ -869,8 +891,7 @@
(sc->sc_count6 * sizeof(struct pflow_ipfix_flow6)),
sizeof(struct pflow_ipfix_flow6), (caddr_t)flow);
- if (V_pflowstats.pflow_flows == sc->sc_gcounter)
- V_pflowstats.pflow_flows++;
+ pflowstat_inc(pflow_flows);
sc->sc_gcounter++;
sc->sc_count6++;
@@ -905,10 +926,9 @@
sizeof(struct pflow_ipfix_nat4), (caddr_t)nat);
sc->sc_count_nat4++;
- if (V_pflowstats.pflow_flows == sc->sc_gcounter)
- V_pflowstats.pflow_flows++;
-
+ pflowstat_inc(pflow_flows);
sc->sc_gcounter++;
+
if (sc->sc_count_nat4 >= sc->sc_maxcount_nat4)
ret = pflow_sendout_ipfix(sc, PFLOW_NAT4);
@@ -1116,7 +1136,7 @@
sc->sc_mbuf = NULL;
- V_pflowstats.pflow_packets++;
+ pflowstat_inc(pflow_packets);
h = mtod(m, struct pflow_header *);
h->count = htons(sc->sc_count);
@@ -1178,14 +1198,15 @@
panic("Unsupported AF %d", af);
}
- V_pflowstats.pflow_packets++;
+ pflowstat_inc(pflow_packets);
+
set_hdr = mtod(m, struct pflow_set_header *);
set_hdr->set_length = htons(set_length);
/* populate pflow_header */
M_PREPEND(m, sizeof(struct pflow_v10_header), M_NOWAIT);
if (m == NULL) {
- V_pflowstats.pflow_onomem++;
+ pflowstat_inc(pflow_onomem);
return (ENOBUFS);
}
h10 = mtod(m, struct pflow_v10_header *);
@@ -1215,12 +1236,12 @@
m_copyback(m, 0, sizeof(struct pflow_ipfix_tmpl),
(caddr_t)&sc->sc_tmpl_ipfix);
- V_pflowstats.pflow_packets++;
+ pflowstat_inc(pflow_packets);
/* populate pflow_header */
M_PREPEND(m, sizeof(struct pflow_v10_header), M_NOWAIT);
if (m == NULL) {
- V_pflowstats.pflow_onomem++;
+ pflowstat_inc(pflow_onomem);
return (ENOBUFS);
}
h10 = mtod(m, struct pflow_v10_header *);
@@ -1249,6 +1270,23 @@
return (sosend(sc->so, sc->sc_flowdst, NULL, m, NULL, 0, curthread));
}
+static int
+sysctl_pflowstats(SYSCTL_HANDLER_ARGS)
+{
+ struct pflowstats pflowstats;
+
+ pflowstats.pflow_flows =
+ counter_u64_fetch(V_pflowstats.c[pflow_flows]);
+ pflowstats.pflow_packets =
+ counter_u64_fetch(V_pflowstats.c[pflow_packets]);
+ pflowstats.pflow_onomem =
+ counter_u64_fetch(V_pflowstats.c[pflow_onomem]);
+ pflowstats.pflow_oerrors =
+ counter_u64_fetch(V_pflowstats.c[pflow_oerrors]);
+
+ return (sysctl_handle_opaque(oidp, &pflowstats, sizeof(pflowstats), req));
+}
+
static int
pflow_nl_list(struct nlmsghdr *hdr, struct nl_pstate *npt)
{
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Apr 29, 10:47 AM (7 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17840472
Default Alt Text
D43116.diff (5 KB)
Attached To
Mode
D43116: pflow: Turn `pflowstats' statistics counters into per-CPU counters to make them mpsafe.
Attached
Detach File
Event Timeline
Log In to Comment