X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gsupplicant%2Fsupplicant.c;h=e457fef247429d0bf870f835674cd39da4f369c5;hb=00b8c314dc2cfb641494d413f4b00d90a10ecbeb;hp=b16625c4a8d2fc2ecf3dff0aed44a2b52da4d64c;hpb=a1b47c4e729fa0fff9d6e2ab78a2a0305d6c8b9d;p=platform%2Fupstream%2Fconnman.git diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c index b16625c..e457fef 100755 --- a/gsupplicant/supplicant.c +++ b/gsupplicant/supplicant.c @@ -40,6 +40,10 @@ #include "dbus.h" #include "gsupplicant.h" +#if defined TIZEN_EXT +#include "setting.h" +#endif + #define IEEE80211_CAP_ESS 0x0001 #define IEEE80211_CAP_IBSS 0x0002 #define IEEE80211_CAP_PRIVACY 0x0010 @@ -50,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 @@ -171,7 +174,7 @@ static struct strvalmap mode_capa_map[] = { { } }; -#if defined TIZEN_EXT +#if defined TIZEN_EXT && defined TIZEN_EXT_INS struct _GSupplicantINSSettings { GSupplicantINSPreferredFreq preferred_freq_bssid; unsigned int preferred_freq_bssid_score; @@ -185,7 +188,9 @@ struct _GSupplicantINSSettings { }; static struct _GSupplicantINSSettings ins_settings; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_INS */ +#if defined TIZEN_EXT static unsigned char invalid_bssid[WIFI_BSSID_LEN_MAX] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -300,12 +305,19 @@ struct g_supplicant_bss { dbus_bool_t hs20; unsigned char country_code[COUNTRY_CODE_LENGTH]; GSupplicantPhy_mode phy_mode; + dbus_int16_t snr; + dbus_uint32_t est_throughput; #endif unsigned int wps_capabilities; #if defined TIZEN_EXT dbus_bool_t sae; dbus_bool_t owe; dbus_bool_t dpp; + dbus_bool_t owe_transition_mode; + unsigned int transition_mode_ssid_len; + unsigned char transition_mode_bssid[6]; + unsigned char transition_mode_ssid[32]; + dbus_bool_t pmf_required; #endif }; @@ -334,8 +346,11 @@ struct _GSupplicantNetwork { GSList *vsie_list; unsigned char country_code[COUNTRY_CODE_LENGTH]; GSupplicantPhy_mode phy_mode; -#endif -#if defined TIZEN_EXT + dbus_bool_t owe_transition_mode; + dbus_bool_t privacy; + unsigned int transition_mode_ssid_len; + unsigned char transition_mode_bssid[6]; + unsigned char transition_mode_ssid[32]; unsigned char last_connected_bssid[WIFI_BSSID_LEN_MAX]; GHashTable *assoc_reject_table; #endif @@ -388,6 +403,11 @@ struct interface_create_data { char *ifname; char *driver; char *bridge; +#if defined TIZEN_EXT + unsigned int mac_addr; + unsigned int preassoc_mac_addr; + unsigned int random_mac_lifetime; +#endif /* TIZEN_EXT */ #if defined TIZEN_EXT_WIFI_MESH char *parent_ifname; bool is_mesh_interface; @@ -417,21 +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; -#endif - int ins_score; -}; - struct update_bssid_data { GSupplicantNetwork *network; unsigned char last_connected_bssid[WIFI_BSSID_LEN_MAX]; @@ -450,12 +455,9 @@ struct assoc_count_data { }; static unsigned int last_connected_bss_timeout = 0; +static bool simplified_log = true; #endif -static void interface_get_params(DBusMessageIter *iter, void *user_data); -static void interface_get_result(const char *error, - DBusMessageIter *iter, void *user_data); - static int network_remove(struct interface_data *data); #if defined TIZEN_EXT_WIFI_MESH @@ -665,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); @@ -1131,7 +1136,9 @@ static void debug_strvalmap(const char *label, struct strvalmap *map, unsigned int val) { int i; - +#if defined TIZEN_EXT + if (!simplified_log) +#endif for (i = 0; map[i].str; i++) { if (val & map[i].val) SUPPLICANT_DBG("%s: %s", label, map[i].str); @@ -1306,6 +1313,24 @@ static void interface_capability(const char *key, DBusMessageIter *iter, key, dbus_message_iter_get_arg_type(iter)); } +static void set_bss_expiration_age(DBusMessageIter *iter, void *user_data) +{ + unsigned int bss_expiration_age = GPOINTER_TO_UINT(user_data); + + dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, + &bss_expiration_age); +} + +int g_supplicant_interface_set_bss_expiration_age(GSupplicantInterface *interface, + unsigned int bss_expiration_age) +{ + return supplicant_dbus_property_set(interface->path, + SUPPLICANT_INTERFACE ".Interface", + "BSSExpireAge", DBUS_TYPE_UINT32_AS_STRING, + set_bss_expiration_age, NULL, + GUINT_TO_POINTER(bss_expiration_age), NULL); +} + struct set_apscan_data { unsigned int ap_scan; @@ -1397,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) @@ -1568,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) @@ -1710,12 +1769,20 @@ const char *g_supplicant_network_get_phase2(GSupplicantNetwork *network) unsigned int g_supplicant_network_get_keymgmt(GSupplicantNetwork *network) { - if (network == NULL) + if (!network) return 0; return network->keymgmt; } +dbus_bool_t g_supplicant_network_get_privacy(GSupplicantNetwork *network) +{ + if (!network) + return FALSE; + + return network->privacy; +} + const unsigned char *g_supplicant_network_get_countrycode(GSupplicantNetwork *network) { @@ -1724,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, @@ -1820,6 +1895,34 @@ const unsigned char *g_supplicant_network_get_bssid(GSupplicantNetwork *network) return (const unsigned char *)network->best_bss->bssid; } +dbus_bool_t g_supplicant_network_get_transition_mode(GSupplicantNetwork *network) +{ + if (network == NULL) + return FALSE; + + return network->owe_transition_mode; +} + +const unsigned char *g_supplicant_network_get_transition_mode_bssid(GSupplicantNetwork *network) +{ + if (network == NULL) + return NULL; + + return (const unsigned char *)network->transition_mode_bssid; +} + +const void *g_supplicant_network_get_transition_mode_ssid(GSupplicantNetwork *network, + unsigned int *transition_mode_ssid_len) +{ + if (!network) { + *transition_mode_ssid_len = 0; + return NULL; + } + + *transition_mode_ssid_len = network->transition_mode_ssid_len; + return network->transition_mode_ssid; +} + unsigned int g_supplicant_network_get_maxrate(GSupplicantNetwork *network) { if (network == NULL || network->best_bss == NULL) @@ -1834,12 +1937,10 @@ 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 || - network->best_bss->security == G_SUPPLICANT_SECURITY_OWE || - network->best_bss->security == G_SUPPLICANT_SECURITY_DPP || -#endif /* TIZEN_EXT */ - 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 | @@ -1866,12 +1967,9 @@ 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 || - network->best_bss->security == G_SUPPLICANT_SECURITY_OWE || + if (network->best_bss->security == G_SUPPLICANT_SECURITY_OWE || network->best_bss->security == G_SUPPLICANT_SECURITY_DPP) return false; -#endif /* TIZEN_EXT */ if (network->best_bss->rsn_selected) { const char *mode = g_supplicant_network_get_enc_mode(network); @@ -1937,6 +2035,7 @@ 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); @@ -2050,8 +2149,22 @@ static int calculate_score_strength(dbus_int16_t strength) return score; } +static int calculate_score_est_throughput(dbus_uint32_t est_throughput) +{ + int score = 0; + + if (est_throughput >= 10000) + score = est_throughput / 10000; + + if (score > 40) + score = 40; + + return score; +} + static int calculate_score(bool is_last_connected, uint16_t assoc_reject_cnt, - dbus_int16_t strength, dbus_uint16_t frequency) + dbus_uint16_t frequency, dbus_int16_t strength, + dbus_int16_t snr, dbus_uint32_t est_throughput) { int score = 0; @@ -2059,9 +2172,12 @@ static int calculate_score(bool is_last_connected, uint16_t assoc_reject_cnt, score += calculate_score_assoc_reject(assoc_reject_cnt); score += calculate_score_frequency(strength, frequency); score += calculate_score_strength(strength); + score += (int)snr; + score += calculate_score_est_throughput(est_throughput); return score; } +#endif static void update_bssid_list(gpointer key, gpointer value, gpointer user_data) { @@ -2081,21 +2197,24 @@ 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); - bssids->is_last_connected = compare_bssid(bssids->bssid, bssid_data->last_connected_bssid); -#if defined TIZEN_EXT_INS 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); -#endif + 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, - bssids->assoc_reject_cnt, bssids->frequency, bss->signal); - + bssids->assoc_reject_cnt, bssids->frequency, bss->signal, + bss->snr, bss->est_throughput); +#else + bssids->ins_score = bss->signal; +#endif bssid_data->bssid_list = g_slist_append(bssid_data->bssid_list, bssids); } else SUPPLICANT_DBG("Failed to allocate memory"); @@ -2222,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) @@ -2458,6 +2614,20 @@ static char *create_group(struct g_supplicant_bss *bss) return g_string_free(str, FALSE); } +#if defined TIZEN_EXT +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; +} static bool update_best_bss(GSupplicantNetwork *network, struct g_supplicant_bss *bss, struct g_supplicant_bss *best_bss) @@ -2465,23 +2635,33 @@ static bool update_best_bss(GSupplicantNetwork *network, int score_new; int score_best; + if (network->best_bss == NULL) { + update_network_with_best_bss(network, bss); + return true; + } + +#if defined TIZEN_EXT_INS score_new = calculate_score( compare_bssid(bss->bssid, network->last_connected_bssid), get_assoc_reject_cnt(network->assoc_reject_table, bss->bssid), - bss->frequency, bss->signal); + bss->frequency, bss->signal, bss->snr, bss->est_throughput); + score_best = calculate_score( compare_bssid(network->best_bss->bssid, network->last_connected_bssid), get_assoc_reject_cnt(network->assoc_reject_table, network->best_bss->bssid), - network->best_bss->frequency, network->best_bss->signal); + network->best_bss->frequency, network->best_bss->signal, + network->best_bss->snr, network->best_bss->est_throughput); +#else + score_new = bss->signal; + score_best = network->best_bss->signal; +#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); - network->signal = bss->signal; - network->frequency = bss->frequency; - network->best_bss = bss; + update_network_with_best_bss(network, bss); SUPPLICANT_DBG("Update best BSS for %s", network->name); @@ -2490,7 +2670,7 @@ static bool update_best_bss(GSupplicantNetwork *network, return false; } - +#endif static int add_or_replace_bss_to_network(struct g_supplicant_bss *bss) { GSupplicantInterface *interface = bss->interface; @@ -2540,6 +2720,11 @@ static int add_or_replace_bss_to_network(struct g_supplicant_bss *bss) } #if defined TIZEN_EXT + network->owe_transition_mode = bss->owe_transition_mode; + network->privacy = bss->privacy; + memcpy(network->transition_mode_ssid, bss->transition_mode_ssid, bss->transition_mode_ssid_len); + memcpy(network->transition_mode_bssid, bss->transition_mode_bssid, WIFI_BSSID_LEN_MAX); + network->keymgmt = bss->keymgmt; if (g_slist_length(bss->vsie_list) > 0) { @@ -2810,11 +2995,13 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data) unsigned int value; int ie_len; #if defined TIZEN_EXT + const unsigned char OWE_WFA_OUI[] = { 0x50, 0x6f, 0x9a, 0x1c }; int r_len, j; unsigned char *rates = NULL; 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 @@ -2832,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); @@ -2848,8 +3037,41 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data) #if defined TIZEN_EXT unsigned char *vsie; int vsie_len = 0; - if(ie[0] == VENDOR_SPECIFIC_INFO && memcmp(ie+2, WPS_OUI, sizeof(WPS_OUI)) != 0) { - SUPPLICANT_DBG("IE: match vendor specific data"); + + 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"); + +/* + Tag: Vendor Specific: Wi-Fi Alliance: OWE Transition Mode + Tag Number: Vendor Specific (221) -> ie[0] + Tag length: 26 -> ie[1] + OUI: 50:6f:9a (Wi-Fi Alliance) -> ie[2] + Vendor Specific OUI Type: 28 -> ie[5] + BSSID: 92:fd:f0:20:2b:09 -> ie[6] + SSID length: 15 -> ie[12] + SSID: Wi-Fi-5.2.3-owe -> ie[13] + +0000 dd 1a 50 6f 9a 1c 92 fd f0 20 2b 09 0f 57 69 2d ..Po..... +..Wi- +0010 46 69 2d 35 2e 32 2e 33 2d 6f 77 65 Fi-5.2.3-owe + +*/ + bss->owe_transition_mode = TRUE; + if (ie[1] >= 11) { // Tag length is at least up to ssid length position. + memcpy(bss->transition_mode_bssid, ie+6, WIFI_BSSID_LEN_MAX); + if (ie[12] > 0 && ie[12] < 32) { + memcpy(bss->transition_mode_ssid, ie+13, ie[12]); + bss->transition_mode_ssid_len = ie[12]; + } else + bss->transition_mode_ssid_len = 0; + } else + bss->owe_transition_mode = FALSE; + continue; + } + + 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"); vsie_len = ie[1]+2; // tag number size(1), tag length size(1) vsie = (unsigned char *)g_try_malloc0(vsie_len); @@ -2862,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); @@ -2907,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) @@ -3006,16 +3240,18 @@ 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 else if (bss->psk) bss->security = G_SUPPLICANT_SECURITY_PSK; #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->sae) - bss->security = G_SUPPLICANT_SECURITY_SAE; - else if (bss->owe) + else if (bss->owe || bss->owe_transition_mode) bss->security = G_SUPPLICANT_SECURITY_OWE; else if (bss->dpp) bss->security = G_SUPPLICANT_SECURITY_DPP; @@ -3034,7 +3270,9 @@ static void bss_property(const char *key, DBusMessageIter *iter, if (!bss->interface) return; - +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG("key %s", key); if (!key) @@ -3126,6 +3364,17 @@ static void bss_property(const char *key, DBusMessageIter *iter, dbus_bool_t hs20 = FALSE; dbus_message_iter_get_basic(iter, &hs20); bss->hs20 = hs20; + } else if (g_strcmp0(key, "SNR") == 0) { + dbus_int16_t snr = 0; + + dbus_message_iter_get_basic(iter, &snr); + bss->snr = snr; + } else if (g_strcmp0(key, "EstThroughput") == 0) { + dbus_uint32_t est_throughput = 0; + + dbus_message_iter_get_basic(iter, &est_throughput); + if (est_throughput != 0) + bss->est_throughput = est_throughput; #endif } else if (g_strcmp0(key, "IEs") == 0) bss_process_ies(iter, bss); @@ -3141,7 +3390,9 @@ static struct g_supplicant_bss *interface_bss_added(DBusMessageIter *iter, GSupplicantNetwork *network; struct g_supplicant_bss *bss; const char *path = NULL; - +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG(""); dbus_message_iter_get_basic(iter, &path); @@ -3150,7 +3401,9 @@ static struct g_supplicant_bss *interface_bss_added(DBusMessageIter *iter, if (g_strcmp0(path, "/") == 0) return NULL; - +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG("%s", path); network = g_hash_table_lookup(interface->bss_mapping, path); @@ -3175,7 +3428,9 @@ static void interface_bss_added_with_keys(DBusMessageIter *iter, void *user_data) { struct g_supplicant_bss *bss; - +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG(""); bss = interface_bss_added(iter, user_data); @@ -3206,7 +3461,9 @@ static void interface_bss_added_without_keys(DBusMessageIter *iter, void *user_data) { struct g_supplicant_bss *bss; - +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG(""); bss = interface_bss_added(iter, user_data); @@ -3316,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) { @@ -3335,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) { @@ -3354,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 @@ -3439,7 +3722,9 @@ static void wps_property(const char *key, DBusMessageIter *iter, if (!interface) return; - +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG("key: %s", key); if (g_strcmp0(key, "ConfigMethods") == 0) { @@ -3484,7 +3769,9 @@ static void interface_property(const char *key, DBusMessageIter *iter, if (!interface) return; - +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG("%s", key); if (!key) { @@ -3909,7 +4196,9 @@ static void signal_interface_removed(const char *path, DBusMessageIter *iter) static void signal_interface_changed(const char *path, DBusMessageIter *iter) { GSupplicantInterface *interface; - +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG(""); interface = g_hash_table_lookup(interface_table, path); @@ -3959,7 +4248,9 @@ static void signal_scan_done(const char *path, DBusMessageIter *iter) static void signal_bss_added(const char *path, DBusMessageIter *iter) { GSupplicantInterface *interface; - +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG(""); interface = g_hash_table_lookup(interface_table, path); @@ -4093,6 +4384,9 @@ static void signal_bss_changed(const char *path, DBusMessageIter *iter) unsigned int old_wps_capabilities; struct g_supplicant_bss *bss; +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG(""); interface = g_hash_table_lookup(bss_mapping, path); @@ -4110,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); @@ -5488,29 +5784,11 @@ static void interface_create_result(const char *error, struct interface_create_data *data = user_data; const char *path = NULL; int err; -#if defined TIZEN_EXT - int ret; -#endif SUPPLICANT_DBG(""); if (error) { - g_message("error %s", error); -#if defined TIZEN_EXT - SUPPLICANT_DBG("error %s", error); - if (strcmp(error, "fi.w1.wpa_supplicant1.InterfaceExists") == 0) { - SUPPLICANT_DBG("Send method: GetInterface"); - ret = supplicant_dbus_method_call(SUPPLICANT_PATH, - SUPPLICANT_INTERFACE, - "GetInterface", - interface_get_params, - interface_get_result, user_data, - NULL); - if (ret < 0) - interface_create_data_free(data); - return; - } -#endif + g_warning("error %s", error); err = -EIO; goto done; } @@ -5578,6 +5856,19 @@ static void interface_create_params(DBusMessageIter *iter, void *user_data) DBUS_TYPE_STRING, &config_file); } +#ifdef TIZEN_EXT + if (data->driver && g_strstr_len(data->driver, strlen(data->driver), "nl80211")) { + supplicant_dbus_dict_append_basic(&dict, "MacAddr", + DBUS_TYPE_UINT32, &data->mac_addr); + + supplicant_dbus_dict_append_basic(&dict, "PreassocMacAddr", + DBUS_TYPE_UINT32, &data->preassoc_mac_addr); + + supplicant_dbus_dict_append_basic(&dict, "RandAddrLifetime", + DBUS_TYPE_UINT32, &data->random_mac_lifetime); + } +#endif /* TIZEN_EXT */ + #if defined TIZEN_EXT_WIFI_MESH if (data->is_mesh_interface) { if (data->parent_ifname) @@ -5647,6 +5938,9 @@ static void interface_get_result(const char *error, const char *path = NULL; int err; +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG(""); if (error) { @@ -5717,7 +6011,9 @@ done: static void interface_get_params(DBusMessageIter *iter, void *user_data) { struct interface_create_data *data = user_data; - +#if defined TIZEN_EXT + if (!simplified_log) +#endif SUPPLICANT_DBG(""); dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &data->ifname); @@ -5836,6 +6132,11 @@ int g_supplicant_interface_mesh_peer_change_status( int g_supplicant_interface_create(const char *ifname, const char *driver, const char *bridge, +#ifdef TIZEN_EXT + unsigned int mac_policy, + unsigned int preassoc_mac_policy, + unsigned int random_mac_lifetime, +#endif /* TIZEN_EXT */ GSupplicantInterfaceCallback callback, void *user_data) { @@ -5858,9 +6159,13 @@ int g_supplicant_interface_create(const char *ifname, const char *driver, data->driver = g_strdup(driver); data->bridge = g_strdup(bridge); data->callback = callback; +#ifdef TIZEN_EXT + data->mac_addr = mac_policy; + data->preassoc_mac_addr = preassoc_mac_policy; + data->random_mac_lifetime = random_mac_lifetime; +#endif /* TIZEN_EXT */ data->user_data = user_data; -#if !defined TIZEN_EXT ret = supplicant_dbus_method_call(SUPPLICANT_PATH, SUPPLICANT_INTERFACE, "GetInterface", @@ -5869,16 +6174,6 @@ int g_supplicant_interface_create(const char *ifname, const char *driver, NULL); if (ret < 0) interface_create_data_free(data); -#else - ret = supplicant_dbus_method_call(SUPPLICANT_PATH, - SUPPLICANT_INTERFACE, - "CreateInterface", - interface_create_params, - interface_create_result, data, - NULL); - if (ret < 0) - interface_create_data_free(data); -#endif return ret; } @@ -6258,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) { @@ -6266,7 +6562,12 @@ static void interface_signalpoll_result(const char *error, goto out; } - dbus_message_iter_get_arg_type(iter); + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_VARIANT) { + err = -EINVAL; + SUPPLICANT_DBG("invalid reply"); + goto out; + } + dbus_message_iter_recurse(iter, &sub_iter); dbus_message_iter_recurse(&sub_iter, &dict); @@ -6289,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); @@ -6296,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); @@ -6635,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", @@ -6647,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); @@ -7064,7 +7365,10 @@ static void add_network_security(DBusMessageIter *dict, GSupplicantSSID *ssid) add_network_security_proto(dict, ssid); break; case G_SUPPLICANT_SECURITY_SAE: - key_mgmt = "SAE"; + if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_PSK) + key_mgmt = "SAE WPA-PSK"; // WFA (WPA3 & WPA2 Mixed -> WPA2 only) + else + key_mgmt = "SAE"; add_network_security_psk(dict, ssid); break; case G_SUPPLICANT_SECURITY_OWE: @@ -7147,7 +7451,11 @@ static void interface_add_network_params(DBusMessageIter *iter, void *user_data) ssid->ssid_len); #if defined TIZEN_EXT - if (ssid->bssid) { + bool owe_transition_mode = FALSE; + if ((ssid->security == G_SUPPLICANT_SECURITY_OWE) && !(ssid->keymgmt & G_SUPPLICANT_KEYMGMT_OWE)) + owe_transition_mode = TRUE; + + if (ssid->bssid && !owe_transition_mode) { char *bssid = NULL; bssid = g_try_malloc0(18); if (bssid == NULL) { @@ -7376,8 +7684,16 @@ static int send_decryption_request(const char *passphrase, if (!msg) return -EINVAL; +#if defined TIZEN_EXT + if (!dbus_message_append_args(msg, DBUS_TYPE_STRING, &passphrase, + DBUS_TYPE_INVALID)) { + SUPPLICANT_DBG("Could not fulfill decryption request"); + return -ENOMEM; + } +#else dbus_message_append_args(msg, DBUS_TYPE_STRING, &passphrase, DBUS_TYPE_INVALID); +#endif if (!dbus_connection_send_with_reply(connection, msg, &call, DBUS_TIMEOUT_USE_DEFAULT)) { @@ -7648,7 +7964,7 @@ int g_supplicant_interface_connect(GSupplicantInterface *interface, interface_add_network_result, data, interface); } - } + } if (ret < 0) { g_free(data->path); @@ -8352,7 +8668,7 @@ static void invoke_introspect_method(void) dbus_message_unref(message); } -#if defined TIZEN_EXT +#if defined TIZEN_EXT && defined TIZEN_EXT_INS void g_supplicant_set_ins_settings(GSupplicantINSPreferredFreq preferred_freq_bssid, bool last_connected_bssid, bool assoc_reject, bool signal_bssid, unsigned int preferred_freq_bssid_score, unsigned int last_connected_bssid_score, @@ -8378,7 +8694,7 @@ void g_supplicant_set_ins_settings(GSupplicantINSPreferredFreq preferred_freq_bs SUPPLICANT_DBG("signal_level3_5ghz [%d]", signal_level3_5ghz); SUPPLICANT_DBG("signal_level3_24ghz [%d]", signal_level3_24ghz); } -#endif +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_INS */ #if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET void g_supplicant_register_eap_callback(g_supplicant_eap_callback cb) @@ -8422,7 +8738,9 @@ int g_supplicant_register(const GSupplicantCallbacks *callbacks) connection = NULL; return -EIO; } - +#if defined TIZEN_EXT + simplified_log = connman_setting_get_bool("SimplifiedLog"); +#endif callbacks_pointer = callbacks; eap_methods = 0; @@ -8561,3 +8879,176 @@ void g_supplicant_unregister(const GSupplicantCallbacks *callbacks) callbacks_pointer = NULL; eap_methods = 0; } + +#ifdef TIZEN_EXT +struct supplicant_mac_policy { + GSupplicantMacPolicyCallback callback; + dbus_uint32_t policy; + const void *user_data; +}; + +static void mac_policy_result(const char *error, + DBusMessageIter *iter, void *user_data) +{ + struct supplicant_mac_policy *data = user_data; + int result = 0; + + if (!user_data) + return; + + if (error) { + SUPPLICANT_DBG("Mac policy setting failure %s", error); + result = -EINVAL; + } + + if (data->callback) + data->callback(result, data->policy, + (void *) data->user_data); + + dbus_free(data); +} + +static void mac_policy_params(DBusMessageIter *iter, void *user_data) +{ + struct supplicant_mac_policy *data = user_data; + + dbus_message_iter_append_basic(iter, DBUS_TYPE_INT32, &(data->policy)); +} + +int g_supplicant_interface_set_mac_policy(GSupplicantInterface *interface, + GSupplicantMacPolicyCallback callback, + unsigned int policy, + void *user_data) +{ + struct supplicant_mac_policy *data = NULL; + int ret; + + if (!system_available) + return -EFAULT; + + if (!interface) + return -EINVAL; + + data = dbus_malloc0(sizeof(*data)); + if (!data) + return -ENOMEM; + + data->callback = callback; + data->policy = policy; + data->user_data = user_data; + + ret = supplicant_dbus_property_set(interface->path, + SUPPLICANT_INTERFACE ".Interface", + "MacAddr", DBUS_TYPE_INT32_AS_STRING, + mac_policy_params, mac_policy_result, data, NULL); + if (ret < 0) { + SUPPLICANT_DBG("Unable to set MacAddr configuration"); + dbus_free(data); + } + + return ret; +} + +int g_supplicant_interface_set_preassoc_mac_policy(GSupplicantInterface *interface, + GSupplicantMacPolicyCallback callback, + unsigned int policy, + void *user_data) +{ + struct supplicant_mac_policy *data; + int ret; + + if (!system_available) + return -EFAULT; + + if (!interface) + return -EINVAL; + + data = dbus_malloc0(sizeof(*data)); + if (!data) + return -ENOMEM; + + data->callback = callback; + data->policy = policy; + data->user_data = user_data; + + ret = supplicant_dbus_property_set(interface->path, + SUPPLICANT_INTERFACE ".Interface", + "PreassocMacAddr", DBUS_TYPE_INT32_AS_STRING, + mac_policy_params, mac_policy_result, data, NULL); + if (ret < 0) { + SUPPLICANT_DBG("Unable to set PreassocMacAddr configuration"); + dbus_free(data); + } + + return ret; +} + +struct supplicant_random_mac_lifetime { + GSupplicantRandomMaclifetimeCallback callback; + dbus_uint32_t lifetime; + const void *user_data; +}; + +static void random_mac_lifetime_result(const char *error, + DBusMessageIter *iter, void *user_data) +{ + struct supplicant_random_mac_lifetime *data = user_data; + int result = 0; + + if (!user_data) + return; + + if (error) { + SUPPLICANT_DBG("Random Mac lifetime setting failure %s", error); + result = -EINVAL; + } + + if (data->callback) + data->callback(result, data->lifetime, + (void *) data->user_data); + + dbus_free(data); +} + +static void random_mac_lifetime_params(DBusMessageIter *iter, void *user_data) +{ + struct supplicant_random_mac_lifetime *data = user_data; + + dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &(data->lifetime)); +} + +int g_supplicant_interface_set_random_mac_lifetime(GSupplicantInterface *interface, + GSupplicantRandomMaclifetimeCallback callback, + unsigned int lifetime, + void *user_data) +{ + struct supplicant_random_mac_lifetime *data; + int ret; + + if (!system_available) + return -EFAULT; + + if (!interface) + return -EINVAL; + + data = dbus_malloc0(sizeof(*data)); + if (!data) + return -ENOMEM; + + data->callback = callback; + data->lifetime = lifetime; + data->user_data = user_data; + + ret = supplicant_dbus_property_set(interface->path, + SUPPLICANT_INTERFACE ".Interface", + "RandAddrLifetime", DBUS_TYPE_UINT32_AS_STRING, + random_mac_lifetime_params, random_mac_lifetime_result, + data, NULL); + if (ret < 0) { + SUPPLICANT_DBG("Unable to set RandAddrLifetime configuration"); + dbus_free(data); + } + + return ret; +} +#endif