Added some logs for debugging
[platform/upstream/connman.git] / src / network.c
index 4b2ae11..8a6b906 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;
 
@@ -107,6 +111,8 @@ struct connman_network {
 
 };
 
+static void autoconf_ipv6_set(struct connman_network *network);
+
 static const char *type2string(enum connman_network_type type)
 {
        switch (type) {
@@ -219,12 +225,27 @@ static void dhcp_callback(struct connman_ipconfig *ipconfig,
                        struct connman_network *network,
                        bool success, gpointer data)
 {
+#if defined TIZEN_EXT
+       struct connman_service *service;
+       struct connman_ipconfig *ipconfig_ipv6;
+#endif
+
        network->connecting = false;
 
        if (success)
                dhcp_success(network);
        else
                dhcp_failure(network);
+
+#if defined TIZEN_EXT
+       service = connman_service_lookup_from_network(network);
+       ipconfig_ipv6 = __connman_service_get_ip6config(service);
+       if (__connman_ipconfig_get_method(ipconfig_ipv6) == CONNMAN_IPCONFIG_METHOD_AUTO) {
+               DBG("IPv6 autoconf start");
+               set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV6);
+               autoconf_ipv6_set(network);
+       }
+#endif
 }
 
 static int set_connected_manual(struct connman_network *network)
@@ -383,7 +404,6 @@ err:
        return err;
 }
 
-static void autoconf_ipv6_set(struct connman_network *network);
 static void dhcpv6_callback(struct connman_network *network,
                        enum __connman_dhcpv6_status status, gpointer data);
 
@@ -458,6 +478,9 @@ static void check_dhcpv6(struct nd_router_advert *reply,
                                                check_dhcpv6, network);
                        return;
                }
+#if defined TIZEN_EXT
+               DBG("RA message is not received from server in reply of RS.");
+#endif
                connman_network_unref(network);
                return;
        }
@@ -470,6 +493,9 @@ static void check_dhcpv6(struct nd_router_advert *reply,
         */
        if (!network->connected) {
                connman_network_unref(network);
+#if defined TIZEN_EXT
+               DBG("Network is not connected");
+#endif
                return;
        }
 
@@ -498,11 +524,21 @@ static void check_dhcpv6(struct nd_router_advert *reply,
         * We do stateful/stateless DHCPv6 if router advertisement says so.
         */
        if (reply->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED) {
+#if defined TIZEN_EXT
+               DBG("IPv6 ND_RA_FLAG_MANAGED");
+#endif
                __connman_dhcpv6_start(network, prefixes, dhcpv6_callback);
        } else {
                if (reply->nd_ra_flags_reserved & ND_RA_FLAG_OTHER)
+#if defined TIZEN_EXT
+               {
+                       DBG("IPv6 ND_RA_FLAG_OTHER");
+#endif
                        __connman_dhcpv6_start_info(network,
                                                        dhcpv6_info_callback);
+#if defined TIZEN_EXT
+               }
+#endif
 
                g_slist_free_full(prefixes, g_free);
                network->connecting = false;
@@ -843,23 +879,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 +1219,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,8 +1339,35 @@ 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_network_clear_associating(network);
+                       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);
+       } else {
+               if (network->associating == FALSE) {
+                       struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
+                       enum connman_ipconfig_method ipv4_method, ipv6_method;
+
+                       ipconfig_ipv4 = __connman_service_get_ip4config(service);
+                       ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
+                       ipconfig_ipv6 = __connman_service_get_ip4config(service);
+                       ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
+
+                       if((ipv4_method == CONNMAN_IPCONFIG_METHOD_UNKNOWN || ipv4_method == CONNMAN_IPCONFIG_METHOD_OFF) &&
+                                       (state_ipv6 == CONNMAN_SERVICE_STATE_ASSOCIATION))
+                               __connman_service_ipconfig_indicate_state(service,
+                                               CONNMAN_SERVICE_STATE_IDLE,
+                                               CONNMAN_IPCONFIG_TYPE_IPV6);
+                       if((ipv6_method == CONNMAN_IPCONFIG_METHOD_UNKNOWN || ipv6_method == CONNMAN_IPCONFIG_METHOD_OFF) &&
+                                       (state_ipv4 == CONNMAN_SERVICE_STATE_ASSOCIATION))
+                               __connman_service_ipconfig_indicate_state(service,
+                                               CONNMAN_SERVICE_STATE_IDLE,
+                                               CONNMAN_IPCONFIG_TYPE_IPV4);
+               }
+       }
 
        return FALSE;
 }
