summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Pirko <jiri@mellanox.com>2015-12-03 06:12:11 -0500
committerDavid S. Miller <davem@davemloft.net>2015-12-03 11:49:25 -0500
commit29bf24afb29042f568fa67b1b0eee46796725ed2 (patch)
tree865e593be107511f4032b41c09fd252e317cd540
parent6dffb0447c25476f499d205dfceb1972e8dae919 (diff)
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: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/bonding/bond_main.c2
-rw-r--r--drivers/net/team/team.c2
-rw-r--r--drivers/net/vrf.c2
-rw-r--r--include/linux/netdevice.h3
-rw-r--r--net/batman-adv/hard-interface.c2
-rw-r--r--net/bridge/br_if.c2
-rw-r--r--net/core/dev.c11
-rw-r--r--net/openvswitch/vport-netdev.c2
8 files changed, 15 insertions, 11 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 924015729b2d..fa3ed1d8a12d 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1204,7 +1204,7 @@ static int bond_master_upper_dev_link(struct net_device *bond_dev,
1204{ 1204{
1205 int err; 1205 int err;
1206 1206
1207 err = netdev_master_upper_dev_link(slave_dev, bond_dev, slave); 1207 err = netdev_master_upper_dev_link(slave_dev, bond_dev, slave, NULL);
1208 if (err) 1208 if (err)
1209 return err; 1209 return err;
1210 slave_dev->flags |= IFF_SLAVE; 1210 slave_dev->flags |= IFF_SLAVE;
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
index b37f8d14dca0..f7b6ff7948b8 100644
--- a/drivers/net/team/team.c
+++ b/drivers/net/team/team.c
@@ -1083,7 +1083,7 @@ static int team_upper_dev_link(struct net_device *dev,
1083{ 1083{
1084 int err; 1084 int err;
1085 1085
1086 err = netdev_master_upper_dev_link(port_dev, dev, NULL); 1086 err = netdev_master_upper_dev_link(port_dev, dev, NULL, NULL);
1087 if (err) 1087 if (err)
1088 return err; 1088 return err;
1089 port_dev->priv_flags |= IFF_TEAM_PORT; 1089 port_dev->priv_flags |= IFF_TEAM_PORT;
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
index 59c5bddeaedd..8944a49cda15 100644
--- a/drivers/net/vrf.c
+++ b/drivers/net/vrf.c
@@ -624,7 +624,7 @@ static int do_vrf_add_slave(struct net_device *dev, struct net_device *port_dev)
624 goto out_fail; 624 goto out_fail;
625 } 625 }
626 626
627 ret = netdev_master_upper_dev_link(port_dev, dev, NULL); 627 ret = netdev_master_upper_dev_link(port_dev, dev, NULL, NULL);
628 if (ret < 0) 628 if (ret < 0)
629 goto out_unregister; 629 goto out_unregister;
630 630
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 939b8f3de810..aea556c64f2c 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2163,6 +2163,7 @@ struct netdev_notifier_changeupper_info {
2163 struct net_device *upper_dev; /* new upper dev */ 2163 struct net_device *upper_dev; /* new upper dev */
2164 bool master; /* is upper dev master */ 2164 bool master; /* is upper dev master */
2165 bool linking; /* is the nofication for link or unlink */ 2165 bool linking; /* is the nofication for link or unlink */
2166 void *upper_info; /* upper dev info */
2166}; 2167};
2167 2168
2168static inline void netdev_notifier_info_init(struct netdev_notifier_info *info, 2169static 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);
3620int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev); 3621int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev);
3621int netdev_master_upper_dev_link(struct net_device *dev, 3622int netdev_master_upper_dev_link(struct net_device *dev,
3622 struct net_device *upper_dev, 3623 struct net_device *upper_dev,
3623 void *upper_priv); 3624 void *upper_priv, void *upper_info);
3624void netdev_upper_dev_unlink(struct net_device *dev, 3625void netdev_upper_dev_unlink(struct net_device *dev,
3625 struct net_device *upper_dev); 3626 struct net_device *upper_dev);
3626void netdev_adjacent_rename_links(struct net_device *dev, char *oldname); 3627void netdev_adjacent_rename_links(struct net_device *dev, char *oldname);
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
index a7f4f1085dbb..aa8867e1d983 100644
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -465,7 +465,7 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
465 bat_priv = netdev_priv(hard_iface->soft_iface); 465 bat_priv = netdev_priv(hard_iface->soft_iface);
466 466
467 ret = netdev_master_upper_dev_link(hard_iface->net_dev, 467 ret = netdev_master_upper_dev_link(hard_iface->net_dev,
468 soft_iface, NULL); 468 soft_iface, NULL, NULL);
469 if (ret) 469 if (ret)
470 goto err_dev; 470 goto err_dev;
471 471
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index 781abc34667a..8d1d4a22c50d 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -493,7 +493,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
493 493
494 dev->priv_flags |= IFF_BRIDGE_PORT; 494 dev->priv_flags |= IFF_BRIDGE_PORT;
495 495
496 err = netdev_master_upper_dev_link(dev, br->dev, NULL); 496 err = netdev_master_upper_dev_link(dev, br->dev, NULL, NULL);
497 if (err) 497 if (err)
498 goto err5; 498 goto err5;
499 499
diff --git a/net/core/dev.c b/net/core/dev.c
index 27d052bb78bc..8ed886663c6d 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5421,7 +5421,7 @@ static void __netdev_adjacent_dev_unlink_neighbour(struct net_device *dev,
5421 5421
5422static int __netdev_upper_dev_link(struct net_device *dev, 5422static int __netdev_upper_dev_link(struct net_device *dev,
5423 struct net_device *upper_dev, bool master, 5423 struct net_device *upper_dev, bool master,
5424 void *upper_priv) 5424 void *upper_priv, void *upper_info)
5425{ 5425{
5426 struct netdev_notifier_changeupper_info changeupper_info; 5426 struct netdev_notifier_changeupper_info changeupper_info;
5427 struct netdev_adjacent *i, *j, *to_i, *to_j; 5427 struct netdev_adjacent *i, *j, *to_i, *to_j;
@@ -5445,6 +5445,7 @@ static int __netdev_upper_dev_link(struct net_device *dev,
5445 changeupper_info.upper_dev = upper_dev; 5445 changeupper_info.upper_dev = upper_dev;
5446 changeupper_info.master = master; 5446 changeupper_info.master = master;
5447 changeupper_info.linking = true; 5447 changeupper_info.linking = true;
5448 changeupper_info.upper_info = upper_info;
5448 5449
5449 ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, dev, 5450 ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, dev,
5450 &changeupper_info.info); 5451 &changeupper_info.info);
@@ -5549,7 +5550,7 @@ rollback_mesh:
5549int netdev_upper_dev_link(struct net_device *dev, 5550int netdev_upper_dev_link(struct net_device *dev,
5550 struct net_device *upper_dev) 5551 struct net_device *upper_dev)
5551{ 5552{
5552 return __netdev_upper_dev_link(dev, upper_dev, false, NULL); 5553 return __netdev_upper_dev_link(dev, upper_dev, false, NULL, NULL);
5553} 5554}
5554EXPORT_SYMBOL(netdev_upper_dev_link); 5555EXPORT_SYMBOL(netdev_upper_dev_link);
5555 5556
@@ -5558,6 +5559,7 @@ EXPORT_SYMBOL(netdev_upper_dev_link);
5558 * @dev: device 5559 * @dev: device
5559 * @upper_dev: new upper device 5560 * @upper_dev: new upper device
5560 * @upper_priv: upper device private 5561 * @upper_priv: upper device private
5562 * @upper_info: upper info to be passed down via notifier
5561 * 5563 *
5562 * Adds a link to device which is upper to this one. In this case, only 5564 * Adds a link to device which is upper to this one. In this case, only
5563 * one master upper device can be linked, although other non-master devices 5565 * one master upper device can be linked, although other non-master devices
@@ -5567,9 +5569,10 @@ EXPORT_SYMBOL(netdev_upper_dev_link);
5567 */ 5569 */
5568int netdev_master_upper_dev_link(struct net_device *dev, 5570int netdev_master_upper_dev_link(struct net_device *dev,
5569 struct net_device *upper_dev, 5571 struct net_device *upper_dev,
5570 void *upper_priv) 5572 void *upper_priv, void *upper_info)
5571{ 5573{
5572 return __netdev_upper_dev_link(dev, upper_dev, true, upper_priv); 5574 return __netdev_upper_dev_link(dev, upper_dev, true,
5575 upper_priv, upper_info);
5573} 5576}
5574EXPORT_SYMBOL(netdev_master_upper_dev_link); 5577EXPORT_SYMBOL(netdev_master_upper_dev_link);
5575 5578
diff --git a/net/openvswitch/vport-netdev.c b/net/openvswitch/vport-netdev.c
index 3ee3df1edeae..8f4dd4c39bfe 100644
--- a/net/openvswitch/vport-netdev.c
+++ b/net/openvswitch/vport-netdev.c
@@ -105,7 +105,7 @@ struct vport *ovs_netdev_link(struct vport *vport, const char *name)
105 105
106 rtnl_lock(); 106 rtnl_lock();
107 err = netdev_master_upper_dev_link(vport->dev, 107 err = netdev_master_upper_dev_link(vport->dev,
108 get_dpdev(vport->dp), NULL); 108 get_dpdev(vport->dp), NULL, NULL);
109 if (err) 109 if (err)
110 goto error_unlock; 110 goto error_unlock;
111 111