From owner-freebsd-net@FreeBSD.ORG Tue Feb 20 23:38:16 2007 Return-Path: X-Original-To: freebsd-net@freebsd.org Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 40CE916A851 for ; Tue, 20 Feb 2007 23:38:16 +0000 (UTC) (envelope-from bms@FreeBSD.org) Received: from out5.smtp.messagingengine.com (out5.smtp.messagingengine.com [66.111.4.29]) by mx1.freebsd.org (Postfix) with ESMTP id 021BE13C48D for ; Tue, 20 Feb 2007 23:38:15 +0000 (UTC) (envelope-from bms@FreeBSD.org) Received: from out1.internal (unknown [10.202.2.149]) by out1.messagingengine.com (Postfix) with ESMTP id 034A01BBD08; Tue, 20 Feb 2007 18:39:23 -0500 (EST) Received: from heartbeat1.messagingengine.com ([10.202.2.160]) by out1.internal (MEProxy); Tue, 20 Feb 2007 18:39:23 -0500 X-Sasl-enc: iHGVRLwZPMpb74k9VAKXl+BmrP8RXh/enu/1kbAEmyqq 1172014762 Received: from [192.168.123.18] (82-35-112-254.cable.ubr07.dals.blueyonder.co.uk [82.35.112.254]) by mail.messagingengine.com (Postfix) with ESMTP id 4F5822D075; Tue, 20 Feb 2007 18:39:22 -0500 (EST) Message-ID: <45DB8666.7060804@FreeBSD.org> Date: Tue, 20 Feb 2007 23:38:14 +0000 From: "Bruce M. Simpson" User-Agent: Thunderbird 1.5.0.9 (X11/20070125) MIME-Version: 1.0 To: Jouke Witteveen References: <3993a4980702051233u10c30575kd1f6d27fcd600110@mail.gmail.com> <45C7A1F9.20306@FreeBSD.org> <3993a4980702170546t7f9384eaq358986a4cc734582@mail.gmail.com> In-Reply-To: <3993a4980702170546t7f9384eaq358986a4cc734582@mail.gmail.com> Content-Type: multipart/mixed; boundary="------------010709030902010104020002" Cc: freebsd-net@freebsd.org Subject: Re: ioctl: SIOCADDMULTI (howto?) X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 Feb 2007 23:38:16 -0000 This is a multi-part message in MIME format. --------------010709030902010104020002 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Here is a better patch for the netstat output. I haven't had time to look at the kernel yet. If this patch is good for you I'll commit it on -CURRENT. It cleans up the group membership output significantly and displays the Link-layer information separately. If anyone 'out there' has been relying on this output in scripts, please tell me. BMS --------------010709030902010104020002 Content-Type: text/x-patch; name="netstat-mcast.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="netstat-mcast.diff" --- mcast.c.orig Sat Feb 17 18:12:28 2007 +++ mcast.c Tue Feb 20 23:26:41 2007 @@ -71,21 +71,39 @@ #define MYIFNAME_SIZE 128 void -ifmalist_dump(void) +ifmalist_dump_af(struct ifmaddrs *ifmap, int af) { - struct ifmaddrs *ifmap, *ifma; + struct ifmaddrs *ifma; sockunion_t *psa; char myifname[MYIFNAME_SIZE]; char addrbuf[INET6_ADDRSTRLEN]; char *pcolon; void *addr; - char *pifname, *plladdr, *pgroup; + char *pafname, *pifname, *plladdr, *pgroup; - if (getifmaddrs(&ifmap)) - err(EX_OSERR, "getifmaddrs"); + if (!((af == AF_INET) || (af == AF_LINK) +#ifdef INET6 + || (af == AF_INET6) +#endif + )) + return; + + switch (af) { + case AF_INET: + pafname = "IPv4"; + break; + case AF_INET6: + pafname = "IPv6"; + break; + case AF_LINK: + pafname = "Link-layer"; + break; + } - fputs("IPv4/IPv6 Multicast Group Memberships\n", stdout); - fprintf(stdout, "%-20s\t%-16s\t%s\n", "Group", "Gateway", "Netif"); + fprintf(stdout, "%s Multicast Group Memberships\n", pafname); + fprintf(stdout, "%-20s\t%-16s\t%s\n", "Group", + "Next Hop/L2 Address", + "Netif"); for (ifma = ifmap; ifma; ifma = ifma->ifma_next) { @@ -94,16 +112,32 @@ /* Group address */ psa = (sockunion_t *)ifma->ifma_addr; + if (psa->sa.sa_family != af) + continue; switch (psa->sa.sa_family) { case AF_INET: pgroup = inet_ntoa(psa->sin.sin_addr); break; +#ifdef INET6 case AF_INET6: addr = &psa->sin6.sin6_addr; inet_ntop(psa->sa.sa_family, addr, addrbuf, sizeof(addrbuf)); pgroup = addrbuf; break; +#endif + case AF_LINK: + if ((psa->sdl.sdl_alen == ETHER_ADDR_LEN) || + (psa->sdl.sdl_type == IFT_ETHER)) { + pgroup = +ether_ntoa((struct ether_addr *)&psa->sdl.sdl_data); + } else { + pgroup = addr2ascii(AF_LINK, + &psa->sdl, + sizeof(struct sockaddr_dl), + addrbuf); + } + break; default: continue; /* XXX */ } @@ -116,14 +150,20 @@ plladdr = inet_ntoa(psa->sin.sin_addr); break; case AF_LINK: - if (psa->sdl.sdl_type == IFT_ETHER) - plladdr = ether_ntoa((struct ether_addr *)&psa->sdl.sdl_data); - else - plladdr = link_ntoa(&psa->sdl); + if (psa->sdl.sdl_type == IFT_ETHER) { + plladdr = +ether_ntoa((struct ether_addr *)&psa->sdl.sdl_data); + } else { + plladdr = addr2ascii(AF_LINK, + &psa->sdl, + sizeof(struct sockaddr_dl), + addrbuf); + } break; } - } else + } else { plladdr = ""; + } /* Interface upon which the membership exists */ psa = (sockunion_t *)ifma->ifma_name; @@ -143,6 +183,23 @@ fprintf(stdout, "%-20s\t%-16s\t%s\n", pgroup, plladdr, pifname); } +} + +void +ifmalist_dump(void) +{ + struct ifmaddrs *ifmap; + + if (getifmaddrs(&ifmap)) + err(EX_OSERR, "getifmaddrs"); + + ifmalist_dump_af(ifmap, AF_LINK); + fputs("\n", stdout); + ifmalist_dump_af(ifmap, AF_INET); + fputs("\n", stdout); +#ifdef INET6 + ifmalist_dump_af(ifmap, AF_INET6); +#endif freeifmaddrs(ifmap); } --------------010709030902010104020002--