PERFORCE change 166331 for review
Gabor Pali
pgj at FreeBSD.org
Mon Jul 20 19:51:30 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=166331
Change 166331 by pgj at 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)
{
More information about the p4-projects
mailing list