Message ID | 1369056541-4523-1-git-send-email-timo.teras@iki.fi |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
From: Timo Teräs <timo.teras@iki.fi> Date: Mon, 20 May 2013 16:29:01 +0300 > 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> > Cc: Patrick McHardy <kaber@trash.net> This patch makes no sense at all. The state bit in ->priv_flags is a boolean stating whether the notified should do something or not. But you're setting it to match what IFF_NOARP is. You should set it any time IFF_NOARP _changes_, and then clear the bit when the notifier clears the neighbour entries. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h index 1ec407b..ace4aec 100644 --- a/include/uapi/linux/if.h +++ b/include/uapi/linux/if.h @@ -83,6 +83,7 @@ #define IFF_SUPP_NOFCS 0x80000 /* device supports sending custom FCS */ #define IFF_LIVE_ADDR_CHANGE 0x100000 /* device supports hardware address * change when it's running */ +#define IFF_NOARP_CHANGED 0x200000 /* IFF_NOARP changed state recently */ #define IF_GET_IFACE 0x0001 /* for querying only */ diff --git a/net/core/dev.c b/net/core/dev.c index 18e9730..7135fe1 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4691,6 +4691,11 @@ void __dev_notify_flags(struct net_device *dev, unsigned int old_flags) { unsigned int changes = dev->flags ^ old_flags; + if (changes & IFF_NOARP) + dev->priv_flags |= IFF_NOARP_CHANGED; + else + dev->priv_flags &= ~IFF_NOARP_CHANGED; + if (changes & IFF_UP) { if (dev->flags & IFF_UP) call_netdevice_notifiers(NETDEV_UP, dev); diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 247ec19..375b2f2 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c @@ -1241,6 +1241,10 @@ static int arp_netdev_event(struct notifier_block *this, unsigned long event, neigh_changeaddr(&arp_tbl, dev); rt_cache_flush(dev_net(dev)); break; + case NETDEV_CHANGE: + if (dev->priv_flags & IFF_NOARP_CHANGED) + neigh_changeaddr(&arp_tbl, dev); + break; default: break; }
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> Cc: Patrick McHardy <kaber@trash.net> --- Original patch sent some years ago and the review is at: http://patchwork.ozlabs.org/patch/46806/ This is updated per Patrick's suggestion to use priv_flags as the place to notify that NOARP flag changed. include/uapi/linux/if.h | 1 + net/core/dev.c | 5 +++++ net/ipv4/arp.c | 4 ++++ 3 files changed, 10 insertions(+)