batman-adv: refactor wifi interface detection
authorMarek Lindner <mareklindner@neomailbox.ch>
Fri, 30 Sep 2016 13:21:02 +0000 (15:21 +0200)
committerSimon Wunderlich <sw@simonwunderlich.de>
Tue, 8 Nov 2016 18:02:37 +0000 (19:02 +0100)
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>
net/batman-adv/bat_v_elp.c
net/batman-adv/hard-interface.c
net/batman-adv/hard-interface.h

index 54bdd415e8dfe01a2017449b3f54eeed1df3784c..e601def12aece8d8bbe6999e0dd026b696cb30ed 100644 (file)
@@ -90,22 +90,21 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh)
         * cfg80211 API
         */
        if (batadv_is_wifi_netdev(hard_iface->net_dev)) {
-               if (hard_iface->net_dev->ieee80211_ptr) {
-                       ret = cfg80211_get_station(hard_iface->net_dev,
-                                                  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 (!batadv_is_cfg80211_netdev(hard_iface->net_dev))
+                       /* unsupported WiFi driver version */
+                       goto default_throughput;
+
+               ret = cfg80211_get_station(hard_iface->net_dev,
+                                          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;
                }
-
-               /* unsupported WiFi driver version */
-               goto default_throughput;
+               if (!ret)
+                       return sinfo.expected_throughput / 100;
        }
 
        /* if not a wifi interface, check if this device provides data via
index fdbb47eebb713ffa662cc8b1e41b165847edd67f..c3fbc1b9c8e346ac6657012fcea3eb512441b601 100644 (file)
@@ -201,6 +201,26 @@ static bool batadv_is_valid_iface(const struct net_device *net_dev)
        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
  *  interface
@@ -221,11 +241,7 @@ bool batadv_is_wifi_netdev(struct net_device *net_device)
                return true;
 #endif
 
-       /* cfg80211 drivers have to set ieee80211_ptr */
-       if (net_device->ieee80211_ptr)
-               return true;
-
-       return false;
+       return batadv_is_cfg80211_netdev(net_device);
 }
 
 /**
index a043182586e919aa0a64695c43669a8b6139fdbe..7f9acab0514cee870a764300e405eb239206709f 100644 (file)
@@ -65,6 +65,7 @@ enum batadv_hard_if_cleanup {
 
 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_iface(int ifindex);
 struct batadv_hard_iface*