From: Jiri Pirko Date: Thu, 3 Dec 2015 11:12:11 +0000 (+0100) Subject: net: add possibility to pass information about upper device via notifier X-Git-Tag: v4.1.12-124.31.3~409 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=03b83034256d6fa7cf7190e0e3254f5dfca46e63;p=users%2Fjedix%2Flinux-maple.git 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 Signed-off-by: David S. Miller (cherry picked from commit 29bf24afb29042f568fa67b1b0eee46796725ed2) Orabug: 28122104 Signed-off-by: Vijay Balakrishna Reviewed-by: Si-Wei Liu Reviewed-by: Shannon Nelson Signed-off-by: Brian Maly Conflicts: drivers/net/bonding/bond_main.c drivers/net/team/team.c drivers/net/vrf.c (vrf.c - file not present in uek4) include/linux/netdevice.h net/batman-adv/hard-interface.c net/bridge/br_if.c net/core/dev.c net/openvswitch/vport-netdev.c (conflicts are related to #of arguments to netdev_master_upper_dev_link(), which is retained to maintain kABI. To allow upper-code to pass information down to notifier during linking we have modified number of arguments to netdev_master_upper_dev_link_private()) Signed-off-by: Brian Maly --- diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 3ddeb3c10297..930e1603bb34 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -1217,7 +1217,8 @@ static int bond_master_upper_dev_link(struct net_device *bond_dev, { int err; - err = netdev_master_upper_dev_link_private(slave_dev, bond_dev, slave); + err = netdev_master_upper_dev_link_private(slave_dev, bond_dev, slave, + NULL); if (err) return err; slave_dev->flags |= IFF_SLAVE; diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 63f38d13a7e5..a3f88e8ea0c5 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -2117,6 +2117,7 @@ struct netdev_notifier_changeupper_info { struct net_device *upper_dev; /* new upper dev */ bool master; /* is upper dev master */ 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, @@ -3609,7 +3610,7 @@ int netdev_master_upper_dev_link(struct net_device *dev, struct net_device *upper_dev); int netdev_master_upper_dev_link_private(struct net_device *dev, struct net_device *upper_dev, - void *private); + void *upper_priv, void *upper_info); void netdev_upper_dev_unlink(struct net_device *dev, struct net_device *upper_dev); void netdev_adjacent_rename_links(struct net_device *dev, char *oldname); diff --git a/net/core/dev.c b/net/core/dev.c index 74e259c88b77..e7111c4b4f8d 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -5252,7 +5252,7 @@ static void __netdev_adjacent_dev_unlink_neighbour(struct net_device *dev, static int __netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev, bool master, - void *private) + void *upper_priv, void *upper_info) { struct netdev_notifier_changeupper_info changeupper_info; struct netdev_adjacent *i, *j, *to_i, *to_j; @@ -5276,8 +5276,9 @@ static int __netdev_upper_dev_link(struct net_device *dev, changeupper_info.upper_dev = upper_dev; changeupper_info.master = master; changeupper_info.linking = true; + changeupper_info.upper_info = upper_info; - ret = __netdev_adjacent_dev_link_neighbour(dev, upper_dev, private, + ret = __netdev_adjacent_dev_link_neighbour(dev, upper_dev, upper_priv, master); if (ret) return ret; @@ -5374,7 +5375,7 @@ rollback_mesh: int netdev_upper_dev_link(struct net_device *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); @@ -5392,15 +5393,23 @@ EXPORT_SYMBOL(netdev_upper_dev_link); int netdev_master_upper_dev_link(struct net_device *dev, struct net_device *upper_dev) { - return __netdev_upper_dev_link(dev, upper_dev, true, NULL); + return __netdev_upper_dev_link(dev, upper_dev, true, NULL, NULL); } EXPORT_SYMBOL(netdev_master_upper_dev_link); +/** + * netdev_master_upper_dev_link_private - Add a master link to the upper device + * @dev: device + * @upper_dev: new upper device + * @upper_priv: upper device private + * @upper_info: upper info to be passed down via notifier + */ int netdev_master_upper_dev_link_private(struct net_device *dev, struct net_device *upper_dev, - void *private) + void *upper_priv, void *upper_info) { - return __netdev_upper_dev_link(dev, upper_dev, true, private); + return __netdev_upper_dev_link(dev, upper_dev, true, upper_priv, + upper_info); } EXPORT_SYMBOL(netdev_master_upper_dev_link_private);