]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Reorganize P2P and WPS scan code
authorLuciano Coelho <coelho@ti.com>
Sat, 15 Oct 2011 14:35:04 +0000 (17:35 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 15 Oct 2011 15:53:13 +0000 (18:53 +0300)
Move some code to separate functions to reorganize the P2P and WPS
handling during scans. This makes the code a bit cleaner and is
needed for the scheduled scan implementation to avoid duplicated code.

Signed-off-by: Luciano Coelho <coelho@ti.com>
wpa_supplicant/scan.c

index 9159d31b9e1546455776ebb0d137243270aac28d..c504028bb189904425255f1ce9b000a195ef7910 100644 (file)
@@ -52,13 +52,13 @@ static void wpa_supplicant_gen_assoc_event(struct wpa_supplicant *wpa_s)
 
 
 #ifdef CONFIG_WPS
-static int wpas_wps_in_use(struct wpa_config *conf,
+static int wpas_wps_in_use(struct wpa_supplicant *wpa_s,
                           enum wps_request_type *req_type)
 {
        struct wpa_ssid *ssid;
        int wps = 0;
 
-       for (ssid = conf->ssid; ssid; ssid = ssid->next) {
+       for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
                if (!(ssid->key_mgmt & WPA_KEY_MGMT_WPS))
                        continue;
 
@@ -71,6 +71,14 @@ static int wpas_wps_in_use(struct wpa_config *conf,
                        return 2;
        }
 
+#ifdef CONFIG_P2P
+       wpa_s->wps->dev.p2p = 1;
+       if (!wps) {
+               wps = 1;
+               *req_type = WPS_REQ_ENROLLEE_INFO;
+       }
+#endif /* CONFIG_P2P */
+
        return wps;
 }
 #endif /* CONFIG_WPS */
@@ -240,16 +248,96 @@ wpa_supplicant_build_filter_ssids(struct wpa_config *conf, size_t *num_ssids)
 }
 
 
-static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx)
+static void wpa_supplicant_optimize_freqs(
+       struct wpa_supplicant *wpa_s, struct wpa_driver_scan_params *params)
+{
+#ifdef CONFIG_P2P
+       if (params->freqs == NULL && wpa_s->p2p_in_provisioning &&
+           wpa_s->go_params) {
+               /* Optimize provisioning state scan based on GO information */
+               if (wpa_s->p2p_in_provisioning < 5 &&
+                   wpa_s->go_params->freq > 0) {
+                       wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Scan only GO "
+                               "preferred frequency %d MHz",
+                               wpa_s->go_params->freq);
+                       params->freqs = os_zalloc(2 * sizeof(int));
+                       if (params->freqs)
+                               params->freqs[0] = wpa_s->go_params->freq;
+               } else if (wpa_s->p2p_in_provisioning < 8 &&
+                          wpa_s->go_params->freq_list[0]) {
+                       wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Scan only common "
+                               "channels");
+                       int_array_concat(&params->freqs,
+                                        wpa_s->go_params->freq_list);
+                       if (params->freqs)
+                               int_array_sort_unique(params->freqs);
+               }
+               wpa_s->p2p_in_provisioning++;
+       }
+#endif /* CONFIG_P2P */
+
+#ifdef CONFIG_WPS
+       if (params->freqs == NULL && wpa_s->after_wps && wpa_s->wps_freq) {
+               /*
+                * Optimize post-provisioning scan based on channel used
+                * during provisioning.
+                */
+               wpa_dbg(wpa_s, MSG_DEBUG, "WPS: Scan only frequency %u MHz "
+                       "that was used during provisioning", wpa_s->wps_freq);
+               params->freqs = os_zalloc(2 * sizeof(int));
+               if (params->freqs)
+                       params->freqs[0] = wpa_s->wps_freq;
+               wpa_s->after_wps--;
+       }
+
+#endif /* CONFIG_WPS */
+}
+
+
+static struct wpabuf *
+wpa_supplicant_extra_ies(struct wpa_supplicant *wpa_s,
+                        struct wpa_driver_scan_params *params)
 {
-       struct wpa_supplicant *wpa_s = eloop_ctx;
-       struct wpa_ssid *ssid;
-       int scan_req = 0, ret;
        struct wpabuf *wps_ie = NULL;
 #ifdef CONFIG_WPS
        int wps = 0;
        enum wps_request_type req_type = WPS_REQ_ENROLLEE_INFO;
+
+       wps = wpas_wps_in_use(wpa_s, &req_type);
+
+       if (wps) {
+               wps_ie = wps_build_probe_req_ie(wps == 2, &wpa_s->wps->dev,
+                                               wpa_s->wps->uuid, req_type,
+                                               0, NULL);
+               if (wps_ie) {
+                       params->extra_ies = wpabuf_head(wps_ie);
+                       params->extra_ies_len = wpabuf_len(wps_ie);
+               }
+       }
+
+#ifdef CONFIG_P2P
+       if (wps_ie) {
+               size_t ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p);
+               if (wpabuf_resize(&wps_ie, ielen) == 0) {
+                       wpas_p2p_scan_ie(wpa_s, wps_ie);
+                       params->extra_ies = wpabuf_head(wps_ie);
+                       params->extra_ies_len = wpabuf_len(wps_ie);
+               }
+       }
+#endif /* CONFIG_P2P */
+
 #endif /* CONFIG_WPS */
