ipv6: addrconf: fix 48 bit 6lowpan autoconfiguration
authorAlexander Aring <aar@pengutronix.de>
Sun, 12 Mar 2017 08:19:36 +0000 (10:19 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 12 Apr 2017 20:02:36 +0000 (22:02 +0200)
This patch adds support for 48 bit 6LoWPAN address length
autoconfiguration which is the case for BTLE 6LoWPAN.

Signed-off-by: Alexander Aring <aar@pengutronix.de>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Reviewed-by: Stefan Schmidt <stefan@osg.samsung.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/ipv6/addrconf.c

index 67ec87ea5fb699eb8ba4634c91815f97d750ddf1..b22796e707d389eba285d6b67f91b8c8cca5d9ba 100644 (file)
@@ -2073,12 +2073,19 @@ static void addrconf_leave_anycast(struct inet6_ifaddr *ifp)
        __ipv6_dev_ac_dec(ifp->idev, &addr);
 }
 
-static int addrconf_ifid_eui64(u8 *eui, struct net_device *dev)
+static int addrconf_ifid_6lowpan(u8 *eui, struct net_device *dev)
 {
-       if (dev->addr_len != EUI64_ADDR_LEN)
+       switch (dev->addr_len) {
+       case ETH_ALEN:
+               return addrconf_ifid_eui48(eui, dev);
+       case EUI64_ADDR_LEN:
+               memcpy(eui, dev->dev_addr, EUI64_ADDR_LEN);
+               eui[0] ^= 2;
+               break;
+       default:
                return -1;
-       memcpy(eui, dev->dev_addr, EUI64_ADDR_LEN);
-       eui[0] ^= 2;
+       }
+
        return 0;
 }
 
@@ -2170,7 +2177,7 @@ static int ipv6_generate_eui64(u8 *eui, struct net_device *dev)
        case ARPHRD_TUNNEL:
                return addrconf_ifid_gre(eui, dev);
        case ARPHRD_6LOWPAN:
-               return addrconf_ifid_eui64(eui, dev);
+               return addrconf_ifid_6lowpan(eui, dev);
        case ARPHRD_IEEE1394:
                return addrconf_ifid_ieee1394(eui, dev);
        case ARPHRD_TUNNEL6: