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 linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 1 Jul 2016 08:24:54 -0600 From: David Ahern <dsa@...ulusnetworks.com> To: Jiri Pirko <jiri@...nulli.us>, netdev@...r.kernel.org Cc: davem@...emloft.net, idosch@...lanox.com, yotamg@...lanox.com, eladr@...lanox.com, nogahf@...lanox.com, ogerlitz@...lanox.com, sfeldma@...il.com, roopa@...ulusnetworks.com, andy@...yhouse.net, tgraf@...g.ch, jhs@...atatu.com, linville@...driver.com, ivecera@...hat.com Subject: Re: [patch net-next 02/42] net: introduce default neigh_construct/destroy ndo calls for L2 upper devices On 7/1/16 8:04 AM, Jiri Pirko wrote: > From: Jiri Pirko <jiri@...lanox.com> > > L2 upper device needs to propagate neigh_construct/destroy calls down to > lower devices. Do this by defining default ndo functions and use them in > team, bond, bridge and vlan. > > Signed-off-by: Jiri Pirko <jiri@...lanox.com> > Reviewed-by: Ido Schimmel <idosch@...lanox.com> > --- > drivers/net/bonding/bond_main.c | 2 ++ > drivers/net/team/team.c | 2 ++ > include/linux/netdevice.h | 4 ++++ > net/8021q/vlan_dev.c | 2 ++ > net/bridge/br_device.c | 2 ++ > net/core/dev.c | 32 ++++++++++++++++++++++++++++++++ > 6 files changed, 44 insertions(+) > > diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c > index 90157e2..480d73a 100644 > --- a/drivers/net/bonding/bond_main.c > +++ b/drivers/net/bonding/bond_main.c > @@ -4137,6 +4137,8 @@ static const struct net_device_ops bond_netdev_ops = { > .ndo_add_slave = bond_enslave, > .ndo_del_slave = bond_release, > .ndo_fix_features = bond_fix_features, > + .ndo_neigh_construct = netdev_default_l2upper_neigh_construct, > + .ndo_neigh_destroy = netdev_default_l2upper_neigh_destroy, > .ndo_bridge_setlink = switchdev_port_bridge_setlink, > .ndo_bridge_getlink = switchdev_port_bridge_getlink, > .ndo_bridge_dellink = switchdev_port_bridge_dellink, > diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c > index f9eebea..a380649 100644 > --- a/drivers/net/team/team.c > +++ b/drivers/net/team/team.c > @@ -2002,6 +2002,8 @@ static const struct net_device_ops team_netdev_ops = { > .ndo_add_slave = team_add_slave, > .ndo_del_slave = team_del_slave, > .ndo_fix_features = team_fix_features, > + .ndo_neigh_construct = netdev_default_l2upper_neigh_construct, > + .ndo_neigh_destroy = netdev_default_l2upper_neigh_destroy, > .ndo_change_carrier = team_change_carrier, > .ndo_bridge_setlink = switchdev_port_bridge_setlink, > .ndo_bridge_getlink = switchdev_port_bridge_getlink, > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h > index f126119..fac5132 100644 > --- a/include/linux/netdevice.h > +++ b/include/linux/netdevice.h > @@ -3826,6 +3826,10 @@ void *netdev_lower_dev_get_private(struct net_device *dev, > struct net_device *lower_dev); > void netdev_lower_state_changed(struct net_device *lower_dev, > void *lower_state_info); > +int netdev_default_l2upper_neigh_construct(struct net_device *dev, > + struct neighbour *n); > +void netdev_default_l2upper_neigh_destroy(struct net_device *dev, > + struct neighbour *n); > > /* RSS keys are 40 or 52 bytes long */ > #define NETDEV_RSS_KEY_LEN 52 > diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c > index 86ae75b..c8f422c 100644 > --- a/net/8021q/vlan_dev.c > +++ b/net/8021q/vlan_dev.c > @@ -790,6 +790,8 @@ static const struct net_device_ops vlan_netdev_ops = { > .ndo_netpoll_cleanup = vlan_dev_netpoll_cleanup, > #endif > .ndo_fix_features = vlan_dev_fix_features, > + .ndo_neigh_construct = netdev_default_l2upper_neigh_construct, > + .ndo_neigh_destroy = netdev_default_l2upper_neigh_destroy, > .ndo_fdb_add = switchdev_port_fdb_add, > .ndo_fdb_del = switchdev_port_fdb_del, > .ndo_fdb_dump = switchdev_port_fdb_dump, > diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c > index 0c39e0f..8eecd0e 100644 > --- a/net/bridge/br_device.c > +++ b/net/bridge/br_device.c > @@ -349,6 +349,8 @@ static const struct net_device_ops br_netdev_ops = { > .ndo_add_slave = br_add_slave, > .ndo_del_slave = br_del_slave, > .ndo_fix_features = br_fix_features, > + .ndo_neigh_construct = netdev_default_l2upper_neigh_construct, > + .ndo_neigh_destroy = netdev_default_l2upper_neigh_destroy, > .ndo_fdb_add = br_fdb_add, > .ndo_fdb_del = br_fdb_delete, > .ndo_fdb_dump = br_fdb_dump, > diff --git a/net/core/dev.c b/net/core/dev.c > index aba10d2..eb13647 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -6041,6 +6041,38 @@ void netdev_lower_state_changed(struct net_device *lower_dev, > } > EXPORT_SYMBOL(netdev_lower_state_changed); > > +int netdev_default_l2upper_neigh_construct(struct net_device *dev, > + struct neighbour *n) > +{ > + struct net_device *lower_dev; > + struct list_head *iter; > + int err; > + > + netdev_for_each_lower_dev(dev, lower_dev, iter) { > + if (!lower_dev->netdev_ops->ndo_neigh_construct) > + continue; > + err = lower_dev->netdev_ops->ndo_neigh_construct(lower_dev, n); > + if (err) > + return err; If the Mth lower_dev of N total fails why not call destroy on the first M-1? > + } > + return 0; > +} > +EXPORT_SYMBOL(netdev_default_l2upper_neigh_construct); _GPL? > + > +void netdev_default_l2upper_neigh_destroy(struct net_device *dev, > + struct neighbour *n) > +{ > + struct net_device *lower_dev; > + struct list_head *iter; > + > + netdev_for_each_lower_dev(dev, lower_dev, iter) { > + if (!lower_dev->netdev_ops->ndo_neigh_destroy) > + continue; > + lower_dev->netdev_ops->ndo_neigh_destroy(lower_dev, n); > + } > +} > +EXPORT_SYMBOL(netdev_default_l2upper_neigh_destroy); _GPL? > + > static void dev_change_rx_flags(struct net_device *dev, int flags) > { > const struct net_device_ops *ops = dev->netdev_ops; > I do not see either of the new functions being called in this patch set; only hit grep shows is this patch.
Powered by blists - more mailing lists