Add support of SSID and Frequency mixed scan. 33/174933/3
authorNiraj Kumar Goit <niraj.g@samsung.com>
Thu, 5 Apr 2018 06:31:01 +0000 (12:01 +0530)
committerNiraj Kumar Goit <niraj.g@samsung.com>
Mon, 9 Apr 2018 14:06:53 +0000 (19:36 +0530)
Change-Id: I8bad83fafd1681fe5b98aa961453c4c1ddb4168a
Signed-off-by: Niraj Kumar Goit <niraj.g@samsung.com>
include/network_dbus.h
include/network_interface.h
include/network_wlan.h
include/wifi_internal.h
src/network_dbus.c
src/network_interface.c
src/network_signal.c
src/wifi_internal.c
src/wifi_manager.c
test/wifi_manager_test.c

index 3c5fa15b5286614be40a5216531fd18d452443d0..fb77bfce67bb509750da8f8a9e30717fd07ba17b 100755 (executable)
@@ -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();
index 0ec7a68def08a0966b1ed79a0865fe0c90e7d8b6..42114935e8442fca98a2bfec2bc235d670ae3957 100755 (executable)
@@ -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);
index 6f16683f06059e695419c4e0fb50c9f84ab3297b..9b3ca546ab3b64206cb1a921b57cd8ed9f0dfcb4 100755 (executable)
@@ -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
index 45511e8d1f6b0d5e6b3fb3596002932c96fa6a36..61694ce12c340b83ce70177c4544192de6e3db4b 100755 (executable)
@@ -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,
index 4227b3c345143f593b52bb495001add5454f3d9d..a677e33d8f44109e40d5cf1546fecd81bcd407fc 100755 (executable)
@@ -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));
+                       }
                }
        }
 
index c6c1d2d2b8ef6274131a648af04325ad6b8b0427..b86e636601c94d89b645df1140d12e6caa5e370e 100755 (executable)
@@ -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]",
index 8d69f3aabbe3a3693111680ec7a63b45f876e888..07986e18cbb00f60cbda0ca3dc30ff55dd13f44c 100755 (executable)
@@ -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;
                }
        }
index 404b30beaf0fcdce171c75ea0e280e5a3f4646a6..f68f65dcb66e4af4b16d3ca99e02c21d2fc34912 100755 (executable)
@@ -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
index 72640da7d42297525c91904593dcd549983c7649..0635fffa5f5cfe9bf698f7532ec4702af45c6768 100755 (executable)
@@ -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,
index c48a82bd1322e49b51bfb0cf01e3f5f8e4e81392..cdf49704840c3e1a1d2cec082f5c9d1e7883befb 100755 (executable)
@@ -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));