From 27bd88dbfac26ca24afc00c6c01bab128b4a5da8 Mon Sep 17 00:00:00 2001 From: Yu Date: Mon, 7 Dec 2020 16:38:44 +0900 Subject: [PATCH] Fix bugs in start/stop service discovery Description: Wrong parameter name was used to start service discovery request. Wrong data type was used to cancel service discovery request Change-Id: I37914cbb948c190f2f05fc7fb3e35b413bee0307 Signed-off-by: Yu jiung (cherry picked from commit 78a7e48f00ea32574e12a05c9681673f80fdb6cc) --- packaging/wifi-direct-manager.spec | 2 +- .../ctrl_iface_dbus/wfd-plugin-wpasupplicant.c | 52 ++++++++++++---------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/packaging/wifi-direct-manager.spec b/packaging/wifi-direct-manager.spec index eaa939a..0a3a1d9 100644 --- a/packaging/wifi-direct-manager.spec +++ b/packaging/wifi-direct-manager.spec @@ -6,7 +6,7 @@ Name: wifi-direct-manager Summary: Wi-Fi Direct manger -Version: 1.3.4 +Version: 1.3.5 Release: 1 Group: Network & Connectivity/Wireless License: Apache-2.0 diff --git a/plugin/wpasupplicant/ctrl_iface_dbus/wfd-plugin-wpasupplicant.c b/plugin/wpasupplicant/ctrl_iface_dbus/wfd-plugin-wpasupplicant.c index 0397990..84049a1 100644 --- a/plugin/wpasupplicant/ctrl_iface_dbus/wfd-plugin-wpasupplicant.c +++ b/plugin/wpasupplicant/ctrl_iface_dbus/wfd-plugin-wpasupplicant.c @@ -6231,22 +6231,22 @@ static wfd_oem_service_s* _remove_service_query(char * s_type, char *mac_str, ch return NULL; } - WDP_LOGD("query id :[0x%s]", query_id); + WDP_LOGD("query id :[%s]", query_id); return data; } -void __add_service_query(GVariant *value, void *mac_addr) +void __add_service_query(GVariant *value, void *user_data) { __WDP_LOG_FUNC_ENTER__; wfd_oem_service_s *service = NULL; long long unsigned ref = 0; - unsigned char *mac_address = (unsigned char *)mac_addr; - char mac_str[18] = {0, }; - int res = 0; + if (!user_data) + return; + g_variant_get(value, "(t)", &ref); service = (wfd_oem_service_s*) g_try_malloc0(sizeof(wfd_oem_service_s)); @@ -6255,15 +6255,9 @@ void __add_service_query(GVariant *value, void *mac_addr) return; } - if (mac_address[0] == 0 && mac_address[1] == 0 && mac_address[2] == 0 && - mac_address[3] == 0 && mac_address[4] == 0 && mac_address[5] == 0) { - g_snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS); - } else { - g_snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_address)); - } + memcpy(service, user_data, sizeof(wfd_oem_service_s)); - g_strlcpy(service->dev_addr, mac_str, OEM_MACSTR_LEN); - g_snprintf(service->query_id, OEM_QUERY_ID_LEN + 1, "0x%llx", ref); + g_snprintf(service->query_id, OEM_QUERY_ID_LEN + 1, "%llx", ref); res = _check_service_query_exists(service); if (res) @@ -6283,6 +6277,7 @@ int ws_start_service_discovery(unsigned char *mac_addr, int service_type) GDBusConnection *g_dbus = NULL; GVariantBuilder *builder = NULL; GVariant *value = NULL; + wfd_oem_service_s data = {0,}; dbus_method_param_s params; static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',}; int i = 0; @@ -6312,7 +6307,7 @@ int ws_start_service_discovery(unsigned char *mac_addr, int service_type) builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - if (mac_addr) { + if (mac_addr && !ISZEROMACADDR(mac_addr)) { g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/" COMPACT_MACSTR, g_pd->iface_path, MAC2STR(mac_addr)); WDP_LOGD("get peer path [%s]", peer_path); @@ -6329,11 +6324,14 @@ int ws_start_service_discovery(unsigned char *mac_addr, int service_type) g_variant_builder_add(query, "y", service_all[i]); g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query)); g_variant_builder_unref(query); + g_strlcpy(data.service_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN + 1); - } else if (service_type == WFD_OEM_SERVICE_TYPE_UPNP) { + } else if (service_type == WFD_OEM_SERVICE_TYPE_UPNP) { g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp")); - g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE)); + g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10)); + g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string("ssdp:all")); + g_strlcpy(data.service_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN + 1); } else if (service_type == WFD_OEM_SERVICE_TYPE_BONJOUR) { @@ -6343,8 +6341,9 @@ int ws_start_service_discovery(unsigned char *mac_addr, int service_type) query = g_variant_builder_new(G_VARIANT_TYPE("ay")); for (i = 0; i < SERVICE_QUERY_LEN; i++) g_variant_builder_add(query, "y", service_bonjour[i]); - g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query)); + g_variant_builder_add(builder, "{sv}", "tlv", g_variant_new("ay", query)); g_variant_builder_unref(query); + g_strlcpy(data.service_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN + 1); } value = g_variant_new("(a{sv})", builder); @@ -6353,7 +6352,12 @@ int ws_start_service_discovery(unsigned char *mac_addr, int service_type) params.params = value; DEBUG_G_VARIANT("Params : ", params.params); - res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, __add_service_query, mac_addr); + if (ISZEROMACADDR(mac_addr)) + snprintf(data.dev_addr, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS); + else + snprintf(data.dev_addr, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr)); + + res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, __add_service_query, &data); if (res < 0) WDP_LOGE("Failed to send command to wpa_supplicant"); else @@ -6372,6 +6376,7 @@ int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type) char query_id[OEM_QUERY_ID_LEN + 1] = {0, }; char s_type[OEM_SERVICE_TYPE_LEN + 1] = {0, }; char mac_str[18] = {0, }; + long long unsigned id; int res = 0; @@ -6394,8 +6399,7 @@ int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type) return -1; } - if (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 && - mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0) { + if (ISZEROMACADDR(mac_addr)) { snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS); } else { snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr)); @@ -6428,8 +6432,8 @@ int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type) memset(¶ms, 0x0, sizeof(dbus_method_param_s)); dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest", g_pd->iface_path, g_dbus); - - params.params = g_variant_new("(t)", strtoul(query_id, NULL, 16)); + id = (long long unsigned)strtoul(query_id, NULL, 16); + params.params = g_variant_new("(t)", id); res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL); if (res < 0) @@ -6487,7 +6491,7 @@ int ws_serv_add(wfd_oem_new_service_s *service) } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) { g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp")); - g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE)); + g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10)); g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service)); } @@ -6549,7 +6553,7 @@ int ws_serv_del(wfd_oem_new_service_s *service) } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) { g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp")); - g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE)); + g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10)); g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service)); } -- 2.7.4