Added support of WPA3-SAE security mode.
[platform/upstream/connman.git] / gsupplicant / supplicant.c
index 67d4d60..a7a7bd0 100644 (file)
@@ -50,6 +50,7 @@
 #define WLAN_EID_SUPP_RATES 1
 #define WLAN_EID_EXT_SUPP_RATES 50
 #define COUNTRY_CODE_LENGTH    2
+#define WIFI_BSSID_LEN_MAX 6
 #endif
 
 #define BSS_UNKNOWN_STRENGTH    -90
@@ -100,7 +101,7 @@ static struct strvalmap keymgmt_map[] = {
        { "wpa-eap",            G_SUPPLICANT_KEYMGMT_WPA_EAP    },
        { "wpa-eap-sha256",     G_SUPPLICANT_KEYMGMT_WPA_EAP_256        },
        { "wps",                G_SUPPLICANT_KEYMGMT_WPS                },
-#if defined TIZEN_EXT_WIFI_MESH
+#if defined TIZEN_EXT
        { "sae",                G_SUPPLICANT_KEYMGMT_SAE                },
 #endif
        { }
@@ -254,7 +255,7 @@ struct g_supplicant_bss {
        GSupplicantPhy_mode phy_mode;
 #endif
        unsigned int wps_capabilities;
-#if defined TIZEN_EXT_WIFI_MESH
+#if defined TIZEN_EXT
        dbus_bool_t sae;
 #endif
 };
@@ -364,7 +365,7 @@ struct interface_scan_data {
 
 #if defined TIZEN_EXT
 struct g_connman_bssids {
-       char bssid[18];
+       unsigned char bssid[WIFI_BSSID_LEN_MAX];
        uint16_t strength;
        uint16_t frequency;
 };
@@ -454,8 +455,6 @@ static const char *security2string(GSupplicantSecurity security)
                return "ft_psk";
        case G_SUPPLICANT_SECURITY_FT_IEEE8021X:
                return "ft_ieee8021x";
-#endif
-#if defined TIZEN_EXT_WIFI_MESH
        case G_SUPPLICANT_SECURITY_SAE:
                return "sae";
 #endif
@@ -1654,6 +1653,9 @@ const char *g_supplicant_network_get_enc_mode(GSupplicantNetwork *network)
                return NULL;
 
        if (network->best_bss->security == G_SUPPLICANT_SECURITY_PSK ||
+#if defined TIZEN_EXT
+           network->best_bss->security == G_SUPPLICANT_SECURITY_SAE ||
+#endif /* TIZEN_EXT */
            network->best_bss->security == G_SUPPLICANT_SECURITY_IEEE8021X) {
                unsigned int pairwise;
 
@@ -1681,6 +1683,11 @@ bool g_supplicant_network_get_rsn_mode(GSupplicantNetwork *network)
        if (network == NULL || network->best_bss == NULL)
                return 0;
 
+#if defined TIZEN_EXT
+       if (network->best_bss->security == G_SUPPLICANT_SECURITY_SAE)
+               return false;
+#endif /* TIZEN_EXT */
+
        if (network->best_bss->rsn_selected) {
                const char *mode = g_supplicant_network_get_enc_mode(network);
                if (g_strcmp0(mode, "aes") == 0 ||
@@ -1723,18 +1730,13 @@ static void update_bssid_list(gpointer key, gpointer value, gpointer user_data)
 {
        struct g_supplicant_bss *bss = value;
        struct g_connman_bssids *bssids = NULL;
-       char buff[18];
        GSList **list = (GSList **)user_data;
 
        bssids = (struct g_connman_bssids *)g_try_malloc0(sizeof(struct g_connman_bssids));
 
        if (bssids) {
-               g_snprintf(buff, 18, "%02x:%02x:%02x:%02x:%02x:%02x",
-                               bss->bssid[0], bss->bssid[1], bss->bssid[2], bss->bssid[3],
-                               bss->bssid[4], bss->bssid[5]);
+               memcpy(bssids->bssid, bss->bssid, WIFI_BSSID_LEN_MAX);
 
-               memcpy(bssids->bssid, buff, 18);
-               bssids->bssid[17] = '\0';
                bssids->strength = bss->signal;
                bssids->strength += 120;
 
@@ -1747,6 +1749,20 @@ static void update_bssid_list(gpointer key, gpointer value, gpointer user_data)
                SUPPLICANT_DBG("Failed to allocate memory");
 }
 
+static gint cmp_bss(gconstpointer a, gconstpointer b)
+{
+       struct g_connman_bssids *entry_a = (struct g_connman_bssids *)a;
+       struct g_connman_bssids *entry_b = (struct g_connman_bssids *)b;
+
+       if (entry_a->strength > entry_b->strength)
+               return -1;
+
+       if (entry_a->strength < entry_b->strength)
+               return 1;
+
+       return 0;
+}
+
 void *g_supplicant_network_get_bssid_list(GSupplicantNetwork *network)
 {
        GSList *bssid_list = NULL;
@@ -1755,6 +1771,7 @@ void *g_supplicant_network_get_bssid_list(GSupplicantNetwork *network)
                return NULL;
 
        g_hash_table_foreach(network->bss_table, update_bssid_list, &bssid_list);
+       bssid_list = g_slist_sort(bssid_list, cmp_bss);
 
        return bssid_list;
 }
@@ -2477,7 +2494,7 @@ static void bss_compute_security(struct g_supplicant_bss *bss)
                bss->psk = TRUE;
 #endif
 
-#if defined TIZEN_EXT_WIFI_MESH
+#if defined TIZEN_EXT
        if (bss->keymgmt & G_SUPPLICANT_KEYMGMT_SAE)
                bss->sae = TRUE;
 #endif
@@ -2492,7 +2509,7 @@ static void bss_compute_security(struct g_supplicant_bss *bss)
        else if (bss->ft_ieee8021x == TRUE)
                bss->security = G_SUPPLICANT_SECURITY_IEEE8021X;
 #endif
-#if defined TIZEN_EXT_WIFI_MESH
+#if defined TIZEN_EXT
        else if (bss->sae)
                bss->security = G_SUPPLICANT_SECURITY_SAE;
 #endif
@@ -2816,7 +2833,11 @@ static void interface_bss_removed(DBusMessageIter *iter, void *user_data)
                g_hash_table_remove(interface->network_table, network->group);
        } else {
                if (is_current_network_bss && network->best_bss)
+#if defined TIZEN_EXT
+                       callback_network_changed(network, "CheckMultiBssidConnect");
+#else
                        callback_network_changed(network, "");
+#endif
        }
 }
 
@@ -6150,7 +6171,7 @@ static void add_network_security_proto(DBusMessageIter *dict,
        g_free(proto);
 }
 
-#if defined TIZEN_EXT_WIFI_MESH
+#if defined TIZEN_EXT
 static void add_network_ieee80211w(DBusMessageIter *dict, GSupplicantSSID *ssid)
 {
        if (ssid->security != G_SUPPLICANT_SECURITY_SAE)
@@ -6202,8 +6223,6 @@ static void add_network_security(DBusMessageIter *dict, GSupplicantSSID *ssid)
                add_network_security_ciphers(dict, ssid);
                add_network_security_proto(dict, ssid);
                break;
-#endif
-#if defined TIZEN_EXT_WIFI_MESH
        case G_SUPPLICANT_SECURITY_SAE:
                key_mgmt = "SAE";
                add_network_security_psk(dict, ssid);
@@ -6265,7 +6284,7 @@ static void interface_add_network_params(DBusMessageIter *iter, void *user_data)
 
        add_network_security(&dict, ssid);
 
-#if defined TIZEN_EXT_WIFI_MESH
+#if defined TIZEN_EXT
        add_network_ieee80211w(&dict, ssid);
 #endif