Skip to content

Commit 18bfb92

Browse files
jpirkodavem330
authored andcommitted
net: introduce default neigh_construct/destroy ndo calls for L2 upper devices
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 <[email protected]> Reviewed-by: Ido Schimmel <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 503eebc commit 18bfb92

File tree

6 files changed

+56
-0
lines changed

6 files changed

+56
-0
lines changed

drivers/net/bonding/bond_main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4137,6 +4137,8 @@ static const struct net_device_ops bond_netdev_ops = {
41374137
.ndo_add_slave = bond_enslave,
41384138
.ndo_del_slave = bond_release,
41394139
.ndo_fix_features = bond_fix_features,
4140+
.ndo_neigh_construct = netdev_default_l2upper_neigh_construct,
4141+
.ndo_neigh_destroy = netdev_default_l2upper_neigh_destroy,
41404142
.ndo_bridge_setlink = switchdev_port_bridge_setlink,
41414143
.ndo_bridge_getlink = switchdev_port_bridge_getlink,
41424144
.ndo_bridge_dellink = switchdev_port_bridge_dellink,

drivers/net/team/team.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2002,6 +2002,8 @@ static const struct net_device_ops team_netdev_ops = {
20022002
.ndo_add_slave = team_add_slave,
20032003
.ndo_del_slave = team_del_slave,
20042004
.ndo_fix_features = team_fix_features,
2005+
.ndo_neigh_construct = netdev_default_l2upper_neigh_construct,
2006+
.ndo_neigh_destroy = netdev_default_l2upper_neigh_destroy,
20052007
.ndo_change_carrier = team_change_carrier,
20062008
.ndo_bridge_setlink = switchdev_port_bridge_setlink,
20072009
.ndo_bridge_getlink = switchdev_port_bridge_getlink,

include/linux/netdevice.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3845,6 +3845,10 @@ void *netdev_lower_dev_get_private(struct net_device *dev,
38453845
struct net_device *lower_dev);
38463846
void netdev_lower_state_changed(struct net_device *lower_dev,
38473847
void *lower_state_info);
3848+
int netdev_default_l2upper_neigh_construct(struct net_device *dev,
3849+
struct neighbour *n);
3850+
void netdev_default_l2upper_neigh_destroy(struct net_device *dev,
3851+
struct neighbour *n);
38483852

38493853
/* RSS keys are 40 or 52 bytes long */
38503854
#define NETDEV_RSS_KEY_LEN 52

net/8021q/vlan_dev.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,8 @@ static const struct net_device_ops vlan_netdev_ops = {
790790
.ndo_netpoll_cleanup = vlan_dev_netpoll_cleanup,
791791
#endif
792792
.ndo_fix_features = vlan_dev_fix_features,
793+
.ndo_neigh_construct = netdev_default_l2upper_neigh_construct,
794+
.ndo_neigh_destroy = netdev_default_l2upper_neigh_destroy,
793795
.ndo_fdb_add = switchdev_port_fdb_add,
794796
.ndo_fdb_del = switchdev_port_fdb_del,
795797
.ndo_fdb_dump = switchdev_port_fdb_dump,

net/bridge/br_device.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,8 @@ static const struct net_device_ops br_netdev_ops = {
349349
.ndo_add_slave = br_add_slave,
350350
.ndo_del_slave = br_del_slave,
351351
.ndo_fix_features = br_fix_features,
352+
.ndo_neigh_construct = netdev_default_l2upper_neigh_construct,
353+
.ndo_neigh_destroy = netdev_default_l2upper_neigh_destroy,
352354
.ndo_fdb_add = br_fdb_add,
353355
.ndo_fdb_del = br_fdb_delete,
354356
.ndo_fdb_dump = br_fdb_dump,

net/core/dev.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6087,6 +6087,50 @@ void netdev_lower_state_changed(struct net_device *lower_dev,
60876087
}
60886088
EXPORT_SYMBOL(netdev_lower_state_changed);
60896089

6090+
int netdev_default_l2upper_neigh_construct(struct net_device *dev,
6091+
struct neighbour *n)
6092+
{
6093+
struct net_device *lower_dev, *stop_dev;
6094+
struct list_head *iter;
6095+
int err;
6096+
6097+
netdev_for_each_lower_dev(dev, lower_dev, iter) {
6098+
if (!lower_dev->netdev_ops->ndo_neigh_construct)
6099+
continue;
6100+
err = lower_dev->netdev_ops->ndo_neigh_construct(lower_dev, n);
6101+
if (err) {
6102+
stop_dev = lower_dev;
6103+
goto rollback;
6104+
}
6105+
}
6106+
return 0;
6107+
6108+
rollback:
6109+
netdev_for_each_lower_dev(dev, lower_dev, iter) {
6110+
if (lower_dev == stop_dev)
6111+
break;
6112+
if (!lower_dev->netdev_ops->ndo_neigh_destroy)
6113+
continue;
6114+
lower_dev->netdev_ops->ndo_neigh_destroy(lower_dev, n);
6115+
}
6116+
return err;
6117+
}
6118+
EXPORT_SYMBOL_GPL(netdev_default_l2upper_neigh_construct);
6119+
6120+
void netdev_default_l2upper_neigh_destroy(struct net_device *dev,
6121+
struct neighbour *n)
6122+
{
6123+
struct net_device *lower_dev;
6124+
struct list_head *iter;
6125+
6126+
netdev_for_each_lower_dev(dev, lower_dev, iter) {
6127+
if (!lower_dev->netdev_ops->ndo_neigh_destroy)
6128+
continue;
6129+
lower_dev->netdev_ops->ndo_neigh_destroy(lower_dev, n);
6130+
}
6131+
}
6132+
EXPORT_SYMBOL_GPL(netdev_default_l2upper_neigh_destroy);
6133+
60906134
static void dev_change_rx_flags(struct net_device *dev, int flags)
60916135
{
60926136
const struct net_device_ops *ops = dev->netdev_ops;

0 commit comments

Comments
 (0)