+
+       return wps_ie;
+}
+
+
+static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx)
+{
+       struct wpa_supplicant *wpa_s = eloop_ctx;
+       struct wpa_ssid *ssid;
+       int scan_req = 0, ret;
+       struct wpabuf *wps_ie;
        struct wpa_driver_scan_params params;
        size_t max_ssids;
        enum wpa_states prev_state;
@@ -307,10 +395,6 @@ static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx)
                        max_ssids = WPAS_MAX_SCAN_SSIDS;
        }
 
-#ifdef CONFIG_WPS
-       wps = wpas_wps_in_use(wpa_s->conf, &req_type);
-#endif /* CONFIG_WPS */
-
        scan_req = wpa_s->scan_req;
        wpa_s->scan_req = 0;
 
@@ -413,72 +497,8 @@ static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx)
                        "SSID");
        }
 
-#ifdef CONFIG_P2P
-       wpa_s->wps->dev.p2p = 1;
-       if (!wps) {
-               wps = 1;
-               req_type = WPS_REQ_ENROLLEE_INFO;
-       }
-
-       if (params.freqs == NULL && wpa_s->p2p_in_provisioning &&
-           wpa_s->go_params) {
-               /* Optimize provisioning state scan based on GO information */
-               if (wpa_s->p2p_in_provisioning < 5 &&
-                   wpa_s->go_params->freq > 0) {
-                       wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Scan only GO "
-                               "preferred frequency %d MHz",
-                               wpa_s->go_params->freq);
-                       params.freqs = os_zalloc(2 * sizeof(int));
-                       if (params.freqs)
-                               params.freqs[0] = wpa_s->go_params->freq;
-               } else if (wpa_s->p2p_in_provisioning < 8 &&
-                          wpa_s->go_params->freq_list[0]) {
-                       wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Scan only common "
-                               "channels");
-                       int_array_concat(&params.freqs,
-                                        wpa_s->go_params->freq_list);
-                       if (params.freqs)
-                               int_array_sort_unique(params.freqs);
-               }
-               wpa_s->p2p_in_provisioning++;
-       }
-#endif /* CONFIG_P2P */
-
-#ifdef CONFIG_WPS
-       if (params.freqs == NULL && wpa_s->after_wps && wpa_s->wps_freq) {
-               /*
-                * Optimize post-provisioning scan based on channel used
-                * during provisioning.
-                */
-               wpa_dbg(wpa_s, MSG_DEBUG, "WPS: Scan only frequency %u MHz "
-                       "that was used during provisioning", wpa_s->wps_freq);
-               params.freqs = os_zalloc(2 * sizeof(int));
-               if (params.freqs)
-                       params.freqs[0] = wpa_s->wps_freq;
-               wpa_s->after_wps--;
-       }
-
-       if (wps) {
-               wps_ie = wps_build_probe_req_ie(wps == 2, &wpa_s->wps->dev,
-                                               wpa_s->wps->uuid, req_type,
-                                               0, NULL);
-               if (wps_ie) {
-                       params.extra_ies = wpabuf_head(wps_ie);
-                       params.extra_ies_len = wpabuf_len(wps_ie);
-               }
-       }
-#endif /* CONFIG_WPS */
-
-#ifdef CONFIG_P2P
-       if (wps_ie) {
-               size_t ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p);
-               if (wpabuf_resize(&wps_ie, ielen) == 0) {
-                       wpas_p2p_scan_ie(wpa_s, wps_ie);
-                       params.extra_ies = wpabuf_head(wps_ie);
-                       params.extra_ies_len = wpabuf_len(wps_ie);
-               }
-       }
-#endif /* CONFIG_P2P */
+       wpa_supplicant_optimize_freqs(wpa_s, &params);
+       wps_ie = wpa_supplicant_extra_ies(wpa_s, &params);
 
        if (params.freqs == NULL && wpa_s->next_scan_freqs) {
                wpa_dbg(wpa_s, MSG_DEBUG, "Optimize scan based on previously "