Fix unintentional reconnection on disconnect request
[platform/upstream/connman.git] / gsupplicant / supplicant.c
index fd0e509..723f2cf 100755 (executable)
 #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
@@ -119,6 +122,7 @@ static struct strvalmap keymgmt_map[] = {
        { "wps",                G_SUPPLICANT_KEYMGMT_WPS                },
 #if defined TIZEN_EXT
        { "sae",                G_SUPPLICANT_KEYMGMT_SAE                },
+       { "ft-sae",             G_SUPPLICANT_KEYMGMT_FT_SAE             },
        { "owe",                G_SUPPLICANT_KEYMGMT_OWE                },
        { "dpp",                G_SUPPLICANT_KEYMGMT_DPP                },
 #endif
@@ -189,7 +193,7 @@ static struct _GSupplicantINSSettings ins_settings;
 static unsigned char invalid_bssid[WIFI_BSSID_LEN_MAX] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
-#endif
+#endif /* defined TIZEN_EXT */
 
 static GHashTable *interface_table;
 static GHashTable *bss_mapping;
@@ -259,6 +263,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
@@ -300,6 +305,9 @@ 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;
+       dbus_bool_t psk_sha256;
 #endif
        unsigned int wps_capabilities;
 #if defined TIZEN_EXT
@@ -310,6 +318,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
 };
 
@@ -339,6 +348,7 @@ struct _GSupplicantNetwork {
        unsigned char country_code[COUNTRY_CODE_LENGTH];
        GSupplicantPhy_mode phy_mode;
        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];
@@ -394,6 +404,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;
@@ -423,21 +438,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];
@@ -456,6 +456,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);
@@ -538,6 +539,8 @@ static const char *security2string(GSupplicantSecurity security)
        case G_SUPPLICANT_SECURITY_IEEE8021X:
                return "ieee8021x";
 #if defined TIZEN_EXT
+       case G_SUPPLICANT_SECURITY_PSK_SHA256:
+               return "psk_sha256";
        case G_SUPPLICANT_SECURITY_FT_PSK:
                return "ft_psk";
        case G_SUPPLICANT_SECURITY_FT_IEEE8021X:
@@ -667,6 +670,10 @@ 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 ||
+               ssid->security == G_SUPPLICANT_SECURITY_PSK_SHA256 ||
+#endif
                ssid->security == G_SUPPLICANT_SECURITY_NONE) &&
                ssid->passphrase) {
                interface->network_info.passphrase = g_strdup(ssid->passphrase);
@@ -1133,7 +1140,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,12 +1311,35 @@ 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",
                                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;
@@ -1395,10 +1427,26 @@ 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)
+               return NULL;
+
+       return (unsigned char *)interface->add_network_bssid;
+}
 #endif
 
 const char *g_supplicant_interface_get_driver(GSupplicantInterface *interface)
@@ -1537,7 +1585,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);
 }
@@ -1545,7 +1593,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);
 }
@@ -1570,6 +1618,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)
@@ -1712,12 +1786,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)
 {
@@ -1726,6 +1808,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 || !network->best_bss)
+               return FALSE;
+
+       return network->best_bss->pmf_required;
+}
 #endif
 
 const unsigned char *g_supplicant_peer_get_widi_ies(GSupplicantPeer *peer,
@@ -1821,6 +1911,7 @@ 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)
@@ -1829,7 +1920,6 @@ dbus_bool_t g_supplicant_network_get_transition_mode(GSupplicantNetwork *network
        return network->owe_transition_mode;
 }
 
-
 const unsigned char *g_supplicant_network_get_transition_mode_bssid(GSupplicantNetwork *network)
 {
        if (network == NULL)
@@ -1864,12 +1954,11 @@ 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_PSK_SHA256 ||
+                       network->best_bss->security == G_SUPPLICANT_SECURITY_IEEE8021X) {
                unsigned int pairwise;
 
                pairwise = network->best_bss->rsn_pairwise |
@@ -1896,12 +1985,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);
@@ -2080,8 +2166,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;
 
@@ -2089,6 +2189,8 @@ 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;
 }
@@ -2111,20 +2213,25 @@ static void update_bssid_list(gpointer key, gpointer value, gpointer user_data)
                        bssids->strength = 100;
 
                bssids->frequency = bss->frequency;
-
-               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->ins_score = calculate_score(bssids->is_last_connected,
-                       bssids->assoc_reject_cnt, bssids->frequency, bss->signal);
+               bssids->est_throughput = bss->est_throughput;
+               bssids->score_snr = (int)bss->snr;
+
+               if (TIZEN_INS_ENABLED) {
+                       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);
+
+                       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(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,
+                                       bss->snr, bss->est_throughput);
+               } else {
+                       bssids->ins_score = bss->signal;
+               }
 
                bssid_data->bssid_list = g_slist_append(bssid_data->bssid_list, bssids);
        } else
