From patchwork Mon May 20 13:29:01 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Timo Teras X-Patchwork-Id: 245039 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 2EFD72C0099 for ; Mon, 20 May 2013 23:27:42 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756616Ab3ETN1i (ORCPT ); Mon, 20 May 2013 09:27:38 -0400 Received: from mail-ee0-f54.google.com ([74.125.83.54]:48525 "EHLO mail-ee0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756478Ab3ETN1h (ORCPT ); Mon, 20 May 2013 09:27:37 -0400 Received: by mail-ee0-f54.google.com with SMTP id e50so4094462eek.13 for ; Mon, 20 May 2013 06:27:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :mime-version:content-type:content-transfer-encoding; bh=8XgKIgZDRMNCF40sa/kIP00p8iymZZJVpNzSdfOHnrc=; b=wjE1neJm5uv+kW+gJgauW5at5U5JSFvFiWaEsBhkLS05GBFGRq4numZ+a8h37KQf1V Rc21Sa9bFtZZiQ1rBb32NjsytfZ7+tcSaEGMmAlgbgqsamxjVMDfIPgSvAWx9d/q3pL/ 1OFI7jEBAcW6yoB8aEleTJ8fcmWMg7Bvma3K5uQEtFvtjSVDh2sMZrw2nrOT4SdY1a5Z 7+IaP6Un28OsPWo+nH+x2YBXnVlAnDm/76u2hUPPHTtLIJLhAblGX5WcVoPtIanRNokj tKV00mHF6SGx/7hK4pTZW8xYLcdho3X9WbLx/ijM39h5AGpXkPnJilzpzLNfv9eyCh/7 INxQ== X-Received: by 10.14.246.137 with SMTP id q9mr17939758eer.39.1369056455850; Mon, 20 May 2013 06:27:35 -0700 (PDT) Received: from vostro.util.wtbts.net ([83.145.235.199]) by mx.google.com with ESMTPSA id a5sm20414536ees.6.2013.05.20.06.27.34 for (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 20 May 2013 06:27:35 -0700 (PDT) From: =?UTF-8?q?Timo=20Ter=C3=A4s?= To: netdev@vger.kernel.org Cc: =?UTF-8?q?Timo=20Ter=C3=A4s?= , Patrick McHardy Subject: [PATCH net-next] arp: flush arp cache on IFF_NOARP change Date: Mon, 20 May 2013 16:29:01 +0300 Message-Id: <1369056541-4523-1-git-send-email-timo.teras@iki.fi> X-Mailer: git-send-email 1.8.2.3 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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 Cc: Patrick McHardy --- 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(+) 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; }