#include "driver_i.h"
#include "mlme.h"
#include "wps_supplicant.h"
+#include "p2p_supplicant.h"
+#include "p2p/p2p.h"
#include "notify.h"
#include "bss.h"
#include "scan.h"
wpa_printf(MSG_DEBUG, "Starting AP scan for wildcard 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_printf(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->go_params->freq_list[0]) {
+ wpa_printf(MSG_DEBUG, "P2P: Scan only common "
+ "channels");
+ int_array_concat(¶ms.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) {
/*
}
#endif /* CONFIG_WPS */
+#ifdef CONFIG_P2P
+ if (wps_ie) {
+ if (wpabuf_resize(&wps_ie, 100) == 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 */
+
params.filter_ssids = wpa_supplicant_build_filter_ssids(
wpa_s->conf, ¶ms.num_filter_ssids);
}
+struct wpabuf * wpa_scan_get_vendor_ie_multi_beacon(
+ const struct wpa_scan_res *res, u32 vendor_type)
+{
+ struct wpabuf *buf;
+ const u8 *end, *pos;
+
+ if (res->beacon_ie_len == 0)
+ return NULL;
+ buf = wpabuf_alloc(res->beacon_ie_len);
+ if (buf == NULL)
+ return NULL;
+
+ pos = (const u8 *) (res + 1);
+ pos += res->ie_len;
+ end = pos + res->beacon_ie_len;
+
+ while (pos + 1 < end) {
+ if (pos + 2 + pos[1] > end)
+ break;
+ if (pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 &&
+ vendor_type == WPA_GET_BE32(&pos[2]))
+ wpabuf_put_data(buf, pos + 2 + 4, pos[1] - 4);
+ pos += 2 + pos[1];
+ }
+
+ if (wpabuf_len(buf) == 0) {
+ wpabuf_free(buf);
+ buf = NULL;
+ }
+
+ return buf;
+}
+
+
/* Compare function for sorting scan results. Return >0 if @b is considered
* better. */
static int wpa_scan_result_compar(const void *a, const void *b)