Module Name:    src
Committed By:   msaitoh
Date:           Mon Sep  5 02:26:22 UTC 2022

Modified Files:
        src/usr.bin/netstat: if.c

Log Message:
Print oqdrops correctly.


To generate a diff of this commit:
cvs rdiff -u -r1.100 -r1.101 src/usr.bin/netstat/if.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/netstat/if.c
diff -u src/usr.bin/netstat/if.c:1.100 src/usr.bin/netstat/if.c:1.101
--- src/usr.bin/netstat/if.c:1.100	Mon Sep  5 00:18:25 2022
+++ src/usr.bin/netstat/if.c	Mon Sep  5 02:26:22 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.c,v 1.100 2022/09/05 00:18:25 msaitoh Exp $	*/
+/*	$NetBSD: if.c,v 1.101 2022/09/05 02:26:22 msaitoh 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.100 2022/09/05 00:18:25 msaitoh Exp $");
+__RCSID("$NetBSD: if.c,v 1.101 2022/09/05 02:26:22 msaitoh Exp $");
 #endif
 #endif /* not lint */
 
@@ -76,16 +76,21 @@ struct	iftot {
 	u_quad_t ift_ip;		/* input packets */
 	u_quad_t ift_ib;		/* input bytes */
 	u_quad_t ift_ie;		/* input errors */
+	u_quad_t ift_iq;		/* input drops */
 	u_quad_t ift_op;		/* output packets */
 	u_quad_t ift_ob;		/* output bytes */
 	u_quad_t ift_oe;		/* output errors */
+	u_quad_t ift_oq;		/* output drops */
 	u_quad_t ift_co;		/* collisions */
-	u_quad_t ift_dr;		/* drops */
+};
+
+struct if_data_ext {
+	uint64_t ifi_oqdrops;
 };
 
 static void set_lines(void);
 static void print_addr(const int, struct sockaddr *, struct sockaddr **,
-    struct if_data *, struct ifnet *);
+    struct if_data *, struct ifnet *, struct if_data_ext *);
 static void sidewaysintpr(u_int, u_long);
 
 static void iftot_banner(struct iftot *);
@@ -96,6 +101,7 @@ static void catchalarm(int);
 static void get_rtaddrs(int, struct sockaddr *, struct sockaddr **);
 static void fetchifs(void);
 
+static int if_data_ext_get(const char *, struct if_data_ext *);
 static void intpr_sysctl(void);
 static void intpr_kvm(u_long, void (*)(const char *));
 
@@ -165,6 +171,28 @@ intpr_header(void)
 	}
 }
 
