Date: Mon, 20 Jul 2009 19:51:28 GMT From: Gabor Pali <pgj@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 166331 for review Message-ID: <200907201951.n6KJpSU0089117@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 <netinet/in.h> #include <netinet/in_var.h> #include <netipx/ipx.h> +#include <netipx/ipx_if.h> #include <err.h> #include <stdint.h> @@ -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, "<Link#%d>", 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, "<Link#%d>", 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) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907201951.n6KJpSU0089117>