|
@@ -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:
|