new subnets, interface addressing
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Tue, 4 Jun 1985 04:29:21 +0000 (20:29 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Tue, 4 Jun 1985 04:29:21 +0000 (20:29 -0800)
SCCS-vsn: usr.bin/netstat/if.c 4.7
SCCS-vsn: usr.bin/netstat/inet.c 4.19
SCCS-vsn: usr.bin/netstat/route.c 4.10

usr/src/usr.bin/netstat/if.c
usr/src/usr.bin/netstat/inet.c
usr/src/usr.bin/netstat/route.c

index 9c062d9..d07d3ea 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)if.c       4.6 84/11/20";
+static char sccsid[] = "@(#)if.c       4.7 85/06/03";
 #endif
 
 #include <sys/types.h>
 #endif
 
 #include <sys/types.h>
@@ -7,6 +7,7 @@ static char sccsid[] = "@(#)if.c        4.6 84/11/20";
 
 #include <net/if.h>
 #include <netinet/in.h>
 
 #include <net/if.h>
 #include <netinet/in.h>
+#include <netinet/in_var.h>
 
 #include <stdio.h>
 
 
 #include <stdio.h>
 
@@ -15,7 +16,7 @@ extern        int tflag;
 extern int nflag;
 extern char *interface;
 extern int unit;
 extern int nflag;
 extern char *interface;
 extern int unit;
-extern char *routename();
+extern char *routename(), *netname();
 
 /*
  * Print a description of the network interfaces.
 
 /*
  * Print a description of the network interfaces.
@@ -25,6 +26,11 @@ intpr(interval, ifnetaddr)
        off_t ifnetaddr;
 {
        struct ifnet ifnet;
        off_t ifnetaddr;
 {
        struct ifnet ifnet;
+       union {
+               struct ifaddr ifa;
+               struct in_ifaddr in;
+       } ifaddr;
+       off_t ifaddraddr;
        char name[16];
 
        if (ifnetaddr == 0) {
        char name[16];
 
        if (ifnetaddr == 0) {
@@ -44,32 +50,80 @@ intpr(interval, ifnetaddr)
        if (tflag)
                printf(" %-6.6s", "Timer");
        putchar('\n');
        if (tflag)
                printf(" %-6.6s", "Timer");
        putchar('\n');
-       while (ifnetaddr) {
+       ifaddraddr = 0;
+       while (ifnetaddr || ifaddraddr) {
                struct sockaddr_in *sin;
                register char *cp;
                struct sockaddr_in *sin;
                register char *cp;
+               int n;
                char *index();
                struct in_addr in, inet_makeaddr();
 
                char *index();
                struct in_addr in, inet_makeaddr();
 
-               klseek(kmem, ifnetaddr, 0);
-               read(kmem, &ifnet, sizeof ifnet);
-               klseek(kmem, (int)ifnet.if_name, 0);
-               read(kmem, name, 16);
-               name[15] = '\0';
-               ifnetaddr = (off_t) ifnet.if_next;
-               if (interface != 0 &&
-                   (strcmp(name, interface) != 0 || unit != ifnet.if_unit))
-                       continue;
-               cp = index(name, '\0');
-               *cp++ = ifnet.if_unit + '0';
-               if ((ifnet.if_flags&IFF_UP) == 0)
-                       *cp++ = '*';
-               *cp = '\0';
+               if (ifaddraddr == 0) {
+                       klseek(kmem, ifnetaddr, 0);
+                       read(kmem, &ifnet, sizeof ifnet);
+                       klseek(kmem, (off_t)ifnet.if_name, 0);
+                       read(kmem, name, 16);
+                       name[15] = '\0';
+                       ifnetaddr = (off_t) ifnet.if_next;
+                       if (interface != 0 &&
+                           (strcmp(name, interface) != 0 || unit != ifnet.if_unit))
+                               continue;
+                       cp = index(name, '\0');
+                       *cp++ = ifnet.if_unit + '0';
+                       if ((ifnet.if_flags&IFF_UP) == 0)
+                               *cp++ = '*';
+                       *cp = '\0';
+                       ifaddraddr = (off_t)ifnet.if_addrlist;
+               }
                printf("%-5.5s %-5d ", name, ifnet.if_mtu);
                printf("%-5.5s %-5d ", name, ifnet.if_mtu);
-               sin = (struct sockaddr_in *)&ifnet.if_addr;
-               in = inet_makeaddr(ifnet.if_net, INADDR_ANY);
-               printf("%-10.10s  ", routename(in));
-               printf("%-12.12s %-7d %-5d %-7d %-5d %-6d",
-                   routename(sin->sin_addr),
+               if (ifaddraddr == 0) {
+                       printf("%-10.10s  ", "none");
+                       printf("%-12.12s ", "none");
+               } else {
+                       klseek(kmem, ifaddraddr, 0);
+                       read(kmem, &ifaddr, sizeof ifaddr);
+                       ifaddraddr = (off_t)ifaddr.ifa.ifa_next;
+                       switch (ifaddr.ifa.ifa_addr.sa_family) {
+                       case AF_UNSPEC:
+                               printf("%-10.10s  ", "none");
+                               printf("%-12.12s ", "none");
+                               break;
+                       case AF_INET:
+                               sin = (struct sockaddr_in *)&ifaddr.in.ia_addr;
+#ifdef notdef
+                               /* can't use inet_makeaddr because kernel
+                                * keeps nets unshifted.
+                                */
+                               in = inet_makeaddr(ifaddr.in.ia_subnet,
+                                       INADDR_ANY);
+                               printf("%-10.10s  ", netname(in));
+#else
+                               printf("%-10.10s  ",
+                                       netname(htonl(ifaddr.in.ia_subnet),
+                                               ifaddr.in.ia_subnetmask));
+#endif
+                               printf("%-12.12s ", routename(sin->sin_addr));
+                               break;
+                       default:
+                               printf("af%2d: ", ifaddr.ifa.ifa_addr.sa_family);
+                               for (cp = (char *)&ifaddr.ifa.ifa_addr +
+                                   sizeof(struct sockaddr) - 1;
+                                   cp >= ifaddr.ifa.ifa_addr.sa_data; --cp)
+                                       if (*cp != 0)
+                                               break;
+                               n = cp - (char *)ifaddr.ifa.ifa_addr.sa_data + 1;
+                               cp = (char *)ifaddr.ifa.ifa_addr.sa_data;
+                               if (n <= 6)
+                                       while (--n)
+                                               printf("%02d.", *cp++ & 0xff);
+                               else
+                                       while (--n)
+                                               printf("%02d", *cp++ & 0xff);
+                               printf("%02d ", *cp & 0xff);
+                               break;
+                       }
+               }
+               printf("%-7d %-5d %-7d %-5d %-6d",
                    ifnet.if_ipackets, ifnet.if_ierrors,
                    ifnet.if_opackets, ifnet.if_oerrors,
                    ifnet.if_collisions);
                    ifnet.if_ipackets, ifnet.if_ierrors,
                    ifnet.if_opackets, ifnet.if_oerrors,
                    ifnet.if_collisions);
