Lines Matching +full:drv +full:- +full:0

2  * Driver interaction with Linux nl80211/cfg80211 - Scanning
4 * Copyright (c) 2002-2014, Jouni Malinen <j@w1.fi>
6 * Copyright (c) 2009-2010, Atheros Communications
20 #include "common/qca-vendor.h"
43 if (info->count >= MAX_NL80211_NOISE_FREQS) in get_noise_for_scan_results()
46 nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), in get_noise_for_scan_results()
47 genlmsg_attrlen(gnlh, 0), NULL); in get_noise_for_scan_results()
68 info->freq[info->count] = in get_noise_for_scan_results()
70 info->noise[info->count] = in get_noise_for_scan_results()
72 info->count++; in get_noise_for_scan_results()
79 struct wpa_driver_nl80211_data *drv, struct nl80211_noise_info *info) in nl80211_get_noise_for_scan_results() argument
83 os_memset(info, 0, sizeof(*info)); in nl80211_get_noise_for_scan_results()
84 msg = nl80211_drv_msg(drv, NLM_F_DUMP, NL80211_CMD_GET_SURVEY); in nl80211_get_noise_for_scan_results()
85 return send_and_recv_resp(drv, msg, get_noise_for_scan_results, info); in nl80211_get_noise_for_scan_results()
93 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_abort_scan() local
96 msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_ABORT_SCAN); in nl80211_abort_scan()
97 ret = send_and_recv_cmd(drv, msg); in nl80211_abort_scan()
100 ret, strerror(-ret)); in nl80211_abort_scan()
107 static int nl80211_abort_vendor_scan(struct wpa_driver_nl80211_data *drv, in nl80211_abort_vendor_scan() argument
114 wpa_printf(MSG_DEBUG, "nl80211: Abort vendor scan with cookie 0x%llx", in nl80211_abort_vendor_scan()
117 msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR); in nl80211_abort_vendor_scan()
128 ret = send_and_recv_cmd(drv, msg); in nl80211_abort_vendor_scan()
132 "nl80211: Aborting vendor scan with cookie 0x%llx failed: ret=%d (%s)", in nl80211_abort_vendor_scan()
134 strerror(-ret)); in nl80211_abort_vendor_scan()
137 return 0; in nl80211_abort_vendor_scan()
140 return -1; in nl80211_abort_vendor_scan()
146 * wpa_driver_nl80211_scan_timeout - Scan timeout to report scan completion
155 struct wpa_driver_nl80211_data *drv = eloop_ctx; in wpa_driver_nl80211_scan_timeout() local
157 wpa_printf(MSG_DEBUG, "nl80211: Scan timeout - try to abort it"); in wpa_driver_nl80211_scan_timeout()
159 if (drv->vendor_scan_cookie && in wpa_driver_nl80211_scan_timeout()
160 nl80211_abort_vendor_scan(drv, drv->vendor_scan_cookie) == 0) in wpa_driver_nl80211_scan_timeout()
163 if (!drv->vendor_scan_cookie && in wpa_driver_nl80211_scan_timeout()
164 nl80211_abort_scan(drv->first_bss) == 0) in wpa_driver_nl80211_scan_timeout()
169 if (drv->ap_scan_as_station != NL80211_IFTYPE_UNSPECIFIED) in wpa_driver_nl80211_scan_timeout()
170 nl80211_restore_ap_mode(drv->first_bss); in wpa_driver_nl80211_scan_timeout()
181 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_scan_common() local
184 u32 scan_flags = 0; in nl80211_scan_common()
186 msg = nl80211_cmd_msg(bss, 0, cmd); in nl80211_scan_common()
190 if (params->num_ssids) { in nl80211_scan_common()
196 for (i = 0; i < params->num_ssids; i++) { in nl80211_scan_common()
198 wpa_ssid_txt(params->ssids[i].ssid, in nl80211_scan_common()
199 params->ssids[i].ssid_len)); in nl80211_scan_common()
200 if (nla_put(msg, i + 1, params->ssids[i].ssid_len, in nl80211_scan_common()
201 params->ssids[i].ssid)) in nl80211_scan_common()
209 * to be scanned, it is highly likely that non-PSC channels in nl80211_scan_common()
211 * transmission restrictions mandated in IEEE Std 802.11ax-2021, in nl80211_scan_common()
213 * all non-PSC channels would take a significant amount of time. in nl80211_scan_common()
215 if (!params->non_coloc_6ghz) { in nl80211_scan_common()
217 "nl80211: Scan co-located APs on 6 GHz"); in nl80211_scan_common()
224 if (params->extra_ies) { in nl80211_scan_common()
226 params->extra_ies, params->extra_ies_len); in nl80211_scan_common()
227 if (nla_put(msg, NL80211_ATTR_IE, params->extra_ies_len, in nl80211_scan_common()
228 params->extra_ies)) in nl80211_scan_common()
232 if (params->freqs) { in nl80211_scan_common()
237 for (i = 0; params->freqs[i]; i++) { in nl80211_scan_common()
239 "MHz", params->freqs[i]); in nl80211_scan_common()
240 if (nla_put_u32(msg, i + 1, params->freqs[i])) in nl80211_scan_common()
246 os_free(drv->filter_ssids); in nl80211_scan_common()
247 drv->filter_ssids = params->filter_ssids; in nl80211_scan_common()
248 params->filter_ssids = NULL; in nl80211_scan_common()
249 drv->num_filter_ssids = params->num_filter_ssids; in nl80211_scan_common()
251 if (!drv->hostapd && is_ap_interface(drv->nlmode)) { in nl80211_scan_common()
256 if (params->only_new_results) { in nl80211_scan_common()
261 if (params->low_priority && drv->have_low_prio_scan) { in nl80211_scan_common()
267 if (params->mac_addr_rand) { in nl80211_scan_common()
272 if (params->mac_addr) { in nl80211_scan_common()
274 MAC2STR(params->mac_addr)); in nl80211_scan_common()
276 params->mac_addr)) in nl80211_scan_common()
280 if (params->mac_addr_mask) { in nl80211_scan_common()
282 MACSTR, MAC2STR(params->mac_addr_mask)); in nl80211_scan_common()
284 params->mac_addr_mask)) in nl80211_scan_common()
289 if (params->duration) { in nl80211_scan_common()
290 if (!(drv->capa.rrm_flags & in nl80211_scan_common()
293 params->duration)) in nl80211_scan_common()
296 if (params->duration_mandatory && in nl80211_scan_common()
302 if (params->oce_scan) { in nl80211_scan_common()
317 if (params->min_probe_req_content) { in nl80211_scan_common()
318 if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_SCAN_MIN_PREQ) in nl80211_scan_common()
338 * wpa_driver_nl80211_scan - Request the driver to initiate scan
341 * Returns: 0 on success, -1 on failure
346 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_scan() local
347 int ret = -1, timeout; in wpa_driver_nl80211_scan()
350 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: scan request"); in wpa_driver_nl80211_scan()
351 drv->scan_for_auth = 0; in wpa_driver_nl80211_scan()
354 return -1; in wpa_driver_nl80211_scan()
358 return -1; in wpa_driver_nl80211_scan()
360 if (params->p2p_probe) { in wpa_driver_nl80211_scan()
363 wpa_printf(MSG_DEBUG, "nl80211: P2P probe - mask SuppRates"); in wpa_driver_nl80211_scan()
372 * 9, 12, 18, 24, 36, 48, 54 Mbps from non-MCS rates. All 5 GHz in wpa_driver_nl80211_scan()
384 if (params->bssid) { in wpa_driver_nl80211_scan()
386 MACSTR, MAC2STR(params->bssid)); in wpa_driver_nl80211_scan()
387 if (nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid)) in wpa_driver_nl80211_scan()
394 if (!params->mac_addr_rand && in wpa_driver_nl80211_scan()
395 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid)) in wpa_driver_nl80211_scan()
399 ret = send_and_recv_cmd(drv, msg); in wpa_driver_nl80211_scan()
403 "(%s)", ret, strerror(-ret)); in wpa_driver_nl80211_scan()
404 if (drv->hostapd && is_ap_interface(drv->nlmode)) { in wpa_driver_nl80211_scan()
409 drv->ap_scan_as_station = drv->nlmode; in wpa_driver_nl80211_scan()
417 ret = 0; in wpa_driver_nl80211_scan()
422 drv->scan_state = SCAN_REQUESTED; in wpa_driver_nl80211_scan()
425 timeout = drv->uses_6ghz ? 20 : 10; in wpa_driver_nl80211_scan()
426 if (drv->uses_s1g) in wpa_driver_nl80211_scan()
428 if (drv->scan_complete_events) { in wpa_driver_nl80211_scan()
436 wpa_printf(MSG_DEBUG, "Scan requested (ret=%d) - scan timeout %d " in wpa_driver_nl80211_scan()
438 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx); in wpa_driver_nl80211_scan()
439 eloop_register_timeout(timeout, 0, wpa_driver_nl80211_scan_timeout, in wpa_driver_nl80211_scan()
440 drv, drv->ctx); in wpa_driver_nl80211_scan()
441 drv->last_scan_cmd = NL80211_CMD_TRIGGER_SCAN; in wpa_driver_nl80211_scan()
450 nl80211_sched_scan_add_scan_plans(struct wpa_driver_nl80211_data *drv, in nl80211_sched_scan_add_scan_plans() argument
455 struct sched_scan_plan *scan_plans = params->sched_scan_plans; in nl80211_sched_scan_add_scan_plans()
460 return -1; in nl80211_sched_scan_add_scan_plans()
462 for (i = 0; i < params->sched_scan_plans_num; i++) { in nl80211_sched_scan_add_scan_plans()
466 return -1; in nl80211_sched_scan_add_scan_plans()
470 drv->capa.max_sched_scan_plan_interval) { in nl80211_sched_scan_add_scan_plans()
474 return -1; in nl80211_sched_scan_add_scan_plans()
479 return -1; in nl80211_sched_scan_add_scan_plans()
482 drv->capa.max_sched_scan_plan_iterations) { in nl80211_sched_scan_add_scan_plans()
486 return -1; in nl80211_sched_scan_add_scan_plans()
492 return -1; in nl80211_sched_scan_add_scan_plans()
506 if (i != params->sched_scan_plans_num - 1) { in nl80211_sched_scan_add_scan_plans()
509 return -1; in nl80211_sched_scan_add_scan_plans()
513 return 0; in nl80211_sched_scan_add_scan_plans()
518 * wpa_driver_nl80211_sched_scan - Initiate a scheduled scan
521 * Returns: 0 on success, -1 on failure or if not supported
527 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_sched_scan() local
528 int ret = -1; in wpa_driver_nl80211_sched_scan()
532 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: sched_scan request"); in wpa_driver_nl80211_sched_scan()
535 if (!drv->capa.sched_scan_supported) in wpa_driver_nl80211_sched_scan()
539 if (!params->sched_scan_plans_num || in wpa_driver_nl80211_sched_scan()
540 params->sched_scan_plans_num > drv->capa.max_sched_scan_plans) { in wpa_driver_nl80211_sched_scan()
543 params->sched_scan_plans_num); in wpa_driver_nl80211_sched_scan()
544 return -1; in wpa_driver_nl80211_sched_scan()
551 if (drv->capa.max_sched_scan_plan_iterations) { in wpa_driver_nl80211_sched_scan()
552 if (nl80211_sched_scan_add_scan_plans(drv, msg, params)) in wpa_driver_nl80211_sched_scan()
556 params->sched_scan_plans[0].interval * 1000)) in wpa_driver_nl80211_sched_scan()
560 if ((drv->num_filter_ssids && in wpa_driver_nl80211_sched_scan()
561 (int) drv->num_filter_ssids <= drv->capa.max_match_sets) || in wpa_driver_nl80211_sched_scan()
562 params->filter_rssi) { in wpa_driver_nl80211_sched_scan()
568 for (i = 0; i < drv->num_filter_ssids; i++) { in wpa_driver_nl80211_sched_scan()
572 wpa_ssid_txt(drv->filter_ssids[i].ssid, in wpa_driver_nl80211_sched_scan()
573 drv->filter_ssids[i].ssid_len)); in wpa_driver_nl80211_sched_scan()
578 drv->filter_ssids[i].ssid_len, in wpa_driver_nl80211_sched_scan()
579 drv->filter_ssids[i].ssid) || in wpa_driver_nl80211_sched_scan()
580 (params->filter_rssi && in wpa_driver_nl80211_sched_scan()
583 params->filter_rssi))) in wpa_driver_nl80211_sched_scan()
595 if (params->filter_rssi) { in wpa_driver_nl80211_sched_scan()
597 match_set_rssi = nla_nest_start(msg, 0); in wpa_driver_nl80211_sched_scan()
600 params->filter_rssi)) in wpa_driver_nl80211_sched_scan()
604 params->filter_rssi); in wpa_driver_nl80211_sched_scan()
611 if (params->relative_rssi_set) { in wpa_driver_nl80211_sched_scan()
614 os_memset(&rssi_adjust, 0, sizeof(rssi_adjust)); in wpa_driver_nl80211_sched_scan()
616 params->relative_rssi); in wpa_driver_nl80211_sched_scan()
618 params->relative_rssi)) in wpa_driver_nl80211_sched_scan()
621 if (params->relative_adjust_rssi) { in wpa_driver_nl80211_sched_scan()
624 switch (params->relative_adjust_band) { in wpa_driver_nl80211_sched_scan()
632 pref_band_set = 0; in wpa_driver_nl80211_sched_scan()
635 rssi_adjust.delta = params->relative_adjust_rssi; in wpa_driver_nl80211_sched_scan()
644 if (params->sched_scan_start_delay && in wpa_driver_nl80211_sched_scan()
646 params->sched_scan_start_delay)) in wpa_driver_nl80211_sched_scan()
649 ret = send_and_recv_cmd(drv, msg); in wpa_driver_nl80211_sched_scan()
656 "ret=%d (%s)", ret, strerror(-ret)); in wpa_driver_nl80211_sched_scan()
669 * wpa_driver_nl80211_stop_sched_scan - Stop a scheduled scan
671 * Returns: 0 on success, -1 on failure or if not supported
676 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_stop_sched_scan() local
681 if (!drv->capa.sched_scan_supported) in wpa_driver_nl80211_stop_sched_scan()
685 msg = nl80211_drv_msg(drv, 0, NL80211_CMD_STOP_SCHED_SCAN); in wpa_driver_nl80211_stop_sched_scan()
686 ret = send_and_recv_cmd(drv, msg); in wpa_driver_nl80211_stop_sched_scan()
690 ret, strerror(-ret)); in wpa_driver_nl80211_stop_sched_scan()
700 static int nl80211_scan_filtered(struct wpa_driver_nl80211_data *drv, in nl80211_scan_filtered() argument
706 if (drv->filter_ssids == NULL) in nl80211_scan_filtered()
707 return 0; in nl80211_scan_filtered()
713 for (i = 0; i < drv->num_filter_ssids; i++) { in nl80211_scan_filtered()
714 if (ssid[1] == drv->filter_ssids[i].ssid_len && in nl80211_scan_filtered()
715 os_memcmp(ssid + 2, drv->filter_ssids[i].ssid, ssid[1]) == in nl80211_scan_filtered()
716 0) in nl80211_scan_filtered()
717 return 0; in nl80211_scan_filtered()
725 nl80211_parse_bss_info(struct wpa_driver_nl80211_data *drv, in nl80211_parse_bss_info() argument
753 nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), in nl80211_parse_bss_info()
754 genlmsg_attrlen(gnlh, 0), NULL); in nl80211_parse_bss_info()
768 ie_len = 0; in nl80211_parse_bss_info()
775 beacon_ie_len = 0; in nl80211_parse_bss_info()
778 if (nl80211_scan_filtered(drv, ie ? ie : beacon_ie, in nl80211_parse_bss_info()
786 os_memcpy(r->bssid, nla_data(bss[NL80211_BSS_BSSID]), in nl80211_parse_bss_info()
789 r->freq = nla_get_u32(bss[NL80211_BSS_FREQUENCY]); in nl80211_parse_bss_info()
791 r->beacon_int = nla_get_u16(bss[NL80211_BSS_BEACON_INTERVAL]); in nl80211_parse_bss_info()
793 r->caps = nla_get_u16(bss[NL80211_BSS_CAPABILITY]); in nl80211_parse_bss_info()
794 r->flags |= WPA_SCAN_NOISE_INVALID; in nl80211_parse_bss_info()
796 r->level = nla_get_u32(bss[NL80211_BSS_SIGNAL_MBM]); in nl80211_parse_bss_info()
797 r->level /= 100; /* mBm to dBm */ in nl80211_parse_bss_info()
798 r->flags |= WPA_SCAN_LEVEL_DBM | WPA_SCAN_QUAL_INVALID; in nl80211_parse_bss_info()
800 r->level = nla_get_u8(bss[NL80211_BSS_SIGNAL_UNSPEC]); in nl80211_parse_bss_info()
801 r->flags |= WPA_SCAN_QUAL_INVALID; in nl80211_parse_bss_info()
803 r->flags |= WPA_SCAN_LEVEL_INVALID | WPA_SCAN_QUAL_INVALID; in nl80211_parse_bss_info()
805 r->tsf = nla_get_u64(bss[NL80211_BSS_TSF]); in nl80211_parse_bss_info()
808 if (tsf > r->tsf) { in nl80211_parse_bss_info()
809 r->tsf = tsf; in nl80211_parse_bss_info()
810 r->beacon_newer = true; in nl80211_parse_bss_info()
814 r->age = nla_get_u32(bss[NL80211_BSS_SEEN_MS_AGO]); in nl80211_parse_bss_info()
822 if (clock_gettime(CLOCK_BOOTTIME, &ts) == 0) { in nl80211_parse_bss_info()
828 r->age = ((u64) ts.tv_sec * 1000000000 + in nl80211_parse_bss_info()
829 ts.tv_nsec - boottime) / 1000000; in nl80211_parse_bss_info()
832 r->ie_len = ie_len; in nl80211_parse_bss_info()
838 r->beacon_ie_len = beacon_ie_len; in nl80211_parse_bss_info()
847 r->flags |= WPA_SCAN_ASSOCIATED; in nl80211_parse_bss_info()
855 r->parent_tsf = nla_get_u64(bss[NL80211_BSS_PARENT_TSF]); in nl80211_parse_bss_info()
856 os_memcpy(r->tsf_bssid, nla_data(bss[NL80211_BSS_PARENT_BSSID]), in nl80211_parse_bss_info()
865 struct wpa_driver_nl80211_data *drv; member
873 struct wpa_scan_results *res = _arg->res; in bss_info_handler()
877 r = nl80211_parse_bss_info(_arg->drv, msg, _arg->bssid); in bss_info_handler()
885 tmp = os_realloc_array(res->res, res->num + 1, in bss_info_handler()
891 tmp[res->num++] = r; in bss_info_handler()
892 res->res = tmp; in bss_info_handler()
898 static void clear_state_mismatch(struct wpa_driver_nl80211_data *drv, in clear_state_mismatch() argument
901 if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) { in clear_state_mismatch()
904 wpa_driver_nl80211_mlme(drv, addr, in clear_state_mismatch()
907 drv->first_bss); in clear_state_mismatch()
912 static void nl80211_check_bss_status(struct wpa_driver_nl80211_data *drv, in nl80211_check_bss_status() argument
915 if (!(r->flags & WPA_SCAN_ASSOCIATED)) in nl80211_check_bss_status()
919 MACSTR " as associated", MAC2STR(r->bssid)); in nl80211_check_bss_status()
920 if (is_sta_interface(drv->nlmode) && !drv->associated) { in nl80211_check_bss_status()
923 clear_state_mismatch(drv, r->bssid); in nl80211_check_bss_status()
924 } else if (is_sta_interface(drv->nlmode) && in nl80211_check_bss_status()
925 !ether_addr_equal(drv->bssid, r->bssid)) { in nl80211_check_bss_status()
929 MAC2STR(drv->bssid)); in nl80211_check_bss_status()
931 if (!ether_addr_equal(drv->sta_mlo_info.ap_mld_addr, in nl80211_check_bss_status()
932 drv->bssid)) { in nl80211_check_bss_status()
933 clear_state_mismatch(drv, r->bssid); in nl80211_check_bss_status()
935 if (!is_zero_ether_addr(drv->sta_mlo_info.ap_mld_addr)) in nl80211_check_bss_status()
937 drv, drv->sta_mlo_info.ap_mld_addr); in nl80211_check_bss_status()
939 clear_state_mismatch(drv, drv->bssid); in nl80211_check_bss_status()
950 struct wpa_driver_nl80211_data *drv, struct wpa_scan_results *res) in wpa_driver_nl80211_check_bss_status() argument
954 for (i = 0; i < res->num; i++) in wpa_driver_nl80211_check_bss_status()
955 nl80211_check_bss_status(drv, res->res[i]); in wpa_driver_nl80211_check_bss_status()
964 for (i = 0; res && i < info->count; i++) { in nl80211_update_scan_res_noise()
965 if ((int) info->freq[i] != res->freq || in nl80211_update_scan_res_noise()
966 !(res->flags & WPA_SCAN_NOISE_INVALID)) in nl80211_update_scan_res_noise()
968 res->noise = info->noise[i]; in nl80211_update_scan_res_noise()
969 res->flags &= ~WPA_SCAN_NOISE_INVALID; in nl80211_update_scan_res_noise()
975 nl80211_get_scan_results(struct wpa_driver_nl80211_data *drv, const u8 *bssid) in nl80211_get_scan_results() argument
981 int count = 0; in nl80211_get_scan_results()
987 if (!(msg = nl80211_cmd_msg(drv->first_bss, NLM_F_DUMP, in nl80211_get_scan_results()
993 arg.drv = drv; in nl80211_get_scan_results()
996 ret = send_and_recv_resp(drv, msg, bss_info_handler, &arg); in nl80211_get_scan_results()
997 if (ret == -EAGAIN) { in nl80211_get_scan_results()
1004 "nl80211: Failed to receive consistent scan result dump - try again"); in nl80211_get_scan_results()
1009 if (ret == 0) { in nl80211_get_scan_results()
1013 "BSSes)", (unsigned long) res->num); in nl80211_get_scan_results()
1014 if (nl80211_get_noise_for_scan_results(drv, &info) == 0) { in nl80211_get_scan_results()
1017 for (i = 0; i < res->num; ++i) in nl80211_get_scan_results()
1018 nl80211_update_scan_res_noise(res->res[i], in nl80211_get_scan_results()
1024 "(%s)", ret, strerror(-ret)); in nl80211_get_scan_results()
1031 * wpa_driver_nl80211_get_scan_results - Fetch the latest scan results
1034 * Returns: Scan results on success, -1 on failure
1040 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_get_scan_results() local
1043 res = nl80211_get_scan_results(drv, bssid); in wpa_driver_nl80211_get_scan_results()
1045 wpa_driver_nl80211_check_bss_status(drv, res); in wpa_driver_nl80211_get_scan_results()
1051 struct wpa_driver_nl80211_data *drv; member
1060 r = nl80211_parse_bss_info(ctx->drv, msg, NULL); in nl80211_dump_scan_handler()
1064 ctx->idx, MAC2STR(r->bssid), r->freq, in nl80211_dump_scan_handler()
1065 r->flags & WPA_SCAN_ASSOCIATED ? " [assoc]" : ""); in nl80211_dump_scan_handler()
1066 ctx->idx++; in nl80211_dump_scan_handler()
1072 void nl80211_dump_scan(struct wpa_driver_nl80211_data *drv) in nl80211_dump_scan() argument
1078 ctx.drv = drv; in nl80211_dump_scan()
1079 ctx.idx = 0; in nl80211_dump_scan()
1080 msg = nl80211_cmd_msg(drv->first_bss, NLM_F_DUMP, NL80211_CMD_GET_SCAN); in nl80211_dump_scan()
1082 send_and_recv_resp(drv, msg, nl80211_dump_scan_handler, &ctx); in nl80211_dump_scan()
1090 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_abort_scan() local
1097 if (drv->scan_vendor_cmd_avail && scan_cookie) in wpa_driver_nl80211_abort_scan()
1098 return nl80211_abort_vendor_scan(drv, scan_cookie); in wpa_driver_nl80211_abort_scan()
1112 nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), in scan_cookie_handler()
1113 genlmsg_attrlen(gnlh, 0), NULL); in scan_cookie_handler()
1132 * wpa_driver_nl80211_vendor_scan - Request the driver to initiate a vendor scan
1135 * Returns: 0 on success, -1 on failure
1140 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_vendor_scan() local
1144 u32 scan_flags = 0; in wpa_driver_nl80211_vendor_scan()
1145 int ret = -1; in wpa_driver_nl80211_vendor_scan()
1146 u64 cookie = 0; in wpa_driver_nl80211_vendor_scan()
1148 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: vendor scan request"); in wpa_driver_nl80211_vendor_scan()
1149 drv->scan_for_auth = 0; in wpa_driver_nl80211_vendor_scan()
1151 if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) || in wpa_driver_nl80211_vendor_scan()
1161 if (params->num_ssids) { in wpa_driver_nl80211_vendor_scan()
1167 for (i = 0; i < params->num_ssids; i++) { in wpa_driver_nl80211_vendor_scan()
1169 wpa_ssid_txt(params->ssids[i].ssid, in wpa_driver_nl80211_vendor_scan()
1170 params->ssids[i].ssid_len)); in wpa_driver_nl80211_vendor_scan()
1171 if (nla_put(msg, i + 1, params->ssids[i].ssid_len, in wpa_driver_nl80211_vendor_scan()
1172 params->ssids[i].ssid)) in wpa_driver_nl80211_vendor_scan()
1178 if (params->extra_ies) { in wpa_driver_nl80211_vendor_scan()
1180 params->extra_ies, params->extra_ies_len); in wpa_driver_nl80211_vendor_scan()
1182 params->extra_ies_len, params->extra_ies)) in wpa_driver_nl80211_vendor_scan()
1186 if (params->freqs) { in wpa_driver_nl80211_vendor_scan()
1193 for (i = 0; params->freqs[i]; i++) { in wpa_driver_nl80211_vendor_scan()
1196 params->freqs[i]); in wpa_driver_nl80211_vendor_scan()
1197 if (nla_put_u32(msg, i + 1, params->freqs[i])) in wpa_driver_nl80211_vendor_scan()
1203 os_free(drv->filter_ssids); in wpa_driver_nl80211_vendor_scan()
1204 drv->filter_ssids = params->filter_ssids; in wpa_driver_nl80211_vendor_scan()
1205 params->filter_ssids = NULL; in wpa_driver_nl80211_vendor_scan()
1206 drv->num_filter_ssids = params->num_filter_ssids; in wpa_driver_nl80211_vendor_scan()
1208 if (params->low_priority && drv->have_low_prio_scan) { in wpa_driver_nl80211_vendor_scan()
1214 if (params->mac_addr_rand) { in wpa_driver_nl80211_vendor_scan()
1219 if (params->mac_addr) { in wpa_driver_nl80211_vendor_scan()
1221 MAC2STR(params->mac_addr)); in wpa_driver_nl80211_vendor_scan()
1223 ETH_ALEN, params->mac_addr)) in wpa_driver_nl80211_vendor_scan()
1227 if (params->mac_addr_mask) { in wpa_driver_nl80211_vendor_scan()
1229 MACSTR, MAC2STR(params->mac_addr_mask)); in wpa_driver_nl80211_vendor_scan()
1231 ETH_ALEN, params->mac_addr_mask)) in wpa_driver_nl80211_vendor_scan()
1240 if (params->p2p_probe) { in wpa_driver_nl80211_vendor_scan()
1243 wpa_printf(MSG_DEBUG, "nl80211: P2P probe - mask SuppRates"); in wpa_driver_nl80211_vendor_scan()
1253 * 9, 12, 18, 24, 36, 48, 54 Mbps from non-MCS rates. All 5 GHz in wpa_driver_nl80211_vendor_scan()
1265 if (params->bssid) { in wpa_driver_nl80211_vendor_scan()
1267 MACSTR, MAC2STR(params->bssid)); in wpa_driver_nl80211_vendor_scan()
1269 params->bssid)) in wpa_driver_nl80211_vendor_scan()
1273 if (is_ap_interface(drv->nlmode) && in wpa_driver_nl80211_vendor_scan()
1274 params->link_id != NL80211_DRV_LINK_ID_NA && in wpa_driver_nl80211_vendor_scan()
1275 nla_put_u8(msg, QCA_WLAN_VENDOR_ATTR_SCAN_LINK_ID, params->link_id)) in wpa_driver_nl80211_vendor_scan()
1280 ret = send_and_recv_resp(drv, msg, scan_cookie_handler, &cookie); in wpa_driver_nl80211_vendor_scan()
1285 ret, strerror(-ret)); in wpa_driver_nl80211_vendor_scan()
1289 drv->vendor_scan_cookie = cookie; in wpa_driver_nl80211_vendor_scan()
1290 drv->scan_state = SCAN_REQUESTED; in wpa_driver_nl80211_vendor_scan()
1292 params->scan_cookie = cookie; in wpa_driver_nl80211_vendor_scan()
1295 "nl80211: Vendor scan requested (ret=%d) - scan timeout 30 seconds, scan cookie:0x%llx", in wpa_driver_nl80211_vendor_scan()
1297 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx); in wpa_driver_nl80211_vendor_scan()
1298 eloop_register_timeout(30, 0, wpa_driver_nl80211_scan_timeout, in wpa_driver_nl80211_vendor_scan()
1299 drv, drv->ctx); in wpa_driver_nl80211_vendor_scan()
1300 drv->last_scan_cmd = NL80211_CMD_VENDOR; in wpa_driver_nl80211_vendor_scan()
1309 * nl80211_set_default_scan_ies - Set the scan default IEs to the driver
1313 * Returns: 0 on success, -1 on failure
1318 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_default_scan_ies() local
1321 int ret = -1; in nl80211_set_default_scan_ies()
1323 if (!drv->set_wifi_conf_vendor_cmd_avail) in nl80211_set_default_scan_ies()
1324 return -1; in nl80211_set_default_scan_ies()
1326 if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) || in nl80211_set_default_scan_ies()
1343 ret = send_and_recv_cmd(drv, msg); in nl80211_set_default_scan_ies()
1348 ret, strerror(-ret)); in nl80211_set_default_scan_ies()