aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/addrconf.c
diff options
context:
space:
mode:
authorFred L. Templin <fred.l.templin@boeing.com>2007-11-29 06:11:40 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 17:55:09 -0500
commitc7dc89c0ac8e7c3796bff91becf58ccdbcaf9f18 (patch)
treee876ccadf29a90b7a211522aeccfd42255dab586 /net/ipv6/addrconf.c
parentdf97c708d5e6eebdd9ded1fa588eae09acf53793 (diff)
[IPV6]: Add RFC4214 support
This patch includes support for the Intra-Site Automatic Tunnel Addressing Protocol (ISATAP) per RFC4214. It uses the SIT module, and is configured using extensions to the "iproute2" utility. The diffs are specific to the Linux 2.6.24-rc2 kernel distribution. This version includes the diff for ./include/linux/if.h which was missing in the v2.4 submission and is needed to make the patch compile. The patch has been installed, compiled and tested in a clean 2.6.24-rc2 kernel build area. Signed-off-by: Fred L. Templin <fred.l.templin@boeing.com> Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r--net/ipv6/addrconf.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 6c8b193474ba..f177424c186f 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) {