* [PATCH 03/05] ipv6: RFC4214 Support
@ 2007-11-07 1:16 Templin, Fred L
2007-11-07 17:37 ` Stephen Hemminger
0 siblings, 1 reply; 3+ messages in thread
From: Templin, Fred L @ 2007-11-07 1:16 UTC (permalink / raw)
To: netdev
From: Fred L. Templin <fred.l.templin@boeing.com>
This is experimental support for the Intra-Site Automatic
Tunnel Addressing Protocol (ISATAP) per RFC4214. It uses
the SIT module, and is configured using the unmodified
"ip" utility with device names beginning with: "isatap".
The following diffs are specific to the Linux 2.6.23
kernel distribution.
Signed-off-by: Fred L. Templin <fred.l.templin@boeing.com>
---
--- linux-2.6.23/net/ipv6/addrconf.c.orig 2007-10-09
13:31:38.000000000 -0700
+++ linux-2.6.23/net/ipv6/addrconf.c 2007-10-31 13:08:45.000000000
-0700
@@ -73,7 +73,11 @@
#include <net/tcp.h>
#include <net/ip.h>
#include <net/netlink.h>
+#if defined(CONFIG_IPV6_ISATAP)
+#include <net/ipip.h>
+#else
#include <linux/if_tunnel.h>
+#endif
#include <linux/rtnetlink.h>
#ifdef CONFIG_IPV6_PRIVACY
@@ -1426,6 +1430,11 @@ static int ipv6_generate_eui64(u8 *eui,
return addrconf_ifid_arcnet(eui, dev);
case ARPHRD_INFINIBAND:
return addrconf_ifid_infiniband(eui, dev);
+#if defined(CONFIG_IPV6_ISATAP)
+ case ARPHRD_SIT:
+ if (dev->priv_flags&IFF_ISATAP)
+ return ipv6_isatap_eui64(eui, (__be32 *)dev->dev_addr);
+#endif
}
return -1;
}
@@ -2138,7 +2147,6 @@ static void addrconf_add_linklocal(struc
addr_flags |= IFA_F_OPTIMISTIC;
#endif
-
ifp = ipv6_add_addr(idev, addr, 64, IFA_LINK, addr_flags);
if (!IS_ERR(ifp)) {
addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
idev->dev, 0, 0);
@@ -2192,6 +2200,32 @@ static void addrconf_sit_config(struct n
return;
}
+#if defined(CONFIG_IPV6_ISATAP)
+ /* ISATAP (RFC4214) - configure as NBMA link */
+ if (dev->priv_flags&IFF_ISATAP) {
+ struct in6_addr addr;
+
+ addrconf_add_lroute(dev);
+
+ addr.s6_addr32[0] = htonl(0xFE800000);
+ addr.s6_addr32[1] = 0;
+
+ if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0) {
+ struct inet6_ifaddr *ifp;
+
+ if (!IS_ERR(ifp = ipv6_add_addr(idev, &addr, 64,
+ IFA_LINK, IFA_F_PERMANENT))) {
+ addrconf_prefix_route(&ifp->addr,
ifp->prefix_len,
+ idev->dev, 0, 0);
+ addrconf_dad_start(ifp, 0);
+ in6_ifa_put(ifp);
+ }
+ }
+
+ return;
+ }
+#endif
+
sit_add_v4_addrs(idev);
if (dev->flags&IFF_POINTOPOINT) {
@@ -2521,6 +2555,16 @@ static void addrconf_rs_timer(unsigned l
* Announcement received after solicitation
* was sent
*/
+#if defined(CONFIG_IPV6_ISATAP)
+ /* ISATAP (RFC4214) - Re-DAD to trigger new RS/RA */
+ if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
+ spin_lock(&ifp->lock);
+ ifp->probes = 0;
+ ifp->idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD);
+ addrconf_mod_timer(ifp, AC_DAD, HZ*120);
+ spin_unlock(&ifp->lock);
+ }
+#endif
goto out;
}
@@ -2535,10 +2579,32 @@ static void addrconf_rs_timer(unsigned l
ifp->idev->cnf.rtr_solicit_interval);
spin_unlock(&ifp->lock);
+#if defined(CONFIG_IPV6_ISATAP)
+ /* ISATAP (RFC4214) - unicast RS */
+ if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
+ struct ip_tunnel *t = netdev_priv(ifp->idev->dev);
+ __be32 rtr = t->parms.i_key;
+
+ if (!rtr) goto out;
+
+ all_routers.s6_addr32[0] = htonl(0xFE800000);
+ all_routers.s6_addr32[1] = 0;
+ ipv6_isatap_eui64(all_routers.s6_addr + 8, &rtr);
+
+ } else
+#endif
ipv6_addr_all_routers(&all_routers);
ndisc_send_rs(ifp->idev->dev, &ifp->addr, &all_routers);
} else {
+#if defined(CONFIG_IPV6_ISATAP)
+ /* ISATAP (RFC4214) - Re-DAD to trigger new RS/RA */
+ if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
+ ifp->probes = 0;
+ ifp->idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD);
+ addrconf_mod_timer(ifp, AC_DAD, HZ*120);
+ }
+#endif
spin_unlock(&ifp->lock);
/*
* Note: we do not support deprecated "all on-link"
@@ -2584,6 +2650,9 @@ static void addrconf_dad_start(struct in
spin_lock_bh(&ifp->lock);
if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) ||
+#if defined(CONFIG_IPV6_ISATAP)
+ dev->priv_flags&IFF_ISATAP ||
+#endif
!(ifp->flags&IFA_F_TENTATIVE) ||
ifp->flags & IFA_F_NODAD) {
ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC);
@@ -2680,6 +2749,20 @@ static void addrconf_dad_completed(struc
(ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
struct in6_addr all_routers;
+#if defined(CONFIG_IPV6_ISATAP)
+ /* ISATAP (RFC4214) - unicast RS */
+ if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
+ struct ip_tunnel *t = netdev_priv(ifp->idev->dev);
+ __be32 rtr = t->parms.i_key;
+
+ if (!rtr) return;
+
+ all_routers.s6_addr32[0] = htonl(0xFE800000);
+ all_routers.s6_addr32[1] = 0;
+ ipv6_isatap_eui64(all_routers.s6_addr + 8, &rtr);
+
+ } else
+#endif
ipv6_addr_all_routers(&all_routers);
/*
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH 03/05] ipv6: RFC4214 Support
2007-11-07 1:16 [PATCH 03/05] ipv6: RFC4214 Support Templin, Fred L
@ 2007-11-07 17:37 ` Stephen Hemminger
2007-11-07 18:21 ` Templin, Fred L
0 siblings, 1 reply; 3+ messages in thread
From: Stephen Hemminger @ 2007-11-07 17:37 UTC (permalink / raw)
To: Templin, Fred L; +Cc: netdev
On Tue, 6 Nov 2007 17:16:07 -0800
"Templin, Fred L" <Fred.L.Templin@boeing.com> wrote:
> From: Fred L. Templin <fred.l.templin@boeing.com>
>
> This is experimental support for the Intra-Site Automatic
> Tunnel Addressing Protocol (ISATAP) per RFC4214. It uses
> the SIT module, and is configured using the unmodified
> "ip" utility with device names beginning with: "isatap".
>
> The following diffs are specific to the Linux 2.6.23
> kernel distribution.
>
> Signed-off-by: Fred L. Templin <fred.l.templin@boeing.com>
>
> ---
>
> --- linux-2.6.23/net/ipv6/addrconf.c.orig 2007-10-09
> 13:31:38.000000000 -0700
> +++ linux-2.6.23/net/ipv6/addrconf.c 2007-10-31 13:08:45.000000000
> -0700
> @@ -73,7 +73,11 @@
> #include <net/tcp.h>
> #include <net/ip.h>
> #include <net/netlink.h>
> +#if defined(CONFIG_IPV6_ISATAP)
> +#include <net/ipip.h>
> +#else
> #include <linux/if_tunnel.h>
> +#endif
That seems odd, changing includes used based on config option.
> #include <linux/rtnetlink.h>
>
> #ifdef CONFIG_IPV6_PRIVACY
> @@ -1426,6 +1430,11 @@ static int ipv6_generate_eui64(u8 *eui,
> return addrconf_ifid_arcnet(eui, dev);
> case ARPHRD_INFINIBAND:
> return addrconf_ifid_infiniband(eui, dev);
> +#if defined(CONFIG_IPV6_ISATAP)
> + case ARPHRD_SIT:
> + if (dev->priv_flags&IFF_ISATAP)
> + return ipv6_isatap_eui64(eui, (__be32 *)dev->dev_addr);
> +#endif
Missing indentation
> }
> return -1;
> }
> @@ -2138,7 +2147,6 @@ static void addrconf_add_linklocal(struc
> addr_flags |= IFA_F_OPTIMISTIC;
> #endif
>
> -
avoid random whitespace changes
> ifp = ipv6_add_addr(idev, addr, 64, IFA_LINK, addr_flags);
> if (!IS_ERR(ifp)) {
> addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
> idev->dev, 0, 0);
> @@ -2192,6 +2200,32 @@ static void addrconf_sit_config(struct n
> return;
> }
>
> +#if defined(CONFIG_IPV6_ISATAP)
> + /* ISATAP (RFC4214) - configure as NBMA link */
> + if (dev->priv_flags&IFF_ISATAP) {
missing spaces around & operator
> + struct in6_addr addr;
> +
> + addrconf_add_lroute(dev);
> +
> + addr.s6_addr32[0] = htonl(0xFE800000);
shouldn't this be defined somewhere rather than hardcoded
magic constant?
> + addr.s6_addr32[1] = 0;
> +
> + if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0) {
> + struct inet6_ifaddr *ifp;
> +
> + if (!IS_ERR(ifp = ipv6_add_addr(idev, &addr, 64,
> + IFA_LINK, IFA_F_PERMANENT))) {
split assignment and conditional please
> + addrconf_prefix_route(&ifp->addr,
> ifp->prefix_len,
> + idev->dev, 0, 0);
> + addrconf_dad_start(ifp, 0);
> + in6_ifa_put(ifp);
> + }
> + }
> +
> + return;
> + }
> +#endif
> +
> sit_add_v4_addrs(idev);
>
> if (dev->flags&IFF_POINTOPOINT) {
> @@ -2521,6 +2555,16 @@ static void addrconf_rs_timer(unsigned l
> * Announcement received after solicitation
> * was sent
> */
> +#if defined(CONFIG_IPV6_ISATAP)
> + /* ISATAP (RFC4214) - Re-DAD to trigger new RS/RA */
> + if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
> + spin_lock(&ifp->lock);
> + ifp->probes = 0;
> + ifp->idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD);
> + addrconf_mod_timer(ifp, AC_DAD, HZ*120);
> + spin_unlock(&ifp->lock);
> + }
> +#endif
> goto out;
> }
>
> @@ -2535,10 +2579,32 @@ static void addrconf_rs_timer(unsigned l
> ifp->idev->cnf.rtr_solicit_interval);
> spin_unlock(&ifp->lock);
>
> +#if defined(CONFIG_IPV6_ISATAP)
> + /* ISATAP (RFC4214) - unicast RS */
> + if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
> + struct ip_tunnel *t = netdev_priv(ifp->idev->dev);
Please follow kernel indentation standard of tabs (not 4 spaces).
> + __be32 rtr = t->parms.i_key;
> +
> + if (!rtr) goto out;
> +
> + all_routers.s6_addr32[0] = htonl(0xFE800000);
> + all_routers.s6_addr32[1] = 0;
> + ipv6_isatap_eui64(all_routers.s6_addr + 8, &rtr);
> +
> + } else
> +#endif
> ipv6_addr_all_routers(&all_routers);
>
> ndisc_send_rs(ifp->idev->dev, &ifp->addr, &all_routers);
> } else {
> +#if defined(CONFIG_IPV6_ISATAP)
> + /* ISATAP (RFC4214) - Re-DAD to trigger new RS/RA */
> + if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
> + ifp->probes = 0;
> + ifp->idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD);
> + addrconf_mod_timer(ifp, AC_DAD, HZ*120);
> + }
> +#endif
> spin_unlock(&ifp->lock);
> /*
> * Note: we do not support deprecated "all on-link"
> @@ -2584,6 +2650,9 @@ static void addrconf_dad_start(struct in
> spin_lock_bh(&ifp->lock);
>
> if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) ||
> +#if defined(CONFIG_IPV6_ISATAP)
> + dev->priv_flags&IFF_ISATAP ||
> +#endif
> !(ifp->flags&IFA_F_TENTATIVE) ||
> ifp->flags & IFA_F_NODAD) {
> ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC);
> @@ -2680,6 +2749,20 @@ static void addrconf_dad_completed(struc
> (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
> struct in6_addr all_routers;
>
> +#if defined(CONFIG_IPV6_ISATAP)
> + /* ISATAP (RFC4214) - unicast RS */
> + if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
> + struct ip_tunnel *t = netdev_priv(ifp->idev->dev);
> + __be32 rtr = t->parms.i_key;
> +
> + if (!rtr) return;
> +
> + all_routers.s6_addr32[0] = htonl(0xFE800000);
> + all_routers.s6_addr32[1] = 0;
> + ipv6_isatap_eui64(all_routers.s6_addr + 8, &rtr);
> +
> + } else
> +#endif
> ipv6_addr_all_routers(&all_routers);
>
> /*
> -
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Stephen Hemminger <shemminger@linux-foundation.org>
^ permalink raw reply [flat|nested] 3+ messages in thread* RE: [PATCH 03/05] ipv6: RFC4214 Support
2007-11-07 17:37 ` Stephen Hemminger
@ 2007-11-07 18:21 ` Templin, Fred L
0 siblings, 0 replies; 3+ messages in thread
From: Templin, Fred L @ 2007-11-07 18:21 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: netdev
> -----Original Message-----
> From: Stephen Hemminger [mailto:shemminger@linux-foundation.org]
> Sent: Wednesday, November 07, 2007 9:37 AM
> To: Templin, Fred L
> Cc: netdev@vger.kernel.org
> Subject: Re: [PATCH 03/05] ipv6: RFC4214 Support
>
> On Tue, 6 Nov 2007 17:16:07 -0800
> "Templin, Fred L" <Fred.L.Templin@boeing.com> wrote:
>
> > From: Fred L. Templin <fred.l.templin@boeing.com>
> >
> > This is experimental support for the Intra-Site Automatic
> > Tunnel Addressing Protocol (ISATAP) per RFC4214. It uses
> > the SIT module, and is configured using the unmodified
> > "ip" utility with device names beginning with: "isatap".
> >
> > The following diffs are specific to the Linux 2.6.23
> > kernel distribution.
> >
> > Signed-off-by: Fred L. Templin <fred.l.templin@boeing.com>
> >
> > ---
> >
> > --- linux-2.6.23/net/ipv6/addrconf.c.orig 2007-10-09
> > 13:31:38.000000000 -0700
> > +++ linux-2.6.23/net/ipv6/addrconf.c 2007-10-31
> 13:08:45.000000000
> > -0700
> > @@ -73,7 +73,11 @@
> > #include <net/tcp.h>
> > #include <net/ip.h>
> > #include <net/netlink.h>
> > +#if defined(CONFIG_IPV6_ISATAP)
> > +#include <net/ipip.h>
> > +#else
> > #include <linux/if_tunnel.h>
> > +#endif
>
> That seems odd, changing includes used based on config option.
The change was to remove the conditional and simply
include <net/ipip.h>, since it also includes
<linux/if_tunnel.h>.
> > #include <linux/rtnetlink.h>
> >
> > #ifdef CONFIG_IPV6_PRIVACY
> > @@ -1426,6 +1430,11 @@ static int ipv6_generate_eui64(u8 *eui,
> > return addrconf_ifid_arcnet(eui, dev);
> > case ARPHRD_INFINIBAND:
> > return addrconf_ifid_infiniband(eui, dev);
> > +#if defined(CONFIG_IPV6_ISATAP)
> > + case ARPHRD_SIT:
> > + if (dev->priv_flags&IFF_ISATAP)
> > + return ipv6_isatap_eui64(eui, (__be32 *)dev->dev_addr);
> > +#endif
> Missing indentation
Fixed.
> > }
> > return -1;
> > }
> > @@ -2138,7 +2147,6 @@ static void addrconf_add_linklocal(struc
> > addr_flags |= IFA_F_OPTIMISTIC;
> > #endif
> >
> > -
>
> avoid random whitespace changes
Fixed.
> > ifp = ipv6_add_addr(idev, addr, 64, IFA_LINK, addr_flags);
> > if (!IS_ERR(ifp)) {
> > addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
> > idev->dev, 0, 0);
> > @@ -2192,6 +2200,32 @@ static void addrconf_sit_config(struct n
> > return;
> > }
> >
> > +#if defined(CONFIG_IPV6_ISATAP)
> > + /* ISATAP (RFC4214) - configure as NBMA link */
> > + if (dev->priv_flags&IFF_ISATAP) {
>
> missing spaces around & operator
Fixed.
> > + struct in6_addr addr;
> > +
> > + addrconf_add_lroute(dev);
> > +
> > + addr.s6_addr32[0] = htonl(0xFE800000);
>
> shouldn't this be defined somewhere rather than hardcoded
> magic constant?
Well, I see this occurring elsewhere within addrconf.c.
I did however change:
- addr.s6_addr32[0] = htonl(0xFE800000);
- addr.s6_addr32[1] = 0;
to:
+ ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0);
(Similar change occurred in 2 other places.)
> > + addr.s6_addr32[1] = 0;
> > +
> > + if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0) {
> > + struct inet6_ifaddr *ifp;
> > +
> > + if (!IS_ERR(ifp = ipv6_add_addr(idev, &addr, 64,
> > + IFA_LINK, IFA_F_PERMANENT))) {
>
> split assignment and conditional please
Fixed.
> > + addrconf_prefix_route(&ifp->addr,
> > ifp->prefix_len,
> > + idev->dev, 0, 0);
> > + addrconf_dad_start(ifp, 0);
> > + in6_ifa_put(ifp);
> > + }
> > + }
> > +
> > + return;
> > + }
> > +#endif
> > +
> > sit_add_v4_addrs(idev);
> >
> > if (dev->flags&IFF_POINTOPOINT) {
> > @@ -2521,6 +2555,16 @@ static void addrconf_rs_timer(unsigned l
> > * Announcement received after solicitation
> > * was sent
> > */
> > +#if defined(CONFIG_IPV6_ISATAP)
> > + /* ISATAP (RFC4214) - Re-DAD to trigger new RS/RA */
> > + if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
> > + spin_lock(&ifp->lock);
> > + ifp->probes = 0;
> > + ifp->idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD);
> > + addrconf_mod_timer(ifp, AC_DAD, HZ*120);
> > + spin_unlock(&ifp->lock);
> > + }
> > +#endif
> > goto out;
> > }
> >
> > @@ -2535,10 +2579,32 @@ static void addrconf_rs_timer(unsigned l
> > ifp->idev->cnf.rtr_solicit_interval);
> > spin_unlock(&ifp->lock);
> >
> > +#if defined(CONFIG_IPV6_ISATAP)
> > + /* ISATAP (RFC4214) - unicast RS */
> > + if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
> > + struct ip_tunnel *t = netdev_priv(ifp->idev->dev);
>
> Please follow kernel indentation standard of tabs (not 4 spaces).
Fixed everywhere in addrconf.c, and also in sit.c.
Fred
fred.l.templin@boeing.com
> > + __be32 rtr = t->parms.i_key;
> > +
> > + if (!rtr) goto out;
> > +
> > + all_routers.s6_addr32[0] = htonl(0xFE800000);
> > + all_routers.s6_addr32[1] = 0;
> > + ipv6_isatap_eui64(all_routers.s6_addr + 8, &rtr);
> > +
> > + } else
> > +#endif
> > ipv6_addr_all_routers(&all_routers);
> >
> > ndisc_send_rs(ifp->idev->dev, &ifp->addr, &all_routers);
> > } else {
> > +#if defined(CONFIG_IPV6_ISATAP)
> > + /* ISATAP (RFC4214) - Re-DAD to trigger new RS/RA */
> > + if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
> > + ifp->probes = 0;
> > + ifp->idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD);
> > + addrconf_mod_timer(ifp, AC_DAD, HZ*120);
> > + }
> > +#endif
> > spin_unlock(&ifp->lock);
> > /*
> > * Note: we do not support deprecated "all on-link"
> > @@ -2584,6 +2650,9 @@ static void addrconf_dad_start(struct in
> > spin_lock_bh(&ifp->lock);
> >
> > if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) ||
> > +#if defined(CONFIG_IPV6_ISATAP)
> > + dev->priv_flags&IFF_ISATAP ||
> > +#endif
> > !(ifp->flags&IFA_F_TENTATIVE) ||
> > ifp->flags & IFA_F_NODAD) {
> > ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC);
> > @@ -2680,6 +2749,20 @@ static void addrconf_dad_completed(struc
> > (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
> > struct in6_addr all_routers;
> >
> > +#if defined(CONFIG_IPV6_ISATAP)
> > + /* ISATAP (RFC4214) - unicast RS */
> > + if (ifp->idev->dev->priv_flags & IFF_ISATAP) {
> > + struct ip_tunnel *t = netdev_priv(ifp->idev->dev);
> > + __be32 rtr = t->parms.i_key;
> > +
> > + if (!rtr) return;
> > +
> > + all_routers.s6_addr32[0] = htonl(0xFE800000);
> > + all_routers.s6_addr32[1] = 0;
> > + ipv6_isatap_eui64(all_routers.s6_addr + 8, &rtr);
> > +
> > + } else
> > +#endif
> > ipv6_addr_all_routers(&all_routers);
> >
> > /*
> > -
> > To unsubscribe from this list: send the line "unsubscribe netdev" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
> --
> Stephen Hemminger <shemminger@linux-foundation.org>
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-11-07 18:21 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-07 1:16 [PATCH 03/05] ipv6: RFC4214 Support Templin, Fred L
2007-11-07 17:37 ` Stephen Hemminger
2007-11-07 18:21 ` Templin, Fred L
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).