index c510ad1..a664b87 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)inet.c     4.18 (Berkeley) 84/10/31";
+static char sccsid[] = "@(#)inet.c     4.19 (Berkeley) 85/06/03";
 #endif
 
 #include <sys/types.h>
 #endif
 
 #include <sys/types.h>
@@ -31,7 +31,7 @@ static char sccsid[] = "@(#)inet.c    4.18 (Berkeley) 84/10/31";
 
 struct inpcb inpcb;
 struct tcpcb tcpcb;
 
 struct inpcb inpcb;
 struct tcpcb tcpcb;
-struct socket socket;
+struct socket sockb;
 struct protosw proto;
 extern int kmem;
 extern int Aflag;
 struct protosw proto;
 extern int kmem;
 extern int Aflag;
@@ -93,15 +93,15 @@ protopr(off, name)
                        continue;
                }
                klseek(kmem, (off_t)inpcb.inp_socket, 0);
                        continue;
                }
                klseek(kmem, (off_t)inpcb.inp_socket, 0);
-               read(kmem, &socket, sizeof (socket));
+               read(kmem, &sockb, sizeof (sockb));
                if (istcp) {
                        klseek(kmem, (off_t)inpcb.inp_ppcb, 0);
                        read(kmem, &tcpcb, sizeof (tcpcb));
                }
                if (Aflag)
                        printf("%8x ", inpcb.inp_ppcb);
                if (istcp) {
                        klseek(kmem, (off_t)inpcb.inp_ppcb, 0);
                        read(kmem, &tcpcb, sizeof (tcpcb));
                }
                if (Aflag)
                        printf("%8x ", inpcb.inp_ppcb);
