cfg80211: allow finding vendor with OUI without specifying the OUI type
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Tue, 3 May 2016 13:08:07 +0000 (16:08 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 12 May 2016 09:15:42 +0000 (11:15 +0200)
This allows finding vendor IE from a specific vendor.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
net/wireless/scan.c

index 1e008cd..5f6e98a 100644 (file)
@@ -3893,7 +3893,7 @@ const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len);
  * cfg80211_find_vendor_ie - find vendor specific information element in data
  *
  * @oui: vendor OUI
- * @oui_type: vendor-specific OUI type
+ * @oui_type: vendor-specific OUI type (must be < 0xff), negative means any
  * @ies: data consisting of IEs
  * @len: length of data
  *
@@ -3905,7 +3905,7 @@ const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len);
  * Note: There are no checks on the element length other than having to fit into
  * the given data.
  */
-const u8 *cfg80211_find_vendor_ie(unsigned int oui, u8 oui_type,
+const u8 *cfg80211_find_vendor_ie(unsigned int oui, int oui_type,
                                  const u8 *ies, int len);
 
 /**
index abdf651..ef2955c 100644 (file)
@@ -364,13 +364,16 @@ const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len)
 }
 EXPORT_SYMBOL(cfg80211_find_ie);
 
-const u8 *cfg80211_find_vendor_ie(unsigned int oui, u8 oui_type,
+const u8 *cfg80211_find_vendor_ie(unsigned int oui, int oui_type,
                                  const u8 *ies, int len)
 {
        struct ieee80211_vendor_ie *ie;
        const u8 *pos = ies, *end = ies + len;
        int ie_oui;
 
+       if (WARN_ON(oui_type > 0xff))
+               return NULL;
+
        while (pos < end) {
                pos = cfg80211_find_ie(WLAN_EID_VENDOR_SPECIFIC, pos,
                                       end - pos);
@@ -386,7 +389,8 @@ const u8 *cfg80211_find_vendor_ie(unsigned int oui, u8 oui_type,
                        goto cont;
 
                ie_oui = ie->oui[0] << 16 | ie->oui[1] << 8 | ie->oui[2];
-               if (ie_oui == oui && ie->oui_type == oui_type)
+               if (ie_oui == oui &&
+                   (oui_type < 0 || ie->oui_type == oui_type))
                        return pos;
 cont:
                pos += 2 + ie->len;