X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Fconnman.git;a=blobdiff_plain;f=src%2Fservice.c;h=d1ada486189d7b6bcda754cf4ad7b99348ce832e;hp=d7a70395ec99ee52c88bac1ef8c8814974b84b5c;hb=a48fa9fdffe415e9a6f703776b5db795e242ac23;hpb=54dcb380e2e7af1e62c29d57277228890f49cd75 diff --git a/src/service.c b/src/service.c old mode 100755 new mode 100644 index d7a7039..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, @@ -933,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, @@ -2162,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) { @@ -2189,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) @@ -2200,6 +2225,7 @@ struct connman_service *__connman_service_get_default(void) return NULL; return service; +#endif } bool __connman_service_index_is_default(int index) @@ -2366,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); @@ -3231,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; @@ -3239,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], @@ -3263,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", @@ -3273,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) { @@ -3312,29 +3349,31 @@ static void append_wifi_ext_info(DBusMessageIter *dict, static void append_bssid_info(DBusMessageIter *iter, void *user_data) { - GSList *bssid_list = NULL; + GSList *bssid_list = NULL; struct connman_network *network = user_data; - struct connman_bssids *bssids; - char bssid_buf[18] = {0,}; - char *bssid_str = bssid_buf; + 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; - memcpy(bssid_str, bssids->bssid, 18); + 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); + DBUS_TYPE_STRING, &bssid_str); - connman_dbus_dict_append_basic(iter, "Strength", - DBUS_TYPE_UINT16, &bssids->strength); + connman_dbus_dict_append_basic(iter, "Strength", + DBUS_TYPE_UINT16, &bssids->strength); - connman_dbus_dict_append_basic(iter, "Frequency", - DBUS_TYPE_UINT16, &bssids->frequency); - } - } + connman_dbus_dict_append_basic(iter, "Frequency", + DBUS_TYPE_UINT16, &bssids->frequency); + } + } } #endif @@ -3427,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; @@ -4108,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. @@ -5046,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; } @@ -5181,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; @@ -6028,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; @@ -6180,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 { }, }; @@ -7137,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; @@ -7174,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; @@ -7277,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 @@ -7420,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) @@ -7433,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; @@ -7502,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(); @@ -7746,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) { @@ -7759,6 +7891,7 @@ int __connman_service_online_check_failed(struct connman_service *service, service->name); return 0; } +#endif service->online_check_count = 0; @@ -7867,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); @@ -8060,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: @@ -8076,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; @@ -8146,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); @@ -8203,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: @@ -8475,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, @@ -8807,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) @@ -8880,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) @@ -9025,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; @@ -9056,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: