From: Seonah Moon Date: Tue, 23 Jan 2018 05:50:50 +0000 (+0900) Subject: Updated connman to version 1.35 X-Git-Tag: accepted/tizen/unified/20180125.060648~3 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Fconnman.git;a=commitdiff_plain;h=30602f521a85820a9f6b7ac04876400e00c68b15 Updated connman to version 1.35 Change-Id: I13526fbf80296a79be15548fc226a308941ac9ec Signed-off-by: Taesub Kim --- 30602f521a85820a9f6b7ac04876400e00c68b15 diff --cc AUTHORS index 9f807f9,44c65f8..44c65f8 mode 100755,100644..100755 --- a/AUTHORS +++ b/AUTHORS diff --cc Makefile.am index 82c13dd,e67a7a5..76c5419 mode 100755,100644..100755 --- a/Makefile.am +++ b/Makefile.am @@@ -104,13 -104,9 +104,13 @@@ unit_objects MANUAL_PAGES = +if TIZEN_EXT +sbin_PROGRAMS = +else - sbin_PROGRAMS = src/connmand + 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 \ @@@ -130,12 -126,27 +130,27 @@@ 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)/$< $@ diff --cc Makefile.plugins index cc732d9,dce8b28..1eb0c3f mode 100755,100644..100755 --- a/Makefile.plugins +++ b/Makefile.plugins diff --cc README index 531f396,cff3131..cff3131 mode 100755,100644..100755 --- a/README +++ b/README diff --cc TODO index dac2ea2,c1694e3..c1694e3 mode 100755,100644..100755 --- a/TODO +++ b/TODO diff --cc client/commands.c index 3f7e001,583095b..746e158 mode 100755,100644..100755 --- a/client/commands.c +++ b/client/commands.c diff --cc client/dbus_helpers.c index d905746,6ca407d..6ca407d mode 100755,100644..100755 --- a/client/dbus_helpers.c +++ b/client/dbus_helpers.c diff --cc client/input.c index 4e5e496,78319ff..d9d2b7b mode 100755,100644..100755 --- a/client/input.c +++ b/client/input.c diff --cc configure.ac index a999c90,4baa685..01ecd95 mode 100755,100644..100644 --- a/configure.ac +++ b/configure.ac @@@ -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}]) diff --cc doc/agent-api.txt index 2ddd19a,aa7271d..aa7271d mode 100755,100644..100755 --- a/doc/agent-api.txt +++ b/doc/agent-api.txt diff --cc doc/config-format.txt index b16f4e4,ed3123a..ed3123a mode 100755,100644..100755 --- a/doc/config-format.txt +++ b/doc/config-format.txt diff --cc doc/connman.conf.5.in index c1ca75c,95b177f..fdc8e9e mode 100755,100644..100644 --- a/doc/connman.conf.5.in +++ b/doc/connman.conf.5.in @@@ -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). + .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 an online status check. ++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) diff --cc doc/overview-api.txt index f126887,fd51d70..fd51d70 mode 100755,100644..100755 --- a/doc/overview-api.txt +++ b/doc/overview-api.txt diff --cc doc/plugin-api.txt index 616938b,ea5ec0a..ea5ec0a mode 100755,100644..100755 --- a/doc/plugin-api.txt +++ b/doc/plugin-api.txt diff --cc doc/service-api.txt index 7d9889e,6cdb0bb..4fe4093 mode 100755,100644..100755 --- a/doc/service-api.txt +++ b/doc/service-api.txt diff --cc doc/session-api.txt index 3aac535,e8da522..e8da522 mode 100755,100644..100755 --- a/doc/session-api.txt +++ b/doc/session-api.txt diff --cc doc/session-overview.txt index 2393167,976c351..976c351 mode 100755,100644..100755 --- a/doc/session-overview.txt +++ b/doc/session-overview.txt diff --cc doc/technology-api.txt index 14245eb,f22e9b2..fb6bd31 mode 100755,100644..100755 --- a/doc/technology-api.txt +++ b/doc/technology-api.txt diff --cc doc/vpn-config-format.txt index b4898eb,0bc62c0..cb0f16a --- a/doc/vpn-config-format.txt +++ b/doc/vpn-config-format.txt @@@ -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 doc/vpn-connection-api.txt index 4367699,a814a38..a814a38 mode 100755,100644..100755 --- a/doc/vpn-connection-api.txt +++ b/doc/vpn-connection-api.txt diff --cc gdbus/client.c index 6e4dc66,a011e19..9748ae2 mode 100755,100644..100755 --- a/gdbus/client.c +++ b/gdbus/client.c @@@ -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 --- a/gdbus/gdbus.h +++ b/gdbus/gdbus.h diff --cc gdbus/object.c index c7ed02f,a220101..c333d5b mode 100755,100644..100755 --- a/gdbus/object.c +++ b/gdbus/object.c diff --cc gdhcp/client.c index d3794bd,3e67fcd..5a455f0 mode 100755,100644..100755 --- a/gdhcp/client.c +++ b/gdhcp/client.c diff --cc gdhcp/common.c index 6d457ac,6f81671..b8c5091 mode 100755,100644..100755 --- a/gdhcp/common.c +++ b/gdhcp/common.c diff --cc gdhcp/gdhcp.h index fd6ce54,eaf6a74..f51a8b0 mode 100755,100644..100755 --- a/gdhcp/gdhcp.h +++ b/gdhcp/gdhcp.h diff --cc gdhcp/ipv4ll.c index c43971f,d900198..d900198 mode 100755,100644..100755 --- a/gdhcp/ipv4ll.c +++ b/gdhcp/ipv4ll.c diff --cc gdhcp/server.c index 83132a7,f7795f7..44ce771 mode 100755,100644..100755 --- a/gdhcp/server.c +++ b/gdhcp/server.c diff --cc gsupplicant/gsupplicant.h index 123f3b2,db61595..8860626 mode 100755,100644..100755 --- a/gsupplicant/gsupplicant.h +++ b/gsupplicant/gsupplicant.h @@@ -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); +#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); - void *g_supplicant_network_get_wifi_vsie(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); @@@ -389,19 -346,12 +395,21 @@@ 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, diff --cc gsupplicant/supplicant.c index 243dcd0,4f79012..5e9f509 mode 100755,100644..100644 --- a/gsupplicant/supplicant.c +++ b/gsupplicant/supplicant.c @@@ -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 { @@@ -208,12 -215,6 +218,13 @@@ dbus_bool_t privacy; dbus_bool_t psk; dbus_bool_t ieee8021x; +#if defined TIZEN_EXT + dbus_bool_t ft_psk; + dbus_bool_t ft_ieee8021x; - GSList *vsie_list; ++ 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; +#if defined TIZEN_EXT + bool isHS20AP; + char *eap; + char *identity; + char *phase2; + unsigned int keymgmt; - GSList *vsie_list; ++ 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); +#if defined TIZEN_EXT + g_free(network->eap); + g_free(network->identity); + g_free(network->phase2); +#endif +#if defined TIZEN_EXT - g_slist_free_full(network->vsie_list, g_free); ++ 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); +#if defined TIZEN_EXT - g_slist_free_full(bss->vsie_list, g_free); ++ 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; } +#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; +} + - void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network) ++const void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network, ++ unsigned int *wifi_vsie_len) +{ - GSList *vsie_list = NULL; - - if (!network) ++ if (!network) { ++ *wifi_vsie_len = 0; + return NULL; - - 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"); - } + } + - 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 defined TIZEN_EXT + network->keymgmt = bss->keymgmt; + - 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 (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; @@@ -1923,23 -1820,7 +2080,19 @@@ 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); } + +#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"); - ret = -EINVAL; + 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); + - done: + 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, @@@ -5367,19 -4966,58 +5660,64 @@@ 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 --- a/gweb/gresolv.c +++ b/gweb/gresolv.c diff --cc gweb/gweb.c index 307164e,393afe0..7037cd9 mode 100755,100644..100755 --- a/gweb/gweb.c +++ b/gweb/gweb.c diff --cc include/device.h index dafdca2,9ac800a..36b2f55 mode 100755,100644..100755 --- a/include/device.h +++ b/include/device.h diff --cc include/network.h index baf1c01,4fc20c1..4be5fbf mode 100755,100644..100755 --- a/include/network.h +++ b/include/network.h diff --cc include/provider.h index d1a8983,d28651a..d28651a mode 100755,100644..100755 --- a/include/provider.h +++ b/include/provider.h diff --cc include/service.h index ff29613,958e7fd..3055023 mode 100755,100644..100755 --- a/include/service.h +++ b/include/service.h diff --cc include/session.h index 37dfc4e,5106e88..5106e88 mode 100755,100644..100755 --- a/include/session.h +++ b/include/session.h diff --cc include/technology.h index 8efe9e7,97db660..55bb3dd mode 100755,100644..100755 --- a/include/technology.h +++ b/include/technology.h @@@ -36,11 -36,7 +36,11 @@@ extern "C" struct connman_technology; +int connman_technology_tethering_add_station(enum connman_service_type type, + const char *mac); +int connman_technology_tethering_remove_station(const char *mac); + - void connman_technology_tethering_notify(struct connman_technology *technology, + 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, diff --cc packaging/connman.spec index e99ae37,0000000..0554f9a mode 100755,000000..100755 --- a/packaging/connman.spec +++ b/packaging/connman.spec @@@ -1,343 -1,0 +1,343 @@@ +%bcond_with connman_openconnect +%bcond_without connman_openvpn +%bcond_without connman_ipsec +%bcond_without connman_vpnd + +Name: connman - Version: 1.29 ++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 diff --cc plugins/bluetooth.c index f72a4af,f759a90..f89edfa mode 100755,100644..100755 --- a/plugins/bluetooth.c +++ b/plugins/bluetooth.c diff --cc plugins/ethernet.c index 73494f1,9a4d741..9a4d741 mode 100755,100644..100755 --- a/plugins/ethernet.c +++ b/plugins/ethernet.c diff --cc plugins/gadget.c index 6bc37a7,94f6648..cce51e2 mode 100755,100644..100755 --- a/plugins/gadget.c +++ b/plugins/gadget.c diff --cc plugins/neard.c index 1a0fc1c,69586df..69586df mode 100755,100644..100755 --- a/plugins/neard.c +++ b/plugins/neard.c diff --cc plugins/ofono.c index 5cd8302,78f8f19..78f8f19 mode 100755,100644..100755 --- a/plugins/ofono.c +++ b/plugins/ofono.c diff --cc plugins/pacrunner.c index 850139f,d2464a5..d2464a5 mode 100755,100644..100755 --- a/plugins/pacrunner.c +++ b/plugins/pacrunner.c diff --cc plugins/session_policy_local.c index b2369bd,f003c0e..f003c0e mode 100755,100644..100755 --- a/plugins/session_policy_local.c +++ b/plugins/session_policy_local.c diff --cc plugins/vpn.c index ba5841e,c2a332b..d3d75b8 mode 100755,100644..100755 --- a/plugins/vpn.c +++ b/plugins/vpn.c diff --cc plugins/wifi.c index 0d33f4d,34c16df..8bc6307 mode 100755,100644..100755 --- a/plugins/wifi.c +++ b/plugins/wifi.c @@@ -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(¬ifier); + 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); +#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, network); ++ 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; +#if defined TIZEN_EXT - GSList *vsie_list = NULL; ++ 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); @@@ -3248,6 -2687,6 +3363,9 @@@ 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) { @@@ -3271,13 -2710,6 +3389,11 @@@ connman_network_set_blob(network, "WiFi.SSID", ssid, ssid_len); +#if defined TIZEN_EXT - 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(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, +#if defined TIZEN_EXT + .system_power_off = system_power_off, - .network_merged = network_merged, ++ .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; } @@@ -3964,19 -3271,23 +4145,25 @@@ 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, diff --cc scripts/connman.in index 2c380ab,0b9f63c..f3d438f mode 100755,100644..100755 --- a/scripts/connman.in +++ b/scripts/connman.in diff --cc src/6to4.c index 0e3a7a1,71a2882..71a2882 mode 100755,100644..100755 --- a/src/6to4.c +++ b/src/6to4.c diff --cc src/agent-connman.c index 177cbe0,fca7cc1..e4850a8 mode 100755,100644..100755 --- a/src/agent-connman.c +++ b/src/agent-connman.c diff --cc src/agent.c index bdeb0e7,8f7b19b..8f7b19b mode 100755,100644..100755 --- a/src/agent.c +++ b/src/agent.c diff --cc src/bridge.c index ba20096,cd2d9ce..cd2d9ce mode 100755,100644..100755 --- a/src/bridge.c +++ b/src/bridge.c diff --cc src/config.c index 25dd174,a8c3da8..75cd717 mode 100755,100644..100755 --- a/src/config.c +++ b/src/config.c @@@ -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); diff --cc src/connection.c index 4389d58,6b005e7..64d48b7 mode 100755,100644..100755 --- a/src/connection.c +++ b/src/connection.c diff --cc src/connman.h index 57cfc87,21b7080..4125463 mode 100755,100644..100755 --- a/src/connman.h +++ b/src/connman.h @@@ -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 --- a/src/device.c +++ b/src/device.c diff --cc src/dhcp.c index b627362,1af1eb5..c428c1d mode 100755,100644..100755 --- a/src/dhcp.c +++ b/src/dhcp.c @@@ -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 --- a/src/dhcpv6.c +++ b/src/dhcpv6.c diff --cc src/dnsproxy.c index 55ba69a,40b4f15..3fa7bf4 mode 100755,100644..100755 --- a/src/dnsproxy.c +++ b/src/dnsproxy.c @@@ -41,11 -41,8 +41,13 @@@ #include "connman.h" +#if defined TIZEN_EXT +#include +#include +#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)) { +#endif - DBG("client %d sent %d bytes but expecting %u pending %d", + 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 --- a/src/inet.c +++ b/src/inet.c diff --cc src/ipconfig.c index ff1909d,2565773..d94b873 mode 100755,100644..100755 --- a/src/ipconfig.c +++ b/src/ipconfig.c diff --cc src/ippool.c index bb8568d,cea1dcc..cea1dcc mode 100755,100644..100755 --- a/src/ippool.c +++ b/src/ippool.c diff --cc src/iptables.c index a5774ad,5ef757a..aaddf9d mode 100755,100644..100755 --- a/src/iptables.c +++ b/src/iptables.c @@@ -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 --- a/src/log.c +++ 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 --- a/src/main.c +++ b/src/main.c @@@ -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, @@@ -94,10 -94,8 +100,12 @@@ .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" @@@ -113,10 -112,8 +122,12 @@@ #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, @@@ -132,10 -130,8 +144,11 @@@ 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 --- a/src/main.conf +++ b/src/main.conf @@@ -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 --- a/src/nat.c +++ b/src/nat.c diff --cc src/network.c index f7a9925,ed56210..d38fc0a mode 100755,100644..100755 --- a/src/network.c +++ b/src/network.c @@@ -99,25 -92,8 +104,26 @@@ struct connman_network bool wps; bool use_wps; char *pin_wps; +#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; - GSList *vsie_list; ++ 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; } +#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_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; - } - +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 --- a/src/ntp.c +++ 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; @@@ -324,101 -341,45 +342,106 @@@ 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; } + + DBG("interval/delta/delay/drift %fs/%+.3fs/%.3fs/%+ldppm", - LOGTOD(msg->poll), offset, delay, tmx.freq / 65536); ++ 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 --- a/src/peer.c +++ b/src/peer.c diff --cc src/peer_service.c index 053672a,a457bff..a457bff mode 100755,100644..100755 --- a/src/peer_service.c +++ b/src/peer_service.c diff --cc src/provider.c index 521346b,9c71a20..c0d69e4 mode 100755,100644..100755 --- a/src/provider.c +++ b/src/provider.c diff --cc src/proxy.c index f331de9,e1bc420..e1bc420 mode 100755,100644..100755 --- a/src/proxy.c +++ b/src/proxy.c diff --cc src/resolver.c index 8a7fa66,75ea5ba..d6c20cd mode 100755,100644..100755 --- a/src/resolver.c +++ b/src/resolver.c @@@ -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 --- a/src/rfkill.c +++ b/src/rfkill.c diff --cc src/rtnl.c index 5690c48,a094e25..35ae0a9 mode 100755,100644..100755 --- a/src/rtnl.c +++ b/src/rtnl.c @@@ -532,26 -471,9 +534,28 @@@ static void process_newlink(unsigned sh if (type == ARPHRD_ETHER) read_uevent(interface); +#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 + } 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 --- a/src/service.c +++ b/src/service.c @@@ -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; +#if defined TIZEN_EXT + DBG("Resolver append nameserver: %s", nameserver); +#endif - return connman_resolver_append(index, NULL, nameserver); + 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]) { +#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, ++ 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, service->nameservers_config[i]); + 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]) { +#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, ++ 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, service->nameservers[i]); + 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; +#if defined TIZEN_EXT + DBG("Resolver remove nameserver: %s", nameserver); +#endif - return connman_resolver_remove(index, NULL, nameserver); + 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); @@@ -1523,123 -1117,15 +1612,124 @@@ 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]) { +#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, ++ 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, service->nameservers[i]); + 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; +#ifdef TIZEN_EXT + if(type == CONNMAN_IPCONFIG_TYPE_IPV4 && - service->dns_config_method_ipv4 == - 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_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; +#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 - nameserver_remove(service, nameserver); } return 0; @@@ -2066,71 -1473,6 +2112,71 @@@ static void reset_stats(struct connman_ g_timer_reset(service->stats_roaming.timer); } +#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 && - is_connected(service) == TRUE) { ++ 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; - else if (is_connected(service) == TRUE && - is_connected(default_service) == FALSE) ++ 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) == TRUE) { ++ 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 } } +#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, server); ++ 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; +#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); + } - - unsigned char *wifi_vsie; ++ const void *wifi_vsie; + unsigned int wifi_vsie_len; - 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); - } ++ 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); @@@ -4358,86 -3400,27 +4499,88 @@@ 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; + continue; + } else if(g_strcmp0(val, "ipv6.manual") == 0) { + service->dns_config_method_ipv6 = + CONNMAN_DNSCONFIG_METHOD_MANUAL; + if(last_dns_ipv6 != CONNMAN_DNSCONFIG_METHOD_MANUAL) { + if(ip_type == CONNMAN_IPCONFIG_TYPE_UNKNOWN) + ip_type = CONNMAN_IPCONFIG_TYPE_IPV6; + else + ip_type = CONNMAN_IPCONFIG_TYPE_ALL; + } + continue; + } else if(g_strcmp0(val, "ipv6.dhcp") == 0) { + service->dns_config_method_ipv6 = + CONNMAN_DNSCONFIG_METHOD_DHCP; + if(last_dns_ipv6 == CONNMAN_DNSCONFIG_METHOD_MANUAL) + ip_type = CONNMAN_IPCONFIG_TYPE_IPV6; + + continue; + } +#endif - if (connman_inet_check_ipaddress(val) > 0) { - if (str->len > 0) - g_string_append_printf(str, " %s", val); - else - g_string_append(str, val); - } + if (!val[0]) + continue; + + if (str->len > 0) + g_string_append_printf(str, " %s", val); + else + g_string_append(str, val); } +#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); + nameserver_remove_all(service, CONNMAN_IPCONFIG_TYPE_ALL); +#endif g_strfreev(service->nameservers_config); if (str->len > 0) { @@@ -4452,12 -3443,7 +4603,12 @@@ if (gw && strlen(gw)) __connman_service_nameserver_add_routes(service, gw); +#if defined TIZEN_EXT + DBG("%s ip_type: %d nameserver add all", name, ip_type); + nameserver_add_all(service, ip_type); +#else - nameserver_add_all(service); + 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 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) == TRUE || is_connected(service) == TRUE) ++ 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; +#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_timeout_add_seconds(0, run_auto_connect, + 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 defined TIZEN_EXT + if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR) + break; +#endif - if (!is_connecting(temp) && !is_connected(temp)) + 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 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) == TRUE && ++ 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 !defined TIZEN_EXT - if (!service->favorite && service->state != - CONNMAN_SERVICE_STATE_FAILURE) + 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 } /** + * __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)) { ++ 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 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) && index2 > 0 && index1 == index2) ++ 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 defined TIZEN_EXT +static gboolean __connman_service_can_drop(struct connman_service *service) +{ - if (is_connected(service) == TRUE || is_connecting(service) == 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; - } else if (is_connected(current) == TRUE || is_connecting(current) == 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) == TRUE || - is_connecting(default_service) == TRUE) ++ 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; @@@ -6914,11 -5478,7 +7164,11 @@@ for (iter = service_list; iter; iter = iter->next) { service = iter->data; +#if defined TIZEN_EXT + if (service != allowed && service->type != allowed->type && + __connman_service_can_drop(service) == TRUE) +#else - if (!is_connected(service)) + if (!is_connected(service->state)) break; if (service == allowed) @@@ -6940,23 -5497,6 +7190,23 @@@ g_slist_free(services); } +#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) == FALSE) ++ 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); +#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 - dns_changed(service); domain_changed(service); proxy_changed(service); +#if defined TIZEN_EXT + } +#endif /* * Previous services which are connected and which states @@@ -7158,14 -5678,7 +7407,11 @@@ 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; @@@ -7584,32 -6028,11 +7828,24 @@@ 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 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) && !is_connected(temp)) ++ 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 defined TIZEN_EXT + { + err = __connman_ipconfig_gateway_add(ipconfig, service); + - if(err == 0) - __connman_connection_gateway_activate(service, - CONNMAN_IPCONFIG_TYPE_IPV6); ++ 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; } +#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 check_passphrase(security, passphrase); ++ 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 --- a/src/session.c +++ b/src/session.c diff --cc src/stats.c index 26343b1,663bc38..663bc38 mode 100755,100644..100755 --- a/src/stats.c +++ b/src/stats.c diff --cc src/storage.c index 2da54d6,5e877ef..50c8e95 mode 100755,100644..100755 --- a/src/storage.c +++ b/src/storage.c diff --cc src/task.c index 8b9e1d9,953cc40..953cc40 mode 100755,100644..100755 --- a/src/task.c +++ b/src/task.c diff --cc src/technology.c index 408c99f,d2f0ae2..5aea9f4 mode 100755,100644..100755 --- a/src/technology.c +++ b/src/technology.c @@@ -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 --- a/src/tethering.c +++ b/src/tethering.c diff --cc src/timeserver.c index fc83f9a,0e555a7..6325ece mode 100755,100644..100755 --- a/src/timeserver.c +++ b/src/timeserver.c diff --cc src/util.c index da32cc5,732d451..732d451 mode 100755,100644..100755 --- a/src/util.c +++ b/src/util.c diff --cc src/wispr.c index c3b0c9c,03b38bb..adf6230 mode 100755,100644..100755 --- a/src/wispr.c +++ b/src/wispr.c diff --cc src/wpad.c index 109e9d7,f066fee..b7f1f1e mode 100755,100644..100755 --- a/src/wpad.c +++ b/src/wpad.c diff --cc tools/iptables-unit.c index 7e427e2,426631a..426631a mode 100755,100644..100755 --- a/tools/iptables-unit.c +++ b/tools/iptables-unit.c diff --cc tools/session-test.h index 5e6d196,8512933..8512933 mode 100755,100644..100755 --- a/tools/session-test.h +++ b/tools/session-test.h diff --cc tools/stats-tool.c index 7d117fd,efa39de..efa39de mode 100755,100644..100755 --- a/tools/stats-tool.c +++ b/tools/stats-tool.c diff --cc unit/test-ippool.c index e8d077a,17fac9d..17fac9d mode 100755,100644..100755 --- a/unit/test-ippool.c +++ b/unit/test-ippool.c diff --cc vpn/connman-vpn.service.in index 03eaf22,e98fb71..a8f2948 mode 100755,100644..100755 --- a/vpn/connman-vpn.service.in +++ b/vpn/connman-vpn.service.in @@@ -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 --- a/vpn/main.c +++ b/vpn/main.c @@@ -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; diff --cc vpn/plugins/l2tp.c index 22f9dcf,a0d22c4..a0d22c4 mode 100755,100644..100755 --- a/vpn/plugins/l2tp.c +++ b/vpn/plugins/l2tp.c diff --cc vpn/plugins/openconnect.c index 5feaed9,87679bf..87679bf mode 100755,100644..100755 --- a/vpn/plugins/openconnect.c +++ b/vpn/plugins/openconnect.c diff --cc vpn/plugins/openvpn.c index e226afd,e339509..d115df6 mode 100755,100644..100755 --- a/vpn/plugins/openvpn.c +++ b/vpn/plugins/openvpn.c diff --cc vpn/plugins/pptp.c index 9f2a214,27b1d50..27b1d50 mode 100755,100644..100755 --- a/vpn/plugins/pptp.c +++ b/vpn/plugins/pptp.c diff --cc vpn/plugins/vpn.c index e65daca,9a42385..f6e24c4 mode 100755,100644..100755 --- a/vpn/plugins/vpn.c +++ b/vpn/plugins/vpn.c @@@ -307,57 -336,7 +336,57 @@@ static DBusMessage *vpn_notify(struct c return NULL; } +#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) + static int vpn_create_tun(struct vpn_provider *provider, int flags) { struct vpn_data *data = vpn_provider_get_data(provider); struct ifreq ifr; diff --cc vpn/plugins/vpn.h index af7e8f8,cb94bdc..1888d5f mode 100755,100644..100755 --- a/vpn/plugins/vpn.h +++ b/vpn/plugins/vpn.h diff --cc vpn/plugins/vpnc.c index 09674bd,af9dbe7..af9dbe7 mode 100755,100644..100755 --- a/vpn/plugins/vpnc.c +++ b/vpn/plugins/vpnc.c diff --cc vpn/vpn-config.c index a5be332,c88a99a..5f0e749 mode 100755,100644..100755 --- a/vpn/vpn-config.c +++ b/vpn/vpn-config.c diff --cc vpn/vpn-provider.c index 925f699,d2b3e3a..67239e4 mode 100755,100644..100755 --- a/vpn/vpn-provider.c +++ b/vpn/vpn-provider.c diff --cc vpn/vpn-provider.h index 8105d7f,bdc5f5c..bdc5f5c mode 100755,100644..100755 --- a/vpn/vpn-provider.h +++ b/vpn/vpn-provider.h