X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gsupplicant%2Fsupplicant.c;h=fe1b21f5c56b9684669b0f8cdde4c5bbec27be68;hb=4c163d3e732cc2bf4042cd9dbcb775ce825b96f6;hp=759e165bdd00db66f7ecebec03f24ec4d99fb346;hpb=bae50775b1df50113c0dcb722f023fbf0bf979f3;p=platform%2Fupstream%2Fconnman.git diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c index 759e165..fe1b21f 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 @@ -171,7 +175,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 +189,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 +306,18 @@ 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]; #endif }; @@ -334,8 +346,10 @@ 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; + 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 +402,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; @@ -428,6 +447,8 @@ struct g_connman_bssids { int score_assoc_reject; int score_frequency; int score_strength; + int score_snr; + int score_est_throughput; #endif int ins_score; }; @@ -450,6 +471,7 @@ struct assoc_count_data { }; static unsigned int last_connected_bss_timeout = 0; +static bool simplified_log = true; #endif static int network_remove(struct interface_data *data); @@ -1127,7 +1149,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); @@ -1302,6 +1326,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; @@ -1816,6 +1858,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) @@ -1830,11 +1900,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 || 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) { unsigned int pairwise; @@ -1862,12 +1930,10 @@ 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 || 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); @@ -1988,6 +2054,7 @@ static uint16_t get_assoc_reject_cnt(GHashTable *assoc_reject_table, unsigned ch return assoc_count.assoc_count; } +#if defined TIZEN_EXT_INS static int calculate_score_last_connected_bssid(bool is_last_connected) { int score = 0; @@ -2046,15 +2113,34 @@ 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; +} +#endif + 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; +#if defined TIZEN_EXT_INS score += calculate_score_last_connected_bssid(is_last_connected); 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); +#endif return score; } @@ -2086,11 +2172,14 @@ 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_strength = calculate_score_strength(bss->signal); + bssids->score_snr = (int)bss->snr; + bssids->score_est_throughput = calculate_score_est_throughput(bss->est_throughput); #endif 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); bssid_data->bssid_list = g_slist_append(bssid_data->bssid_list, bssids); } else @@ -2454,6 +2543,14 @@ 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) +{ + 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) @@ -2461,23 +2558,28 @@ 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; + } + 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); if (score_new > score_best) { SUPPLICANT_DBG("new[" MACSTR "][%u] : best[" MACSTR "][%u]", 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); @@ -2486,7 +2588,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; @@ -2536,6 +2638,10 @@ 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; + 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) { @@ -2806,6 +2912,7 @@ 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; @@ -2844,8 +2951,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, 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) { - SUPPLICANT_DBG("IE: match vendor specific data"); + + 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); @@ -3002,6 +3142,10 @@ 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->sae) + bss->security = G_SUPPLICANT_SECURITY_SAE; +#endif else if (bss->psk) bss->security = G_SUPPLICANT_SECURITY_PSK; #if defined TIZEN_EXT @@ -3009,9 +3153,7 @@ static void bss_compute_security(struct g_supplicant_bss *bss) 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; @@ -3030,7 +3172,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) @@ -3122,6 +3266,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); @@ -3137,7 +3292,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); @@ -3146,7 +3303,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); @@ -3171,7 +3330,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); @@ -3202,7 +3363,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); @@ -3435,7 +3598,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) { @@ -3480,7 +3645,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) { @@ -3905,7 +4072,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); @@ -3955,7 +4124,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); @@ -4089,6 +4260,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); @@ -5224,7 +5398,7 @@ static void country_result(const char *error, regdom->callback(result, regdom->alpha2, (void *) regdom->user_data); - g_free(regdom); + dbus_free(regdom); } static void country_params(DBusMessageIter *iter, void *user_data) @@ -5556,6 +5730,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) @@ -5570,6 +5757,53 @@ static void interface_create_params(DBusMessageIter *iter, void *user_data) supplicant_dbus_dict_close(iter, &dict); } +#if defined TIZEN_EXT +static void interface_get_state(const char *key, DBusMessageIter *iter, + void *user_data) +{ + struct interface_create_data *data = user_data; + GSupplicantInterface *interface = NULL; + const char *str = NULL; + + SUPPLICANT_DBG("key[%s]", key); + + if (!data) { + SUPPLICANT_DBG("data is NULL"); + return; + } + + interface = data->interface; + if (!interface) { + SUPPLICANT_DBG("interface is NULL"); + return; + } + + if (iter) + dbus_message_iter_get_basic(iter, &str); + + if (str) { + if (string2state(str) != interface->state) + interface->state = string2state(str); + } + + if (interface->state == G_SUPPLICANT_STATE_DISABLED) + interface->ready = FALSE; + else + interface->ready = TRUE; + + SUPPLICANT_DBG("state %s (%d)", str, interface->state); + + if (data->callback) { + data->callback(0, interface, data->user_data); +#if defined TIZEN_EXT_WIFI_MESH + callback_mesh_support(interface); +#endif + } + + interface_create_data_free(data); +} +#endif + static void interface_get_result(const char *error, DBusMessageIter *iter, void *user_data) { @@ -5578,6 +5812,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) { @@ -5597,6 +5834,16 @@ static void interface_get_result(const char *error, goto done; } +#if defined TIZEN_EXT + data->interface = interface; + err = supplicant_dbus_property_get(path, + SUPPLICANT_INTERFACE ".Interface", + "State", interface_get_state, data, NULL); + + if (err == 0) + return; +#endif + if (data->callback) { data->callback(0, interface, data->user_data); #if !defined TIZEN_EXT @@ -5638,7 +5885,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); @@ -5757,6 +6006,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) { @@ -5779,6 +6033,11 @@ 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; ret = supplicant_dbus_method_call(SUPPLICANT_PATH, @@ -6176,7 +6435,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); @@ -6974,7 +7238,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: @@ -7057,7 +7324,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) { @@ -7286,8 +7557,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)) { @@ -7558,7 +7837,7 @@ int g_supplicant_interface_connect(GSupplicantInterface *interface, interface_add_network_result, data, interface); } - } + } if (ret < 0) { g_free(data->path); @@ -8262,7 +8541,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, @@ -8288,7 +8567,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) @@ -8332,7 +8611,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; @@ -8471,3 +8752,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