Skip site navigation (1)Skip section navigation (2)
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>