Merge "Append AssocStatusCode Property for Wi-Fi Manager Layer" into tizen
[platform/upstream/connman.git] / src / service.c
index e4de9e1..003b629 100755 (executable)
@@ -58,6 +58,10 @@ static unsigned int vpn_autoconnect_timeout = 0;
 static struct connman_service *current_default = NULL;
 static bool services_dirty = false;
 
+#if defined TIZEN_EXT
+static bool auto_connect_mode = TRUE;
+#endif
+
 struct connman_stats {
        bool valid;
        bool enabled;
@@ -77,14 +81,6 @@ struct connman_service_user {
        uid_t current_user;
 };
 
-#ifdef TIZEN_EXT
-enum connman_dnsconfig_method {
-       CONNMAN_DNSCONFIG_METHOD_UNKNOWN = 0,
-       CONNMAN_DNSCONFIG_METHOD_MANUAL  = 1,
-       CONNMAN_DNSCONFIG_METHOD_DHCP    = 2,
-};
-#endif
-
 struct connman_service {
        int refcount;
        char *identifier;
@@ -164,9 +160,11 @@ struct connman_service {
         */
        char *keymgmt_type;
        int disconnect_reason;
+       int assoc_status_code;
 #endif
 #ifdef TIZEN_EXT
-       enum connman_dnsconfig_method dns_config_method;
+       enum connman_dnsconfig_method dns_config_method_ipv4;
+       enum connman_dnsconfig_method dns_config_method_ipv6;
 #endif
 };
 
@@ -619,6 +617,8 @@ static int service_load_passphrase(struct connman_service *service)
        if (str)
                service->passphrase = str;
 
+       g_key_file_free(keyfile);
+
        return 0;
 }
 
@@ -756,11 +756,14 @@ static int service_load(struct connman_service *service)
 
 #ifdef TIZEN_EXT
        char *dns_method;
-       if (TIZEN_TV_EXT) {
-               dns_method = g_key_file_get_string(keyfile, service->identifier,
-                               "Nameservers.method", NULL);
-               service->dns_config_method = __connman_dnsconfig_string2method(dns_method);
-       }
+
+       dns_method = g_key_file_get_string(keyfile, service->identifier,
+                       "Nameservers.IPv4method", NULL);
+       service->dns_config_method_ipv4 = __connman_dnsconfig_string2method(dns_method);
+
+       dns_method = g_key_file_get_string(keyfile, service->identifier,
+                       "Nameservers.IPv6method", NULL);
+       service->dns_config_method_ipv6 = __connman_dnsconfig_string2method(dns_method);
 #endif
 
        service->timeservers_config = g_key_file_get_string_list(keyfile,
@@ -999,18 +1002,26 @@ static int service_save(struct connman_service *service)
        g_key_file_remove_key(keyfile, service->identifier,
                                                        "Nameservers", NULL);
 
-#ifdef TIZEN_EXT
-       if (TIZEN_TV_EXT) {
-               if(service->dns_config_method != 0) {
-                       const char *method;
-                       method = __connman_dnsconfig_method2string(
-                                       service->dns_config_method);
-                       g_key_file_set_string(keyfile, service->identifier,
-                                       "Nameservers.method", method);
-               } else
-               g_key_file_remove_key(keyfile, service->identifier,
-                                                       "Nameservers.method", NULL);
-       }
+#if defined TIZEN_EXT
+       if(service->dns_config_method_ipv4 != 0) {
+               const char *method;
+               method = __connman_dnsconfig_method2string(
+                               service->dns_config_method_ipv4);
+               g_key_file_set_string(keyfile, service->identifier,
+                               "Nameservers.IPv4method", method);
+       } else
+       g_key_file_remove_key(keyfile, service->identifier,
+                                               "Nameservers.IPv4method", NULL);
+
+       if(service->dns_config_method_ipv6 != 0) {
+               const char *method;
+               method = __connman_dnsconfig_method2string(
+                               service->dns_config_method_ipv6);
+               g_key_file_set_string(keyfile, service->identifier,
+                               "Nameservers.IPv6method", method);
+       } else
+       g_key_file_remove_key(keyfile, service->identifier,
+                                                       "Nameservers.IPv6method", NULL);
 #endif
 
        if (service->timeservers_config) {
@@ -1332,25 +1343,138 @@ static int nameserver_add(struct connman_service *service,
        if (index < 0)
                return -ENXIO;
 
+#if defined TIZEN_EXT
+       DBG("Resolver append nameserver: %s", nameserver);
+#endif
        return connman_resolver_append(index, NULL, nameserver);
 }
 
+#if defined TIZEN_EXT
+static int nameserver_add_all(struct connman_service *service,
+               enum connman_ipconfig_type type)
+#else
 static int nameserver_add_all(struct connman_service *service)
+#endif
 {
        int i = 0;
 
        if (service->nameservers_config) {
                while (service->nameservers_config[i]) {
+#if defined TIZEN_EXT
+                       DBG("type %d add service->nameservers_config[%d]:%s",type,
+                           i, service->nameservers_config[i]);
+                       if(strncmp(service->nameservers_config[i], "::", 2) == 0) {
+                               DBG("Invalid nameserver");
+                               i++;
+                               continue;
+                       }
+
+                       switch(type) {
+                       case CONNMAN_IPCONFIG_TYPE_IPV4:
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers_config[i]) == AF_INET &&
+                                   service->dns_config_method_ipv4 ==
+                                   CONNMAN_DNSCONFIG_METHOD_MANUAL) {
+                                       nameserver_add(service,
+                                                      service->nameservers_config[i]);
+                               }
+                               break;
+                       case CONNMAN_IPCONFIG_TYPE_IPV6:
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers_config[i]) == AF_INET6 &&
+                                   service->dns_config_method_ipv6 ==
+                                       CONNMAN_DNSCONFIG_METHOD_MANUAL) {
+                                       nameserver_add(service,
+                                                      service->nameservers_config[i]);
+                               }
+                               break;
+                       case CONNMAN_IPCONFIG_TYPE_ALL:
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers_config[i]) == AF_INET &&
+                                   service->dns_config_method_ipv4 ==
+                                       CONNMAN_DNSCONFIG_METHOD_MANUAL) {
+                                       nameserver_add(service,
+                                                      service->nameservers_config[i]);
+                               }
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers_config[i]) == AF_INET6 &&
+                                   service->dns_config_method_ipv6 ==
+                                       CONNMAN_DNSCONFIG_METHOD_MANUAL) {
+                                       nameserver_add(service,
+                                                      service->nameservers_config[i]);
+                               }
+                               break;
+                       case CONNMAN_IPCONFIG_TYPE_UNKNOWN:
+                               DBG("CONNMAN_IPCONFIG_TYPE_UNKNOWN do nothing");
+                               break;
+                       default:
+                               DBG("default case do nothing");
+                               break;
+                       }
+#else
                        nameserver_add(service, service->nameservers_config[i]);
