Merge "Added dbus method to get whether 6GHz band is supported" into tizen
[platform/upstream/connman.git] / gsupplicant / supplicant.c
index fea0958..0f44766 100755 (executable)
@@ -191,7 +191,7 @@ struct _GSupplicantINSSettings {
 static struct _GSupplicantINSSettings ins_settings;
 #endif /* defined TIZEN_EXT && defined TIZEN_EXT_INS */
 
-#if defined TIZEN_EXT
+#if defined TIZEN_EXT_INS
 static unsigned char invalid_bssid[WIFI_BSSID_LEN_MAX] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
@@ -265,6 +265,7 @@ struct _GSupplicantInterface {
        struct added_network_information network_info;
 #if defined TIZEN_EXT
        dbus_bool_t is_5_0_Ghz_supported;
+       dbus_bool_t is_6_0_Ghz_supported;
        int disconnect_reason;
 #endif
 #if defined TIZEN_EXT
@@ -456,7 +457,9 @@ struct assoc_count_data {
        int assoc_count;
 };
 
+#if defined TIZEN_EXT_INS
 static unsigned int last_connected_bss_timeout = 0;
+#endif
 static bool simplified_log = true;
 #endif
 
@@ -1312,6 +1315,11 @@ static void interface_capability(const char *key, DBusMessageIter *iter,
 
                dbus_message_iter_get_basic(iter, &is_5_0_Ghz_supported);
                interface->is_5_0_Ghz_supported = is_5_0_Ghz_supported;
+       } else if (g_strcmp0(key, "Is6GhzSupported") == 0) {
+               dbus_bool_t is_6_0_Ghz_supported;
+
+               dbus_message_iter_get_basic(iter, &is_6_0_Ghz_supported);
+               interface->is_6_0_Ghz_supported = is_6_0_Ghz_supported;
 #endif
        } else
                SUPPLICANT_DBG("key %s type %c",
@@ -1423,11 +1431,19 @@ const char *g_supplicant_interface_get_ifname(GSupplicantInterface *interface)
 bool g_supplicant_interface_get_is_5_0_ghz_supported(GSupplicantInterface *interface)
 {
        if (!interface)
-               return NULL;
+               return false;
 
        return interface->is_5_0_Ghz_supported;
 }
 
+bool g_supplicant_interface_get_is_6_0_ghz_supported(GSupplicantInterface *interface)
+{
+       if (!interface)
+               return false;
+
+       return interface->is_6_0_Ghz_supported;
+}
+
 unsigned char *g_supplicant_interface_get_add_network_bssid(GSupplicantInterface *interface)
 {
        if (!interface)
@@ -1573,7 +1589,7 @@ const char *g_supplicant_network_get_path(GSupplicantNetwork *network)
 const char *g_supplicant_network_get_mode(GSupplicantNetwork *network)
 {
        if (!network)
-               return G_SUPPLICANT_MODE_UNKNOWN;
+               return NULL;
 
        return mode2string(network->mode);
 }
@@ -1581,7 +1597,7 @@ const char *g_supplicant_network_get_mode(GSupplicantNetwork *network)
 const char *g_supplicant_network_get_security(GSupplicantNetwork *network)
 {
        if (!network)
-               return G_SUPPLICANT_SECURITY_UNKNOWN;
+               return NULL;
 
        return security2string(network->security);
 }
@@ -2015,6 +2031,7 @@ void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network)
        return vsie_list;
 }
 
+#if defined TIZEN_EXT_INS
 static bool compare_bssid(unsigned char *bssid_a, unsigned char *bssid_b)
 {
        if (!memcmp(bssid_a, bssid_b, WIFI_BSSID_LEN_MAX))
@@ -2041,7 +2058,6 @@ static gchar *convert_bssid_to_str(unsigned char *bssid)
        return g_string_free(bssid_str, FALSE);
 }
 
-#if defined TIZEN_EXT_INS
 static void count_assoc_reject(gpointer data, gpointer user_data)
 {
        time_t assoc_reject_time = GPOINTER_TO_INT(data);
@@ -2183,7 +2199,7 @@ static int calculate_score(bool is_last_connected, uint16_t assoc_reject_cnt,
 
        return score;
 }
-#endif
+#endif /* defined TIZEN_EXT_INS */
 
 static void update_bssid_list(gpointer key, gpointer value, gpointer user_data)
 {
@@ -2203,6 +2219,7 @@ static void update_bssid_list(gpointer key, gpointer value, gpointer user_data)
                        bssids->strength = 100;
 
                bssids->frequency = bss->frequency;
+               bssids->est_throughput = bss->est_throughput;
                bssids->score_snr = (int)bss->snr;
 
 #if defined TIZEN_EXT_INS
@@ -2257,11 +2274,12 @@ static void print_bssid_sort(gpointer data, gpointer user_data)
        if (!bssids || !network)
                return;
 
-       SUPPLICANT_DBG("ssid [%-20s] bssid[" MACSTR "] total[%2d] freq[%2d] "
-                       "last_conn[%2d] assoc_reject[%2d] strength[%2d] rssi[%2d]",
-                       network->ssid, MAC2STR(bssids->bssid), bssids->ins_score,
-                       bssids->score_frequency, bssids->score_last_connected_bssid,
-                       bssids->score_assoc_reject, bssids->score_strength, bssids->strength - 120);
+       if (!simplified_log)
+               SUPPLICANT_DBG("ssid [%-20s] bssid[" MACSTR "] total[%2d] freq[%2d] "
+                               "last_conn[%2d] assoc_reject[%2d] strength[%2d] rssi[%2d]",
+                               network->ssid, MAC2STR(bssids->bssid), bssids->ins_score,
+                               bssids->score_frequency, bssids->score_last_connected_bssid,
+                               bssids->score_assoc_reject, bssids->score_strength, bssids->strength - 120);
 }
 #endif
 
@@ -2286,6 +2304,7 @@ void *g_supplicant_network_get_bssid_list(GSupplicantNetwork *network)
        return bssid_data.bssid_list;
 }
 
+#if defined TIZEN_EXT_INS
 void g_supplicant_network_set_last_connected_bssid(GSupplicantNetwork *network, const unsigned char *bssid)
 {
        if (!bssid)
@@ -2351,15 +2370,6 @@ GHashTable *g_supplicant_network_get_assoc_reject_table(GSupplicantNetwork *netw
        return network->assoc_reject_table;
 }
 
-GSupplicantNetwork *g_supplicant_interface_get_network(GSupplicantInterface *interface,
-               const char *group)
-{
-       if (!interface)
-               return NULL;
-
-       return g_hash_table_lookup(interface->network_table, group);
-}
-
 static void copy_assoc_reject(gpointer key, gpointer value, gpointer user_data)
 {
        struct assoc_reject_data *cloned_assoc_data;
@@ -2395,8 +2405,17 @@ GHashTable *g_supplicant_network_clone_assoc_reject_table(GSupplicantNetwork *ne
 
        return cloned_assoc_reject_table;
 }
+#endif /* defined TIZEN_EXT_INS */
 
-#endif
+GSupplicantNetwork *g_supplicant_interface_get_network(GSupplicantInterface *interface,
+               const char *group)
+{
+       if (!interface)
+               return NULL;
+
+       return g_hash_table_lookup(interface->network_table, group);
+}
+#endif /* defined TIZEN_EXT */
 
 static void merge_network(GSupplicantNetwork *network)
 {
@@ -2449,8 +2468,16 @@ static void merge_network(GSupplicantNetwork *network)
                g_string_append_printf(str, "_mesh");
 #endif
 
+#if defined TIZEN_EXT
        if (g_strcmp0(key_mgmt, "WPA-PSK") == 0)
                g_string_append_printf(str, "_psk");
+       else if (g_strcmp0(key_mgmt, "SAE") == 0)
+               g_string_append_printf(str, "_sae");
+#else
+       if ((g_strcmp0(key_mgmt, "WPA-PSK") == 0) ||
+           (g_strcmp0(key_mgmt, "SAE") == 0))
+               g_string_append_printf(str, "_psk");
+#endif
 #if defined TIZEN_EXT
        else if (g_strcmp0(key_mgmt, "WPA-EAP") == 0)
                g_string_append_printf(str, "_ieee8021x");
@@ -2651,6 +2678,7 @@ static void update_network_with_best_bss(GSupplicantNetwork *network,
 
        network->signal = best_bss->signal;
        network->frequency = best_bss->frequency;
+       network->phy_mode = best_bss->phy_mode;
        network->best_bss = best_bss;
 }
 
@@ -2733,6 +2761,7 @@ static int add_or_replace_bss_to_network(struct g_supplicant_bss *bss)
        network->name = create_name(bss->ssid, bss->ssid_len);
        network->mode = bss->mode;
        network->security = bss->security;
+       network->keymgmt = bss->keymgmt;
        network->ssid_len = bss->ssid_len;
        memcpy(network->ssid, bss->ssid, bss->ssid_len);
        network->signal = bss->signal;
@@ -3260,8 +3289,9 @@ static void bss_compute_security(struct g_supplicant_bss *bss)
 #endif
 
 #if defined TIZEN_EXT
-       if (bss->keymgmt & G_SUPPLICANT_KEYMGMT_SAE |
-                       bss->keymgmt & G_SUPPLICANT_KEYMGMT_FT_SAE)
+       if (bss->keymgmt &
+                       (G_SUPPLICANT_KEYMGMT_SAE |
+                               G_SUPPLICANT_KEYMGMT_FT_SAE))
                bss->sae = TRUE;
        if (bss->keymgmt & G_SUPPLICANT_KEYMGMT_OWE)
                bss->owe = TRUE;
@@ -3522,6 +3552,8 @@ static void update_signal(gpointer key, gpointer value,
        if (!network->best_bss || (network->best_bss == bss)) {
                if (bss->signal > network->signal) {
                        network->signal = bss->signal;
+                       network->frequency = bss->frequency;
+                       network->phy_mode = bss->phy_mode;
                        network->best_bss = bss;
                }
                return;
@@ -3547,7 +3579,7 @@ static void update_network_signal(GSupplicantNetwork *network)
        SUPPLICANT_DBG("New network signal %d", network->signal);
 }
 
-#if defined TIZEN_EXT
+#if defined TIZEN_EXT_INS
 static gboolean last_connected_timeout(gpointer data)
 {
        GSupplicantInterface *interface = data;
@@ -3598,7 +3630,7 @@ static void remove_timer_for_last_connected(GSupplicantInterface *interface)
                }
        }
 }
-#endif
+#endif /* defined TIZEN_EXT_INS */
 
 static void interface_current_bss(GSupplicantInterface *interface,
                                                DBusMessageIter *iter)
@@ -3607,10 +3639,10 @@ static void interface_current_bss(GSupplicantInterface *interface,
        struct g_supplicant_bss *bss;
        const char *path;
 #if defined TIZEN_EXT
-       char bssid_buff1[WIFI_BSSID_STR_LEN] = {0,};
-       char bssid_buff2[WIFI_BSSID_STR_LEN] = {0,};
-       char *bssid_str1 = bssid_buff1;
-       char *bssid_str2 = bssid_buff2;
+       char curr_bssid_buff[WIFI_BSSID_STR_LEN] = {0,};
+       char best_bssid_buff[WIFI_BSSID_STR_LEN] = {0,};
+       char *curr_bssid_str = curr_bssid_buff;
+       char *best_bssid_str = best_bssid_buff;
        gboolean update = FALSE;
 #endif
 
@@ -3632,14 +3664,15 @@ static void interface_current_bss(GSupplicantInterface *interface,
 
        interface->current_network = network;
 #if defined TIZEN_EXT
-       snprintf(bssid_str1, WIFI_BSSID_STR_LEN, MACSTR, MAC2STR(bss->bssid));
-       snprintf(bssid_str2, WIFI_BSSID_STR_LEN, MACSTR, MAC2STR(network->best_bss->bssid));
+       snprintf(curr_bssid_str, WIFI_BSSID_STR_LEN, MACSTR, MAC2STR(bss->bssid));
+       snprintf(best_bssid_str, WIFI_BSSID_STR_LEN, MACSTR, MAC2STR(network->best_bss->bssid));
 
        SUPPLICANT_DBG("current network [%p], Passed bss %s, best bss %s",
-                       interface->current_network, bssid_str1, bssid_str2);
+                       interface->current_network, curr_bssid_str, best_bssid_str);
 
        if (network->frequency != bss->frequency) {
                network->frequency = bss->frequency;
+               network->phy_mode = bss->phy_mode;
                update = TRUE;
        }
 #endif
@@ -3694,7 +3727,7 @@ static void interface_current_bss(GSupplicantInterface *interface,
        case G_SUPPLICANT_STATE_GROUP_HANDSHAKE:
        case G_SUPPLICANT_STATE_COMPLETED:
                callback_network_associated(network);
-#if defined TIZEN_EXT
+#if defined TIZEN_EXT_INS
                add_timer_for_last_connected(interface);
 #endif
                break;
@@ -3853,7 +3886,7 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                                interface->state = string2state(str);
                                callback_interface_state(interface);
                        }
-#if defined TIZEN_EXT
+#if defined TIZEN_EXT_INS
                switch (interface->state) {
                case G_SUPPLICANT_STATE_COMPLETED:
                        add_timer_for_last_connected(interface);
@@ -4437,7 +4470,8 @@ static void signal_bss_changed(const char *path, DBusMessageIter *iter)
        supplicant_dbus_property_foreach(iter, bss_property, bss);
 
 #if defined TIZEN_EXT
-       if (network->interface->state != G_SUPPLICANT_STATE_COMPLETED) {
+       if (network->interface->state != G_SUPPLICANT_STATE_COMPLETED &&
+                       bss == network->best_bss) {
                network->frequency = bss->frequency;
                network->phy_mode = bss->phy_mode;
        }
@@ -6587,6 +6621,7 @@ static void interface_signalpoll_result(const char *error,
        dbus_int32_t maxspeed = 0;
        dbus_int32_t strength = 0;
        dbus_int32_t snr = 0;
+       dbus_uint32_t est_throughput = 0;
        DBusMessageIter sub_iter, dict;
 
        if (error) {
@@ -6618,23 +6653,27 @@ static void interface_signalpoll_result(const char *error,
                        if (g_strcmp0(key, "linkspeed") == 0) {
                                dbus_message_iter_get_basic(&value, &maxspeed);
                                SUPPLICANT_DBG("linkspeed = %d", maxspeed);
-                               break;
                        } else if (g_strcmp0(key, "rssi") == 0) {
                                dbus_message_iter_get_basic(&value, &strength);
                                SUPPLICANT_DBG("Strength = %d", strength);
-                               break;
                        } else if (g_strcmp0(key, "SNR") == 0) {
                                dbus_message_iter_get_basic(&value, &snr);
                                SUPPLICANT_DBG("SNR = %d", snr);
-                               break;
                        }
+                       break;
+               case DBUS_TYPE_UINT32:
+                       if (g_strcmp0(key, "est_throughput") == 0) {
+                               dbus_message_iter_get_basic(&value, &est_throughput);
+                               SUPPLICANT_DBG("est_throughput = %u", est_throughput);
+                       }
+                       break;
                }
                dbus_message_iter_next(&dict);
        }
 
 out:
        if(data->callback)
-               data->callback(err, maxspeed, strength, snr, data->user_data);
+               data->callback(err, maxspeed, strength, snr, data->user_data, est_throughput);
 
        g_free(data->path);
        dbus_free(data);
@@ -6727,10 +6766,14 @@ static void interface_select_network_result(const char *error,
 
 #if defined TIZEN_EXT
        g_free(data->ssid->ssid);
-       g_free((char *)data->ssid->passphrase);
-       g_free((char *)data->ssid->connector);
-       g_free((char *)data->ssid->c_sign_key);
-       g_free((char *)data->ssid->net_access_key);
+       if (data->ssid->is_passphrase_alloc)
+               g_free((char *)data->ssid->passphrase);
+       if (data->ssid->is_connector_alloc)
+               g_free((char *)data->ssid->connector);
+       if (data->ssid->is_c_sign_key_alloc)
+               g_free((char *)data->ssid->c_sign_key);
+       if (data->ssid->is_net_access_key_alloc)
+               g_free((char *)data->ssid->net_access_key);
 #endif
        g_free(data->ssid);
        dbus_free(data);
@@ -6819,10 +6862,14 @@ error:
        g_free(data->path);
 #if defined TIZEN_EXT
        g_free(data->ssid->ssid);
-       g_free((char *)data->ssid->passphrase);
-       g_free((char *)data->ssid->connector);
-       g_free((char *)data->ssid->c_sign_key);
-       g_free((char *)data->ssid->net_access_key);
+       if (data->ssid->is_passphrase_alloc)
+               g_free((char *)data->ssid->passphrase);
+       if (data->ssid->is_connector_alloc)
+               g_free((char *)data->ssid->connector);
+       if (data->ssid->is_c_sign_key_alloc)
+               g_free((char *)data->ssid->c_sign_key);
+       if (data->ssid->is_net_access_key_alloc)
+               g_free((char *)data->ssid->net_access_key);
 #endif
        g_free(data->ssid);
        g_free(data);
@@ -7280,18 +7327,6 @@ static void add_network_security_proto(DBusMessageIter *dict,
 }
 
 #if defined TIZEN_EXT
-static void add_network_ieee80211w(DBusMessageIter *dict, GSupplicantSSID *ssid)
-{
-       if (ssid->security != G_SUPPLICANT_SECURITY_SAE
-                       && ssid->security != G_SUPPLICANT_SECURITY_OWE
-                       && ssid->security != G_SUPPLICANT_SECURITY_PSK_SHA256
-                       && ssid->security != G_SUPPLICANT_SECURITY_DPP)
-               return;
-
-       supplicant_dbus_dict_append_basic(dict, "ieee80211w", DBUS_TYPE_UINT32,
-                                         &ssid->ieee80211w);
-}
-
 static void add_network_security_connector(DBusMessageIter *dict, GSupplicantSSID *ssid)
 {
        if (ssid->connector && strlen(ssid->connector) > 0) {
@@ -7357,8 +7392,16 @@ static void add_network_security_net_access_key(DBusMessageIter *dict, GSupplica
 
 #endif
 
+static void add_network_ieee80211w(DBusMessageIter *dict, GSupplicantSSID *ssid,
+                                  GSupplicantMfpOptions ieee80211w)
+{
+       supplicant_dbus_dict_append_basic(dict, "ieee80211w", DBUS_TYPE_UINT32,
+                                         &ieee80211w);
+}
+
 static void add_network_security(DBusMessageIter *dict, GSupplicantSSID *ssid)
 {
+       GSupplicantMfpOptions ieee80211w;
        char *key_mgmt;
 
        switch (ssid->security) {
@@ -7420,11 +7463,19 @@ static void add_network_security(DBusMessageIter *dict, GSupplicantSSID *ssid)
                                key_mgmt = "FT-SAE SAE";
                        else
                                key_mgmt = "FT-SAE";
-               } else if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_PSK)
+               } else {
+                       if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_PSK) {
                        key_mgmt = "SAE WPA-PSK";
-               else
-                       key_mgmt = "SAE";
+                       ieee80211w = G_SUPPLICANT_MFP_OPTIONAL;
+                       } else {
+                               key_mgmt = "SAE";
+                               ieee80211w = G_SUPPLICANT_MFP_REQUIRED;
+                       }
+                       add_network_ieee80211w(dict, ssid, ieee80211w);
+               }
                add_network_security_psk(dict, ssid);
+               add_network_security_ciphers(dict, ssid);
+               add_network_security_proto(dict, ssid);
                break;
        case G_SUPPLICANT_SECURITY_OWE:
                key_mgmt = "OWE";
@@ -7497,10 +7548,6 @@ static void interface_add_network_params(DBusMessageIter *iter, void *user_data)
 
        add_network_security(&dict, ssid);
 
-#if defined TIZEN_EXT
-       add_network_ieee80211w(&dict, ssid);
-#endif
-
        supplicant_dbus_dict_append_fixed_array(&dict, "ssid",
                                        DBUS_TYPE_BYTE, &ssid->ssid,
                                                ssid->ssid_len);
@@ -7696,6 +7743,7 @@ static void decryption_request_reply(DBusPendingCall *call,
 
        dbus_message_iter_get_basic(&args, &out_data);
        data->ssid->passphrase = g_strdup((const gchar *)out_data);
+       data->ssid->is_passphrase_alloc = true;
 
        ret = supplicant_dbus_method_call(data->interface->path,
                SUPPLICANT_INTERFACE ".Interface", "AddNetwork",
@@ -7709,10 +7757,14 @@ done:
                callback_assoc_failed(decrypt_request_data.data->user_data);
                g_free(data->path);
                g_free(data->ssid->ssid);
-               g_free((char *)data->ssid->passphrase);
-               g_free((char *)data->ssid->connector);
-               g_free((char *)data->ssid->c_sign_key);
-               g_free((char *)data->ssid->net_access_key);
+               if (data->ssid->is_passphrase_alloc)
+                       g_free((char *)data->ssid->passphrase);
+               if (data->ssid->is_connector_alloc)
+                       g_free((char *)data->ssid->connector);
+               if (data->ssid->is_c_sign_key_alloc)
+                       g_free((char *)data->ssid->c_sign_key);
+               if (data->ssid->is_net_access_key_alloc)
+                       g_free((char *)data->ssid->net_access_key);
                g_free(data->ssid);
                dbus_free(data);
        }
@@ -7818,14 +7870,17 @@ static void decrypt_conf_obj_reply(DBusPendingCall *call,
                        if (g_strcmp0(key, "connector") == 0) {
                                dbus_message_iter_get_basic(&value, &out_data);
                                data->ssid->connector = g_strdup((const gchar *)out_data);
+                               data->ssid->is_connector_alloc = true;
                                SUPPLICANT_DBG("connector %s", data->ssid->connector);
                        } else if (g_strcmp0(key, "c_sign_key") == 0) {
                                dbus_message_iter_get_basic(&value, &out_data);
                                data->ssid->c_sign_key = g_strdup((const gchar *)out_data);
+                               data->ssid->is_c_sign_key_alloc = true;
                                SUPPLICANT_DBG("c_sign_key %s", data->ssid->c_sign_key);
                        } else if (g_strcmp0(key, "net_access_key") == 0) {
                                dbus_message_iter_get_basic(&value, &out_data);
                                data->ssid->net_access_key = g_strdup((const gchar *)out_data);
+                               data->ssid->is_net_access_key_alloc = true;
                                SUPPLICANT_DBG("net_access_key %s", data->ssid->net_access_key);
                        }
                }
@@ -7844,9 +7899,12 @@ done:
                callback_assoc_failed(decrypt_request_data.data->user_data);
                g_free(data->path);
                g_free(data->ssid->ssid);
-               g_free((char *)data->ssid->connector);
-               g_free((char *)data->ssid->c_sign_key);
-               g_free((char *)data->ssid->net_access_key);
+               if (data->ssid->is_connector_alloc)
+                       g_free((char *)data->ssid->connector);
+               if (data->ssid->is_c_sign_key_alloc)
+                       g_free((char *)data->ssid->c_sign_key);
+               if (data->ssid->is_net_access_key_alloc)
+                       g_free((char *)data->ssid->net_access_key);
                g_free(data->ssid);
                dbus_free(data);
        }