[PATCH] wpa-cli: Show OSEN scan results properly.

greearb at candelatech.com greearb at candelatech.com
Tue Mar 17 16:52:29 EDT 2015


From: Ben Greear <greearb at candelatech.com>

Old code defaulted to WEP.  Show as OSEN instead.
Re-use most of the RSN parsing logic since all but the
header is the same.

Example output:

[root at ath9k-f lanforge]# ./local/bin/wpa_cli -i sta0 scan_results
bssid / frequency / signal level / flags / ssid
00:0e:8e:6f:40:49	2462	-23	[OSEN--CCMP][ESS]	ben-138

Signed-off-by: Ben Greear <greearb at candelatech.com>
---
 src/common/wpa_common.c     | 32 ++++++++++++++++++++++----------
 src/rsn_supp/wpa_ie.c       |  7 +++++++
 wpa_supplicant/ctrl_iface.c |  7 +++++--
 3 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/src/common/wpa_common.c b/src/common/wpa_common.c
index de81d53..07dca2d 100644
--- a/src/common/wpa_common.c
+++ b/src/common/wpa_common.c
@@ -508,7 +508,6 @@ int wpa_cipher_valid_mgmt_group(int cipher)
 int wpa_parse_wpa_ie_rsn(const u8 *rsn_ie, size_t rsn_ie_len,
 			 struct wpa_ie_data *data)
 {
-	const struct rsn_ie_hdr *hdr;
 	const u8 *pos;
 	int left;
 	int i, count;
@@ -538,18 +537,31 @@ int wpa_parse_wpa_ie_rsn(const u8 *rsn_ie, size_t rsn_ie_len,
 		return -1;
 	}
 
-	hdr = (const struct rsn_ie_hdr *) rsn_ie;
+	if (rsn_ie_len >= 6 &&
+	    rsn_ie[0] == WLAN_EID_VENDOR_SPECIFIC &&
+	    rsn_ie[5] == HS20_OSEN_OUI_TYPE) {
+		/* Assume calling code has done more specific checks on
+		   the vendor type */
+		pos = rsn_ie + 6;
+		left = rsn_ie_len - 6;
 
-	if (hdr->elem_id != WLAN_EID_RSN ||
-	    hdr->len != rsn_ie_len - 2 ||
-	    WPA_GET_LE16(hdr->version) != RSN_VERSION) {
-		wpa_printf(MSG_DEBUG, "%s: malformed ie or unknown version",
-			   __func__);
-		return -2;
+		data->proto = WPA_PROTO_OSEN;
 	}
+	else {
+		const struct rsn_ie_hdr *hdr;
+		hdr = (const struct rsn_ie_hdr *) rsn_ie;
+
+		if (hdr->elem_id != WLAN_EID_RSN ||
+		    hdr->len != rsn_ie_len - 2 ||
+		    WPA_GET_LE16(hdr->version) != RSN_VERSION) {
+			wpa_printf(MSG_DEBUG, "%s: malformed ie or unknown version",
+				   __func__);
+			return -2;
+		}
 
-	pos = (const u8 *) (hdr + 1);
-	left = rsn_ie_len - sizeof(*hdr);
+		pos = (const u8 *) (hdr + 1);
+		left = rsn_ie_len - sizeof(*hdr);
+	}
 
 	if (left >= RSN_SELECTOR_LEN) {
 		data->group_cipher = rsn_selector_to_bitfield(pos);
diff --git a/src/rsn_supp/wpa_ie.c b/src/rsn_supp/wpa_ie.c
index cb334df..983306e 100644
--- a/src/rsn_supp/wpa_ie.c
+++ b/src/rsn_supp/wpa_ie.c
@@ -30,6 +30,13 @@ int wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len,
 {
 	if (wpa_ie_len >= 1 && wpa_ie[0] == WLAN_EID_RSN)
 		return wpa_parse_wpa_ie_rsn(wpa_ie, wpa_ie_len, data);
+	else if (wpa_ie_len >= 6 && wpa_ie[0] == WLAN_EID_VENDOR_SPECIFIC &&
+		 wpa_ie[2] == ((WLAN_AKM_SUITE_OSEN >> 24) & 0xFF) &&
+		 wpa_ie[3] == ((WLAN_AKM_SUITE_OSEN >> 16) & 0xFF) &&
+		 wpa_ie[4] == ((WLAN_AKM_SUITE_OSEN >> 8) & 0xFF) &&
+		 wpa_ie[5] == HS20_OSEN_OUI_TYPE) {
+		return wpa_parse_wpa_ie_rsn(wpa_ie, wpa_ie_len, data);
+	}
 	else
 		return wpa_parse_wpa_ie_wpa(wpa_ie, wpa_ie_len, data);
 }
diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index dce4557..4902db4 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -2460,7 +2460,7 @@ static int wpa_supplicant_ctrl_iface_scan_result(
 {
 	char *pos, *end;
 	int ret;
-	const u8 *ie, *ie2, *p2p, *mesh;
+	const u8 *ie, *ie2, *osen_ie, *p2p, *mesh;
 
 	mesh = wpa_bss_get_ie(bss, WLAN_EID_MESH_ID);
 	p2p = wpa_bss_get_vendor_ie(bss, P2P_IE_VENDOR_TYPE);
@@ -2479,7 +2479,10 @@ static int wpa_supplicant_ctrl_iface_scan_result(
 	if (os_snprintf_error(end - pos, ret))
 		return -1;
 	pos += ret;
+	osen_ie = wpa_bss_get_vendor_ie(bss, OSEN_IE_VENDOR_TYPE);
 	ie = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
+	if (osen_ie)
+		pos = wpa_supplicant_ie_txt(pos, end, "OSEN", osen_ie, 2 + osen_ie[1]);
 	if (ie)
 		pos = wpa_supplicant_ie_txt(pos, end, "WPA", ie, 2 + ie[1]);
 	ie2 = wpa_bss_get_ie(bss, WLAN_EID_RSN);
@@ -2488,7 +2491,7 @@ static int wpa_supplicant_ctrl_iface_scan_result(
 					    ie2, 2 + ie2[1]);
 	}
 	pos = wpa_supplicant_wps_ie_txt(wpa_s, pos, end, bss);
-	if (!ie && !ie2 && bss->caps & IEEE80211_CAP_PRIVACY) {
+	if (!ie && !ie2 && !osen_ie && bss->caps & IEEE80211_CAP_PRIVACY) {
 		ret = os_snprintf(pos, end - pos, "[WEP]");
 		if (os_snprintf_error(end - pos, ret))
 			return -1;
-- 
1.7.11.7



More information about the HostAP mailing list