Commit 29bf24af authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

net: add possibility to pass information about upper device via notifier

Sometimes the drivers and other code would find it handy to know some
internal information about upper device being changed. So allow upper-code
to pass information down to notifier listeners during linking.
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6dffb044
...@@ -1204,7 +1204,7 @@ static int bond_master_upper_dev_link(struct net_device *bond_dev, ...@@ -1204,7 +1204,7 @@ static int bond_master_upper_dev_link(struct net_device *bond_dev,
{ {
int err; int err;
err = netdev_master_upper_dev_link(slave_dev, bond_dev, slave); err = netdev_master_upper_dev_link(slave_dev, bond_dev, slave, NULL);
if (err) if (err)
return err; return err;
slave_dev->flags |= IFF_SLAVE; slave_dev->flags |= IFF_SLAVE;
......
...@@ -1083,7 +1083,7 @@ static int team_upper_dev_link(struct net_device *dev, ...@@ -1083,7 +1083,7 @@ static int team_upper_dev_link(struct net_device *dev,
{ {
int err; int err;
err = netdev_master_upper_dev_link(port_dev, dev, NULL); err = netdev_master_upper_dev_link(port_dev, dev, NULL, NULL);
if (err) if (err)
return err; return err;
port_dev->priv_flags |= IFF_TEAM_PORT; port_dev->priv_flags |= IFF_TEAM_PORT;
......
...@@ -624,7 +624,7 @@ static int do_vrf_add_slave(struct net_device *dev, struct net_device *port_dev) ...@@ -624,7 +624,7 @@ static int do_vrf_add_slave(struct net_device *dev, struct net_device *port_dev)
goto out_fail; goto out_fail;
} }
ret = netdev_master_upper_dev_link(port_dev, dev, NULL); ret = netdev_master_upper_dev_link(port_dev, dev, NULL, NULL);
if (ret < 0) if (ret < 0)
goto out_unregister; goto out_unregister;
......
...@@ -2163,6 +2163,7 @@ struct netdev_notifier_changeupper_info { ...@@ -2163,6 +2163,7 @@ struct netdev_notifier_changeupper_info {
struct net_device *upper_dev; /* new upper dev */ struct net_device *upper_dev; /* new upper dev */
bool master; /* is upper dev master */ bool master; /* is upper dev master */
bool linking; /* is the nofication for link or unlink */ bool linking; /* is the nofication for link or unlink */
void *upper_info; /* upper dev info */
}; };
static inline void netdev_notifier_info_init(struct netdev_notifier_info *info, static inline void netdev_notifier_info_init(struct netdev_notifier_info *info,
...@@ -3620,7 +3621,7 @@ struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev); ...@@ -3620,7 +3621,7 @@ struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev);
int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev); int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev);
int netdev_master_upper_dev_link(struct net_device *dev, int netdev_master_upper_dev_link(struct net_device *dev,
struct net_device *upper_dev, struct net_device *upper_dev,
void *upper_priv); void *upper_priv, void *upper_info);
void netdev_upper_dev_unlink(struct net_device *dev, void netdev_upper_dev_unlink(struct net_device *dev,
struct net_device *upper_dev); struct net_device *upper_dev);
void netdev_adjacent_rename_links(struct net_device *dev, char *oldname); void netdev_adjacent_rename_links(struct net_device *dev, char *oldname);
......
...@@ -465,7 +465,7 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface, ...@@ -465,7 +465,7 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
bat_priv = netdev_priv(hard_iface->soft_iface); bat_priv = netdev_priv(hard_iface->soft_iface);
ret = netdev_master_upper_dev_link(hard_iface->net_dev, ret = netdev_master_upper_dev_link(hard_iface->net_dev,
soft_iface, NULL); soft_iface, NULL, NULL);
if (ret) if (ret)
goto err_dev; goto err_dev;
......
...@@ -493,7 +493,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) ...@@ -493,7 +493,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
dev->priv_flags |= IFF_BRIDGE_PORT; dev->priv_flags |= IFF_BRIDGE_PORT;
err = netdev_master_upper_dev_link(dev, br->dev, NULL); err = netdev_master_upper_dev_link(dev, br->dev, NULL, NULL);
if (err) if (err)
goto err5; goto err5;
......
...@@ -5421,7 +5421,7 @@ static void __netdev_adjacent_dev_unlink_neighbour(struct net_device *dev, ...@@ -5421,7 +5421,7 @@ static void __netdev_adjacent_dev_unlink_neighbour(struct net_device *dev,
static int __netdev_upper_dev_link(struct net_device *dev, static int __netdev_upper_dev_link(struct net_device *dev,
struct net_device *upper_dev, bool master, struct net_device *upper_dev, bool master,
void *upper_priv) void *upper_priv, void *upper_info)
{ {
struct netdev_notifier_changeupper_info changeupper_info; struct netdev_notifier_changeupper_info changeupper_info;
struct netdev_adjacent *i, *j, *to_i, *to_j; struct netdev_adjacent *i, *j, *to_i, *to_j;
...@@ -5445,6 +5445,7 @@ static int __netdev_upper_dev_link(struct net_device *dev, ...@@ -5445,6 +5445,7 @@ static int __netdev_upper_dev_link(struct net_device *dev,
changeupper_info.upper_dev = upper_dev; changeupper_info.upper_dev = upper_dev;
changeupper_info.master = master; changeupper_info.master = master;
changeupper_info.linking = true; changeupper_info.linking = true;
changeupper_info.upper_info = upper_info;
ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, dev, ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, dev,
&changeupper_info.info); &changeupper_info.info);
...@@ -5549,7 +5550,7 @@ static int __netdev_upper_dev_link(struct net_device *dev, ...@@ -5549,7 +5550,7 @@ static int __netdev_upper_dev_link(struct net_device *dev,
int netdev_upper_dev_link(struct net_device *dev, int netdev_upper_dev_link(struct net_device *dev,
struct net_device *upper_dev) struct net_device *upper_dev)
{ {
return __netdev_upper_dev_link(dev, upper_dev, false, NULL); return __netdev_upper_dev_link(dev, upper_dev, false, NULL, NULL);
} }
EXPORT_SYMBOL(netdev_upper_dev_link); EXPORT_SYMBOL(netdev_upper_dev_link);
...@@ -5558,6 +5559,7 @@ EXPORT_SYMBOL(netdev_upper_dev_link); ...@@ -5558,6 +5559,7 @@ EXPORT_SYMBOL(netdev_upper_dev_link);
* @dev: device * @dev: device
* @upper_dev: new upper device * @upper_dev: new upper device
* @upper_priv: upper device private * @upper_priv: upper device private
* @upper_info: upper info to be passed down via notifier
* *
* Adds a link to device which is upper to this one. In this case, only * Adds a link to device which is upper to this one. In this case, only
* one master upper device can be linked, although other non-master devices * one master upper device can be linked, although other non-master devices
...@@ -5567,9 +5569,10 @@ EXPORT_SYMBOL(netdev_upper_dev_link); ...@@ -5567,9 +5569,10 @@ EXPORT_SYMBOL(netdev_upper_dev_link);
*/ */
int netdev_master_upper_dev_link(struct net_device *dev, int netdev_master_upper_dev_link(struct net_device *dev,
struct net_device *upper_dev, struct net_device *upper_dev,
void *upper_priv) void *upper_priv, void *upper_info)
{ {
return __netdev_upper_dev_link(dev, upper_dev, true, upper_priv); return __netdev_upper_dev_link(dev, upper_dev, true,
upper_priv, upper_info);
} }
EXPORT_SYMBOL(netdev_master_upper_dev_link); EXPORT_SYMBOL(netdev_master_upper_dev_link);
......
...@@ -105,7 +105,7 @@ struct vport *ovs_netdev_link(struct vport *vport, const char *name) ...@@ -105,7 +105,7 @@ struct vport *ovs_netdev_link(struct vport *vport, const char *name)
rtnl_lock(); rtnl_lock();
err = netdev_master_upper_dev_link(vport->dev, err = netdev_master_upper_dev_link(vport->dev,
get_dpdev(vport->dp), NULL); get_dpdev(vport->dp), NULL, NULL);
if (err) if (err)
goto error_unlock; goto error_unlock;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment