X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Fconnman.git;a=blobdiff_plain;f=src%2Fservice.c;h=d1ada486189d7b6bcda754cf4ad7b99348ce832e;hp=b533dcd06912919d23ec78fb48c4c9c83e59e87a;hb=a48fa9fdffe415e9a6f703776b5db795e242ac23;hpb=dce2054780e8142aebe5a7d11c4751040437f7ec diff --git a/src/service.c b/src/service.c old mode 100755 new mode 100644 index b533dcd..d1ada48 --- a/src/service.c +++ b/src/service.c @@ -298,6 +298,10 @@ const char *__connman_service_type2string(enum connman_service_type type) return "gadget"; case CONNMAN_SERVICE_TYPE_P2P: return "p2p"; +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: + return "mesh"; +#endif } return NULL; @@ -346,6 +350,8 @@ enum connman_service_security __connman_service_string2security(const char *str) #if defined TIZEN_EXT if (!strcmp(str, "rsn")) return CONNMAN_SERVICE_SECURITY_RSN; + if (!strcmp(str, "sae")) + return CONNMAN_SERVICE_SECURITY_SAE; #endif return CONNMAN_SERVICE_SECURITY_UNKNOWN; @@ -366,6 +372,8 @@ static const char *security2string(enum connman_service_security security) return "psk"; case CONNMAN_SERVICE_SECURITY_RSN: return "rsn"; + case CONNMAN_SERVICE_SECURITY_SAE: + return "sae"; #else case CONNMAN_SERVICE_SECURITY_RSN: return "psk"; @@ -596,6 +604,9 @@ int __connman_service_load_modifiable(struct connman_service *service) case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_P2P: +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: +#endif break; case CONNMAN_SERVICE_TYPE_VPN: set_split_routing(service, g_key_file_get_boolean(keyfile, @@ -671,6 +682,9 @@ static int service_load(struct connman_service *service) case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_P2P: +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: +#endif break; case CONNMAN_SERVICE_TYPE_VPN: set_split_routing(service, g_key_file_get_boolean(keyfile, @@ -786,11 +800,17 @@ static int service_load(struct connman_service *service) dns_method = g_key_file_get_string(keyfile, service->identifier, "Nameservers.IPv4method", NULL); - service->dns_config_method_ipv4 = __connman_dnsconfig_string2method(dns_method); + if (dns_method) { + service->dns_config_method_ipv4 = __connman_dnsconfig_string2method(dns_method); + g_free(dns_method); + } dns_method = g_key_file_get_string(keyfile, service->identifier, "Nameservers.IPv6method", NULL); - service->dns_config_method_ipv6 = __connman_dnsconfig_string2method(dns_method); + if (dns_method) { + service->dns_config_method_ipv6 = __connman_dnsconfig_string2method(dns_method); + g_free(dns_method); + } #endif service->timeservers_config = g_key_file_get_string_list(keyfile, @@ -927,6 +947,9 @@ static int service_save(struct connman_service *service) case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_P2P: +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: +#endif break; case CONNMAN_SERVICE_TYPE_VPN: g_key_file_set_boolean(keyfile, service->identifier, @@ -2156,8 +2179,13 @@ struct connman_service *connman_service_get_default_connection(void) state2string(service->state), __connman_service_type2string(service->type)); +#if defined TIZEN_MAINTAIN_ONLINE + if (service->type == CONNMAN_SERVICE_TYPE_WIFI && + service->state == CONNMAN_SERVICE_STATE_ONLINE) { +#else if (service->type == CONNMAN_SERVICE_TYPE_WIFI && is_connected(service->state) == TRUE) { +#endif return service; } else if (service->type == CONNMAN_SERVICE_TYPE_CELLULAR && __connman_service_is_internet_profile(service) == TRUE) { @@ -2183,6 +2211,9 @@ struct connman_service *connman_service_get_default_connection(void) struct connman_service *__connman_service_get_default(void) { +#if defined TIZEN_MAINTAIN_ONLINE + return connman_service_get_default_connection(); +#else struct connman_service *service; if (!service_list) @@ -2194,6 +2225,7 @@ struct connman_service *__connman_service_get_default(void) return NULL; return service; +#endif } bool __connman_service_index_is_default(int index) @@ -2360,6 +2392,9 @@ static void append_security(DBusMessageIter *iter, void *user_data) case CONNMAN_SERVICE_SECURITY_PSK: case CONNMAN_SERVICE_SECURITY_WPA: case CONNMAN_SERVICE_SECURITY_RSN: +#if defined TIZEN_EXT + case CONNMAN_SERVICE_SECURITY_SAE: +#endif str = "wps"; dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str); @@ -3225,6 +3260,7 @@ static void append_wifi_ext_info(DBusMessageIter *dict, unsigned int ssid_len; unsigned char *bssid; unsigned int maxrate; + int maxspeed; unsigned int keymgmt; uint16_t frequency; const char *enc_mode; @@ -3233,15 +3269,18 @@ static void append_wifi_ext_info(DBusMessageIter *dict, char country_code_buff[WIFI_COUNTRY_CODE_LEN + 1] = {0,}; char *country_code_str = country_code_buff; unsigned char *country_code; + uint16_t connection_mode; ssid = connman_network_get_blob(network, "WiFi.SSID", &ssid_len); bssid = connman_network_get_bssid(network); maxrate = connman_network_get_maxrate(network); + maxspeed = connman_network_get_maxspeed(network); frequency = connman_network_get_frequency(network); enc_mode = connman_network_get_enc_mode(network); passpoint = connman_network_get_bool(network, "WiFi.HS20AP"); keymgmt = connman_network_get_keymgmt(network); country_code = connman_network_get_countrycode(network); + connection_mode = connman_network_get_connection_mode(network); snprintf(bssid_str, WIFI_BSSID_STR_LEN, "%02x:%02x:%02x:%02x:%02x:%02x", bssid[0], bssid[1], bssid[2], @@ -3257,6 +3296,8 @@ static void append_wifi_ext_info(DBusMessageIter *dict, DBUS_TYPE_STRING, &bssid_str); connman_dbus_dict_append_basic(dict, "MaxRate", DBUS_TYPE_UINT32, &maxrate); + connman_dbus_dict_append_basic(dict, "MaxSpeed", + DBUS_TYPE_INT32, &maxspeed); connman_dbus_dict_append_basic(dict, "Frequency", DBUS_TYPE_UINT16, &frequency); connman_dbus_dict_append_basic(dict, "EncryptionMode", @@ -3267,6 +3308,8 @@ static void append_wifi_ext_info(DBusMessageIter *dict, DBUS_TYPE_UINT32, &keymgmt); connman_dbus_dict_append_basic(dict, "Country", DBUS_TYPE_STRING, &country_code_str); + connman_dbus_dict_append_basic(dict, "ConnMode", + DBUS_TYPE_UINT16, &connection_mode); str = connman_network_get_string(network, "WiFi.Security"); if (str != NULL && g_str_equal(str, "ieee8021x") == TRUE) { @@ -3303,6 +3346,35 @@ static void append_wifi_ext_info(DBusMessageIter *dict, DBUS_TYPE_STRING, &str); } } + +static void append_bssid_info(DBusMessageIter *iter, void *user_data) +{ + GSList *bssid_list = NULL; + struct connman_network *network = user_data; + struct connman_bssids *bssids; + char bssid_buf[MAC_ADDRESS_LENGTH] = {0,}; + char *bssid_str = bssid_buf; + + bssid_list = (GSList *)connman_network_get_bssid_list(network); + if(bssid_list) { + GSList *list; + for (list = bssid_list; list; list = list->next) { + bssids = (struct connman_bssids *)list->data; + g_snprintf(bssid_buf, MAC_ADDRESS_LENGTH, "%02x:%02x:%02x:%02x:%02x:%02x", + bssids->bssid[0], bssids->bssid[1], bssids->bssid[2], + bssids->bssid[3], bssids->bssid[4], bssids->bssid[5]); + + connman_dbus_dict_append_basic(iter, "BSSID", + DBUS_TYPE_STRING, &bssid_str); + + connman_dbus_dict_append_basic(iter, "Strength", + DBUS_TYPE_UINT16, &bssids->strength); + + connman_dbus_dict_append_basic(iter, "Frequency", + DBUS_TYPE_UINT16, &bssids->frequency); + } + } +} #endif static void append_properties(DBusMessageIter *dict, dbus_bool_t limited, @@ -3328,7 +3400,6 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited, 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; @@ -3395,6 +3466,9 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited, case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_VPN: case CONNMAN_SERVICE_TYPE_P2P: +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: +#endif break; case CONNMAN_SERVICE_TYPE_CELLULAR: val = service->roaming; @@ -3406,8 +3480,11 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited, break; case CONNMAN_SERVICE_TYPE_WIFI: #if defined TIZEN_EXT - if (service->network != NULL) + if (service->network != NULL) { append_wifi_ext_info(dict, service->network); + connman_dbus_dict_append_dict(dict, "BSSID.List", + append_bssid_info, service->network); + } connman_dbus_dict_append_dict(dict, "Ethernet", append_ethernet, service); @@ -4073,6 +4150,8 @@ int __connman_service_check_passphrase(enum connman_service_security security, case CONNMAN_SERVICE_SECURITY_PSK: #if defined TIZEN_EXT case CONNMAN_SERVICE_SECURITY_RSN: + /* TO CHECK: We need to check the key length supported by SAE */ + case CONNMAN_SERVICE_SECURITY_SAE: #endif /* A raw key is always 64 bytes length, * its content is in hex representation. @@ -4818,6 +4897,19 @@ static DBusMessage *set_property(DBusConnection *conn, } service_save(service); +#if defined TIZEN_EXT + /* When AP is connected using WPS without SSID then its password needs + * to be saved for autoconnection */ + } else if (g_str_equal(name, "Passphrase")) { + char *passphrase; + + if (type != DBUS_TYPE_STRING) + return __connman_error_invalid_arguments(msg); + + dbus_message_iter_get_basic(&value, &passphrase); + + __connman_service_set_passphrase(service, passphrase); +#endif } else return __connman_error_invalid_property(msg); @@ -4998,6 +5090,9 @@ void __connman_service_set_active_session(bool enable, GSList *list) case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_VPN: case CONNMAN_SERVICE_TYPE_P2P: +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: +#endif break; } @@ -5133,6 +5228,12 @@ static bool auto_connect_service(GList *services, ignore[CONNMAN_SERVICE_TYPE_VPN] = true; +#if defined TIZEN_EXT_WIFI_MESH + /* Don't auto connect wifi if mesh interface is created */ + if (connman_mesh_is_interface_created()) + ignore[CONNMAN_SERVICE_TYPE_WIFI] = true; +#endif + for (list = services; list; list = list->next) { service = list->data; @@ -5615,6 +5716,7 @@ static void __connman_service_cleanup_network_8021x(struct connman_service *serv connman_network_set_string(service->network, "WiFi.PrivateKeyFile", NULL); connman_network_set_string(service->network, "WiFi.PrivateKeyPassphrase", NULL); connman_network_set_string(service->network, "WiFi.Phase2", NULL); + connman_network_set_string(service->network, "WiFi.AnonymousIdentity", NULL); } #endif @@ -5979,6 +6081,19 @@ static DBusMessage *get_user_favorite(DBusConnection *conn, return reply; } +#if defined TIZEN_MAINTAIN_ONLINE +static DBusMessage *downgrade_service(DBusConnection *conn, + DBusMessage *msg, void *user_data) +{ + struct connman_service *service = user_data; + + downgrade_state(service); + __connman_connection_update_gateway(); + + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); +} +#endif + static struct _services_notify { int id; GHashTable *add; @@ -6131,6 +6246,9 @@ static const GDBusMethodTable service_methods[] = { { GDBUS_METHOD("GetUserFavorite", NULL, GDBUS_ARGS({ "value", "v" }), get_user_favorite) }, +#if defined TIZEN_MAINTAIN_ONLINE + { GDBUS_METHOD("Downgrade", NULL, NULL, downgrade_service) }, +#endif { }, }; @@ -7088,7 +7206,12 @@ static void __connman_service_disconnect_default(struct connman_service *service default_connecting_device = NULL; } +#if defined TIZEN_MAINTAIN_ONLINE +static void __connman_service_connect_default(struct connman_service *current, + enum connman_service_state old_state) +#else static void __connman_service_connect_default(struct connman_service *current) +#endif { int err; GList *list; @@ -7125,6 +7248,11 @@ static void __connman_service_connect_default(struct connman_service *current) } return; +#if defined TIZEN_MAINTAIN_ONLINE + } else if (current->state == CONNMAN_SERVICE_STATE_READY && + old_state == CONNMAN_SERVICE_STATE_ONLINE) { + DBG("Device is downgraded: online --> ready"); +#endif } else if (is_connected(current->state) == TRUE || is_connecting(current->state) == TRUE) return; @@ -7228,7 +7356,19 @@ static void set_priority_connected_service(void) if (is_connected(service->state) == FALSE) service->order = 5; else +#if defined TIZEN_MAINTAIN_ONLINE + { + if (service->type == CONNMAN_SERVICE_TYPE_WIFI && + service->state == CONNMAN_SERVICE_STATE_ONLINE) + service->order = 6; + else if (service->type != CONNMAN_SERVICE_TYPE_WIFI) + service->order = 6; + else + service->order = 5; + } +#else service->order = 6; +#endif } } #endif @@ -7371,10 +7511,15 @@ static int service_indicate_state(struct connman_service *service) __connman_ipconfig_disable_ipv6( service->ipconfig_ipv6); +#if !defined TIZEN_MAINTAIN_ONLINE if (connman_setting_get_bool("SingleConnectedTechnology")) single_connected_tech(service); else if (service->type != CONNMAN_SERVICE_TYPE_VPN) vpn_auto_connect(); +#else + if (service->type != CONNMAN_SERVICE_TYPE_VPN) + vpn_auto_connect(); +#endif #if defined TIZEN_EXT if (service->type == CONNMAN_SERVICE_TYPE_WIFI) @@ -7384,6 +7529,15 @@ static int service_indicate_state(struct connman_service *service) break; case CONNMAN_SERVICE_STATE_ONLINE: +#if defined TIZEN_MAINTAIN_ONLINE +#if defined TIZEN_EXT + if (service->type == CONNMAN_SERVICE_TYPE_WIFI) + set_priority_connected_service(); +#endif + + if (connman_setting_get_bool("SingleConnectedTechnology")) + single_connected_tech(service); +#endif break; @@ -7453,8 +7607,12 @@ static int service_indicate_state(struct connman_service *service) service_list_sort(); #if defined TIZEN_EXT +#if defined TIZEN_MAINTAIN_ONLINE + __connman_service_connect_default(service, old_state); +#else __connman_service_connect_default(service); #endif +#endif __connman_connection_update_gateway(); @@ -7697,12 +7855,35 @@ static gboolean redo_wispr(gpointer user_data) return FALSE; } +#if defined TIZEN_MAINTAIN_ONLINE +static gboolean redo_wispr_ipv4(gpointer user_data) +{ + struct connman_service *service = user_data; + + DBG(""); + + __connman_wispr_start(service, CONNMAN_IPCONFIG_TYPE_IPV4); + + return FALSE; +} +#endif + int __connman_service_online_check_failed(struct connman_service *service, enum connman_ipconfig_type type) { DBG("service %p type %d count %d", service, type, service->online_check_count); +#if defined TIZEN_MAINTAIN_ONLINE + /* Retry IPv4 stuff also */ + if (type == CONNMAN_IPCONFIG_TYPE_IPV4) { + connman_warn("Online check failed for %p %s", service, + service->name); + + g_timeout_add_seconds(1, redo_wispr_ipv4, service); + return 0; + } +#else /* currently we only retry IPv6 stuff */ if (type == CONNMAN_IPCONFIG_TYPE_IPV4 || service->online_check_count != 1) { @@ -7710,6 +7891,7 @@ int __connman_service_online_check_failed(struct connman_service *service, service->name); return 0; } +#endif service->online_check_count = 0; @@ -7818,6 +8000,10 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service, #if !defined TIZEN_EXT check_proxy_setup(service); #endif +#if defined TIZEN_MAINTAIN_ONLINE +/* if (old_state == CONNMAN_SERVICE_STATE_ONLINE) */ + check_proxy_setup(service); +#endif } else { service->online_check_count = 1; __connman_wispr_start(service, type); @@ -8011,6 +8197,9 @@ static int service_connect(struct connman_service *service) case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_P2P: +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: +#endif return -EINVAL; case CONNMAN_SERVICE_TYPE_ETHERNET: case CONNMAN_SERVICE_TYPE_GADGET: @@ -8027,6 +8216,9 @@ static int service_connect(struct connman_service *service) case CONNMAN_SERVICE_SECURITY_PSK: case CONNMAN_SERVICE_SECURITY_WPA: case CONNMAN_SERVICE_SECURITY_RSN: +#if defined TIZEN_EXT + case CONNMAN_SERVICE_SECURITY_SAE: +#endif if (service->error == CONNMAN_SERVICE_ERROR_INVALID_KEY) return -ENOKEY; @@ -8097,6 +8289,9 @@ static int service_connect(struct connman_service *service) case CONNMAN_SERVICE_SECURITY_PSK: case CONNMAN_SERVICE_SECURITY_WPA: case CONNMAN_SERVICE_SECURITY_RSN: +#if defined TIZEN_EXT + case CONNMAN_SERVICE_SECURITY_SAE: +#endif break; case CONNMAN_SERVICE_SECURITY_8021X: prepare_8021x(service); @@ -8154,6 +8349,9 @@ int __connman_service_connect(struct connman_service *service, case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_P2P: +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: +#endif return -EINVAL; case CONNMAN_SERVICE_TYPE_ETHERNET: @@ -8426,8 +8624,15 @@ static int service_register(struct connman_service *service) DBG("path %s", service->path); +#if defined TIZEN_EXT + service_load(service); + int ret = __connman_config_provision_service(service); + if (ret < 0) + DBG("Failed to provision service"); +#else if (__connman_config_provision_service(service) < 0) service_load(service); +#endif g_dbus_register_interface(connection, service->path, CONNMAN_SERVICE_INTERFACE, @@ -8758,8 +8963,15 @@ unsigned int __connman_service_get_order(struct connman_service *service) service->do_split_routing == FALSE) order = 10; else if (service->type == CONNMAN_SERVICE_TYPE_WIFI) { +#if defined TIZEN_MAINTAIN_ONLINE + if (service->state != CONNMAN_SERVICE_STATE_ONLINE) + service->order = 0; + else if (service->order < 5) + service->order = 5; +#else if (service->order < 5) order = 5; +#endif } else if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET) order = 4; else if (service->type == CONNMAN_SERVICE_TYPE_BLUETOOTH) @@ -8831,6 +9043,8 @@ static enum connman_service_security convert_wifi_security(const char *security) else if (g_str_equal(security, "rsn")) return CONNMAN_SERVICE_SECURITY_RSN; #if defined TIZEN_EXT + else if (g_str_equal(security, "sae")) + return CONNMAN_SERVICE_SECURITY_SAE; else if (g_str_equal(security, "ft_psk") == TRUE) return CONNMAN_SERVICE_SECURITY_PSK; else if (g_str_equal(security, "ft_ieee8021x") == TRUE) @@ -8976,6 +9190,9 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne case CONNMAN_SERVICE_TYPE_WIFI: case CONNMAN_SERVICE_TYPE_CELLULAR: case CONNMAN_SERVICE_TYPE_P2P: +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: +#endif break; case CONNMAN_SERVICE_TYPE_ETHERNET: service->favorite = true; @@ -9007,6 +9224,9 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne case CONNMAN_SERVICE_TYPE_UNKNOWN: case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_P2P: +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: +#endif break; case CONNMAN_SERVICE_TYPE_GADGET: