diff options
author | Jaehyun Kim <jeik01.kim@samsung.com> | 2015-06-30 09:40:43 +0900 |
---|---|---|
committer | Seonah Moon <seonah1.moon@samsung.com> | 2015-07-08 16:27:34 +0900 |
commit | 87ae92a8fff91a11db13a615d9fdc1133f9e7b7a (patch) | |
tree | ab65ab6ac16d89ee4624b621049bba498717b5bd /src | |
parent | 569ccaa4728078c11bf7a4970a63bfd4ad840709 (diff) | |
download | connman-87ae92a8fff91a11db13a615d9fdc1133f9e7b7a.tar.gz connman-87ae92a8fff91a11db13a615d9fdc1133f9e7b7a.tar.bz2 connman-87ae92a8fff91a11db13a615d9fdc1133f9e7b7a.zip |
Fix MMS connection failure
Change-Id: Id3847d1d8233c2177cfbd65ba42ead8ff44a06a8
Diffstat (limited to 'src')
-rw-r--r-- | src/connman.h | 13 | ||||
-rw-r--r-- | src/ipconfig.c | 8 | ||||
-rw-r--r-- | src/network.c | 147 | ||||
-rw-r--r-- | src/provider.c | 4 | ||||
-rw-r--r-- | src/service.c | 455 |
5 files changed, 622 insertions, 5 deletions
diff --git a/src/connman.h b/src/connman.h index 386e8c83..733f87c8 100644 --- a/src/connman.h +++ b/src/connman.h @@ -395,7 +395,15 @@ enum connman_ipconfig_method __connman_ipconfig_get_method( int __connman_ipconfig_address_add(struct connman_ipconfig *ipconfig); int __connman_ipconfig_address_remove(struct connman_ipconfig *ipconfig); int __connman_ipconfig_address_unset(struct connman_ipconfig *ipconfig); +#if defined TIZEN_EXT +/* + * Description: __connman_service_lookup_from_index cannot find correct service + * e.g. same interface or same APN of cellular profile + */ +int __connman_ipconfig_gateway_add(struct connman_ipconfig *ipconfig, struct connman_service *service); +#else int __connman_ipconfig_gateway_add(struct connman_ipconfig *ipconfig); +#endif void __connman_ipconfig_gateway_remove(struct connman_ipconfig *ipconfig); int __connman_ipconfig_set_proxy_autoconfig(struct connman_ipconfig *ipconfig, @@ -757,6 +765,11 @@ void __connman_service_timeserver_changed(struct connman_service *service, void __connman_service_set_pac(struct connman_service *service, const char *pac); #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); void __connman_service_set_proxy(struct connman_service *service, const char *proxies); #endif diff --git a/src/ipconfig.c b/src/ipconfig.c index ae70745f..29c5a3de 100644 --- a/src/ipconfig.c +++ b/src/ipconfig.c @@ -1077,16 +1077,24 @@ void __connman_ipconfig_set_gateway(struct connman_ipconfig *ipconfig, ipconfig->address->gateway = g_strdup(gateway); } +#if defined TIZEN_EXT +int __connman_ipconfig_gateway_add(struct connman_ipconfig *ipconfig, struct connman_service *service) +#else int __connman_ipconfig_gateway_add(struct connman_ipconfig *ipconfig) +#endif { +#if !defined TIZEN_EXT struct connman_service *service; +#endif DBG(""); if (!ipconfig->address) return -EINVAL; +#if !defined TIZEN_EXT service = __connman_service_lookup_from_index(ipconfig->index); +#endif if (!service) return -EINVAL; diff --git a/src/network.c b/src/network.c index eba068b2..4047e177 100644 --- a/src/network.c +++ b/src/network.c @@ -99,6 +99,11 @@ struct connman_network { #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) @@ -178,7 +183,11 @@ static void dhcp_success(struct connman_network *network) if (err < 0) goto err; +#if defined TIZEN_EXT + err = __connman_ipconfig_gateway_add(ipconfig_ipv4, service); +#else err = __connman_ipconfig_gateway_add(ipconfig_ipv4); +#endif if (err < 0) goto err; @@ -244,7 +253,12 @@ static int set_connected_fixed(struct connman_network *network) if (err < 0) goto err; +#if defined TIZEN_EXT + err = __connman_ipconfig_gateway_add(ipconfig_ipv4, service); +#else err = __connman_ipconfig_gateway_add(ipconfig_ipv4); +#endif + if (err < 0) goto err; @@ -278,7 +292,11 @@ static void set_connected_manual(struct connman_network *network) if (err < 0) goto err; +#if defined TIZEN_EXT + err = __connman_ipconfig_gateway_add(ipconfig, service); +#else err = __connman_ipconfig_gateway_add(ipconfig); +#endif if (err < 0) goto err; @@ -341,7 +359,11 @@ static int manual_ipv6_set(struct connman_network *network, return err; } +#if defined TIZEN_EXT + err = __connman_ipconfig_gateway_add(ipconfig_ipv6, service); +#else err = __connman_ipconfig_gateway_add(ipconfig_ipv6); +#endif if (err < 0) return err; @@ -405,7 +427,11 @@ static int dhcpv6_set_addresses(struct connman_network *network) if (err < 0) goto err; +#if defined TIZEN_EXT + err = __connman_ipconfig_gateway_add(ipconfig_ipv6, service); +#else err = __connman_ipconfig_gateway_add(ipconfig_ipv6); +#endif if (err < 0) goto err; @@ -792,12 +818,22 @@ static void set_disconnected(struct connman_network *network) CONNMAN_IPCONFIG_TYPE_IPV6); if (network->connected) { +#if defined TIZEN_EXT + /** + * Do not remove gateway and its address, + * if there are connected profiles that use same interface (multiple PDN) + */ + if (connman_service_get_type(service) != CONNMAN_SERVICE_TYPE_CELLULAR || + __connman_service_get_connected_count_of_iface(service) <= 0) { +#endif __connman_connection_gateway_remove(service, CONNMAN_IPCONFIG_TYPE_ALL); __connman_ipconfig_address_unset(ipconfig_ipv4); __connman_ipconfig_address_unset(ipconfig_ipv6); - +#if defined TIZEN_EXT + } +#endif /* * Special handling for IPv6 autoconfigured address. * The simplest way to remove autoconfigured routes is to @@ -1299,6 +1335,93 @@ bool connman_network_get_available(struct connman_network *network) return network->available; } +#if defined TIZEN_EXT +void connman_network_clear_associating(struct connman_network *network) +{ + struct connman_service *service; + enum connman_service_state state; + + DBG("network %p", network); + + network->connecting = FALSE; + network->associating = FALSE; + + service = connman_service_lookup_from_network(network); + if (!service) + return; + + state = __connman_service_ipconfig_get_state(service, + CONNMAN_IPCONFIG_TYPE_IPV4); + if (state != CONNMAN_SERVICE_STATE_IDLE && + state != CONNMAN_SERVICE_STATE_FAILURE) + __connman_service_ipconfig_indicate_state(service, + CONNMAN_SERVICE_STATE_DISCONNECT, + CONNMAN_IPCONFIG_TYPE_IPV4); + + state = __connman_service_ipconfig_get_state(service, + CONNMAN_IPCONFIG_TYPE_IPV6); + if (state != CONNMAN_SERVICE_STATE_IDLE && + state != CONNMAN_SERVICE_STATE_FAILURE) + __connman_service_ipconfig_indicate_state(service, + CONNMAN_SERVICE_STATE_DISCONNECT, + CONNMAN_IPCONFIG_TYPE_IPV6); + + __connman_service_ipconfig_indicate_state(service, + CONNMAN_SERVICE_STATE_IDLE, + CONNMAN_IPCONFIG_TYPE_IPV4); + + __connman_service_ipconfig_indicate_state(service, + CONNMAN_SERVICE_STATE_IDLE, + CONNMAN_IPCONFIG_TYPE_IPV6); +} + +static gboolean __connman_network_clear_associating_delayed(gpointer user_data) +{ + GSList *list; + gboolean found = FALSE; + enum connman_service_state state_ipv4; + enum connman_service_state state_ipv6; + struct connman_service *service; + struct connman_network *network = (struct connman_network *)user_data; + + for (list = network_list; list != NULL; list = list->next) { + struct connman_network *item = list->data; + + if (item == network) { + found = TRUE; + break; + } + } + + if (found != TRUE) + return FALSE; + + DBG("network %p name %s", network, network->name); + service = connman_service_lookup_from_network(network); + + state_ipv4 = __connman_service_ipconfig_get_state(service, + CONNMAN_IPCONFIG_TYPE_IPV4); + state_ipv6 = __connman_service_ipconfig_get_state(service, + CONNMAN_IPCONFIG_TYPE_IPV6); + + DBG("service %p state %d/%d", service, state_ipv4, state_ipv6); + + if (network->associating == FALSE && + state_ipv4 == CONNMAN_SERVICE_STATE_ASSOCIATION && + state_ipv6 == CONNMAN_SERVICE_STATE_ASSOCIATION) { + __connman_service_ipconfig_indicate_state(service, + CONNMAN_SERVICE_STATE_IDLE, + CONNMAN_IPCONFIG_TYPE_IPV4); + + __connman_service_ipconfig_indicate_state(service, + CONNMAN_SERVICE_STATE_IDLE, + CONNMAN_IPCONFIG_TYPE_IPV6); + } + + return FALSE; +} +#endif + /** * connman_network_set_associating: * @network: network structure @@ -1568,13 +1691,19 @@ int __connman_network_connect(struct connman_network *network) network->connecting = true; +#if defined TIZEN_EXT + if (network->type != CONNMAN_NETWORK_TYPE_CELLULAR) +#endif __connman_device_disconnect(network->device); err = network->driver->connect(network); if (err < 0) { - if (err == -EINPROGRESS) + if (err == -EINPROGRESS) { +#if defined TIZEN_EXT + if (network->type != CONNMAN_NETWORK_TYPE_CELLULAR) +#endif connman_network_set_associating(network, true); - else + } else network->connecting = false; return err; @@ -1632,7 +1761,11 @@ static int manual_ipv4_set(struct connman_network *network, return err; } +#if defined TIZEN_EXT + return __connman_ipconfig_gateway_add(ipconfig, service); +#else return __connman_ipconfig_gateway_add(ipconfig); +#endif } int __connman_network_clear_ipconfig(struct connman_network *network, @@ -2086,6 +2219,10 @@ int connman_network_set_bool(struct connman_network *network, network->wifi.wps = value; else if (g_strcmp0(key, "WiFi.UseWPS") == 0) network->wifi.use_wps = value; +#if defined TIZEN_EXT + else if (g_strcmp0(key, "DefaultInternet") == 0) + network->default_internet = value; +#endif return -EINVAL; } @@ -2108,6 +2245,10 @@ bool connman_network_get_bool(struct connman_network *network, return network->wifi.wps; else if (g_str_equal(key, "WiFi.UseWPS")) return network->wifi.use_wps; +#if defined TIZEN_EXT + else if (g_str_equal(key, "DefaultInternet")) + return network->default_internet; +#endif return false; } diff --git a/src/provider.c b/src/provider.c index 693552ee..22ff08ae 100644 --- a/src/provider.c +++ b/src/provider.c @@ -242,7 +242,11 @@ static int set_connected(struct connman_provider *provider, } __connman_ipconfig_address_add(ipconfig); +#if defined TIZEN_EXT + __connman_ipconfig_gateway_add(ipconfig, service); +#else __connman_ipconfig_gateway_add(ipconfig); +#endif provider_indicate_state(provider, CONNMAN_SERVICE_STATE_READY); diff --git a/src/service.c b/src/service.c index 974a0876..fb4a61f0 100644 --- a/src/service.c +++ b/src/service.c @@ -140,6 +140,18 @@ struct connman_service { bool hidden_service; char *config_file; char *config_entry; +#if defined TIZEN_EXT + /* + * Description: TIZEN implements system global connection management. + * It's only for PDP (cellular) bearer. Wi-Fi is managed + * by ConnMan automatically. Reference count can help to + * manage open/close connection requests by each application. + */ + int user_pdn_connection_refcount; +#endif +#if defined TIZEN_TV_EXT + enum connman_dnsconfig_method dns_config_method; +#endif }; static bool allow_property_changed(struct connman_service *service); @@ -155,6 +167,50 @@ struct find_data { struct connman_service *service; }; +#if defined TIZEN_EXT +/* + * Public APIs to use user_pdn_connection_refcount + */ +void connman_service_user_pdn_connection_ref(struct connman_service *service) +{ + __sync_fetch_and_add(&service->user_pdn_connection_refcount, 1); + + DBG("User made PDN connection referenced: %d", + service->user_pdn_connection_refcount); +} + +gboolean connman_service_user_pdn_connection_unref_and_test( + struct connman_service *service) +{ + __sync_synchronize(); + + DBG("User made PDN connection referenced: %d, which will be decreased", + service->user_pdn_connection_refcount); + + if (service->user_pdn_connection_refcount < 1) + return TRUE; + + if (__sync_sub_and_fetch(&service->user_pdn_connection_refcount, 1) == 0) + return TRUE; + + return FALSE; +} + +gboolean connman_service_is_no_ref_user_pdn_connection( + struct connman_service *cellular) +{ + if (cellular == NULL) + return TRUE; + + __sync_synchronize(); + if (cellular->type == CONNMAN_SERVICE_TYPE_CELLULAR && + cellular->user_pdn_connection_refcount == 0) + return TRUE; + + return FALSE; +} +#endif + static void compare_path(gpointer value, gpointer user_data) { struct connman_service *service = value; @@ -1518,6 +1574,71 @@ static void reset_stats(struct connman_service *service) 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) { + 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) + default_service = service; + } else if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET && + is_connected(service) == TRUE) { + if (default_service == NULL) + default_service = service; + } else if (service->type == CONNMAN_SERVICE_TYPE_BLUETOOTH && + is_connected(service) == TRUE) { + if (default_service == NULL) + default_service = service; + } + } + + return default_service; +} +#endif + struct connman_service *__connman_service_get_default(void) { struct connman_service *service; @@ -2710,6 +2831,54 @@ char **connman_service_get_timeservers(struct connman_service *service) return service->timeservers; } +#if defined TIZEN_EXT +/* + * Description: Telephony plug-in requires manual PROXY setting function + */ +int connman_service_set_proxy(struct connman_service *service, + const char *proxy, gboolean active) +{ + char **proxies_array = NULL; + + if (service == NULL) + return -EINVAL; + + switch (service->type) { + case CONNMAN_SERVICE_TYPE_CELLULAR: + case CONNMAN_SERVICE_TYPE_ETHERNET: + case CONNMAN_SERVICE_TYPE_WIFI: + break; + + default: + return -EINVAL; + } + + g_strfreev(service->proxies); + service->proxies = NULL; + + if (proxy != NULL) + proxies_array = g_strsplit(proxy, " ", 0); + + service->proxies = proxies_array; + + if (proxy == NULL) { + service->proxy_config = CONNMAN_SERVICE_PROXY_METHOD_DIRECT; + DBG("proxy changed (%d)", active); + } else { + service->proxy_config = CONNMAN_SERVICE_PROXY_METHOD_MANUAL; + DBG("proxy chagned %s (%d)", proxy, active); + } + + if (active == TRUE) { + proxy_changed(service); + + __connman_notifier_proxy_changed(service); + } + + return 0; +} +#endif + void connman_service_set_proxy_method(struct connman_service *service, enum connman_service_proxy_method method) { @@ -3816,6 +3985,14 @@ static GList *preferred_tech_list_get(void) CONNMAN_SERVICE_CONNECT_REASON_USER) { DBG("service %p name %s is user connected", service, service->name); +#if defined TIZEN_EXT + /* We can connect to a favorite service like + * wifi even we have a userconnect for cellular + * because we have refount for cellular service + */ + if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR) + break; +#endif return NULL; } } @@ -4132,6 +4309,14 @@ static DBusMessage *connect_service(DBusConnection *conn, DBG("service %p", service); +#if defined TIZEN_EXT + /* + * Description: TIZEN implements system global connection management. + */ + if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR) + connman_service_user_pdn_connection_ref(service); +#endif + if (service->pending) return __connman_error_in_progress(msg); @@ -4165,6 +4350,10 @@ static DBusMessage *connect_service(DBusConnection *conn, 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)) break; @@ -4211,6 +4400,20 @@ static DBusMessage *disconnect_service(DBusConnection *conn, 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 && + 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, @@ -4819,6 +5022,13 @@ static void service_initialize(struct connman_service *service) service->provider = NULL; service->wps = false; +#if defined TIZEN_EXT + /* + * Description: TIZEN implements system global connection management. + */ + service->user_pdn_connection_refcount = 0; + __sync_synchronize(); +#endif } /** @@ -5161,6 +5371,46 @@ 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) + count++; + + index2 = 0; + } + + DBG("Interface index %d, count %d", index1, count); + + return count; +} +#endif + /** * __connman_service_set_favorite_delayed: * @service: service structure @@ -5173,6 +5423,10 @@ int __connman_service_set_favorite_delayed(struct connman_service *service, bool favorite, bool delay_ordering) { +#if defined TIZEN_EXT + if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR) + return -EIO; +#endif if (service->hidden) return -EOPNOTSUPP; @@ -5512,6 +5766,126 @@ static int service_update_preferred_order(struct connman_service *default_servic 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 (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) + 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) + 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; @@ -5523,12 +5897,16 @@ static void single_connected_tech(struct connman_service *allowed) 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)) break; if (service == allowed) continue; - +#endif services = g_slist_prepend(services, service); } @@ -5536,6 +5914,9 @@ static void single_connected_tech(struct connman_service *allowed) service = list->data; DBG("disconnecting %p %s", service, service->path); +#if defined TIZEN_EXT + __connman_service_disconnect_default(service); +#endif __connman_service_disconnect(service); } @@ -5701,9 +6082,21 @@ static int service_indicate_state(struct connman_service *service) __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 @@ -5734,6 +6127,10 @@ static int service_indicate_state(struct connman_service *service) service_list_sort(); +#if defined TIZEN_EXT + __connman_service_connect_default(service); +#endif + __connman_connection_update_gateway(); if ((old_state == CONNMAN_SERVICE_STATE_ONLINE && @@ -6017,6 +6414,18 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service, if (*old_state == new_state) return -EALREADY; +#if defined TIZEN_EXT + __sync_synchronize(); + if (service->user_pdn_connection_refcount > 0 && + service->type == CONNMAN_SERVICE_TYPE_CELLULAR) + if (new_state == CONNMAN_SERVICE_STATE_FAILURE || + new_state == CONNMAN_SERVICE_STATE_DISCONNECT || + new_state == CONNMAN_SERVICE_STATE_IDLE) { + service->user_pdn_connection_refcount = 0; + __sync_synchronize(); + } +#endif + DBG("service %p (%s) old state %d (%s) new state %d (%s) type %d (%s)", service, service ? service->identifier : NULL, *old_state, state2string(*old_state), @@ -6032,6 +6441,15 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service, __connman_ipconfig_enable(ipconfig); break; case CONNMAN_SERVICE_STATE_READY: +#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) { check_proxy_setup(service); service_rp_filter(service, true); @@ -6393,6 +6811,14 @@ int __connman_service_disconnect(struct connman_service *service) __connman_ipconfig_set_proxy_autoconfig(service->ipconfig_ipv6, NULL); +#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 __connman_ipconfig_address_remove(service->ipconfig_ipv4); settings_changed(service, service->ipconfig_ipv4); @@ -6401,6 +6827,9 @@ int __connman_service_disconnect(struct connman_service *service) __connman_ipconfig_disable(service->ipconfig_ipv4); __connman_ipconfig_disable(service->ipconfig_ipv6); +#if defined TIZEN_EXT + } +#endif __connman_stats_service_unregister(service); @@ -6867,6 +7296,28 @@ unsigned int __connman_service_get_order(struct connman_service *service) if (!service->favorite) return 0; +#if defined TIZEN_EXT + if (service->type == CONNMAN_SERVICE_TYPE_VPN && + service->do_split_routing == FALSE) + order = 10; + else if (service->type == CONNMAN_SERVICE_TYPE_WIFI) { + if (service->order < 5) + order = 5; + } else if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET) + order = 4; + else if (service->type == CONNMAN_SERVICE_TYPE_BLUETOOTH) + order = 3; + else if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR && + __connman_service_is_internet_profile(service) == TRUE) + order = 1; + else if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR && + __connman_service_is_tethering_profile(service) == TRUE) + order = 0; + else if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR) + order = 0; + else + order = 2; +#else if (service == service_list->data) order = 1; @@ -6875,7 +7326,7 @@ unsigned int __connman_service_get_order(struct connman_service *service) service->order = 10; order = 10; } - +#endif DBG("service %p name %s order %d split %d", service, service->name, order, service->do_split_routing); |