Modified logic to process each VSIE of all vendors.
[platform/upstream/connman.git] / src / network.c
index 5828829..f7a9925 100755 (executable)
 #define WIFI_BSSID_LEN_MAX 6
 #endif
 
+/*
+ * As per RFC 4861, a host should transmit up to MAX_RTR_SOLICITATIONS(3)
+ * Router Solicitation messages, each separated by at least
+ * RTR_SOLICITATION_INTERVAL(4) seconds to obtain RA for IPv6 auto-configuration.
+ */
+#define RTR_SOLICITATION_INTERVAL      4
+
 static GSList *network_list = NULL;
 static GSList *driver_list = NULL;
 
@@ -96,11 +103,13 @@ struct connman_network {
                char encryption_mode[WIFI_ENCYPTION_MODE_LEN_MAX];
                unsigned char bssid[WIFI_BSSID_LEN_MAX];
                unsigned int maxrate;
-               unsigned int isHS20AP;
+               bool isHS20AP;
                unsigned int keymgmt;
                char *keymgmt_type;
                bool rsn_mode;
                int disconnect_reason;
+               int assoc_status_code;
+               GSList *vsie_list;
 #endif
        } wifi;
 
@@ -111,8 +120,6 @@ struct connman_network {
 
 };
 
-static void autoconf_ipv6_set(struct connman_network *network);
-
 static const char *type2string(enum connman_network_type type)
 {
        switch (type) {
@@ -225,27 +232,12 @@ 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)
@@ -404,6 +396,7 @@ 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);
 
@@ -474,10 +467,13 @@ static void check_dhcpv6(struct nd_router_advert *reply,
                        DBG("re-send router solicitation %d",
                                                network->router_solicit_count);
                        network->router_solicit_count--;
-                       __connman_inet_ipv6_send_rs(network->index, 1,
+                       __connman_inet_ipv6_send_rs(network->index, RTR_SOLICITATION_INTERVAL,
                                                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;
        }
@@ -490,6 +486,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;
        }
 
@@ -518,11 +517,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;
@@ -629,7 +638,8 @@ static void autoconf_ipv6_set(struct connman_network *network)
 
        /* Try to get stateless DHCPv6 information, RFC 3736 */
        network->router_solicit_count = 3;
-       __connman_inet_ipv6_send_rs(index, 1, check_dhcpv6, network);
+       __connman_inet_ipv6_send_rs(index, RTR_SOLICITATION_INTERVAL,
+                       check_dhcpv6, network);
 }
 
 static void set_connected(struct connman_network *network)
@@ -959,7 +969,9 @@ static void network_destruct(struct connman_network *network)
        g_free(network->wifi.private_key_passphrase);
        g_free(network->wifi.phase2_auth);
        g_free(network->wifi.pin_wps);
-
+#if defined TIZEN_EXT
+       g_slist_free_full(network->wifi.vsie_list, g_free);
+#endif
        g_free(network->path);
        g_free(network->group);
        g_free(network->node);
@@ -1679,7 +1691,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) {
@@ -1718,7 +1732,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);
 
@@ -1816,9 +1832,7 @@ 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);
 
@@ -1841,16 +1855,11 @@ 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;
 
@@ -2012,62 +2021,63 @@ int connman_network_set_proxy(struct connman_network *network,
        return 0;
 }
 
-int connman_network_set_is_hs20AP(struct connman_network *network,
-                               unsigned int isHS20AP)
+int connman_network_set_keymgmt(struct connman_network *network,
+                               unsigned int keymgmt)
 {
-       if (!network)
+       if (network == NULL)
                return 0;
 
-       network->wifi.isHS20AP = isHS20AP;
+       network->wifi.keymgmt = keymgmt;
 
        return 0;
 }
 
-unsigned int connman_network_get_is_hs20AP(struct connman_network *network)
+unsigned int connman_network_get_keymgmt(struct connman_network *network)
 {
-       if (!network)
+       if (network == NULL)
                return 0;
 
-       return network->wifi.isHS20AP;
+       return network->wifi.keymgmt;
 }
 
-int connman_network_set_keymgmt(struct connman_network *network,
-                               unsigned int keymgmt)
+int connman_network_set_disconnect_reason(struct connman_network *network,
+                               int reason_code)
 {
        if (network == NULL)
                return 0;
 
-       network->wifi.keymgmt = keymgmt;
+       network->wifi.disconnect_reason = reason_code;
 
        return 0;
 }
 
-unsigned int connman_network_get_keymgmt(struct connman_network *network)
+int connman_network_get_disconnect_reason(struct connman_network *network)
 {
        if (network == NULL)
                return 0;
 
-       return network->wifi.keymgmt;
+       return network->wifi.disconnect_reason;
 }
 
-int connman_network_set_disconnect_reason(struct connman_network *network,
-                               int reason_code)
+int connman_network_set_assoc_status_code(struct connman_network *network,
+                               int assoc_status_code)
 {
+
        if (network == NULL)
                return 0;
 
-       network->wifi.disconnect_reason = reason_code;
-
+       network->wifi.assoc_status_code = assoc_status_code;
        return 0;
 }
 
-int connman_network_get_disconnect_reason(struct connman_network *network)
+int connman_network_get_assoc_status_code(struct connman_network *network)
 {
        if (network == NULL)
                return 0;
 
-       return network->wifi.disconnect_reason;
+       return network->wifi.assoc_status_code;
 }
+
 #endif
 
 int connman_network_set_nameservers(struct connman_network *network,
@@ -2228,6 +2238,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")) {
@@ -2344,6 +2357,8 @@ int connman_network_set_bool(struct connman_network *network,
 #if defined TIZEN_EXT
        else if (g_strcmp0(key, "DefaultInternet") == 0)
                network->default_internet = value;
+       else if (g_strcmp0(key, "WiFi.HS20AP") == 0)
+               network->wifi.isHS20AP = value;
 #endif
 
        return -EINVAL;
@@ -2372,11 +2387,38 @@ bool connman_network_get_bool(struct connman_network *network,
 #if defined TIZEN_EXT
        else if (g_str_equal(key, "DefaultInternet"))
                return network->default_internet;
+       else if (g_str_equal(key, "WiFi.HS20AP"))
+               return network->wifi.isHS20AP;
 #endif
 
        return false;
 }
 
+#if defined TIZEN_EXT
+/**
+ * connman_network_set_vsie_list:
+ * @network: network structure
+ * @vsie_list: GSList pointer
+ *
+ * Set vendor specific list pointer
+ */
+void connman_network_set_vsie_list(struct connman_network *network, GSList *vsie_list)
+{
+       network->wifi.vsie_list = vsie_list;
+}
+
+/**
+ * connman_network_get_vsie_list:
+ * @network: network structure
+ *
+ * Get vendor specific list pointer
+ */
+void *connman_network_get_vsie_list(struct connman_network *network)
+{
+       return network->wifi.vsie_list;
+}
+#endif
+
 /**
  * connman_network_set_blob:
  * @network: network structure
@@ -2419,7 +2461,9 @@ int connman_network_set_blob(struct connman_network *network,
 const void *connman_network_get_blob(struct connman_network *network,
                                        const char *key, unsigned int *size)
 {
+#if !defined TIZEN_EXT
        DBG("network %p key %s", network, key);
+#endif
 
        if (g_str_equal(key, "WiFi.SSID")) {
                if (size)