[connman]: Fixed: ConnMan keep trying connection infintely
[platform/upstream/connman.git] / src / network.c
index f928b6a..8687619 100755 (executable)
@@ -97,6 +97,10 @@ struct connman_network {
                unsigned char bssid[WIFI_BSSID_LEN_MAX];
                unsigned int maxrate;
                unsigned int isHS20AP;
+               unsigned int keymgmt;
+               char *keymgmt_type;
+               bool rsn_mode;
+               int disconnect_reason;
 #endif
        } wifi;
 
@@ -843,23 +847,6 @@ static void network_remove(struct connman_network *network)
        network->driver = NULL;
 }
 
-static void network_change(struct connman_network *network)
-{
-       DBG("network %p name %s", network, network->name);
-
-       if (!network->connected)
-               return;
-
-       connman_device_set_disconnected(network->device, true);
-
-       if (network->driver && network->driver->disconnect) {
-               network->driver->disconnect(network);
-               return;
-       }
-
-       network->connected = false;
-}
-
 static void probe_driver(struct connman_network_driver *driver)
 {
        GSList *list;
@@ -1200,6 +1187,15 @@ bool __connman_network_get_weakness(struct connman_network *network)
        return false;
 }
 
+#if defined TIZEN_EXT
+void connman_network_set_connecting(struct connman_network *network)
+{
+       DBG("set network connecting true");
+       network->connecting = TRUE;
+       return;
+}
+#endif
+
 bool connman_network_get_connecting(struct connman_network *network)
 {
        return network->connecting;
@@ -1311,15 +1307,8 @@ static gboolean __connman_network_clear_associating_delayed(gpointer user_data)
 
        if (network->associating == FALSE &&
                        state_ipv4 == CONNMAN_SERVICE_STATE_ASSOCIATION &&
-                       state_ipv6 == CONNMAN_SERVICE_STATE_ASSOCIATION) {
-               __connman_service_ipconfig_indicate_state(service,
-                                                       CONNMAN_SERVICE_STATE_IDLE,
-                                                       CONNMAN_IPCONFIG_TYPE_IPV4);
-
-               __connman_service_ipconfig_indicate_state(service,
-                                                       CONNMAN_SERVICE_STATE_IDLE,
-                                                       CONNMAN_IPCONFIG_TYPE_IPV6);
-       }
+                       state_ipv6 == CONNMAN_SERVICE_STATE_ASSOCIATION)
+               connman_network_clear_associating(network);
 
        return FALSE;
 }
@@ -1355,7 +1344,8 @@ int connman_network_set_associating(struct connman_network *network,
        }
 
 #if defined TIZEN_EXT
-       if (associating == FALSE)
+       if (associating == FALSE &&
+                       connman_network_get_bool(network, "WiFi.UseWPS") == FALSE)
                g_timeout_add_seconds(1,
                                __connman_network_clear_associating_delayed,
                                network);
@@ -1370,8 +1360,13 @@ static void set_associate_error(struct connman_network *network)
 
        service = connman_service_lookup_from_network(network);
 
+#if defined TIZEN_EXT
+       __connman_service_indicate_error(service,
+                                       CONNMAN_SERVICE_ERROR_AUTH_FAILED);
+#else
        __connman_service_indicate_error(service,
                                        CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
+#endif
 }
 
 static void set_configure_error(struct connman_network *network)
@@ -1390,6 +1385,10 @@ static void set_invalid_key_error(struct connman_network *network)
 
        service = connman_service_lookup_from_network(network);
 
+#if defined TIZEN_EXT
+       if (service)
+               __connman_service_set_favorite(service, false);
+#endif
        __connman_service_indicate_error(service,
                                        CONNMAN_SERVICE_ERROR_INVALID_KEY);
 }
@@ -1404,6 +1403,32 @@ static void set_connect_error(struct connman_network *network)
                                        CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
 }
 
+static void set_blocked_error(struct connman_network *network)
+{
+       struct connman_service *service;
+
+       service = connman_service_lookup_from_network(network);
+
+       __connman_service_indicate_error(service,
+                                       CONNMAN_SERVICE_ERROR_BLOCKED);
+}
+
+
+#if defined TIZEN_EXT
+static void set_dhcp_error(struct connman_network *network)
+{
+       struct connman_service *service;
+
+       if (network->associating != FALSE)
+               network->associating = FALSE;
+
+       service = connman_service_lookup_from_network(network);
+
+       __connman_service_indicate_error(service,
+                                       CONNMAN_SERVICE_ERROR_DHCP_FAILED);
+}
+#endif
+
 void connman_network_set_ipv4_method(struct connman_network *network,
                                        enum connman_ipconfig_method method)
 {
@@ -1443,9 +1468,6 @@ void connman_network_set_error(struct connman_network *network,
 {
        DBG("network %p error %d", network, error);
 
-       network->connecting = false;
-       network->associating = false;
-
        switch (error) {
        case CONNMAN_NETWORK_ERROR_UNKNOWN:
                return;
@@ -1461,9 +1483,19 @@ void connman_network_set_error(struct connman_network *network,
        case CONNMAN_NETWORK_ERROR_CONNECT_FAIL:
                set_connect_error(network);
                break;
+#if defined TIZEN_EXT
+       case CONNMAN_NETWORK_ERROR_DHCP_FAIL:
+               set_dhcp_error(network);
+               break;
+#endif
+
+       case CONNMAN_NETWORK_ERROR_BLOCKED:
+               set_blocked_error(network);
+               break;
+
        }
 
-       network_change(network);
+       __connman_network_disconnect(network);
 }
 
 /**
@@ -1484,8 +1516,7 @@ int connman_network_set_connected(struct connman_network *network,
                                                        !connected) {
                connman_network_set_error(network,
                                        CONNMAN_NETWORK_ERROR_CONNECT_FAIL);
-               if (__connman_network_disconnect(network) == 0)
-                       return 0;
+               return 0;
        }
 
        if (network->connected == connected)
@@ -1881,6 +1912,14 @@ const char *connman_network_get_enc_mode(struct connman_network *network)
        return (const char *)network->wifi.encryption_mode;
 }
 
+int connman_network_set_rsn_mode(struct connman_network *network,
+                               bool rsn_mode)
+{
+       network->wifi.rsn_mode = rsn_mode;
+
+       return 0;
+}
+
 int connman_network_set_proxy(struct connman_network *network,
                                const char *proxies)
 {
@@ -1918,6 +1957,44 @@ unsigned int connman_network_get_is_hs20AP(struct connman_network *network)
 
        return network->wifi.isHS20AP;
 }
+
+int connman_network_set_keymgmt(struct connman_network *network,
+                               unsigned int keymgmt)
+{
+       if (network == NULL)
+               return 0;
+
+       network->wifi.keymgmt = keymgmt;
+
+       return 0;
+}
+
+unsigned int connman_network_get_keymgmt(struct connman_network *network)
+{
+       if (network == NULL)
+               return 0;
+
+       return network->wifi.keymgmt;
+}
+
+int connman_network_set_disconnect_reason(struct connman_network *network,
+                               int reason_code)
+{
+       if (network == NULL)
+               return 0;
+
+       network->wifi.disconnect_reason = reason_code;
+
+       return 0;
+}
+
+int connman_network_get_disconnect_reason(struct connman_network *network)
+{
+       if (network == NULL)
+               return 0;
+
+       return network->wifi.disconnect_reason;
+}
 #endif
 
 int connman_network_set_nameservers(struct connman_network *network,
@@ -2131,7 +2208,15 @@ 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"))