diff options
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r-- | net/ipv6/addrconf.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index bd9f9360f769..86c235d05aba 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -244,6 +244,9 @@ const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; | |||
244 | const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT; | 244 | const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT; |
245 | const struct in6_addr in6addr_linklocal_allnodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT; | 245 | const struct in6_addr in6addr_linklocal_allnodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT; |
246 | const struct in6_addr in6addr_linklocal_allrouters = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT; | 246 | const struct in6_addr in6addr_linklocal_allrouters = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT; |
247 | const struct in6_addr in6addr_interfacelocal_allnodes = IN6ADDR_INTERFACELOCAL_ALLNODES_INIT; | ||
248 | const struct in6_addr in6addr_interfacelocal_allrouters = IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT; | ||
249 | const struct in6_addr in6addr_sitelocal_allrouters = IN6ADDR_SITELOCAL_ALLROUTERS_INIT; | ||
247 | 250 | ||
248 | /* Check if a valid qdisc is available */ | 251 | /* Check if a valid qdisc is available */ |
249 | static inline bool addrconf_qdisc_ok(const struct net_device *dev) | 252 | static inline bool addrconf_qdisc_ok(const struct net_device *dev) |
@@ -428,6 +431,9 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev) | |||
428 | /* protected by rtnl_lock */ | 431 | /* protected by rtnl_lock */ |
429 | rcu_assign_pointer(dev->ip6_ptr, ndev); | 432 | rcu_assign_pointer(dev->ip6_ptr, ndev); |
430 | 433 | ||
434 | /* Join interface-local all-node multicast group */ | ||
435 | ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allnodes); | ||
436 | |||
431 | /* Join all-node multicast group */ | 437 | /* Join all-node multicast group */ |
432 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes); | 438 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes); |
433 | 439 | ||
@@ -611,10 +617,15 @@ static void dev_forward_change(struct inet6_dev *idev) | |||
611 | if (idev->cnf.forwarding) | 617 | if (idev->cnf.forwarding) |
612 | dev_disable_lro(dev); | 618 | dev_disable_lro(dev); |
613 | if (dev->flags & IFF_MULTICAST) { | 619 | if (dev->flags & IFF_MULTICAST) { |
614 | if (idev->cnf.forwarding) | 620 | if (idev->cnf.forwarding) { |
615 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters); | 621 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters); |
616 | else | 622 | ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allrouters); |
623 | ipv6_dev_mc_inc(dev, &in6addr_sitelocal_allrouters); | ||
624 | } else { | ||
617 | ipv6_dev_mc_dec(dev, &in6addr_linklocal_allrouters); | 625 | ipv6_dev_mc_dec(dev, &in6addr_linklocal_allrouters); |
626 | ipv6_dev_mc_dec(dev, &in6addr_interfacelocal_allrouters); | ||
627 | ipv6_dev_mc_dec(dev, &in6addr_sitelocal_allrouters); | ||
628 | } | ||
618 | } | 629 | } |
619 | 630 | ||
620 | list_for_each_entry(ifa, &idev->addr_list, if_list) { | 631 | list_for_each_entry(ifa, &idev->addr_list, if_list) { |