Date: Sun, 10 Jul 2005 23:42:13 GMT From: soc-anders <soc-anders@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 79944 for review Message-ID: <200507102342.j6ANgD8N043156@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=79944 Change 79944 by soc-anders@soc-anders_gimli on 2005/07/10 23:41:12 Multicast information (-a switch) now works and all if_var.h references have been removed from if.c. Request count info (ifmultiaddr.ifma_refcount) is currently not available. Affected files ... .. //depot/projects/soc2005/ifcleanup/src/src/usr.bin/netstat/if.c#4 edit Differences ... ==== //depot/projects/soc2005/ifcleanup/src/src/usr.bin/netstat/if.c#4 (text+ko) ==== @@ -52,9 +52,7 @@ #include <net/bridge.h> #include <net/ethernet.h> #include <netinet/in.h> -/*#include <netinet/in_var.h>*/ #include <netipx/ipx.h> -/*#include <netipx/ipx_if.h>*/ #include <arpa/inet.h> #include <signal.h> @@ -175,7 +173,8 @@ struct if_msghdr *ifm; struct ifa_msghdr *ifam; struct sockaddr *addr, *mask, *brd; - u_long mtu; + u_long if_mtu; + int if_index; if (_interval) { sidewaysintpr((unsigned)_interval, ifnetaddr); @@ -186,6 +185,7 @@ return; if ((buf = malloc(len)) == NULL) { printf("malloc\n"); + free(buf); return; } if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { @@ -247,7 +247,8 @@ *cp++ = '*'; *cp = '\0'; } - mtu = ifm->ifm_data.ifi_mtu; + if_mtu = ifm->ifm_data.ifi_mtu; + if_index = ifm->ifm_index; } else if (ifm->ifm_type == RTM_NEWADDR) { int addrs = ifm->ifm_addrs; @@ -305,7 +306,7 @@ printf("%-7.7s", name); else printf("%-5.5s", name); - printf(" %5lu ", mtu); + printf(" %5lu ", if_mtu); switch (addr->sa_family) { case AF_UNSPEC: printf("%-13.13s ", "none"); @@ -444,16 +445,11 @@ show_stat("d", 3, drops, link_layer); } putchar('\n'); - /* IFCLEANUP - * Skip mcast for now - */ -#if 0 - if (aflag && ifaddrfound) { + + if (aflag) { /* * Print family's multicast addresses */ - struct ifmultiaddr *multiaddr; - struct ifmultiaddr ifma; union { struct sockaddr sa; struct sockaddr_in in; @@ -461,20 +457,49 @@ struct sockaddr_in6 in6; #endif /* INET6 */ struct sockaddr_dl dl; - } msa; + } msa; const char *fmt; + struct ifma_msghdr *ifmam; + char *mbuf, *mcur, *mend; + size_t mlen; - TAILQ_FOREACH(multiaddr, &ifnet.if_multiaddrs, ifma_link) { - if (kread((u_long)multiaddr, (char *)&ifma, - sizeof ifma)) - break; - multiaddr = &ifma; - if (kread((u_long)ifma.ifma_addr, (char *)&msa, - sizeof msa)) - break; - if (msa.sa.sa_family != sa->sa_family) - continue; - + /* Request only the mcast MIB for the current if and af */ + mib[3] = addr->sa_family; + mib[4] = NET_RT_IFMALIST; + mib[5] = if_index; + if (sysctl(mib, 6, NULL, &mlen, NULL, 0) < 0) + continue; + if ((mbuf = malloc(mlen)) == NULL) { + printf("malloc\n"); + exit(1); + } + if (sysctl(mib, 6, mbuf, &mlen, NULL, 0) < 0) { + free(mbuf); + continue; + } + + mcur = mbuf; + mend = mcur + mlen; + while (mcur < mend) { + ifmam = (struct ifma_msghdr *)mcur; + int addrs = ifmam->ifmam_addrs; + mcur += sizeof(*ifmam); + while (addrs != 0) { + struct sockaddr *tmp = + (struct sockaddr *)mcur; + mcur += SA_SIZE(tmp); + if (addrs & RTA_GATEWAY) + addrs &= ~RTA_GATEWAY; + else if (addrs & RTA_IFP) + addrs &= ~RTA_IFP; + else if (addrs & RTA_IFA) { + bcopy(tmp, &msa, tmp->sa_len); + addrs &= ~RTA_IFA; + } else { + printf("UNEXPECTED: %x\n", addrs); + continue; + } + } fmt = 0; switch (msa.sa.sa_family) { case AF_INET: @@ -488,7 +513,11 @@ &msa.in6.sin6_addr, ntop_buf, sizeof(ntop_buf)), - ifma.ifma_refcount); + /* IFCLEANUP + * ifma.ifma_refcount + */ + 0); + break; #endif /* INET6 */ case AF_LINK: @@ -515,7 +544,6 @@ } } } -#endif /* if 0 */ } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200507102342.j6ANgD8N043156>