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: Marek Lindner <mareklindner@neomailbox.ch> Signed-off-by: Sven Eckelmann <sven.eckelmann@open-mesh.com> Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
This commit is contained in:
parent
88ffc7d0e2
commit
f44a3ae9a2
|
@ -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
|
|
||||||
* possible to delete this neighbor. For now set
|
|
||||||
* the throughput metric to 0.
|
|
||||||
*/
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (!ret)
|
|
||||||
return sinfo.expected_throughput / 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* unsupported WiFi driver version */
|
ret = cfg80211_get_station(hard_iface->net_dev,
|
||||||
goto default_throughput;
|
neigh->addr, &sinfo);
|
||||||
|
if (ret == -ENOENT) {
|
||||||
|
/* Node is not associated anymore! It would be
|
||||||
|
* possible to delete this neighbor. For now set
|
||||||
|
* the throughput metric to 0.
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!ret)
|
||||||
|
return sinfo.expected_throughput / 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
||||||
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)
|
||||||
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 {
|
||||||
|
|
||||||
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*
|
||||||
|
|
Loading…
Reference in New Issue