=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/netstat/if.c,v retrieving revision 1.55 retrieving revision 1.56 diff -c -r1.55 -r1.56 *** src/usr.bin/netstat/if.c 2007/12/19 01:47:00 1.55 --- src/usr.bin/netstat/if.c 2008/01/03 21:01:40 1.56 *************** *** 1,4 **** ! /* $OpenBSD: if.c,v 1.55 2007/12/19 01:47:00 deraadt Exp $ */ /* $NetBSD: if.c,v 1.16.4.2 1996/06/07 21:46:46 thorpej Exp $ */ /* --- 1,4 ---- ! /* $OpenBSD: if.c,v 1.56 2008/01/03 21:01:40 claudio Exp $ */ /* $NetBSD: if.c,v 1.16.4.2 1996/06/07 21:46:46 thorpej Exp $ */ /* *************** *** 30,42 **** --- 30,45 ---- * SUCH DAMAGE. */ + #include #include #include #include + #include #include #include #include + #include #include #include #include *************** *** 51,61 **** #include "netstat.h" ! #define YES 1 ! #define NO 0 ! ! static void sidewaysintpr(u_int, u_long); static void catchalarm(int); /* * Print a description of the network interfaces. --- 54,64 ---- #include "netstat.h" ! static void print_addr(struct sockaddr *, struct sockaddr **, struct if_data *); ! static void sidewaysintpr(u_int); static void catchalarm(int); + static void get_rtaddrs(int, struct sockaddr *, struct sockaddr **); + static void fetchifs(void); /* * Print a description of the network interfaces. *************** *** 63,99 **** * which is a TAILQ_HEAD. */ void ! intpr(int interval, u_long ifnetaddr) { ! struct ifnet ifnet; ! union { ! struct ifaddr ifa; ! struct in_ifaddr in; ! struct in6_ifaddr in6; ! } ifaddr; ! u_int64_t total; ! u_long ifaddraddr; ! struct sockaddr *sa; ! struct ifnet_head ifhead; /* TAILQ_HEAD */ ! char name[IFNAMSIZ]; - if (ifnetaddr == 0) { - printf("ifnet: symbol not defined\n"); - return; - } if (interval) { ! sidewaysintpr((unsigned)interval, ifnetaddr); return; } ! /* ! * Find the pointer to the first ifnet structure. Replace ! * the pointer to the TAILQ_HEAD with the actual pointer ! * to the first list element. ! */ ! if (kread(ifnetaddr, &ifhead, sizeof ifhead)) ! return; ! ifnetaddr = (u_long)TAILQ_FIRST(&ifhead); printf("%-7.7s %-5.5s %-11.11s %-17.17s ", "Name", "Mtu", "Network", "Address"); --- 66,96 ---- * which is a TAILQ_HEAD. */ void ! intpr(int interval) { ! struct if_msghdr ifm; ! int mib[6] = { CTL_NET, AF_ROUTE, 0, 0, NET_RT_IFLIST, 0 }; ! char name[IFNAMSIZ + 1]; /* + 1 for the '*' */ ! char *buf, *next, *lim, *cp; ! struct rt_msghdr *rtm; ! struct ifa_msghdr *ifam; ! struct if_data *ifd; ! struct sockaddr *sa, *rti_info[RTAX_MAX]; ! struct sockaddr_dl *sdl; ! u_int64_t total = 0; ! size_t len; if (interval) { ! sidewaysintpr((unsigned)interval); return; } ! if (sysctl(mib, 6, NULL, &len, NULL, 0) == -1) ! err(1, "sysctl"); ! if ((buf = malloc(len)) == NULL) ! err(1, NULL); ! if (sysctl(mib, 6, buf, &len, NULL, 0) == -1) ! err(1, "sysctl"); printf("%-7.7s %-5.5s %-11.11s %-17.17s ", "Name", "Mtu", "Network", "Address"); *************** *** 107,318 **** if (dflag) printf(" %s", "Drop"); putchar('\n'); - ifaddraddr = 0; - while (ifnetaddr || ifaddraddr) { - struct sockaddr_in *sin; - struct sockaddr_in6 *sin6; - char *cp; - int n, m; ! if (ifaddraddr == 0) { ! if (kread(ifnetaddr, &ifnet, sizeof ifnet)) ! return; ! bcopy(ifnet.if_xname, name, IFNAMSIZ); ! name[IFNAMSIZ - 1] = '\0'; /* sanity */ ! ifnetaddr = (u_long)TAILQ_NEXT(&ifnet, if_list); if (interface != 0 && strcmp(name, interface) != 0) continue; cp = strchr(name, '\0'); ! if ((ifnet.if_flags & IFF_UP) == 0) *cp++ = '*'; *cp = '\0'; - ifaddraddr = (u_long)TAILQ_FIRST(&ifnet.if_addrlist); - } ! if (qflag) { ! total = ifnet.if_ibytes + ifnet.if_obytes + ! ifnet.if_ipackets + ifnet.if_ierrors + ! ifnet.if_opackets + ifnet.if_oerrors + ! ifnet.if_collisions; ! if (tflag) ! total += ifnet.if_timer; ! if (dflag) ! total += ifnet.if_snd.ifq_drops; ! if (total == 0) { ! ifaddraddr = 0; ! continue; } - } ! printf("%-7s %-5ld ", name, ifnet.if_mtu); ! if (ifaddraddr == 0) { ! printf("%-11.11s ", "none"); ! printf("%-17.17s ", "none"); ! } else { ! if (kread(ifaddraddr, &ifaddr, sizeof ifaddr)) { ! ifaddraddr = 0; continue; ! } ! #define CP(x) ((char *)(x)) ! cp = (CP(ifaddr.ifa.ifa_addr) - CP(ifaddraddr)) + ! CP(&ifaddr); sa = (struct sockaddr *)cp; ! switch (sa->sa_family) { ! case AF_UNSPEC: ! printf("%-11.11s ", "none"); ! printf("%-17.17s ", "none"); break; - case AF_INET: - sin = (struct sockaddr_in *)sa; - #ifdef notdef - /* can't use inet_makeaddr because kernel - * keeps nets unshifted. - */ - in = inet_makeaddr(ifaddr.in.ia_subnet, - INADDR_ANY); - cp = netname4(in.s_addr, - ifaddr.in.ia_subnetmask); - #else - cp = netname4(ifaddr.in.ia_subnet, - ifaddr.in.ia_subnetmask); - #endif - if (vflag) - n = strlen(cp) < 11 ? 11 : strlen(cp); - else - n = 11; - printf("%-*.*s ", n, n, cp); - cp = routename4(sin->sin_addr.s_addr); - if (vflag) - n = strlen(cp) < 17 ? 17 : strlen(cp); - else - n = 17; - printf("%-*.*s ", n, n, cp); ! if (aflag) { ! u_long multiaddr; ! struct in_multi inm; ! multiaddr = (u_long)LIST_FIRST(&ifaddr.in.ia_multiaddrs); ! while (multiaddr != 0) { ! kread(multiaddr, &inm, sizeof inm); ! printf("\n%25s %-17.17s ", "", ! routename4(inm.inm_addr.s_addr)); ! multiaddr = (u_long)LIST_NEXT(&inm, inm_list); ! } ! } ! break; ! case AF_INET6: ! sin6 = (struct sockaddr_in6 *)sa; #ifdef __KAME__ ! if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { ! sin6->sin6_scope_id = ntohs(*(u_int16_t *) ! &sin6->sin6_addr.s6_addr[2]); ! sin6->sin6_addr.s6_addr[2] = 0; ! sin6->sin6_addr.s6_addr[3] = 0; } #endif ! cp = netname6(&ifaddr.in6.ia_addr, ! &ifaddr.in6.ia_prefixmask); if (vflag) - n = strlen(cp) < 11 ? 11 : strlen(cp); - else - n = 11; - printf("%-*.*s ", n, n, cp); - cp = routename6(sin6); - if (vflag) n = strlen(cp) < 17 ? 17 : strlen(cp); else n = 17; ! printf("%-*.*s ", n, n, cp); ! if (aflag) { ! u_long multiaddr; ! struct in6_multi inm; ! struct sockaddr_in6 m6; ! ! multiaddr = (u_long)LIST_FIRST(&ifaddr.in6.ia6_multiaddrs); ! while (multiaddr != 0) { ! kread(multiaddr, &inm, sizeof inm); ! memset(&m6, 0, sizeof(m6)); ! m6.sin6_len = sizeof(struct sockaddr_in6); ! m6.sin6_family = AF_INET6; ! m6.sin6_addr = inm.in6m_addr; ! #ifdef __KAME__ ! if (IN6_IS_ADDR_MC_LINKLOCAL(&m6.sin6_addr) || ! IN6_IS_ADDR_MC_INTFACELOCAL(&m6.sin6_addr)) { ! m6.sin6_scope_id = ! ntohs(*(u_int16_t *) ! &m6.sin6_addr.s6_addr[2]); ! m6.sin6_addr.s6_addr[2] = 0; ! m6.sin6_addr.s6_addr[3] = 0; ! } ! #endif ! cp = routename6(&m6); ! if (vflag) ! n = strlen(cp) < 17 ? 17 : strlen(cp); ! else ! n = 17; ! printf("\n%25s %-*.*s ", "", ! n, n, cp); ! multiaddr = (u_long)LIST_NEXT(&inm, in6m_entry); ! } ! } ! break; ! case AF_APPLETALK: ! printf("atlk:%-12s",atalk_print(sa,0x10) ); ! printf("%-12s ",atalk_print(sa,0x0b) ); ! break; ! case AF_LINK: ! { ! struct sockaddr_dl *sdl = ! (struct sockaddr_dl *)sa; ! m = printf("%-11.11s ", ""); ! if (sdl->sdl_type == IFT_ETHER || ! sdl->sdl_type == IFT_CARP || ! sdl->sdl_type == IFT_FDDI || ! sdl->sdl_type == IFT_ISO88025) ! printf("%-17.17s ", ! ether_ntoa((struct ether_addr *)LLADDR(sdl))); ! else { ! cp = (char *)LLADDR(sdl); ! n = sdl->sdl_alen; ! goto hexprint; ! } ! } ! break; ! default: ! m = printf("(%d)", sa->sa_family); ! for (cp = sa->sa_len + (char *)sa; ! --cp > sa->sa_data && (*cp == 0);) {} ! n = cp - sa->sa_data + 1; ! cp = sa->sa_data; ! hexprint: ! while (--n >= 0) ! m += printf("%x%c", *cp++ & 0xff, ! n > 0 ? '.' : ' '); ! m = 30 - m; ! while (m-- > 0) ! putchar(' '); ! break; } - ifaddraddr = (u_long)TAILQ_NEXT(&ifaddr.ifa, ifa_list); } ! if (bflag) ! printf("%10llu %10llu", ! ifnet.if_ibytes, ifnet.if_obytes); ! else ! printf("%8llu %5llu %8llu %5llu %5llu", ! ifnet.if_ipackets, ifnet.if_ierrors, ! ifnet.if_opackets, ifnet.if_oerrors, ! ifnet.if_collisions); ! if (tflag) ! printf(" %4d", ifnet.if_timer); ! if (dflag) ! printf(" %4d", ifnet.if_snd.ifq_drops); ! putchar('\n'); } } - #define MAXIF 100 struct iftot { char ift_name[IFNAMSIZ]; /* interface name */ u_int64_t ift_ip; /* input packets */ --- 104,329 ---- if (dflag) printf(" %s", "Drop"); putchar('\n'); ! lim = buf + len; ! for (next = buf; next < lim; next += rtm->rtm_msglen) { ! rtm = (struct rt_msghdr *)next; ! if (rtm->rtm_version != RTM_VERSION) ! continue; ! switch (rtm->rtm_type) { ! case RTM_IFINFO: ! total = 0; ! bcopy(next, &ifm, sizeof ifm); ! ifd = &ifm.ifm_data; ! ! sa = (struct sockaddr *)(next + rtm->rtm_hdrlen); ! get_rtaddrs(ifm.ifm_addrs, sa, rti_info); ! ! sdl = (struct sockaddr_dl *)rti_info[RTAX_IFP]; ! if (sdl == NULL || sdl->sdl_family != AF_LINK) ! continue; ! bzero(name, sizeof(name)); ! if (sdl->sdl_nlen >= IFNAMSIZ) ! memcpy(name, sdl->sdl_data, IFNAMSIZ - 1); ! else if (sdl->sdl_nlen > 0) ! memcpy(name, sdl->sdl_data, sdl->sdl_nlen); ! if (interface != 0 && strcmp(name, interface) != 0) continue; + + /* mark inactive interfaces with a '*' */ cp = strchr(name, '\0'); ! if ((ifm.ifm_flags & IFF_UP) == 0) *cp++ = '*'; *cp = '\0'; ! if (qflag) { ! total = ifd->ifi_ibytes + ifd->ifi_obytes + ! ifd->ifi_ipackets + ifd->ifi_ierrors + ! ifd->ifi_opackets + ifd->ifi_oerrors + ! ifd->ifi_collisions; ! if (tflag) ! total += 0; // XXX ifnet.if_timer; ! if (dflag) ! total += 0; // XXX ifnet.if_snd.ifq_drops; ! if (total == 0) ! continue; } ! printf("%-7s %-5ld ", name, ifd->ifi_mtu); ! print_addr(rti_info[RTAX_IFP], rti_info, ifd); ! break; ! case RTM_NEWADDR: ! if (qflag && total == 0) continue; ! ifam = (struct ifa_msghdr *)next; ! if ((ifam->ifam_addrs & (RTA_NETMASK | RTA_IFA | ! RTA_BRD)) == 0) break; ! sa = (struct sockaddr *)(next + rtm->rtm_hdrlen); ! get_rtaddrs(ifam->ifam_addrs, sa, rti_info); ! printf("%-7s %-5ld ", name, ifd->ifi_mtu); ! print_addr(rti_info[RTAX_IFA], rti_info, ifd); ! break; ! } ! } ! } ! ! static void ! print_addr(struct sockaddr *sa, struct sockaddr **rtinfo, struct if_data *ifd) ! { ! struct sockaddr_dl *sdl; ! struct sockaddr_in *sin; ! struct sockaddr_in6 *sin6; ! char *cp; ! int m, n; ! ! switch (sa->sa_family) { ! case AF_UNSPEC: ! printf("%-11.11s ", "none"); ! printf("%-17.17s ", "none"); ! break; ! case AF_INET: ! sin = (struct sockaddr_in *)sa; ! cp = netname4(sin->sin_addr.s_addr, ! ((struct sockaddr_in *)rtinfo[RTAX_NETMASK])->sin_addr.s_addr); ! if (vflag) ! n = strlen(cp) < 11 ? 11 : strlen(cp); ! else ! n = 11; ! printf("%-*.*s ", n, n, cp); ! cp = routename4(sin->sin_addr.s_addr); ! if (vflag) ! n = strlen(cp) < 17 ? 17 : strlen(cp); ! else ! n = 17; ! printf("%-*.*s ", n, n, cp); ! ! #if 0 ! if (aflag) { ! u_long multiaddr; ! struct in_multi inm; ! ! multiaddr = (u_long)LIST_FIRST(&ifaddr.in.ia_multiaddrs); ! while (multiaddr != 0) { ! kread(multiaddr, &inm, sizeof inm); ! printf("\n%25s %-17.17s ", "", ! routename4(inm.inm_addr.s_addr)); ! multiaddr = (u_long)LIST_NEXT(&inm, inm_list); ! } ! } ! #endif ! break; ! case AF_INET6: ! sin6 = (struct sockaddr_in6 *)sa; #ifdef __KAME__ ! if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { ! sin6->sin6_scope_id = ! ntohs(*(u_int16_t *) ! &sin6->sin6_addr.s6_addr[2]); ! sin6->sin6_addr.s6_addr[2] = 0; ! sin6->sin6_addr.s6_addr[3] = 0; ! } ! #endif ! cp = netname6(sin6, ! (struct sockaddr_in6 *)rtinfo[RTAX_NETMASK]); ! if (vflag) ! n = strlen(cp) < 11 ? 11 : strlen(cp); ! else ! n = 11; ! printf("%-*.*s ", n, n, cp); ! cp = routename6(sin6); ! if (vflag) ! n = strlen(cp) < 17 ? 17 : strlen(cp); ! else ! n = 17; ! printf("%-*.*s ", n, n, cp); ! #if 0 ! if (aflag) { ! u_long multiaddr; ! struct in6_multi inm; ! struct sockaddr_in6 m6; ! ! multiaddr = (u_long)LIST_FIRST(&ifaddr.in6.ia6_multiaddrs); ! while (multiaddr != 0) { ! kread(multiaddr, &inm, sizeof inm); ! memset(&m6, 0, sizeof(m6)); ! m6.sin6_len = sizeof(struct sockaddr_in6); ! m6.sin6_family = AF_INET6; ! m6.sin6_addr = inm.in6m_addr; ! #ifdef __KAME__ ! if (IN6_IS_ADDR_MC_LINKLOCAL(&m6.sin6_addr) || ! IN6_IS_ADDR_MC_INTFACELOCAL(&m6.sin6_addr)) { ! m6.sin6_scope_id = ntohs(*(u_int16_t *) ! &m6.sin6_addr.s6_addr[2]); ! m6.sin6_addr.s6_addr[2] = 0; ! m6.sin6_addr.s6_addr[3] = 0; } #endif ! cp = routename6(&m6); if (vflag) n = strlen(cp) < 17 ? 17 : strlen(cp); else n = 17; ! printf("\n%25s %-*.*s ", "", ! n, n, cp); ! multiaddr = (u_long)LIST_NEXT(&inm, in6m_entry); } } ! #endif ! break; ! case AF_APPLETALK: ! printf("atlk:%-12s",atalk_print(sa,0x10) ); ! printf("%-12s ",atalk_print(sa,0x0b) ); ! break; ! case AF_LINK: ! sdl = (struct sockaddr_dl *)sa; ! m = printf("%-11.11s ", ""); ! if (sdl->sdl_type == IFT_ETHER || ! sdl->sdl_type == IFT_CARP || ! sdl->sdl_type == IFT_FDDI || ! sdl->sdl_type == IFT_ISO88025) ! printf("%-17.17s ", ! ether_ntoa((struct ether_addr *)LLADDR(sdl))); ! else { ! cp = (char *)LLADDR(sdl); ! n = sdl->sdl_alen; ! goto hexprint; ! } ! break; ! default: ! m = printf("(%d)", sa->sa_family); ! for (cp = sa->sa_len + (char *)sa; ! --cp > sa->sa_data && (*cp == 0);) {} ! n = cp - sa->sa_data + 1; ! cp = sa->sa_data; ! hexprint: ! while (--n >= 0) ! m += printf("%x%c", *cp++ & 0xff, ! n > 0 ? '.' : ' '); ! m = 30 - m; ! while (m-- > 0) ! putchar(' '); ! break; } + if (bflag) + printf("%10llu %10llu", + ifd->ifi_ibytes, ifd->ifi_obytes); + else + printf("%8llu %5llu %8llu %5llu %5llu", + ifd->ifi_ipackets, ifd->ifi_ierrors, + ifd->ifi_opackets, ifd->ifi_oerrors, + ifd->ifi_collisions); + if (tflag) + printf(" %4d", 0 /* XXX ifnet.if_timer */); + if (dflag) + printf(" %4d", 0 /* XXX ifnet.if_snd.ifq_drops */); + putchar('\n'); } struct iftot { char ift_name[IFNAMSIZ]; /* interface name */ u_int64_t ift_ip; /* input packets */ *************** *** 323,329 **** u_int64_t ift_oe; /* output errors */ u_int64_t ift_co; /* collisions */ u_int64_t ift_dr; /* drops */ ! } iftot[MAXIF]; volatile sig_atomic_t signalled; /* set if alarm goes off "early" */ --- 334,340 ---- u_int64_t ift_oe; /* output errors */ u_int64_t ift_co; /* collisions */ u_int64_t ift_dr; /* drops */ ! } ip_cur, ip_old, sum_cur, sum_old; volatile sig_atomic_t signalled; /* set if alarm goes off "early" */ *************** *** 334,415 **** * First line printed at top of screen is always cumulative. */ static void ! sidewaysintpr(unsigned int interval, u_long off) { struct ifnet ifnet; - u_long firstifnet; - struct iftot *ip, *total; - int line; - struct iftot *lastif, *sum, *interesting; - struct ifnet_head ifhead; /* TAILQ_HEAD */ sigset_t emptyset; ! /* ! * Find the pointer to the first ifnet structure. Replace ! * the pointer to the TAILQ_HEAD with the actual pointer ! * to the first list element. ! */ ! if (kread(off, &ifhead, sizeof ifhead)) ! return; ! firstifnet = (u_long)TAILQ_FIRST(&ifhead); ! ! lastif = iftot; ! sum = iftot + MAXIF - 1; ! total = sum - 1; ! interesting = (interface == NULL) ? iftot : NULL; ! for (off = firstifnet, ip = iftot; off;) { ! if (kread(off, &ifnet, sizeof ifnet)) ! break; ! bzero(ip->ift_name, sizeof(ip->ift_name)); ! snprintf(ip->ift_name, IFNAMSIZ, "%s", ifnet.if_xname); ! if (interface && strcmp(ifnet.if_xname, interface) == 0) ! interesting = ip; ! ip++; ! if (ip >= iftot + MAXIF - 2) ! break; ! off = (u_long)TAILQ_NEXT(&ifnet, if_list); ! } ! if (interesting == NULL) { fprintf(stderr, "%s: %s: unknown interface\n", __progname, interface); exit(1); } - lastif = ip; (void)signal(SIGALRM, catchalarm); ! signalled = NO; (void)alarm(interval); banner: if (bflag) printf("%7.7s in %8.8s %6.6s out %5.5s", ! interesting->ift_name, " ", ! interesting->ift_name, " "); else printf("%5.5s in %5.5s%5.5s out %5.5s %5.5s", ! interesting->ift_name, " ", ! interesting->ift_name, " ", " "); if (dflag) printf(" %5.5s", " "); ! if (lastif - iftot > 0) { ! if (bflag) ! printf(" %7.7s in %8.8s %6.6s out %5.5s", ! "total", " ", "total", " "); ! else ! printf(" %5.5s in %5.5s%5.5s out %5.5s %5.5s", ! "total", " ", "total", " ", " "); ! if (dflag) ! printf(" %5.5s", " "); ! } ! for (ip = iftot; ip < iftot + MAXIF; ip++) { ! ip->ift_ip = 0; ! ip->ift_ib = 0; ! ip->ift_ie = 0; ! ip->ift_op = 0; ! ip->ift_ob = 0; ! ip->ift_oe = 0; ! ip->ift_co = 0; ! ip->ift_dr = 0; ! } putchar('\n'); if (bflag) printf("%10.10s %8.8s %10.10s %5.5s", --- 345,386 ---- * First line printed at top of screen is always cumulative. */ static void ! sidewaysintpr(unsigned int interval) { struct ifnet ifnet; sigset_t emptyset; + int line; ! fetchifs(); ! if (ip_cur.ift_name[0] == '\0') { fprintf(stderr, "%s: %s: unknown interface\n", __progname, interface); exit(1); } (void)signal(SIGALRM, catchalarm); ! signalled = 0; (void)alarm(interval); banner: if (bflag) printf("%7.7s in %8.8s %6.6s out %5.5s", ! ip_cur.ift_name, " ", ! ip_cur.ift_name, " "); else printf("%5.5s in %5.5s%5.5s out %5.5s %5.5s", ! ip_cur.ift_name, " ", ! ip_cur.ift_name, " ", " "); if (dflag) printf(" %5.5s", " "); ! ! if (bflag) ! printf(" %7.7s in %8.8s %6.6s out %5.5s", ! "total", " ", "total", " "); ! else ! printf(" %5.5s in %5.5s%5.5s out %5.5s %5.5s", ! "total", " ", "total", " ", " "); ! if (dflag) ! printf(" %5.5s", " "); putchar('\n'); if (bflag) printf("%10.10s %8.8s %10.10s %5.5s", *************** *** 419,508 **** "packets", "errs", "packets", "errs", "colls"); if (dflag) printf(" %5.5s", "drops"); ! if (lastif - iftot > 0) { ! if (bflag) ! printf(" %10.10s %8.8s %10.10s %5.5s", ! "bytes", " ", "bytes", " "); ! else ! printf(" %8.8s %5.5s %8.8s %5.5s %5.5s", ! "packets", "errs", "packets", "errs", "colls"); ! if (dflag) ! printf(" %5.5s", "drops"); ! } putchar('\n'); fflush(stdout); line = 0; loop: ! sum->ift_ip = 0; ! sum->ift_ib = 0; ! sum->ift_ie = 0; ! sum->ift_op = 0; ! sum->ift_ob = 0; ! sum->ift_oe = 0; ! sum->ift_co = 0; ! sum->ift_dr = 0; ! for (off = firstifnet, ip = iftot; off && ip < lastif; ip++) { ! if (kread(off, &ifnet, sizeof ifnet)) { ! off = 0; ! continue; ! } ! if (ip == interesting) { ! if (bflag) ! printf("%10llu %8.8s %10llu %5.5s", ! ifnet.if_ibytes - ip->ift_ib, " ", ! ifnet.if_obytes - ip->ift_ob, " "); ! else ! printf("%8llu %5llu %8llu %5llu %5llu", ! ifnet.if_ipackets - ip->ift_ip, ! ifnet.if_ierrors - ip->ift_ie, ! ifnet.if_opackets - ip->ift_op, ! ifnet.if_oerrors - ip->ift_oe, ! ifnet.if_collisions - ip->ift_co); ! if (dflag) ! printf(" %5llu", ! 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_dr = ifnet.if_snd.ifq_drops; ! sum->ift_ip += ip->ift_ip; ! sum->ift_ib += ip->ift_ib; ! sum->ift_ie += ip->ift_ie; ! sum->ift_op += ip->ift_op; ! sum->ift_ob += ip->ift_ob; ! sum->ift_oe += ip->ift_oe; ! sum->ift_co += ip->ift_co; ! sum->ift_dr += ip->ift_dr; ! off = (u_long)TAILQ_NEXT(&ifnet, if_list); ! } ! if (lastif - iftot > 0) { ! if (bflag) ! printf(" %10llu %8.8s %10llu %5.5s", ! sum->ift_ib - total->ift_ib, " ", ! sum->ift_ob - total->ift_ob, " "); ! else ! printf(" %8llu %5llu %8llu %5llu %5llu", ! sum->ift_ip - total->ift_ip, ! sum->ift_ie - total->ift_ie, ! sum->ift_op - total->ift_op, ! sum->ift_oe - total->ift_oe, ! sum->ift_co - total->ift_co); ! if (dflag) ! printf(" %5llu", sum->ift_dr - total->ift_dr); ! } ! *total = *sum; putchar('\n'); fflush(stdout); line++; sigemptyset(&emptyset); if (!signalled) sigsuspend(&emptyset); ! signalled = NO; (void)alarm(interval); if (line == 21) goto banner; --- 390,455 ---- "packets", "errs", "packets", "errs", "colls"); if (dflag) printf(" %5.5s", "drops"); ! ! if (bflag) ! printf(" %10.10s %8.8s %10.10s %5.5s", ! "bytes", " ", "bytes", " "); ! else ! printf(" %8.8s %5.5s %8.8s %5.5s %5.5s", ! "packets", "errs", "packets", "errs", "colls"); ! if (dflag) ! printf(" %5.5s", "drops"); putchar('\n'); fflush(stdout); line = 0; + bzero(&ip_old, sizeof(ip_old)); + bzero(&sum_old, sizeof(sum_old)); loop: ! bzero(&sum_cur, sizeof(sum_cur)); ! ! fetchifs(); ! ! if (bflag) ! printf("%10llu %8.8s %10llu %5.5s", ! ip_cur.ift_ib - ip_old.ift_ib, " ", ! ip_cur.ift_ob - ip_old.ift_ob, " "); ! else ! printf("%8llu %5llu %8llu %5llu %5llu", ! ip_cur.ift_ip - ip_old.ift_ip, ! ip_cur.ift_ie - ip_old.ift_ie, ! ip_cur.ift_op - ip_old.ift_op, ! ip_cur.ift_oe - ip_old.ift_oe, ! ip_cur.ift_co - ip_old.ift_co); ! if (dflag) ! printf(" %5llu", ! /* XXX ifnet.if_snd.ifq_drops - ip->ift_dr); */ ! 0); ! ! ip_old = ip_cur; ! ! if (bflag) ! printf(" %10llu %8.8s %10llu %5.5s", ! sum_cur.ift_ib - sum_old.ift_ib, " ", ! sum_cur.ift_ob - sum_old.ift_ob, " "); ! else ! printf(" %8llu %5llu %8llu %5llu %5llu", ! sum_cur.ift_ip - sum_old.ift_ip, ! sum_cur.ift_ie - sum_old.ift_ie, ! sum_cur.ift_op - sum_old.ift_op, ! sum_cur.ift_oe - sum_old.ift_oe, ! sum_cur.ift_co - sum_old.ift_co); ! if (dflag) ! printf(" %5llu", sum_cur.ift_dr - sum_old.ift_dr); ! ! sum_old = sum_cur; ! putchar('\n'); fflush(stdout); line++; sigemptyset(&emptyset); if (!signalled) sigsuspend(&emptyset); ! signalled = 0; (void)alarm(interval); if (line == 21) goto banner; *************** *** 518,522 **** static void catchalarm(int signo) { ! signalled = YES; } --- 465,566 ---- static void catchalarm(int signo) { ! signalled = 1; ! } ! ! static void ! get_rtaddrs(int addrs, struct sockaddr *sa, struct sockaddr **rti_info) ! { ! int i; ! ! for (i = 0; i < RTAX_MAX; i++) { ! if (addrs & (1 << i)) { ! rti_info[i] = sa; ! sa = (struct sockaddr *)((char *)(sa) + ! roundup(sa->sa_len, sizeof(long))); ! } else ! rti_info[i] = NULL; ! } ! } ! ! static void ! fetchifs(void) ! { ! struct if_msghdr ifm; ! int mib[6] = { CTL_NET, AF_ROUTE, 0, 0, NET_RT_IFLIST, 0 }; ! struct rt_msghdr *rtm; ! struct if_data *ifd; ! struct sockaddr *sa, *rti_info[RTAX_MAX]; ! struct sockaddr_dl *sdl; ! char *buf, *next, *lim; ! char name[IFNAMSIZ]; ! size_t len; ! ! if (sysctl(mib, 6, NULL, &len, NULL, 0) == -1) ! err(1, "sysctl"); ! if ((buf = malloc(len)) == NULL) ! err(1, NULL); ! if (sysctl(mib, 6, buf, &len, NULL, 0) == -1) ! err(1, "sysctl"); ! ! lim = buf + len; ! for (next = buf; next < lim; next += rtm->rtm_msglen) { ! rtm = (struct rt_msghdr *)next; ! if (rtm->rtm_version != RTM_VERSION) ! continue; ! switch (rtm->rtm_type) { ! case RTM_IFINFO: ! bcopy(next, &ifm, sizeof ifm); ! ifd = &ifm.ifm_data; ! ! sa = (struct sockaddr *)(next + rtm->rtm_hdrlen); ! get_rtaddrs(ifm.ifm_addrs, sa, rti_info); ! ! sdl = (struct sockaddr_dl *)rti_info[RTAX_IFP]; ! if (sdl == NULL || sdl->sdl_family != AF_LINK) ! continue; ! bzero(name, sizeof(name)); ! if (sdl->sdl_nlen >= IFNAMSIZ) ! memcpy(name, sdl->sdl_data, IFNAMSIZ - 1); ! else if (sdl->sdl_nlen > 0) ! memcpy(name, sdl->sdl_data, sdl->sdl_nlen); ! ! if (interface != 0 && !strcmp(name, interface)) { ! strlcpy(ip_cur.ift_name, name, ! sizeof(ip_cur.ift_name)); ! ip_cur.ift_ip = ifd->ifi_ipackets; ! ip_cur.ift_ib = ifd->ifi_ibytes; ! ip_cur.ift_ie = ifd->ifi_ierrors; ! ip_cur.ift_op = ifd->ifi_opackets; ! 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 = 0; ! /* XXX ifnet.if_snd.ifq_drops */ ! } ! ! sum_cur.ift_ip += ifd->ifi_ipackets; ! sum_cur.ift_ib += ifd->ifi_ibytes; ! sum_cur.ift_ie += ifd->ifi_ierrors; ! sum_cur.ift_op += ifd->ifi_opackets; ! 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 += 0; /* XXX ifnet.if_snd.ifq_drops */ ! break; ! } ! } ! if (interface == NULL) { ! strlcpy(ip_cur.ift_name, name, ! sizeof(ip_cur.ift_name)); ! ip_cur.ift_ip = ifd->ifi_ipackets; ! ip_cur.ift_ib = ifd->ifi_ibytes; ! ip_cur.ift_ie = ifd->ifi_ierrors; ! ip_cur.ift_op = ifd->ifi_opackets; ! 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 = 0; ! /* XXX ifnet.if_snd.ifq_drops */ ! } }