@@ -2142,21 +2249,31 @@ static gint cmp_bss(gconstpointer a, gconstpointer b)
        if (entry_a->ins_score < entry_b->ins_score)
                return 1;
 
+       if (entry_a->ins_score == entry_b->ins_score) {
+               if (entry_a->strength >= entry_b->strength)
+                       return -1;
+               else
+                       return 1;
+       }
+
        return 0;
 }
 
-#if defined TIZEN_EXT_INS
 static void print_bssid_sort(gpointer data, gpointer user_data)
 {
        struct g_connman_bssids *bssids = data;
 
-       SUPPLICANT_DBG("bssid[" MACSTR "] total[%2d] freq[%2d] "
-                       "last_conn[%2d] assoc_reject[%2d] strength[%2d]",
-                       MAC2STR(bssids->bssid), bssids->ins_score,
+       GSupplicantNetwork *network = (GSupplicantNetwork *) 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->score_assoc_reject, bssids->score_strength, bssids->strength - 120);
 }
-#endif
 
 void *g_supplicant_network_get_bssid_list(GSupplicantNetwork *network)
 {
@@ -2172,9 +2289,8 @@ void *g_supplicant_network_get_bssid_list(GSupplicantNetwork *network)
 
        g_hash_table_foreach(network->bss_table, update_bssid_list, &bssid_data);
        bssid_data.bssid_list = g_slist_sort(bssid_data.bssid_list, cmp_bss);
-#if defined TIZEN_EXT_INS
-       g_slist_foreach(bssid_data.bssid_list, print_bssid_sort, NULL);
-#endif
+       if (TIZEN_INS_ENABLED && !simplified_log)
+               g_slist_foreach(bssid_data.bssid_list, print_bssid_sort, (gpointer)network);
 
        return bssid_data.bssid_list;
 }
@@ -2244,6 +2360,42 @@ GHashTable *g_supplicant_network_get_assoc_reject_table(GSupplicantNetwork *netw
        return network->assoc_reject_table;
 }
 
+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;
+}
+
 GSupplicantNetwork *g_supplicant_interface_get_network(GSupplicantInterface *interface,
                const char *group)
 {
@@ -2252,7 +2404,7 @@ GSupplicantNetwork *g_supplicant_interface_get_network(GSupplicantInterface *int
 
        return g_hash_table_lookup(interface->network_table, group);
 }
-#endif
+#endif /* defined TIZEN_EXT */
 
 static void merge_network(GSupplicantNetwork *network)
 {
@@ -2305,8 +2457,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");
@@ -2482,18 +2642,32 @@ static char *create_group(struct g_supplicant_bss *bss)
        if (mode)
                g_string_append_printf(str, "_%s", mode);
 
+#if defined TIZEN_EXT
+       if (bss->security == G_SUPPLICANT_SECURITY_PSK_SHA256)
+               security = "psk";
+       else
+               security = security2string(bss->security);
+#else
        security = security2string(bss->security);
+#endif
        if (security)
                g_string_append_printf(str, "_%s", security);
 
        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 && network->best_bss)
+               return;
+
        network->signal = best_bss->signal;
        network->frequency = best_bss->frequency;
+       network->phy_mode = best_bss->phy_mode;
        network->best_bss = best_bss;
 }
 
@@ -2508,18 +2682,24 @@ static bool update_best_bss(GSupplicantNetwork *network,
                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);
+       if (TIZEN_INS_ENABLED) {
+               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->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);
+               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->snr, network->best_bss->est_throughput);
+       } else {
+               score_new = bss->signal;
+               score_best = network->best_bss->signal;
+       }
 
        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);
 
@@ -2532,7 +2712,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;
@@ -2570,6 +2750,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;
@@ -2583,6 +2764,7 @@ 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);
 
