changeset 958:e6231465742f

* src/ecos/support.c (_show_ifp): Now understands IPv6 addresses and network masks and added a few more flags * src/sys/net/route.c (rt_reinit_rtdelete): Only delete IPv4 routes so that DHCP and BOOTP works and leave IPv6 routes so IPv6 also keeps working.
author asl
date Wed, 23 Apr 2003 08:54:13 +0000
parents db3e0a2fda2f
children 699b9301a235
files packages/net/bsd_tcpip/current/ChangeLog packages/net/bsd_tcpip/current/src/ecos/support.c packages/net/bsd_tcpip/current/src/sys/net/route.c
diffstat 3 files changed, 68 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/packages/net/bsd_tcpip/current/ChangeLog
+++ b/packages/net/bsd_tcpip/current/ChangeLog
@@ -5,6 +5,14 @@ 2003-04-11  Michael Checky  <Michael_Che
 	'CYGPKG_NET_BUILD_TESTS' and selecting this option in freebsd_net.cdl
 	causes build errors.
 
+2003-04-05  Andrew Lunn  <andrew.lunn@ascom.ch>
+
+	* src/ecos/support.c (_show_ifp): Now understands IPv6 
+	addresses and network masks and added a few more flags
+	* src/sys/net/route.c (rt_reinit_rtdelete): Only delete IPv4
+	routes so that DHCP and BOOTP works and leave IPv6 routes so IPv6
+	also keeps working.
+
 2003-03-14  Nick Garnett  <nickg@balti.calivar.com>
 
 	* src/ecos/support.c: Added function cyg_net_show_mbufs() and code
--- a/packages/net/bsd_tcpip/current/src/ecos/support.c
+++ b/packages/net/bsd_tcpip/current/src/ecos/support.c
@@ -15,6 +15,7 @@
 // Copyright (C) 2002 Red Hat, Inc. All Rights Reserved.
 //
 // Copyright (C) 2002 Gary Thomas
+// Copyright (C) 2003 Andrew Lunn
 // -------------------------------------------
 //
 //####BSDCOPYRIGHTEND####
@@ -41,7 +42,7 @@
 //#####DESCRIPTIONBEGIN####
 //
 // Author(s):    gthomas, hmt
-// Contributors: gthomas, hmt
+// Contributors: gthomas, hmt, andrew.lunn@ascom.ch
 // Date:         2000-01-10
 // Purpose:      
 // Description:  
@@ -879,13 +880,13 @@ typedef void pr_fun(char *fmt, ...);
 static void
 _mask(struct sockaddr *sa, char *buf, int _len)
 {
-    char *cp = ((char *)sa) + 4;
+    unsigned char *cp = ((char *)sa) + 4;
     int len = sa->sa_len - 4;
     int tot = 0;
 
     while (len-- > 0) {
         if (tot) *buf++ = '.';
-        buf += diag_sprintf(buf, "%d", *cp++);
+        buf += diag_sprintf(buf, "%u", *cp++);
         tot++;
     }
 
@@ -896,6 +897,28 @@ static void
     }
 }
 
