From: Alexander Bluhm Subject: netstat multicast counter To: tech@openbsd.org Date: Thu, 16 Jul 2026 01:07:08 +0200 Hi, I did not find a way to print the per interface multicast counter. netstat -i -g seems the natural way for these values. $ netstat -I em0 -g Name Mtu Network Address Imcastpkts Omcastpkts em0 1500 3c:97:0e:a7:09:b2 6136 4141 em0 1500 fe80::%em0/ fe80::3e97:eff:fe 6136 4141 em0 1500 10.188.17/2 10.188.17.17 6136 4141 $ netstat -I em0 -g -w1 em0 in em0 out total in total out mcast pkts mcast pkts mcast pkts mcast pkts 6140 4145 107002 58348 0 1 5 1 0 1 2 6 0 0 0 4 0 0 1 1 ok? bluhm Index: usr.bin/netstat/if.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/usr.bin/netstat/if.c,v diff -u -p -r1.81 if.c --- usr.bin/netstat/if.c 8 Mar 2023 04:43:12 -0000 1.81 +++ usr.bin/netstat/if.c 15 Jul 2026 23:01:47 -0000 @@ -115,6 +115,8 @@ intpr(int interval, int repeatcount) "Name", "Mtu", "Network", "Address"); if (bflag) printf("%10.10s %10.10s", "Ibytes", "Obytes"); + else if (gflag) + printf("%10.10s %10.10s", "Imcastpkts", "Omcastpkts"); else { printf("%8.8s %5.5s %8.8s %5.5s %5.5s", "Ipkts", if_errs->iname, @@ -155,14 +157,21 @@ intpr(int interval, int repeatcount) *cp = '\0'; if (qflag) { - total = ifd->ifi_ibytes + ifd->ifi_obytes + - ifd->ifi_ipackets + - ifd->ifi_opackets + - ifd->ifi_collisions; - total += if_errs->count(ifd->ifi_ierrors, - ifd->ifi_iqdrops); - total += if_errs->count(ifd->ifi_oerrors, - ifd->ifi_oqdrops); + if (bflag) + total = + ifd->ifi_ibytes + ifd->ifi_obytes; + else if (gflag) + total = + ifd->ifi_imcasts + ifd->ifi_omcasts; + else + total = + ifd->ifi_ipackets + + if_errs->count(ifd->ifi_ierrors, + ifd->ifi_iqdrops) + + ifd->ifi_opackets + + if_errs->count(ifd->ifi_oerrors, + ifd->ifi_oqdrops) + + ifd->ifi_collisions; if (total == 0) continue; } @@ -289,7 +298,10 @@ hexprint: } else printf("%10llu %10llu", ifd->ifi_ibytes, ifd->ifi_obytes); - } else + } else if (gflag) + printf("%10llu %10llu", + ifd->ifi_imcasts, ifd->ifi_omcasts); + else printf("%8llu %5llu %8llu %5llu %5llu", ifd->ifi_ipackets, if_errs->count(ifd->ifi_ierrors, ifd->ifi_iqdrops), @@ -303,10 +315,12 @@ struct iftot { char ift_name[IFNAMSIZ]; /* interface name */ u_int64_t ift_ip; /* input packets */ u_int64_t ift_ib; /* input bytes */ + u_int64_t ift_im; /* input multicast */ u_int64_t ift_ie; /* input errors */ u_int64_t ift_iq; /* input qdrops */ u_int64_t ift_op; /* output packets */ u_int64_t ift_ob; /* output bytes */ + u_int64_t ift_om; /* output multicast */ u_int64_t ift_oe; /* output errors */ u_int64_t ift_oq; /* output qdrops */ u_int64_t ift_co; /* collisions */ @@ -339,7 +353,7 @@ sidewaysintpr(unsigned int interval, int signalled = 0; (void)alarm(interval); banner: - if (bflag) + if (bflag || gflag) printf("%7.7s in %8.8s %6.6s out %5.5s", ip_cur.ift_name, " ", ip_cur.ift_name, " "); @@ -348,7 +362,7 @@ banner: ip_cur.ift_name, " ", ip_cur.ift_name, " ", " "); - if (bflag) + if (bflag || gflag) printf(" %7.7s in %8.8s %6.6s out %5.5s", "total", " ", "total", " "); else @@ -358,6 +372,9 @@ banner: if (bflag) printf("%10.10s %8.8s %10.10s %5.5s", "bytes", " ", "bytes", " "); + else if (gflag) + printf("%10.10s %8.8s %10.10s %5.5s", + "mcast pkts", " ", "mcast pkts", " "); else printf("%8.8s %5.5s %8.8s %5.5s %5.5s", "packets", if_errs->name, @@ -366,6 +383,9 @@ banner: if (bflag) printf("%10.10s %8.8s %10.10s %5.5s", "bytes", " ", "bytes", " "); + else if (gflag) + printf("%10.10s %8.8s %10.10s %5.5s", + "mcast pkts", " ", "mcast pkts", " "); else printf(" %8.8s %5.5s %8.8s %5.5s %5.5s", "packets", "errs", "packets", "errs", "colls"); @@ -389,7 +409,11 @@ loop: printf("%10llu %8.8s %10llu %5.5s", ip_cur.ift_ib - ip_old.ift_ib, " ", ip_cur.ift_ob - ip_old.ift_ob, " "); - } else + } else if (gflag) + printf("%10llu %8.8s %10llu %5.5s", + ip_cur.ift_im - ip_old.ift_im, " ", + ip_cur.ift_om - ip_old.ift_om, " "); + else printf("%8llu %5llu %8llu %5llu %5llu", ip_cur.ift_ip - ip_old.ift_ip, if_errs->count(ip_cur.ift_ie - ip_old.ift_ie, @@ -411,7 +435,11 @@ loop: printf("%10llu %8.8s %10llu %5.5s", sum_cur.ift_ib - sum_old.ift_ib, " ", sum_cur.ift_ob - sum_old.ift_ob, " "); - } else + } else if (gflag) + printf("%10llu %8.8s %10llu %5.5s", + sum_cur.ift_im - sum_old.ift_im, " ", + sum_cur.ift_om - sum_old.ift_om, " "); + else printf("%8llu %5llu %8llu %5llu %5llu", sum_cur.ift_ip - sum_old.ift_ip, if_errs->count(sum_cur.ift_ie - sum_old.ift_ie, @@ -556,10 +584,12 @@ fetchifs(void) sizeof(ip_cur.ift_name)); ip_cur.ift_ip = ifd->ifi_ipackets; ip_cur.ift_ib = ifd->ifi_ibytes; + ip_cur.ift_im = ifd->ifi_imcasts; ip_cur.ift_ie = ifd->ifi_ierrors; ip_cur.ift_iq = ifd->ifi_iqdrops; ip_cur.ift_op = ifd->ifi_opackets; ip_cur.ift_ob = ifd->ifi_obytes; + ip_cur.ift_om = ifd->ifi_omcasts; ip_cur.ift_oe = ifd->ifi_oerrors; ip_cur.ift_oq = ifd->ifi_oqdrops; ip_cur.ift_co = ifd->ifi_collisions; @@ -567,10 +597,12 @@ fetchifs(void) sum_cur.ift_ip += ifd->ifi_ipackets; sum_cur.ift_ib += ifd->ifi_ibytes; + sum_cur.ift_im += ifd->ifi_imcasts; sum_cur.ift_ie += ifd->ifi_ierrors; sum_cur.ift_iq += ifd->ifi_iqdrops; sum_cur.ift_op += ifd->ifi_opackets; sum_cur.ift_ob += ifd->ifi_obytes; + sum_cur.ift_om += ifd->ifi_omcasts; sum_cur.ift_oe += ifd->ifi_oerrors; sum_cur.ift_oq += ifd->ifi_oqdrops; sum_cur.ift_co += ifd->ifi_collisions; @@ -582,10 +614,12 @@ fetchifs(void) sizeof(ip_cur.ift_name)); ip_cur.ift_ip = ifd->ifi_ipackets; ip_cur.ift_ib = ifd->ifi_ibytes; + ip_cur.ift_im = ifd->ifi_imcasts; ip_cur.ift_ie = ifd->ifi_ierrors; ip_cur.ift_iq = ifd->ifi_iqdrops; ip_cur.ift_op = ifd->ifi_opackets; ip_cur.ift_ob = ifd->ifi_obytes; + ip_cur.ift_om = ifd->ifi_omcasts; ip_cur.ift_oe = ifd->ifi_oerrors; ip_cur.ift_oq = ifd->ifi_oqdrops; ip_cur.ift_co = ifd->ifi_collisions;