+static struct {
+ const char *match;
+ int version;
+ int suite;
+} wpa_key_mgmt_strings[] = {
+ { "IEEE 802.1X/EAP", 0, IWINFO_KMGMT_8021x },
+ { "EAP-SUITE-B-192", 4, IWINFO_KMGMT_8021x },
+ { "EAP-SUITE-B", 4, IWINFO_KMGMT_8021x },
+ { "EAP-SHA256", 0, IWINFO_KMGMT_8021x },
+ { "PSK-SHA256", 0, IWINFO_KMGMT_PSK },
+ { "NONE", 0, IWINFO_KMGMT_NONE },
+ { "None", 0, IWINFO_KMGMT_NONE },
+ { "PSK", 0, IWINFO_KMGMT_PSK },
+ { "EAP", 0, IWINFO_KMGMT_8021x },
+ { "SAE", 4, IWINFO_KMGMT_SAE },
+ { "OWE", 4, IWINFO_KMGMT_OWE }
+};
+
+static void parse_wpa_suites(const char *str, int defversion,
+ uint8_t *versions, uint8_t *suites)
+{
+ size_t l;
+ int i, version;
+ const char *p, *q, *m, *sep = " \t\n,-+/";
+
+ for (p = str; *p; )
+ {
+ q = p;
+
+ for (i = 0; i < ARRAY_SIZE(wpa_key_mgmt_strings); i++)
+ {
+ m = wpa_key_mgmt_strings[i].match;
+ l = strlen(m);
+
+ if (!strncmp(q, m, l) && (!q[l] || strchr(sep, q[l])))
+ {
+ if (wpa_key_mgmt_strings[i].version != 0)
+ version = wpa_key_mgmt_strings[i].version;
+ else
+ version = defversion;
+
+ *versions |= version;
+ *suites |= wpa_key_mgmt_strings[i].suite;
+
+ q += l;
+ break;
+ }
+ }
+
+ if (q == p)
+ q += strcspn(q, sep);
+
+ p = q + strspn(q, sep);
+ }
+}
+
+static struct {
+ const char *match;
+ int cipher;
+} wpa_cipher_strings[] = {
+ { "WEP-104", IWINFO_CIPHER_WEP104 },
+ { "WEP-40", IWINFO_CIPHER_WEP40 },
+ { "NONE", IWINFO_CIPHER_NONE },
+ { "TKIP", IWINFO_CIPHER_TKIP },
+ { "CCMP", IWINFO_CIPHER_CCMP }
+};
+
+static void parse_wpa_ciphers(const char *str, uint8_t *ciphers)
+{
+ int i;
+ size_t l;
+ const char *m, *p, *q, *sep = " \t\n,-+/";
+
+ for (p = str; *p; )
+ {
+ q = p;
+
+ for (i = 0; i < ARRAY_SIZE(wpa_cipher_strings); i++)
+ {
+ m = wpa_cipher_strings[i].match;
+ l = strlen(m);
+
+ if (!strncmp(q, m, l) && (!q[l] || strchr(sep, q[l])))
+ {
+ *ciphers |= wpa_cipher_strings[i].cipher;
+
+ q += l;
+ break;
+ }
+ }
+
+ if (q == p)
+ q += strcspn(q, sep);
+
+ p = q + strspn(q, sep);
+ }
+}
+