ok?

Index: net/if_pfsync.c
===================================================================
RCS file: /d/cvs/src/sys/net/if_pfsync.c,v
retrieving revision 1.244
diff -u -p -r1.244 if_pfsync.c
--- net/if_pfsync.c     29 Jan 2017 19:58:47 -0000      1.244
+++ net/if_pfsync.c     18 Feb 2017 13:42:29 -0000
@@ -239,7 +239,7 @@ struct pfsync_softc {
 };
 
 struct pfsync_softc    *pfsyncif = NULL;
-struct pfsyncstats      pfsyncstats;
+struct cpumem          *pfsynccounters;
 
 void   pfsyncattach(int);
 int    pfsync_clone_create(struct if_clone *, int);
@@ -283,6 +283,7 @@ void
 pfsyncattach(int npfsync)
 {
        if_clone_attach(&pfsync_cloner);
+       pfsynccounters = counters_alloc(pfsyncs_ncounters);
 }
 
 int
@@ -644,7 +645,7 @@ pfsync_input(struct mbuf **mp, int *offp
        struct pfsync_subheader subh;
        int offset, noff, len, count, mlen, flags = 0;
 
-       pfsyncstats.pfsyncs_ipackets++;
+       pfsyncstat_inc(pfsyncs_ipackets);
 
        /* verify that we have a sync interface configured */
        if (sc == NULL || !ISSET(sc->sc_if.if_flags, IFF_RUNNING) ||
@@ -653,7 +654,7 @@ pfsync_input(struct mbuf **mp, int *offp
 
        /* verify that the packet came in on the right interface */
        if (sc->sc_sync_if->if_index != m->m_pkthdr.ph_ifidx) {
-               pfsyncstats.pfsyncs_badif++;
+               pfsyncstat_inc(pfsyncs_badif);
                goto done;
        }
 
@@ -662,26 +663,26 @@ pfsync_input(struct mbuf **mp, int *offp
 
        /* verify that the IP TTL is 255. */
        if (ip->ip_ttl != PFSYNC_DFLTTL) {
-               pfsyncstats.pfsyncs_badttl++;
+               pfsyncstat_inc(pfsyncs_badttl);
                goto done;
        }
 
        offset = ip->ip_hl << 2;
        n = m_pulldown(m, offset, sizeof(*ph), &noff);
        if (n == NULL) {
-               pfsyncstats.pfsyncs_hdrops++;
+               pfsyncstat_inc(pfsyncs_hdrops);
                return IPPROTO_DONE;
        }
        ph = (struct pfsync_header *)(n->m_data + noff);
 
        /* verify the version */
        if (ph->version != PFSYNC_VERSION) {
-               pfsyncstats.pfsyncs_badver++;
+               pfsyncstat_inc(pfsyncs_badver);
                goto done;
        }
        len = ntohs(ph->len) + offset;
        if (m->m_pkthdr.len < len) {
-               pfsyncstats.pfsyncs_badlen++;
+               pfsyncstat_inc(pfsyncs_badlen);
                goto done;
        }
 
@@ -709,13 +710,13 @@ pfsync_input(struct mbuf **mp, int *offp
                                offset += count * mlen;
                                continue;
                        }
-                       pfsyncstats.pfsyncs_badact++;
+                       pfsyncstat_inc(pfsyncs_badact);
                        goto done;
                }
 
                n = m_pulldown(m, offset, mlen * count, &noff);
                if (n == NULL) {
-                       pfsyncstats.pfsyncs_badlen++;
+                       pfsyncstat_inc(pfsyncs_badlen);
                        return IPPROTO_DONE;
                }
 
@@ -784,7 +785,7 @@ pfsync_in_ins(caddr_t buf, int len, int 
                    (sp->af != AF_INET && sp->af != AF_INET6))) {
                        DPFPRINTF(LOG_NOTICE,
                            "pfsync_input: PFSYNC5_ACT_INS: invalid value");
-                       pfsyncstats.pfsyncs_badval++;
+                       pfsyncstat_inc(pfsyncs_badval);
                        continue;
                }
 
@@ -873,7 +874,7 @@ pfsync_in_upd(caddr_t buf, int len, int 
                    sp->dst.state > PF_TCPS_PROXY_DST) {
                        DPFPRINTF(LOG_NOTICE,
                            "pfsync_input: PFSYNC_ACT_UPD: invalid value");
-                       pfsyncstats.pfsyncs_badval++;
+                       pfsyncstat_inc(pfsyncs_badval);
                        continue;
                }
 
@@ -884,7 +885,7 @@ pfsync_in_upd(caddr_t buf, int len, int 
                if (st == NULL) {
                        /* insert the update */
                        if (pfsync_state_import(sp, flags))
-                               pfsyncstats.pfsyncs_badstate++;
+                               pfsyncstat_inc(pfsyncs_badstate);
                        continue;
                }
 
@@ -920,7 +921,7 @@ pfsync_in_upd(caddr_t buf, int len, int 
                st->pfsync_time = time_uptime;
 
                if (sync) {
-                       pfsyncstats.pfsyncs_stale++;
+                       pfsyncstat_inc(pfsyncs_stale);
 
                        pfsync_update_state(st);
                        schednetisr(NETISR_PFSYNC);
@@ -950,7 +951,7 @@ pfsync_in_upd_c(caddr_t buf, int len, in
                    up->dst.state > PF_TCPS_PROXY_DST) {
                        DPFPRINTF(LOG_NOTICE,
                            "pfsync_input: PFSYNC_ACT_UPD_C: invalid value");
-                       pfsyncstats.pfsyncs_badval++;
+                       pfsyncstat_inc(pfsyncs_badval);
                        continue;
                }
 
@@ -994,7 +995,7 @@ pfsync_in_upd_c(caddr_t buf, int len, in
                st->pfsync_time = time_uptime;
 
                if (sync) {
-                       pfsyncstats.pfsyncs_stale++;
+                       pfsyncstat_inc(pfsyncs_stale);
 
                        pfsync_update_state(st);
                        schednetisr(NETISR_PFSYNC);
@@ -1024,7 +1025,7 @@ pfsync_in_ureq(caddr_t buf, int len, int
                else {
                        st = pf_find_state_byid(&id_key);
                        if (st == NULL) {
-                               pfsyncstats.pfsyncs_badstate++;
+                               pfsyncstat_inc(pfsyncs_badstate);
                                continue;
                        }
                        if (ISSET(st->state_flags, PFSTATE_NOSYNC))
@@ -1053,7 +1054,7 @@ pfsync_in_del(caddr_t buf, int len, int 
 
                st = pf_find_state_byid(&id_key);
                if (st == NULL) {
-                       pfsyncstats.pfsyncs_badstate++;
+                       pfsyncstat_inc(pfsyncs_badstate);
                        continue;
                }
                SET(st->state_flags, PFSTATE_NOSYNC);
@@ -1079,7 +1080,7 @@ pfsync_in_del_c(caddr_t buf, int len, in
 
                st = pf_find_state_byid(&id_key);
                if (st == NULL) {
-                       pfsyncstats.pfsyncs_badstate++;
+                       pfsyncstat_inc(pfsyncs_badstate);
                        continue;
                }
 
@@ -1194,7 +1195,7 @@ pfsync_update_net_tdb(struct pfsync_tdb 
  bad:
        DPFPRINTF(LOG_WARNING, "pfsync_insert: PFSYNC_ACT_TDB_UPD: "
            "invalid value");
-       pfsyncstats.pfsyncs_badstate++;
+       pfsyncstat_inc(pfsyncs_badstate);
        return;
 }
 #endif
@@ -1204,7 +1205,7 @@ int
 pfsync_in_eof(caddr_t buf, int len, int count, int flags)
 {
        if (len > 0 || count > 0)
-               pfsyncstats.pfsyncs_badact++;
+               pfsyncstat_inc(pfsyncs_badact);
 
        /* we're done. let the caller return */
        return (1);
@@ -1213,7 +1214,7 @@ pfsync_in_eof(caddr_t buf, int len, int 
 int
 pfsync_in_error(caddr_t buf, int len, int count, int flags)
 {
-       pfsyncstats.pfsyncs_badact++;
+       pfsyncstat_inc(pfsyncs_badact);
        return (-1);
 }
 
@@ -1513,7 +1514,7 @@ pfsync_sendout(void)
        MGETHDR(m, M_DONTWAIT, MT_DATA);
        if (m == NULL) {
                sc->sc_if.if_oerrors++;
-               pfsyncstats.pfsyncs_onomem++;
+               pfsyncstat_inc(pfsyncs_onomem);
                pfsync_drop(sc);
                return;
        }
@@ -1523,7 +1524,7 @@ pfsync_sendout(void)
                if (!ISSET(m->m_flags, M_EXT)) {
                        m_free(m);
                        sc->sc_if.if_oerrors++;
-                       pfsyncstats.pfsyncs_onomem++;
+                       pfsyncstat_inc(pfsyncs_onomem);
                        pfsync_drop(sc);
                        return;
                }
@@ -1652,9 +1653,9 @@ pfsync_sendout(void)
        m->m_pkthdr.ph_rtableid = sc->sc_if.if_rdomain;
 
        if (ip_output(m, NULL, NULL, IP_RAWOUTPUT, &sc->sc_imo, NULL, 0) == 0)
-               pfsyncstats.pfsyncs_opackets++;
+               pfsyncstat_inc(pfsyncs_opackets);
        else
-               pfsyncstats.pfsyncs_oerrors++;
+               pfsyncstat_inc(pfsyncs_oerrors);
 }
 
 void
@@ -2355,6 +2356,18 @@ pfsyncintr(void)
 }
 
 int
+pfsync_sysctl_pfsyncstat(void *oldp, size_t *oldlenp, void *newp)
+{
+       struct pfsyncstats pfsyncstat;
+
+       CTASSERT(sizeof(pfsyncstat) == (pfsyncs_ncounters * sizeof(uint64_t)));
+       counters_read(pfsynccounters, (uint64_t *)&pfsyncstat,
+           pfsyncs_ncounters);
+       return (sysctl_rdstruct(oldp, oldlenp, newp,
+           &pfsyncstat, sizeof(pfsyncstat)));
+}
+
+int
 pfsync_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void 
*newp,
     size_t newlen)
 {
@@ -2364,10 +2377,7 @@ pfsync_sysctl(int *name, u_int namelen, 
 
        switch (name[0]) {
        case PFSYNCCTL_STATS:
-               if (newp != NULL)
-                       return (EPERM);
-               return (sysctl_struct(oldp, oldlenp, newp, newlen,
-                   &pfsyncstats, sizeof(pfsyncstats)));
+               return (pfsync_sysctl_pfsyncstat(oldp, oldlenp, newp));
        default:
                return (ENOPROTOOPT);
        }
Index: net/if_pfsync.h
===================================================================
RCS file: /d/cvs/src/sys/net/if_pfsync.h,v
retrieving revision 1.51
diff -u -p -r1.51 if_pfsync.h
--- net/if_pfsync.h     29 Jan 2017 19:58:47 -0000      1.51
+++ net/if_pfsync.h     18 Feb 2017 13:41:35 -0000
@@ -273,6 +273,36 @@ struct pfsyncreq {
 
 #ifdef _KERNEL
 
+#include <sys/percpu.h>
+
+enum pfsync_counters {
+       pfsyncs_ipackets,
+       pfsyncs_ipackets6,
+       pfsyncs_badif,
+       pfsyncs_badttl,
+       pfsyncs_hdrops,
+       pfsyncs_badver,
+       pfsyncs_badact,
+       pfsyncs_badlen,
+       pfsyncs_badauth,
+       pfsyncs_stale,
+       pfsyncs_badval,
+       pfsyncs_badstate,
+       pfsyncs_opackets,
+       pfsyncs_opackets6,
+       pfsyncs_onomem,
+       pfsyncs_oerrors,
+       pfsyncs_ncounters,
+};
+
+extern struct cpumem *pfsynccounters;
+
+static inline void
+pfsyncstat_inc(enum pfsync_counters c)
+{
+       counters_inc(pfsynccounters, c);
+}
+
 /*
  * this shows where a pf state is with respect to the syncing.
  */


-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to