Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1942de1b authored by Marek Lindner's avatar Marek Lindner Committed by Simon Wunderlich
Browse files

batman-adv: retrieve B.A.T.M.A.N. V WiFi neighbor stats from real interface



Signed-off-by: default avatarMarek 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: default avatarSven Eckelmann <sven.eckelmann@open-mesh.com>
Signed-off-by: default avatarSimon Wunderlich <sw@simonwunderlich.de>
parent 5ed4a460
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -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
+22 −0
Original line number Diff line number Diff line
@@ -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.
 */
@@ -242,6 +245,25 @@ static struct net_device *batadv_get_real_netdevice(struct net_device *netdev)
	return real_netdev;
}

/**
 * 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
+1 −0
Original line number Diff line number Diff line
@@ -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*