#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
+#define WIFI_KEYMGMT_NONE (1 << 0)
+#define WIFI_KEYMGMT_IEEE8021X (1 << 1)
+#define WIFI_KEYMGMT_WPA_NONE (1 << 2)
+#define WIFI_KEYMGMT_WPA_PSK (1 << 3)
+#define WIFI_KEYMGMT_WPA_PSK_256 (1 << 4)
+#define WIFI_KEYMGMT_WPA_FT_PSK (1 << 5)
+#define WIFI_KEYMGMT_WPA_FT_EAP (1 << 6)
+#define WIFI_KEYMGMT_WPA_EAP (1 << 7)
+#define WIFI_KEYMGMT_WPA_EAP_256 (1 << 8)
+#define WIFI_KEYMGMT_WPS (1 << 9)
+
+#define WIFI_PAIRWISE_NONE (1 << 0)
+#define WIFI_PAIRWISE_TKIP (1 << 1)
+#define WIFI_PAIRWISE_CCMP (1 << 2)
+
+typedef struct {
+ const char *str;
+ unsigned int val;
+} strval_s;
+
+static strval_s wifi_keymgmt[] = {
+ { "none", WIFI_KEYMGMT_NONE },
+ { "ieee8021x", WIFI_KEYMGMT_IEEE8021X },
+ { "wpa-none", WIFI_KEYMGMT_WPA_NONE },
+ { "wpa-psk", WIFI_KEYMGMT_WPA_PSK },
+ { "wpa-psk-sha256", WIFI_KEYMGMT_WPA_PSK_256 },
+ { "wpa-ft-psk", WIFI_KEYMGMT_WPA_FT_PSK },
+ { "wpa-ft-eap", WIFI_KEYMGMT_WPA_FT_EAP },
+ { "wpa-eap", WIFI_KEYMGMT_WPA_EAP },
+ { "wpa-eap-sha256", WIFI_KEYMGMT_WPA_EAP_256 },
+ { "wps", WIFI_KEYMGMT_WPS },
+ { }
+};
+
+static strval_s wifi_pairwise[] = {
+ { "none", WIFI_PAIRWISE_NONE },
+ { "tkip", WIFI_PAIRWISE_TKIP },
+ { "ccmp", WIFI_PAIRWISE_CCMP },
+ { }
+};
+
typedef enum {
WIFI_SECURITY_UNKNOWN = 0x00,
- WIFI_SECURITY_NONE = 0x01,
- WIFI_SECURITY_WEP = 0x02,
- WIFI_SECURITY_PSK = 0x03,
- WIFI_SECURITY_IEEE8021X = 0x04,
+ WIFI_SECURITY_NONE,
+ WIFI_SECURITY_WEP,
+ WIFI_SECURITY_PSK,
+ WIFI_SECURITY_PSK2,
+ WIFI_SECURITY_IEEE8021X,
} wifi_security_e;
typedef struct {
unsigned char ssid[33];
unsigned char bssid[6];
wifi_security_e security;
+ unsigned int wpa_keymgmt;
+ unsigned int wpa_pairwise;
+ unsigned int rsn_keymgmt;
+ unsigned int rsn_pairwise;
+ gboolean rsn_selected;
gboolean privacy;
gboolean wps;
} bss_info_t;
static guint ssid_scan_timer = 0;
static char *g_ssid = NULL;
-static void __check_security(const char *str_keymgmt, bss_info_t *bss_info)
+static void __check_keymgmt(const char *str_keymgmt, unsigned int *key_info)
+{
+ int i;
+
+ for (i = 0; wifi_keymgmt[i].str; i++) {
+ if (g_strcmp0(str_keymgmt, wifi_keymgmt[i].str) == 0) {
+ INFO("keymgmt : %s", str_keymgmt);
+ *key_info |= wifi_keymgmt[i].val;
+ break;
+ }
+ }
+}
+
+static void __check_pairwise(const char *str_pairwise, unsigned int *pairwise_info)
{
- INFO("keymgmt : %s", str_keymgmt);
+ int i;
+
+ for (i = 0; wifi_pairwise[i].str; i++) {
+ if (g_strcmp0(str_pairwise, wifi_pairwise[i].str) == 0) {
+ INFO("pairwise : %s", str_pairwise);
+ *pairwise_info |= wifi_pairwise[i].val;
+ break;
+ }
+ }
+}
- if (g_strcmp0(str_keymgmt, "ieee8021x") == 0)
+static wifi_security_e __check_security(bss_info_t *bss_info)
+{
+ gboolean ieee8021x = FALSE;
+ gboolean psk = FALSE;
+ gboolean ft_ieee8021x = FALSE;
+ gboolean ft_psk = FALSE;
+ unsigned int keymgmt = bss_info->rsn_keymgmt | bss_info->wpa_keymgmt;
+
+ if (keymgmt & (WIFI_KEYMGMT_WPA_EAP | WIFI_KEYMGMT_WPA_EAP_256))
+ ieee8021x = TRUE;
+ else if (keymgmt & WIFI_KEYMGMT_WPA_FT_EAP)
+ ft_ieee8021x = TRUE;
+
+ if (keymgmt & (WIFI_KEYMGMT_WPA_PSK | WIFI_KEYMGMT_WPA_PSK_256))
+ psk = TRUE;
+ else if (keymgmt & WIFI_KEYMGMT_WPA_FT_PSK)
+ ft_psk = TRUE;
+
+ if (ieee8021x || ft_ieee8021x)
bss_info->security = WIFI_SECURITY_IEEE8021X;
- else if (g_strcmp0(str_keymgmt, "wpa-psk") == 0)
- bss_info->security = WIFI_SECURITY_PSK;
- else if (g_strcmp0(str_keymgmt, "wpa-psk-sha256") == 0)
- bss_info->security = WIFI_SECURITY_PSK;
- else if (g_strcmp0(str_keymgmt, "wpa-ft-psk") == 0)
+ else if (psk || ft_psk)
bss_info->security = WIFI_SECURITY_PSK;
- else if (g_strcmp0(str_keymgmt, "wpa-ft-eap") == 0)
- bss_info->security = WIFI_SECURITY_IEEE8021X;
- else if (g_strcmp0(str_keymgmt, "wpa-eap") == 0)
- bss_info->security = WIFI_SECURITY_IEEE8021X;
- else if (g_strcmp0(str_keymgmt, "wpa-eap-sha256") == 0)
- bss_info->security = WIFI_SECURITY_IEEE8021X;
- else if (g_strcmp0(str_keymgmt, "wps") == 0)
- bss_info->wps = TRUE;
+ else if (bss_info->privacy)
+ bss_info->security = WIFI_SECURITY_WEP;
+ else
+ bss_info->security = WIFI_SECURITY_NONE;
+
+ if (bss_info->rsn_selected) {
+ unsigned int pairwise = bss_info->rsn_pairwise | bss_info->wpa_pairwise;
+ if ((pairwise & WIFI_PAIRWISE_CCMP) ||
+ (pairwise & (WIFI_PAIRWISE_CCMP | WIFI_PAIRWISE_TKIP)))
+ bss_info->security = WIFI_SECURITY_PSK2;
+ }
+
+ return bss_info->security;
}
static gboolean __ssid_scan_timeout(gpointer data)
netconfig_stop_timer(&ssid_scan_timer);
}
-static void _parse_keymgmt_message(GVariant *param, bss_info_t *bss_info)
+static void _parse_wpa_message(GVariant *param, bss_info_t *bss_info)
{
GVariantIter *iter1;
GVariant *var;
while (g_variant_iter_loop(iter2, "s", &str)) {
if (str == NULL)
break;
- __check_security(str, bss_info);
+ unsigned int key_info = 0;
+ __check_keymgmt(str, &key_info);
+ if (bss_info->rsn_selected)
+ bss_info->rsn_keymgmt = key_info;
+ else
+ bss_info->wpa_keymgmt = key_info;
+ }
+ g_variant_iter_free(iter2);
+ } else if (g_strcmp0(key, "Pairwise") == 0) {
+ GVariantIter *iter2;
+ g_variant_get(var, "as", &iter2);
+ char *str;
+ while (g_variant_iter_loop(iter2, "s", &str)) {
+ if (str == NULL)
+ break;
+ unsigned int pairwise_info = 0;
+ __check_pairwise(str, &pairwise_info);
+ if (bss_info->rsn_selected)
+ bss_info->rsn_pairwise = pairwise_info;
+ else
+ bss_info->wpa_pairwise = pairwise_info;
}
g_variant_iter_free(iter2);
}
if (bss_info && g_strcmp0((char *)bss_info->ssid, g_ssid) == 0) {
const gchar *ssid = (char *)bss_info->ssid;
const gchar *bssid = (gchar *)&bss_info->bssid[0];
- wifi_security_e security = bss_info->security;
+ wifi_security_e security = __check_security(bss_info);
gboolean wps = bss_info->wps;
DBG("BSS found; SSID:%s security:%d WPS:%d", ssid, security, wps);
gboolean privacy = FALSE;
privacy = g_variant_get_boolean(value);
bss_info->privacy = privacy;
- } else if ((g_strcmp0(key, "RSN") == 0) || (g_strcmp0(key, "WPA") == 0)) {
- _parse_keymgmt_message(value, bss_info);
+ } else if (g_strcmp0(key, "RSN") == 0) {
+ bss_info->rsn_selected = TRUE;
+ _parse_wpa_message(value, bss_info);
+ } else if (g_strcmp0(key, "WPA") == 0) {
+ bss_info->rsn_selected = FALSE;
+ _parse_wpa_message(value, bss_info);
} else if (g_strcmp0(key, "IEs") == 0) {
const guchar *ie;
gsize ie_len;