Maintain connection status when wifi roaming
[platform/upstream/connman.git] / src / network.c
index 845fa00..8eb8c1e 100755 (executable)
@@ -122,6 +122,7 @@ struct connman_network {
                unsigned int keymgmt;
                char *keymgmt_type;
                bool rsn_mode;
+               bool pmf_required;
                int disconnect_reason;
                int assoc_status_code;
                GSList *vsie_list;
@@ -131,6 +132,7 @@ struct connman_network {
                char *phase1;
                unsigned char country_code[WIFI_COUNTRY_CODE_LEN];
                GSList *bssid_list;
+               GSList *sec_list;
                ieee80211_modes_e phy_mode;
                connection_mode_e connection_mode;
                char *connector;
@@ -144,6 +146,13 @@ struct connman_network {
                void *transition_mode_ssid;
                int transition_mode_ssid_len;
                unsigned char transition_mode_bssid[WIFI_BSSID_LEN_MAX];
+               bool roaming_progress;
+               bool roaming_dhcp;
+               char *roaming_cur_bssid;
+               char *roaming_dst_bssid;
+               __time_t roam_scan_time;
+               unsigned int max_bssid_count;
+               int snr;
 #endif
        } wifi;
 
@@ -554,6 +563,10 @@ static int set_connected_manual(struct connman_network *network)
        ipconfig = __connman_service_get_ip4config(service);
        __connman_ipconfig_enable(ipconfig);
 
+#if defined TIZEN_EXT
+       if (!service || !ipconfig)
+               return -EINVAL;
+#endif
        if (!__connman_ipconfig_get_local(ipconfig))
                __connman_service_read_ip4config(service);
 
@@ -589,7 +602,11 @@ static void remove_dhcp_timeout(struct connman_network *network)
        }
 }
 
+#if defined TIZEN_EXT
+int set_connected_dhcp(struct connman_network *network)
+#else
 static int set_connected_dhcp(struct connman_network *network)
