diff options
author | Marius Tomaschewski <mt@suse.de> | 2015-09-01 01:57:30 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-09-01 06:20:29 +0200 |
commit | 2053aeb69a53224717296db31b13d5b45b4f1a0e (patch) | |
tree | 8a328716a045fa0e442f5a247c0307251dd38dc9 /net/ipv6 | |
parent | gro_cells: remove spinlock protecting receive queues (diff) | |
download | linux-2053aeb69a53224717296db31b13d5b45b4f1a0e.tar.xz linux-2053aeb69a53224717296db31b13d5b45b4f1a0e.zip |
ipv6: send only one NEWLINK when RA causes changes
Signed-off-by: Marius Tomaschewski <mt@suse.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/ndisc.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 12fff091e043..64a71354b069 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -1079,6 +1079,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) int optlen; unsigned int pref = 0; __u32 old_if_flags; + bool send_ifinfo_notify = false; __u8 *opt = (__u8 *)(ra_msg + 1); @@ -1158,7 +1159,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) IF_RA_OTHERCONF : 0); if (old_if_flags != in6_dev->if_flags) - inet6_ifinfo_notify(RTM_NEWLINK, in6_dev); + send_ifinfo_notify = true; if (!in6_dev->cnf.accept_ra_defrtr) { ND_PRINTK(2, info, @@ -1261,7 +1262,7 @@ skip_defrtr: rtime = HZ/10; NEIGH_VAR_SET(in6_dev->nd_parms, RETRANS_TIME, rtime); in6_dev->tstamp = jiffies; - inet6_ifinfo_notify(RTM_NEWLINK, in6_dev); + send_ifinfo_notify = true; } rtime = ntohl(ra_msg->reachable_time); @@ -1278,11 +1279,17 @@ skip_defrtr: GC_STALETIME, 3 * rtime); in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime); in6_dev->tstamp = jiffies; - inet6_ifinfo_notify(RTM_NEWLINK, in6_dev); + send_ifinfo_notify = true; } } } + /* + * Send a notify if RA changed managed/otherconf flags or timer settings + */ + if (send_ifinfo_notify) + inet6_ifinfo_notify(RTM_NEWLINK, in6_dev); + skip_linkparms: /* |