Updated connman to version 1.35 94/166794/2
authorSeonah Moon <seonah1.moon@samsung.com>
Tue, 23 Jan 2018 05:50:50 +0000 (14:50 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Tue, 23 Jan 2018 05:50:55 +0000 (14:50 +0900)
Change-Id: I13526fbf80296a79be15548fc226a308941ac9ec
Signed-off-by: Taesub Kim <taesub.kim@samsung.com>
104 files changed:
1  2 
AUTHORS
Makefile.am
Makefile.plugins
README
TODO
client/commands.c
client/dbus_helpers.c
client/input.c
configure.ac
doc/agent-api.txt
doc/config-format.txt
doc/connman.conf.5.in
doc/overview-api.txt
doc/plugin-api.txt
doc/service-api.txt
doc/session-api.txt
doc/session-overview.txt
doc/technology-api.txt
doc/vpn-config-format.txt
doc/vpn-connection-api.txt
gdbus/client.c
gdbus/gdbus.h
gdbus/object.c
gdhcp/client.c
gdhcp/common.c
gdhcp/gdhcp.h
gdhcp/ipv4ll.c
gdhcp/server.c
gsupplicant/gsupplicant.h
gsupplicant/supplicant.c
gweb/gresolv.c
gweb/gweb.c
include/device.h
include/network.h
include/provider.h
include/service.h
include/session.h
include/technology.h
packaging/connman.spec
plugins/bluetooth.c
plugins/ethernet.c
plugins/gadget.c
plugins/neard.c
plugins/ofono.c
plugins/pacrunner.c
plugins/session_policy_local.c
plugins/vpn.c
plugins/wifi.c
scripts/connman.in
src/6to4.c
src/agent-connman.c
src/agent.c
src/bridge.c
src/config.c
src/connection.c
src/connman.h
src/device.c
src/dhcp.c
src/dhcpv6.c
src/dnsproxy.c
src/inet.c
src/ipconfig.c
src/ippool.c
src/iptables.c
src/log.c
src/main.c
src/main.conf
src/nat.c
src/network.c
src/ntp.c
src/peer.c
src/peer_service.c
src/provider.c
src/proxy.c
src/resolver.c
src/rfkill.c
src/rtnl.c
src/service.c
src/session.c
src/stats.c
src/storage.c
src/task.c
src/technology.c
src/tethering.c
src/timeserver.c
src/util.c
src/wispr.c
src/wpad.c
tools/iptables-unit.c
tools/session-test.h
tools/stats-tool.c
unit/test-ippool.c
vpn/connman-vpn.service.in
vpn/main.c
vpn/plugins/l2tp.c
vpn/plugins/openconnect.c
vpn/plugins/openvpn.c
vpn/plugins/pptp.c
vpn/plugins/vpn.c
vpn/plugins/vpn.h
vpn/plugins/vpnc.c
vpn/vpn-config.c
vpn/vpn-provider.c
vpn/vpn-provider.h

diff --cc AUTHORS
index 9f807f9,44c65f8..44c65f8
mode 100755,100644..100755
+++ b/AUTHORS
diff --cc Makefile.am
index 82c13dd,e67a7a5..76c5419
mode 100755,100644..100755
@@@ -104,13 -104,9 +104,13 @@@ unit_objects 
  
  MANUAL_PAGES =
  
- sbin_PROGRAMS = src/connmand
 +if TIZEN_EXT
 +sbin_PROGRAMS =
 +else
+ sbin_PROGRAMS = src/connmand src/connmand-wait-online
 +endif
  
 -src_connmand_SOURCES = $(gdhcp_sources) $(gweb_sources) $(backtrace_sources) \
 +src_connmand_SOURCES = $(gdhcp_sources) $(gweb_sources) \
                        $(builtin_sources) $(shared_sources) src/connman.ver \
                        src/main.c src/connman.h src/log.c \
                        src/error.c src/plugin.c src/task.c \
                        src/peer_service.c src/machine.c src/util.c
  
  src_connmand_LDADD = gdbus/libgdbus-internal.la $(builtin_libadd) \
-                       @GLIB_LIBS@ @DBUS_LIBS@ @XTABLES_LIBS@ @GNUTLS_LIBS@ @LIBSYSTEMD_LIBS@ \
 -                      @GLIB_LIBS@ @DBUS_LIBS@ @GNUTLS_LIBS@ \
++                      @GLIB_LIBS@ @DBUS_LIBS@ @GNUTLS_LIBS@ @LIBSYSTEMD_LIBS@ \
                        -lresolv -ldl -lrt
  
 -src_connmand_LDFLAGS = -Wl,--export-dynamic \
 +src_connmand_LDFLAGS = -Wl,--export-dynamic -pie \
                                -Wl,--version-script=$(srcdir)/src/connman.ver
  
+ src_connmand_wait_online_SOURCES = src/connmand-wait-online.c
+ src_connmand_wait_online_LDADD = gdbus/libgdbus-internal.la \
+                       @GLIB_LIBS@ @DBUS_LIBS@
+ if XTABLES
+ src_connmand_SOURCES += src/iptables.c src/firewall-iptables.c
+ src_connmand_LDADD += @XTABLES_LIBS@
+ endif
+ if NFTABLES
+ src_connmand_SOURCES += src/firewall-nftables.c
+ src_connmand_LDADD +=  @NFTABLES_LIBS@
+ endif
  if VPN
  vpn_plugin_LTLIBRARIES =
  
@@@ -157,22 -164,9 +172,22 @@@ vpn_connman_vpnd_SOURCES = $(gdhcp_sour
                        vpn/vpn-manager.c vpn/vpn-provider.c \
                        vpn/vpn-provider.h vpn/vpn-rtnl.h \
                        vpn/vpn-ipconfig.c src/inet.c vpn/vpn-rtnl.c \
 -                      src/dbus.c src/storage.c src/ipaddress.c src/agent.c \
 -                      vpn/vpn-agent.c vpn/vpn-agent.h src/inotify.c \
 +                      src/log.c src/error.c src/plugin.c src/task.c \
 +                      src/device.c src/network.c src/connection.c \
 +                      src/manager.c src/service.c \
 +                      src/clock.c src/timezone.c src/agent-connman.c \
 +                      src/agent.c src/notifier.c src/provider.c \
 +                      src/resolver.c src/ipconfig.c src/detect.c \
 +                      src/dhcp.c src/dhcpv6.c src/rtnl.c src/proxy.c \
 +                      src/utsname.c src/timeserver.c src/rfkill.c \
 +                      src/storage.c src/dbus.c src/config.c \
 +                      src/technology.c src/counter.c src/ntp.c \
 +                      src/session.c src/tethering.c src/wpad.c src/wispr.c \
 +                      src/stats.c src/iptables.c src/dnsproxy.c src/6to4.c \
 +                      src/ippool.c src/bridge.c src/nat.c src/ipaddress.c \
-                       src/inotify.c src/firewall.c src/ipv6pd.c src/peer.c \
++                      src/inotify.c src/firewall-iptables.c src/ipv6pd.c src/peer.c \
 +                      src/peer_service.c src/machine.c src/util.c \
 +                      vpn/vpn-agent.c vpn/vpn-agent.h \
                        vpn/vpn-config.c
  
  vpn_connman_vpnd_LDADD = gdbus/libgdbus-internal.la $(builtin_vpn_libadd) \
@@@ -222,7 -216,7 +237,7 @@@ build_vpn_plugindir = $(vpn_plugindir
  endif
  endif
  
- AM_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ @XTABLES_CFLAGS@ @LIBSYSTEMD_CFLAGS@\
 -AM_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ \
++AM_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ @LIBSYSTEMD_CFLAGS@\
                                @GNUTLS_CFLAGS@ $(builtin_cflags) \
                                -DCONNMAN_PLUGIN_BUILTIN \
                                -DSTATEDIR=\""$(statedir)"\" \
@@@ -349,23 -350,29 +372,29 @@@ tools_dbus_test_LDADD = gdbus/libgdbus-
  
  tools_polkit_test_LDADD = @DBUS_LIBS@
  
- tools_iptables_test_SOURCES = src/log.c src/iptables.c tools/iptables-test.c
- tools_iptables_test_LDADD = @GLIB_LIBS@ @XTABLES_LIBS@ -ldl
  tools_private_network_test_LDADD = @GLIB_LIBS@ @DBUS_LIBS@
  
 -tools_session_test_SOURCES = $(backtrace_sources) src/log.c src/dbus.c src/error.c \
 +tools_session_test_SOURCES = src/log.c src/dbus.c src/error.c \
                tools/session-test.c tools/session-utils.c tools/manager-api.c \
                tools/session-api.c tools/session-test.h
  tools_session_test_LDADD = gdbus/libgdbus-internal.la \
                                @GLIB_LIBS@ @DBUS_LIBS@ -ldl
  
+ if XTABLES
+ noinst_PROGRAMS += tools/iptables-test tools/iptables-unit
+ tools_iptables_test_SOURCES = $(backtrace_sources) src/log.c src/iptables.c \
+                               tools/iptables-test.c
+ tools_iptables_test_LDADD = @GLIB_LIBS@ @XTABLES_LIBS@ -ldl
  tools_iptables_unit_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ @XTABLES_CFLAGS@ \
                -DIPTABLES_SAVE=\""${IPTABLES_SAVE}"\"
 -tools_iptables_unit_SOURCES = $(backtrace_sources) src/log.c \
 +tools_iptables_unit_SOURCES = src/log.c \
-                src/iptables.c src/firewall.c src/nat.c tools/iptables-unit.c
+               src/iptables.c src/firewall-iptables.c src/nat.c \
+               tools/iptables-unit.c
  tools_iptables_unit_LDADD = gdbus/libgdbus-internal.la \
                                @GLIB_LIBS@ @DBUS_LIBS@ @XTABLES_LIBS@ -ldl
+ endif
  
  tools_dnsproxy_test_SOURCES = tools/dnsproxy-test.c
  tools_dnsproxy_test_LDADD = @GLIB_LIBS@
@@@ -412,14 -419,23 +441,22 @@@ EXTRA_DIST += doc/overview-api.txt doc/
                                doc/vpn-config-format.txt \
                                doc/vpn-connection-api.txt \
                                doc/vpn-manager-api.txt doc/vpn-overview.txt \
-                               doc/session-policy-format.txt
+                               doc/session-policy-format.txt \
+                               doc/connmanctl.1.in doc/connman.conf.5.in \
+                               doc/connman-service.config.5.in \
+                               doc/connman-vpn.conf.5.in \
+                               doc/connman-vpn-provider.config.5.in \
+                               doc/connman.8.in doc/connman-vpn.8.in
  
  EXTRA_DIST += src/main.conf \
 -              src/eduroam.config \
 -              scripts/connman_resolvconf.conf.in
 +              src/eduroam.config
  
- #MANUAL_PAGES += doc/connman.8 doc/connman.conf.5
 -MANUAL_PAGES += doc/connmanctl.1 doc/connman.conf.5 \
 -              doc/connman-service.config.5 doc/connman-vpn.conf.5 \
 -              doc/connman-vpn-provider.config.5 \
 -              doc/connman.8 doc/connman-vpn.8
++#MANUAL_PAGES += doc/connmanctl.1 doc/connman.conf.5 \
++#             doc/connman-service.config.5 doc/connman-vpn.conf.5 \
++#             doc/connman-vpn-provider.config.5 \
++#             doc/connman.8 doc/connman-vpn.8
  
- dist_man_MANS = $(MANUAL_PAGES)
nodist_man_MANS = $(MANUAL_PAGES)
  
  pkgconfigdir = $(libdir)/pkgconfig
  
@@@ -479,14 -497,36 +519,31 @@@ EXTRA_DIST += vpn/connman-task.t
  do_subst = $(AM_V_GEN)$(SED) \
                -e 's,[@]prefix[@],$(prefix),g' \
                -e 's,[@]sbindir[@],$(sbindir),g' \
-               -e 's,[@]sysconfdir[@],$(sysconfdir),g'
+               -e 's,[@]sysconfdir[@],$(sysconfdir),g' \
+               -e 's,[@]storagedir[@],$(storagedir),g' \
+               -e 's,[@]vpn_storagedir[@],$(vpn_storagedir),g' \
 -              -e 's,[@]localstatedir[@],$(localstatedir),g' \
 -              -e 's,[@]runstatedir[@],$(runstatedir),g'
++              -e 's,[@]localstatedir[@],$(localstatedir),g'
+ %.1 : %.1.in
+       $(AM_V_at)$(MKDIR_P) $(dir $@)
+       $(do_subst) < $< > $@
+ %.5 : %.5.in
+       $(AM_V_at)$(MKDIR_P) $(dir $@)
+       $(do_subst) < $< > $@
+ %.8 : %.8.in
+       $(AM_V_at)$(MKDIR_P) $(dir $@)
+       $(do_subst) < $< > $@
  
  %.service: %.service.in Makefile
+       $(AM_V_at)$(MKDIR_P) $(dir $@)
        $(do_subst) < $< > $@
  
  scripts/connman: scripts/connman.in Makefile
+       $(AM_V_at)$(MKDIR_P) $(dir $@)
        $(do_subst) < $< > $@
  
 -scripts/connman_resolvconf.conf: scripts/connman_resolvconf.conf.in
 -      $(AM_V_at)$(MKDIR_P) $(dir $@)
 -      $(do_subst) < $< > $@
 -
  include/connman/version.h: include/version.h
        $(AM_V_at)$(MKDIR_P) include/connman
        $(AM_V_GEN)$(LN_S) $(abs_top_builddir)/$< $@
index cc732d9,dce8b28..1eb0c3f
mode 100755,100644..100755
diff --cc README
index 531f396,cff3131..cff3131
mode 100755,100644..100755
--- 1/README
--- 2/README
+++ b/README
diff --cc TODO
index dac2ea2,c1694e3..c1694e3
mode 100755,100644..100755
--- 1/TODO
--- 2/TODO
+++ b/TODO
index 3f7e001,583095b..746e158
mode 100755,100644..100755
diff --cc client/input.c
index 4e5e496,78319ff..d9d2b7b
mode 100755,100644..100755
diff --cc configure.ac
index a999c90,4baa685..01ecd95
mode 100755,100644..100644
@@@ -293,10 -257,41 +297,33 @@@ if (test -n "${path_systemdunit}"); the
  fi
  AM_CONDITIONAL(SYSTEMD, test -n "${path_systemdunit}")
  
- PKG_CHECK_MODULES(XTABLES, xtables >= 1.4.11, dummy=yes,
-                               AC_MSG_ERROR(Xtables library is required))
- AC_SUBST(XTABLES_CFLAGS)
- AC_SUBST(XTABLES_LIBS)
 -AC_ARG_WITH([tmpfilesdir], AC_HELP_STRING([--with-tmpfilesdir=DIR],
 -      [path to systemd tmpfiles.d directory]), [path_tmpfiles=${withval}],
 -              [path_tmpfiles="`$PKG_CONFIG --variable=tmpfilesdir systemd`"])
 -if (test -n "${path_tmpfiles}"); then
 -      SYSTEMD_TMPFILESDIR="${path_tmpfiles}"
 -      AC_SUBST(SYSTEMD_TMPFILESDIR)
 -fi
 -
+ AC_ARG_WITH(firewall, AC_HELP_STRING([--with-firewall=TYPE],
+                       [specify which firewall type is used iptables or nftables [default=iptables]]),
+               [firewall_type=${withval}],
+               [firewall_type="iptables"])
+ if (test "${firewall_type}" != "iptables" -a \
+               "${firewall_type}" != "nftables"); then
+       AC_MSG_ERROR(neither nftables nor iptables support enabled)
+ fi
+ found_iptables="no"
+ if (test "${firewall_type}" = "iptables"); then
+       PKG_CHECK_MODULES(XTABLES, xtables >= 1.4.11, [found_iptables="yes"],
+                       AC_MSG_ERROR(Xtables library is required))
+       AC_SUBST(XTABLES_CFLAGS)
+       AC_SUBST(XTABLES_LIBS)
+ fi
+ AM_CONDITIONAL(XTABLES, test "${found_iptables}" != "no")
+ found_nftables="no"
+ if (test "${firewall_type}" = "nftables"); then
+       PKG_CHECK_MODULES(NFTABLES, [libnftnl >= 1.0.4 libmnl >= 1.0.0], [found_nftables="yes"],
+               AC_MSG_ERROR([libnftnl >= 1.0.4 or libmnl >= 1.0.0 not found]))
+       AC_SUBST(NFTABLES_CFLAGS)
+       AC_SUBST(NFTABLES_LIBS)
+ fi
+ AM_CONDITIONAL(NFTABLES, test "${found_nftables}" != "no")
  
  AC_ARG_ENABLE(test, AC_HELP_STRING([--enable-test],
                [enable test/example scripts]), [enable_test=${enableval}])
index 2ddd19a,aa7271d..aa7271d
mode 100755,100644..100755
index c1ca75c,95b177f..fdc8e9e
mode 100755,100644..100644
@@@ -131,5 -131,28 +131,28 @@@ Default value is false
  Automatically enable Anycast 6to4 if possible. This is not recommended, as the
  use of 6to4 will generally lead to a severe degradation of connection quality.
  See RFC6343.  Default value is false (as recommended by RFC6343 section 4.1).
 -Enable or disable use of HTTP GET as an online status check.
+ .TP
+ .BI VendorClassID= string
+ Set DHCP option 60 (Vendor Class ID) to the given string. This option can
+ be used by DHCP servers to identify specific clients without having to
+ rely on MAC address ranges, etc
+ .TP
+ .BI EnableOnlineCheck=true\ \fR|\fB\ false
++Enable or disable use of HTTP GET as on online status check.
+ When a service is in a READY state, and is selected as default,
+ ConnMan will issue an HTTP GET request to verify that end-to-end
+ connectivity is successful. Only then the service will be
+ transitioned to ONLINE state.
+ If this setting is false, the default service will remain in READY state.
+ Default value is true.
+ .SH "EXAMPLE"
+ The following example configuration disables hostname updates and enables
+ ethernet tethering.
+ .PP
+ .nf
+ [General]
+ AllowHostnameUpdates = false
+ TetheringTechnologies = ethernet,wifi,bluetooth,gadget
+ .fi
  .SH "SEE ALSO"
- .BR Connman (8)
+ .BR connman (8)
index 616938b,ea5ec0a..ea5ec0a
mode 100755,100644..100755
index 7d9889e,6cdb0bb..4fe4093
mode 100755,100644..100755
index 3aac535,e8da522..e8da522
mode 100755,100644..100755
@@@ -193,37 -205,8 +205,37 @@@ PPTP VPN supports following options (se
   PPPD.RequirMPPE40   require-mppe-40      Require the use of MPPE 40 bit (O)
   PPPD.RequirMPPE128  require-mppe-128     Require the use of MPPE 128 bit (O)
   PPPD.RequirMPPEStateful mppe-stateful    Allow MPPE to use stateful mode (O)
-  PPPD.NoVJ           no-vj-comp           No Van Jacobson compression (O)
+  PPPD.NoVJ           novj                 No Van Jacobson compression (O)
  
 +IPsec VPN supports following options (see swanctl.conf(5) for details):
 + Option name                   IPSec config value    Description
 + IPsec.Version                 Version               IKE major version to use for connection (M)
 + IPsec.LeftAddrs               local_addrs           Local address(es) to use for IKE communication (M)
 + IPsec.RightAddrs              remote_addrs          Remote address(es) to use for IKE communication (M)
 +
 +
 + IPsec.LocalAuth               local.auth            Authentication to perform locally (M)
 + IPsec.LocalCerts              local.certs           Certificate candidate to use for authentication (O)
 + IPsec.LocalID                 local.id              IKE identity to use for authentication round (O)
 + IPsec.LocalXauthID            local.xauth_id        Client XAuth username used in the XAuth exchange (O)
 + IPsec.LocalXauthAuth          local-xauth.auth      Xauth round authentication to perform locally (O)
 + IPsec.LocalXauthXauthID       local-xauth.xauth_id  Xauth round client XAuth username used in the XAuth exchange (O)
 +
 + IPsec.RemoteAuth              remote.auth           Authentication to expect from remote (M)
 + IPsec.RemoteCerts             remote.certs          Certificate candidate to use for authentication (O)
 + IPsec.RemoteID                remote.id             IKE identity to use for authentication round (O)
 + IPsec.RemoteXauthAuth         remote-xauth.auth     Xauth round authentication to expect from remote (O)
 + IPsec.ChildrenLocalTs         children.local_ts     local selectors to include in CHILD_SA (O)
 + IPsec.ChildrenRemoteTs        children.remote_ts    Remote selectors to include in CHILD_SA (O)
 +
 + IPsec.IKEData                 secret.data           IKE PSK raw shared key data
 + IPsec.IKEOwners               secret.Owners         list of shared key owner identities
 + IPsec.XauthData               secret.data           XAUTH raw shared key data
 + IPsec.XauthOwners             secret.Owners         list of shared key owner identities
 +
 + IPsec.CertType                cert.type             certificate type, X509|X509_AC|X509_CRL
 + IPsec.CertFlag                cert.flag             X.509 certificate flag, NONE|CA|AA|OCSP
 + IPsec.CertData                cert.data             PEM or DER encoded certificate data
  
  Example
  =======
diff --cc gdbus/client.c
index 6e4dc66,a011e19..9748ae2
mode 100755,100644..100755
@@@ -1101,6 -1095,9 +1099,11 @@@ static void get_managed_objects_reply(D
        parse_managed_objects(client, reply);
  
  done:
++#if !defined TIZEN_EXT
+       if (client->ready)
+               client->ready(client, client->ready_data);
++#endif
        dbus_message_unref(reply);
  
        dbus_pending_call_unref(client->get_objects_call);
diff --cc gdbus/gdbus.h
index 633db0c,69fbc10..70190b7
mode 100755,100644..100755
diff --cc gdbus/object.c
index c7ed02f,a220101..c333d5b
mode 100755,100644..100755
diff --cc gdhcp/client.c
index d3794bd,3e67fcd..5a455f0
mode 100755,100644..100755
diff --cc gdhcp/common.c
index 6d457ac,6f81671..b8c5091
mode 100755,100644..100755
diff --cc gdhcp/gdhcp.h
index fd6ce54,eaf6a74..f51a8b0
mode 100755,100644..100755
diff --cc gdhcp/ipv4ll.c
index c43971f,d900198..d900198
mode 100755,100644..100755
diff --cc gdhcp/server.c
index 83132a7,f7795f7..44ce771
mode 100755,100644..100755
index 123f3b2,db61595..8860626
mode 100755,100644..100755
@@@ -363,23 -337,6 +368,24 @@@ GSupplicantInterface *g_supplicant_peer
  bool g_supplicant_peer_is_client(GSupplicantPeer *peer);
  bool g_supplicant_peer_has_requested_connection(GSupplicantPeer *peer);
  
- void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network);
 +#if defined TIZEN_EXT
 +/*
 +* Description: Network client requires additional wifi specific info
 +*/
 +const unsigned char *g_supplicant_network_get_bssid(
 +                                              GSupplicantNetwork *network);
 +unsigned int g_supplicant_network_get_maxrate(GSupplicantNetwork *network);
 +const char *g_supplicant_network_get_enc_mode(GSupplicantNetwork *network);
 +bool g_supplicant_network_get_rsn_mode(GSupplicantNetwork *network);
 +bool g_supplicant_network_is_hs20AP(GSupplicantNetwork *network);
 +const char *g_supplicant_network_get_eap(GSupplicantNetwork *network);
 +const char *g_supplicant_network_get_identity(GSupplicantNetwork *network);
 +const char *g_supplicant_network_get_phase2(GSupplicantNetwork *network);
 +unsigned int g_supplicant_network_get_keymgmt(GSupplicantNetwork *network);
++const void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network,
++                                              unsigned int *wifi_vsie_len);
 +#endif
 +
  struct _GSupplicantCallbacks {
        void (*system_ready) (void);
        void (*system_killed) (void);
        void (*p2p_support) (GSupplicantInterface *interface);
        void (*scan_started) (GSupplicantInterface *interface);
        void (*scan_finished) (GSupplicantInterface *interface);
+       void (*ap_create_fail) (GSupplicantInterface *interface);
        void (*network_added) (GSupplicantNetwork *network);
        void (*network_removed) (GSupplicantNetwork *network);
 +#if defined TIZEN_EXT
 +      void (*network_merged) (GSupplicantNetwork *network);
 +#endif
        void (*network_changed) (GSupplicantNetwork *network,
                                        const char *property);
+       void (*network_associated) (GSupplicantNetwork *network);
 +#if defined TIZEN_EXT
 +      void (*system_power_off) (void);
 +      void (*assoc_failed) (void *user_data);
 +#endif
 +      void (*add_station) (const char *mac);
 +      void (*remove_station) (const char *mac);
        void (*peer_found) (GSupplicantPeer *peer);
        void (*peer_lost) (GSupplicantPeer *peer);
        void (*peer_changed) (GSupplicantPeer *peer,
index 243dcd0,4f79012..5e9f509
mode 100755,100644..100644
@@@ -180,10 -189,8 +189,11 @@@ struct _GSupplicantInterface 
        GHashTable *bss_mapping;
        void *data;
        const char *pending_peer_path;
+       GSupplicantNetwork *current_network;
+       struct added_network_information network_info;
 +#if defined TIZEN_EXT
 +      int disconnect_reason;
 +#endif
  };
  
  struct g_supplicant_bss {
        dbus_bool_t privacy;
        dbus_bool_t psk;
        dbus_bool_t ieee8021x;
-       GSList *vsie_list;
 +#if defined TIZEN_EXT
 +      dbus_bool_t ft_psk;
 +      dbus_bool_t ft_ieee8021x;
++      char *wifi_vsie;
++      unsigned int wifi_vsie_len;
 +      dbus_bool_t hs20;
 +#endif
        unsigned int wps_capabilities;
  };
  
@@@ -233,14 -234,6 +244,15 @@@ struct _GSupplicantNetwork 
        unsigned int wps_capabilities;
        GHashTable *bss_table;
        GHashTable *config_table;
-       GSList *vsie_list;
 +#if defined TIZEN_EXT
 +      bool isHS20AP;
 +      char *eap;
 +      char *identity;
 +      char *phase2;
 +      unsigned int keymgmt;
++      char *wifi_vsie;
++      unsigned int wifi_vsie_len;
 +#endif
  };
  
  struct _GSupplicantPeer {
@@@ -663,15 -748,6 +802,15 @@@ static void remove_network(gpointer dat
        g_free(network->path);
        g_free(network->group);
        g_free(network->name);
-       g_slist_free_full(network->vsie_list, g_free);
 +#if defined TIZEN_EXT
 +      g_free(network->eap);
 +      g_free(network->identity);
 +      g_free(network->phase2);
 +#endif
 +#if defined TIZEN_EXT
++      g_free(network->wifi_vsie);
 +#endif
 +
        g_free(network);
  }
  
@@@ -680,9 -756,6 +819,9 @@@ static void remove_bss(gpointer data
        struct g_supplicant_bss *bss = data;
  
        g_free(bss->path);
-       g_slist_free_full(bss->vsie_list, g_free);
 +#if defined TIZEN_EXT
++      g_free(bss->wifi_vsie);
 +#endif
        g_free(bss);
  }
  
@@@ -1315,96 -1383,6 +1494,83 @@@ bool g_supplicant_peer_has_requested_co
        return peer->connection_requested;
  }
  
- void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network)
 +#if defined TIZEN_EXT
 +/*
 + * Description: Network client requires additional wifi specific info
 + */
 +const unsigned char *g_supplicant_network_get_bssid(GSupplicantNetwork *network)
 +{
 +      if (network == NULL || network->best_bss == NULL)
 +              return NULL;
 +
 +      return (const unsigned char *)network->best_bss->bssid;
 +}
 +
 +unsigned int g_supplicant_network_get_maxrate(GSupplicantNetwork *network)
 +{
 +      if (network == NULL || network->best_bss == NULL)
 +              return 0;
 +
 +      return network->best_bss->maxrate;
 +}
 +
 +const char *g_supplicant_network_get_enc_mode(GSupplicantNetwork *network)
 +{
 +      if (network == NULL || network->best_bss == NULL)
 +              return NULL;
 +
 +      if (network->best_bss->security == G_SUPPLICANT_SECURITY_PSK ||
 +          network->best_bss->security == G_SUPPLICANT_SECURITY_IEEE8021X) {
 +              unsigned int pairwise;
 +
 +              pairwise = network->best_bss->rsn_pairwise |
 +                              network->best_bss->wpa_pairwise;
 +
 +              if ((pairwise & G_SUPPLICANT_PAIRWISE_CCMP) &&
 +                  (pairwise & G_SUPPLICANT_PAIRWISE_TKIP))
 +                      return "mixed";
 +              else if (pairwise & G_SUPPLICANT_PAIRWISE_CCMP)
 +                      return "aes";
 +              else if (pairwise & G_SUPPLICANT_PAIRWISE_TKIP)
 +                      return "tkip";
 +
 +      } else if (network->best_bss->security == G_SUPPLICANT_SECURITY_WEP)
 +              return "wep";
 +      else if (network->best_bss->security == G_SUPPLICANT_SECURITY_NONE)
 +              return "none";
 +
 +      return NULL;
 +}
 +
 +bool g_supplicant_network_get_rsn_mode(GSupplicantNetwork *network)
 +{
 +      if (network == NULL || network->best_bss == NULL)
 +              return 0;
 +
 +      if (network->best_bss->rsn_selected) {
 +              const char *mode = g_supplicant_network_get_enc_mode(network);
 +              if (g_strcmp0(mode, "aes") == 0 ||
 +                              g_strcmp0(mode, "mixed") == 0)
 +                      return true;
 +              else
 +                      return false;
 +      } else
 +              return false;
 +}
 +
-       GSList *vsie_list = NULL;
-       if (!network)
++const void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network,
++                                              unsigned int *wifi_vsie_len)
 +{
-       if (g_slist_length(network->vsie_list) > 0) {
-               GSList *list = NULL;
-               unsigned char *vsie = NULL;
-               for (list = network->vsie_list; list; list = list->next) {
-                       unsigned char *ie = (unsigned char *)list->data;
-                       vsie = (unsigned char *)g_try_malloc0(ie[1]+2); // tag number size(1), tag length size(1)
-                       if (vsie) {
-                               memcpy(vsie, ie, ie[1]+2);
-                               vsie_list = g_slist_append(vsie_list, vsie);
-                       } else
-                               SUPPLICANT_DBG("Failed to allocate memory");
-               }
++      if (!network) {
++              *wifi_vsie_len = 0;
 +              return NULL;
-       return vsie_list;
 +      }
 +
++      *wifi_vsie_len = network->wifi_vsie_len;
++      return network->wifi_vsie;
 +}
 +#endif
 +
  static void merge_network(GSupplicantNetwork *network)
  {
        GString *str;
@@@ -1695,27 -1609,6 +1846,23 @@@ static int add_or_replace_bss_to_networ
        network->frequency = bss->frequency;
        network->best_bss = bss;
  
-       if (g_slist_length(bss->vsie_list) > 0) {
-               GSList *list = NULL;
-               unsigned char *vsie = NULL;
-               for (list = bss->vsie_list; list; list = list->next) {
-                       unsigned char *ie = (unsigned char *)list->data;
-                       vsie = (unsigned char *)g_try_malloc0(ie[1]+2); // tag number size(1), tag length size(1)
-                       if (vsie) {
-                               memcpy(vsie, ie, ie[1]+2);
-                               network->vsie_list = g_slist_append(network->vsie_list, vsie);
-                       } else
-                               SUPPLICANT_DBG("Failed to allocate memory.");
 +#if defined TIZEN_EXT
 +      network->keymgmt = bss->keymgmt;
 +
++      if (bss->wifi_vsie_len > 0) {
++              SUPPLICANT_DBG("vsie len: %d", bss->wifi_vsie_len);
++              network->wifi_vsie = (char *)g_try_malloc0(bss->wifi_vsie_len);
++              if(network->wifi_vsie) {
++                      network->wifi_vsie_len = bss->wifi_vsie_len;
++                      memcpy(network->wifi_vsie, bss->wifi_vsie, network->wifi_vsie_len);
++              } else {
++                      SUPPLICANT_DBG("Failed to allocate memory for wifi_vsie");
 +              }
 +      }
 +
 +      network->isHS20AP = bss->hs20;
 +#endif
 +
        SUPPLICANT_DBG("New network %s created", network->name);
  
        network->bss_table = g_hash_table_new_full(g_str_hash, g_str_equal,
@@@ -1893,6 -1793,6 +2047,9 @@@ static void bss_process_ies(DBusMessage
  {
        struct g_supplicant_bss *bss = user_data;
        const unsigned char WPS_OUI[] = { 0x00, 0x50, 0xf2, 0x04 };
++#if defined TIZEN_EXT
++      const unsigned char WIFI_OUI[] = {0x00, 0x16, 0x32};
++#endif
        unsigned char *ie, *ie_end;
        DBusMessageIter array;
        unsigned int value;
  
        for (ie_end = ie + ie_len; ie < ie_end && ie + ie[1] + 1 <= ie_end;
                                                        ie += ie[1] + 2) {
 -
 +#if defined TIZEN_EXT
-               unsigned char *vsie;
-               int vsie_len = 0;
-               if(ie[0] == VENDOR_SPECIFIC_INFO && memcmp(ie+2, WPS_OUI, sizeof(WPS_OUI)) != 0) {
-                       SUPPLICANT_DBG("IE: match vendor specific data");
-                       vsie_len = ie[1]+2;     // tag number size(1), tag length size(1)
-                       vsie = (unsigned char *)g_try_malloc0(vsie_len);
-                       if (vsie) {
-                               memcpy(vsie, ie, vsie_len);
-                               bss->vsie_list = g_slist_append(bss->vsie_list, vsie);
-                       } else
-                               SUPPLICANT_DBG("Failed to allocate memory");
-                       continue;
++              if((ie[0] == VENDOR_SPECIFIC_INFO) && (memcmp(ie+2, WIFI_OUI, sizeof(WIFI_OUI)) == 0)) {
++                              SUPPLICANT_DBG("IE: match WIFI_OUI");
++                              bss->wifi_vsie = (char *)g_try_malloc0(ie[1] + 2);   // tag number size(1), tag length size(1)
++                              if (bss->wifi_vsie) {
++                                      bss->wifi_vsie_len = ie[1] + 2;
++                                      memcpy(bss->wifi_vsie, ie, bss->wifi_vsie_len);
++                              } else {
++                                      SUPPLICANT_DBG("Failed to allocate memory for wifi_vsie");
++                              }
++                              continue;
 +              }
 +#endif
                if (ie[0] != WMM_WPA1_WPS_INFO || ie[1] < WPS_INFO_MIN_LEN ||
                        memcmp(ie+2, WPS_OUI, sizeof(WPS_OUI)) != 0)
                        continue;
@@@ -2386,12 -2335,18 +2643,21 @@@ static void interface_property(const ch
                        g_free(interface->bridge);
                        interface->bridge = g_strdup(str);
                }
+       } else if (g_strcmp0(key, "ConfigFile") == 0) {
+               const char *str = NULL;
+               dbus_message_iter_get_basic(iter, &str);
+               if (str && strlen(str) > 0 && interface->ifname) {
+                       SUPPLICANT_DBG("New {%s, %s}", interface->ifname, str);
+                       g_hash_table_replace(config_file_table,
+                               g_strdup(interface->ifname), g_strdup(str));
+               }
        } else if (g_strcmp0(key, "CurrentBSS") == 0) {
-               interface_bss_added_without_keys(iter, interface);
+               interface_current_bss(interface, iter);
        } else if (g_strcmp0(key, "CurrentNetwork") == 0) {
 +#if defined TIZEN_EXT
 +              if (interface->state != G_SUPPLICANT_STATE_COMPLETED)
 +#endif
                interface_network_added(iter, interface);
        } else if (g_strcmp0(key, "BSSs") == 0) {
                supplicant_dbus_array_foreach(iter,
@@@ -2833,23 -2781,12 +3109,27 @@@ static void signal_bss_changed(const ch
                return;
        }
  
 +#if defined TIZEN_EXT
 +      if ((bss->keymgmt & G_SUPPLICANT_KEYMGMT_WPS) != 0) {
 +              network->wps = TRUE;
 +              network->wps_capabilities |= bss->wps_capabilities;
 +      } else
 +              network->wps = FALSE;
 +#endif
 +
+       /* Consider only property changes of the connected BSS */
+       if (network == interface->current_network && bss != network->best_bss)
+               return;
        if (bss->signal == network->signal)
 +#ifndef TIZEN_EXT
 +              return;
 +#else
 +      {
 +              callback_network_changed(network, "");
                return;
 +      }
 +#endif
  
        /*
         * If the new signal is lower than the SSID signal, we need
@@@ -4554,20 -4362,10 +4820,21 @@@ static void interface_add_network_resul
  
        SUPPLICANT_DBG("PATH: %s", path);
  
-       g_free(interface->network_path);
        interface->network_path = g_strdup(path);
  
+       store_network_information(interface, data->ssid);
 +#if defined TIZEN_EXT
 +      SUPPLICANT_DBG(".Interface.SelectNetworkFreq");
 +#endif
 +
 +#if defined TIZEN_EXT
 +      supplicant_dbus_method_call(data->interface->path,
 +                      SUPPLICANT_INTERFACE ".Interface", "SelectNetworkFreq",
 +                      interface_select_network_params,
 +                      interface_select_network_result, data,
 +                      interface);
 +#else
        supplicant_dbus_method_call(data->interface->path,
                        SUPPLICANT_INTERFACE ".Interface", "SelectNetwork",
                        interface_select_network_params,
@@@ -4887,7 -4643,30 +5154,31 @@@ static void add_network_security_eap(DB
        supplicant_dbus_dict_append_basic(dict, "identity",
                                                DBUS_TYPE_STRING,
                                                &ssid->identity);
 +#endif
+       if(ssid->anonymous_identity)
+               supplicant_dbus_dict_append_basic(dict, "anonymous_identity",
+                                                    DBUS_TYPE_STRING,
+                                                    &ssid->anonymous_identity);
+       if(ssid->subject_match)
+               supplicant_dbus_dict_append_basic(dict, "subject_match",
+                                                    DBUS_TYPE_STRING,
+                                                    &ssid->subject_match);
+       if(ssid->altsubject_match)
+               supplicant_dbus_dict_append_basic(dict, "altsubject_match",
+                                                    DBUS_TYPE_STRING,
+                                                    &ssid->altsubject_match);
+       if(ssid->domain_suffix_match)
+               supplicant_dbus_dict_append_basic(dict, "domain_suffix_match",
+                                                    DBUS_TYPE_STRING,
+                                                    &ssid->domain_suffix_match);
+       if(ssid->domain_match)
+               supplicant_dbus_dict_append_basic(dict, "domain_match",
+                                                    DBUS_TYPE_STRING,
+                                                    &ssid->domain_match);
  
        g_free(eap_value);
  }
@@@ -5200,138 -4927,7 +5491,137 @@@ static void wps_process_credentials(DBu
        dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &credentials);
  }
  
-               ret = -EINVAL;
 +#if defined TIZEN_EXT
 +#define NETCONFIG_SERVICE "net.netconfig"
 +#define NETCONFIG_WIFI_PATH "/net/netconfig/wifi"
 +#define NETCONFIG_WIFI_INTERFACE NETCONFIG_SERVICE ".wifi"
 +
 +struct dec_method_call_data {
 +      struct interface_connect_data *data;
 +      DBusPendingCall *pending_call;
 +};
 +
 +static struct dec_method_call_data decrypt_request_data;
 +
 +static void crypt_method_call_cancel(void)
 +{
 +      if (decrypt_request_data.pending_call) {
 +              dbus_pending_call_cancel(decrypt_request_data.pending_call);
 +              dbus_pending_call_unref(decrypt_request_data.pending_call);
 +              decrypt_request_data.pending_call = NULL;
 +      }
 +
 +      g_free(decrypt_request_data.data->path);
 +      g_free(decrypt_request_data.data->ssid);
 +      dbus_free(decrypt_request_data.data);
 +      decrypt_request_data.data = NULL;
 +}
 +
 +static void decryption_request_reply(DBusPendingCall *call,
 +                                              void *user_data)
 +{
 +      DBusMessage *reply;
 +      DBusError error;
 +      DBusMessageIter args;
 +      char *out_data;
 +      int ret;
 +      static gchar* origin_value = NULL;
 +      struct interface_connect_data *data = user_data;
 +
 +      g_free(origin_value);
 +      origin_value = NULL;
 +
 +      SUPPLICANT_DBG("");
 +
 +      reply = dbus_pending_call_steal_reply(call);
 +
 +      dbus_error_init(&error);
 +      if (dbus_set_error_from_message(&error, reply)) {
 +              SUPPLICANT_DBG("decryption_request_reply() %s %s", error.name, error.message);
 +              dbus_error_free(&error);
-               ret = -EINVAL;
 +              goto done;
 +      }
 +
 +      if (dbus_message_iter_init(reply, &args) == FALSE) {
 +              SUPPLICANT_DBG("dbus_message_iter_init() failed");
- done:
 +              goto done;
 +      }
 +
 +      dbus_message_iter_get_basic(&args, &out_data);
 +
 +      origin_value = g_strdup((const gchar *)out_data);
 +      data->ssid->passphrase = origin_value;
 +
 +      ret = supplicant_dbus_method_call(data->interface->path,
 +              SUPPLICANT_INTERFACE ".Interface", "AddNetwork",
 +              interface_add_network_params,
 +              interface_add_network_result, data,
 +              data->interface);
 +
 +      if (ret < 0) {
 +              SUPPLICANT_DBG("AddNetwork failed %d", ret);
 +              callback_assoc_failed(decrypt_request_data.data->user_data);
 +              g_free(data->path);
 +              g_free(data->ssid);
 +              dbus_free(data);
 +      }
 +
++done:
 +      dbus_message_unref(reply);
 +      dbus_pending_call_unref(call);
 +
 +      decrypt_request_data.pending_call = NULL;
 +      decrypt_request_data.data = NULL;
 +}
 +
 +static int send_decryption_request(const char *passphrase,
 +                      struct interface_connect_data *data)
 +{
 +      DBusMessage *msg = NULL;
 +      DBusPendingCall *call;
 +
 +      SUPPLICANT_DBG("Decryption request");
 +
 +      if (!passphrase) {
 +              SUPPLICANT_DBG("Invalid parameter");
 +              return -EINVAL;
 +      }
 +
 +      if (!connection)
 +              return -EINVAL;
 +
 +      msg = dbus_message_new_method_call(NETCONFIG_SERVICE, NETCONFIG_WIFI_PATH,
 +                      NETCONFIG_WIFI_INTERFACE, "DecryptPassphrase");
 +      if (!msg)
 +              return -EINVAL;
 +
 +      dbus_message_append_args(msg, DBUS_TYPE_STRING, &passphrase,
 +                                                      DBUS_TYPE_INVALID);
 +
 +      if (!dbus_connection_send_with_reply(connection, msg,
 +                              &call, DBUS_TIMEOUT_USE_DEFAULT)) {
 +              dbus_message_unref(msg);
 +              return -EIO;
 +      }
 +
 +      if (!call) {
 +              dbus_message_unref(msg);
 +              return -EIO;
 +      }
 +
 +      decrypt_request_data.pending_call = call;
 +      decrypt_request_data.data = data;
 +
 +      dbus_pending_call_set_notify(call, decryption_request_reply, data, NULL);
 +      dbus_message_unref(msg);
 +
 +      SUPPLICANT_DBG("Decryption request succeeded");
 +
 +      return 0;
 +}
 +#endif
 +
  int g_supplicant_interface_connect(GSupplicantInterface *interface,
                                GSupplicantSSID *ssid,
                                GSupplicantInterfaceCallback callback,
                        SUPPLICANT_INTERFACE ".Interface.WPS",
                        "ProcessCredentials", DBUS_TYPE_BOOLEAN_AS_STRING,
                        wps_process_credentials, wps_start, data, interface);
-       } else
- #if defined TIZEN_EXT
-               if (ssid->passphrase && g_strcmp0(ssid->passphrase, "") != 0) {
-                       ret = send_decryption_request(ssid->passphrase, data);
-                       if (ret < 0)
-                               SUPPLICANT_DBG("Decryption request failed %d", ret);
+       } else {
+               /* By the time there is a request for connect and the network
+                * path is not NULL it means that connman has not removed the
+                * previous network pointer. This can happen in the case AP
+                * deauthenticated client and connman does not remove the
+                * previously connected network pointer. This causes supplicant
+                * to reallocate the memory for struct wpa_ssid again even if it
+                * is the same SSID. This causes memory usage of wpa_supplicnat
+                * to go high. The idea here is that if the previously connected
+                * network is not removed at the time of next connection attempt
+                * check if the network path is not NULL. In case it is non-NULL
+                * first remove the network and then once removal is successful, add
+                * the network.
+                */
+               if (interface->network_path != NULL) {
+                       g_free(data->path);
+                       dbus_free(data);
+                       /*
+                        * If this add network is for the same network for
+                        * which wpa_supplicant already has a profile then do
+                        * not need to add another profile. Only if the
+                        * profile that needs to get added is different from
+                        * what is there in wpa_s delete the current one. A
+                        * network is identified by its SSID, security_type
+                        * and passphrase (private passphrase in case security
+                        * type is 802.11x).
+                        */
+                       if (compare_network_parameters(interface, ssid)) {
+                               return -EALREADY;
+                       }
+                       intf_data = dbus_malloc0(sizeof(*intf_data));
+                       if (!intf_data)
+                               return -ENOMEM;
+                       intf_data->interface = interface;
+                       intf_data->path = g_strdup(interface->path);
+                       intf_data->callback = callback;
+                       intf_data->ssid = ssid;
+                       intf_data->user_data = user_data;
+                       intf_data->network_remove_in_progress = TRUE;
+                       network_remove(intf_data);
 -              } else {
 -                      ret = supplicant_dbus_method_call(interface->path,
 -                                      SUPPLICANT_INTERFACE ".Interface", "AddNetwork",
 -                                      interface_add_network_params,
 -                                      interface_add_network_result, data,
 -                                      interface);
 -              }
 -        }
 +              } else
++#if defined TIZEN_EXT
++                      if (ssid->passphrase && g_strcmp0(ssid->passphrase, "") != 0) {
++                              ret = send_decryption_request(ssid->passphrase, data);
++                              if (ret < 0)
++                                      SUPPLICANT_DBG("Decryption request failed %d", ret);
++                      } else
 +#endif
-               ret = supplicant_dbus_method_call(interface->path,
-                       SUPPLICANT_INTERFACE ".Interface", "AddNetwork",
-                       interface_add_network_params,
-                       interface_add_network_result, data,
-                       interface);
++                              ret = supplicant_dbus_method_call(interface->path,
++                                              SUPPLICANT_INTERFACE ".Interface", "AddNetwork",
++                                              interface_add_network_params,
++                                              interface_add_network_result, data,
++                                              interface);
++      }
  
        if (ret < 0) {
                g_free(data->path);
diff --cc gweb/gresolv.c
index 93f156e,8a51a9f..cf16a48
mode 100755,100644..100755
diff --cc gweb/gweb.c
index 307164e,393afe0..7037cd9
mode 100755,100644..100755
index dafdca2,9ac800a..36b2f55
mode 100755,100644..100755
index baf1c01,4fc20c1..4be5fbf
mode 100755,100644..100755
index d1a8983,d28651a..d28651a
mode 100755,100644..100755
index ff29613,958e7fd..3055023
mode 100755,100644..100755
index 37dfc4e,5106e88..5106e88
mode 100755,100644..100755
index 8efe9e7,97db660..55bb3dd
mode 100755,100644..100755
@@@ -36,11 -36,7 +36,11 @@@ extern "C" 
  
  struct connman_technology;
  
- void connman_technology_tethering_notify(struct connman_technology *technology,
 +int connman_technology_tethering_add_station(enum connman_service_type type,
 +                                            const char *mac);
 +int connman_technology_tethering_remove_station(const char *mac);
 +
+ int connman_technology_tethering_notify(struct connman_technology *technology,
                                                        bool enabled);
  int connman_technology_set_regdom(const char *alpha2);
  void connman_technology_regdom_notify(struct connman_technology *technology,
index e99ae37,0000000..0554f9a
mode 100755,000000..100755
--- /dev/null
@@@ -1,343 -1,0 +1,343 @@@
- Version:        1.29
 +%bcond_with     connman_openconnect
 +%bcond_without  connman_openvpn
 +%bcond_without  connman_ipsec
 +%bcond_without  connman_vpnd
 +
 +Name:           connman
++Version:        1.35
 +Release:        26
 +License:        GPL-2.0+
 +Summary:        Connection Manager
 +Url:            http://connman.net
 +Group:          Network & Connectivity/Connection Management
 +Source0:        %{name}-%{version}.tar.gz
 +BuildRequires:  systemd-devel
 +BuildRequires:  pkgconfig(dbus-1)
 +BuildRequires:  pkgconfig(glib-2.0)
 +BuildRequires:  pkgconfig(gio-2.0)
 +BuildRequires:  pkgconfig(libiptc)
 +BuildRequires:  pkgconfig(xtables)
 +BuildRequires:  pkgconfig(libsmack)
 +BuildRequires:  pkgconfig(libsystemd-daemon)
 +%if %{with connman_openconnect}
 +BuildRequires:  openconnect
 +%endif
 +%if %{with connman_openvpn}
 +BuildRequires:  openvpn
 +%endif
 +%if %{with connman_ipsec}
 +BuildRequires:  strongswan
 +%endif
 +BuildRequires:  readline-devel
 +#%systemd_requires
 +Requires:       iptables
 +Requires:         systemd
 +Requires(post):   systemd
 +Requires(preun):  systemd
 +Requires(postun): systemd
 +Requires:         net-config
 +Requires:         security-config
 +Provides:       %{name}-profile_common = %{version}-%{release}
 +Provides:       %{name}-profile_mobile = %{version}-%{release}
 +Provides:       %{name}-profile_wearable = %{version}-%{release}
 +
 +%define upgrade_script_filename 500.connman_upgrade.sh
 +%define upgrade_script_path /usr/share/upgrade/scripts
 +
 +%description
 +Connection Manager provides a daemon for managing Internet connections
 +within embedded devices running the Linux operating system.
 +
 +%if %{with connman_openconnect}
 +%package plugin-openconnect
 +Summary:        Openconnect Support for Connman
 +Requires:       %{name} = %{version}
 +Requires:       openconnect
 +
 +%description plugin-openconnect
 +Openconnect Support for Connman.
 +%endif
 +
 +%if %{with connman_openvpn}
 +%package plugin-openvpn
 +Summary:        Openvpn Support for Connman
 +Requires:       %{name} = %{version}
 +Requires:       openvpn
 +
 +%description plugin-openvpn
 +OpenVPN support for Connman.
 +%endif
 +
 +%if %{with connman_ipsec}
 +%package plugin-ipsec
 +Summary:        IPsec Support for Connman
 +Requires:       %{name} = %{version}
 +Requires:       strongswan
 +
 +%description plugin-ipsec
 +OpenVPN support for Connman.
 +%endif
 +
 +%if %{with connman_vpnd}
 +%package connman-vpnd
 +Summary:        VPN Support for Connman
 +#BuildRequires:  %{name} = %{version}
 +Requires:       %{name} = %{version}
 +
 +%description connman-vpnd
 +Provides VPN support for Connman
 +%endif
 +
 +%package test
 +Summary:        Test Scripts for Connection Manager
 +Group:          Development/Tools
 +Requires:       %{name} = %{version}
 +Requires:       dbus-python
 +Requires:       pygobject
 +Requires:       python-xml
 +
 +%description test
 +Scripts for testing Connman and its functionality
 +
 +%package devel
 +Summary:        Development Files for connman
 +Group:          Development/Tools
 +Requires:       %{name} = %{version}
 +
 +%description devel
 +Header files and development files for connman.
 +
 +%package extension-tv
 +Summary:        Connman service script for TV profile
 +Requires:       %{name} = %{version}-%{release}
 +Provides:       %{name}-profile_tv = %{version}-%{release}
 +Conflicts:      %{name}-extension-ivi
 +Conflicts:      %{name}-extension-disable-eth
 +%description extension-tv
 +Supplies Tizen TV profile systemd service scripts instead of the default one.
 +This overwrites service script of %{name}.
 +
 +%package extension-ivi
 +Summary:        Connman configuration for IVI profile
 +Requires:       %{name} = %{version}-%{release}
 +Provides:       %{name}-profile_ivi = %{version}-%{release}
 +Conflicts:      %{name}-extension-tv
 +Conflicts:      %{name}-extension-disable-eth
 +%description extension-ivi
 +Supplies Tizen IVI profile configuration instead of the default one.
 +This overwrites conf file of %{name}.
 +
 +%package extension-disable-eth
 +Summary:        Connman configuration for testing which requires the ethernet to be disabled
 +Requires:       %{name} = %{version}-%{release}
 +Conflicts:      %{name}-extension-tv
 +Conflicts:      %{name}-extension-ivi
 +%description extension-disable-eth
 +Connman without ethernet support
 +This overwrites conf file of %{name}.
 +
 +%prep
 +%setup -q
 +
 +
 +%build
 +#CFLAGS+=" -DTIZEN_EXT -lsmack -Werror"
 +
 +%if %{with connman_vpnd}
 +VPN_CFLAGS+=" -DTIZEN_EXT -lsmack -Werror"
 +%endif
 +
 +chmod +x bootstrap
 +./bootstrap
 +%configure \
 +            --sysconfdir=/etc \
 +            --enable-client \
 +                      --enable-tizen-ext \
 +            --enable-pacrunner \
 +            --enable-wifi=builtin \
 +%if %{with connman_openconnect}
 +            --enable-openconnect \
 +%endif
 +%if %{with connman_openvpn}
 +            --enable-openvpn \
 +%endif
 +%if %{with connman_ipsec}
 +            --enable-ipsec \
 +%endif
 +%if 0%{?enable_connman_features}
 +            %connman_features \
 +%endif
 +            --disable-ofono \
 +            --enable-telephony=builtin \
 +            --enable-test \
 +                      --enable-loopback \
 +                      --enable-ethernet \
 +            --with-systemdunitdir=%{_libdir}/systemd/system \
 +            --enable-pie \
 +                      --disable-wispr
 +
 +make %{?_smp_mflags}
 +
 +%install
 +%make_install
 +
 +#Systemd service file
 +mkdir -p %{buildroot}%{_libdir}/systemd/system/
 +%if "%{?_lib}" == "lib64"
 +mkdir -p %{buildroot}%{_unitdir}
 +%endif
 +
 +%if "%{?_lib}" == "lib64"
 +cp src/connman_tv.service %{buildroot}%{_unitdir}/connman.service.tv
 +cp src/connman.service %{buildroot}%{_unitdir}/connman.service
 +cp vpn/connman-vpn.service %{buildroot}%{_unitdir}/connman-vpn.service
 +%else
 +cp src/connman_tv.service %{buildroot}%{_libdir}/systemd/system/connman.service.tv
 +%endif
 +
 +mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
 +ln -s ../connman.service %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants/connman.service
 +%if "%{?_lib}" == "lib64"
 +mkdir -p %{buildroot}%{_unitdir}/multi-user.target.wants
 +ln -s ../connman.service %{buildroot}%{_unitdir}/multi-user.target.wants/connman.service
 +%endif
 +
 +#Systemd socket file for DNS proxy
 +%if "%{?_lib}" == "lib64"
 +cp src/connman.socket %{buildroot}%{_unitdir}/connman.socket
 +mkdir -p %{buildroot}%{_unitdir}/sockets.target.wants
 +ln -s ../connman.socket %{buildroot}%{_unitdir}/sockets.target.wants/connman.socket
 +%else
 +cp src/connman.socket %{buildroot}%{_libdir}/systemd/system/connman.socket
 +mkdir -p %{buildroot}%{_libdir}/systemd/system/sockets.target.wants
 +ln -s ../connman.socket %{buildroot}%{_libdir}/systemd/system/sockets.target.wants/connman.socket
 +%endif
 +
 +mkdir -p %{buildroot}/%{_localstatedir}/lib/connman
 +cp resources/var/lib/connman/settings %{buildroot}/%{_localstatedir}/lib/connman/settings
 +mkdir -p %{buildroot}%{_datadir}/dbus-1/system-services
 +cp resources/usr/share/dbus-1/system-services/net.connman.service %{buildroot}%{_datadir}/dbus-1/system-services/net.connman.service
 +mkdir -p %{buildroot}/etc/connman
 +
 +cp src/main_ivi.conf %{buildroot}/etc/connman/main.conf.ivi
 +cp src/main_tv.conf %{buildroot}/etc/connman/main.conf.tv
 +cp src/main_disable_eth.conf %{buildroot}/etc/connman/main.conf.disable.eth
 +cp src/main.conf %{buildroot}/etc/connman/main.conf
 +
 +rm %{buildroot}%{_sysconfdir}/dbus-1/system.d/*.conf
 +mkdir -p %{buildroot}%{_sysconfdir}/dbus-1/system.d/
 +cp src/connman.conf %{buildroot}%{_sysconfdir}/dbus-1/system.d/
 +
 +%if %{with connman_vpnd}
 +cp vpn/vpn-dbus.conf %{buildroot}%{_sysconfdir}/dbus-1/system.d/connman-vpn-dbus.conf
 +%endif
 +
 +#OS Upgrade
 +mkdir -p %{buildroot}%{upgrade_script_path}
 +cp -f scripts/%{upgrade_script_filename} %{buildroot}%{upgrade_script_path}
 +
 +%post
 +#chsmack -a 'System' /%{_localstatedir}/lib/connman
 +#chsmack -a 'System' /%{_localstatedir}/lib/connman/settings
 +
 +%preun
 +
 +%postun
 +systemctl daemon-reload
 +
 +%docs_package
 +
 +%files
 +%manifest connman.manifest
 +%attr(500,network_fw,network_fw) %{_bindir}/connmand
 +%attr(500,network_fw,network_fw) %{_bindir}/connmanctl
 +%attr(755,network_fw,network_fw) /%{_localstatedir}/lib/connman
 +%attr(600,network_fw,network_fw) /%{_localstatedir}/lib/connman/settings
 +%attr(644,root,root) %{_datadir}/dbus-1/system-services/net.connman.service
 +%{_sysconfdir}/dbus-1/system.d/*
 +%attr(644,network_fw,network_fw) %{_sysconfdir}/connman/main.conf
 +%{_sysconfdir}/dbus-1/system.d/*.conf
 +%attr(644,root,root) %{_libdir}/systemd/system/connman.service
 +%attr(644,root,root) %{_libdir}/systemd/system/multi-user.target.wants/connman.service
 +%if "%{?_lib}" == "lib64"
 +%attr(644,root,root) %{_unitdir}/connman.service
 +%attr(644,root,root) %{_unitdir}/multi-user.target.wants/connman.service
 +%attr(644,root,root) %{_unitdir}/connman.socket
 +%attr(644,root,root) %{_unitdir}/sockets.target.wants/connman.socket
 +%else
 +%attr(644,root,root) %{_libdir}/systemd/system/connman.socket
 +%attr(644,root,root) %{_libdir}/systemd/system/sockets.target.wants/connman.socket
 +%endif
 +%license COPYING
 +%{upgrade_script_path}/%{upgrade_script_filename}
 +
 +%files test
 +%manifest connman.manifest
 +%{_libdir}/%{name}/test/*
 +
 +%files devel
 +%manifest connman.manifest
 +%{_includedir}/*
 +%{_libdir}/pkgconfig/*.pc
 +
 +%if %{with connman_openconnect}
 +%files plugin-openconnect
 +%manifest %{name}.manifest
 +%{_libdir}/connman/plugins-vpn/openconnect.so
 +%{_libdir}/connman/scripts/openconnect-script
 +%license COPYING
 +%endif
 +
 +%if %{with connman_openvpn}
 +%files plugin-openvpn
 +%manifest %{name}.manifest
 +%{_libdir}/%{name}/plugins-vpn/openvpn.so
 +%{_libdir}/%{name}/scripts/openvpn-script
 +%license COPYING
 +%endif
 +
 +%if %{with connman_ipsec}
 +%files plugin-ipsec
 +%manifest %{name}.manifest
 +%{_libdir}/%{name}/plugins-vpn/ipsec.so
 +%{_libdir}/%{name}/scripts/ipsec-script
 +%license COPYING
 +%endif
 +
 +%if %{with connman_vpnd}
 +%files connman-vpnd
 +%manifest %{name}.manifest
 +%{_bindir}/connman-vpnd
 +%dir %{_libdir}/%{name}
 +%dir %{_libdir}/%{name}/scripts
 +%dir %{_libdir}/%{name}/plugins-vpn
 +%config %{_sysconfdir}/dbus-1/system.d/connman-vpn-dbus.conf
 +%{_datadir}/dbus-1/system-services/net.connman.vpn.service
 +%license COPYING
 +%attr(644,root,root) %{_libdir}/systemd/system/connman-vpn.service
 +%if "%{?_lib}" == "lib64"
 +%attr(644,root,root) %{_unitdir}/connman-vpn.service
 +%endif
 +%endif
 +
 +%post extension-tv
 +mv -f %{_libdir}/systemd/system/connman.service.tv %{_libdir}/systemd/system/connman.service
 +mv -f %{_sysconfdir}/connman/main.conf.tv %{_sysconfdir}/connman/main.conf
 +%files extension-tv
 +%attr(644,network_fw,network_fw) %{_sysconfdir}/connman/main.conf.tv
 +%license COPYING
 +%if "%{?_lib}" == "lib64"
 +%attr(644,root,root) %{_unitdir}/connman.service.tv
 +%else
 +%attr(644,root,root) %{_libdir}/systemd/system/connman.service.tv
 +%endif
 +%post extension-ivi
 +mv -f %{_sysconfdir}/connman/main.conf.ivi %{_sysconfdir}/connman/main.conf
 +%files extension-ivi
 +%attr(644,network_fw,network_fw) %{_sysconfdir}/connman/main.conf.ivi
 +%license COPYING
 +%post extension-disable-eth
 +mv -f %{_sysconfdir}/connman/main.conf.disable.eth %{_sysconfdir}/connman/main.conf
 +%files extension-disable-eth
 +%attr(644,network_fw,network_fw) %{_sysconfdir}/connman/main.conf.disable.eth
 +%license COPYING
index f72a4af,f759a90..f89edfa
mode 100755,100644..100755
index 73494f1,9a4d741..9a4d741
mode 100755,100644..100755
index 6bc37a7,94f6648..cce51e2
mode 100755,100644..100755
diff --cc plugins/neard.c
index 1a0fc1c,69586df..69586df
mode 100755,100644..100755
diff --cc plugins/ofono.c
index 5cd8302,78f8f19..78f8f19
mode 100755,100644..100755
index 850139f,d2464a5..d2464a5
mode 100755,100644..100755
diff --cc plugins/vpn.c
index ba5841e,c2a332b..d3d75b8
mode 100755,100644..100755
diff --cc plugins/wifi.c
index 0d33f4d,34c16df..8bc6307
mode 100755,100644..100755
@@@ -157,124 -163,10 +180,128 @@@ static GList *p2p_iface_list = NULL
  bool wfd_service_registered = false;
  
  static void start_autoscan(struct connman_device *device);
 +
+ static int tech_set_tethering(struct connman_technology *technology,
+                               const char *identifier, const char *passphrase,
+                               const char *bridge, bool enabled);
 +#if defined TIZEN_EXT
 +#define NETCONFIG_SERVICE "net.netconfig"
 +#define NETCONFIG_WIFI_PATH "/net/netconfig/wifi"
 +#define NETCONFIG_WIFI_INTERFACE NETCONFIG_SERVICE ".wifi"
 +
 +struct enc_method_call_data {
 +      DBusConnection *connection;
 +      struct connman_network *network;
 +};
 +
 +static struct enc_method_call_data encrypt_request_data;
 +
 +static void encryption_request_reply(DBusPendingCall *call,
 +                                              void *user_data)
 +{
 +      DBusMessage *reply;
 +      DBusError error;
 +      DBusMessageIter args;
 +      char *out_data;
 +      struct connman_service *service;
 +      gchar* encrypted_value = NULL;
 +      struct connman_network *network = encrypt_request_data.network;
 +
 +      DBG("");
 +
 +      reply = dbus_pending_call_steal_reply(call);
 +
 +      dbus_error_init(&error);
 +      if (dbus_set_error_from_message(&error, reply)) {
 +              DBG("send_encryption_request() %s %s", error.name, error.message);
 +              dbus_error_free(&error);
 +              goto done;
 +      }
 +
 +      if (dbus_message_iter_init(reply, &args) == FALSE)
 +              goto done;
 +
 +      dbus_message_iter_get_basic(&args, &out_data);
 +
 +      encrypted_value = g_strdup((const gchar *)out_data);
 +      service = connman_service_lookup_from_network(network);
 +
 +      if (!service) {
 +              DBG("encryption result: no service");
 +              goto done;
 +      }
 +
 +      if (connman_service_get_favorite(service)) {
 +              __connman_service_set_passphrase(service, encrypted_value);
 +              __connman_service_save(service);
 +      } else
 +              connman_network_set_string(network, "WiFi.Passphrase",
 +                                                      encrypted_value);
 +
 +      DBG("encryption result: succeeded");
 +
 +done:
 +      dbus_message_unref(reply);
 +      dbus_pending_call_unref(call);
 +      dbus_connection_unref(encrypt_request_data.connection);
 +      g_free(encrypted_value);
 +
 +      encrypt_request_data.connection = NULL;
 +      encrypt_request_data.network = NULL;
 +}
 +
 +static int send_encryption_request(const char *passphrase,
 +                              struct connman_network *network)
 +{
 +      DBusConnection *connection = NULL;
 +      DBusMessage *msg = NULL;
 +      DBusPendingCall *call;
 +
 +      if (!passphrase) {
 +              DBG("Invalid parameter");
 +              return -EINVAL;
 +      }
 +
 +      connection = connman_dbus_get_connection();
 +      if (!connection) {
 +              DBG("dbus connection does not exist");
 +              return -EINVAL;
 +      }
 +
 +      msg = dbus_message_new_method_call(NETCONFIG_SERVICE, NETCONFIG_WIFI_PATH,
 +                      NETCONFIG_WIFI_INTERFACE, "EncryptPassphrase");
 +      if (!msg) {
 +              dbus_connection_unref(connection);
 +              return -EINVAL;
 +      }
 +
 +      dbus_message_append_args(msg, DBUS_TYPE_STRING, &passphrase,
 +                                                      DBUS_TYPE_INVALID);
 +
 +      if (!dbus_connection_send_with_reply(connection, msg,
 +                              &call, DBUS_TIMEOUT_USE_DEFAULT)) {
 +              dbus_message_unref(msg);
 +              dbus_connection_unref(connection);
 +              return -EIO;
 +      }
 +
 +      if (!call) {
 +              dbus_message_unref(msg);
 +              dbus_connection_unref(connection);
 +              return -EIO;
 +      }
 +
 +      encrypt_request_data.connection = connection;
 +      encrypt_request_data.network = network;
 +
 +      dbus_pending_call_set_notify(call, encryption_request_reply, NULL, NULL);
 +      dbus_message_unref(msg);
 +
 +      return 0;
 +}
 +#endif
 +
  static int p2p_tech_probe(struct connman_technology *technology)
  {
        p2p_technology = technology;
@@@ -1731,16 -1550,8 +1779,17 @@@ static int wifi_disable(struct connman_
        }
  
        remove_networks(device, wifi);
+       remove_peers(wifi);
  
 +#if defined TIZEN_EXT
 +      wifi->scan_pending_network = NULL;
 +
 +      if (is_wifi_notifier_registered == true) {
 +              connman_notifier_unregister(&notifier);
 +              is_wifi_notifier_registered = false;
 +      }
 +#endif
 +
        ret = g_supplicant_interface_remove(wifi->interface, NULL, NULL);
        if (ret < 0)
                return ret;
@@@ -2732,30 -2303,6 +2789,30 @@@ static bool handle_wps_completion(GSupp
                }
  
                wps_key = g_supplicant_interface_get_wps_key(interface);
-                ret = send_encryption_request(passphrase, network);
 +#if defined TIZEN_EXT
 +              /* Check the passphrase and encrypt it
 +               */
 +               int ret;
 +               gchar *passphrase = g_strdup(wps_key);
 +
 +               connman_network_set_string(network, "WiFi.PinWPS", NULL);
 +
 +               if (check_passphrase_ext(network, passphrase) < 0) {
 +                       DBG("[WPS] Invalid passphrase");
 +                       g_free(passphrase);
 +                       return true;
 +               }
 +
++               ret = send_encryption_request(passphrase, passphrase);
 +
 +               g_free(passphrase);
 +
 +               if (!ret)
 +                       DBG("[WPS] Encryption request succeeded");
 +               else
 +                       DBG("[WPS] Encryption request failed %d", ret);
 +
 +#else
                connman_network_set_string(network, "WiFi.Passphrase",
                                        wps_key);
  
@@@ -2968,53 -2461,6 +3055,46 @@@ static void interface_state(GSupplicant
                default:
                        break;
                }
-               /* We disable the selected network, if not then
-                * wpa_supplicant will loop retrying */
-               if (g_supplicant_interface_enable_selected_network(interface,
-                                               FALSE) != 0)
-                       DBG("Could not disables selected network");
 +
 +#if defined TIZEN_EXT
 +              int err;
 +
 +              err = g_supplicant_interface_remove_network(wifi->interface);
 +              if (err < 0)
 +                      DBG("Failed to remove network(%d)", err);
 +
 +
 +              /* Some of Wi-Fi networks are not comply Wi-Fi specification.
 +               * Retry association until its retry count is expired */
 +              if (handle_wifi_assoc_retry(network, wifi) == true) {
 +                      throw_wifi_scan(wifi->device, scan_callback);
 +                      wifi->scan_pending_network = wifi->network;
 +                      break;
 +              }
 +
 +              if(wifi->disconnect_code > 0){
 +                      DBG("Set disconnect reason code(%d)", wifi->disconnect_code);
 +                      connman_network_set_disconnect_reason(network, wifi->disconnect_code);
 +              }
 +
 +              /* To avoid unnecessary repeated association in wpa_supplicant,
 +               * "RemoveNetwork" should be made when Wi-Fi is disconnected */
 +              if (wps != true && wifi->network && wifi->disconnecting == false) {
 +                      wifi->disconnecting = true;
 +                      err = g_supplicant_interface_disconnect(wifi->interface,
 +                                                      disconnect_callback, wifi->network);
 +                      if (err < 0)
 +                              wifi->disconnecting = false;
 +
 +              connman_network_set_connected(network, false);
 +              connman_network_set_associating(network, false);
 +
 +              start_autoscan(device);
 +
 +              break;
 +              }
 +#endif
 +
                connman_network_set_connected(network, false);
                connman_network_set_associating(network, false);
                wifi->disconnecting = false;
@@@ -3160,40 -2606,39 +3244,70 @@@ static void scan_started(GSupplicantInt
  
  static void scan_finished(GSupplicantInterface *interface)
  {
 +#if defined TIZEN_EXT
 +      struct wifi_data *wifi;
 +      bool is_associating = false;
 +      static bool is_scanning = true;
 +#endif
 +
        DBG("");
 +
 +#if defined TIZEN_EXT
 +      wifi = g_supplicant_interface_get_data(interface);
 +      if (wifi && wifi->scan_pending_network) {
 +              network_connect(wifi->scan_pending_network);
 +              wifi->scan_pending_network = NULL;
 +      }
 +
 +      //service state - associating
 +      if(!wifi || !wifi->network)
 +              return;
 +
 +      is_associating = connman_network_get_associating(wifi->network);
 +      if(is_associating && is_scanning){
 +              is_scanning = false;
 +              DBG("send scan for connecting");
 +              throw_wifi_scan(wifi->device, scan_callback);
 +
 +              return;
 +      }
 +      is_scanning = true;
 +
 +      //go scan
 +
 +#endif
  }
  
+ static void ap_create_fail(GSupplicantInterface *interface)
+ {
+       struct wifi_data *wifi = g_supplicant_interface_get_data(interface);
+       int ret;
+       if ((wifi->tethering) && (wifi->tethering_param)) {
+               DBG("%s create AP fail \n",
+                               g_supplicant_interface_get_ifname(wifi->interface));
+               connman_inet_remove_from_bridge(wifi->index, wifi->bridge);
+               wifi->ap_supported = WIFI_AP_NOT_SUPPORTED;
+               wifi->tethering = false;
+               ret = tech_set_tethering(wifi->tethering_param->technology,
+                               wifi->tethering_param->ssid->ssid,
+                               wifi->tethering_param->ssid->passphrase,
+                               wifi->bridge, true);
+               if ((ret == -EOPNOTSUPP) && (wifi_technology)) {
+                       connman_technology_tethering_notify(wifi_technology,false);
+               }
+               g_free(wifi->tethering_param->ssid);
+               g_free(wifi->tethering_param);
+               wifi->tethering_param = NULL;
+       }
+       return;
+ }
  static unsigned char calculate_strength(GSupplicantNetwork *supplicant_network)
  {
        unsigned char strength;
@@@ -3220,10 -2663,6 +3334,11 @@@ static void network_added(GSupplicantNe
        bool wps_ready;
        bool wps_advertizing;
  
-       GSList *vsie_list = NULL;
 +#if defined TIZEN_EXT
++      const char *wifi_vsie;
++      unsigned int wifi_vsie_len;
 +#endif
 +
        mode = g_supplicant_network_get_mode(supplicant_network);
        identifier = g_supplicant_network_get_identifier(supplicant_network);
  
  
        ssid = g_supplicant_network_get_ssid(supplicant_network, &ssid_len);
  
++#if defined TIZEN_EXT
++      wifi_vsie = g_supplicant_network_get_wifi_vsie(supplicant_network, &wifi_vsie_len);
++#endif
        network = connman_device_get_network(wifi->device, identifier);
  
        if (!network) {
  
        connman_network_set_blob(network, "WiFi.SSID",
                                                ssid, ssid_len);
-       vsie_list = (GSList *)g_supplicant_network_get_wifi_vsie(supplicant_network);
-       if (vsie_list)
-               connman_network_set_vsie_list(network, vsie_list);
-       else
-               DBG("vsie_list is NULL");
 +#if defined TIZEN_EXT
++      if(wifi_vsie_len > 0 && wifi_vsie)
++              connman_network_set_blob(network, "WiFi.Vsie",
++                                                      wifi_vsie, wifi_vsie_len);
 +#endif
        connman_network_set_string(network, "WiFi.Security", security);
        connman_network_set_strength(network,
                                calculate_strength(supplicant_network));
@@@ -3419,20 -2800,59 +3535,71 @@@ static void network_changed(GSupplicant
                                        calculate_strength(network));
               connman_network_update(connman_network);
        }
 +
 +#if defined TIZEN_EXT
 +      bssid = g_supplicant_network_get_bssid(network);
 +      maxrate = g_supplicant_network_get_maxrate(network);
 +      frequency = g_supplicant_network_get_frequency(network);
 +      wps = g_supplicant_network_get_wps(network);
 +
 +      connman_network_set_bssid(connman_network, bssid);
 +      connman_network_set_maxrate(connman_network, maxrate);
 +      connman_network_set_frequency(connman_network, frequency);
 +      connman_network_set_bool(connman_network, "WiFi.WPS", wps);
 +#endif
  }
  
+ static void network_associated(GSupplicantNetwork *network)
+ {
+       GSupplicantInterface *interface;
+       struct wifi_data *wifi;
+       struct connman_network *connman_network;
+       const char *identifier;
+       DBG("");
+       interface = g_supplicant_network_get_interface(network);
+       if (!interface)
+               return;
+       wifi = g_supplicant_interface_get_data(interface);
+       if (!wifi)
+               return;
+       identifier = g_supplicant_network_get_identifier(network);
+       connman_network = connman_device_get_network(wifi->device, identifier);
+       if (!connman_network)
+               return;
+       if (wifi->network) {
+               if (wifi->network == connman_network)
+                       return;
+               /*
+                * This should never happen, we got associated with
+                * a network different than the one we were expecting.
+                */
+               DBG("Associated to %p while expecting %p",
+                                       connman_network, wifi->network);
+               connman_network_set_associating(wifi->network, false);
+       }
+       DBG("Reconnecting to previous network %p from wpa_s", connman_network);
+       wifi->network = connman_network_ref(connman_network);
+       wifi->retries = 0;
+       /*
+        * Interface state changes callback (interface_state) is always
+        * called before network_associated callback thus we need to call
+        * interface_state again in order to process the new state now that
+        * we have the network properly set.
+        */
+       interface_state(interface);
+ }
  static void apply_peer_services(GSupplicantPeer *peer,
                                struct connman_peer *connman_peer)
  {
@@@ -3763,20 -3072,14 +3937,21 @@@ static const GSupplicantCallbacks callb
        .network_added          = network_added,
        .network_removed        = network_removed,
        .network_changed        = network_changed,
+       .network_associated     = network_associated,
 +      .add_station            = add_station,
 +      .remove_station         = remove_station,
        .peer_found             = peer_found,
        .peer_lost              = peer_lost,
        .peer_changed           = peer_changed,
        .peer_request           = peer_request,
-       .network_merged         = network_merged,
 +#if defined TIZEN_EXT
 +      .system_power_off       = system_power_off,
++      .network_merged = network_merged,
 +      .assoc_failed           = assoc_failed,
 +#endif
+       .debug                  = debug,
        .disconnect_reasoncode  = disconnect_reasoncode,
        .assoc_status_code      = assoc_status_code,
-       .debug                  = debug,
  };
  
  
@@@ -3792,15 -3095,7 +3967,8 @@@ static void tech_remove(struct connman_
        wifi_technology = NULL;
  }
  
- struct wifi_tethering_info {
-       struct wifi_data *wifi;
-       struct connman_technology *technology;
-       char *ifname;
-       GSupplicantSSID *ssid;
- };
 -static GSupplicantSSID *ssid_ap_init(const char *ssid, const char *passphrase)
 +static GSupplicantSSID *ssid_ap_init(const char *ssid,
-               const char *passphrase, bool hidden)
++              const char *passphrase)
  {
        GSupplicantSSID *ap;
  
@@@ -3891,8 -3193,9 +4066,9 @@@ static void sta_remove_callback(int res
  
        DBG("ifname %s result %d ", info->ifname, result);
  
-       if (result < 0) {
-               info->wifi->tethering = true;
 -      if ((result < 0) || (info->wifi->ap_supported != WIFI_AP_SUPPORTED)) {
++      if (result < 0 || (info->wifi->ap_supported != WIFI_AP_SUPPORTED)) {
+               info->wifi->tethering = false;
+               connman_technology_tethering_notify(info->technology, false);
  
                g_free(info->ifname);
                g_free(info->ssid);
@@@ -3949,11 -3239,19 +4112,20 @@@ static int enable_wifi_tethering(struc
                if (!interface)
                        continue;
  
 -              ifname = g_supplicant_interface_get_ifname(wifi->interface);
 -              if (!ifname)
++              if (wifi->ap_supported == WIFI_AP_NOT_SUPPORTED)
+                       continue;
 +              ifname = g_supplicant_interface_get_ifname(wifi->interface);
 +
+               if (wifi->ap_supported == WIFI_AP_NOT_SUPPORTED) {
+                       DBG("%s does not support AP mode (detected)", ifname);
+                       continue;
+               }
                mode = g_supplicant_interface_get_mode(interface);
                if ((mode & G_SUPPLICANT_CAPABILITY_MODE_AP) == 0) {
-                       DBG("%s does not support AP mode", ifname);
+                       wifi->ap_supported = WIFI_AP_NOT_SUPPORTED;
+                       DBG("%s does not support AP mode (capability)", ifname);
                        continue;
                }
  
                info->wifi = wifi;
                info->technology = technology;
                info->wifi->bridge = bridge;
-               info->ssid = ssid_ap_init(identifier, passphrase, hidden);
-               if (!info->ssid) {
-                       g_free(info);
-                       continue;
-               }
+               info->ssid = ssid_ap_init(identifier, passphrase);
+               if (!info->ssid)
+                       goto failed;
                info->ifname = g_strdup(ifname);
-               if (!info->ifname) {
-                       g_free(info->ssid);
-                       g_free(info);
-                       continue;
-               }
++              if (!info->ifname)
++                      goto failed;
+               wifi->tethering_param->technology = technology;
+               wifi->tethering_param->ssid = ssid_ap_init(identifier, passphrase);
+               if (!wifi->tethering_param->ssid)
+                       goto failed;
  
                info->wifi->tethering = true;
+               info->wifi->ap_supported = WIFI_AP_SUPPORTED;
+               berr = connman_technology_tethering_notify(technology, true);
+               if (berr < 0)
+                       goto failed;
  
                err = g_supplicant_interface_remove(interface,
                                                sta_remove_callback,
index 2c380ab,0b9f63c..f3d438f
mode 100755,100644..100755
diff --cc src/6to4.c
index 0e3a7a1,71a2882..71a2882
mode 100755,100644..100755
index 177cbe0,fca7cc1..e4850a8
mode 100755,100644..100755
diff --cc src/agent.c
index bdeb0e7,8f7b19b..8f7b19b
mode 100755,100644..100755
diff --cc src/bridge.c
index ba20096,cd2d9ce..cd2d9ce
mode 100755,100644..100755
diff --cc src/config.c
index 25dd174,a8c3da8..75cd717
mode 100755,100644..100755
@@@ -701,7 -753,18 +756,18 @@@ static bool load_service(GKeyFile *keyf
  
                } else
                        service->security = CONNMAN_SERVICE_SECURITY_PSK;
-       }
+       } else if (str) {
 -              if (security != CONNMAN_SERVICE_SECURITY_NONE)
++              if (security != CONNMAN_SERVICE_SECURITY_NONE) {
+                       connman_info("Mismatch no security and "
+                                       "setting %s = %s",
+                                       SERVICE_KEY_SECURITY, str);
 -
 -              service->security = CONNMAN_SERVICE_SECURITY_NONE;
++              }
++                      service->security = CONNMAN_SERVICE_SECURITY_NONE;
+       } else
 -              service->security = CONNMAN_SERVICE_SECURITY_NONE;
++                      service->security = CONNMAN_SERVICE_SECURITY_NONE;
+       g_free(str);
  
        service->config_ident = g_strdup(config->ident);
        service->config_entry = g_strdup_printf("service_%s", service->ident);
index 4389d58,6b005e7..64d48b7
mode 100755,100644..100755
diff --cc src/connman.h
index 57cfc87,21b7080..4125463
mode 100755,100644..100755
@@@ -684,15 -660,9 +687,18 @@@ int __connman_service_load_modifiable(s
  
  void __connman_service_list_struct(DBusMessageIter *iter);
  
 +#if defined TIZEN_EXT
 +int connman_service_get_ipv6_dns_method(struct connman_service *service);
 +enum connman_dnsconfig_method {
 +      CONNMAN_DNSCONFIG_METHOD_UNKNOWN = 0,
 +      CONNMAN_DNSCONFIG_METHOD_MANUAL  = 1,
 +      CONNMAN_DNSCONFIG_METHOD_DHCP    = 2,
 +};
 +#endif
 +
+ int __connman_service_compare(const struct connman_service *a,
+                                       const struct connman_service *b);
  struct connman_service *__connman_service_lookup_from_index(int index);
  struct connman_service *__connman_service_lookup_from_ident(const char *identifier);
  struct connman_service *__connman_service_create_from_network(struct connman_network *network);
@@@ -939,6 -881,6 +958,11 @@@ unsigned int __connman_rtnl_update_inte
  int __connman_rtnl_request_update(void);
  int __connman_rtnl_send(const void *buf, size_t len);
  
++#if defined TIZEN_EXT
++void rtnl_nameserver_add_all(struct connman_service *service,
++                      enum connman_ipconfig_type type);
++#endif
++
  bool __connman_session_policy_autoconnect(enum connman_service_connect_reason reason);
  
  int __connman_session_create(DBusMessage *msg);
diff --cc src/device.c
index b5855cc,a563f46..3ec8f71
mode 100755,100644..100755
diff --cc src/dhcp.c
index b627362,1af1eb5..c428c1d
mode 100755,100644..100755
@@@ -120,15 -119,11 +128,17 @@@ static bool apply_dhcp_invalidate_on_ne
        }
        if (dhcp->nameservers) {
                for (i = 0; dhcp->nameservers[i]; i++) {
 +#if defined TIZEN_EXT
                        __connman_service_nameserver_remove(service,
-                                               dhcp->nameservers[i], false,
-                                               CONNMAN_IPCONFIG_TYPE_IPV4);
 -                                              dhcp->nameservers[i], false);
++                                      dhcp->nameservers[i], false,
++                                      CONNMAN_IPCONFIG_TYPE_IPV4);
 +#else
 +                      __connman_service_nameserver_remove(service,
-                                               dhcp->nameservers[i], false);
++                                      dhcp->nameservers[i], false);
 +#endif
                }
+               g_strfreev(dhcp->nameservers);
+               dhcp->nameservers = NULL;
        }
  
        return true;
@@@ -510,10 -492,20 +536,24 @@@ static void lease_available_cb(GDHCPCli
        __connman_ipconfig_set_method(dhcp->ipconfig,
                                                CONNMAN_IPCONFIG_METHOD_DHCP);
  
 +#if defined TIZEN_EXT
 +      __connman_ipconfig_set_dhcp_lease_duration(dhcp->ipconfig, dhcp_lease_duration);
 +#endif
 +
+       /*
+        * Notify IPv4.Configuration's method moved back to DHCP.
+        *
+        * This is the case ConnMan initially set an address by using
+        * IPv4LL because DHCP failed but now we got an address from DHCP.
+        */
+       if (old_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
+               struct connman_service *service =
+                       connman_service_lookup_from_network(dhcp->network);
+               if (service)
+                       __connman_service_notify_ipv4_configuration(service);
+       }
        if (ip_change) {
                __connman_ipconfig_set_local(dhcp->ipconfig, address);
                __connman_ipconfig_set_prefixlen(dhcp->ipconfig, prefixlen);
diff --cc src/dhcpv6.c
index adf8827,cbf7974..c624cb0
mode 100755,100644..100755
diff --cc src/dnsproxy.c
index 55ba69a,40b4f15..3fa7bf4
mode 100755,100644..100755
  
  #include "connman.h"
  
 +#if defined TIZEN_EXT
 +#include <sys/smack.h>
 +#include <systemd/sd-daemon.h>
 +#endif
 +
+ #define debug(fmt...) do { } while (0)
  #if __BYTE_ORDER == __LITTLE_ENDIAN
  struct domain_hdr {
        uint16_t id;
@@@ -2584,177 -2531,25 +2588,196 @@@ static int server_create_socket(struct 
        return 0;
  }
  
+ static void enable_fallback(bool enable)
+ {
+       GSList *list;
+       for (list = server_list; list; list = list->next) {
+               struct server_data *data = list->data;
+               if (data->index != -1)
+                       continue;
+               if (enable)
+                       DBG("Enabling fallback DNS server %s", data->server);
+               else
+                       DBG("Disabling fallback DNS server %s", data->server);
+               data->enabled = enable;
+       }
+ }
 +#if defined TIZEN_EXT
 +
 +static void destroy_server_sec(struct server_data *server)
 +{
 +      GList *list;
 +      int fd;
 +
 +      if (server->channel)
 +              fd = g_io_channel_unix_get_fd(server->channel);
 +      else
 +              fd = -1;
 +
 +      DBG("index %d server %s sock %d", server->index, server->server, fd);
 +
 +      server_list_sec = g_slist_remove(server_list_sec, server);
 +
 +      if (fd > 0)
 +              close(fd);
 +
 +      server_destroy_socket(server);
 +
 +      if (server->protocol == IPPROTO_UDP && server->enabled)
 +              DBG("Removing DNS server %s", server->server);
 +
 +      g_free(server->server);
 +      for (list = server->domains; list; list = list->next) {
 +              char *domain = list->data;
 +
 +              server->domains = g_list_remove(server->domains, domain);
 +              g_free(domain);
 +      }
 +      g_free(server->server_addr);
 +
 +      /*
 +       * We do not remove cache right away but delay it few seconds.
 +       * The idea is that when IPv6 DNS server is added via RDNSS, it has a
 +       * lifetime. When the lifetime expires we decrease the refcount so it
 +       * is possible that the cache is then removed. Because a new DNS server
 +       * is usually created almost immediately we would then loose the cache
 +       * without any good reason. The small delay allows the new RDNSS to
 +       * create a new DNS server instance and the refcount does not go to 0.
 +       */
 +      /* TODO: Need to check this */
 +      /* g_timeout_add_seconds(3, try_remove_cache, NULL); */
 +
 +      g_free(server);
 +}
 +
 +static void destroy_all_server_sec()
 +{
 +      GSList *list;
 +
 +      DBG("remove all dns server");
 +
 +      for (list = server_list_sec; list; list = list->next) {
 +              struct server_data *server = list->data;
 +              destroy_server_sec(server);
 +      }
 +      server_list_sec = NULL;
 +}
 +
 +static gboolean sec_udp_idle_timeout(gpointer user_data)
 +{
 +      struct server_data *server = user_data;
 +
 +      DBG("");
 +
 +      if (server == NULL)
 +              return FALSE;
 +
 +      destroy_server_sec(server);
 +
 +      return FALSE;
 +}
 +
 +static struct server_data *create_server_sec(int index,
 +                                      const char *domain, const char *server,
 +                                      int protocol)
 +{
 +      struct server_data *data;
 +      struct addrinfo hints, *rp;
 +      int ret;
 +
 +      DBG("index %d server %s", index, server);
 +
 +      data = g_try_new0(struct server_data, 1);
 +      if (data == NULL) {
 +              connman_error("Failed to allocate server %s data", server);
 +              return NULL;
 +      }
 +
 +      data->index = index;
 +      if (domain)
 +              data->domains = g_list_append(data->domains, g_strdup(domain));
 +      data->server = g_strdup(server);
 +      data->protocol = protocol;
 +
 +      memset(&hints, 0, sizeof(hints));
 +
 +      switch (protocol) {
 +      case IPPROTO_UDP:
 +              hints.ai_socktype = SOCK_DGRAM;
 +              break;
 +
 +      case IPPROTO_TCP:
 +              hints.ai_socktype = SOCK_STREAM;
 +              break;
 +
 +      default:
 +              destroy_server_sec(data);
 +              return NULL;
 +      }
 +      hints.ai_family = AF_UNSPEC;
 +      hints.ai_flags = AI_NUMERICSERV | AI_NUMERICHOST;
 +
 +      ret = getaddrinfo(data->server, "53", &hints, &rp);
 +      if (ret) {
 +              connman_error("Failed to parse server %s address: %s\n",
 +                              data->server, gai_strerror(ret));
 +              freeaddrinfo(rp);
 +              destroy_server_sec(data);
 +              return NULL;
 +      }
 +
 +      /* Do not blindly copy this code elsewhere; it doesn't loop over the
 +         results using ->ai_next as it should. That's OK in *this* case
 +         because it was a numeric lookup; we *know* there's only one. */
 +
 +      data->server_addr_len = rp->ai_addrlen;
 +
 +      switch (rp->ai_family) {
 +      case AF_INET:
 +              data->server_addr = (struct sockaddr *)
 +                                      g_try_new0(struct sockaddr_in, 1);
 +              break;
 +      case AF_INET6:
 +              data->server_addr = (struct sockaddr *)
 +                                      g_try_new0(struct sockaddr_in6, 1);
 +              break;
 +      default:
 +              connman_error("Wrong address family %d", rp->ai_family);
 +              break;
 +      }
 +      if (data->server_addr == NULL) {
 +              freeaddrinfo(rp);
 +              destroy_server_sec(data);
 +              return NULL;
 +      }
 +      memcpy(data->server_addr, rp->ai_addr, rp->ai_addrlen);
 +      freeaddrinfo(rp);
 +
 +      if (server_create_socket(data) != 0) {
 +              destroy_server_sec(data);
 +              return NULL;
 +      }
 +
 +      if (protocol == IPPROTO_UDP) {
 +              /* Enable new servers by default */
 +              data->enabled = TRUE;
 +              DBG("Adding DNS server %s", data->server);
 +
 +              data->timeout = g_timeout_add_seconds(30, sec_udp_idle_timeout,
 +                                                              data);
 +
 +              server_list_sec = g_slist_append(server_list_sec, data);
 +      }
 +
 +      return data;
 +}
 +#endif
 +
  static struct server_data *create_server(int index,
                                        const char *domain, const char *server,
                                        int protocol)
@@@ -3621,12 -3426,8 +3681,12 @@@ static bool tcp_listener_event(GIOChann
         * The packet length bytes do not contain the total message length,
         * that is the reason to -2 below.
         */
 +#if defined TIZEN_EXT
 +      if (msg_len > (unsigned int)(len - 2)) {
 +#else
        if (msg_len != (unsigned int)(len - 2)) {
-               DBG("client %d sent %d bytes but expecting %u pending %d",
 +#endif
+               debug("client %d sent %d bytes but expecting %u pending %d",
                        client_sk, len, msg_len + 2, msg_len + 2 - len);
  
                client->buf_end += len;
@@@ -3776,19 -3565,10 +3836,19 @@@ static GIOChannel *get_listener(int fam
                struct sockaddr_in sin;
        } s;
        socklen_t slen;
 +#endif
        int sk, type;
 +#if !defined TIZEN_EXT
        char *interface;
 +#endif
 +#if defined TIZEN_EXT
 +      int option;
 +      int sd_num = 0;
 +      int rv;
 +      int is_socket_inet = 0;
 +#endif
  
-       DBG("family %d protocol %d index %d", family, protocol, index);
+       debug("family %d protocol %d index %d", family, protocol, index);
  
        switch (protocol) {
        case IPPROTO_UDP:
diff --cc src/inet.c
index 02d9604,b887aa0..008f3de
mode 100755,100644..100755
diff --cc src/ipconfig.c
index ff1909d,2565773..d94b873
mode 100755,100644..100755
diff --cc src/ippool.c
index bb8568d,cea1dcc..cea1dcc
mode 100755,100644..100755
diff --cc src/iptables.c
index a5774ad,5ef757a..aaddf9d
mode 100755,100644..100755
@@@ -2314,10 -2350,8 +2350,8 @@@ int __connman_iptables_commit(const cha
                return -EINVAL;
  
        repl = iptables_blob(table);
- #if defined TIZEN_EXT
 -      if (!repl)
 +      if(!repl)
                return -ENOMEM;
- #endif
  
        if (debug_enabled)
                dump_ipt_replace(repl);
diff --cc src/log.c
index 32b35bc,9bae4a3..fa8ac31
mode 100755,100644..100755
+++ b/src/log.c
@@@ -216,6 -89,6 +216,7 @@@ void connman_error(const char *format, 
        vsyslog(LOG_ERR, format, ap);
  
        va_end(ap);
++      fflush(log_file);
  }
  
  /**
@@@ -234,108 -107,6 +235,109 @@@ void connman_debug(const char *format, 
        vsyslog(LOG_DEBUG, format, ap);
  
        va_end(ap);
++      fflush(log_file);
 +}
 +
 +static void print_backtrace(unsigned int offset)
 +{
 +      void *frames[99];
 +      size_t n_ptrs;
 +      unsigned int i;
 +      int outfd[2], infd[2];
 +      int pathlen;
 +      pid_t pid;
 +
 +      if (!program_exec)
 +              return;
 +
 +      pathlen = strlen(program_path);
 +
 +      n_ptrs = backtrace(frames, G_N_ELEMENTS(frames));
 +      if (n_ptrs < offset)
 +              return;
 +
 +      if (pipe(outfd) < 0)
 +              return;
 +
 +      if (pipe(infd) < 0) {
 +              close(outfd[0]);
 +              close(outfd[1]);
 +              return;
 +      }
 +
 +      pid = fork();
 +      if (pid < 0) {
 +              close(outfd[0]);
 +              close(outfd[1]);
 +              close(infd[0]);
 +              close(infd[1]);
 +              return;
 +      }
 +
 +      if (pid == 0) {
 +              close(outfd[1]);
 +              close(infd[0]);
 +
 +              dup2(outfd[0], STDIN_FILENO);
 +              dup2(infd[1], STDOUT_FILENO);
 +
 +              execlp("addr2line", "-C", "-f", "-e", program_exec, NULL);
 +
 +              exit(EXIT_FAILURE);
 +      }
 +
 +      close(outfd[0]);
 +      close(infd[1]);
 +
 +      connman_error("++++++++ backtrace ++++++++");
 +
 +      for (i = offset; i < n_ptrs - 1; i++) {
 +              Dl_info info;
 +              char addr[20], buf[PATH_MAX * 2];
 +              int len, written;
 +              char *ptr, *pos;
 +
 +              dladdr(frames[i], &info);
 +
 +              len = snprintf(addr, sizeof(addr), "%p\n", frames[i]);
 +              if (len < 0)
 +                      break;
 +
 +              written = write(outfd[1], addr, len);
 +              if (written < 0)
 +                      break;
 +
 +              len = read(infd[0], buf, sizeof(buf) - 1);
 +              if (len < 0)
 +                      break;
 +
 +              buf[len] = '\0';
 +
 +              pos = strchr(buf, '\n');
 +              *pos++ = '\0';
 +
 +              if (strcmp(buf, "??") == 0) {
 +                      connman_error("#%-2u %p in %s", i - offset,
 +                                              frames[i], info.dli_fname);
 +                      continue;
 +              }
 +
 +              ptr = strchr(pos, '\n');
 +              *ptr++ = '\0';
 +
 +              if (strncmp(pos, program_path, pathlen) == 0)
 +                      pos += pathlen + 1;
 +
 +              connman_error("#%-2u %p in %s() at %s", i - offset,
 +                                              frames[i], buf, pos);
 +      }
 +
 +      connman_error("+++++++++++++++++++++++++++");
 +
 +      kill(pid, SIGTERM);
 +
 +      close(outfd[1]);
 +      close(infd[0]);
  }
  
  static void signal_handler(int signo)
diff --cc src/main.c
index 21ed25f,b78a046..4bc2266
mode 100755,100644..100755
@@@ -76,10 -77,8 +79,12 @@@ static struct 
        char **tethering_technologies;
        bool persistent_tethering_mode;
        bool enable_6to4;
+       char *vendor_class_id;
+       bool enable_online_check;
 +#if defined TIZEN_EXT
 +      char **cellular_interfaces;
 +      bool tizen_tv_extension;
 +#endif
  } connman_settings  = {
        .bg_scan = true,
        .pref_timeservers = NULL,
        .tethering_technologies = NULL,
        .persistent_tethering_mode = false,
        .enable_6to4 = false,
+       .vendor_class_id = NULL,
+       .enable_online_check = true,
 +#if defined TIZEN_EXT
 +      .cellular_interfaces = NULL,
 +      .tizen_tv_extension = false,
 +#endif
  };
  
  #define CONF_BG_SCAN                    "BackgroundScanning"
  #define CONF_TETHERING_TECHNOLOGIES      "TetheringTechnologies"
  #define CONF_PERSISTENT_TETHERING_MODE  "PersistentTetheringMode"
  #define CONF_ENABLE_6TO4                "Enable6to4"
+ #define CONF_VENDOR_CLASS_ID            "VendorClassID"
+ #define CONF_ENABLE_ONLINE_CHECK        "EnableOnlineCheck"
 +#if defined TIZEN_EXT
 +#define CONF_CELLULAR_INTERFACE         "NetworkCellularInterfaceList"
 +#define CONF_TIZEN_TV_EXT             "TizenTVExtension"
 +#endif
  
  static const char *supported_options[] = {
        CONF_BG_SCAN,
        CONF_TETHERING_TECHNOLOGIES,
        CONF_PERSISTENT_TETHERING_MODE,
        CONF_ENABLE_6TO4,
 -      CONF_VENDOR_CLASS_ID,
+       CONF_ENABLE_ONLINE_CHECK,
 +#if defined TIZEN_EXT
 +      CONF_CELLULAR_INTERFACE,
 +      CONF_TIZEN_TV_EXT,
 +#endif
        NULL
  };
  
@@@ -424,9 -392,22 +449,26 @@@ static void parse_config(GKeyFile *conf
  
        g_clear_error(&error);
  
+       vendor_class_id = __connman_config_get_string(config, "General",
+                                       CONF_VENDOR_CLASS_ID, &error);
+       if (!error)
+               connman_settings.vendor_class_id = vendor_class_id;
+       g_clear_error(&error);
+       boolean = __connman_config_get_bool(config, "General",
+                                       CONF_ENABLE_ONLINE_CHECK, &error);
+       if (!error) {
+               connman_settings.enable_online_check = boolean;
+               if (!boolean)
+                       connman_info("Online check disabled by main config.");
+       }
+       g_clear_error(&error);
++
 +#if defined TIZEN_EXT
 +      check_Tizen_configuration(config);
 +#endif
  }
  
  static int config_init(const char *file)
diff --cc src/main.conf
index d0edbdf,68870b2..a2cc1e2
mode 100755,100644..100755
@@@ -60,9 -57,8 +60,9 @@@ PreferredTechnologies = wifi, etherne
  # Found interfaces will be compared to the list and will
  # not be handled by connman, if their first characters
  # match any of the list entries. Default value is
- # vmnet,vboxnet,virbr,ifb.
- # NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb
+ # vmnet,vboxnet,virbr,ifb,ve-,vb-.
+ # NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,ve-,vb-
 +NetworkInterfaceBlacklist = veth, vmnet,vboxnet,virbr,usb,rndis,rmnet,rev_rmnet,dummy,seth_td,seth_w
  
  # Allow connman to change the system hostname. This can
  # happen for example if we receive DHCP hostname option.
@@@ -107,4 -102,18 +107,20 @@@ SingleConnectedTechnology = tru
  # section 4.1).
  # Enable6to4 = false
  
+ # Enable use of http get as on online status check.
+ # When a service is in a READY state, and is selected as default,
+ # ConnMan will issue an HTTP GET request to verify that end-to-end
+ # connectivity is successful. Only then the service will be
+ # transitioned to ONLINE state.
+ # If this setting is false, the default service will remain in READY state.
+ # Default value is true.
+ # EnableOnlineCheck = false
+ # List of technologies with AutoConnect = true which are always connected
+ # regardless of PreferredTechnologies setting. Default value is empty and
+ # will connect a technology only if it is at a higher preference than any
+ # other which is already connected.
+ # This setting has no effect if SingleConnectedTechnologies is enabled.
+ # AlwaysConnectedTechnologies =
++
 +NetworkCellularInterfaceList = pdp,rmnet,seth_td,seth_w
diff --cc src/nat.c
index 063f085,fb55710..fb55710
mode 100755,100644..100755
+++ b/src/nat.c
diff --cc src/network.c
index f7a9925,ed56210..d38fc0a
mode 100755,100644..100755
@@@ -99,25 -92,8 +104,26 @@@ struct connman_network 
                bool wps;
                bool use_wps;
                char *pin_wps;
-               GSList *vsie_list;
 +#if defined TIZEN_EXT
 +              char encryption_mode[WIFI_ENCYPTION_MODE_LEN_MAX];
 +              unsigned char bssid[WIFI_BSSID_LEN_MAX];
 +              unsigned int maxrate;
 +              bool isHS20AP;
 +              unsigned int keymgmt;
 +              char *keymgmt_type;
 +              bool rsn_mode;
 +              int disconnect_reason;
 +              int assoc_status_code;
++              void *wifi_vsie;
++              unsigned int wifi_vsie_len;
 +#endif
        } wifi;
  
 +#if defined TIZEN_EXT
 +      /* Multiple APN services and a default APN which a user selected */
 +      bool default_internet;
 +#endif
 +
  };
  
  static const char *type2string(enum connman_network_type type)
@@@ -613,13 -557,6 +615,11 @@@ static void autoconf_ipv6_set(struct co
  
        __connman_device_set_network(network->device, network);
  
-       connman_device_set_disconnected(network->device, false);
 +#if defined TIZEN_EXT
 +      if(network->type == CONNMAN_NETWORK_TYPE_CELLULAR)
 +              return;
 +#endif
 +
        service = connman_service_lookup_from_network(network);
        if (!service)
                return;
@@@ -969,9 -905,7 +979,9 @@@ static void network_destruct(struct con
        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);
++      g_free(network->wifi.wifi_vsie);
 +#endif
        g_free(network->path);
        g_free(network->group);
        g_free(network->node);
@@@ -1931,155 -1661,6 +1939,142 @@@ int connman_network_set_ipaddress(struc
        return 0;
  }
  
- int connman_network_set_assoc_status_code(struct connman_network *network,
-                               int assoc_status_code)
- {
-       if (network == NULL)
-               return 0;
-       network->wifi.assoc_status_code = assoc_status_code;
-       return 0;
- }
 +#if defined TIZEN_EXT
 +/*
 + * Description: Network client requires additional wifi specific info
 + */
 +int connman_network_set_bssid(struct connman_network *network,
 +                              const unsigned char *bssid)
 +{
 +      int i = 0;
 +
 +      if (bssid == NULL)
 +              return -EINVAL;
 +
 +      DBG("network %p bssid %02x:%02x:%02x:%02x:%02x:%02x", network,
 +                      bssid[0], bssid[1], bssid[2],
 +                      bssid[3], bssid[4], bssid[5]);
 +
 +      for (;i < WIFI_BSSID_LEN_MAX;i++)
 +              network->wifi.bssid[i] = bssid[i];
 +
 +      return 0;
 +}
 +
 +unsigned char *connman_network_get_bssid(struct connman_network *network)
 +{
 +      return (unsigned char *)network->wifi.bssid;
 +}
 +
 +int connman_network_set_maxrate(struct connman_network *network,
 +                              unsigned int maxrate)
 +{
 +#if !defined TIZEN_EXT
 +      DBG("network %p maxrate %d", network, maxrate);
 +#endif
 +
 +      network->wifi.maxrate = maxrate;
 +
 +      return 0;
 +}
 +
 +unsigned int connman_network_get_maxrate(struct connman_network *network)
 +{
 +      return network->wifi.maxrate;
 +}
 +
 +int connman_network_set_enc_mode(struct connman_network *network,
 +                              const char *encryption_mode)
 +{
 +      if (encryption_mode == NULL)
 +              return -EINVAL;
 +
 +      DBG("network %p encryption mode %s", network, encryption_mode);
 +
 +      g_strlcpy(network->wifi.encryption_mode, encryption_mode,
 +                                      WIFI_ENCYPTION_MODE_LEN_MAX);
 +
 +      return 0;
 +}
 +
 +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)
 +{
 +      struct connman_service *service;
 +
 +      DBG("network %p proxies %s", network, proxies);
 +
 +      service = connman_service_lookup_from_network(network);
 +      if (service == NULL)
 +              return -EINVAL;
 +
 +      __connman_service_set_proxy(service, proxies);
 +
 +      connman_service_set_proxy_method(service,
 +                              CONNMAN_SERVICE_PROXY_METHOD_MANUAL);
 +
 +      return 0;
 +}
 +
 +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;
 +}
 +int connman_network_get_assoc_status_code(struct connman_network *network)
 +{
 +      if (network == NULL)
 +              return 0;
 +
 +      return network->wifi.assoc_status_code;
 +}
 +#endif
 +
  int connman_network_set_nameservers(struct connman_network *network,
                                const char *nameservers)
  {
@@@ -2443,6 -1965,6 +2408,16 @@@ int connman_network_set_blob(struct con
                        network->wifi.ssid_len = size;
                } else
                        network->wifi.ssid_len = 0;
++#if defined TIZEN_EXT
++      } else if (g_str_equal(key, "WiFi.Vsie")){
++              g_free(network->wifi.wifi_vsie);
++              network->wifi.wifi_vsie = g_try_malloc(size);
++              if (network->wifi.wifi_vsie) {
++                      memcpy(network->wifi.wifi_vsie, data, size);
++                      network->wifi.wifi_vsie_len = size;
++              } else
++                      network->wifi.wifi_vsie_len = 0;
++#endif
        } else {
                return -EINVAL;
        }
@@@ -2471,6 -1989,6 +2442,15 @@@ const void *connman_network_get_blob(st
                return network->wifi.ssid;
        }
  
++#if defined TIZEN_EXT
++      if (g_str_equal(key, "WiFi.Vsie")) {
++              if (size)
++                      *size = network->wifi.wifi_vsie_len;
++
++              return network->wifi.wifi_vsie;
++      }
++#endif
++
        return NULL;
  }
  
diff --cc src/ntp.c
index bc553bf,0e80c3e..11512a0
mode 100755,100644..100755
+++ b/src/ntp.c
@@@ -235,7 -251,8 +251,9 @@@ static void decode_msg(void *base, size
        double m_delta, org, rec, xmt, dst;
        double delay, offset;
        static guint transmit_delay;
++#if !defined TIZEN_EXT
+       struct timex tmx = {};
 -
++#endif
        if (len < sizeof(*msg)) {
                connman_error("Invalid response from time server");
                return;
  
        poll_id = g_timeout_add_seconds(transmit_delay, next_poll, NULL);
  
-       connman_info("ntp: time slew %+.6f s", offset);
 +#if defined TIZEN_EXT
 +      //send the dbus message to alram-manager
 +      {
 +#define TIME_BUS_NAME "org.tizen.alarm.manager"
 +#define TIME_INTERFACE "org.tizen.alarm.manager"
 +#define TIME_PATH "/org/tizen/alarm/manager"
 +#define TIME_METHOD "alarm_set_time_with_propagation_delay"
 +
 +              struct timespec cur = {0};
 +              struct timespec req = {0};
 +              double dtime;
 +
 +              DBusConnection *connection = NULL;
 +              DBusMessage *msg = NULL, *reply = NULL;
 +              DBusError error;
 +
 +              dbus_error_init(&error);
 +
 +              connection = connman_dbus_get_connection();
 +              if(!connection){
 +                      DBG("dbus connection does not exist");
 +                      return;
 +              }
 +
 +              clock_gettime(CLOCK_REALTIME, &cur);
 +              dtime = offset + cur.tv_sec + 1.0e-9 * cur.tv_nsec;
 +              cur.tv_sec = (long) dtime;
 +              cur.tv_nsec = (dtime - cur.tv_sec) * 1000000000;
 +
 +              clock_gettime(CLOCK_REALTIME, &req);
 +              msg = dbus_message_new_method_call(TIME_BUS_NAME, TIME_PATH,
 +                      TIME_INTERFACE, TIME_METHOD);
 +              dbus_message_append_args(msg, DBUS_TYPE_UINT32, &(cur.tv_sec),
 +                      DBUS_TYPE_UINT32, &(cur.tv_nsec),
 +                      DBUS_TYPE_UINT32, &(req.tv_sec),
 +                      DBUS_TYPE_UINT32, &(req.tv_nsec), DBUS_TYPE_INVALID);
 +              reply = dbus_connection_send_with_reply_and_block(connection, msg,
 +                              DBUS_TIMEOUT_USE_DEFAULT, &error);
 +              if(reply == NULL){
 +                      if(dbus_error_is_set(&error)){
 +                              DBG("%s", error.message);
 +                              dbus_error_free(&error);
 +                      }
 +                      else{
 +                              DBG("Failed to request set time");
 +                      }
 +                      dbus_connection_unref(connection);
 +                      dbus_message_unref(msg);
 +                      return;
 +              }
 +
 +              dbus_message_unref(msg);
 +              dbus_message_unref(reply);
 +              dbus_connection_unref(connection);
 +
 +              DBG("%lu cur seconds, %lu cur nsecs, %lu req seconds, %lu req nsecs",
 +                      cur.tv_sec, cur.tv_nsec, req.tv_sec, req.tv_nsec);
 +              DBG("setting time");
 +      }
 +#else
        if (offset < STEPTIME_MIN_OFFSET && offset > -STEPTIME_MIN_OFFSET) {
-               struct timeval adj;
-               adj.tv_sec = (long) offset;
-               adj.tv_usec = (offset - adj.tv_sec) * 1000000;
-               DBG("adjusting time");
-               if (adjtime(&adj, &adj) < 0) {
-                       connman_error("Failed to adjust time");
-                       return;
-               }
-               DBG("%lu seconds, %lu msecs", adj.tv_sec, adj.tv_usec);
+               tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_OFFSET | ADJ_TIMECONST | ADJ_MAXERROR | ADJ_ESTERROR;
+               tmx.status = STA_PLL;
+               tmx.offset = offset * NSEC_PER_SEC;
+               tmx.constant = msg->poll - 4;
+               tmx.maxerror = 0;
+               tmx.esterror = 0;
+               connman_info("ntp: adjust (slew): %+.6f sec", offset);
        } else {
-               struct timeval cur;
-               double dtime;
-               gettimeofday(&cur, NULL);
-               dtime = offset + cur.tv_sec + 1.0e-6 * cur.tv_usec;
-               cur.tv_sec = (long) dtime;
-               cur.tv_usec = (dtime - cur.tv_sec) * 1000000;
+               tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_SETOFFSET | ADJ_MAXERROR | ADJ_ESTERROR;
+               /* ADJ_NANO uses nanoseconds in the microseconds field */
+               tmx.time.tv_sec = (long)offset;
+               tmx.time.tv_usec = (offset - tmx.time.tv_sec) * NSEC_PER_SEC;
+               tmx.maxerror = 0;
+               tmx.esterror = 0;
+               /* the kernel expects -0.3s as {-1, 7000.000.000} */
+               if (tmx.time.tv_usec < 0) {
+                       tmx.time.tv_sec  -= 1;
+                       tmx.time.tv_usec += NSEC_PER_SEC;
+               }
  
-               DBG("setting time");
+               connman_info("ntp: adjust (jump): %+.6f sec", offset);
+       }
  
-               if (settimeofday(&cur, NULL) < 0) {
-                       connman_error("Failed to set time");
-                       return;
-               }
+       if (NTP_FLAGS_LI_DECODE(msg->flags) & NTP_FLAG_LI_ADDSECOND)
+               tmx.status |= STA_INS;
+       else if (NTP_FLAGS_LI_DECODE(msg->flags) & NTP_FLAG_LI_DELSECOND)
+               tmx.status |= STA_DEL;
  
-               DBG("%lu seconds, %lu msecs", cur.tv_sec, cur.tv_usec);
+       if (adjtimex(&tmx) < 0) {
+               connman_error("Failed to adjust time");
+               return;
        }
 -              LOGTOD(msg->poll), offset, delay, tmx.freq / 65536);
+       DBG("interval/delta/delay/drift %fs/%+.3fs/%.3fs/%+ldppm",
++                      LOGTOD(msg->poll), offset, delay, tmx.freq / 65536);
 +#endif
  }
  
  static gboolean received_data(GIOChannel *channel, GIOCondition condition,
diff --cc src/peer.c
index 206b799,340cbcc..340cbcc
mode 100755,100644..100755
index 053672a,a457bff..a457bff
mode 100755,100644..100755
diff --cc src/provider.c
index 521346b,9c71a20..c0d69e4
mode 100755,100644..100755
diff --cc src/proxy.c
index f331de9,e1bc420..e1bc420
mode 100755,100644..100755
diff --cc src/resolver.c
index 8a7fa66,75ea5ba..d6c20cd
mode 100755,100644..100755
@@@ -419,6 -401,18 +401,24 @@@ static int append_resolver(int index, c
        else
                __connman_resolvfile_append(entry->index, domain, server);
  
+       /*
+        * We update the service only for those nameservers
+        * that are automagically added via netlink (lifetime > 0)
+        */
+       if (server && entry->index >= 0 && lifetime) {
+               struct connman_service *service;
+               service = __connman_service_lookup_from_index(entry->index);
+               if (service)
++#if defined TIZEN_EXT
++                      __connman_service_nameserver_append(service,
++                                      server, true,
++                                      CONNMAN_IPCONFIG_TYPE_ALL);
++#else
+                       __connman_service_nameserver_append(service,
+                                                       server, true);
++#endif
+       }
        return 0;
  }
  
diff --cc src/rfkill.c
index 36426e0,d9bed4d..fce9d72
mode 100755,100644..100755
diff --cc src/rtnl.c
index 5690c48,a094e25..35ae0a9
mode 100755,100644..100755
@@@ -532,26 -471,9 +534,28 @@@ static void process_newlink(unsigned sh
  
                if (type == ARPHRD_ETHER)
                        read_uevent(interface);
-       } else
 +#if defined TIZEN_EXT
 +              if (type == ARPHRD_PPP || type == ARPHDR_RMNET)
 +                      read_uevent(interface);
 +
 +      } else if (g_strcmp0(interface->ident, ident) != 0) {
 +              /* If an original address is built-in physical device,
 +               * it's hardly get an address at a initial creation
 +               */
 +              __connman_technology_remove_interface(interface->service_type,
 +                              interface->index, interface->ident);
 +
 +              g_free(interface->ident);
 +              interface->ident = g_strdup(ident);
 +
 +              __connman_technology_add_interface(interface->service_type,
 +                              interface->index, interface->ident);
 +
 +              interface = NULL;
 +#endif
+       } else if (type == ARPHRD_ETHER && interface->device_type == CONNMAN_DEVICE_TYPE_UNKNOWN)
+               read_uevent(interface);
+       else
                interface = NULL;
  
        for (list = rtnl_list; list; list = list->next) {
@@@ -1355,25 -1239,18 +1359,31 @@@ static void rtnl_newnduseropt(struct nl
  
                if (opt->nd_opt_type == 25) { /* ND_OPT_RDNSS */
                        char buf[40];
++#if defined TIZEN_EXT
++                      struct connman_service *service;
  
++                      service = __connman_service_lookup_from_index(index);
++                      DBG("service: %p\n",service);
++#endif
                        servers = rtnl_nd_opt_rdnss(opt, &lifetime,
 -                                                              &nr_servers);
 +                                      &nr_servers);
                        for (i = 0; i < nr_servers; i++) {
                                if (!inet_ntop(AF_INET6, servers + i, buf,
 -                                                              sizeof(buf)))
 +                                                      sizeof(buf)))
                                        continue;
  
 +#if defined TIZEN_EXT
 +                              __connman_service_nameserver_remove(service,
 +                                              buf, false,
 +                                              CONNMAN_IPCONFIG_TYPE_IPV6);
 +                              __connman_service_nameserver_append(service,
 +                                              buf, false,
 +                                              CONNMAN_IPCONFIG_TYPE_IPV6);
 +#endif
                                connman_resolver_append_lifetime(index,
 -                                                      NULL, buf, lifetime);
 +                                              NULL, buf, lifetime);
                        }
                } else if (opt->nd_opt_type == 31) { /* ND_OPT_DNSSL */
                        g_free(domains);
  
diff --cc src/service.c
index 033c8f8,02cd51f..d0543ae
mode 100755,100644..100755
@@@ -445,116 -355,19 +451,129 @@@ static enum connman_service_proxy_metho
                return CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN;
  }
  
 +#ifdef TIZEN_EXT
 +static const char *__connman_dnsconfig_method2string(enum connman_dnsconfig_method method)
 +{
 +      switch (method) {
 +      case CONNMAN_DNSCONFIG_METHOD_UNKNOWN:
 +              return "unknown";
 +      case CONNMAN_DNSCONFIG_METHOD_MANUAL:
 +              return "manual";
 +      case CONNMAN_DNSCONFIG_METHOD_DHCP:
 +              return "dhcp";
 +      }
 +
 +      return NULL;
 +}
 +
 +static enum connman_dnsconfig_method __connman_dnsconfig_string2method(
 +              const char *method)
 +{
 +      if (g_strcmp0(method, "manual") == 0)
 +              return CONNMAN_DNSCONFIG_METHOD_MANUAL;
 +      else if (g_strcmp0(method, "dhcp") == 0)
 +              return CONNMAN_DNSCONFIG_METHOD_DHCP;
 +      else
 +              return CONNMAN_DNSCONFIG_METHOD_UNKNOWN;
 +}
 +#endif
 +
 +static bool
 +connman_service_is_user_allowed(struct connman_service *service, uid_t uid)
 +{
 +      uid_t favorite_user = service->user.favorite_user;
 +      uid_t current_user = uid;
 +
 +      DBG("Service favorite UID: %d, current UID: %d", favorite_user, current_user);
 +      if (favorite_user == USER_NONE || current_user == USER_ROOT)
 +              return true;
 +
 +      if (favorite_user != current_user || current_user == USER_NONE) {
 +              DBG("Current user is not a favorite user to this service!");
 +              return false;
 +      }
 +
 +      return true;
 +}
 +
 +#if !defined TIZEN_EXT
 +static GList *connman_service_get_login_users()
 +{
 +      struct utmpx *utmp;
 +      struct passwd *pwd;
 +      GList *user_list = NULL;
 +
 +      setutxent();
 +
 +      while ((utmp = getutxent()) != NULL) {
 +              DBG("User Name: %s", utmp->ut_user);
 +
 +              pwd = getpwnam(utmp->ut_user);
 +              if (pwd) {
 +                      if (!g_list_find(user_list, GUINT_TO_POINTER(pwd->pw_uid)))
 +                              user_list = g_list_append(user_list,
 +                                              GUINT_TO_POINTER(pwd->pw_uid));
 +
 +                      DBG("User Name: %s, UID: %d", utmp->ut_user, pwd->pw_uid);
 +              }
 +      }
 +
 +      endutxent();
 +
 +      return user_list;
 +}
 +#endif
 +
 +static bool is_service_owner_user_login(struct connman_service *service)
 +{
 +#if defined TIZEN_EXT
 +      return true;
 +#else
 +      GList *list, *user_list;
 +      bool ret = false;
 +
 +      /* Here we only care about wifi service */
 +      if (service->type != CONNMAN_SERVICE_TYPE_WIFI)
 +              return true;
 +
 +      DBG("service favorite user id is: %d", service->user.favorite_user);
 +
 +      user_list = connman_service_get_login_users();
 +      if (user_list == NULL) {
 +              DBG("Can not get any logged in user info.");
 +              return true;
 +      }
 +
 +      for (list = user_list; list; list = list->next) {
 +              uid_t uid = GPOINTER_TO_UINT(list->data);
 +
 +              DBG("login user id is %d", uid);
 +
 +              if (service->user.favorite_user == uid) {
 +                      ret = true;
 +                      break;
 +              }
 +      }
 +
 +      g_list_free(user_list);
 +
 +      return ret;
 +#endif
 +}
 +
+ static void set_split_routing(struct connman_service *service, bool value)
+ {
+       if (service->type != CONNMAN_SERVICE_TYPE_VPN)
+               return;
+       service->do_split_routing = value;
+       if (service->do_split_routing)
+               service->order = 0;
+       else
+               service->order = 10;
+ }
  int __connman_service_load_modifiable(struct connman_service *service)
  {
        GKeyFile *keyfile;
@@@ -1343,138 -1053,28 +1432,132 @@@ static int nameserver_add(struct connma
        if (index < 0)
                return -ENXIO;
  
-       return connman_resolver_append(index, NULL, nameserver);
 +#if defined TIZEN_EXT
 +      DBG("Resolver append nameserver: %s", nameserver);
 +#endif
+       ret = connman_resolver_append(index, NULL, nameserver);
+       if (ret >= 0)
+               nameservers_changed(service);
+       return ret;
  }
  
- #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
+                       enum connman_ipconfig_type type)
  {
        int i = 0;
  
        if (service->nameservers_config) {
                while (service->nameservers_config[i]) {
-                                       nameserver_add(service,
 +#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,
++                                      nameserver_add(service, type,
 +                                                     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,
++                                      nameserver_add(service, type,
 +                                                     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,
++                                      nameserver_add(service, type,
 +                                                     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]);
++                                      nameserver_add(service, type,
 +                                                     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, type,
+                               service->nameservers_config[i]);
 +#endif
                        i++;
                }
- #if !defined TIZEN_EXT
-               return 0;
- #endif
-       }
- #if defined TIZEN_EXT
-       i = 0;
- #endif
-       if (service->nameservers) {
+       } else if (service->nameservers) {
                while (service->nameservers[i]) {
-                                       nameserver_add(service,
 +#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,
++                                      nameserver_add(service, type,
 +                                                     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,
++                                      nameserver_add(service, type,
 +                                                     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,
++                                      nameserver_add(service, type,
 +                                                     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]);
++                                      nameserver_add(service, type,
 +                                                     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, type,
+                               service->nameservers[i]);
 +#endif
                        i++;
                }
        }
@@@ -1494,28 -1100,16 +1583,28 @@@ static int nameserver_remove(struct con
        if (index < 0)
                return -ENXIO;
  
-       return connman_resolver_remove(index, NULL, nameserver);
 +#if defined TIZEN_EXT
 +      DBG("Resolver remove nameserver: %s", nameserver);
 +#endif
+       ret = connman_resolver_remove(index, NULL, nameserver);
+       if (ret >= 0)
+               nameservers_changed(service);
+       return ret;
  }
  
- #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
+                               enum connman_ipconfig_type type)
  {
 +#if defined TIZEN_EXT
 +      /**
 +        * Skip this function if there is any connected profiles
 +        * that use same interface
 +        */
 +      if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR &&
 +                      __connman_service_get_connected_count_of_iface(service) > 0)
 +              return 0;
 +#endif
        int index, i = 0;
  
        index = __connman_service_get_index(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,
++                              nameserver_remove(service, type,
 +                                                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,
++                              nameserver_remove(service, type,
 +                                                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,
++                              nameserver_remove(service, type,
 +                                                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,
++                              nameserver_remove(service, type,
 +                                                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]);
+               nameserver_remove(service, type,
+                               service->nameservers_config[i]);
 +#endif
                i++;
        }
  
        i = 0;
        while (service->nameservers && service->nameservers[i]) {
-                                       nameserver_remove(service,
 +#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,
++                                      nameserver_remove(service, type,
 +                                                        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,
++                                      nameserver_remove(service, type,
 +                                                        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,
++                                      nameserver_remove(service, type,
 +                                                        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]);
++                                      nameserver_remove(service, type,
 +                                                        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, type, service->nameservers[i]);
 +#endif
                i++;
        }
  
@@@ -1748,18 -1173,6 +1790,16 @@@ int __connman_service_nameserver_append
        nameservers[len] = g_strdup(nameserver);
        nameservers[len + 1] = NULL;
  
-                       service->dns_config_method_ipv4 ==
-                       CONNMAN_DNSCONFIG_METHOD_UNKNOWN)
 +#ifdef TIZEN_EXT
 +      if(type == CONNMAN_IPCONFIG_TYPE_IPV4 &&
-                       service->dns_config_method_ipv6 ==
-                       CONNMAN_DNSCONFIG_METHOD_UNKNOWN)
++         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 {
@@@ -1838,10 -1246,8 +1879,14 @@@ set_servers
                service->nameservers_auto = nameservers;
        } else {
                service->nameservers = nameservers;
-               nameserver_remove(service, nameserver);
 +#if defined TIZEN_EXT
 +              DBG("nameserver remove ip_type: %d", type);
++              nameserver_remove(service, type,
++                              nameserver);
++#else
+               nameserver_remove(service, CONNMAN_IPCONFIG_TYPE_ALL,
+                               nameserver);
 +#endif
        }
  
        return 0;
@@@ -2066,71 -1473,6 +2112,71 @@@ static void reset_stats(struct connman_
        g_timer_reset(service->stats_roaming.timer);
  }
  
-                               is_connected(service) == TRUE) {
 +#if defined TIZEN_EXT
 +static gboolean __connman_service_is_internet_profile(
 +              struct connman_service *cellular)
 +{
 +      const char internet_suffix[] = "_1";
 +
 +      DBG("Service path: %s", cellular->path);
 +
 +      if (g_str_has_suffix(cellular->path, internet_suffix) == TRUE)
 +              return TRUE;
 +
 +      return FALSE;
 +}
 +
 +static gboolean __connman_service_is_tethering_profile(
 +              struct connman_service *cellular)
 +{
 +      const char tethering_suffix[] = "_5";
 +
 +      DBG("Service path: %s", cellular->path);
 +
 +      if (g_str_has_suffix(cellular->path, tethering_suffix) == TRUE)
 +              return TRUE;
 +
 +      return FALSE;
 +}
 +
 +struct connman_service *connman_service_get_default_connection(void)
 +{
 +      GList *list;
 +      struct connman_service *service;
 +      struct connman_service *default_service = NULL;
 +
 +      for (list = service_list; list; list = list->next) {
 +              service = list->data;
 +
 +              DBG("service: %p %s %s %s", service, service->name,
 +                              state2string(service->state),
 +                              __connman_service_type2string(service->type));
 +
 +              if (service->type == CONNMAN_SERVICE_TYPE_WIFI &&
-                       else if (is_connected(service) == TRUE &&
-                                       is_connected(default_service) == FALSE)
++                              is_connected(service->state) == TRUE) {
 +                      return service;
 +              } else if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR &&
 +                              __connman_service_is_internet_profile(service) == TRUE) {
 +                      if (default_service == NULL)
 +                              default_service = service;
-                               is_connected(service) == TRUE) {
++                      else if (is_connected(service->state) == TRUE &&
++                                      is_connected(default_service->state) == FALSE)
 +                              default_service = service;
 +              } else if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET &&
-                               is_connected(service) == TRUE) {
++                              is_connected(service->state) == TRUE) {
 +                      if (default_service == NULL)
 +                              default_service = service;
 +              } else if (service->type == CONNMAN_SERVICE_TYPE_BLUETOOTH &&
++                              is_connected(service->state) == TRUE) {
 +                      if (default_service == NULL)
 +                              default_service = service;
 +              }
 +      }
 +
 +      return default_service;
 +}
 +#endif
 +
  struct connman_service *__connman_service_get_default(void)
  {
        struct connman_service *service;
@@@ -2394,112 -1726,15 +2440,114 @@@ static void append_nameservers(DBusMess
        }
  }
  
-               available = nameserver_available(service, server);
 +#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);
++              available = nameserver_available(service,
++                              CONNMAN_IPCONFIG_TYPE_ALL, 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,
++                              CONNMAN_IPCONFIG_TYPE_ALL, 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))
+       if (!is_connected(service->state))
                return;
  
 +#ifdef TIZEN_EXT
 +      const char *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)
@@@ -3241,34 -2345,6 +3298,23 @@@ static void append_properties(DBusMessa
        const char *str;
        GSList *list;
  
-       unsigned char *wifi_vsie;
 +#if defined TIZEN_EXT
 +      unsigned int frequency = 0U;
 +      if (service && service->network) {
 +              frequency = connman_network_get_frequency(service->network);
 +              connman_dbus_dict_append_basic(dict, "Frequency",
 +                              DBUS_TYPE_UINT16, &frequency);
 +      }
-       GSList *vsie_list = NULL;
-       if (service->network)
-               vsie_list = (GSList *)connman_network_get_vsie_list(service->network);
-       if (vsie_list) {
-               DBG("ConnMan, service->path=%s No.of elements in list: %d", service->path, g_slist_length(vsie_list));
-               GSList *list;
-               for (list = vsie_list; list; list = list->next) {
-                       wifi_vsie = (unsigned char *)list->data;
-                       wifi_vsie_len = wifi_vsie[1] + 2;
-                       connman_dbus_dict_append_fixed_array(dict, "Vsie", DBUS_TYPE_BYTE,
-                                       &wifi_vsie, wifi_vsie_len);
-               }
++      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);
        if (str)
                connman_dbus_dict_append_basic(dict, "Type",
@@@ -3971,15 -3019,8 +4092,15 @@@ int __connman_service_set_passphrase(st
        if (service->immutable &&
                        service->security != CONNMAN_SERVICE_SECURITY_8021X)
                return -EINVAL;
 -
 +#if defined TIZEN_EXT
 +      /* The encrypted passphrase is used here
 +       * and validation is done by net-config before being encrypted.
 +       */
 +      if (service->security != CONNMAN_SERVICE_SECURITY_PSK &&
 +                      service->security != CONNMAN_SERVICE_SECURITY_RSN &&
 +                      service->security != CONNMAN_SERVICE_SECURITY_WEP)
 +#endif
-       err = check_passphrase(service->security, passphrase);
+       err = __connman_service_check_passphrase(service->security, passphrase);
  
        if (err < 0)
                return err;
@@@ -4286,21 -3347,6 +4427,21 @@@ static DBusMessage *set_property(DBusCo
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
                return __connman_error_invalid_arguments(msg);
  
-       if (service->type == CONNMAN_SERVICE_TYPE_WIFI && is_connected(service)) {
++      if (service->type == CONNMAN_SERVICE_TYPE_WIFI && is_connected(service->state)) {
 +              uid_t uid;
 +              if (connman_dbus_get_connection_unix_user_sync(conn,
 +                                              dbus_message_get_sender(msg),
 +                                              &uid) < 0) {
 +                      DBG("Can not get unix user id!");
 +                      return __connman_error_permission_denied(msg);
 +              }
 +
 +              if (!connman_service_is_user_allowed(service, uid)) {
 +                      DBG("Not allow this user to operate this wifi service now!");
 +                      return __connman_error_permission_denied(msg);
 +              }
 +      }
 +
        dbus_message_iter_get_basic(&iter, &name);
        dbus_message_iter_next(&iter);
  
                gw = __connman_ipconfig_get_gateway_from_index(index,
                        CONNMAN_IPCONFIG_TYPE_ALL);
  
++#if !defined TIZEN_EXT
                if (gw && strlen(gw))
                        __connman_service_nameserver_del_routes(service,
                                                CONNMAN_IPCONFIG_TYPE_ALL);
--
++#endif
                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
 +                      /* 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;
  
-                       if (connman_inet_check_ipaddress(val) > 0) {
-                               if (str->len > 0)
-                                       g_string_append_printf(str, " %s", val);
-                               else
-                                       g_string_append(str, val);
-                       }
 +                              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 (!val[0])
+                               continue;
+                       if (str->len > 0)
+                               g_string_append_printf(str, " %s", val);
+                       else
+                               g_string_append(str, val);
                }
  
-               nameserver_remove_all(service);
 +#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, CONNMAN_IPCONFIG_TYPE_ALL);
 +#endif
                g_strfreev(service->nameservers_config);
  
                if (str->len > 0) {
                if (gw && strlen(gw))
                        __connman_service_nameserver_add_routes(service, gw);
  
-               nameserver_add_all(service);
 +#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, CONNMAN_IPCONFIG_TYPE_ALL);
 +#endif
                dns_configuration_changed(service);
  
                if (__connman_service_is_connected_state(service,
@@@ -4668,14 -3659,41 +4826,49 @@@ static void set_error(struct connman_se
                                DBUS_TYPE_STRING, &str);
  }
  
+ static void remove_timeout(struct connman_service *service)
+ {
+       if (service->timeout > 0) {
+               g_source_remove(service->timeout);
+               service->timeout = 0;
+       }
+ }
+ static void reply_pending(struct connman_service *service, int error)
+ {
+       remove_timeout(service);
+       if (service->pending) {
+               connman_dbus_reply_pending(service->pending, error, NULL);
+               service->pending = NULL;
+       }
+       if (service->provider_pending) {
+               connman_dbus_reply_pending(service->provider_pending,
+                               error, service->path);
+               service->provider_pending = NULL;
+       }
+ }
+ static void service_complete(struct connman_service *service)
+ {
+       reply_pending(service, EIO);
+       if (service->connect_reason != CONNMAN_SERVICE_CONNECT_REASON_USER)
+               __connman_service_auto_connect(service->connect_reason);
+       g_get_current_time(&service->modified);
+       service_save(service);
+ }
 +static void set_idle(struct connman_service *service)
 +{
 +      service->state = service->state_ipv4 = service->state_ipv6 =
 +                                              CONNMAN_SERVICE_STATE_IDLE;
 +      set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
 +      state_changed(service);
 +}
 +
  static DBusMessage *clear_property(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
  {
@@@ -4885,25 -3930,11 +5116,25 @@@ static bool auto_connect_service(GList 
                        continue;
                }
  
-                       if (is_connecting(service) == TRUE || is_connected(service) == TRUE)
 +#if defined TIZEN_EXT
 +              DBG("service %p %s %s %s, favorite(%d), ignore(%d), hidden(%d, %d)",
 +                              service, service->name,
 +                              state2string(service->state),
 +                              __connman_service_type2string(service->type),
 +                              service->favorite, is_ignore(service),
 +                              service->hidden, service->hidden_service);
 +
 +              /* Tizen takes Wi-Fi as the highest priority into consideration. */
 +              if (service->type != CONNMAN_SERVICE_TYPE_WIFI)
++                      if (is_connecting(service->state) == TRUE || is_connected(service->state) == TRUE)
 +                              continue;
 +#endif
 +
                if (service->pending ||
-                               is_connecting(service) ||
-                               is_connected(service)) {
-                       if (!active_count)
-                               return true;
+                               is_connecting(service->state) ||
+                               is_connected(service->state)) {
+                       if (autoconnect_no_session_active(service))
+                                       return true;
  
                        ignore[service->type] = true;
                        autoconnecting = true;
@@@ -5017,23 -4009,7 +5248,23 @@@ void __connman_service_auto_connect(enu
        if (!__connman_session_policy_autoconnect(reason))
                return;
  
-       autoconnect_timeout = g_timeout_add_seconds(0, run_auto_connect,
 +#if defined TIZEN_EXT
 +      /* Adding Timeout of 500ms before trying to auto connect.
 +       * This is done because of below scenario
 +       * 1. Device is connected to AP1
 +       * 2. WPS Connection request is initiated for AP2
 +       * 3. Immediately WPS Connection is Cancelled
 +       * When WPS Connection Connection is initiated for AP2 then
 +       * sometimes there is a scenario where connman gets in ASSOCIATED
 +       * state with AP1 due to autoconnect and subsequently the connection
 +       * initiated by AP1 fails and connman service for AP1 comes in
 +       * FAILURE state due to this when connection with AP2 is cancelled
 +       * then autoconnect with AP1 doesn't works because its autoconnection
 +       * is ignored as its last state was FAILURE rather than IDLE */
 +      autoconnect_timeout = g_timeout_add(500, run_auto_connect,
 +#else
+       autoconnect_timeout = g_idle_add(run_auto_connect,
 +#endif
                                                GUINT_TO_POINTER(reason));
  }
  
@@@ -5280,11 -4186,7 +5485,11 @@@ static DBusMessage *connect_service(DBu
        for (list = service_list; list; list = list->next) {
                struct connman_service *temp = list->data;
  
-               if (!is_connecting(temp) && !is_connected(temp))
 +#if defined TIZEN_EXT
 +              if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR)
 +                      break;
 +#endif
+               if (!is_connecting(temp->state) && !is_connected(temp->state))
                        break;
  
                if (service == temp)
@@@ -5331,35 -4232,6 +5536,35 @@@ static DBusMessage *disconnect_service(
  
        DBG("service %p", service);
  
-               if (is_connected(service) == TRUE &&
 +#if defined TIZEN_EXT
 +      /*
 +       * Description: TIZEN implements system global connection management.
 +       */
 +      if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR) {
 +              if (connman_service_user_pdn_connection_unref_and_test(service) != TRUE)
 +                      return __connman_error_failed(msg, EISCONN);
 +
++              if (is_connected(service->state) == TRUE &&
 +                              service == connman_service_get_default_connection())
 +                      return __connman_error_failed(msg, EISCONN);
 +      }
 +#endif
 +
 +      if (service->type == CONNMAN_SERVICE_TYPE_WIFI) {
 +              uid_t uid;
 +              if (connman_dbus_get_connection_unix_user_sync(conn,
 +                                              dbus_message_get_sender(msg),
 +                                              &uid) < 0) {
 +                      DBG("Can not get unix user id!");
 +                      return __connman_error_permission_denied(msg);
 +              }
 +
 +              if (!connman_service_is_user_allowed(service, uid)) {
 +                      DBG("Not allow this user to disconnect this wifi service now!");
 +                      return __connman_error_permission_denied(msg);
 +              }
 +      }
 +
        service->ignore = true;
  
        err = __connman_service_disconnect(service);
@@@ -5397,11 -4251,8 +5602,10 @@@ bool __connman_service_remove(struct co
                        __connman_provider_is_immutable(service->provider))
                return false;
  
-       if (!service->favorite && service->state !=
-                                               CONNMAN_SERVICE_STATE_FAILURE)
 +#if !defined TIZEN_EXT
+       if (!service->favorite && !is_idle(service->state))
                return false;
 +#endif
  
        __connman_service_disconnect(service);
  
@@@ -5850,15 -4620,9 +6069,13 @@@ static void service_schedule_removed(st
  
  static bool allow_property_changed(struct connman_service *service)
  {
 +#if defined TIZEN_EXT
 +      if (service->path == NULL)
 +              return FALSE;
 +#endif
        if (g_hash_table_lookup_extended(services_notify->add, service->path,
-                                       NULL, NULL)) {
-               DBG("no property updates for service %p", service);
+                                       NULL, NULL))
                return false;
-       }
  
        return true;
  }
@@@ -6257,40 -5035,6 +6504,40 @@@ char *connman_service_get_interface(str
  }
  
  /**
-               if (is_connected(service)) {
 + * __connman_service_is_user_allowed:
 + * @type: service type
 + * @uid: user id
 + *
 + * Check a user is allowed to operate a type of service
 + */
 +bool __connman_service_is_user_allowed(enum connman_service_type type,
 +                                      uid_t uid)
 +{
 +      GList *list;
 +      uid_t owner_user = USER_NONE;
 +
 +      for (list = service_list; list; list = list->next) {
 +              struct connman_service *service = list->data;
 +
 +              if (service->type != type)
 +                      continue;
 +
++              if (is_connected(service->state)) {
 +                      owner_user = service->user.favorite_user;
 +                      break;
 +              }
 +      }
 +
 +      if (uid == USER_NONE ||
 +                      (uid != USER_ROOT &&
 +                      owner_user != USER_NONE &&
 +                      owner_user != uid))
 +              return false;
 +
 +      return true;
 +}
 +
 +/**
   * connman_service_get_network:
   * @service: service structure
   *
@@@ -6387,53 -5129,6 +6632,53 @@@ void __connman_service_mark_dirty(void
        services_dirty = true;
  }
  
-               if (is_connected(service2) && index2 > 0 && index1 == index2)
 +#if defined TIZEN_EXT
 +/**
 +  * Returns profile count if there is any connected profiles
 +  * that use same interface
 +  */
 +int __connman_service_get_connected_count_of_iface(
 +                                      struct connman_service *service)
 +{
 +      GList *list;
 +      int count = 0;
 +      int index1 = 0;
 +      int index2 = 0;
 +
 +      DBG("");
 +
 +      index1 = __connman_service_get_index(service);
 +
 +      if (index1 <= 0)
 +              return 0;
 +
 +      for (list = service_list; list; list = list->next) {
 +              struct connman_service *service2 = list->data;
 +
 +              if (service == service2)
 +                      continue;
 +
 +              index2 = __connman_service_get_index(service2);
 +
++              if (is_connected(service2->state) && index2 > 0 && index1 == index2)
 +                      count++;
 +
 +              index2 = 0;
 +      }
 +
 +      DBG("Interface index %d, count %d", index1, count);
 +
 +      return count;
 +}
 +
 +void __connman_service_set_storage_reload(struct connman_service *service,
 +                                      bool storage_reload)
 +{
 +      if (service != NULL)
 +              service->storage_reload = storage_reload;
 +}
 +#endif
 +
  /**
   * __connman_service_set_favorite_delayed:
   * @service: service structure
@@@ -6778,126 -5467,6 +7028,126 @@@ static int service_update_preferred_ord
        return -EALREADY;
  }
  
-       if (is_connected(service) == TRUE || is_connecting(service) == TRUE) {
 +#if defined TIZEN_EXT
 +static gboolean __connman_service_can_drop(struct connman_service *service)
 +{
-       } else if (is_connected(current) == TRUE || is_connecting(current) == TRUE)
++      if (is_connected(service->state) == TRUE || is_connecting(service->state) == TRUE) {
 +              if (service->type != CONNMAN_SERVICE_TYPE_CELLULAR)
 +                      return TRUE;
 +              else if (connman_service_is_no_ref_user_pdn_connection(service) == TRUE)
 +                      return TRUE;
 +      }
 +      return FALSE;
 +}
 +
 +static struct connman_device *default_connecting_device = NULL;
 +
 +static void __connman_service_disconnect_default(struct connman_service *service)
 +{
 +      struct connman_device *default_device = NULL;
 +
 +      if (default_connecting_device == NULL)
 +              return;
 +
 +      default_device = connman_network_get_device(
 +                      __connman_service_get_network(service));
 +
 +      DBG("Disconnecting service %p %s", service, service->path);
 +      DBG("Disconnecting device %p %p %s",
 +                      default_connecting_device,
 +                      default_device,
 +                      connman_device_get_string(default_device, "Name"));
 +
 +      if (default_connecting_device == default_device)
 +              default_connecting_device = NULL;
 +}
 +
 +static void __connman_service_connect_default(struct connman_service *current)
 +{
 +      int err;
 +      GList *list;
 +      bool default_internet;
 +      struct connman_service *service;
 +      struct connman_service *default_service = NULL;
 +      struct connman_device *default_device = NULL;
 +
 +      if (current->type == CONNMAN_SERVICE_TYPE_CELLULAR) {
 +              switch (current->state) {
 +              case CONNMAN_SERVICE_STATE_UNKNOWN:
 +              case CONNMAN_SERVICE_STATE_ASSOCIATION:
 +              case CONNMAN_SERVICE_STATE_CONFIGURATION:
 +                      return;
 +              default:
 +                      break;
 +              }
 +
 +              if (default_connecting_device &&
 +                              __connman_service_is_internet_profile(current) == TRUE) {
 +                      if (current->network == NULL)
 +                              return;
 +
 +                      default_device = connman_network_get_device(current->network);
 +                      if (default_connecting_device == default_device) {
 +                              DBG("Cellular service[%s]  %p %s",
 +                                              state2string(current->state), current, current->path);
 +                              DBG("Cellular device %p %p %s",
 +                                              default_connecting_device, default_device,
 +                                              connman_device_get_string(default_device, "Name"));
 +
 +                              default_connecting_device = NULL;
 +                      }
 +              }
 +
 +              return;
-                       if (is_connected(default_service) == TRUE ||
-                                       is_connecting(default_service) == TRUE)
++      } else if (is_connected(current->state) == TRUE || is_connecting(current->state) == TRUE)
 +              return;
 +
 +      /* Always-on: keep default cellular connection as possible */
 +      for (list = service_list; list; list = list->next) {
 +              service = list->data;
 +
 +              if (service->type != CONNMAN_SERVICE_TYPE_CELLULAR ||
 +                              __connman_service_is_internet_profile(service) != TRUE ||
 +                              service->network == NULL) {
 +                      continue;
 +              }
 +
 +              default_internet =
 +                              connman_network_get_bool(service->network, "DefaultInternet");
 +
 +              DBG("service: %p %s %s %s (default: %d)", service, service->name,
 +                              __connman_service_type2string(service->type),
 +                              state2string(service->state), default_internet);
 +
 +              if (default_internet) {
 +                      default_service = service;
++                      if (is_connected(default_service->state) == TRUE ||
++                                      is_connecting(default_service->state) == TRUE)
 +                              return;
 +
 +                      default_device = connman_network_get_device(default_service->network);
 +                      if (default_connecting_device == default_device) {
 +                              DBG("Device is connecting (%p)", default_connecting_device);
 +                              return;
 +                      }
 +
 +                      default_connecting_device = default_device;
 +                      default_service->connect_reason = CONNMAN_SERVICE_CONNECT_REASON_USER;
 +
 +                      err = __connman_network_connect(default_service->network);
 +                      DBG("Connecting default service %p %s [%d]",
 +                                      default_service, default_service->path, err);
 +                      DBG("Connecting device %p %s", default_connecting_device,
 +                                      connman_device_get_string(default_connecting_device, "Name"));
 +                      if (err < 0 && err != -EINPROGRESS) {
 +                              default_connecting_device = NULL;
 +                      } else
 +                              break;
 +              }
 +      }
 +}
 +#endif
 +
  static void single_connected_tech(struct connman_service *allowed)
  {
        struct connman_service *service;
        for (iter = service_list; iter; iter = iter->next) {
                service = iter->data;
  
-               if (!is_connected(service))
 +#if defined TIZEN_EXT
 +              if (service != allowed && service->type != allowed->type &&
 +                              __connman_service_can_drop(service) == TRUE)
 +#else
+               if (!is_connected(service->state))
                        break;
  
                if (service == allowed)
        g_slist_free(services);
  }
  
-               if (is_connected(service) == FALSE)
 +#if defined TIZEN_EXT
 +static void set_priority_connected_service(void)
 +{
 +      struct connman_service *service;
 +      GList *list;
 +
 +      for (list = service_list; list; list = list->next) {
 +              service = list->data;
 +
++              if (is_connected(service->state) == FALSE)
 +                      service->order = 5;
 +              else
 +                      service->order = 6;
 +      }
 +}
 +#endif
 +
  static const char *get_dbus_sender(struct connman_service *service)
  {
        if (!service->pending)
@@@ -7131,21 -5664,8 +7381,20 @@@ static int service_indicate_state(struc
  
                __connman_wpad_stop(service);
  
-               dns_changed(service);
 +#if defined TIZEN_EXT
 +              /**
 +                * Skip the functions if there is any connected profiles
 +                * that use same interface
 +                */
 +              if (service->type != CONNMAN_SERVICE_TYPE_CELLULAR ||
 +                      __connman_service_get_connected_count_of_iface(
 +                                                      service) <= 0) {
 +#endif
                domain_changed(service);
                proxy_changed(service);
 +#if defined TIZEN_EXT
 +              }
 +#endif
  
                /*
                 * Previous services which are connected and which states
                break;
  
        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);
 +#endif
                if (service->connect_reason == CONNMAN_SERVICE_CONNECT_REASON_USER &&
                        connman_agent_report_error(service, service->path,
                                        error2string(service->error),
@@@ -7510,28 -5987,20 +7776,31 @@@ int __connman_service_ipconfig_indicate
        case CONNMAN_SERVICE_STATE_ASSOCIATION:
                break;
        case CONNMAN_SERVICE_STATE_CONFIGURATION:
-               __connman_ipconfig_enable(ipconfig);
                break;
        case CONNMAN_SERVICE_STATE_READY:
 -              if (connman_setting_get_bool("EnableOnlineCheck"))
 +#if defined TIZEN_EXT
 +              if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR &&
 +                              __connman_service_is_internet_profile(service) != TRUE) {
 +                      if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
 +                              service_rp_filter(service, TRUE);
 +
 +                      break;
 +              }
 +#endif
-               if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
++              if (connman_setting_get_bool("EnableOnlineCheck")) {
+                       if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
 +#if !defined TIZEN_EXT
-                       check_proxy_setup(service);
+                               check_proxy_setup(service);
 +#endif
+                       } else {
+                               service->online_check_count = 1;
+                               __connman_wispr_start(service, type);
+                       }
 -              else
++              } else
+                       connman_info("Online check disabled. "
+                               "Default service remains in READY state.");
+               if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
                        service_rp_filter(service, true);
-               } else {
-                       service->online_check_count = 1;
-                       __connman_wispr_start(service, type);
-               }
                break;
        case CONNMAN_SERVICE_STATE_ONLINE:
                break;
        else
                service->state_ipv6 = new_state;
  
-       if (!is_connected_state(service, old_state) &&
-                       is_connected_state(service, new_state))
- #if defined TIZEN_EXT
-       {
-               DBG("nameserver add all, type: %d", type);
+       if (!is_connected(old_state) && is_connected(new_state))
                nameserver_add_all(service, type);
- #else
-               nameserver_add_all(service);
- #endif
- #if defined TIZEN_EXT
-       }
- #endif
+       __connman_timeserver_sync(service);
  
 +#if defined TIZEN_EXT
 +      int ret = service_indicate_state(service);
 +      /*Sent the Ready changed signal again in case IPv4 IP set
 +        after IPv6 IP set*/
 +
 +      if(ret == -EALREADY && type == CONNMAN_IPCONFIG_TYPE_IPV4
 +                      && new_state == CONNMAN_SERVICE_STATE_READY) {
 +              DBG("Notify IPv4 state new/old %d/%d", new_state,old_state);
 +              state_changed(service);
 +      }
 +
 +      return ret;
 +#endif
        return service_indicate_state(service);
  }
  
@@@ -7685,33 -6129,6 +7942,33 @@@ static int service_connect(struct connm
        if (service->hidden)
                return -EPERM;
  
-               if (!is_connecting(temp) && !is_connected(temp))
 +#if defined TIZEN_EXT
 +      GList *list;
 +      int index;
 +
 +      index = __connman_service_get_index(service);
 +
 +      for (list = service_list; list; list = list->next) {
 +              struct connman_service *temp = list->data;
 +
 +              if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR)
 +                      break;
 +
++              if (!is_connecting(temp->state) && !is_connected(temp->state))
 +                      break;
 +
 +              if (service == temp)
 +                      continue;
 +
 +              if (service->type != temp->type)
 +                      continue;
 +
 +              if (__connman_service_get_index(temp) == index &&
 +                              __connman_service_disconnect(temp) == -EINPROGRESS)
 +                      return -EINPROGRESS;
 +      }
 +#endif
 +
        switch (service->type) {
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
@@@ -7875,7 -6276,10 +8132,9 @@@ int __connman_service_connect(struct co
  
        err = service_connect(service);
  
+       DBG("service %p err %d", service, err);
        service->connect_reason = reason;
 -
        if (err >= 0)
                return 0;
  
@@@ -8202,21 -6592,12 +8461,21 @@@ static void service_ip_bound(struct con
  
        if (type == CONNMAN_IPCONFIG_TYPE_IPV6 &&
                        method == CONNMAN_IPCONFIG_METHOD_AUTO)
-               if(err == 0)
-                       __connman_connection_gateway_activate(service,
-                                       CONNMAN_IPCONFIG_TYPE_IPV6);
 +#if defined TIZEN_EXT
 +      {
 +              err = __connman_ipconfig_gateway_add(ipconfig, service);
 +
++              if(err < 0)
++                      DBG("Failed to add gateway");
 +      }
 +#else
                __connman_service_ipconfig_indicate_state(service,
                                                CONNMAN_SERVICE_STATE_READY,
                                                CONNMAN_IPCONFIG_TYPE_IPV6);
 +#endif
  
        settings_changed(service, ipconfig);
+       address_updated(service, type);
  }
  
  static void service_ip_release(struct connman_ipconfig *ipconfig,
@@@ -8547,20 -6894,6 +8800,20 @@@ static enum connman_service_security co
                return CONNMAN_SERVICE_SECURITY_UNKNOWN;
  }
  
-       return check_passphrase(security, passphrase);
 +#if defined TIZEN_EXT
 +int check_passphrase_ext(struct connman_network *network,
 +                                      const char *passphrase)
 +{
 +      const char *str;
 +      enum connman_service_security security;
 +
 +      str = connman_network_get_string(network, "WiFi.Security");
 +      security = convert_wifi_security(str);
 +
++      return __connman_service_check_passphrase(security, passphrase);
 +}
 +#endif
 +
  static void update_from_network(struct connman_service *service,
                                        struct connman_network *network)
  {
diff --cc src/session.c
index 08facc1,9e3c559..9e3c559
mode 100755,100644..100755
diff --cc src/stats.c
index 26343b1,663bc38..663bc38
mode 100755,100644..100755
diff --cc src/storage.c
index 2da54d6,5e877ef..50c8e95
mode 100755,100644..100755
diff --cc src/task.c
index 8b9e1d9,953cc40..953cc40
mode 100755,100644..100755
index 408c99f,d2f0ae2..5aea9f4
mode 100755,100644..100755
@@@ -962,50 -942,22 +979,41 @@@ static DBusMessage *set_property(DBusCo
                if (technology->type != CONNMAN_SERVICE_TYPE_WIFI)
                        return __connman_error_not_supported(msg);
  
-               if (strlen(str) < 8 || strlen(str) > 63) {
-                       if (g_str_equal(str, "")) {
-                               technology->tethering_passphrase = NULL;
+               err = __connman_service_check_passphrase(CONNMAN_SERVICE_SECURITY_PSK,
+                                                       str);
+               if (err < 0)
+                       return __connman_error_passphrase_required(msg);
  
-                               connman_dbus_property_changed_basic(technology->path,
-                                               CONNMAN_TECHNOLOGY_INTERFACE,
-                                               "TetheringPassphrase",
-                                               DBUS_TYPE_STRING,
-                                               &str);
-                       }
-                       else
-                               return __connman_error_passphrase_required(msg);
-               } else {
-                       if (g_strcmp0(technology->tethering_passphrase, str) != 0) {
-                               g_free(technology->tethering_passphrase);
-                               technology->tethering_passphrase = g_strdup(str);
-                               technology_save(technology);
-                               connman_dbus_property_changed_basic(technology->path,
-                                               CONNMAN_TECHNOLOGY_INTERFACE,
-                                               "TetheringPassphrase",
-                                               DBUS_TYPE_STRING,
-                                               &technology->tethering_passphrase);
-                       }
+               if (g_strcmp0(technology->tethering_passphrase, str) != 0) {
+                       g_free(technology->tethering_passphrase);
+                       technology->tethering_passphrase = g_strdup(str);
+                       technology_save(technology);
+                       connman_dbus_property_changed_basic(technology->path,
+                                       CONNMAN_TECHNOLOGY_INTERFACE,
+                                       "TetheringPassphrase",
+                                       DBUS_TYPE_STRING,
+                                       &technology->tethering_passphrase);
                }
 +      } else if (g_str_equal(name, "Hidden")) {
 +              dbus_bool_t hidden;
 +
 +              if (type != DBUS_TYPE_BOOLEAN)
 +                      return __connman_error_invalid_arguments(msg);
 +
 +              dbus_message_iter_get_basic(&value, &hidden);
 +
 +              if (technology->type != CONNMAN_SERVICE_TYPE_WIFI)
 +                      return __connman_error_not_supported(msg);
 +
 +              technology->tethering_hidden = hidden;
 +              technology_save(technology);
 +
 +              connman_dbus_property_changed_basic(technology->path,
 +                                      CONNMAN_TECHNOLOGY_INTERFACE,
 +                                      "Hidden",
 +                                      DBUS_TYPE_BOOLEAN,
 +                                      &hidden);
        } else if (g_str_equal(name, "Powered")) {
                dbus_bool_t enable;
  
@@@ -1178,29 -1077,18 +1186,33 @@@ static DBusMessage *scan(DBusConnectio
        DBG("technology %p request from %s", technology,
                        dbus_message_get_sender(msg));
  
+       if (technology->type == CONNMAN_SERVICE_TYPE_P2P &&
+                               !technology->enabled)
+               return __connman_error_permission_denied(msg);
        dbus_message_ref(msg);
 +#if !defined TIZEN_EXT
        technology->scan_pending =
                g_slist_prepend(technology->scan_pending, msg);
 +#endif
  
        err = __connman_device_request_scan(technology->type);
 +#if defined TIZEN_EXT
 +      if (err < 0)
 +              return __connman_error_failed(msg, -err);
 +#else
        if (err < 0)
                reply_scan_pending(technology, err);
 +#endif
  
 +#if defined TIZEN_EXT
 +      if (err == 0) {
 +              g_scan_type = CONNMAN_SCAN_TYPE_FULL_CHANNEL;
 +              DBG("g_scan_type %d", g_scan_type);
 +      }
 +      technology->scan_pending =
 +              g_slist_prepend(technology->scan_pending, msg);
 +#endif
        return NULL;
  }
  
diff --cc src/tethering.c
index c0c9743,c929ba7..891ee51
mode 100755,100644..100755
index fc83f9a,0e555a7..6325ece
mode 100755,100644..100755
diff --cc src/util.c
index da32cc5,732d451..732d451
mode 100755,100644..100755
diff --cc src/wispr.c
index c3b0c9c,03b38bb..adf6230
mode 100755,100644..100755
diff --cc src/wpad.c
index 109e9d7,f066fee..b7f1f1e
mode 100755,100644..100755
index 7d117fd,efa39de..efa39de
mode 100755,100644..100755
index e8d077a,17fac9d..17fac9d
mode 100755,100644..100755
index 03eaf22,e98fb71..a8f2948
mode 100755,100644..100755
@@@ -5,14 -3,12 +5,16 @@@ After=dbus.socke
  
  [Service]
  Type=dbus
 +User=network_fw
 +Group=network_fw
  BusName=net.connman.vpn
 -ExecStart=@sbindir@/connman-vpnd -n
 +SmackProcessLabel=System
 +ExecStart=@bindir@/connman-vpnd -n
  StandardOutput=null
- Capabilities=cap_setgid,cap_net_admin,cap_net_bind_service,cap_net_broadcast,cap_net_raw,cap_dac_override=i
 -CapabilityBoundingSet=CAP_KILL CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
++Capabilities=cap_net_admin,cap_net_bind_service,cap_net_broadcast,cap_net_raw,cap_dac_override=i
 +SecureBits=keep-caps
+ ProtectHome=read-only
+ ProtectSystem=full
  
  [Install]
  WantedBy=multi-user.target
diff --cc vpn/main.c
index debb0ca,ee88aac..c18fee4
mode 100755,100644..100755
@@@ -251,11 -233,6 +251,16 @@@ unsigned int connman_timeout_input_requ
        return connman_vpn_settings.timeout_inputreq;
  }
  
 +unsigned int connman_timeout_browser_launch(void)
 +{
 +      return connman_vpn_settings.timeout_browserlaunch;
 +}
 +
++const char *connman_option_get_string(const char *key)
++{
++      return NULL;
++}
++
  int main(int argc, char *argv[])
  {
        GOptionContext *context;
index 22f9dcf,a0d22c4..a0d22c4
mode 100755,100644..100755
index 9f2a214,27b1d50..27b1d50
mode 100755,100644..100755
index e65daca,9a42385..f6e24c4
mode 100755,100644..100755
@@@ -307,57 -336,7 +336,57 @@@ static DBusMessage *vpn_notify(struct c
        return NULL;
  }
  
- static int vpn_create_tun(struct vpn_provider *provider)
 +#if defined TIZEN_EXT
 +static void vpn_event(struct vpn_provider *provider, int state)
 +{
 +      struct vpn_driver_data *vpn_driver_data;
 +      const char *name;
 +
 +      name = vpn_provider_get_driver_name(provider);
 +      if (!name) {
 +              DBG("Cannot find VPN driver for provider %p", provider);
 +              vpn_provider_set_state(provider, VPN_PROVIDER_STATE_FAILURE);
 +              return;
 +      }
 +
 +      vpn_driver_data = g_hash_table_lookup(driver_hash, name);
 +      if (!vpn_driver_data) {
 +              DBG("Cannot find VPN driver data for name %s", name);
 +              vpn_provider_set_state(provider, VPN_PROVIDER_STATE_FAILURE);
 +              return;
 +      }
 +
 +      DBG("provider %p driver %s state %d", provider, name, state);
 +
 +      switch (state) {
 +      case VPN_STATE_CONNECT:
 +              vpn_provider_set_state(provider,
 +                              VPN_PROVIDER_STATE_CONNECT);
 +              break;
 +      case VPN_STATE_READY:
 +              vpn_provider_set_state(provider,
 +                              VPN_PROVIDER_STATE_READY);
 +              break;
 +
 +      case VPN_STATE_UNKNOWN:
 +      case VPN_STATE_IDLE:
 +      case VPN_STATE_DISCONNECT:
 +      case VPN_STATE_FAILURE:
 +              vpn_provider_set_state(provider,
 +                                      VPN_PROVIDER_STATE_DISCONNECT);
 +              break;
 +
 +      case VPN_STATE_AUTH_FAILURE:
 +              vpn_provider_indicate_error(provider,
 +                                      VPN_PROVIDER_ERROR_AUTH_FAILED);
 +              break;
 +      }
 +
 +      return;
 +}
 +#endif
 +
+ static int vpn_create_tun(struct vpn_provider *provider, int flags)
  {
        struct vpn_data *data = vpn_provider_get_data(provider);
        struct ifreq ifr;
index af7e8f8,cb94bdc..1888d5f
mode 100755,100644..100755
index 09674bd,af9dbe7..af9dbe7
mode 100755,100644..100755
index a5be332,c88a99a..5f0e749
mode 100755,100644..100755
index 925f699,d2b3e3a..67239e4
mode 100755,100644..100755
index 8105d7f,bdc5f5c..bdc5f5c
mode 100755,100644..100755