+#endif
 {
        struct connman_service *service;
        struct connman_ipconfig *ipconfig_ipv4;
@@ -1339,6 +1356,7 @@ static void network_destruct(struct connman_network *network)
 #if defined TIZEN_EXT
        g_slist_free_full(network->wifi.vsie_list, g_free);
        g_slist_free_full(network->wifi.bssid_list, g_free);
+       g_hash_table_destroy(network->wifi.assoc_reject_table);
 #endif
        g_free(network->path);
        g_free(network->group);
@@ -1403,6 +1421,9 @@ struct connman_network *
 connman_network_ref_debug(struct connman_network *network,
                        const char *file, int line, const char *caller)
 {
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
                network->refcount + 1, file, line, caller);
 
@@ -1420,6 +1441,9 @@ connman_network_ref_debug(struct connman_network *network,
 void connman_network_unref_debug(struct connman_network *network,
                                const char *file, int line, const char *caller)
 {
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
                network->refcount - 1, file, line, caller);
 
@@ -1787,6 +1811,22 @@ int connman_network_set_associating(struct connman_network *network,
        return 0;
 }
 
+#if defined TIZEN_EXT
+static void set_authenticate_error(struct connman_network *network)
+{
+       struct connman_service *service;
+
+       service = connman_service_lookup_from_network(network);
+
+       if (!service)
+               return;
+
+       __connman_service_indicate_error(service,
+                                       CONNMAN_SERVICE_ERROR_AUTH_FAILED);
+}
+#endif
+
+
 static void set_associate_error(struct connman_network *network)
 {
        struct connman_service *service;
@@ -1794,8 +1834,11 @@ static void set_associate_error(struct connman_network *network)
        service = connman_service_lookup_from_network(network);
 
 #if defined TIZEN_EXT
+       if (!service)
+               return;
+
        __connman_service_indicate_error(service,
-                                       CONNMAN_SERVICE_ERROR_AUTH_FAILED);
+                                       CONNMAN_SERVICE_ERROR_ASSOC_FAILED);
 #else
        __connman_service_indicate_error(service,
                                        CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
@@ -1917,6 +1960,9 @@ void connman_network_set_error(struct connman_network *network,
                set_connect_error(network);
                break;
 #if defined TIZEN_EXT
+       case CONNMAN_NETWORK_ERROR_AUTHENTICATE_FAIL:
+               set_authenticate_error(network);
+               break;
        case CONNMAN_NETWORK_ERROR_DHCP_FAIL:
                set_dhcp_error(network);
                break;
@@ -2415,6 +2461,20 @@ int connman_network_get_maxspeed(struct connman_network *network)
        return 0;
 }
 
+int connman_network_set_sec_list(struct connman_network *network,
+                                       GSList *sec_list)
+{
+       g_slist_free(network->wifi.sec_list);
+       network->wifi.sec_list = sec_list;
+
+       return 0;
+}
+
+void *connman_network_get_sec_list(struct connman_network *network)
+{
+       return network->wifi.sec_list;
+}
+
 int connman_network_set_maxrate(struct connman_network *network,
                                unsigned int maxrate)
 {
@@ -2550,9 +2610,15 @@ unsigned char *connman_network_get_countrycode(struct connman_network *network)
 int connman_network_set_bssid_list(struct connman_network *network,
                                        GSList *bssids)
 {
+       unsigned int max_bssid_count;
+
        g_slist_free_full(network->wifi.bssid_list, g_free);
        network->wifi.bssid_list = bssids;
 
+       max_bssid_count = g_slist_length(bssids);
+       if (network->wifi.max_bssid_count < max_bssid_count)
+               network->wifi.max_bssid_count = max_bssid_count;
+
        return 0;
 }
 
@@ -2590,6 +2656,11 @@ void *connman_network_get_bssid_list(struct connman_network *network)
        return network->wifi.bssid_list;
 }
 
+unsigned int connman_network_get_max_bssid_count(struct connman_network *network)
+{
+       return network->wifi.max_bssid_count;
+}
+
 int connman_network_set_last_connected_bssid(struct connman_network *network,
                                const unsigned char *bssid)
 {
@@ -2618,6 +2689,8 @@ void connman_network_set_assoc_reject_table(struct connman_network *network,
        if (!assoc_reject_table)
                return;
 
+       g_hash_table_destroy(network->wifi.assoc_reject_table);
+
        network->wifi.assoc_reject_table = assoc_reject_table;
 }
 
@@ -2628,6 +2701,27 @@ GHashTable *connman_network_get_assoc_reject_table(struct connman_network *netwo
 
        return network->wifi.assoc_reject_table;
 }
+
+__time_t connman_network_get_roam_scan_time(struct connman_network *network)
+{
+       return network->wifi.roam_scan_time;
+}
+
+void connman_network_set_roam_scan_time(struct connman_network *network,
+                                               __time_t roam_scan_time)
+{
+       network->wifi.roam_scan_time = roam_scan_time;
+}
+
+int connman_network_get_snr(struct connman_network *network)
+{
+       return network->wifi.snr;
+}
+
+void connman_network_set_snr(struct connman_network *network, int snr)
+{
+       network->wifi.snr = snr;
+}
 #endif
 
 int connman_network_set_nameservers(struct connman_network *network,
@@ -2748,6 +2842,21 @@ int connman_network_set_wifi_channel(struct connman_network *network,
        return 0;
 }
 
+int connman_network_set_autoconnect(struct connman_network *network,
+                               bool autoconnect)
+{
+       if (!network->driver || !network->driver->set_autoconnect)
+               return 0;
+       return network->driver->set_autoconnect(network, autoconnect);
+}
+
+bool __connman_network_native_autoconnect(struct connman_network *network)
+{
+       if (!network->driver || !network->driver->set_autoconnect)
+               return false;
+       return true;
+}
+
 uint16_t connman_network_get_wifi_channel(struct connman_network *network)
 {
        return network->wifi.channel;
@@ -2837,6 +2946,12 @@ int connman_network_set_string(struct connman_network *network,
        } else if (g_str_equal(key, "WiFi.NetAccessKey")) {
                g_free(network->wifi.net_access_key);
                network->wifi.net_access_key = g_strdup(value);
+       } else if (g_str_equal(key, "WiFi.RoamingCurBSSID")) {
+               g_free(network->wifi.roaming_cur_bssid);
+               network->wifi.roaming_cur_bssid = g_strdup(value);
+       } else if (g_str_equal(key, "WiFi.RoamingDstBSSID")) {
+               g_free(network->wifi.roaming_dst_bssid);
+               network->wifi.roaming_dst_bssid = g_strdup(value);
 #endif
        } else {
                return -EINVAL;
@@ -2864,15 +2979,7 @@ const char *connman_network_get_string(struct connman_network *network,
        else if (g_str_equal(key, "WiFi.Mode"))
                return network->wifi.mode;
        else if (g_str_equal(key, "WiFi.Security"))
-#if defined TIZEN_EXT
-               if (network->wifi.rsn_mode != true ||
-                   g_str_equal(network->wifi.security, "ieee8021x"))
-                       return network->wifi.security;
-               else
-                       return "rsn";
-#else
                return network->wifi.security;
-#endif
        else if (g_str_equal(key, "WiFi.Passphrase"))
                return network->wifi.passphrase;
        else if (g_str_equal(key, "WiFi.EAP"))
@@ -2910,6 +3017,10 @@ const char *connman_network_get_string(struct connman_network *network,
                return network->wifi.c_sign_key;
        else if (g_str_equal(key, "WiFi.NetAccessKey"))
                return network->wifi.net_access_key;
+       else if (g_str_equal(key, "WiFi.RoamingCurBSSID"))
+               return network->wifi.roaming_cur_bssid;
+       else if (g_str_equal(key, "WiFi.RoamingDstBSSID"))
+               return network->wifi.roaming_dst_bssid;
 #endif
 
        return NULL;
@@ -2941,6 +3052,12 @@ int connman_network_set_bool(struct connman_network *network,
                network->wifi.isHS20AP = value;
        else if (g_strcmp0(key, "WiFi.TRANSITION_MODE") == 0)
                network->wifi.owe_transition_mode = value;
+       else if (g_strcmp0(key, "WiFi.Roaming") == 0)
+               network->wifi.roaming_progress = value;
+       else if (g_strcmp0(key, "WiFi.RoamingDHCP") == 0)
+               network->wifi.roaming_dhcp = value;
+       else if (g_strcmp0(key, "WiFi.PMFRequired") == 0)
+               network->wifi.pmf_required = value;
 #endif
 
        return -EINVAL;
@@ -2969,8 +3086,14 @@ bool connman_network_get_bool(struct connman_network *network,
                return network->default_internet;
        else if (g_str_equal(key, "WiFi.HS20AP"))
                return network->wifi.isHS20AP;
-       else if (g_strcmp0(key, "WiFi.TRANSITION_MODE"))
+       else if (g_str_equal(key, "WiFi.TRANSITION_MODE"))
                return network->wifi.owe_transition_mode;
+       else if (g_str_equal(key, "WiFi.Roaming"))
+               return network->wifi.roaming_progress;
+       else if (g_str_equal(key, "WiFi.RoamingDHCP"))
+               return network->wifi.roaming_dhcp;
+       else if (g_str_equal(key, "WiFi.PMFRequired"))
+               return network->wifi.pmf_required;
 #endif
 
        return false;
@@ -3061,6 +3184,7 @@ const void *connman_network_get_blob(struct connman_network *network,
                return network->wifi.transition_mode_ssid;
 #endif
        }
+
        return NULL;
 }