+#endif
                        i++;
                }
-
+#if !defined TIZEN_EXT
                return 0;
+#endif
        }
 
+#if defined TIZEN_EXT
+       i = 0;
+#endif
        if (service->nameservers) {
                while (service->nameservers[i]) {
+#if defined TIZEN_EXT
+                       DBG("type %d service->nameservers[%d]: %s",type,
+                           i, service->nameservers[i]);
+
+                       switch(type) {
+                       case CONNMAN_IPCONFIG_TYPE_IPV4:
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET &&
+                                       service->dns_config_method_ipv4 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP) {
+                                       nameserver_add(service,
+                                                      service->nameservers[i]);
+                               }
+                               break;
+                       case CONNMAN_IPCONFIG_TYPE_IPV6:
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET6 &&
+                                       service->dns_config_method_ipv6 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP) {
+                                       nameserver_add(service,
+                                                      service->nameservers[i]);
+                               }
+                               break;
+                       case CONNMAN_IPCONFIG_TYPE_ALL:
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET &&
+                                       service->dns_config_method_ipv4 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP) {
+                                       nameserver_add(service,
+                                                      service->nameservers[i]);
+                               }
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET6 &&
+                                       service->dns_config_method_ipv6 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP) {
+                                       nameserver_add(service,
+                                                      service->nameservers[i]);
+                               }
+                               break;
+                       case CONNMAN_IPCONFIG_TYPE_UNKNOWN:
+                               DBG("CONNMAN_IPCONFIG_TYPE_UNKNOWN do nothing");
+                               break;
+                       default:
+                               DBG("default case do nothing");
+                               break;
+                       }
+#else
                        nameserver_add(service, service->nameservers[i]);
+#endif
                        i++;
                }
        }
@@ -1370,10 +1494,18 @@ static int nameserver_remove(struct connman_service *service,
        if (index < 0)
                return -ENXIO;
 
+#if defined TIZEN_EXT
+       DBG("Resolver remove nameserver: %s", nameserver);
+#endif
        return connman_resolver_remove(index, NULL, nameserver);
 }
 
+#if defined TIZEN_EXT
+static int nameserver_remove_all(struct connman_service *service,
+               enum connman_ipconfig_type type)
+#else
 static int nameserver_remove_all(struct connman_service *service)
