pppac(4) uses per cpu counters for collect `ifnet' statistics, but in
pipex(4) layer this `ifnet' still uses `if_data'. Also pppx(4) doesn't
use per cpu counters but `if_data'. I propose to use per cpu counters
for pppx(4) and pipex(4) to avoid interface statistics collecting mix.

Also this will be the step to remove netlock from pppx(4) output.

Index: sys/net/if_pppx.c
===================================================================
RCS file: /cvs/src/sys/net/if_pppx.c,v
retrieving revision 1.102
diff -u -p -r1.102 if_pppx.c
--- sys/net/if_pppx.c   27 Aug 2020 10:47:52 -0000      1.102
+++ sys/net/if_pppx.c   28 Aug 2020 07:48:08 -0000
@@ -658,6 +658,7 @@ pppx_add_session(struct pppx_dev *pxd, s
        ifp->if_type = IFT_PPP;
        ifp->if_softc = pxi;
        /* ifp->if_rdomain = req->pr_rdomain; */
+       if_counters_alloc(ifp);
 
        /* XXXSMP breaks atomicity */
        NET_UNLOCK();
@@ -878,7 +879,7 @@ pppx_if_output(struct ifnet *ifp, struct
 
 out:
        if (error)
-               ifp->if_oerrors++;
+               counters_inc(ifp->if_counters, ifc_oerrors);
        return (error);
 }
 
Index: sys/net/pipex.c
===================================================================
RCS file: /cvs/src/sys/net/pipex.c,v
retrieving revision 1.125
diff -u -p -r1.125 pipex.c
--- sys/net/pipex.c     27 Aug 2020 10:47:52 -0000      1.125
+++ sys/net/pipex.c     28 Aug 2020 07:48:08 -0000
@@ -912,8 +912,7 @@ pipex_ip_input(struct mbuf *m0, struct p
                bpf_mtap_af(ifp->if_bpf, AF_INET, m0, BPF_DIRECTION_IN);
 #endif
 
-       ifp->if_ipackets++;
-       ifp->if_ibytes += len;
+       counters_pkt(ifp->if_counters, ifc_ipackets, ifc_ibytes, len);
        session->stat.ipackets++;
        session->stat.ibytes += len;
        ipv4_input(ifp, m0);
@@ -962,8 +961,7 @@ pipex_ip6_input(struct mbuf *m0, struct 
                bpf_mtap_af(ifp->if_bpf, AF_INET6, m0, BPF_DIRECTION_IN);
 #endif
 
-       ifp->if_ipackets++;
-       ifp->if_ibytes += len;
+       counters_pkt(ifp->if_counters, ifc_ipackets, ifc_ibytes, len);
        session->stat.ipackets++;
        session->stat.ibytes += len;
        ipv6_input(ifp, m0);

Reply via email to