@@ -2862,6 +3044,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
@@ -2879,6 +3062,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);
@@ -2896,7 +3081,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");
 
 /*
@@ -2926,8 +3111,10 @@ 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) {
-                       SUPPLICANT_DBG("IE: match vendor specific data");
+               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);
@@ -2940,7 +3127,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);
@@ -2985,6 +3172,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)
@@ -3041,12 +3240,13 @@ static void bss_compute_security(struct g_supplicant_bss *bss)
 #if defined TIZEN_EXT
        bss->ft_ieee8021x = FALSE;
        bss->ft_psk = FALSE;
+       GSupplicantInterface *interface = bss->interface;
 #endif
 
 #if defined TIZEN_EXT
        if (bss->keymgmt &
                        (G_SUPPLICANT_KEYMGMT_WPA_EAP |
-                                       G_SUPPLICANT_KEYMGMT_WPA_EAP_256))
+                               G_SUPPLICANT_KEYMGMT_WPA_EAP_256))
                bss->ieee8021x = TRUE;
        else if (bss->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_FT_EAP)
                bss->ft_ieee8021x = TRUE;
@@ -3060,8 +3260,13 @@ static void bss_compute_security(struct g_supplicant_bss *bss)
 
 #if defined TIZEN_EXT
        if (bss->keymgmt &
+                       G_SUPPLICANT_KEYMGMT_WPA_PSK_256) {
+               bss->psk_sha256 = TRUE;
+       }
+
+       if (bss->keymgmt &
                        (G_SUPPLICANT_KEYMGMT_WPA_PSK |
-                                       G_SUPPLICANT_KEYMGMT_WPA_PSK_256))
+                               G_SUPPLICANT_KEYMGMT_WPA_PSK_256))
                bss->psk = TRUE;
        else if (bss->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_FT_PSK)
                bss->ft_psk = TRUE;
@@ -3074,7 +3279,9 @@ static void bss_compute_security(struct g_supplicant_bss *bss)
 #endif
 
 #if defined TIZEN_EXT
-       if (bss->keymgmt & G_SUPPLICANT_KEYMGMT_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;
@@ -3084,15 +3291,24 @@ 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) {
+               if (!bss->psk)
+                       bss->security = G_SUPPLICANT_SECURITY_SAE;
+               else if (interface->keymgmt_capa & G_SUPPLICANT_KEYMGMT_SAE)
+                       bss->security = G_SUPPLICANT_SECURITY_SAE;
+               else
+                       bss->security = G_SUPPLICANT_SECURITY_PSK;
+       } else if (bss->psk_sha256)
+               bss->security = G_SUPPLICANT_SECURITY_PSK_SHA256;
+#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 || bss->owe_transition_mode)
                bss->security = G_SUPPLICANT_SECURITY_OWE;
        else if (bss->dpp)
@@ -3112,7 +3328,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)
@@ -3204,6 +3422,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);
@@ -3219,7 +3448,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);
@@ -3228,7 +3459,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);
@@ -3253,7 +3486,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);
@@ -3284,7 +3519,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);
@@ -3310,6 +3547,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;
@@ -3386,7 +3625,7 @@ static void remove_timer_for_last_connected(GSupplicantInterface *interface)
                }
        }
 }
-#endif
+#endif /* defined TIZEN_EXT */
 
 static void interface_current_bss(GSupplicantInterface *interface,
                                                DBusMessageIter *iter)
@@ -3394,6 +3633,13 @@ static void interface_current_bss(GSupplicantInterface *interface,
        GSupplicantNetwork *network;
        struct g_supplicant_bss *bss;
        const char *path;
+#if defined TIZEN_EXT
+       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
 
        dbus_message_iter_get_basic(iter, &path);
        if (g_strcmp0(path, "/") == 0) {
@@ -3413,7 +3659,17 @@ static void interface_current_bss(GSupplicantInterface *interface,
 
        interface->current_network = network;
 #if defined TIZEN_EXT
-       SUPPLICANT_DBG("current network [%p]", interface->current_network);
+       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, curr_bssid_str, best_bssid_str);
+
+       if (network->frequency != bss->frequency) {
+               network->frequency = bss->frequency;
+               network->phy_mode = bss->phy_mode;
+               update = TRUE;
+       }
 #endif
 
        if (bss != network->best_bss) {
@@ -3432,9 +3688,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
@@ -3457,7 +3723,8 @@ static void interface_current_bss(GSupplicantInterface *interface,
        case G_SUPPLICANT_STATE_COMPLETED:
                callback_network_associated(network);
 #if defined TIZEN_EXT
-               add_timer_for_last_connected(interface);
+               if (TIZEN_INS_ENABLED)
+                       add_timer_for_last_connected(interface);
 #endif
                break;
        }
@@ -3517,7 +3784,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) {
@@ -3562,7 +3831,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) {
@@ -3612,15 +3883,17 @@ static void interface_property(const char *key, DBusMessageIter *iter,
                                callback_interface_state(interface);
                        }
 #if defined TIZEN_EXT
-               switch (interface->state) {
-               case G_SUPPLICANT_STATE_COMPLETED:
-                       add_timer_for_last_connected(interface);
-                       break;
-               case G_SUPPLICANT_STATE_DISCONNECTED:
-                       remove_timer_for_last_connected(interface);
-                       break;
-               default:
-                       break;
+               if (TIZEN_INS_ENABLED) {
+                       switch (interface->state) {
+                       case G_SUPPLICANT_STATE_COMPLETED:
+                               add_timer_for_last_connected(interface);
+                               break;
+                       case G_SUPPLICANT_STATE_DISCONNECTED:
+                               remove_timer_for_last_connected(interface);
+                               break;
+                       default:
+                               break;
+                       }
                }
 #endif
                if (interface->ap_create_in_progress) {
@@ -3987,7 +4260,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);
@@ -4037,7 +4312,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);
@@ -4085,10 +4362,20 @@ static void signal_network_removed(const char *path, DBusMessageIter *iter)
 
        interface_network_removed(iter, interface);
 }
+
 #if defined TIZEN_EXT
-void *copy_vsie_list(gconstpointer src, gpointer data)
+gpointer copy_vsie_list(gconstpointer src, gpointer data)
 {
-       return g_strdup(src);
+       unsigned char *str = (unsigned char *)src;
+       unsigned char *vsie;
+       vsie = g_try_malloc0(str[1]+2);
+
+       if (vsie)
+               memcpy(vsie, str, str[1]+2);
+       else
+               SUPPLICANT_DBG("Failed to allocate memory");
+
+       return vsie;
 }
 #endif
 
@@ -4171,6 +4458,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);
@@ -4188,8 +4478,11 @@ 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 &&
+                       bss == network->best_bss) {
+               network->frequency = bss->frequency;
+               network->phy_mode = bss->phy_mode;
+       }
 #endif
        old_security = network->security;
        bss_compute_security(bss);
