ifnet - Compute iface statistics for NET_RT_IFLIST
authorAntonio Huete Jimenez <tuxillo@quantumachine.net>
Tue, 10 Sep 2013 11:11:32 +0000 (04:11 -0700)
committerAntonio Huete Jimenez <tuxillo@quantumachine.net>
Tue, 10 Sep 2013 11:42:47 +0000 (04:42 -0700)
  Before the ifnet statistics went per-cpu, they were being stored in
  ifnet->if_data. Some functions, like getifaddrs(3), expect them to
  be there so make sure they are available.

Reported by: Tim Bishop, Jens Rehsack

sys/net/rtsock.c

index 1fb8821..a35bfbf 100644 (file)
@@ -1313,6 +1313,21 @@ sysctl_dumpentry(struct radix_node *rn, void *vw)
        return (0);
 }
 
+static void
+ifnet_compute_stats(struct ifnet *ifp)
+{
+       IFNET_STAT_GET(ifp, ipackets, ifp->if_ipackets);
+       IFNET_STAT_GET(ifp, ierrors, ifp->if_ierrors);
+       IFNET_STAT_GET(ifp, opackets, ifp->if_opackets);
+       IFNET_STAT_GET(ifp, collisions, ifp->if_collisions);
+       IFNET_STAT_GET(ifp, ibytes, ifp->if_ibytes);
+       IFNET_STAT_GET(ifp, obytes, ifp->if_obytes);
+       IFNET_STAT_GET(ifp, imcasts, ifp->if_imcasts);
+       IFNET_STAT_GET(ifp, omcasts, ifp->if_omcasts);
+       IFNET_STAT_GET(ifp, iqdrops, ifp->if_iqdrops);
+       IFNET_STAT_GET(ifp, noproto, ifp->if_noproto);
+}
+
 static int
 sysctl_iflist(int af, struct walkarg *w)
 {
@@ -1340,6 +1355,7 @@ sysctl_iflist(int af, struct walkarg *w)
 
                        ifm->ifm_index = ifp->if_index;
                        ifm->ifm_flags = ifp->if_flags;
+                       ifnet_compute_stats(ifp);
                        ifm->ifm_data = ifp->if_data;
                        ifm->ifm_addrs = rtinfo.rti_addrs;
                        error = SYSCTL_OUT(w->w_req, ifm, msglen);