X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fservice.c;h=ae1f6fd834ab690dd260e5644b48f293e12475bb;hb=72397eb95321ba03392052db5d877ddef79f6d0d;hp=9a20aee15918010bca7cb7661b1fae138880a3d0;hpb=a1530efdb8f9da676ff3edaa6cc848dd40524333;p=platform%2Fupstream%2Fconnman.git diff --git a/src/service.c b/src/service.c index 9a20aee..ae1f6fd 100644 --- a/src/service.c +++ b/src/service.c @@ -73,11 +73,6 @@ struct connman_service { char *name; char *passphrase; char *profile; - char *apn; - char *username; - char *password; - char *mcc; - char *mnc; connman_bool_t roaming; connman_bool_t login_required; struct connman_ipconfig *ipconfig_ipv4; @@ -88,6 +83,7 @@ struct connman_service { char **nameservers_config; char **domains; char *domainname; + char **timeservers; /* 802.1x settings from the config files */ char *eap; char *identity; @@ -432,8 +428,7 @@ static connman_bool_t is_connecting_state(struct connman_service *service, case CONNMAN_SERVICE_STATE_IDLE: case CONNMAN_SERVICE_STATE_FAILURE: if (service->network != NULL) - return __connman_network_get_connecting( - service->network); + return connman_network_get_connecting(service->network); case CONNMAN_SERVICE_STATE_DISCONNECT: case CONNMAN_SERVICE_STATE_READY: case CONNMAN_SERVICE_STATE_ONLINE: @@ -553,6 +548,12 @@ int __connman_service_nameserver_append(struct connman_service *service, return -EINVAL; if (service->nameservers != NULL) { + int i; + + for (i = 0; service->nameservers[i] != NULL; i++) + if (g_strcmp0(service->nameservers[i], nameserver) == 0) + return -EEXIST; + len = g_strv_length(service->nameservers); service->nameservers = g_try_renew(char *, service->nameservers, len + 2); @@ -617,6 +618,14 @@ int __connman_service_nameserver_remove(struct connman_service *service, return 0; } +void __connman_service_nameserver_clear(struct connman_service *service) +{ + g_strfreev(service->nameservers); + service->nameservers = NULL; + + update_nameservers(service); +} + static void nameserver_add_routes(int index, char **nameservers, const char *gw) { @@ -641,12 +650,15 @@ static void nameserver_del_routes(int index, char **nameservers) void __connman_service_nameserver_add_routes(struct connman_service *service, const char *gw) { - int index; + int index = -1; if (service == NULL) return; - index = connman_network_get_index(service->network); + if (service->network != NULL) + index = connman_network_get_index(service->network); + else if (service->provider != NULL) + index = connman_provider_get_index(service->provider); if (service->nameservers_config != NULL) { /* @@ -668,12 +680,15 @@ void __connman_service_nameserver_add_routes(struct connman_service *service, void __connman_service_nameserver_del_routes(struct connman_service *service) { - int index; + int index = -1; if (service == NULL) return; - index = connman_network_get_index(service->network); + if (service->network != NULL) + index = connman_network_get_index(service->network); + else if (service->provider != NULL) + index = connman_provider_get_index(service->provider); if (service->nameservers_config != NULL) nameserver_del_routes(index, service->nameservers_config); @@ -934,32 +949,6 @@ static void login_changed(struct connman_service *service) DBUS_TYPE_BOOLEAN, &required); } -static void apn_changed(struct connman_service *service) -{ - dbus_bool_t required; - - switch (service->type) { - case CONNMAN_SERVICE_TYPE_UNKNOWN: - case CONNMAN_SERVICE_TYPE_SYSTEM: - case CONNMAN_SERVICE_TYPE_ETHERNET: - case CONNMAN_SERVICE_TYPE_WIMAX: - case CONNMAN_SERVICE_TYPE_BLUETOOTH: - case CONNMAN_SERVICE_TYPE_WIFI: - case CONNMAN_SERVICE_TYPE_GPS: - case CONNMAN_SERVICE_TYPE_VPN: - case CONNMAN_SERVICE_TYPE_GADGET: - return; - case CONNMAN_SERVICE_TYPE_CELLULAR: - break; - } - - required = (service->apn == NULL) ? TRUE : FALSE; - - connman_dbus_property_changed_basic(service->path, - CONNMAN_SERVICE_INTERFACE, "SetupRequired", - DBUS_TYPE_BOOLEAN, &required); -} - static void append_security(DBusMessageIter *iter, void *user_data) { struct connman_service *service = user_data; @@ -1013,7 +1002,8 @@ static void append_ipv6(DBusMessageIter *iter, void *user_data) return; if (service->ipconfig_ipv6 != NULL) - __connman_ipconfig_append_ipv6(service->ipconfig_ipv6, iter); + __connman_ipconfig_append_ipv6(service->ipconfig_ipv6, iter, + service->ipconfig_ipv4); } static void append_ipv4config(DBusMessageIter *iter, void *user_data) @@ -1624,24 +1614,7 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited, connman_dbus_dict_append_basic(dict, "Roaming", DBUS_TYPE_BOOLEAN, &service->roaming); - if (service->apn != NULL) { - connman_dbus_dict_append_basic(dict, "APN", - DBUS_TYPE_STRING, &service->apn); - - if (service->username != NULL) - connman_dbus_dict_append_basic(dict, - "Username", DBUS_TYPE_STRING, - &service->username); - - if (service->password != NULL) - connman_dbus_dict_append_basic(dict, - "Password", DBUS_TYPE_STRING, - &service->password); - - required = FALSE; - } else - required = TRUE; - + required = FALSE; connman_dbus_dict_append_basic(dict, "SetupRequired", DBUS_TYPE_BOOLEAN, &required); connman_dbus_dict_append_dict(dict, "Ethernet", @@ -1743,10 +1716,12 @@ int __connman_service_get_index(struct connman_service *service) if (service == NULL) return -1; - if (service->network == NULL) - return -1; + if (service->network != NULL) + return connman_network_get_index(service->network); + else if (service->provider != NULL) + return connman_provider_get_index(service->provider); - return connman_network_get_index(service->network); + return -1; } void __connman_service_set_domainname(struct connman_service *service, @@ -1872,6 +1847,124 @@ const char *connman_service_get_proxy_autoconfig(struct connman_service *service return NULL; } +static void update_timeservers(struct connman_service *service) +{ + int i; + + if (service->timeservers == NULL) + return; + + switch (combine_state(service->state_ipv4, service->state_ipv6)) { + case CONNMAN_SERVICE_STATE_UNKNOWN: + case CONNMAN_SERVICE_STATE_IDLE: + case CONNMAN_SERVICE_STATE_ASSOCIATION: + case CONNMAN_SERVICE_STATE_CONFIGURATION: + return; + case CONNMAN_SERVICE_STATE_FAILURE: + case CONNMAN_SERVICE_STATE_DISCONNECT: + for (i = 0; service->timeservers[i] != NULL; i++) + connman_timeserver_remove(service->timeservers[i]); + return; + case CONNMAN_SERVICE_STATE_READY: + case CONNMAN_SERVICE_STATE_ONLINE: + break; + } + + for (i = 0; service->timeservers[i] != NULL; i++) + connman_timeserver_append(service->timeservers[i]); +} + +int __connman_service_timeserver_append(struct connman_service *service, + const char *timeserver) +{ + int len; + + DBG("service %p timeserver %s", service, timeserver); + + if (timeserver == NULL) + return -EINVAL; + + if (service->timeservers != NULL) { + int i; + + for (i = 0; service->timeservers[i] != NULL; i++) + if (g_strcmp0(service->timeservers[i], timeserver) == 0) + return -EEXIST; + + len = g_strv_length(service->timeservers); + service->timeservers = g_try_renew(char *, service->timeservers, + len + 2); + } else { + len = 0; + service->timeservers = g_try_new0(char *, len + 2); + } + + if (service->timeservers == NULL) + return -ENOMEM; + + service->timeservers[len] = g_strdup(timeserver); + service->timeservers[len + 1] = NULL; + + update_timeservers(service); + + return 0; +} + +int __connman_service_timeserver_remove(struct connman_service *service, + const char *timeserver) +{ + char **servers; + int len, i, j; + + DBG("service %p timeserver %s", service, timeserver); + + if (timeserver == NULL) + return -EINVAL; + + if (service->timeservers == NULL) + return 0; + + len = g_strv_length(service->timeservers); + if (len == 1) { + if (g_strcmp0(service->timeservers[0], timeserver) != 0) + return 0; + + g_strfreev(service->timeservers); + service->timeservers = NULL; + + return 0; + } + + servers = g_try_new0(char *, len - 1); + if (servers == NULL) + return -ENOMEM; + + for (i = 0, j = 0; i < len; i++) { + if (g_strcmp0(service->timeservers[i], timeserver) != 0) { + servers[j] = g_strdup(service->timeservers[i]); + j++; + } + } + servers[len - 2] = NULL; + + g_strfreev(service->timeservers); + service->timeservers = servers; + + update_timeservers(service); + + return 0; +} + +void __connman_service_set_pac(struct connman_service *service, + const char *pac) +{ + if (pac == NULL) + return; + + g_free(service->pac); + service->pac = g_strdup(pac); +} + void __connman_service_set_passphrase(struct connman_service *service, const char* passphrase) { @@ -2179,74 +2272,6 @@ static DBusMessage *set_property(DBusConnection *conn, dbus_message_iter_get_basic(&value, &passphrase); __connman_service_set_passphrase(service, passphrase); - } else if (g_str_equal(name, "APN") == TRUE) { - const char *apn; - - if (type != DBUS_TYPE_STRING) - return __connman_error_invalid_arguments(msg); - - if (service->immutable == TRUE) - return __connman_error_not_supported(msg); - - if (service->type != CONNMAN_SERVICE_TYPE_CELLULAR) - return __connman_error_invalid_service(msg); - - dbus_message_iter_get_basic(&value, &apn); - - g_free(service->apn); - service->apn = g_strdup(apn); - - apn_changed(service); - - if (service->network != NULL) - connman_network_set_string(service->network, - "Cellular.APN", service->apn); - - __connman_storage_save_service(service); - } else if (g_str_equal(name, "Username") == TRUE) { - const char *username; - - if (type != DBUS_TYPE_STRING) - return __connman_error_invalid_arguments(msg); - - if (service->immutable == TRUE) - return __connman_error_not_supported(msg); - - if (service->type != CONNMAN_SERVICE_TYPE_CELLULAR) - return __connman_error_invalid_service(msg); - - dbus_message_iter_get_basic(&value, &username); - - g_free(service->username); - service->username = g_strdup(username); - - if (service->network != NULL) - connman_network_set_string(service->network, - "Cellular.Username", service->username); - - __connman_storage_save_service(service); - } else if (g_str_equal(name, "Password") == TRUE) { - const char *password; - - if (type != DBUS_TYPE_STRING) - return __connman_error_invalid_arguments(msg); - - if (service->immutable == TRUE) - return __connman_error_not_supported(msg); - - if (service->type != CONNMAN_SERVICE_TYPE_CELLULAR) - return __connman_error_invalid_service(msg); - - dbus_message_iter_get_basic(&value, &password); - - g_free(service->password); - service->password = g_strdup(password); - - if (service->network != NULL) - connman_network_set_string(service->network, - "Cellular.Password", service->password); - - __connman_storage_save_service(service); } else if (g_str_equal(name, "Nameservers.Configuration") == TRUE) { DBusMessageIter entry; GString *str; @@ -2261,7 +2286,7 @@ static DBusMessage *set_property(DBusConnection *conn, return __connman_error_invalid_arguments(msg); index = connman_network_get_index(service->network); - gw = __connman_ipconfig_get_gateway(index); + gw = __connman_ipconfig_get_gateway_from_index(index); if (gw && strlen(gw)) __connman_service_nameserver_del_routes(service); @@ -2513,9 +2538,21 @@ static void reply_pending(struct connman_service *service, int error) error); if (reply != NULL) g_dbus_send_message(connection, reply); - } else - g_dbus_send_reply(connection, service->pending, + } else { + const char *sender; + + sender = dbus_message_get_interface(service->pending); + + DBG("sender %s", sender); + + if (g_strcmp0(sender, CONNMAN_MANAGER_INTERFACE) == 0) + g_dbus_send_reply(connection, service->pending, + DBUS_TYPE_OBJECT_PATH, &service->path, DBUS_TYPE_INVALID); + else + g_dbus_send_reply(connection, service->pending, + DBUS_TYPE_INVALID); + } dbus_message_unref(service->pending); service->pending = NULL; @@ -2773,24 +2810,11 @@ static DBusMessage *remove_service(DBusConnection *conn, __connman_network_disconnect(service->network); } - g_hash_table_destroy(service->counter_table); - g_free(service->passphrase); service->passphrase = NULL; passphrase_changed(service); - g_free(service->apn); - service->apn = NULL; - - g_free(service->username); - service->username = NULL; - - g_free(service->password); - service->password = NULL; - - apn_changed(service); - set_idle(service); __connman_service_set_favorite(service, FALSE); @@ -2904,6 +2928,8 @@ static void service_free(gpointer user_data) g_free(path); } + g_hash_table_destroy(service->counter_table); + if (service->network != NULL) connman_network_unref(service->network); @@ -2931,11 +2957,6 @@ static void service_free(gpointer user_data) g_free(service->domainname); g_free(service->pac); - g_free(service->mcc); - g_free(service->mnc); - g_free(service->apn); - g_free(service->username); - g_free(service->password); g_free(service->profile); g_free(service->name); g_free(service->passphrase); @@ -3107,10 +3128,12 @@ static gint service_compare(gconstpointer a, gconstpointer b, { struct connman_service *service_a = (void *) a; struct connman_service *service_b = (void *) b; + enum connman_service_state state_a, state_b; - if (service_a->state_ipv4 != service_b->state_ipv4 && - service_a->state_ipv6 != service_b->state_ipv6) { + state_a = combine_state(service_a->state_ipv4, service_a->state_ipv6); + state_b = combine_state(service_b->state_ipv4, service_b->state_ipv6); + if (state_a != state_b) { if (is_connected(service_a) == TRUE) return -1; if (is_connected(service_b) == TRUE) @@ -3236,6 +3259,18 @@ __connman_service_get_ip6config(struct connman_service *service) return service->ipconfig_ipv6; } +struct connman_ipconfig * +__connman_service_get_ipconfig(struct connman_service *service, int family) +{ + if (family == AF_INET) + return __connman_service_get_ip4config(service); + else if (family == AF_INET6) + return __connman_service_get_ip6config(service); + else + return NULL; + +} + enum connman_service_security __connman_service_get_security(struct connman_service *service) { if (service == NULL) @@ -3441,6 +3476,7 @@ int __connman_service_indicate_state(struct connman_service *service, if (state == CONNMAN_SERVICE_STATE_READY) { enum connman_service_proxy_method proxy_config; + enum connman_ipconfig_method method; set_reconnect_state(service, TRUE); @@ -3493,6 +3529,12 @@ int __connman_service_indicate_state(struct connman_service *service, } default_changed(); + + method = __connman_ipconfig_get_method(service->ipconfig_ipv6); + if (method == CONNMAN_IPCONFIG_METHOD_OFF) + __connman_ipconfig_disable_ipv6( + service->ipconfig_ipv6); + } else if (state == CONNMAN_SERVICE_STATE_DISCONNECT) { __connman_location_finish(service); @@ -3586,6 +3628,14 @@ int __connman_service_clear_error(struct connman_service *service) __connman_service_indicate_state(service, CONNMAN_SERVICE_STATE_IDLE, CONNMAN_IPCONFIG_TYPE_IPV6); + /* + * Toggling the IPv6 state to IDLE could trigger the auto connect + * machinery and consequently the IPv4 state. + */ + if (service->state_ipv4 != CONNMAN_SERVICE_STATE_UNKNOWN && + service->state_ipv4 != CONNMAN_SERVICE_STATE_FAILURE) + return 0; + return __connman_service_indicate_state(service, CONNMAN_SERVICE_STATE_IDLE, CONNMAN_IPCONFIG_TYPE_IPV4); @@ -3639,15 +3689,7 @@ static connman_bool_t prepare_network(struct connman_service *service) case CONNMAN_NETWORK_TYPE_WIMAX: case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN: case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN: - break; case CONNMAN_NETWORK_TYPE_CELLULAR: - connman_network_set_string(service->network, - "Cellular.APN", service->apn); - - connman_network_set_string(service->network, - "Cellular.Username", service->username); - connman_network_set_string(service->network, - "Cellular.Password", service->password); break; } @@ -3701,11 +3743,8 @@ static int service_connect(struct connman_service *service) case CONNMAN_SERVICE_TYPE_ETHERNET: case CONNMAN_SERVICE_TYPE_WIMAX: case CONNMAN_SERVICE_TYPE_BLUETOOTH: - case CONNMAN_SERVICE_TYPE_VPN: - break; case CONNMAN_SERVICE_TYPE_CELLULAR: - if (service->apn == NULL) - return -EINVAL; + case CONNMAN_SERVICE_TYPE_VPN: break; case CONNMAN_SERVICE_TYPE_WIFI: switch (service->security) { @@ -3849,6 +3888,8 @@ int __connman_service_disconnect(struct connman_service *service) if (err < 0 && err != -EINPROGRESS) return err; + __connman_6to4_remove(service->ipconfig_ipv4); + if (service->ipconfig_ipv4) __connman_ipconfig_set_proxy_autoconfig(service->ipconfig_ipv4, NULL); @@ -3856,8 +3897,8 @@ int __connman_service_disconnect(struct connman_service *service) __connman_ipconfig_set_proxy_autoconfig(service->ipconfig_ipv6, NULL); - __connman_ipconfig_clear_address(service->ipconfig_ipv4); - __connman_ipconfig_clear_address(service->ipconfig_ipv6); + __connman_ipconfig_address_remove(service->ipconfig_ipv4); + __connman_ipconfig_address_remove(service->ipconfig_ipv6); __connman_ipconfig_disable(service->ipconfig_ipv4); __connman_ipconfig_disable(service->ipconfig_ipv6); @@ -4102,9 +4143,7 @@ done: if (err < 0 && err != -EINPROGRESS) goto failed; - g_dbus_send_reply(connection, msg, - DBUS_TYPE_OBJECT_PATH, &service->path, - DBUS_TYPE_INVALID); + service->pending = dbus_message_ref(msg); return 0; @@ -4581,14 +4620,6 @@ static void update_from_network(struct connman_service *service, str = connman_network_get_string(network, "WiFi.Security"); service->security = convert_wifi_security(str); - str = connman_network_get_string(network, "Cellular.MCC"); - g_free(service->mcc); - service->mcc = g_strdup(str); - - str = connman_network_get_string(network, "Cellular.MNC"); - g_free(service->mnc); - service->mnc = g_strdup(str); - if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR) { connman_uint8_t value = connman_network_get_uint8(network, "Cellular.Mode"); @@ -4954,15 +4985,6 @@ static int service_load(struct connman_service *service) case CONNMAN_SERVICE_TYPE_WIMAX: case CONNMAN_SERVICE_TYPE_BLUETOOTH: case CONNMAN_SERVICE_TYPE_CELLULAR: - service->apn = g_key_file_get_string(keyfile, - service->identifier, "APN", NULL); - - service->username = g_key_file_get_string(keyfile, - service->identifier, "Username", NULL); - - service->password = g_key_file_get_string(keyfile, - service->identifier, "Password", NULL); - service->favorite = g_key_file_get_boolean(keyfile, service->identifier, "Favorite", NULL); @@ -5132,18 +5154,6 @@ update: case CONNMAN_SERVICE_TYPE_WIMAX: case CONNMAN_SERVICE_TYPE_BLUETOOTH: case CONNMAN_SERVICE_TYPE_CELLULAR: - if (service->apn != NULL) - g_key_file_set_string(keyfile, service->identifier, - "APN", service->apn); - - if (service->username != NULL) - g_key_file_set_string(keyfile, service->identifier, - "Username", service->username); - - if (service->password != NULL) - g_key_file_set_string(keyfile, service->identifier, - "Password", service->password); - g_key_file_set_boolean(keyfile, service->identifier, "Favorite", service->favorite);