+#ifdef CYGPKG_NET_INET6
+static void
+_mask6(struct sockaddr *sa, char *buf, int _len)
+{
+  struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;
+  int addrword = 0;
+  int bits = 0;
+  int index;
+
+  while (addrword < 4) {
+    if (sin6->sin6_addr.s6_addr32[addrword] == 0) {
+      break;
+    }
+    HAL_LSBIT_INDEX(index, sin6->sin6_addr.s6_addr32[addrword++]);
+    bits += (32-index);
+    if (index != 0) {
+      break;
+    }
+  }
+  diag_sprintf(buf, "%d", bits);
+}
+#endif
 static void
 _show_ifp(struct ifnet *ifp, pr_fun *pr)
 {
@@ -903,13 +926,21 @@ static void
     char name[64], addr[64], netmask[64], broadcast[64];
 
     if_indextoname(ifp->if_index, name, 64);
-    (*pr)("%-8s", name);
     TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
         if (ifa->ifa_addr->sa_family != AF_LINK) {
+	    (*pr)("%-8s", name);
             getnameinfo (ifa->ifa_addr, ifa->ifa_addr->sa_len, addr, sizeof(addr), 0, 0, 0);
-            getnameinfo (ifa->ifa_dstaddr, ifa->ifa_dstaddr->sa_len, broadcast, sizeof(broadcast), 0, 0, 0);
-            _mask(ifa->ifa_netmask, netmask, 64);
-            (*pr)("IP: %s, Broadcast: %s, Netmask: %s\n", addr, broadcast, netmask);
+	    if (ifa->ifa_addr->sa_family == AF_INET) {
+	      getnameinfo (ifa->ifa_dstaddr, ifa->ifa_dstaddr->sa_len, broadcast, sizeof(broadcast), 0, 0, 0);
+	      _mask(ifa->ifa_netmask, netmask, 64);
+	      (*pr)("IP: %s, Broadcast: %s, Netmask: %s\n", addr, broadcast, netmask);
+	    }
+#ifdef CYGPKG_NET_INET6
+	    if (ifa->ifa_addr->sa_family == AF_INET6) {
+	      _mask6(ifa->ifa_netmask, netmask, 64);
+	      (*pr)("IP: %s/%s\n", addr,netmask);
+	    }
+#endif
             (*pr)("        ");
             if ((ifp->if_flags & IFF_UP)) (*pr)("UP ");
             if ((ifp->if_flags & IFF_BROADCAST)) (*pr)("BROADCAST ");
@@ -930,7 +961,7 @@ static int
 {
     struct rtentry *rt = (struct rtentry *)rn;
     struct sockaddr *dst, *gate, *netmask, *genmask;
-    char addr[32], *cp;
+    char addr[64], *cp;
     pr_fun *pr = (pr_fun *)vw;
 
     dst = rt_key(rt);
@@ -950,16 +981,27 @@ static int
             (*pr)("%-15s ", " ");
         }
         if (netmask != NULL) {
-            _mask(netmask, addr, sizeof(addr));
-            (*pr)("%-15s ", addr);
+	    if (dst->sa_family == AF_INET) {
+                _mask(netmask, addr, sizeof(addr));
+                (*pr)("%-15s ", addr);
+	    } 
+#ifdef CYGPKG_NET_INET6
+	    if (dst->sa_family == AF_INET6) {
+	      _mask6(netmask, addr, sizeof(addr));
+	      (*pr)("/%-14s ", addr);
+	    }
+#endif
         } else {
             (*pr)("%-15s ", " ");
         }
         cp = addr;
         if ((rt->rt_flags & RTF_UP)) *cp++ = 'U';
         if ((rt->rt_flags & RTF_GATEWAY)) *cp++ = 'G';
+	if ((rt->rt_flags & RTF_HOST)) *cp++ = 'H';
+	if ((rt->rt_flags & RTF_REJECT)) *cp++ = '!';
         if ((rt->rt_flags & RTF_STATIC)) *cp++ = 'S';
         if ((rt->rt_flags & RTF_DYNAMIC)) *cp++ = 'D';
+	if ((rt->rt_flags & RTF_MODIFIED)) *cp++ = 'M';
         *cp = '\0';
         (*pr)("%-8s ", addr);  // Flags
         if_indextoname(rt->rt_ifp->if_index, addr, 64);
@@ -995,3 +1037,6 @@ show_network_tables(pr_fun *pr)
 #endif // CYGPKG_NET_DRIVER_FRAMEWORK
 
 // EOF support.c
+
+
+
--- a/packages/net/bsd_tcpip/current/src/sys/net/route.c
+++ b/packages/net/bsd_tcpip/current/src/sys/net/route.c
@@ -105,15 +105,17 @@ route_init()
 //        achieve a generic broadcast.  Sadly it seems that BOOTP servers will
 //        only work this way, thus the hack.
 //
-//        This version enumerates all routes and deletes them - this leaks less
+//        This version enumerates all IPv4 routes and deletes them - this leaks less
 //        store than the previous version.
 
 static int
 rt_reinit_rtdelete( struct radix_node *rn, void *vifp )
 {
     struct rtentry *rt = (struct rtentry *)rn;
-    rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway, rt_mask(rt),
-              0, NULL);
+    if (rt->rt_ifa->ifa_addr->sa_family == AF_INET) {
+      rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway, rt_mask(rt),
+		0, NULL);
+    }
     return (0);
 }