From: Niraj Kumar Goit Date: Thu, 5 Apr 2018 06:31:01 +0000 (+0530) Subject: Add support of SSID and Frequency mixed scan. X-Git-Tag: submit/tizen/20180416.224602~2^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ba0bcd25e41fa188660eddc6395fe941cc522e71;p=platform%2Fcore%2Fapi%2Fwifi-manager.git Add support of SSID and Frequency mixed scan. Change-Id: I8bad83fafd1681fe5b98aa961453c4c1ddb4168a Signed-off-by: Niraj Kumar Goit --- diff --git a/include/network_dbus.h b/include/network_dbus.h index 3c5fa15..fb77bfc 100755 --- a/include/network_dbus.h +++ b/include/network_dbus.h @@ -110,7 +110,7 @@ int _net_dbus_bssid_scan_request(void); int _net_dbus_netlink_scan_request(GSList *nl_scan_list, const char *vsie); int _net_dbus_get_passpoint(int *enabled); int _net_dbus_set_passpoint(int enable); -int _net_dbus_multi_scan_request(GSList *multi_scan_list, int type); +int _net_dbus_multi_scan_request(GSList *multi_scan_list); int _net_dbus_cancel_wps(void); int _net_dbus_open_connection_without_ssid(); diff --git a/include/network_interface.h b/include/network_interface.h index 0ec7a68..4211493 100755 --- a/include/network_interface.h +++ b/include/network_interface.h @@ -268,7 +268,7 @@ int net_netlink_scan_wifi(GSList *nl_scan_list, const char *vsie); int net_wifi_get_passpoint(int *enable); int net_wifi_set_passpoint(int enable); int net_wifi_get_scan_state(int *scan_state); -int net_multi_scan_wifi(GSList *specific_scan_list, int type); +int net_multi_scan_wifi(GSList *specific_scan_list, gboolean multi_scan_type[]); int net_wifi_add_vsie(unsigned int frame_id, const char *vsie_str); int net_wifi_get_vsie(unsigned int frame_id, char **vsie_str); diff --git a/include/network_wlan.h b/include/network_wlan.h index 6f16683..9b3ca54 100755 --- a/include/network_wlan.h +++ b/include/network_wlan.h @@ -34,6 +34,9 @@ extern "C" { /** Length of BSSID */ #define NET_WLAN_BSSID_LEN 17 +/** Length of Frequency */ +#define NET_WLAN_FREQ_LEN 5 + /** * Length of WPS PIN code * WPS PIN code should be 4 or 8 digits diff --git a/include/wifi_internal.h b/include/wifi_internal.h index 45511e8..61694ce 100755 --- a/include/wifi_internal.h +++ b/include/wifi_internal.h @@ -109,8 +109,16 @@ typedef enum { typedef enum { WIFI_MULTI_SCAN_SSID = 0x01, WIFI_MULTI_SCAN_FREQ, + WIFI_MULTI_SCAN_SSID_FREQ, + WIFI_MULTI_SCAN_MAX, } wifi_manager_multi_scan_e; +typedef struct { + /** store both AP name and frequency */ + char str[NET_WLAN_ESSID_LEN + 1]; + gboolean flag; +} wifi_manager_multi_scan_ap_s; + typedef struct { int count; net_profile_info_s *profiles; @@ -276,9 +284,9 @@ void _wifi_add_to_multi_scan_list(wifi_manager_specific_scan_h *specific_scan); void _wifi_remove_from_multi_scan_list(wifi_manager_specific_scan_h specific_scan); int _wifi_specific_scan_create(wifi_manager_specific_scan_h *specific_scan); -void _wifi_specific_scan_set_ssid(wifi_manager_specific_scan_h specific_scan, +int _wifi_specific_scan_set_ssid(wifi_manager_specific_scan_h specific_scan, const char *ssid); -void _wifi_specific_scan_set_freq(wifi_manager_specific_scan_h specific_scan, +int _wifi_specific_scan_set_freq(wifi_manager_specific_scan_h specific_scan, int freq); int _wifi_start_multi_scan(wifi_manager_h wifi, wifi_manager_specific_scan_h specific_scan, diff --git a/src/network_dbus.c b/src/network_dbus.c index 4227b3c..a677e33 100755 --- a/src/network_dbus.c +++ b/src/network_dbus.c @@ -3273,7 +3273,7 @@ static void __net_multi_scan_request_reply(GObject *source_object, GAsyncResult __NETWORK_FUNC_EXIT__; } -int _net_dbus_multi_scan_request(GSList *multi_scan_list, int type) +int _net_dbus_multi_scan_request(GSList *multi_scan_list) { __NETWORK_FUNC_ENTER__; @@ -3282,25 +3282,37 @@ int _net_dbus_multi_scan_request(GSList *multi_scan_list, int type) GVariant *params = NULL; GVariantBuilder *builder; char ssid[NET_WLAN_ESSID_LEN] = {0, }; - int freq = 0; + char freq[NET_WLAN_FREQ_LEN] = {0, }; - WIFI_LOG(WIFI_INFO, "Number of elements in a list: %d", g_slist_length(multi_scan_list)); + WIFI_LOG(WIFI_INFO, "multi_scan_type:%d, Number of elements in a list:%d", + request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_type, + g_slist_length(multi_scan_list)); builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - if (type == WIFI_MULTI_SCAN_SSID) { + if (request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_type == WIFI_MULTI_SCAN_SSID) { for (list = multi_scan_list; list; list = list->next) { - WIFI_LOG(WIFI_INFO, "AP name: %s", (char *)list->data); - g_strlcpy(ssid, (char *)list->data, NET_WLAN_ESSID_LEN); - + WIFI_LOG(WIFI_INFO, "AP name: %s", ((wifi_manager_multi_scan_ap_s *)list->data)->str); + g_strlcpy(ssid, ((wifi_manager_multi_scan_ap_s *)list->data)->str, NET_WLAN_ESSID_LEN); g_variant_builder_add(builder, "{sv}", "SSID", g_variant_new_string(ssid)); } + } else if (request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_type == WIFI_MULTI_SCAN_FREQ) { + for (list = multi_scan_list; list; list = list->next) { + WIFI_LOG(WIFI_INFO, "Freq: %s", ((wifi_manager_multi_scan_ap_s *)list->data)->str); + g_strlcpy(freq, ((wifi_manager_multi_scan_ap_s *)list->data)->str, NET_WLAN_FREQ_LEN); + g_variant_builder_add(builder, "{sv}", "Frequency", g_variant_new_string(freq)); + } } else { for (list = multi_scan_list; list; list = list->next) { - WIFI_LOG(WIFI_INFO, "freq: %d", GPOINTER_TO_INT(list->data)); - freq = GPOINTER_TO_INT(list->data); - - g_variant_builder_add(builder, "{sv}", "Frequency", g_variant_new_uint16(freq)); + if (((wifi_manager_multi_scan_ap_s *)list->data)->flag == true) { + WIFI_LOG(WIFI_INFO, "[Mixed]AP name: %s", ((wifi_manager_multi_scan_ap_s *)list->data)->str); + g_strlcpy(ssid, ((wifi_manager_multi_scan_ap_s *)list->data)->str, NET_WLAN_ESSID_LEN); + g_variant_builder_add(builder, "{sv}", "SSID_Mixed", g_variant_new_string(ssid)); + } else { + WIFI_LOG(WIFI_INFO, "[Mixed]Freq: %s", ((wifi_manager_multi_scan_ap_s *)list->data)->str); + g_strlcpy(freq, ((wifi_manager_multi_scan_ap_s *)list->data)->str, NET_WLAN_FREQ_LEN); + g_variant_builder_add(builder, "{sv}", "Frequency_Mixed", g_variant_new_string(freq)); + } } } diff --git a/src/network_interface.c b/src/network_interface.c index c6c1d2d..b86e636 100755 --- a/src/network_interface.c +++ b/src/network_interface.c @@ -1548,7 +1548,7 @@ int net_netlink_scan_wifi(GSList *nl_scan_list, const char *vsie) return Error; } -int net_multi_scan_wifi(GSList *multi_scan_list, int type) +int net_multi_scan_wifi(GSList *multi_scan_list, gboolean multi_scan_type[]) { __NETWORK_FUNC_ENTER__; @@ -1587,13 +1587,17 @@ int net_multi_scan_wifi(GSList *multi_scan_list, int type) } request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].flag = TRUE; - request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_type = type; - if (type == WIFI_MULTI_SCAN_SSID) - request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_list = g_slist_copy_deep(multi_scan_list, (GCopyFunc)g_strdup, NULL); - else - request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_list = g_slist_copy(multi_scan_list); + if (multi_scan_type[WIFI_MULTI_SCAN_SSID] == true && + multi_scan_type[WIFI_MULTI_SCAN_FREQ] == true) + request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_type = WIFI_MULTI_SCAN_SSID_FREQ; + else if (multi_scan_type[WIFI_MULTI_SCAN_SSID] == true) + request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_type = WIFI_MULTI_SCAN_SSID; + else if (multi_scan_type[WIFI_MULTI_SCAN_FREQ] == true) + request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_type = WIFI_MULTI_SCAN_FREQ; + + request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_list = g_slist_copy_deep(multi_scan_list, (GCopyFunc)g_try_malloc0, NULL); - Error = _net_dbus_multi_scan_request(multi_scan_list, type); + Error = _net_dbus_multi_scan_request(multi_scan_list); if (Error != NET_ERR_NONE) { WIFI_LOG(WIFI_ERROR, //LCOV_EXCL_LINE "_net_dbus_multi_scan_request() failed. Error [%s]", diff --git a/src/network_signal.c b/src/network_signal.c index 8d69f3a..07986e1 100755 --- a/src/network_signal.c +++ b/src/network_signal.c @@ -906,10 +906,9 @@ static int __net_handle_scan_done(GVariant *param) Error = _net_dbus_specific_scan_request(request_table[NETWORK_REQUEST_TYPE_SPECIFIC_SCAN].ssid); return Error; } else if (current_scan_type == NETWORK_SCAN_TYPE_MULTI_SCAN) { - int type = request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_type; GSList *list = request_table[NETWORK_REQUEST_TYPE_MULTI_SCAN].multi_scan_list; - Error = _net_dbus_multi_scan_request(list, type); + Error = _net_dbus_multi_scan_request(list); return Error; } } diff --git a/src/wifi_internal.c b/src/wifi_internal.c index 404b30b..f68f65d 100755 --- a/src/wifi_internal.c +++ b/src/wifi_internal.c @@ -25,7 +25,7 @@ bool is_disconnect_wps_pbc = false; bool is_disconnect_wps_pin = false; -static int multi_scan_type = -1; +static gboolean multi_scan_type[WIFI_MULTI_SCAN_MAX] = {0, }; #define WIFI_SECURITY_NONE "none" #define WIFI_SECURITY_WEP "wep" @@ -3128,13 +3128,13 @@ void _wifi_remove_from_multi_scan_list(wifi_manager_specific_scan_h specific_sca GSList *list = (GSList *)specific_scan; GSList *multi_scan_list = list->next; - if (multi_scan_type == WIFI_MULTI_SCAN_SSID) - g_slist_free_full(multi_scan_list, g_free); + g_slist_free_full(multi_scan_list, g_free); multi_scan_handle_list = g_slist_remove(multi_scan_handle_list, specific_scan); g_free(specific_scan); specific_scan = NULL; - multi_scan_type = -1; + multi_scan_type[WIFI_MULTI_SCAN_SSID] = false; + multi_scan_type[WIFI_MULTI_SCAN_FREQ] = false; } int _wifi_specific_scan_create(wifi_manager_specific_scan_h *specific_scan) @@ -3150,26 +3150,47 @@ int _wifi_specific_scan_create(wifi_manager_specific_scan_h *specific_scan) return WIFI_MANAGER_ERROR_NONE; } -void _wifi_specific_scan_set_ssid(wifi_manager_specific_scan_h specific_scan, +int _wifi_specific_scan_set_ssid(wifi_manager_specific_scan_h specific_scan, const char *essid) { GSList *list = (GSList *)specific_scan; + wifi_manager_multi_scan_ap_s *ap = (wifi_manager_multi_scan_ap_s*)g_try_malloc0(sizeof(wifi_manager_multi_scan_ap_s)); - list = g_slist_append(list, g_strdup(essid)); - multi_scan_type = WIFI_MULTI_SCAN_SSID; + if (!ap) { + WIFI_LOG(WIFI_ERROR, "Failed to allocate memory"); + return WIFI_MANAGER_ERROR_OUT_OF_MEMORY; + } + g_strlcpy(ap->str, essid, NET_WLAN_ESSID_LEN); + ap->flag = true; + + list = g_slist_append(list, ap); + multi_scan_type[WIFI_MULTI_SCAN_SSID] = true; specific_scan = (wifi_manager_specific_scan_h)list; + return WIFI_MANAGER_ERROR_NONE; } -void _wifi_specific_scan_set_freq(wifi_manager_specific_scan_h specific_scan, +int _wifi_specific_scan_set_freq(wifi_manager_specific_scan_h specific_scan, int freq) { GSList *list = (GSList *)specific_scan; + char str[5]; + snprintf(str, 5, "%d", freq); + + wifi_manager_multi_scan_ap_s *ap = (wifi_manager_multi_scan_ap_s*)g_try_malloc0(sizeof(wifi_manager_multi_scan_ap_s)); + + if (!ap) { + WIFI_LOG(WIFI_ERROR, "Failed to allocate memory"); + return WIFI_MANAGER_ERROR_OUT_OF_MEMORY; + } + g_strlcpy(ap->str, str, NET_WLAN_FREQ_LEN); + ap->flag = false; - list = g_slist_append(list, GINT_TO_POINTER(freq)); - multi_scan_type = WIFI_MULTI_SCAN_FREQ; + list = g_slist_append(list, ap); + multi_scan_type[WIFI_MULTI_SCAN_FREQ] = true; specific_scan = (wifi_manager_specific_scan_h)list; + return WIFI_MANAGER_ERROR_NONE; } int _wifi_start_multi_scan(wifi_manager_h wifi, @@ -3180,11 +3201,6 @@ int _wifi_start_multi_scan(wifi_manager_h wifi, GSList *multi_scan_list = (GSList *)specific_scan; - if (multi_scan_type == -1) { - WIFI_LOG(WIFI_ERROR, "SSID/Freq not set for multi scan"); - return WIFI_MANAGER_ERROR_INVALID_OPERATION; - } - rv = net_multi_scan_wifi(multi_scan_list->next, multi_scan_type); if (rv == NET_ERR_ACCESS_DENIED) { WIFI_LOG(WIFI_ERROR, "Access denied"); //LCOV_EXCL_LINE diff --git a/src/wifi_manager.c b/src/wifi_manager.c index 72640da..0635fff 100755 --- a/src/wifi_manager.c +++ b/src/wifi_manager.c @@ -1709,10 +1709,8 @@ EXPORT_API int wifi_manager_specific_scan_set_ssid(wifi_manager_specific_scan_h return WIFI_MANAGER_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE } - _wifi_specific_scan_set_ssid(specific_scan, essid); - __NETWORK_CAPI_FUNC_EXIT__; - return WIFI_MANAGER_ERROR_NONE; + return _wifi_specific_scan_set_ssid(specific_scan, essid); } EXPORT_API int wifi_manager_specific_scan_set_freq(wifi_manager_specific_scan_h specific_scan, @@ -1728,10 +1726,8 @@ EXPORT_API int wifi_manager_specific_scan_set_freq(wifi_manager_specific_scan_h return WIFI_MANAGER_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE } - _wifi_specific_scan_set_freq(specific_scan, freq); - __NETWORK_CAPI_FUNC_EXIT__; - return WIFI_MANAGER_ERROR_NONE; + return _wifi_specific_scan_set_freq(specific_scan, freq); } EXPORT_API int wifi_manager_specific_ap_start_multi_scan(wifi_manager_h wifi, diff --git a/test/wifi_manager_test.c b/test/wifi_manager_test.c index c48a82b..cdf4970 100755 --- a/test/wifi_manager_test.c +++ b/test/wifi_manager_test.c @@ -2863,23 +2863,53 @@ int test_wifi_manager_specific_ap_start_multi_scan(void) printf("Specific Scan handle created [%p]\n", specific_scan); rv = test_get_user_int("Input multi scan type" - "(0:SSID, 1:Freq):", &scan_type); + "(0:SSID, 1:Freq, 2: SSID & Freq):", &scan_type); - if (rv == false || (scan_type != 0 && scan_type != 1)) { + if (rv == false || (scan_type != 0 && scan_type != 1 && scan_type != 2)) { printf("Invalid input!!\n"); return false; } - rv = test_get_user_int("No. of specific ssid/freq for multi scan", - &num); - if (rv == false || (num <= 0) || (num > 10)) { - printf("Invalid input!!\n"); - return false; - } + if (scan_type == 0 || scan_type == 1) { + rv = test_get_user_int("No. of specific ssid/freq for multi scan", + &num); + if (rv == false || (num <= 0) || (num > 4)) { + printf("Invalid input!!\n"); + return false; + } + + if (scan_type == 0) { /** multi ssid scan */ + for (i = 0; i < num; i++) { + printf("Input ssid[%d]:\n", i); + rv = scanf("%32s", ssid); + + rv = wifi_manager_specific_scan_set_ssid(specific_scan, ssid); + if (rv != WIFI_MANAGER_ERROR_NONE) { + printf("Failed to set ssid [%s]", __test_convert_error_to_string(rv)); + return -1; + } + } + } else { /** multi frequency scan */ + for (i = 0; i < num; i++) { + printf("Input freq[%d]:\n", i); + rv = scanf("%d", &freq); + rv = wifi_manager_specific_scan_set_freq(specific_scan, freq); + if (rv != WIFI_MANAGER_ERROR_NONE) { + printf("Failed to set freq [%s]", __test_convert_error_to_string(rv)); + return -1; + } + } + } + } else { /** SSID & frequency mixed scan */ + rv = test_get_user_int("No. of ssid&freq for dual parameter multi scan", + &num); + if (rv == false || (num <= 0) || (num > 4)) { + printf("Invalid input!!\n"); + return false; + } - if (scan_type == 0) { for (i = 0; i < num; i++) { - printf("Input ssid[%d]:\n", i); + printf("Input ssid:\n"); rv = scanf("%32s", ssid); rv = wifi_manager_specific_scan_set_ssid(specific_scan, ssid); @@ -2887,11 +2917,9 @@ int test_wifi_manager_specific_ap_start_multi_scan(void) printf("Failed to set ssid [%s]", __test_convert_error_to_string(rv)); return -1; } - } - } else { - for (i = 0; i < num; i++) { - printf("Input freq[%d]:\n", i); + printf("Input freq:\n"); rv = scanf("%d", &freq); + rv = wifi_manager_specific_scan_set_freq(specific_scan, freq); if (rv != WIFI_MANAGER_ERROR_NONE) { printf("Failed to set freq [%s]", __test_convert_error_to_string(rv));