[PATCH 04/19] utils: Add ssid_parse function

Ilan Peer ilan.peer at intel.com
Tue Apr 5 06:07:57 PDT 2016


From: David Spinadel <david.spinadel at intel.com>

Add a function that parses SSID in text or hex. In case of text the SSID
is enclosed in double quotes. In case of hex the ssid must include only
hex digits and not be enclosed in double quotes. The input string may
include other arguments after the SSID.

Signed-off-by: David Spinadel <david.spinadel at intel.com>
---
 src/common/ieee802_11_defs.h      |  2 --
 src/utils/common.c                | 52 +++++++++++++++++++++++++++++++++++++++
 src/utils/common.h                |  8 ++++++
 wpa_supplicant/wpa_supplicant_i.h |  5 ----
 4 files changed, 60 insertions(+), 7 deletions(-)

diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h
index 0b63328..f473f4b 100644
--- a/src/common/ieee802_11_defs.h
+++ b/src/common/ieee802_11_defs.h
@@ -1511,8 +1511,6 @@ struct rrm_link_measurement_report {
 	u8 variable[0];
 } STRUCT_PACKED;
 
-#define SSID_MAX_LEN 32
-
 /* IEEE Std 802.11ad-2012 - Multi-band element */
 struct multi_band_ie {
 	u8 eid; /* WLAN_EID_MULTI_BAND */
diff --git a/src/utils/common.c b/src/utils/common.c
index 9c7d0d4..22c4246 100644
--- a/src/utils/common.c
+++ b/src/utils/common.c
@@ -1123,3 +1123,55 @@ int is_ctrl_char(char c)
 {
 	return c > 0 && c < 32;
 }
+
+
+/*
+ * ssid_parse parses a string that contains SSID in hex or text format
+ *
+ * @buf: Input NULL terminated string that contains the SSID.
+ * @ssid: Output SSID.
+ * Returns: 0 on success, -1 otherwise.
+ *
+ * The SSID has to be enclosed in double quotes for a text mode or space
+ * or NULL terminated string of hex digits for hex mode. Buf can include
+ * additional arguments after the SSID.
+ */
+int ssid_parse(const char *buf, struct wpa_ssid_value *ssid)
+{
+	char *tmp, *res, *end;
+	size_t len;
+
+	if (!ssid)
+		return -1;
+
+	ssid->ssid_len = 0;
+
+	tmp = os_strdup(buf);
+	if (!tmp)
+		return -1;
+
+	if (*tmp != '"') {
+		end = os_strchr(tmp, ' ');
+		if (end)
+			*end = '\0';
+	} else {
+		end = os_strchr(tmp + 1, '"');
+		if (!end) {
+			os_free(tmp);
+			return -1;
+		}
+
+		end[1] = '\0';
+	}
+
+	res = wpa_config_parse_string(tmp, &len);
+	if (res && len <= SSID_MAX_LEN) {
+		ssid->ssid_len = len;
+		os_memcpy(ssid->ssid, res, len);
+	}
+
+	os_free(tmp);
+	os_free(res);
+
+	return ssid->ssid_len ? 0 : -1;
+}
diff --git a/src/utils/common.h b/src/utils/common.h
index 6f0de69..701dbb2 100644
--- a/src/utils/common.h
+++ b/src/utils/common.h
@@ -448,6 +448,13 @@ typedef u64 __bitwise le64;
 #endif /* __GNUC__ */
 #endif /* __must_check */
 
+#define SSID_MAX_LEN 32
+
+struct wpa_ssid_value {
+	u8 ssid[SSID_MAX_LEN];
+	size_t ssid_len;
+};
+
 int hwaddr_aton(const char *txt, u8 *addr);
 int hwaddr_masked_aton(const char *txt, u8 *addr, u8 *mask, u8 maskable);
 int hwaddr_compact_aton(const char *txt, u8 *addr);
@@ -464,6 +471,7 @@ int wpa_snprintf_hex_uppercase(char *buf, size_t buf_size, const u8 *data,
 			       size_t len);
 
 int hwaddr_mask_txt(char *buf, size_t len, const u8 *addr, const u8 *mask);
+int ssid_parse(const char *buf, struct wpa_ssid_value *ssid);
 
 #ifdef CONFIG_NATIVE_WINDOWS
 void wpa_unicode2ascii_inplace(TCHAR *str);
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index c485891..e6fc457 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -393,11 +393,6 @@ struct wps_ap_info {
 	u8 uuid[WPS_UUID_LEN];
 };
 
-struct wpa_ssid_value {
-	u8 ssid[SSID_MAX_LEN];
-	size_t ssid_len;
-};
-
 #define WPA_FREQ_USED_BY_INFRA_STATION BIT(0)
 #define WPA_FREQ_USED_BY_P2P_CLIENT BIT(1)
 
-- 
1.9.1




More information about the Hostap mailing list