diff options
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r-- | net/ipv6/addrconf.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 6c8b193474b..f177424c186 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -377,6 +377,13 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) | |||
377 | "%s: Disabled Privacy Extensions\n", | 377 | "%s: Disabled Privacy Extensions\n", |
378 | dev->name); | 378 | dev->name); |
379 | ndev->cnf.use_tempaddr = -1; | 379 | ndev->cnf.use_tempaddr = -1; |
380 | |||
381 | if (dev->type == ARPHRD_SIT && (dev->priv_flags & IFF_ISATAP)) { | ||
382 | printk(KERN_INFO | ||
383 | "%s: Disabled Multicast RS\n", | ||
384 | dev->name); | ||
385 | ndev->cnf.rtr_solicits = 0; | ||
386 | } | ||
380 | } else { | 387 | } else { |
381 | in6_dev_hold(ndev); | 388 | in6_dev_hold(ndev); |
382 | ipv6_regen_rndid((unsigned long) ndev); | 389 | ipv6_regen_rndid((unsigned long) ndev); |
@@ -1409,6 +1416,9 @@ static int ipv6_generate_eui64(u8 *eui, struct net_device *dev) | |||
1409 | return addrconf_ifid_arcnet(eui, dev); | 1416 | return addrconf_ifid_arcnet(eui, dev); |
1410 | case ARPHRD_INFINIBAND: | 1417 | case ARPHRD_INFINIBAND: |
1411 | return addrconf_ifid_infiniband(eui, dev); | 1418 | return addrconf_ifid_infiniband(eui, dev); |
1419 | case ARPHRD_SIT: | ||
1420 | if (dev->priv_flags & IFF_ISATAP) | ||
1421 | return ipv6_isatap_eui64(eui, *(__be32 *)dev->dev_addr); | ||
1412 | } | 1422 | } |
1413 | return -1; | 1423 | return -1; |
1414 | } | 1424 | } |
@@ -1444,7 +1454,7 @@ regen: | |||
1444 | * | 1454 | * |
1445 | * - Reserved subnet anycast (RFC 2526) | 1455 | * - Reserved subnet anycast (RFC 2526) |
1446 | * 11111101 11....11 1xxxxxxx | 1456 | * 11111101 11....11 1xxxxxxx |
1447 | * - ISATAP (draft-ietf-ngtrans-isatap-13.txt) 5.1 | 1457 | * - ISATAP (RFC4214) 6.1 |
1448 | * 00-00-5E-FE-xx-xx-xx-xx | 1458 | * 00-00-5E-FE-xx-xx-xx-xx |
1449 | * - value 0 | 1459 | * - value 0 |
1450 | * - XXX: already assigned to an address on the device | 1460 | * - XXX: already assigned to an address on the device |
@@ -2175,6 +2185,16 @@ static void addrconf_sit_config(struct net_device *dev) | |||
2175 | return; | 2185 | return; |
2176 | } | 2186 | } |
2177 | 2187 | ||
2188 | if (dev->priv_flags & IFF_ISATAP) { | ||
2189 | struct in6_addr addr; | ||
2190 | |||
2191 | ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); | ||
2192 | addrconf_prefix_route(&addr, 64, dev, 0, 0); | ||
2193 | if (!ipv6_generate_eui64(addr.s6_addr + 8, dev)) | ||
2194 | addrconf_add_linklocal(idev, &addr); | ||
2195 | return; | ||
2196 | } | ||
2197 | |||
2178 | sit_add_v4_addrs(idev); | 2198 | sit_add_v4_addrs(idev); |
2179 | 2199 | ||
2180 | if (dev->flags&IFF_POINTOPOINT) { | 2200 | if (dev->flags&IFF_POINTOPOINT) { |