netdev
[Top] [All Lists]

Re: [PATCH] IPv6: Autoconfig link-local address on ip6-ip6 tunnel device

To: davem@xxxxxxxxxx
Subject: Re: [PATCH] IPv6: Autoconfig link-local address on ip6-ip6 tunnel device
From: Ville Nuorvala <vnuorval@xxxxxxxxxx>
Date: Fri, 28 Nov 2003 12:34:12 +0200 (EET)
Cc: YOSHIFUJI Hideaki / µÈÆ£±ÑÌÀ <yoshfuji@xxxxxxxxxxxxxx>, netdev@xxxxxxxxxxx
In-reply-to: <20031127.193910.96333709.yoshfuji@xxxxxxxxxxxxxx>
References: <Pine.LNX.4.58.0311051412180.28216@xxxxxxxxxxxxxxx> <20031125.035531.94714784.yoshfuji@xxxxxxxxxxxxxx> <Pine.LNX.4.58.0311271147250.3257@xxxxxxxxxxxxxxx> <20031127.193910.96333709.yoshfuji@xxxxxxxxxxxxxx>
Sender: netdev-bounce@xxxxxxxxxxx
On Thu, 27 Nov 2003, YOSHIFUJI Hideaki / [iso-2022-jp] µÈÆ£±ÑÌÀ wrote:

> In article <Pine.LNX.4.58.0311271147250.3257@xxxxxxxxxxxxxxx> (at Thu, 27 Nov 
> 2003 12:31:58 +0200 (EET)), Ville Nuorvala <vnuorval@xxxxxxxxxx> says:
>
> > here is a new version. I made some other minor changes to it too.
>
> looks fine.
> --yoshfuji

Hi Dave, Yoshifuji-san is now ok with this patch :) Would you apply it?

Its purpose is to enable autoconfiguration of link-local addresses on
the ip6-ip6 tunnel devices.

Thanks,
Ville

===== net/ipv6/ip6_tunnel.c 1.12.1.2 vs 1.16 =====
--- 1.12.1.2/net/ipv6/ip6_tunnel.c      Wed Nov  5 22:36:56 2003
+++ 1.16/net/ipv6/ip6_tunnel.c  Thu Nov  6 17:00:52 2003
@@ -821,6 +821,8 @@
        else
                dev->flags &= ~IFF_POINTOPOINT;

+       dev->iflink = p->link;
+
        if (p->flags & IP6_TNL_F_CAP_XMIT) {
                struct rt6_info *rt = rt6_lookup(&p->raddr, &p->laddr,
                                                 p->link, 0);
@@ -829,8 +831,6 @@
                        return;

                if (rt->rt6i_dev) {
-                       dev->iflink = rt->rt6i_dev->ifindex;
-
                        dev->hard_header_len = rt->rt6i_dev->hard_header_len +
                                sizeof (struct ipv6hdr);

@@ -1040,7 +1040,6 @@
        dev->hard_header_len = LL_MAX_HEADER + sizeof (struct ipv6hdr);
        dev->mtu = ETH_DATA_LEN - sizeof (struct ipv6hdr);
        dev->flags |= IFF_NOARP;
-       dev->iflink = 0;
        dev->addr_len = sizeof(struct in6_addr);
 }

===== net/ipv6/addrconf.c 1.74.1.3 vs 1.79 =====
--- 1.74.1.3/net/ipv6/addrconf.c        Wed Nov 26 03:06:32 2003
+++ 1.79/net/ipv6/addrconf.c    Thu Nov 27 11:14:09 2003
@@ -1809,6 +1809,54 @@
                sit_route_add(dev);
 }

+static inline int
+ipv6_inherit_linklocal(struct inet6_dev *idev, struct net_device *link_dev)
+{
+       struct in6_addr lladdr;
+
+       if (!ipv6_get_lladdr(link_dev, &lladdr)) {
+               addrconf_add_linklocal(idev, &lladdr);
+               return 0;
+       }
+       return -1;
+}
+
+static void ip6_tnl_add_linklocal(struct inet6_dev *idev)
+{
+       struct net_device *link_dev;
+
+       /* first try to inherit the link-local address from the link device */
+       if (idev->dev->iflink &&
+           (link_dev = __dev_get_by_index(idev->dev->iflink))) {
+               if (!ipv6_inherit_linklocal(idev, link_dev))
+                       return;
+       }
+       /* then try to inherit it from any device */
+       for (link_dev = dev_base; link_dev; link_dev = link_dev->next) {
+               if (!ipv6_inherit_linklocal(idev, link_dev))
+                       return;
+       }
+       printk(KERN_DEBUG "init ip6-ip6: add_linklocal failed\n");
+}
+
+/*
+ * Autoconfigure tunnel with a link-local address so routing protocols,
+ * DHCPv6, MLD etc. can be run over the virtual link
+ */
+
+static void addrconf_ip6_tnl_config(struct net_device *dev)
+{
+       struct inet6_dev *idev;
+
+       ASSERT_RTNL();
+
+       if ((idev = addrconf_add_dev(dev)) == NULL) {
+               printk(KERN_DEBUG "init ip6-ip6: add_dev failed\n");
+               return;
+       }
+       ip6_tnl_add_linklocal(idev);
+       addrconf_add_mroute(dev);
+}

 int addrconf_notify(struct notifier_block *this, unsigned long event,
                    void * data)
@@ -1822,7 +1870,9 @@
                case ARPHRD_SIT:
                        addrconf_sit_config(dev);
                        break;
-
+               case ARPHRD_TUNNEL6:
+                       addrconf_ip6_tnl_config(dev);
+                       break;
                case ARPHRD_LOOPBACK:
                        init_loopback(dev);
                        break;
@@ -2121,6 +2171,7 @@
         */

        if (ifp->idev->cnf.forwarding == 0 &&
+           ifp->idev->cnf.rtr_solicits > 0 &&
            (dev->flags&IFF_LOOPBACK) == 0 &&
            (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
                struct in6_addr all_routers;

--
Ville Nuorvala
Research Assistant, Institute of Digital Communications,
Helsinki University of Technology
email: vnuorval@xxxxxxxxxx, phone: +358 (0)9 451 5257


<Prev in Thread] Current Thread [Next in Thread>