@@ -1364,8 +1419,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)
@@ -1384,6 +1444,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);
 }
@@ -1398,6 +1462,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)
 {
@@ -1437,9 +1527,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;
@@ -1455,9 +1542,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);
 }
 
 /**
@@ -1478,8 +1575,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)
@@ -1599,7 +1695,9 @@ int __connman_network_connect(struct connman_network *network)
        if (network->type != CONNMAN_NETWORK_TYPE_CELLULAR)
 #endif
        __connman_device_disconnect(network->device);
-
+#if defined TIZEN_EXT
+       DBG("ConnMan, Connect Request [%s]", network->name);
+#endif
        err = network->driver->connect(network);
        if (err < 0) {
                if (err == -EINPROGRESS) {
@@ -1638,7 +1736,9 @@ int __connman_network_disconnect(struct connman_network *network)
                return -EUNATCH;
 
        network->connecting = false;
-
+#if defined TIZEN_EXT
+       DBG("ConnMan, Disconnect request");
+#endif
        if (network->driver->disconnect)
                err = network->driver->disconnect(network);
 
@@ -1692,6 +1792,29 @@ int __connman_network_clear_ipconfig(struct connman_network *network,
        return 0;
 }
 
+#if defined TIZEN_EXT
+void __connman_network_set_auto_ipv6_gateway(char *gateway, void *user_data)
+{
+       DBG("");
+
+       struct connman_network *network = user_data;
+       struct connman_service *service;
+       struct connman_ipconfig *ipconfig = NULL;
+
+       service = connman_service_lookup_from_network(network);
+       if (service == NULL)
+               return;
+
+       ipconfig = __connman_service_get_ipconfig(service, AF_INET6);
+       if (ipconfig == NULL)
+               return;
+
+       __connman_ipconfig_set_gateway(ipconfig, gateway);
+
+       return;
+}
+#endif
+
 int __connman_network_enable_ipconfig(struct connman_network *network,
                                struct connman_ipconfig *ipconfig)
 {
@@ -1713,7 +1836,9 @@ int __connman_network_enable_ipconfig(struct connman_network *network,
                return -ENOSYS;
 
        case CONNMAN_IPCONFIG_TYPE_IPV6:
+#if !defined TIZEN_EXT
                set_configuration(network, type);
+#endif
 
                method = __connman_ipconfig_get_method(ipconfig);
 
@@ -1736,11 +1861,16 @@ int __connman_network_enable_ipconfig(struct connman_network *network,
                                CONNMAN_SERVICE_STATE_CONFIGURATION,
                                        CONNMAN_IPCONFIG_TYPE_IPV6);
 #endif
+#if !defined TIZEN_EXT
                        autoconf_ipv6_set(network);
+#endif
                        break;
 
                case CONNMAN_IPCONFIG_METHOD_FIXED:
                case CONNMAN_IPCONFIG_METHOD_MANUAL:
+#if defined TIZEN_EXT
+                       set_configuration(network, type);
+#endif
                        r = manual_ipv6_set(network, ipconfig);
                        break;
 
@@ -1875,6 +2005,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)
 {
@@ -1912,6 +2050,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,
@@ -1935,8 +2111,14 @@ int connman_network_set_nameservers(struct connman_network *network,
        nameservers_array = g_strsplit(nameservers, " ", 0);
 
        for (i = 0; nameservers_array[i]; i++) {
+#if defined TIZEN_EXT
+               __connman_service_nameserver_append(service,
+                                               nameservers_array[i], false,
+                                               CONNMAN_IPCONFIG_TYPE_ALL);
+#else
                __connman_service_nameserver_append(service,
                                                nameservers_array[i], false);
+#endif
        }
 
        g_strfreev(nameservers_array);
@@ -2066,6 +2248,9 @@ int connman_network_set_string(struct connman_network *network,
                g_free(network->wifi.security);
                network->wifi.security = g_strdup(value);
        } else if (g_str_equal(key, "WiFi.Passphrase")) {
+#if defined TIZEN_EXT
+               DBG("ConnMan, %p key %s", network, key);
+#endif
                g_free(network->wifi.passphrase);
                network->wifi.passphrase = g_strdup(value);
        } else if (g_str_equal(key, "WiFi.EAP")) {
@@ -2125,7 +2310,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"))