From: Alexandra Winter <wintera@linux.ibm.com>
To: "David S. Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Jesper Dangaard Brouer <hawk@kernel.org>,
John Fastabend <john.fastabend@gmail.com>,
Andrii Nakryiko <andrii@kernel.org>,
Martin KaFai Lau <kafai@fb.com>, Song Liu <songliubraving@fb.com>,
Yonghong Song <yhs@fb.com>, KP Singh <kpsingh@kernel.org>
Cc: netdev@vger.kernel.org, linux-s390@vger.kernel.org,
Heiko Carstens <hca@linux.ibm.com>,
Alexandra Winter <wintera@linux.ibm.com>
Subject: [PATCH net-next 1/1] veth: Support bonding events
Date: Mon, 28 Mar 2022 10:14:17 +0200 [thread overview]
Message-ID: <20220328081417.1427666-2-wintera@linux.ibm.com> (raw)
In-Reply-To: <20220328081417.1427666-1-wintera@linux.ibm.com>
Bonding drivers generate specific events during failover that trigger
switch updates. When a veth device is attached to a bridge with a
bond interface, we want external switches to learn about the veth
devices as well.
Signed-off-by: Alexandra Winter <wintera@linux.ibm.com>
---
drivers/net/veth.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 53 insertions(+)
diff --git a/drivers/net/veth.c b/drivers/net/veth.c
index d29fb9759cc9..9019c9852daf 100644
--- a/drivers/net/veth.c
+++ b/drivers/net/veth.c
@@ -1579,6 +1579,57 @@ static void veth_setup(struct net_device *dev)
dev->mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE;
}
+static bool _is_veth(const struct net_device *dev)
+{
+ return (dev->netdev_ops->ndo_open == veth_open);
+}
+
+static void veth_notify_peer(unsigned long event, const struct net_device *dev)
+{
+ struct net_device *peer;
+ struct veth_priv *priv;
+
+ priv = netdev_priv(dev);
+ peer = rtnl_dereference(priv->peer);
+ /* avoid re-bounce between 2 bridges */
+ if (!netif_is_bridge_port(peer))
+ call_netdevice_notifiers(event, peer);
+}
+
+/* Called under rtnl_lock */
+static int veth_device_event(struct notifier_block *unused,
+ unsigned long event, void *ptr)
+{
+ struct net_device *dev, *lower;
+ struct list_head *iter;
+
+ dev = netdev_notifier_info_to_dev(ptr);
+
+ switch (event) {
+ case NETDEV_NOTIFY_PEERS:
+ case NETDEV_BONDING_FAILOVER:
+ case NETDEV_RESEND_IGMP:
+ /* propagate to peer of a bridge attached veth */
+ if (netif_is_bridge_master(dev)) {
+ iter = &dev->adj_list.lower;
+ lower = netdev_next_lower_dev_rcu(dev, &iter);
+ while (lower) {
+ if (_is_veth(lower))
+ veth_notify_peer(event, lower);
+ lower = netdev_next_lower_dev_rcu(dev, &iter);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block veth_notifier_block __read_mostly = {
+ .notifier_call = veth_device_event,
+};
+
/*
* netlink interface
*/
@@ -1824,12 +1875,14 @@ static struct rtnl_link_ops veth_link_ops = {
static __init int veth_init(void)
{
+ register_netdevice_notifier(&veth_notifier_block);
return rtnl_link_register(&veth_link_ops);
}
static __exit void veth_exit(void)
{
rtnl_link_unregister(&veth_link_ops);
+ unregister_netdevice_notifier(&veth_notifier_block);
}
module_init(veth_init);
--
2.32.0
next prev parent reply other threads:[~2022-03-28 8:14 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-28 8:14 [PATCH net-next 0/1] veth: Support bonding events Alexandra Winter
2022-03-28 8:14 ` Alexandra Winter [this message]
2022-03-29 2:17 ` [PATCH net-next 1/1] " Jakub Kicinski
2022-03-29 2:14 ` [PATCH net-next 0/1] " Jakub Kicinski
2022-03-29 8:33 ` Alexandra Winter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220328081417.1427666-2-wintera@linux.ibm.com \
--to=wintera@linux.ibm.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=hawk@kernel.org \
--cc=hca@linux.ibm.com \
--cc=john.fastabend@gmail.com \
--cc=kafai@fb.com \
--cc=kpsingh@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=songliubraving@fb.com \
--cc=yhs@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.