X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gsupplicant%2Fsupplicant.c;h=e457fef247429d0bf870f835674cd39da4f369c5;hb=00b8c314dc2cfb641494d413f4b00d90a10ecbeb;hp=53cc56307514444e3935bb02897c58a22612cc5c;hpb=56680a937cb856c8075032cca9bca107ab4fadb2;p=platform%2Fupstream%2Fconnman.git diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c index 53cc563..e457fef 100755 --- a/gsupplicant/supplicant.c +++ b/gsupplicant/supplicant.c @@ -54,7 +54,6 @@ #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 #if defined TIZEN_EXT @@ -318,6 +317,7 @@ struct g_supplicant_bss { unsigned int transition_mode_ssid_len; unsigned char transition_mode_bssid[6]; unsigned char transition_mode_ssid[32]; + dbus_bool_t pmf_required; #endif }; @@ -437,23 +437,6 @@ struct interface_scan_data { }; #if defined TIZEN_EXT -struct g_connman_bssids { - unsigned char bssid[WIFI_BSSID_LEN_MAX]; - uint16_t strength; - uint16_t frequency; - uint16_t assoc_reject_cnt; - bool is_last_connected; -#if defined TIZEN_EXT_INS - int score_last_connected_bssid; - int score_assoc_reject; - int score_frequency; - int score_strength; - int score_snr; - int score_est_throughput; -#endif - int ins_score; -}; - struct update_bssid_data { GSupplicantNetwork *network; unsigned char last_connected_bssid[WIFI_BSSID_LEN_MAX]; @@ -684,6 +667,9 @@ static int store_network_information(GSupplicantInterface * interface, if ((ssid->security == G_SUPPLICANT_SECURITY_WEP || ssid->security == G_SUPPLICANT_SECURITY_PSK || +#if defined TIZEN_EXT + ssid->security == G_SUPPLICANT_SECURITY_SAE || +#endif ssid->security == G_SUPPLICANT_SECURITY_NONE) && ssid->passphrase) { interface->network_info.passphrase = g_strdup(ssid->passphrase); @@ -1436,6 +1422,14 @@ bool g_supplicant_interface_get_is_5_0_ghz_supported(GSupplicantInterface *inter return interface->is_5_0_Ghz_supported; } + +unsigned char *g_supplicant_interface_get_add_network_bssid(GSupplicantInterface *interface) +{ + if (!interface) + return NULL; + + return (unsigned char *)interface->add_network_bssid; +} #endif const char *g_supplicant_interface_get_driver(GSupplicantInterface *interface) @@ -1607,6 +1601,32 @@ dbus_int16_t g_supplicant_network_get_signal(GSupplicantNetwork *network) return network->signal; } +#if defined TIZEN_EXT +void g_supplicant_network_set_signal(GSupplicantNetwork *network, int signal) +{ + if (!network) + return; + + network->signal = (dbus_int16_t)signal; +} + +void g_supplicant_network_set_bss_signal(GSupplicantNetwork *network, + int signal, int snr) +{ + struct g_supplicant_bss *best_bss; + + if (!network) + return; + + best_bss = network->best_bss; + if (!best_bss) + return; + + best_bss->signal = (dbus_int16_t)signal; + best_bss->snr = (dbus_int16_t)snr; +} +#endif + dbus_uint16_t g_supplicant_network_get_frequency(GSupplicantNetwork *network) { if (!network) @@ -1771,6 +1791,14 @@ const unsigned char *g_supplicant_network_get_countrycode(GSupplicantNetwork return network->country_code; } + +dbus_bool_t g_supplicant_network_is_pmf_required(GSupplicantNetwork *network) +{ + if (!network) + return 0; + + return network->best_bss->pmf_required; +} #endif const unsigned char *g_supplicant_peer_get_widi_ies(GSupplicantPeer *peer, @@ -1909,10 +1937,10 @@ const char *g_supplicant_network_get_enc_mode(GSupplicantNetwork *network) return NULL; if (network->best_bss->security == G_SUPPLICANT_SECURITY_PSK || - network->best_bss->security == G_SUPPLICANT_SECURITY_SAE || - network->best_bss->security == G_SUPPLICANT_SECURITY_OWE || - network->best_bss->security == G_SUPPLICANT_SECURITY_DPP || - network->best_bss->security == G_SUPPLICANT_SECURITY_IEEE8021X) { + network->best_bss->security == G_SUPPLICANT_SECURITY_SAE || + network->best_bss->security == G_SUPPLICANT_SECURITY_OWE || + network->best_bss->security == G_SUPPLICANT_SECURITY_DPP || + network->best_bss->security == G_SUPPLICANT_SECURITY_IEEE8021X) { unsigned int pairwise; pairwise = network->best_bss->rsn_pairwise | @@ -2133,7 +2161,6 @@ static int calculate_score_est_throughput(dbus_uint32_t est_throughput) return score; } -#endif static int calculate_score(bool is_last_connected, uint16_t assoc_reject_cnt, dbus_uint16_t frequency, dbus_int16_t strength, @@ -2150,6 +2177,7 @@ static int calculate_score(bool is_last_connected, uint16_t assoc_reject_cnt, return score; } +#endif static void update_bssid_list(gpointer key, gpointer value, gpointer user_data) { @@ -2169,6 +2197,7 @@ static void update_bssid_list(gpointer key, gpointer value, gpointer user_data) bssids->strength = 100; bssids->frequency = bss->frequency; + bssids->score_snr = (int)bss->snr; #if defined TIZEN_EXT_INS bssids->assoc_reject_cnt = get_assoc_reject_cnt(bssid_data->assoc_reject_table, bssids->bssid); @@ -2177,8 +2206,7 @@ static void update_bssid_list(gpointer key, gpointer value, gpointer user_data) bssids->score_last_connected_bssid = calculate_score_last_connected_bssid(bssids->is_last_connected); bssids->score_assoc_reject = calculate_score_assoc_reject(bssids->assoc_reject_cnt); bssids->score_frequency = calculate_score_frequency(bss->signal, bssids->frequency); - bssids->score_strength = calculate_score_strength(bssids->strength); - bssids->score_snr = (int)bss->snr; + bssids->score_strength = calculate_score_strength(bss->signal); bssids->score_est_throughput = calculate_score_est_throughput(bss->est_throughput); bssids->ins_score = calculate_score(bssids->is_last_connected, @@ -2313,6 +2341,43 @@ GSupplicantNetwork *g_supplicant_interface_get_network(GSupplicantInterface *int 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; + struct assoc_reject_data *assoc_data = value; + GHashTable *cloned_assoc_reject_table = user_data; + + if (assoc_data && cloned_assoc_reject_table) { + cloned_assoc_data = g_try_new0(struct assoc_reject_data, 1); + if (!cloned_assoc_data) + return; + + cloned_assoc_data->bssid = g_strdup(assoc_data->bssid); + cloned_assoc_data->reject_time_list = g_slist_copy(assoc_data->reject_time_list); + g_hash_table_insert(cloned_assoc_reject_table, + cloned_assoc_data->bssid, cloned_assoc_data); + } +} + +GHashTable *g_supplicant_network_clone_assoc_reject_table(GSupplicantNetwork *network) +{ + GHashTable *cloned_assoc_reject_table; + + if (!network) + return NULL; + + GHashTable *assoc_reject_table = g_supplicant_network_get_assoc_reject_table(network); + if (!assoc_reject_table) + return NULL; + + cloned_assoc_reject_table = g_hash_table_new_full(g_str_hash, g_str_equal, + NULL, remove_assoc_data); + g_hash_table_foreach(assoc_reject_table, copy_assoc_reject, cloned_assoc_reject_table); + + return cloned_assoc_reject_table; +} + #endif static void merge_network(GSupplicantNetwork *network) @@ -2553,6 +2618,12 @@ static char *create_group(struct g_supplicant_bss *bss) static void update_network_with_best_bss(GSupplicantNetwork *network, struct g_supplicant_bss *best_bss) { + /* + * Do not change best BSS if we are connected. + */ + if (network->interface->state == G_SUPPLICANT_STATE_COMPLETED) + return; + network->signal = best_bss->signal; network->frequency = best_bss->frequency; network->best_bss = best_bss; @@ -2586,7 +2657,7 @@ static bool update_best_bss(GSupplicantNetwork *network, #endif if (score_new > score_best) { - SUPPLICANT_DBG("new[" MACSTR "][%u] : best[" MACSTR "][%u]", + SUPPLICANT_DBG("new[" MACSTR "][%d] : best[" MACSTR "][%d]", MAC2STR(bss->bssid), score_new, MAC2STR(network->best_bss->bssid), score_best); @@ -2930,6 +3001,7 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data) unsigned char *ext_rates = NULL; unsigned int max_rate = 0; unsigned int max_ext_rate = 0; + unsigned int offset = 0; bool ht = false; bool vht = false; #endif @@ -2947,6 +3019,8 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data) #if defined TIZEN_EXT #define VENDOR_SPECIFIC_INFO 0xDD #define WLAN_EID_COUNTRY 7 +#define WLAN_EID_RSN_INFO 48 +#define RSN_CAPABILITY_MFP_REQ (1 << 6) #endif dbus_message_iter_recurse(iter, &array); @@ -2964,7 +3038,7 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data) unsigned char *vsie; int vsie_len = 0; - if(ie[0] == VENDOR_SPECIFIC_INFO && memcmp(ie+2, OWE_WFA_OUI, sizeof(OWE_WFA_OUI)) == 0) { + if (ie[0] == VENDOR_SPECIFIC_INFO && memcmp(ie+2, OWE_WFA_OUI, sizeof(OWE_WFA_OUI)) == 0) { SUPPLICANT_DBG("IE: match vendor specific data : OWE Transition Mode"); /* @@ -2994,7 +3068,7 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data) continue; } - if(ie[0] == VENDOR_SPECIFIC_INFO && memcmp(ie+2, WPS_OUI, sizeof(WPS_OUI)) != 0) { + if (ie[0] == VENDOR_SPECIFIC_INFO && memcmp(ie+2, WPS_OUI, sizeof(WPS_OUI)) != 0) { if (!simplified_log) SUPPLICANT_DBG("IE: match vendor specific data"); @@ -3010,7 +3084,7 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data) continue; } - if(ie[0] == WLAN_EID_COUNTRY && ie[1] >= 2) { + if (ie[0] == WLAN_EID_COUNTRY && ie[1] >= 2) { /* Add country code only if it is a valid alphabet */ if (ie[2] >= 65 && ie[2] <= 90 && ie[3] >= 65 && ie[3] <= 90) { memcpy(bss->country_code, ie+2, COUNTRY_CODE_LENGTH); @@ -3055,6 +3129,18 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data) } continue; } + + if (ie[0] == WLAN_EID_RSN_INFO && ie[1] >= 20) { + r_len = ie[1]; + offset = 10 + ie[8] * 4; + offset += ie[offset] * 4 + 2; + + if (offset <= r_len + 1 && + (ie[offset] & RSN_CAPABILITY_MFP_REQ) != 0) + bss->pmf_required = TRUE; + + continue; + } #endif if (ie[0] != WMM_WPA1_WPS_INFO || ie[1] < WPS_INFO_MIN_LEN || memcmp(ie+2, WPS_OUI, sizeof(WPS_OUI)) != 0) @@ -3155,6 +3241,8 @@ static void bss_compute_security(struct g_supplicant_bss *bss) if (bss->ieee8021x) bss->security = G_SUPPLICANT_SECURITY_IEEE8021X; #if defined TIZEN_EXT + else if (bss->ft_ieee8021x) + bss->security = G_SUPPLICANT_SECURITY_IEEE8021X; else if (bss->sae) bss->security = G_SUPPLICANT_SECURITY_SAE; #endif @@ -3163,8 +3251,6 @@ static void bss_compute_security(struct g_supplicant_bss *bss) #if defined TIZEN_EXT else if (bss->ft_psk) bss->security = G_SUPPLICANT_SECURITY_FT_PSK; - else if (bss->ft_ieee8021x == TRUE) - bss->security = G_SUPPLICANT_SECURITY_IEEE8021X; else if (bss->owe || bss->owe_transition_mode) bss->security = G_SUPPLICANT_SECURITY_OWE; else if (bss->dpp) @@ -3487,6 +3573,13 @@ static void interface_current_bss(GSupplicantInterface *interface, GSupplicantNetwork *network; 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; + gboolean update = FALSE; +#endif dbus_message_iter_get_basic(iter, &path); if (g_strcmp0(path, "/") == 0) { @@ -3506,7 +3599,16 @@ static void interface_current_bss(GSupplicantInterface *interface, interface->current_network = network; #if defined TIZEN_EXT - SUPPLICANT_DBG("current network [%p]", interface->current_network); + snprintf(bssid_str1, WIFI_BSSID_STR_LEN, MACSTR, MAC2STR(bss->bssid)); + snprintf(bssid_str2, 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); + + if (network->frequency != bss->frequency) { + network->frequency = bss->frequency; + update = TRUE; + } #endif if (bss != network->best_bss) { @@ -3525,9 +3627,19 @@ static void interface_current_bss(GSupplicantInterface *interface, network->signal = bss->signal; callback_network_changed(network, "Signal"); +#if defined TIZEN_EXT + update = FALSE; + } else { + update = TRUE; +#endif } } +#if defined TIZEN_EXT + if (update) + callback_network_changed(network, ""); +#endif + /* * wpa_s could notify about CurrentBSS in any state once * it got associated. It is not sure such notification will @@ -4292,8 +4404,10 @@ static void signal_bss_changed(const char *path, DBusMessageIter *iter) supplicant_dbus_property_foreach(iter, bss_property, bss); #if defined TIZEN_EXT - network->frequency = bss->frequency; - network->phy_mode = bss->phy_mode; + if (network->interface->state != G_SUPPLICANT_STATE_COMPLETED) { + network->frequency = bss->frequency; + network->phy_mode = bss->phy_mode; + } #endif old_security = network->security; bss_compute_security(bss); @@ -5410,7 +5524,7 @@ static void country_result(const char *error, regdom->callback(result, regdom->alpha2, (void *) regdom->user_data); - dbus_free(regdom); + g_free(regdom); } static void country_params(DBusMessageIter *iter, void *user_data) @@ -5674,7 +5788,7 @@ static void interface_create_result(const char *error, SUPPLICANT_DBG(""); if (error) { - g_message("error %s", error); + g_warning("error %s", error); err = -EIO; goto done; } @@ -6439,6 +6553,7 @@ static void interface_signalpoll_result(const char *error, int err = 0; dbus_int32_t maxspeed = 0; dbus_int32_t strength = 0; + dbus_int32_t snr = 0; DBusMessageIter sub_iter, dict; if (error) { @@ -6475,6 +6590,10 @@ static void interface_signalpoll_result(const char *error, 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; } } dbus_message_iter_next(&dict); @@ -6482,7 +6601,7 @@ static void interface_signalpoll_result(const char *error, out: if(data->callback) - data->callback(err, maxspeed, strength, data->user_data); + data->callback(err, maxspeed, strength, snr, data->user_data); g_free(data->path); dbus_free(data); @@ -6821,10 +6940,8 @@ static void add_network_security_tls(DBusMessageIter *dict, if (!ssid->private_key_path) return; -#if !defined TIZEN_EXT if (!ssid->private_key_passphrase) return; -#endif if (ssid->ca_cert_path) supplicant_dbus_dict_append_basic(dict, "ca_cert", @@ -6833,11 +6950,9 @@ static void add_network_security_tls(DBusMessageIter *dict, supplicant_dbus_dict_append_basic(dict, "private_key", DBUS_TYPE_STRING, &ssid->private_key_path); -#if !defined TIZEN_EXT supplicant_dbus_dict_append_basic(dict, "private_key_passwd", DBUS_TYPE_STRING, &ssid->private_key_passphrase); -#endif supplicant_dbus_dict_append_basic(dict, "client_cert", DBUS_TYPE_STRING, &ssid->client_cert_path);