|
@@ -1814,6 +1814,16 @@ static int addrconf_ifid_gre(u8 *eui, struct net_device *dev)
|
|
|
return __ipv6_isatap_ifid(eui, *(__be32 *)dev->dev_addr);
|
|
|
}
|
|
|
|
|
|
+static int addrconf_ifid_ip6tnl(u8 *eui, struct net_device *dev)
|
|
|
+{
|
|
|
+ memcpy(eui, dev->perm_addr, 3);
|
|
|
+ memcpy(eui + 5, dev->perm_addr + 3, 3);
|
|
|
+ eui[3] = 0xFF;
|
|
|
+ eui[4] = 0xFE;
|
|
|
+ eui[0] ^= 2;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int ipv6_generate_eui64(u8 *eui, struct net_device *dev)
|
|
|
{
|
|
|
switch (dev->type) {
|
|
@@ -1832,6 +1842,8 @@ static int ipv6_generate_eui64(u8 *eui, struct net_device *dev)
|
|
|
return addrconf_ifid_eui64(eui, dev);
|
|
|
case ARPHRD_IEEE1394:
|
|
|
return addrconf_ifid_ieee1394(eui, dev);
|
|
|
+ case ARPHRD_TUNNEL6:
|
|
|
+ return addrconf_ifid_ip6tnl(eui, dev);
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
@@ -2709,7 +2721,8 @@ static void addrconf_dev_config(struct net_device *dev)
|
|
|
(dev->type != ARPHRD_ARCNET) &&
|
|
|
(dev->type != ARPHRD_INFINIBAND) &&
|
|
|
(dev->type != ARPHRD_IEEE802154) &&
|
|
|
- (dev->type != ARPHRD_IEEE1394)) {
|
|
|
+ (dev->type != ARPHRD_IEEE1394) &&
|
|
|
+ (dev->type != ARPHRD_TUNNEL6)) {
|
|
|
/* Alas, we support only Ethernet autoconfiguration. */
|
|
|
return;
|
|
|
}
|
|
@@ -2795,44 +2808,6 @@ ipv6_inherit_linklocal(struct inet6_dev *idev, struct net_device *link_dev)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-static void ip6_tnl_add_linklocal(struct inet6_dev *idev)
|
|
|
-{
|
|
|
- struct net_device *link_dev;
|
|
|
- struct net *net = dev_net(idev->dev);
|
|
|
-
|
|
|
- /* first try to inherit the link-local address from the link device */
|
|
|
- if (idev->dev->iflink &&
|
|
|
- (link_dev = __dev_get_by_index(net, idev->dev->iflink))) {
|
|
|
- if (!ipv6_inherit_linklocal(idev, link_dev))
|
|
|
- return;
|
|
|
- }
|
|
|
- /* then try to inherit it from any device */
|
|
|
- for_each_netdev(net, link_dev) {
|
|
|
- if (!ipv6_inherit_linklocal(idev, link_dev))
|
|
|
- return;
|
|
|
- }
|
|
|
- pr_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();
|
|
|
-
|
|
|
- idev = addrconf_add_dev(dev);
|
|
|
- if (IS_ERR(idev)) {
|
|
|
- pr_debug("init ip6-ip6: add_dev failed\n");
|
|
|
- return;
|
|
|
- }
|
|
|
- ip6_tnl_add_linklocal(idev);
|
|
|
-}
|
|
|
-
|
|
|
static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
|
|
void *ptr)
|
|
|
{
|
|
@@ -2900,9 +2875,6 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
|
|
addrconf_gre_config(dev);
|
|
|
break;
|
|
|
#endif
|
|
|
- case ARPHRD_TUNNEL6:
|
|
|
- addrconf_ip6_tnl_config(dev);
|
|
|
- break;
|
|
|
case ARPHRD_LOOPBACK:
|
|
|
init_loopback(dev);
|
|
|
break;
|