+int
+if_data_ext_get(const char *ifname, struct if_data_ext *dext)
+{
+	char namebuf[1024];
+	size_t len;
+	int drops;
+
+	/* For sysctl */
+	snprintf(namebuf, sizeof(namebuf),
+	    "net.interfaces.%s.sndq.drops", ifname);
+	len = sizeof(drops);
+	if (sysctlbyname(namebuf, &drops, &len, NULL, 0)
+	    == -1) {
+		warnx("'%s' not found", namebuf);
+		dext->ifi_oqdrops = 0;
+		return -1;
+	} else
+		dext->ifi_oqdrops = drops;
+
+	return 0;
+}
+
 static void
 intpr_sysctl(void)
 {
@@ -182,6 +210,7 @@ intpr_sysctl(void)
 	size_t len;
 	int did = 1, rtax = 0, n;
 	char name[IFNAMSIZ + 1];	/* + 1 for `*' */
+	char origname[IFNAMSIZ];	/* without `*' */
 	int ifindex = 0;
 
 	if (prog_sysctl(mib, 6, NULL, &len, NULL, 0) == -1)
@@ -199,6 +228,8 @@ intpr_sysctl(void)
 
 	lim = buf + len;
 	for (next = buf; next < lim; next += rtm->rtm_msglen) {
+		struct if_data_ext dext;
+
 		rtm = (struct rt_msghdr *)next;
 		if (rtm->rtm_version != RTM_VERSION)
 			continue;
@@ -226,11 +257,15 @@ intpr_sysctl(void)
 
 			ifindex = sdl->sdl_index;
 
-			/* mark inactive interfaces with a '*' */
+			/* Keep the original name */
+			strcpy(origname, name);
+
+			/* Mark inactive interfaces with a '*' */
 			cp = strchr(name, '\0');
-			if ((ifm->ifm_flags & IFF_UP) == 0)
+			if ((ifm->ifm_flags & IFF_UP) == 0) {
 				*cp++ = '*';
-			*cp = '\0';
+				*cp = '\0';
+			}
 
 			if (qflag) {
 				total = ifd->ifi_ibytes + ifd->ifi_obytes +
@@ -274,7 +309,28 @@ intpr_sysctl(void)
 			n = 5;
 
 		printf("%-*.*s %-5" PRIu64 " ", n, n, name, ifd->ifi_mtu);
-		print_addr(ifindex, rti_info[rtax], rti_info, ifd, NULL);
+		if (dflag) {
+#if 0
+			char namebuf[1024];
+			int drops;
+
+			/* For sysctl */
+			snprintf(namebuf, sizeof(namebuf),
+			    "net.interfaces.%s.sndq.drops", origname);
+			len = sizeof(drops);
+			if (sysctlbyname(namebuf, &drops, &len, NULL, 0)
+			    == -1) {
+				warnx("'%s' not found", namebuf);
+				dext.ifi_oqdrops = 0;
+			} else
+				dext.ifi_oqdrops = drops;
+#else
+			if_data_ext_get(origname, &dext);
+#endif
+		}
+
+		print_addr(ifindex, rti_info[rtax], rti_info, ifd,
+		    NULL, dflag ? &dext : NULL);
 	}
 }
 
@@ -376,7 +432,7 @@ intpr_kvm(u_long ifnetaddr, void (*pfunc
 			sa = (struct sockaddr *)cp;
 			ifname_to_ifdata(s, name, &ifd);
 			print_addr(ifnet.if_index, sa, (void *)&ifaddr,
-			    &ifd, &ifnet);
+			    &ifd, &ifnet, NULL);
 		}
 		ifaddraddr = (u_long)ifaddr.ifa.ifa_list.tqe_next;
 	}
@@ -473,8 +529,8 @@ mc4_print(const int ifindex)
 }
 
 static void
-print_addr(const int ifindex, struct sockaddr *sa,
-    struct sockaddr **rtinfo, struct if_data *ifd, struct ifnet *ifnet)
+print_addr(const int ifindex, struct sockaddr *sa, struct sockaddr **rtinfo,
+    struct if_data *ifd, struct ifnet *ifnet, struct if_data_ext *dext)
 {
 	char hexsep = '.';		/* for hexprint */
 	static const char hexfmt[] = "%02x%c";	/* for hexprint */
@@ -647,7 +703,8 @@ print_addr(const int ifindex, struct soc
 	}
 	if (dflag)
 		printf(" %6lld", ifnet ?
-		    (unsigned long long)ifnet->if_snd.ifq_drops : 0);
+		    (unsigned long long)ifnet->if_snd.ifq_drops :
+			dext->ifi_oqdrops);
 	if (tflag)
 		printf(" %4d", ifnet ? ifnet->if_timer : 0);
 	putchar('\n');
@@ -712,7 +769,7 @@ iftot_print(struct iftot *cur, struct if
 		    cur->ift_oe - old->ift_oe,
 		    cur->ift_co - old->ift_co);
 	if (dflag)
-		printf(" %5" PRIu64, cur->ift_dr - old->ift_dr);
+		printf(" %5" PRIu64, cur->ift_oq - old->ift_oq);
 }
 
 static void
@@ -731,7 +788,7 @@ iftot_print_sum(struct iftot *cur, struc
 		    cur->ift_co - old->ift_co);
 
 	if (dflag)
-		printf(" %5" PRIu64, cur->ift_dr - old->ift_dr);
+		printf(" %5" PRIu64, cur->ift_oq - old->ift_oq);
 }
 
 __dead static void
@@ -888,7 +945,7 @@ banner:
 		ip->ift_ob = 0;
 		ip->ift_oe = 0;
 		ip->ift_co = 0;
-		ip->ift_dr = 0;
+		ip->ift_iq = 0;
 	}
 	putchar('\n');
 	if (bflag)
@@ -920,7 +977,7 @@ loop:
 	sum->ift_ob = 0;
 	sum->ift_oe = 0;
 	sum->ift_co = 0;