@@ -5570,7 +5863,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;
        }
@@ -5638,6 +5931,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)
@@ -5707,6 +6013,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) {
@@ -5777,7 +6086,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);
@@ -5896,6 +6207,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)
 {
@@ -5918,6 +6234,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,
@@ -6307,6 +6628,8 @@ 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;
+       dbus_uint32_t est_throughput = 0;
        DBusMessageIter sub_iter, dict;
 
        if (error) {
@@ -6315,7 +6638,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);
 
@@ -6333,19 +6661,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;
+               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, data->user_data);
+               data->callback(err, maxspeed, strength, snr, data->user_data, est_throughput);
 
        g_free(data->path);
        dbus_free(data);
@@ -6438,10 +6774,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);
@@ -6530,10 +6870,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);
@@ -6684,10 +7028,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",
@@ -6696,11 +7038,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);
@@ -6995,17 +7335,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_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) {
@@ -7071,8 +7400,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) {
@@ -7088,7 +7425,14 @@ static void add_network_security(DBusMessageIter *dict, GSupplicantSSID *ssid)
                add_network_security_ciphers(dict, ssid);
                break;
        case G_SUPPLICANT_SECURITY_PSK:
+#if defined TIZEN_EXT
+               if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_FT_PSK)
+                       key_mgmt = "FT-PSK WPA-PSK";
+               else
+                       key_mgmt = "WPA-PSK";
+#else
                key_mgmt = "WPA-PSK";
+#endif
                add_network_security_psk(dict, ssid);
                add_network_security_ciphers(dict, ssid);
                add_network_security_proto(dict, ssid);
@@ -7100,6 +7444,15 @@ static void add_network_security(DBusMessageIter *dict, GSupplicantSSID *ssid)
                add_network_security_proto(dict, ssid);
                break;
 #if defined TIZEN_EXT
+       case G_SUPPLICANT_SECURITY_PSK_SHA256:
+               if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_PSK)
+                       key_mgmt = "WPA-PSK-SHA256 WPA-PSK";
+               else
+                       key_mgmt = "WPA-PSK-SHA256";
+               add_network_security_psk(dict, ssid);
+               add_network_security_ciphers(dict, ssid);
+               add_network_security_proto(dict, ssid);
+               break;
        case G_SUPPLICANT_SECURITY_FT_PSK:
                key_mgmt = "FT-PSK";
                add_network_security_psk(dict, ssid);
@@ -7113,11 +7466,24 @@ static void add_network_security(DBusMessageIter *dict, GSupplicantSSID *ssid)
                add_network_security_proto(dict, ssid);
                break;
        case G_SUPPLICANT_SECURITY_SAE:
-               if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_PSK)
-                       key_mgmt = "SAE WPA-PSK"; // WFA (WPA3 & WPA2 Mixed -> WPA2 only)
-               else
-                       key_mgmt = "SAE";
+               if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_FT_SAE) {
+                       if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_SAE)
+                               key_mgmt = "FT-SAE SAE";
+                       else
+                               key_mgmt = "FT-SAE";
+               } else {
+                       if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_PSK) {
+                       key_mgmt = "SAE WPA-PSK";
+                       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";
@@ -7190,10 +7556,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);
@@ -7348,6 +7710,7 @@ static void crypt_method_call_cancel(void)
        }
 
        g_free(decrypt_request_data.data->path);
+       g_free(decrypt_request_data.data->ssid->ssid);
        g_free(decrypt_request_data.data->ssid);
        dbus_free(decrypt_request_data.data);
        decrypt_request_data.data = NULL;
@@ -7365,6 +7728,11 @@ static void decryption_request_reply(DBusPendingCall *call,
 
        SUPPLICANT_DBG("");
 
+       if (!decrypt_request_data.data) {
+               SUPPLICANT_DBG("decryption request is canceled");
+               return;
+       }
+
        reply = dbus_pending_call_steal_reply(call);
 
        dbus_error_init(&error);
@@ -7375,6 +7743,12 @@ static void decryption_request_reply(DBusPendingCall *call,
                goto done;
        }
 
+       if (!g_str_has_prefix(data->interface->path, "/")) {
+               SUPPLICANT_DBG("Invalid path %s", data->interface->path);
+               ret = -EINVAL;
+               goto done;
+       }
+
        if (dbus_message_iter_init(reply, &args) == FALSE) {
                SUPPLICANT_DBG("dbus_message_iter_init() failed");
                ret = -EINVAL;
@@ -7383,6 +7757,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",
@@ -7396,10 +7771,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);
        }
@@ -7432,8 +7811,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)) {
@@ -7497,14 +7884,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);
                        }
                }
@@ -7523,9 +7913,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);
        }
@@ -7704,7 +8097,7 @@ int g_supplicant_interface_connect(GSupplicantInterface *interface,
                                        interface_add_network_result, data,
                                        interface);
                }
-        }
+       }
 
        if (ret < 0) {
                g_free(data->path);
@@ -7862,9 +8255,15 @@ static void interface_disconnect_result(const char *error,
        }
 }
 
+#if defined TIZEN_EXT
+int g_supplicant_interface_disconnect(GSupplicantInterface *interface,
+                                       GSupplicantInterfaceCallback callback,
+                                       void *user_data, void *connman_network)
+#else
 int g_supplicant_interface_disconnect(GSupplicantInterface *interface,
                                        GSupplicantInterfaceCallback callback,
                                                        void *user_data)
+#endif
 {
        struct interface_data *data;
        int ret;
@@ -7879,7 +8278,7 @@ int g_supplicant_interface_disconnect(GSupplicantInterface *interface,
 #if defined TIZEN_EXT
        if (decrypt_request_data.pending_call &&
                        decrypt_request_data.data &&
-                       decrypt_request_data.data->user_data == user_data) {
+                       decrypt_request_data.data->user_data == connman_network) {
 
                callback_assoc_failed(decrypt_request_data.data->user_data);
                crypt_method_call_cancel();
@@ -7909,6 +8308,49 @@ int g_supplicant_interface_disconnect(GSupplicantInterface *interface,
        return ret;
 }
 
+#if defined TIZEN_EXT
+void g_supplicant_interface_remove_network(GSupplicantInterface *interface,
+                               GSupplicantSSID *ssid)
+{
+       struct interface_data *data;
+       int ret;
+
+       SUPPLICANT_DBG("");
+
+       if (!interface)
+               return;
+
+       if (interface->network_path == NULL)
+               return;
+
+       if (!interface->network_info.ssid)
+               return;
+
+       if (memcmp(interface->network_info.ssid, ssid->ssid, ssid->ssid_len))
+               return;
+
+       if (interface->network_info.security != ssid->security)
+               return;
+
+       data = dbus_malloc0(sizeof(*data));
+       if (!data)
+               return;
+
+       data->interface = interface;
+       data->path = g_strdup(interface->path);
+
+       ret = supplicant_dbus_method_call(interface->path,
+                       SUPPLICANT_INTERFACE ".Interface", "RemoveNetwork",
+                       network_remove_params, network_remove_result, data,
+                       interface);
+
+       if (ret < 0) {
+               g_free(data->path);
+               dbus_free(data);
+       }
+}
+#endif
+
 static void interface_p2p_find_result(const char *error,
                                        DBusMessageIter *iter, void *user_data)
 {
@@ -8434,7 +8876,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 */
 
 #if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET
 void g_supplicant_register_eap_callback(g_supplicant_eap_callback cb)
@@ -8478,7 +8920,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;
 
@@ -8617,3 +9061,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