lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 28 Mar 2022 10:14:17 +0200 From: Alexandra Winter <wintera@...ux.ibm.com> To: "David S. Miller" <davem@...emloft.net>, Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>, Alexei Starovoitov <ast@...nel.org>, Daniel Borkmann <daniel@...earbox.net>, Jesper Dangaard Brouer <hawk@...nel.org>, John Fastabend <john.fastabend@...il.com>, Andrii Nakryiko <andrii@...nel.org>, Martin KaFai Lau <kafai@...com>, Song Liu <songliubraving@...com>, Yonghong Song <yhs@...com>, KP Singh <kpsingh@...nel.org> Cc: netdev@...r.kernel.org, linux-s390@...r.kernel.org, Heiko Carstens <hca@...ux.ibm.com>, Alexandra Winter <wintera@...ux.ibm.com> Subject: [PATCH net-next 1/1] veth: Support bonding events 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@...ux.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
Powered by blists - more mailing lists