-	sum->ift_dr = 0;
+	sum->ift_iq = 0;
 	for (off = firstifnet, ip = iftot; off && ip < lastif; ip++) {
 		if (kread(off, (char *)&ifnet, sizeof ifnet)) {
 			off = 0;
@@ -965,7 +1022,7 @@ loop:
 			}
 			if (dflag)
 				printf(" %5" PRIu64,
-					ifnet.if_snd.ifq_drops - ip->ift_dr);
+					ifnet.if_snd.ifq_drops - ip->ift_oq);
 		}
 		ip->ift_ip = ifd.ifi_ipackets;
 		ip->ift_ib = ifd.ifi_ibytes;
@@ -974,7 +1031,7 @@ loop:
 		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;
+		ip->ift_oq = ifnet.if_snd.ifq_drops;
 		sum->ift_ip += ip->ift_ip;
 		sum->ift_ib += ip->ift_ib;
 		sum->ift_ie += ip->ift_ie;
@@ -982,7 +1039,7 @@ loop:
 		sum->ift_ob += ip->ift_ob;
 		sum->ift_oe += ip->ift_oe;
 		sum->ift_co += ip->ift_co;
-		sum->ift_dr += ip->ift_dr;
+		sum->ift_oq += ip->ift_oq;
 		off = (u_long)ifnet.if_list.tqe_next;
 	}
 	if (lastif - iftot > 0) {
@@ -1021,7 +1078,7 @@ loop:
 		}
 		if (dflag)
 			printf(" %5llu",
-			    (unsigned long long)(sum->ift_dr - total->ift_dr));
+			    (unsigned long long)(sum->ift_oq - total->ift_oq));
 	}
 	*total = *sum;
 	putchar('\n');
@@ -1090,6 +1147,7 @@ fetchifs(void)
 	struct sockaddr_dl *sdl;
 	static char *buf = NULL;
 	static size_t olen;
+	struct if_data_ext dext;
 	char *next, *lim;
 	char name[IFNAMSIZ];
 	size_t len;
@@ -1105,6 +1163,7 @@ fetchifs(void)
 	if (prog_sysctl(mib, 6, buf, &len, NULL, 0) == -1)
 		err(1, "sysctl");
 
+	memset(&dext, 0, sizeof(dext));
 	lim = buf + len;
 	for (next = buf; next < lim; next += rtm->rtm_msglen) {
 		rtm = (struct rt_msghdr *)next;
@@ -1127,6 +1186,8 @@ fetchifs(void)
 			else if (sdl->sdl_nlen > 0)
 				memcpy(name, sdl->sdl_data, sdl->sdl_nlen);
 
+			if_data_ext_get(name, &dext);
+
 			if (interface != NULL && !strcmp(name, interface)) {
 				strlcpy(ip_cur.ift_name, name,
 				    sizeof(ip_cur.ift_name));
@@ -1137,7 +1198,8 @@ fetchifs(void)
 				ip_cur.ift_ob = ifd->ifi_obytes;
 				ip_cur.ift_oe = ifd->ifi_oerrors;
 				ip_cur.ift_co = ifd->ifi_collisions;
-				ip_cur.ift_dr = ifd->ifi_iqdrops;
+				ip_cur.ift_iq = ifd->ifi_iqdrops;
+				ip_cur.ift_oq = ifd->ifi_iqdrops; /* XXX */
 			}
 
 			sum_cur.ift_ip += ifd->ifi_ipackets;
@@ -1147,7 +1209,8 @@ fetchifs(void)
 			sum_cur.ift_ob += ifd->ifi_obytes;
 			sum_cur.ift_oe += ifd->ifi_oerrors;
 			sum_cur.ift_co += ifd->ifi_collisions;
-			sum_cur.ift_dr += ifd->ifi_iqdrops;
+			sum_cur.ift_iq += ifd->ifi_iqdrops;
+			sum_cur.ift_oq += dext.ifi_oqdrops;
 			break;
 		}
 	}
@@ -1161,6 +1224,7 @@ fetchifs(void)
 		ip_cur.ift_ob = ifd->ifi_obytes;
 		ip_cur.ift_oe = ifd->ifi_oerrors;
 		ip_cur.ift_co = ifd->ifi_collisions;
-		ip_cur.ift_dr = ifd->ifi_iqdrops;
+		ip_cur.ift_iq = ifd->ifi_iqdrops;
+		ip_cur.ift_oq = dext.ifi_oqdrops;
 	}
 }

Reply via email to