From owner-p4-projects@FreeBSD.ORG Mon Jul 20 19:51:29 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 141A01065674; Mon, 20 Jul 2009 19:51:29 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C720C1065672 for ; Mon, 20 Jul 2009 19:51:28 +0000 (UTC) (envelope-from pgj@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id AA6E38FC1B for ; Mon, 20 Jul 2009 19:51:28 +0000 (UTC) (envelope-from pgj@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n6KJpSv3089119 for ; Mon, 20 Jul 2009 19:51:28 GMT (envelope-from pgj@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n6KJpSU0089117 for perforce@freebsd.org; Mon, 20 Jul 2009 19:51:28 GMT (envelope-from pgj@FreeBSD.org) Date: Mon, 20 Jul 2009 19:51:28 GMT Message-Id: <200907201951.n6KJpSU0089117@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to pgj@FreeBSD.org using -f From: Gabor Pali To: Perforce Change Reviews Cc: Subject: PERFORCE change 166331 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Jul 2009 19:51:30 -0000 http://perforce.freebsd.org/chv.cgi?CH=166331 Change 166331 by pgj@petymeg-current on 2009/07/20 19:51:11 Improve netstat_interface(), add code for link-level addresses. Affected files ... .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.h#30 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_if.c#2 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_util.c#33 edit Differences ... ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.h#30 (text+ko) ==== @@ -231,11 +231,22 @@ const struct face_type *netstat_it_get_in(const struct interface_type *); const struct face_type *netstat_it_get_out(const struct interface_type *); +int netstat_it_get_addrcnt(const struct interface_type *); +const struct intfaddr_type * +netstat_it_get_address(const struct interface_type *, int index); + +int netstat_it_get_mcast_addrcnt(const struct interface_type *); +const struct intfaddr_type * +netstat_it_get_mcast_address(const struct interface_type *, int index); + u_int64_t netstat_ft_get_packets(const struct face_type *); u_int64_t netstat_ft_get_bytes(const struct face_type *); u_int64_t netstat_ft_get_mcasts(const struct face_type *); u_int64_t netstat_ft_get_errors(const struct face_type *); +int netstat_iat_get_family(const struct intfaddr_type *); +const char *netstat_iat_get_name(const struct intfaddr_type *); +const char *netstat_iat_get_subnet(const struct intfaddr_type *); enum intfaddr_layer netstat_iat_get_layer(const struct intfaddr_type *); /* Interface addresses: */ ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_if.c#2 (text+ko) ==== @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -78,7 +79,15 @@ struct ifnethead ifnethead; struct ifnet ifnet; struct ifaddr ifaddr; - struct sockaddr sa; + union { + struct sockaddr sa; + struct sockaddr_dl dl; + struct sockaddr_in in; +#ifdef INET6 + struct sockaddr_in6 in6; +#endif + struct sockaddr_ipx ipx; + } sa; struct ifmultiaddr ifmultiaddr; struct interface_type *itp; u_long ifn_addr; @@ -120,7 +129,7 @@ ifa_addr = (u_long)TAILQ_NEXT(&ifaddr, ifa_link)) { KREAD(ifa_addr, ifaddr); KREAD(ifaddr.ifa_addr, sa); - ifaddr.ifa_addr = &sa; + ifaddr.ifa_addr = &sa.sa; /* List addresses with the given protocol. */ if (domain != PF_UNSPEC && domain != ifaddr.ifa_addr->sa_family) @@ -134,7 +143,7 @@ ifma_addr = (u_long)TAILQ_NEXT(&ifmultiaddr, ifma_link)) { KREAD(ifma_addr, ifmultiaddr); KREAD(ifmultiaddr.ifma_addr, sa); - ifmultiaddr.ifma_addr = &sa; + ifmultiaddr.ifma_addr = &sa.sa; if (domain != PF_UNSPEC && domain != ifmultiaddr.ifma_addr->sa_family) continue; @@ -180,6 +189,7 @@ { struct sockaddr *sa; struct sockaddr_in *sa_in; + struct sockaddr_dl *sa_dl; struct in_ifaddr *in; #ifdef INET6 struct in6_ifaddr *in6; @@ -188,8 +198,12 @@ struct intfaddr_type *ifap; + char *cp, *p; + int n; + sa = (struct sockaddr *)ifa->ifa_addr; sa_in = (struct sockaddr_in *)sa; + sa_dl = (struct sockaddr_dl *)sa; in = (struct in_ifaddr *)sa; in6 = (struct in6_ifaddr *)sa; ipx = (struct ipx_ifaddr *)sa; @@ -217,6 +231,20 @@ case PF_APPLETALK: break; case PF_LINK: + ifap->iat_address_len = sizeof(struct sockaddr_dl); + ifap->iat_address = malloc(ifap->iat_address_len); + if (ifap->iat_address != NULL) + memcpy(ifap->iat_address, sa_dl, ifap->iat_address_len); + ifap->iat_network = NULL; + sprintf(ifap->iat_subnet, "", sa_dl->sdl_index); + cp = (char *)LLADDR(sa_dl); + n = sa_dl->sdl_alen; + p = ifap->iat_name; + while (--n >= 0) { + sprintf(p, "%02x%s", *cp++ & 0xff, n > 0 ? ":" : ""); + p += 3; + } + ifap->iat_layer = layer_Link; break; default: break; @@ -229,9 +257,14 @@ extract_if_maddress(struct ifmultiaddr *ifma, struct interface_type *itp) { struct sockaddr *sa; + struct sockaddr_dl *sa_dl; struct intfaddr_type *ifap; + char *cp, *p; + int n; + sa = ifma->ifma_addr; + sa_dl = (struct sockaddr_dl *)sa; /* Cannot store more addresses. */ if (itp->it_maddrcnt == IFTYPE_MAXADDRCNT) @@ -250,6 +283,20 @@ break; #endif /* INET6 */ case PF_LINK: + ifap->iat_address_len = sizeof(struct sockaddr_dl); + ifap->iat_address = malloc(ifap->iat_address_len); + if (ifap->iat_address != NULL) + memcpy(ifap->iat_address, sa_dl, ifap->iat_address_len); + ifap->iat_network = NULL; + sprintf(ifap->iat_subnet, "", sa_dl->sdl_index); + cp = (char *)LLADDR(sa_dl); + n = sa_dl->sdl_alen; + p = ifap->iat_name; + while (--n >= 0) { + sprintf(p, "%02x%s", *cp++ & 0xff, n > 0 ? ":" : ""); + p += 3; + } + ifap->iat_layer = layer_Link; break; } ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_util.c#33 (text+ko) ==== @@ -914,6 +914,34 @@ return (&itp->it_out); } +int +netstat_it_get_addrcnt(const struct interface_type *itp) +{ + return (itp->it_addrcnt); +} + +const struct intfaddr_type * +netstat_it_get_address(const struct interface_type *itp, int index) +{ + if (0 <= index && index < itp->it_addrcnt) + return (itp->it_address[index]); + return (NULL); +} + +int +netstat_it_get_mcast_addrcnt(const struct interface_type *itp) +{ + return (itp->it_maddrcnt); +} + +const struct intfaddr_type * +netstat_it_get_mcast_address(const struct interface_type *itp, int index) +{ + if (0 <= index && index < itp->it_maddrcnt) + return (itp->it_maddress[index]); + return (NULL); +} + u_int64_t netstat_ft_get_packets(const struct face_type *ftp) { @@ -938,6 +966,24 @@ return (ftp->ft_errors); } +int +netstat_iat_get_family(const struct intfaddr_type *iatp) +{ + return (iatp->iat_family); +} + +const char * +netstat_iat_get_name(const struct intfaddr_type *iatp) +{ + return (iatp->iat_name); +} + +const char * +netstat_iat_get_subnet(const struct intfaddr_type *iatp) +{ + return (iatp->iat_subnet); +} + enum intfaddr_layer netstat_iat_get_layer(const struct intfaddr_type *iatp) {