Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/netstat Update for per-cpu interface statistics.



details:   https://anonhg.NetBSD.org/src/rev/2207267a8446
branches:  trunk
changeset: 848588:2207267a8446
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Sun Feb 02 03:41:12 2020 +0000

description:
Update for per-cpu interface statistics.

diffstat:

 usr.bin/netstat/if.c |  66 +++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 47 insertions(+), 19 deletions(-)

diffs (143 lines):

diff -r c5d46eefd07e -r 2207267a8446 usr.bin/netstat/if.c
--- a/usr.bin/netstat/if.c      Sat Feb 01 22:38:31 2020 +0000
+++ b/usr.bin/netstat/if.c      Sun Feb 02 03:41:12 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if.c,v 1.95 2018/07/11 07:46:20 msaitoh Exp $  */
+/*     $NetBSD: if.c,v 1.96 2020/02/02 03:41:12 thorpej Exp $  */
 
 /*
  * Copyright (c) 1983, 1988, 1993
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "from: @(#)if.c 8.2 (Berkeley) 2/21/94";
 #else
-__RCSID("$NetBSD: if.c,v 1.95 2018/07/11 07:46:20 msaitoh Exp $");
+__RCSID("$NetBSD: if.c,v 1.96 2020/02/02 03:41:12 thorpej Exp $");
 #endif
 #endif /* not lint */
 
@@ -289,9 +289,34 @@
 };
 
 static void
+ifnet_to_ifdata_kvm(const struct ifnet * const ifp, struct if_data * const ifd)
+{
+
+       /*
+        * Interface statistics are no longer kept in struct ifnet,
+        * and thus an if_data is no longer embedded in struct ifnet.
+        * We cannot read stats via kvm without chasing per-cpu data,
+        * and maybe someday we could do that.  But for now, this is
+        * what we have.
+        *
+        * Just copy the fields that do exist.
+        */
+       memset(ifd, 0, sizeof(*ifd));
+       ifd->ifi_type = ifp->if_type;
+       ifd->ifi_addrlen = ifp->if_addrlen;
+       ifd->ifi_hdrlen = ifp->if_hdrlen;
+       ifd->ifi_link_state = ifp->if_link_state;
+       ifd->ifi_mtu = ifp->if_mtu;
+       ifd->ifi_metric = ifp->if_metric;
+       ifd->ifi_baudrate = ifp->if_baudrate;
+       ifd->ifi_lastchange = ifp->if_lastchange;
+}
+
+static void
 intpr_kvm(u_long ifnetaddr, void (*pfunc)(const char *))
 {
        struct ifnet ifnet;
+       struct if_data ifd;
        union ifaddr_u ifaddr;
        u_long ifaddraddr;
        struct ifnet_head ifhead;       /* TAILQ_HEAD */
@@ -358,8 +383,9 @@
                        cp = (CP(ifaddr.ifa.ifa_addr) - CP(ifaddraddr)) +
                            CP(&ifaddr);
                        sa = (struct sockaddr *)cp;
+                       ifnet_to_ifdata_kvm(&ifnet, &ifd);
                        print_addr(ifnet.if_index, sa, (void *)&ifaddr,
-                           &ifnet.if_data, &ifnet);
+                           &ifd, &ifnet);
                }
                ifaddraddr = (u_long)ifaddr.ifa.ifa_list.tqe_next;
        }
@@ -787,6 +813,7 @@
        sigset_t emptyset;
        sigset_t noalrm;
        struct ifnet ifnet;
+       struct if_data ifd;
        u_long firstifnet;
        struct iftot *ip, *total;
        unsigned line;
@@ -906,53 +933,54 @@
                        off = 0;
                        continue;
                }
+               ifnet_to_ifdata_kvm(&ifnet, &ifd);
                if (ip == interesting) {
                        if (bflag) {
                                char humbuf[HUMBUF_SIZE];
 
                                if (hflag && humanize_number(humbuf,
                                    sizeof(humbuf),
-                                   ifnet.if_ibytes - ip->ift_ib, "",
+                                   ifd.ifi_ibytes - ip->ift_ib, "",
                                    HN_AUTOSCALE, HN_NOSPACE | HN_B) > 0)
                                        printf("%10s %8.8s ", humbuf, " ");
                                else
                                        printf("%10llu %8.8s ", 
                                            (unsigned long long)
-                                           (ifnet.if_ibytes-ip->ift_ib), " ");
+                                           (ifd.ifi_ibytes-ip->ift_ib), " ");
 
                                if (hflag && humanize_number(humbuf,
                                    sizeof(humbuf),
-                                   ifnet.if_obytes - ip->ift_ob, "",
+                                   ifd.ifi_obytes - ip->ift_ob, "",
                                    HN_AUTOSCALE, HN_NOSPACE | HN_B) > 0)
                                        printf("%10s %5.5s", humbuf, " ");
                                else
                                        printf("%10llu %5.5s", 
                                            (unsigned long long)
-                                           (ifnet.if_obytes-ip->ift_ob), " ");
+                                           (ifd.ifi_obytes-ip->ift_ob), " ");
                        } else {
                                printf("%8llu %5llu %8llu %5llu %5llu",
                                    (unsigned long long)
-                                       (ifnet.if_ipackets - ip->ift_ip),
+                                       (ifd.ifi_ipackets - ip->ift_ip),
                                    (unsigned long long)
-                                       (ifnet.if_ierrors - ip->ift_ie),
+                                       (ifd.ifi_ierrors - ip->ift_ie),
                                    (unsigned long long)
-                                       (ifnet.if_opackets - ip->ift_op),
+                                       (ifd.ifi_opackets - ip->ift_op),
                                    (unsigned long long)
-                                       (ifnet.if_oerrors - ip->ift_oe),
+                                       (ifd.ifi_oerrors - ip->ift_oe),
                                    (unsigned long long)
-                                       (ifnet.if_collisions - ip->ift_co));
+                                       (ifd.ifi_collisions - ip->ift_co));
                        }
                        if (dflag)
                                printf(" %5" PRIu64,
                                        ifnet.if_snd.ifq_drops - ip->ift_dr);
                }
-               ip->ift_ip = ifnet.if_ipackets;
-               ip->ift_ib = ifnet.if_ibytes;
-               ip->ift_ie = ifnet.if_ierrors;
-               ip->ift_op = ifnet.if_opackets;
-               ip->ift_ob = ifnet.if_obytes;
-               ip->ift_oe = ifnet.if_oerrors;
-               ip->ift_co = ifnet.if_collisions;
+               ip->ift_ip = ifd.ifi_ipackets;
+               ip->ift_ib = ifd.ifi_ibytes;
+               ip->ift_ie = ifd.ifi_ierrors;
+               ip->ift_op = ifd.ifi_opackets;
+               ip->ift_ob = ifd.ifi_obytes;
+               ip->ift_oe = ifd.ifi_oerrors;
+               ip->ift_co = ifd.ifi_collisions;
                ip->ift_dr = ifnet.if_snd.ifq_drops;
                sum->ift_ip += ip->ift_ip;
                sum->ift_ib += ip->ift_ib;



Home | Main Index | Thread Index | Old Index