-               printf("%-5.5s %6d %6d ", name, socket.so_rcv.sb_cc,
-                       socket.so_snd.sb_cc);
+               printf("%-5.5s %6d %6d ", name, sockb.so_rcv.sb_cc,
+                       sockb.so_snd.sb_cc);
                inetprint(&inpcb.inp_laddr, inpcb.inp_lport, name);
                inetprint(&inpcb.inp_faddr, inpcb.inp_fport, name);
                if (istcp) {
                inetprint(&inpcb.inp_laddr, inpcb.inp_lport, name);
                inetprint(&inpcb.inp_faddr, inpcb.inp_fport, name);
                if (istcp) {
@@ -302,24 +302,15 @@ inetname(in)
        struct netent *np;
 
        if (!nflag && in.s_addr != INADDR_ANY) {
        struct netent *np;
 
        if (!nflag && in.s_addr != INADDR_ANY) {
-               int net = inet_netof(in), subnet = inet_subnetof(in);
+               int net = inet_netof(in);
                int lna = inet_lnaof(in);
 
                if (lna == INADDR_ANY) {
                        np = getnetbyaddr(net, AF_INET);
                        if (np)
                                cp = np->n_name;
                int lna = inet_lnaof(in);
 
                if (lna == INADDR_ANY) {
                        np = getnetbyaddr(net, AF_INET);
                        if (np)
                                cp = np->n_name;
-               } else if (subnet != net && (lna & 0xff) == 0 &&
-                   (np = getnetbyaddr(subnet, AF_INET))) {
-                       struct in_addr subnaddr, inet_makeaddr();
-
-                       subnaddr = inet_makeaddr(subnet, INADDR_ANY);
-                       if (bcmp(&in, &subnaddr, sizeof (in)) == 0)
-                               cp = np->n_name;
-                       else
-                               goto host;
-               } else {
-host:
+               }
+               if (cp == 0) {
                        hp = gethostbyaddr(&in, sizeof (in), AF_INET);
                        if (hp)
                                cp = hp->h_name;
                        hp = gethostbyaddr(&in, sizeof (in), AF_INET);
                        if (hp)
                                cp = hp->h_name;
@@ -330,9 +321,10 @@ host:
        else if (cp)
                strcpy(line, cp);
        else {
        else if (cp)
                strcpy(line, cp);
        else {
-               u_char *ucp = (u_char *)&in;
-
-               sprintf(line, "%u.%u.%u.%u", ucp[0], ucp[1], ucp[2], ucp[3]);
+               in.s_addr = ntohl(in.s_addr);
+#define C(x)   ((x) & 0xff)
+               sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24),
+                       C(in.s_addr >> 16), C(in.s_addr >> 8), C(in.s_addr));
        }
        return (line);
 }
        }
        return (line);
 }
index f37ba7e..04213b8 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)route.c    4.9 84/10/31";
+static char sccsid[] = "@(#)route.c    4.10 85/06/03";
 #endif
 
 #include <sys/types.h>
 #endif
 
 #include <sys/types.h>
@@ -14,7 +14,7 @@ static char sccsid[] = "@(#)route.c   4.9 84/10/31";
 
 extern int kmem;
 extern int nflag;
 
 extern int kmem;
 extern int nflag;
-extern char *routename();
+extern char *routename(), *netname();
 
 /*
  * Definitions for showing gateway flags.
 
 /*
  * Definitions for showing gateway flags.
@@ -79,8 +79,9 @@ again:
                        rt = mtod(&mb, struct rtentry *);
                        sin = (struct sockaddr_in *)&rt->rt_dst;
                        printf("%-15.15s ",
                        rt = mtod(&mb, struct rtentry *);
                        sin = (struct sockaddr_in *)&rt->rt_dst;
                        printf("%-15.15s ",
-                           sin->sin_addr.s_addr ?
-                               routename(sin->sin_addr) : "default");
+                           (sin->sin_addr.s_addr == 0) ? "default" :
+                           (rt->rt_flags & RTF_HOST) ?
+                           routename(sin->sin_addr) : netname(sin->sin_addr, 0));
                        sin = (struct sockaddr_in *)&rt->rt_gateway;
                        printf("%-15.15s ", routename(sin->sin_addr));
                        for (flags = name, p = bits; p->b_mask; p++)
                        sin = (struct sockaddr_in *)&rt->rt_gateway;
                        printf("%-15.15s ", routename(sin->sin_addr));
                        for (flags = name, p = bits; p->b_mask; p++)
@@ -118,43 +119,73 @@ routename(in)
        char *cp = 0;
        static char line[50];
        struct hostent *hp;
        char *cp = 0;
        static char line[50];
        struct hostent *hp;
-       struct netent *np;
-       int lna, net, subnet;
 
 
-       net = inet_netof(in);
-       subnet = inet_subnetof(in);
-       lna = inet_lnaof(in);
        if (!nflag) {
        if (!nflag) {
-               if (lna == INADDR_ANY) {
-                       np = getnetbyaddr(net, AF_INET);
-                       if (np)
-                               cp = np->n_name;
-               } else if ((subnet != net) && ((lna & 0xff) == 0) &&
-                   (np = getnetbyaddr(subnet, AF_INET))) {
-                       struct in_addr subnaddr, inet_makeaddr();
-                       subnaddr = inet_makeaddr(subnet, INADDR_ANY);
-                       if (bcmp(&in, &subnaddr, sizeof(in)) == 0)
-                               cp = np->n_name;
-                       else
-                               goto host;
-               } else {
-host:
-                       hp = gethostbyaddr(&in, sizeof (struct in_addr),
-                               AF_INET);
-                       if (hp)
-                               cp = hp->h_name;
-               }
+               hp = gethostbyaddr(&in, sizeof (struct in_addr),
+                       AF_INET);
+               if (hp)
+                       cp = hp->h_name;
        }
        if (cp)
                strcpy(line, cp);
        else {
        }
        if (cp)
                strcpy(line, cp);
        else {
-               u_char *ucp = (u_char *)&in;
-               if (lna == INADDR_ANY)
-                       sprintf(line, "%u.%u.%u", ucp[0], ucp[1], ucp[2]);
-               else
-                       sprintf(line, "%u.%u.%u.%u", ucp[0], ucp[1],
-                               ucp[2], ucp[3]);
+#define C(x)   ((x) & 0xff)
+               in.s_addr = ntohl(in.s_addr);
+               sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24),
+                       C(in.s_addr >> 16), C(in.s_addr >> 8), C(in.s_addr));
+       }
+       return (line);
+}
+
+/*
+ * Return the name of the network whose address is given.
+ * The address is assumed to be that of a net or subnet, not a host.
+ */
+char *
+netname(in, mask)
+       struct in_addr in;
+       u_long mask;
+{
+       char *cp = 0;
+       static char line[50];
+       struct netent *np = 0;
+       u_long net;
+       register i;
+
+       in.s_addr = ntohl(in.s_addr);
+       if (!nflag && in.s_addr) {
+               if (mask) {
+                       net = in.s_addr & mask;
+                       while ((mask & 1) == 0)
+                               mask >>= 1, net >>= 1;
+                       np = getnetbyaddr(net, AF_INET);
+               }
+               if (np == 0) {
+                       /*
+                        * Try for subnet addresses.
+                        */
+                       for (i = 0; ((0xf<<i) & in.s_addr) == 0; i += 4)
+                               ;
+                       for ( ; i; i -= 4)
+                           if (np = getnetbyaddr((unsigned)in.s_addr >> i,
+                                   AF_INET))
+                                       break;
+               }
+               if (np)
+                       cp = np->n_name;
        }
        }
+       if (cp)
+               strcpy(line, cp);
+       else if ((in.s_addr & 0xffffff) == 0)
+               sprintf(line, "%u", C(in.s_addr >> 24));
+       else if ((in.s_addr & 0xffff) == 0)
+               sprintf(line, "%u.%u", C(in.s_addr >> 24) , C(in.s_addr >> 16));
+       else if ((in.s_addr & 0xff) == 0)
+               sprintf(line, "%u.%u.%u", C(in.s_addr >> 24),
+                       C(in.s_addr >> 16), C(in.s_addr >> 8));
+       else
+               sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24),
+                       C(in.s_addr >> 16), C(in.s_addr >> 8), C(in.s_addr));
        return (line);
 }
 /*
        return (line);
 }
 /*
@@ -183,31 +214,3 @@ rt_stats(off)
        printf("\t%d use%s of a wildcard route\n",
                rtstat.rts_wildcard, plural(rtstat.rts_wildcard));
 }
        printf("\t%d use%s of a wildcard route\n",
                rtstat.rts_wildcard, plural(rtstat.rts_wildcard));
 }
-
-/*
- * Return the possible subnetwork number from an internet address.
- * If the address is of the form of a subnet address (most significant
- * bit of the host part is set), believe the subnet exists.
- * Otherwise, return the network number.
- * SHOULD FIND OUT WHETHER THIS IS A LOCAL NETWORK BEFORE LOOKING
- * INSIDE OF THE HOST PART.  We can only believe this if we have other
- * information (e.g., we can find a name for this number).
- */
-inet_subnetof(in)
-       struct in_addr in;
-{
-       register u_long i = ntohl(in.s_addr);
-
-       if (IN_CLASSA(i)) {
-               if (IN_SUBNETA(i))
-                       return ((i & IN_CLASSA_SUBNET) >> IN_CLASSA_SUBNSHIFT);
-               else
-                       return ((i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT);
-       } else if (IN_CLASSB(i)) {
-               if (IN_SUBNETB(i))
-                       return ((i & IN_CLASSB_SUBNET) >> IN_CLASSB_SUBNSHIFT);
-               else
-                       return ((i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT);
-       } else
-               return ((i & IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
-}