Commit f44a3ae9 authored by Marek Lindner's avatar Marek Lindner Committed by Simon Wunderlich

batman-adv: refactor wifi interface detection

The ELP protocol requires cfg80211 to auto-detect the WiFi througput
to a given neighbor. Use batadv_is_cfg80211_netdev() to determine
whether or not an interface is eligible.
Signed-off-by: default avatarMarek Lindner <mareklindner@neomailbox.ch>
Signed-off-by: default avatarSven Eckelmann <sven.eckelmann@open-mesh.com>
Signed-off-by: default avatarSimon Wunderlich <sw@simonwunderlich.de>
parent 88ffc7d0
...@@ -90,22 +90,21 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh) ...@@ -90,22 +90,21 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh)
* cfg80211 API * cfg80211 API
*/ */
if (batadv_is_wifi_netdev(hard_iface->net_dev)) { if (batadv_is_wifi_netdev(hard_iface->net_dev)) {
if (hard_iface->net_dev->ieee80211_ptr) { if (!batadv_is_cfg80211_netdev(hard_iface->net_dev))
ret = cfg80211_get_station(hard_iface->net_dev, /* unsupported WiFi driver version */
neigh->addr, &sinfo); goto default_throughput;
if (ret == -ENOENT) {
/* Node is not associated anymore! It would be ret = cfg80211_get_station(hard_iface->net_dev,
* possible to delete this neighbor. For now set neigh->addr, &sinfo);
* the throughput metric to 0. if (ret == -ENOENT) {
*/ /* Node is not associated anymore! It would be
return 0; * possible to delete this neighbor. For now set
} * the throughput metric to 0.
if (!ret) */
return sinfo.expected_throughput / 100; return 0;
} }
if (!ret)
/* unsupported WiFi driver version */ return sinfo.expected_throughput / 100;
goto default_throughput;
} }
/* if not a wifi interface, check if this device provides data via /* if not a wifi interface, check if this device provides data via
......
...@@ -201,6 +201,26 @@ static bool batadv_is_valid_iface(const struct net_device *net_dev) ...@@ -201,6 +201,26 @@ static bool batadv_is_valid_iface(const struct net_device *net_dev)
return true; return true;
} }
/**
* batadv_is_cfg80211_netdev - check if the given net_device struct is a
* cfg80211 wifi interface
* @net_device: the device to check
*
* Return: true if the net device is a cfg80211 wireless device, false
* otherwise.
*/
bool batadv_is_cfg80211_netdev(struct net_device *net_device)
{
if (!net_device)
return false;
/* cfg80211 drivers have to set ieee80211_ptr */
if (net_device->ieee80211_ptr)
return true;
return false;
}
/** /**
* batadv_is_wifi_netdev - check if the given net_device struct is a wifi * batadv_is_wifi_netdev - check if the given net_device struct is a wifi
* interface * interface
...@@ -221,11 +241,7 @@ bool batadv_is_wifi_netdev(struct net_device *net_device) ...@@ -221,11 +241,7 @@ bool batadv_is_wifi_netdev(struct net_device *net_device)
return true; return true;
#endif #endif
/* cfg80211 drivers have to set ieee80211_ptr */ return batadv_is_cfg80211_netdev(net_device);
if (net_device->ieee80211_ptr)
return true;
return false;
} }
/** /**
......
...@@ -65,6 +65,7 @@ enum batadv_hard_if_cleanup { ...@@ -65,6 +65,7 @@ enum batadv_hard_if_cleanup {
extern struct notifier_block batadv_hard_if_notifier; extern struct notifier_block batadv_hard_if_notifier;
bool batadv_is_cfg80211_netdev(struct net_device *net_device);
bool batadv_is_wifi_netdev(struct net_device *net_device); bool batadv_is_wifi_netdev(struct net_device *net_device);
bool batadv_is_wifi_iface(int ifindex); bool batadv_is_wifi_iface(int ifindex);
struct batadv_hard_iface* struct batadv_hard_iface*
......
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