+#endif
 {
 #if defined TIZEN_EXT
        /**
@@ -1391,14 +1523,123 @@ static int nameserver_remove_all(struct connman_service *service)
                return -ENXIO;
 
        while (service->nameservers_config && service->nameservers_config[i]) {
-
+#if defined TIZEN_EXT
+               DBG("type %d Remove service->nameservers_config[%d]: %s",
+                     type, i, service->nameservers_config[i]);
+               switch(type) {
+               case CONNMAN_IPCONFIG_TYPE_IPV4:
+                       if (connman_inet_check_ipaddress(
+                               service->nameservers_config[i]) == AF_INET &&
+                               (service->dns_config_method_ipv4 ==
+                                       CONNMAN_DNSCONFIG_METHOD_DHCP ||
+                               service->dns_config_method_ipv4 ==
+                                       CONNMAN_DNSCONFIG_METHOD_MANUAL)) {
+                               nameserver_remove(service,
+                                                 service->nameservers_config[i]);
+                       }
+                       break;
+               case CONNMAN_IPCONFIG_TYPE_IPV6:
+                       if (connman_inet_check_ipaddress(
+                               service->nameservers_config[i]) == AF_INET6 &&
+                               (service->dns_config_method_ipv6 ==
+                                       CONNMAN_DNSCONFIG_METHOD_DHCP ||
+                               service->dns_config_method_ipv6 ==
+                                       CONNMAN_DNSCONFIG_METHOD_MANUAL)) {
+                               nameserver_remove(service,
+                                                 service->nameservers_config[i]);
+                       }
+                       break;
+               case CONNMAN_IPCONFIG_TYPE_ALL:
+                       if (connman_inet_check_ipaddress(
+                               service->nameservers_config[i]) == AF_INET &&
+                               (service->dns_config_method_ipv4 ==
+                                       CONNMAN_DNSCONFIG_METHOD_DHCP ||
+                               service->dns_config_method_ipv4 ==
+                                       CONNMAN_DNSCONFIG_METHOD_MANUAL)) {
+                               nameserver_remove(service,
+                                                 service->nameservers_config[i]);
+                       }
+                       if (connman_inet_check_ipaddress(
+                               service->nameservers_config[i]) == AF_INET6 &&
+                               (service->dns_config_method_ipv6 ==
+                                       CONNMAN_DNSCONFIG_METHOD_DHCP ||
+                               service->dns_config_method_ipv6 ==
+                                       CONNMAN_DNSCONFIG_METHOD_MANUAL)) {
+                               nameserver_remove(service,
+                                                 service->nameservers_config[i]);
+                       }
+                       break;
+               case CONNMAN_IPCONFIG_TYPE_UNKNOWN:
+                       DBG("CONNMAN_IPCONFIG_TYPE_UNKNOWN do nothing");
+                       break;
+               default:
+                       DBG("default case do nothing");
+                       break;
+               }
+#else
                nameserver_remove(service, service->nameservers_config[i]);
+#endif
                i++;
        }
 
        i = 0;
        while (service->nameservers && service->nameservers[i]) {
+#if defined TIZEN_EXT
+               DBG("type %d Remove service->nameservers[%d]: %s",type, i,
+                     service->nameservers[i]);
+               switch(type) {
+                       case CONNMAN_IPCONFIG_TYPE_IPV4:
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET &&
+                                       (service->dns_config_method_ipv4 ==
+                                               CONNMAN_DNSCONFIG_METHOD_MANUAL ||
+                                       service->dns_config_method_ipv4 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP)) {
+                                       nameserver_remove(service,
+                                                         service->nameservers[i]);
+                               }
+                               break;
+                       case CONNMAN_IPCONFIG_TYPE_IPV6:
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET6 &&
+                                       (service->dns_config_method_ipv6 ==
+                                               CONNMAN_DNSCONFIG_METHOD_MANUAL ||
+                                       service->dns_config_method_ipv6 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP)) {
+                                       nameserver_remove(service,
+                                                         service->nameservers[i]);
+                               }
+                               break;
+                       case CONNMAN_IPCONFIG_TYPE_ALL:
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET &&
+                                       (service->dns_config_method_ipv4 ==
+                                               CONNMAN_DNSCONFIG_METHOD_MANUAL ||
+                                       service->dns_config_method_ipv4 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP)) {
+                                       nameserver_remove(service,
+                                                         service->nameservers[i]);
+                               }
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET6 &&
+                                       (service->dns_config_method_ipv6 ==
+                                               CONNMAN_DNSCONFIG_METHOD_MANUAL ||
+                                       service->dns_config_method_ipv6 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP)) {
+                                       nameserver_remove(service,
+                                                         service->nameservers[i]);
+                               }
+                               break;
+                       case CONNMAN_IPCONFIG_TYPE_UNKNOWN:
+                               DBG("CONNMAN_IPCONFIG_TYPE_UNKNOWN do nothing");
+                               break;
+                       default:
+                               DBG("default case do nothing");
+                               break;
+               }
+#else
                nameserver_remove(service, service->nameservers[i]);
+#endif
                i++;
        }
 
@@ -1460,13 +1701,19 @@ static int searchdomain_remove_all(struct connman_service *service)
  * inserted to resolver via netlink message (see rtnl.c:rtnl_newnduseropt()
  * for details) and not through service.c
  */
+#if defined TIZEN_EXT
+int __connman_service_nameserver_append(struct connman_service *service,
+                               const char *nameserver, bool is_auto,
+                               enum connman_ipconfig_type type)
+#else
 int __connman_service_nameserver_append(struct connman_service *service,
                                const char *nameserver, bool is_auto)
+#endif
 {
        char **nameservers;
        int len, i;
 
-       DBG("service %p nameserver %s auto %d", service, nameserver, is_auto);
+       DBG("service %p nameserver %s auto %d", service, nameserver, is_auto);
 
        if (!nameserver)
                return -EINVAL;
@@ -1477,8 +1724,15 @@ int __connman_service_nameserver_append(struct connman_service *service,
                nameservers = service->nameservers;
 
        for (i = 0; nameservers && nameservers[i]; i++)
+#if defined TIZEN_EXT
+       {
+               DBG("nameservers[%d] %s, nameserver %s", i, nameservers[i], nameserver);
+#endif
                if (g_strcmp0(nameservers[i], nameserver) == 0)
                        return -EEXIST;
+#if defined TIZEN_EXT
+       }
+#endif
 
        if (nameservers) {
                len = g_strv_length(nameservers);
@@ -1492,29 +1746,41 @@ int __connman_service_nameserver_append(struct connman_service *service,
                return -ENOMEM;
 
        nameservers[len] = g_strdup(nameserver);
-       if (!nameservers[len])
-               return -ENOMEM;
-
        nameservers[len + 1] = NULL;
 
 #ifdef TIZEN_EXT
-       if(TIZEN_TV_EXT &&
-          service->dns_config_method == CONNMAN_DNSCONFIG_METHOD_UNKNOWN)
-               service->dns_config_method = CONNMAN_DNSCONFIG_METHOD_DHCP;
+       if(type == CONNMAN_IPCONFIG_TYPE_IPV4 &&
+                       service->dns_config_method_ipv4 ==
+                       CONNMAN_DNSCONFIG_METHOD_UNKNOWN)
+               service->dns_config_method_ipv4 = CONNMAN_DNSCONFIG_METHOD_DHCP;
+
+       if(type == CONNMAN_IPCONFIG_TYPE_IPV6 &&
+                       service->dns_config_method_ipv6 ==
+                       CONNMAN_DNSCONFIG_METHOD_UNKNOWN)
+               service->dns_config_method_ipv6 = CONNMAN_DNSCONFIG_METHOD_DHCP;
 #endif
 
        if (is_auto) {
                service->nameservers_auto = nameservers;
        } else {
                service->nameservers = nameservers;
+#if defined TIZEN_EXT
+               DBG("nameserver add: %s, type: %d", nameserver, type);
+#endif
                nameserver_add(service, nameserver);
        }
 
        return 0;
 }
 
+#if defined TIZEN_EXT
+int __connman_service_nameserver_remove(struct connman_service *service,
+                               const char *nameserver, bool is_auto,
+                               enum connman_ipconfig_type type)
+#else
 int __connman_service_nameserver_remove(struct connman_service *service,
                                const char *nameserver, bool is_auto)
+#endif
 {
        char **servers, **nameservers;
        bool found = false;
@@ -1572,6 +1838,9 @@ set_servers:
                service->nameservers_auto = nameservers;
        } else {
                service->nameservers = nameservers;
+#if defined TIZEN_EXT
+               DBG("nameserver remove ip_type: %d", type);
+#endif
                nameserver_remove(service, nameserver);
        }
 
@@ -1580,12 +1849,23 @@ set_servers:
 
 void __connman_service_nameserver_clear(struct connman_service *service)
 {
+#if defined TIZEN_EXT
+       DBG("nameserver remove all ip_type: CONNMAN_IPCONFIG_TYPE_ALL");
+       nameserver_remove_all(service, CONNMAN_IPCONFIG_TYPE_ALL);
+#else
        nameserver_remove_all(service);
+#endif
 
        g_strfreev(service->nameservers);
        service->nameservers = NULL;
 
+#if defined TIZEN_EXT
+       DBG("nameserver add all ip_type: CONNMAN_IPCONFIG_TYPE_ALL");
+       nameserver_add_all(service, CONNMAN_IPCONFIG_TYPE_ALL);
+#else
        nameserver_add_all(service);
+#endif
+
 }
 
 static void add_nameserver_route(int family, int index, char *nameserver,
@@ -1925,7 +2205,9 @@ static void state_changed(struct connman_service *service)
        if (!allow_property_changed(service))
                return;
 #endif
-
+#if defined TIZEN_EXT
+       DBG(" %s, %s", str, service->path);
+#endif
        connman_dbus_property_changed_basic(service->path,
                                CONNMAN_SERVICE_INTERFACE, "State",
                                                DBUS_TYPE_STRING, &str);
@@ -2112,31 +2394,141 @@ static void append_nameservers(DBusMessageIter *iter,
        }
 }
 
+#if defined TIZEN_EXT
+static void append_nameserver_manual(DBusMessageIter *iter,
+               struct connman_service *service, const char *server)
+{
+       bool available = true;
+
+       if (service)
+               available = nameserver_available(service, server);
+
+       if (available)
+               dbus_message_iter_append_basic(iter,
+                               DBUS_TYPE_STRING, &server);
+}
+
+static void append_nameserver_dhcp(DBusMessageIter *iter,
+               struct connman_service *service, const char *server)
+{
+       bool available = true;
+
+       if (service)
+               available = nameserver_available(service, server);
+
+       if (available)
+               dbus_message_iter_append_basic(iter,
+                               DBUS_TYPE_STRING, &server);
+}
+#endif
+
 static void append_dns(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
+#if defined TIZEN_EXT
+       int i;
+#endif
 
        if (!is_connected(service))
                return;
 
 #ifdef TIZEN_EXT
        const char *str;
-       if (TIZEN_TV_EXT) {
-               /* Append DNS Config Type */
-               str = __connman_dnsconfig_method2string(service->dns_config_method);
-               if(str != NULL)
-                       dbus_message_iter_append_basic(iter,
-                               DBUS_TYPE_STRING, &str);
+
+       str = __connman_dnsconfig_method2string(service->dns_config_method_ipv4);
+       if(str != NULL) {
+               char *str1 = g_strdup_printf("ipv4.%s", str);
+               dbus_message_iter_append_basic(iter,
+                       DBUS_TYPE_STRING, &str1);
+               g_free(str1);
+       }
+
+       str = __connman_dnsconfig_method2string(service->dns_config_method_ipv6);
+       if(str != NULL) {
+               char *str1 = g_strdup_printf("ipv6.%s", str);
+               dbus_message_iter_append_basic(iter,
+                       DBUS_TYPE_STRING, &str1);
+               g_free(str1);
        }
 #endif
 
        if (service->nameservers_config) {
+#if defined TIZEN_EXT
+               i = 0;
+               while (service->nameservers_config[i]) {
+                       if (connman_inet_check_ipaddress(
+                               service->nameservers_config[i]) == AF_INET &&
+                               service->dns_config_method_ipv4 ==
+                                       CONNMAN_DNSCONFIG_METHOD_MANUAL) {
+                               append_nameserver_manual(iter, service,
+                                               service->nameservers_config[i]);
+                       }
+
+                       if (connman_inet_check_ipaddress(
+                               service->nameservers_config[i]) == AF_INET6 &&
+                               service->dns_config_method_ipv6 ==
+                                       CONNMAN_DNSCONFIG_METHOD_MANUAL) {
+                               append_nameserver_manual(iter, service,
+                                               service->nameservers_config[i]);
+                       }
+                       i++;
+               }
+               /* In case of mixed DNS Config Type one of IPv4/IPv6 can be
+                * dynamic while other is static so try to append the DNS
+                * Address which is dynamic also */
+               if (service->nameservers != NULL) {
+                       i = 0;
+                       while (service->nameservers[i]) {
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET &&
+                                       service->dns_config_method_ipv4 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP) {
+                                       append_nameserver_dhcp(iter, service,
+                                                       service->nameservers[i]);
+                               }
+
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET6 &&
+                                       service->dns_config_method_ipv6 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP) {
+                                       append_nameserver_dhcp(iter, service,
+                                                       service->nameservers[i]);
+                               }
+                               i++;
+                       }
+               }
+#else
                append_nameservers(iter, service, service->nameservers_config);
+#endif
                return;
        } else {
                if (service->nameservers)
+#if defined TIZEN_EXT
+               {
+                       i = 0;
+                       while (service->nameservers[i]) {
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET &&
+                                       service->dns_config_method_ipv4 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP) {
+                                       append_nameserver_dhcp(iter, service,
+                                                       service->nameservers[i]);
+                               }
+
+                               if (connman_inet_check_ipaddress(
+                                       service->nameservers[i]) == AF_INET6 &&
+                                       service->dns_config_method_ipv6 ==
+                                               CONNMAN_DNSCONFIG_METHOD_DHCP) {
+                                       append_nameserver_dhcp(iter, service,
+                                                       service->nameservers[i]);
+                               }
+                               i++;
+                       }
+               }
+#else
                        append_nameservers(iter, service,
                                        service->nameservers);
+#endif
 
                if (service->nameservers_auto)
                        append_nameservers(iter, service,
@@ -2161,18 +2553,43 @@ static void append_dnsconfig(DBusMessageIter *iter, void *user_data)
 #ifdef TIZEN_EXT
        /* Append DNS Config Type */
        const char *str;
-       if (TIZEN_TV_EXT) {
-               str = __connman_dnsconfig_method2string(service->dns_config_method);
-               if(str != NULL)
-                       dbus_message_iter_append_basic(iter,
-                               DBUS_TYPE_STRING, &str);
+       str = __connman_dnsconfig_method2string(service->dns_config_method_ipv4);
+       if(str != NULL) {
+               char *str1 = g_strdup_printf("ipv4.%s", str);
+               dbus_message_iter_append_basic(iter,
+                       DBUS_TYPE_STRING, &str1);
+               g_free(str1);
+       }
+
+       str = __connman_dnsconfig_method2string(service->dns_config_method_ipv6);
+       if(str != NULL) {
+               char *str1 = g_strdup_printf("ipv6.%s", str);
+               dbus_message_iter_append_basic(iter,
+                       DBUS_TYPE_STRING, &str1);
+               g_free(str1);
        }
 #endif
 
        if (!service->nameservers_config)
                return;
 
+#if defined TIZEN_EXT
+       int i = 0;
+       while (service->nameservers_config[i]) {
+               if (connman_inet_check_ipaddress(service->nameservers_config[i]) == AF_INET &&
+                               service->dns_config_method_ipv4 == CONNMAN_DNSCONFIG_METHOD_MANUAL) {
+                       append_nameserver_manual(iter, NULL, service->nameservers_config[i]);
+               }
+
+               if (connman_inet_check_ipaddress(service->nameservers_config[i]) == AF_INET6 &&
+                               service->dns_config_method_ipv6 == CONNMAN_DNSCONFIG_METHOD_MANUAL) {
+                       append_nameserver_manual(iter, NULL, service->nameservers_config[i]);
+               }
+               i++;
+       }
+#else
        append_nameservers(iter, NULL, service->nameservers_config);
+#endif
 }
 
 static void append_ts(DBusMessageIter *iter, void *user_data)
@@ -2743,13 +3160,17 @@ static void append_wifi_ext_info(DBusMessageIter *dict,
 {
        char bssid_buff[WIFI_BSSID_STR_LEN] = {0,};
        char *bssid_str = bssid_buff;
+       const void *ssid;
+       unsigned int ssid_len;
        unsigned char *bssid;
        unsigned int maxrate;
        unsigned int keymgmt;
        uint16_t frequency;
        const char *enc_mode;
+       const char *str;
        gboolean passpoint;
 
+       ssid = connman_network_get_blob(network, "WiFi.SSID", &ssid_len);
        bssid = connman_network_get_bssid(network);
        maxrate = connman_network_get_maxrate(network);
        frequency = connman_network_get_frequency(network);
@@ -2761,6 +3182,8 @@ static void append_wifi_ext_info(DBusMessageIter *dict,
                                bssid[0], bssid[1], bssid[2],
                                bssid[3], bssid[4], bssid[5]);
 
+       connman_dbus_dict_append_fixed_array(dict, "SSID",
+                                       DBUS_TYPE_BYTE, &ssid, ssid_len);
        connman_dbus_dict_append_basic(dict, "BSSID",
                                        DBUS_TYPE_STRING, &bssid_str);
        connman_dbus_dict_append_basic(dict, "MaxRate",
@@ -2773,6 +3196,41 @@ static void append_wifi_ext_info(DBusMessageIter *dict,
                                        DBUS_TYPE_BOOLEAN, &passpoint);
        connman_dbus_dict_append_basic(dict, "Keymgmt",
                                        DBUS_TYPE_UINT32, &keymgmt);
+
+       str = connman_network_get_string(network, "WiFi.Security");
+       if (str != NULL && g_str_equal(str, "ieee8021x") == TRUE) {
+               str = connman_network_get_string(network, "WiFi.EAP");
+               if (str != NULL)
+                       connman_dbus_dict_append_basic(dict, "EAP",
+                                       DBUS_TYPE_STRING, &str);
+
+               str = connman_network_get_string(network, "WiFi.Phase2");
+               if (str != NULL)
+                       connman_dbus_dict_append_basic(dict, "Phase2",
+                                       DBUS_TYPE_STRING, &str);
+
+               str = connman_network_get_string(network, "WiFi.Identity");
+               if (str != NULL)
+                       connman_dbus_dict_append_basic(dict, "Identity",
+                                       DBUS_TYPE_STRING, &str);
+
+               str = connman_network_get_string(network, "WiFi.CACertFile");
+               if (str != NULL)
+                       connman_dbus_dict_append_basic(dict, "CACertFile",
+                                       DBUS_TYPE_STRING, &str);
+
+               str = connman_network_get_string(network,
+                               "WiFi.ClientCertFile");
+               if (str != NULL)
+                       connman_dbus_dict_append_basic(dict, "ClientCertFile",
+                                       DBUS_TYPE_STRING, &str);
+
+               str = connman_network_get_string(network,
+                               "WiFi.PrivateKeyFile");
+               if (str != NULL)
+                       connman_dbus_dict_append_basic(dict, "PrivateKeyFile",
+                                       DBUS_TYPE_STRING, &str);
+       }
 }
 #endif
 
@@ -2790,6 +3248,14 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
                connman_dbus_dict_append_basic(dict, "Frequency",
                                DBUS_TYPE_UINT16, &frequency);
        }
+       const void *wifi_vsie;
+       unsigned int wifi_vsie_len;
+       wifi_vsie = connman_network_get_blob(service->network, "WiFi.Vsie", &wifi_vsie_len);
+       if(wifi_vsie_len > 0) {
+               DBG("ConnMan, service->path=%s vsie length=%d", service->path, wifi_vsie_len);
+       }
+       connman_dbus_dict_append_fixed_array(dict, "Vsie", DBUS_TYPE_BYTE,
+                       &wifi_vsie, wifi_vsie_len);
 #endif
 
        str = __connman_service_type2string(service->type);
@@ -2806,12 +3272,10 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
                                                DBUS_TYPE_STRING, &str);
 
 #ifdef TIZEN_EXT
-       if (TIZEN_TV_EXT) {
-               str = state2string(service->state_ipv6);
-               if (str != NULL)
-                       connman_dbus_dict_append_basic(dict, "StateIPv6",
-                                                       DBUS_TYPE_STRING, &str);
-       }
+       str = state2string(service->state_ipv6);
+       if (str != NULL)
+               connman_dbus_dict_append_basic(dict, "StateIPv6",
+                               DBUS_TYPE_STRING, &str);
 #endif
 
        str = error2string(service->error);
@@ -2867,7 +3331,10 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
                                                append_ethernet, service);
 
                connman_dbus_dict_append_basic(dict, "DisconnectReason",
-                               DBUS_TYPE_UINT32, &service->disconnect_reason);
+                               DBUS_TYPE_INT32, &service->disconnect_reason);
+
+               connman_dbus_dict_append_basic(dict, "AssocStatusCode",
+                               DBUS_TYPE_INT32, &service->assoc_status_code);
 
                break;
 #endif
@@ -3238,6 +3705,18 @@ const char *connman_service_get_proxy_autoconfig(struct connman_service *service
        return NULL;
 }
 
+#if defined TIZEN_EXT
+int connman_service_get_ipv6_dns_method(struct connman_service *service)
+{
+       if (!service) {
+               DBG("Service is NULL");
+               return -1;
+       }
+
+       return service->dns_config_method_ipv6;
+}
+#endif
+
 void __connman_service_set_timeservers(struct connman_service *service,
                                char **timeservers)
 {
@@ -3841,6 +4320,10 @@ static DBusMessage *set_property(DBusConnection *conn,
                GString *str;
                int index;
                const char *gw;
+#if defined TIZEN_EXT
+               enum connman_ipconfig_type ip_type = CONNMAN_IPCONFIG_TYPE_ALL;
+               DBG("%s", name);
+#endif
 
                if (__connman_provider_is_immutable(service->provider) ||
                                service->immutable)
@@ -3863,22 +4346,55 @@ static DBusMessage *set_property(DBusConnection *conn,
 
                dbus_message_iter_recurse(&value, &entry);
 
+#if defined TIZEN_EXT
+               /* IPv4/IPv6 Last DNS config method */
+               int last_dns_ipv4 = service->dns_config_method_ipv4;
+               int last_dns_ipv6 = service->dns_config_method_ipv6;
+               DBG("Last DNS Config Method IPv4: %d IPv6: %d", last_dns_ipv4, last_dns_ipv6);
+#endif
+
                while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) {
                        const char *val;
                        dbus_message_iter_get_basic(&entry, &val);
                        dbus_message_iter_next(&entry);
 #ifdef TIZEN_EXT
-                       if (TIZEN_TV_EXT) {
-                               /* First unpack the DNS Config Method */
-                               if(g_strcmp0(val, "manual") == 0) {
-                                       service->dns_config_method =
-                                               CONNMAN_DNSCONFIG_METHOD_MANUAL;
-                                       continue;
-                               } else if(g_strcmp0(val, "dhcp") == 0) {
-                                       service->dns_config_method =
-                                               CONNMAN_DNSCONFIG_METHOD_DHCP;
-                                       continue;
+                       /* First unpack the DNS Config Method */
+                       DBG("DNS Config Method: %s", val);
+                       if((g_strcmp0(val, "ipv4.manual") == 0)) {
+                               service->dns_config_method_ipv4 =
+                                       CONNMAN_DNSCONFIG_METHOD_MANUAL;
+
+                               if(last_dns_ipv4 != CONNMAN_DNSCONFIG_METHOD_MANUAL) {
+                                       if(ip_type == CONNMAN_IPCONFIG_TYPE_UNKNOWN)
+                                               ip_type = CONNMAN_IPCONFIG_TYPE_IPV4;
+                                       else
+                                               ip_type = CONNMAN_IPCONFIG_TYPE_ALL;
+                               }
+                               continue;
+                       } else if(g_strcmp0(val, "ipv4.dhcp") == 0) {
+                               service->dns_config_method_ipv4 =
+                                       CONNMAN_DNSCONFIG_METHOD_DHCP;
+                               if(last_dns_ipv4 == CONNMAN_DNSCONFIG_METHOD_MANUAL)
+                                       ip_type = CONNMAN_IPCONFIG_TYPE_IPV4;
+
+                               continue;
+                       } else if(g_strcmp0(val, "ipv6.manual") == 0) {
+                               service->dns_config_method_ipv6 =
+                                       CONNMAN_DNSCONFIG_METHOD_MANUAL;
+                               if(last_dns_ipv6 != CONNMAN_DNSCONFIG_METHOD_MANUAL) {
+                                       if(ip_type == CONNMAN_IPCONFIG_TYPE_UNKNOWN)
+                                               ip_type = CONNMAN_IPCONFIG_TYPE_IPV6;
+                                       else
+                                               ip_type = CONNMAN_IPCONFIG_TYPE_ALL;
                                }
+                               continue;
+                       } else if(g_strcmp0(val, "ipv6.dhcp") == 0) {
+                               service->dns_config_method_ipv6 =
+                                       CONNMAN_DNSCONFIG_METHOD_DHCP;
+                               if(last_dns_ipv6 == CONNMAN_DNSCONFIG_METHOD_MANUAL)
+                                       ip_type = CONNMAN_IPCONFIG_TYPE_IPV6;
+
+                               continue;
                        }
 #endif
                        if (connman_inet_check_ipaddress(val) > 0) {
@@ -3889,7 +4405,21 @@ static DBusMessage *set_property(DBusConnection *conn,
                        }
                }
 
+#if defined TIZEN_EXT
+               if (service->dns_config_method_ipv4 == CONNMAN_DNSCONFIG_METHOD_DHCP &&
+                       service->dns_config_method_ipv6 == CONNMAN_DNSCONFIG_METHOD_DHCP) {
+                                       DBG("Both IPv4 and IPv6 DNS Method DHCP");
+                                       ip_type = CONNMAN_IPCONFIG_TYPE_ALL;
+               }
+               if (gw && strlen(gw))
+                       __connman_service_nameserver_del_routes(service,
+                                               ip_type);
+
+               DBG("%s ip_type: %d nameserver remove all", name, ip_type);
+               nameserver_remove_all(service, ip_type);
+#else
                nameserver_remove_all(service);
+#endif
                g_strfreev(service->nameservers_config);
 
                if (str->len > 0) {
@@ -3904,7 +4434,12 @@ static DBusMessage *set_property(DBusConnection *conn,
                if (gw && strlen(gw))
                        __connman_service_nameserver_add_routes(service, gw);
 
+#if defined TIZEN_EXT
+               DBG("%s ip_type: %d nameserver add all", name, ip_type);
+               nameserver_add_all(service, ip_type);
+#else
                nameserver_add_all(service);
+#endif
                dns_configuration_changed(service);
 
                if (__connman_service_is_connected_state(service,
@@ -4365,9 +4900,21 @@ static bool auto_connect_service(GList *services,
                        if (preferred)
                               continue;
 
+#if defined TIZEN_EXT
+                       DBG("Service is not favorite, autoconnecting %d",
+                                       autoconnecting);
+#endif
                        return autoconnecting;
                }
 
+#if defined TIZEN_EXT
+               DBG("service %p identifier %s roaming %d ignore %d "
+                               "ipconfig_usable %d autoconnect %d state %d",
+                               service,
+                               service->identifier, service->roaming,
+                               service->ignore, is_ipconfig_usable(service),
+                               service->autoconnect, service->state);
+#endif
                if (is_ignore(service) || service->state !=
                                CONNMAN_SERVICE_STATE_IDLE)
                        continue;
@@ -4420,6 +4967,21 @@ static gboolean run_auto_connect(gpointer data)
        return FALSE;
 }
 
+#if defined TIZEN_EXT
+bool __connman_service_get_auto_connect_mode(void)
+{
+       return auto_connect_mode;
+}
+
+void __connman_service_set_auto_connect_mode(bool enable)
+{
+       DBG("set auto_connect_mode = %d", enable);
+
+       if (auto_connect_mode != enable)
+               auto_connect_mode = enable;
+}
+#endif
+
 void __connman_service_auto_connect(enum connman_service_connect_reason reason)
 {
        DBG("");
@@ -4427,6 +4989,13 @@ void __connman_service_auto_connect(enum connman_service_connect_reason reason)
        if (autoconnect_timeout != 0)
                return;
 
+#if defined TIZEN_EXT
+       if (auto_connect_mode == FALSE) {
+               DBG("Currently, not auto connection mode");
+               return;
+       }
+#endif
+
        if (!__connman_session_policy_autoconnect(reason))
                return;
 
@@ -4651,6 +5220,12 @@ static DBusMessage *connect_service(DBusConnection *conn,
         */
        if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR)
                connman_service_user_pdn_connection_ref(service);
+
+       /*Reset the Disconnect Reason while issue connect request*/
+       service->disconnect_reason = 0;
+
+       /*Reset the association status code while issue connect request*/
+       service->assoc_status_code = 0;
 #endif
 
        if (service->pending)
@@ -4867,6 +5442,15 @@ bool __connman_service_remove(struct connman_service *service)
        __connman_ipconfig_ipv6_reset_privacy(service->ipconfig_ipv6);
 
 #if defined TIZEN_EXT
+       /* Reset IP Method and DNS Method to DHCP */
+       __connman_ipconfig_set_method(service->ipconfig_ipv4,
+                       CONNMAN_IPCONFIG_METHOD_DHCP);
+       service->dns_config_method_ipv4 = CONNMAN_DNSCONFIG_METHOD_DHCP;
+       g_strfreev(service->nameservers_config);
+       service->nameservers_config = NULL;
+#endif
+
+#if defined TIZEN_EXT
        __connman_storage_remove_service(service->identifier);
 #else
        service_save(service);
@@ -5144,17 +5728,23 @@ static void service_append_added_foreach(gpointer data, gpointer user_data)
        DBusMessageIter *iter = user_data;
 
        if (!service || !service->path) {
+#if !defined TIZEN_EXT
                DBG("service %p or path is NULL", service);
+#endif
                return;
        }
 
        if (g_hash_table_lookup(services_notify->add, service->path)) {
+#if !defined TIZEN_EXT
                DBG("new %s", service->path);
+#endif
 
                append_struct(service, iter);
                g_hash_table_remove(services_notify->add, service->path);
        } else {
+#if !defined TIZEN_EXT
                DBG("changed %s", service->path);
+#endif
 
                append_struct_service(iter, NULL, service);
        }
@@ -6510,6 +7100,7 @@ static int service_indicate_state(struct connman_service *service)
 
                def_service = __connman_service_get_default();
                service->disconnect_reason = connman_network_get_disconnect_reason(service->network);
+               service->assoc_status_code = connman_network_get_assoc_status_code(service->network);
 
                if (!__connman_notifier_is_connected() &&
                        def_service &&
@@ -6550,6 +7141,9 @@ static int service_indicate_state(struct connman_service *service)
 
        case CONNMAN_SERVICE_STATE_FAILURE:
 #if defined TIZEN_EXT
+
+               service->assoc_status_code = connman_network_get_assoc_status_code(service->network);
+
                if (service->type == CONNMAN_SERVICE_TYPE_WIFI)
                        service->order = 5;
                __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO);
@@ -6956,7 +7550,16 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service,
 
        if (is_connected_state(service, old_state) &&
                        !is_connected_state(service, new_state))
+#if defined TIZEN_EXT
+       {
+               DBG("nameserver remove all, type: %d", type);
+               nameserver_remove_all(service, type);
+#else
                nameserver_remove_all(service);
+#endif
+#if defined TIZEN_EXT
+       }
+#endif
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
                service->state_ipv4 = new_state;
@@ -6965,7 +7568,16 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service,
 
        if (!is_connected_state(service, old_state) &&
                        is_connected_state(service, new_state))
+#if defined TIZEN_EXT
+       {
+               DBG("nameserver add all, type: %d", type);
+               nameserver_add_all(service, type);
+#else
                nameserver_add_all(service);
+#endif
+#if defined TIZEN_EXT
+       }
+#endif
 
 #if defined TIZEN_EXT
        int ret = service_indicate_state(service);
@@ -7130,6 +7742,7 @@ static int service_connect(struct connman_service *service)
                         * or EAP-AKA (EAP-TLS, EAP-SIM and EAP-AKA networks
                         * need to be fully provisioned)
                         */
+                       DBG("service eap: %s", service->eap);
                        if (g_str_equal(service->eap, "tls") ||
                                g_str_equal(service->eap, "sim") ||
                                g_str_equal(service->eap, "aka"))
@@ -7557,6 +8170,9 @@ static void service_ip_bound(struct connman_ipconfig *ipconfig,
        struct connman_service *service = __connman_ipconfig_get_data(ipconfig);
        enum connman_ipconfig_method method = CONNMAN_IPCONFIG_METHOD_UNKNOWN;
        enum connman_ipconfig_type type = CONNMAN_IPCONFIG_TYPE_UNKNOWN;
+#if defined TIZEN_EXT
+       int err;
+#endif
 
        DBG("%s ip bound", ifname);
 
@@ -7568,9 +8184,19 @@ static void service_ip_bound(struct connman_ipconfig *ipconfig,
 
        if (type == CONNMAN_IPCONFIG_TYPE_IPV6 &&
                        method == CONNMAN_IPCONFIG_METHOD_AUTO)
+#if defined TIZEN_EXT
+       {
+               err = __connman_ipconfig_gateway_add(ipconfig, service);
+
+               if(err == 0)
+                       __connman_connection_gateway_activate(service,
+                                       CONNMAN_IPCONFIG_TYPE_IPV6);
+       }
+#else
                __connman_service_ipconfig_indicate_state(service,
                                                CONNMAN_SERVICE_STATE_READY,
                                                CONNMAN_IPCONFIG_TYPE_IPV6);
+#endif
 
        settings_changed(service, ipconfig);
 }