arp: flush arp cache on IFF_NOARP change
authorTimo Teräs <timo.teras@iki.fi>
Tue, 28 May 2013 01:30:23 +0000 (01:30 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 28 May 2013 20:11:02 +0000 (13:11 -0700)
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>
net/ipv4/arp.c

index bf574029a1839230ee5bf36537772f80836b3edc..4429b013f26946e03b687c25158267494542de9c 100644 (file)
@@ -1235,12 +1235,18 @@ static int arp_netdev_event(struct notifier_block *this, unsigned long event,
                            void *ptr)
 {
        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
+       struct netdev_notifier_change_info *change_info;
 
        switch (event) {
        case NETDEV_CHANGEADDR:
                neigh_changeaddr(&arp_tbl, dev);
                rt_cache_flush(dev_net(dev));
                break;
+       case NETDEV_CHANGE:
+               change_info = ptr;
+               if (change_info->flags_changed & IFF_NOARP)
+                       neigh_changeaddr(&arp_tbl, dev);
+               break;
        default:
                break;
        }