diff options
author | Marek Lindner <mareklindner@neomailbox.ch> | 2016-09-30 16:21:05 +0300 |
---|---|---|
committer | Simon Wunderlich <sw@simonwunderlich.de> | 2016-11-08 21:02:38 +0300 |
commit | 1942de1bbac30118a96255af1d14d1449aeb1a38 (patch) | |
tree | 8f0688aa60f5634e6bd1ad8d209313942d9a56fd /net | |
parent | 5ed4a460a1d359e1e9e7f54f6c78dfa9d1586b4b (diff) | |
download | linux-1942de1bbac30118a96255af1d14d1449aeb1a38.tar.xz |
batman-adv: retrieve B.A.T.M.A.N. V WiFi neighbor stats from real interface
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
[sven.eckelmann@open-mesh.com: re-add batadv_get_real_netdev to take rtnl
semaphore for batadv_get_real_netdevice]
Signed-off-by: Sven Eckelmann <sven.eckelmann@open-mesh.com>
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
Diffstat (limited to 'net')
-rw-r--r-- | net/batman-adv/bat_v_elp.c | 10 | ||||
-rw-r--r-- | net/batman-adv/hard-interface.c | 22 | ||||
-rw-r--r-- | net/batman-adv/hard-interface.h | 1 |
3 files changed, 31 insertions, 2 deletions
diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c index 0d7868912253..f2fb2f05b6bf 100644 --- a/net/batman-adv/bat_v_elp.c +++ b/net/batman-adv/bat_v_elp.c @@ -75,6 +75,7 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh) { struct batadv_hard_iface *hard_iface = neigh->if_incoming; struct ethtool_link_ksettings link_settings; + struct net_device *real_netdev; struct station_info sinfo; u32 throughput; int ret; @@ -94,8 +95,13 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh) /* unsupported WiFi driver version */ goto default_throughput; - ret = cfg80211_get_station(hard_iface->net_dev, - neigh->addr, &sinfo); + real_netdev = batadv_get_real_netdev(hard_iface->net_dev); + if (!real_netdev) + goto default_throughput; + + ret = cfg80211_get_station(real_netdev, neigh->addr, &sinfo); + + dev_put(real_netdev); if (ret == -ENOENT) { /* Node is not associated anymore! It would be * possible to delete this neighbor. For now set diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c index df31f2fef636..ca743a5e5680 100644 --- a/net/batman-adv/hard-interface.c +++ b/net/batman-adv/hard-interface.c @@ -206,6 +206,9 @@ static bool batadv_is_valid_iface(const struct net_device *net_dev) * interface on top of another 'real' interface * @netdev: the device to check * + * Callers must hold the rtnl semaphore. You may want batadv_get_real_netdev() + * instead of this. + * * Return: the 'real' net device or the original net device and NULL in case * of an error. */ @@ -243,6 +246,25 @@ out: } /** + * batadv_get_real_netdev - check if the given net_device struct is a virtual + * interface on top of another 'real' interface + * @net_device: the device to check + * + * Return: the 'real' net device or the original net device and NULL in case + * of an error. + */ +struct net_device *batadv_get_real_netdev(struct net_device *net_device) +{ + struct net_device *real_netdev; + + rtnl_lock(); + real_netdev = batadv_get_real_netdevice(net_device); + rtnl_unlock(); + + return real_netdev; +} + +/** * batadv_is_wext_netdev - check if the given net_device struct is a * wext wifi interface * @net_device: the device to check diff --git a/net/batman-adv/hard-interface.h b/net/batman-adv/hard-interface.h index 7281dd264225..d6309a423629 100644 --- a/net/batman-adv/hard-interface.h +++ b/net/batman-adv/hard-interface.h @@ -65,6 +65,7 @@ enum batadv_hard_if_cleanup { extern struct notifier_block batadv_hard_if_notifier; +struct net_device *batadv_get_real_netdev(struct net_device *net_device); bool batadv_is_cfg80211_hardif(struct batadv_hard_iface *hard_iface); bool batadv_is_wifi_hardif(struct batadv_hard_iface *hard_iface); struct batadv_hard_iface* |