|
@@ -1494,6 +1494,29 @@ static int addrconf_ifid_infiniband(u8 *eui, struct net_device *dev)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int __ipv6_isatap_ifid(u8 *eui, __be32 addr)
|
|
|
|
+{
|
|
|
|
+ eui[0] = (ipv4_is_zeronet(addr) || ipv4_is_private_10(addr) ||
|
|
|
|
+ ipv4_is_loopback(addr) || ipv4_is_linklocal_169(addr) ||
|
|
|
|
+ ipv4_is_private_172(addr) || ipv4_is_test_192(addr) ||
|
|
|
|
+ ipv4_is_anycast_6to4(addr) || ipv4_is_private_192(addr) ||
|
|
|
|
+ ipv4_is_test_198(addr) || ipv4_is_multicast(addr) ||
|
|
|
|
+ ipv4_is_lbcast(addr)) ? 0x00 : 0x02;
|
|
|
|
+ eui[1] = 0;
|
|
|
|
+ eui[2] = 0x5E;
|
|
|
|
+ eui[3] = 0xFE;
|
|
|
|
+ memcpy(eui + 4, &addr, 4);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(__ipv6_isatap_ifid);
|
|
|
|
+
|
|
|
|
+static int addrconf_ifid_sit(u8 *eui, struct net_device *dev)
|
|
|
|
+{
|
|
|
|
+ if (dev->priv_flags & IFF_ISATAP)
|
|
|
|
+ return __ipv6_isatap_ifid(eui, *(__be32 *)dev->dev_addr);
|
|
|
|
+ return -1;
|
|
|
|
+}
|
|
|
|
+
|
|
static int ipv6_generate_eui64(u8 *eui, struct net_device *dev)
|
|
static int ipv6_generate_eui64(u8 *eui, struct net_device *dev)
|
|
{
|
|
{
|
|
switch (dev->type) {
|
|
switch (dev->type) {
|
|
@@ -1506,8 +1529,7 @@ static int ipv6_generate_eui64(u8 *eui, struct net_device *dev)
|
|
case ARPHRD_INFINIBAND:
|
|
case ARPHRD_INFINIBAND:
|
|
return addrconf_ifid_infiniband(eui, dev);
|
|
return addrconf_ifid_infiniband(eui, dev);
|
|
case ARPHRD_SIT:
|
|
case ARPHRD_SIT:
|
|
- if (dev->priv_flags & IFF_ISATAP)
|
|
|
|
- return ipv6_isatap_eui64(eui, *(__be32 *)dev->dev_addr);
|
|
|
|
|
|
+ return addrconf_ifid_sit(eui, dev);
|
|
}
|
|
}
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|