Mercurial > ecos
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); }
