diff options
author | Timo Teräs <timo.teras@iki.fi> | 2013-05-27 21:30:23 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-05-28 16:11:02 -0400 |
commit | 6c8b4e3ff81b82fc153625e81e60af1d89de2c32 (patch) | |
tree | 88f8d3413e9fa93c9683ba2fef44167de2f583c9 /net/ipv4 | |
parent | be9efd3653284f2827fd82861e8e9db9a8f726e1 (diff) |
arp: flush arp cache on IFF_NOARP change
IFF_NOARP affects what kind of neighbor entries are created
(nud NOARP or nud INCOMPLETE). If the flag changes, flush the arp
cache to refresh all entries.
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
v2->v3: shortened notifier_info struct name
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/arp.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index bf574029a183..4429b013f269 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -1235,12 +1235,18 @@ static int arp_netdev_event(struct notifier_block *this, unsigned long event, | |||
1235 | void *ptr) | 1235 | void *ptr) |
1236 | { | 1236 | { |
1237 | struct net_device *dev = netdev_notifier_info_to_dev(ptr); | 1237 | struct net_device *dev = netdev_notifier_info_to_dev(ptr); |
1238 | struct netdev_notifier_change_info *change_info; | ||
1238 | 1239 | ||
1239 | switch (event) { | 1240 | switch (event) { |
1240 | case NETDEV_CHANGEADDR: | 1241 | case NETDEV_CHANGEADDR: |
1241 | neigh_changeaddr(&arp_tbl, dev); | 1242 | neigh_changeaddr(&arp_tbl, dev); |
1242 | rt_cache_flush(dev_net(dev)); | 1243 | rt_cache_flush(dev_net(dev)); |
1243 | break; | 1244 | break; |
1245 | case NETDEV_CHANGE: | ||
1246 | change_info = ptr; | ||
1247 | if (change_info->flags_changed & IFF_NOARP) | ||
1248 | neigh_changeaddr(&arp_tbl, dev); | ||
1249 | break; | ||
1244 | default: | 1250 | default: |
1245 | break; | 1251 | break; |
1246 | } | 1252 | } |