diff options
author | Sascha Hlusiak <contact@saschahlusiak.de> | 2009-09-26 23:28:07 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-09-26 23:28:07 -0400 |
commit | d1f8297a96b0d70f17704296a6666468f2087ce6 (patch) | |
tree | 308ecb282fcaf98439918c13178a2dc326bc8eb0 | |
parent | 7eaf5077b37bb33dbd44e569ff88566d6fe286e9 (diff) |
Revert "sit: stateless autoconf for isatap"
This reverts commit 645069299a1c7358cf7330afe293f07552f11a5d.
While the code does not actually break anything, it does not completely follow
RFC5214 yet. After talking back with Fred L. Templin, I agree that completing the
ISATAP specific RS/RA code, would pollute the kernel a lot with code that is better
implemented in userspace.
The kernel should not send RS packages for ISATAP at all.
Signed-off-by: Sascha Hlusiak <contact@saschahlusiak.de>
Acked-by: Fred L. Templin <Fred.L.Templin@boeing.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/if_tunnel.h | 2 | ||||
-rw-r--r-- | include/net/ipip.h | 7 | ||||
-rw-r--r-- | net/ipv6/ndisc.c | 1 | ||||
-rw-r--r-- | net/ipv6/sit.c | 58 |
4 files changed, 1 insertions, 67 deletions
diff --git a/include/linux/if_tunnel.h b/include/linux/if_tunnel.h index 5eb9b0f857e0..5a9aae4adb44 100644 --- a/include/linux/if_tunnel.h +++ b/include/linux/if_tunnel.h | |||
@@ -44,7 +44,7 @@ struct ip_tunnel_prl { | |||
44 | __u16 flags; | 44 | __u16 flags; |
45 | __u16 __reserved; | 45 | __u16 __reserved; |
46 | __u32 datalen; | 46 | __u32 datalen; |
47 | __u32 rs_delay; | 47 | __u32 __reserved2; |
48 | /* data follows */ | 48 | /* data follows */ |
49 | }; | 49 | }; |
50 | 50 | ||
diff --git a/include/net/ipip.h b/include/net/ipip.h index 76e3ea6e2fe5..87acf8f3a155 100644 --- a/include/net/ipip.h +++ b/include/net/ipip.h | |||
@@ -27,18 +27,11 @@ struct ip_tunnel | |||
27 | unsigned int prl_count; /* # of entries in PRL */ | 27 | unsigned int prl_count; /* # of entries in PRL */ |
28 | }; | 28 | }; |
29 | 29 | ||
30 | /* ISATAP: default interval between RS in secondy */ | ||
31 | #define IPTUNNEL_RS_DEFAULT_DELAY (900) | ||
32 | |||
33 | struct ip_tunnel_prl_entry | 30 | struct ip_tunnel_prl_entry |
34 | { | 31 | { |
35 | struct ip_tunnel_prl_entry *next; | 32 | struct ip_tunnel_prl_entry *next; |
36 | __be32 addr; | 33 | __be32 addr; |
37 | u16 flags; | 34 | u16 flags; |
38 | unsigned long rs_delay; | ||
39 | struct timer_list rs_timer; | ||
40 | struct ip_tunnel *tunnel; | ||
41 | spinlock_t lock; | ||
42 | }; | 35 | }; |
43 | 36 | ||
44 | #define IPTUNNEL_XMIT() do { \ | 37 | #define IPTUNNEL_XMIT() do { \ |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 498b9b0b0fad..f74e4e2cdd06 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -658,7 +658,6 @@ void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr, | |||
658 | &icmp6h, NULL, | 658 | &icmp6h, NULL, |
659 | send_sllao ? ND_OPT_SOURCE_LL_ADDR : 0); | 659 | send_sllao ? ND_OPT_SOURCE_LL_ADDR : 0); |
660 | } | 660 | } |
661 | EXPORT_SYMBOL(ndisc_send_rs); | ||
662 | 661 | ||
663 | 662 | ||
664 | static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb) | 663 | static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb) |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index fcb539628847..d65e0c496cc0 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -15,7 +15,6 @@ | |||
15 | * Roger Venning <r.venning@telstra.com>: 6to4 support | 15 | * Roger Venning <r.venning@telstra.com>: 6to4 support |
16 | * Nate Thompson <nate@thebog.net>: 6to4 support | 16 | * Nate Thompson <nate@thebog.net>: 6to4 support |
17 | * Fred Templin <fred.l.templin@boeing.com>: isatap support | 17 | * Fred Templin <fred.l.templin@boeing.com>: isatap support |
18 | * Sascha Hlusiak <mail@saschahlusiak.de>: stateless autoconf for isatap | ||
19 | */ | 18 | */ |
20 | 19 | ||
21 | #include <linux/module.h> | 20 | #include <linux/module.h> |
@@ -223,44 +222,6 @@ failed: | |||
223 | return NULL; | 222 | return NULL; |
224 | } | 223 | } |
225 | 224 | ||
226 | static void ipip6_tunnel_rs_timer(unsigned long data) | ||
227 | { | ||
228 | struct ip_tunnel_prl_entry *p = (struct ip_tunnel_prl_entry *) data; | ||
229 | struct inet6_dev *ifp; | ||
230 | struct inet6_ifaddr *addr; | ||
231 | |||
232 | spin_lock(&p->lock); | ||
233 | ifp = __in6_dev_get(p->tunnel->dev); | ||
234 | |||
235 | read_lock_bh(&ifp->lock); | ||
236 | for (addr = ifp->addr_list; addr; addr = addr->if_next) { | ||
237 | struct in6_addr rtr; | ||
238 | |||
239 | if (!(ipv6_addr_type(&addr->addr) & IPV6_ADDR_LINKLOCAL)) | ||
240 | continue; | ||
241 | |||
242 | /* Send RS to guessed linklocal address of router | ||
243 | * | ||
244 | * Better: send to ff02::2 encapsuled in unicast directly | ||
245 | * to router-v4 instead of guessing the v6 address. | ||
246 | * | ||
247 | * Cisco/Windows seem to not set the u/l bit correctly, | ||
248 | * so we won't guess right. | ||
249 | */ | ||
250 | ipv6_addr_set(&rtr, htonl(0xFE800000), 0, 0, 0); | ||
251 | if (!__ipv6_isatap_ifid(rtr.s6_addr + 8, | ||
252 | p->addr)) { | ||
253 | ndisc_send_rs(p->tunnel->dev, &addr->addr, &rtr); | ||
254 | } | ||
255 | } | ||
256 | read_unlock_bh(&ifp->lock); | ||
257 | |||
258 | mod_timer(&p->rs_timer, jiffies + HZ * p->rs_delay); | ||
259 | spin_unlock(&p->lock); | ||
260 | |||
261 | return; | ||
262 | } | ||
263 | |||
264 | static struct ip_tunnel_prl_entry * | 225 | static struct ip_tunnel_prl_entry * |
265 | __ipip6_tunnel_locate_prl(struct ip_tunnel *t, __be32 addr) | 226 | __ipip6_tunnel_locate_prl(struct ip_tunnel *t, __be32 addr) |
266 | { | 227 | { |
@@ -319,7 +280,6 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t, | |||
319 | continue; | 280 | continue; |
320 | kp[c].addr = prl->addr; | 281 | kp[c].addr = prl->addr; |
321 | kp[c].flags = prl->flags; | 282 | kp[c].flags = prl->flags; |
322 | kp[c].rs_delay = prl->rs_delay; | ||
323 | c++; | 283 | c++; |
324 | if (kprl.addr != htonl(INADDR_ANY)) | 284 | if (kprl.addr != htonl(INADDR_ANY)) |
325 | break; | 285 | break; |
@@ -369,23 +329,11 @@ ipip6_tunnel_add_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a, int chg) | |||
369 | } | 329 | } |
370 | 330 | ||
371 | p->next = t->prl; | 331 | p->next = t->prl; |
372 | p->tunnel = t; | ||
373 | t->prl = p; | 332 | t->prl = p; |
374 | t->prl_count++; | 333 | t->prl_count++; |
375 | |||
376 | spin_lock_init(&p->lock); | ||
377 | setup_timer(&p->rs_timer, ipip6_tunnel_rs_timer, (unsigned long) p); | ||
378 | update: | 334 | update: |
379 | p->addr = a->addr; | 335 | p->addr = a->addr; |
380 | p->flags = a->flags; | 336 | p->flags = a->flags; |
381 | p->rs_delay = a->rs_delay; | ||
382 | if (p->rs_delay == 0) | ||
383 | p->rs_delay = IPTUNNEL_RS_DEFAULT_DELAY; | ||
384 | spin_lock(&p->lock); | ||
385 | del_timer(&p->rs_timer); | ||
386 | if (p->flags & PRL_DEFAULT) | ||
387 | mod_timer(&p->rs_timer, jiffies + 1); | ||
388 | spin_unlock(&p->lock); | ||
389 | out: | 337 | out: |
390 | write_unlock(&ipip6_lock); | 338 | write_unlock(&ipip6_lock); |
391 | return err; | 339 | return err; |
@@ -404,9 +352,6 @@ ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a) | |||
404 | if ((*p)->addr == a->addr) { | 352 | if ((*p)->addr == a->addr) { |
405 | x = *p; | 353 | x = *p; |
406 | *p = x->next; | 354 | *p = x->next; |
407 | spin_lock(&x->lock); | ||
408 | del_timer(&x->rs_timer); | ||
409 | spin_unlock(&x->lock); | ||
410 | kfree(x); | 355 | kfree(x); |
411 | t->prl_count--; | 356 | t->prl_count--; |
412 | goto out; | 357 | goto out; |
@@ -417,9 +362,6 @@ ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a) | |||
417 | while (t->prl) { | 362 | while (t->prl) { |
418 | x = t->prl; | 363 | x = t->prl; |
419 | t->prl = t->prl->next; | 364 | t->prl = t->prl->next; |
420 | spin_lock(&x->lock); | ||
421 | del_timer(&x->rs_timer); | ||
422 | spin_unlock(&x->lock); | ||
423 | kfree(x); | 365 | kfree(x); |
424 | t->prl_count--; | 366 | t->prl_count--; |
425 | } | 367 | } |