Lines Matching +full:const +full:- +full:op +full:- +full:mode

2  * wpa_supplicant - Radio Measurements
3 * Copyright (c) 2003-2016, Jouni Malinen <j@w1.fi>
25 if (!rrm->notify_neighbor_rep) { in wpas_rrm_neighbor_rep_timeout_handler()
31 wpa_printf(MSG_DEBUG, "RRM: Notifying neighbor report - NONE"); in wpas_rrm_neighbor_rep_timeout_handler()
32 rrm->notify_neighbor_rep(rrm->neighbor_rep_cb_ctx, NULL); in wpas_rrm_neighbor_rep_timeout_handler()
34 rrm->notify_neighbor_rep = NULL; in wpas_rrm_neighbor_rep_timeout_handler()
35 rrm->neighbor_rep_cb_ctx = NULL; in wpas_rrm_neighbor_rep_timeout_handler()
40 * wpas_rrm_reset - Clear and reset all RRM data in wpa_supplicant
45 wpa_s->rrm.rrm_used = 0; in wpas_rrm_reset()
47 eloop_cancel_timeout(wpas_rrm_neighbor_rep_timeout_handler, &wpa_s->rrm, in wpas_rrm_reset()
49 if (wpa_s->rrm.notify_neighbor_rep) in wpas_rrm_reset()
50 wpas_rrm_neighbor_rep_timeout_handler(&wpa_s->rrm, NULL); in wpas_rrm_reset()
51 wpa_s->rrm.next_neighbor_rep_token = 1; in wpas_rrm_reset()
57 * wpas_rrm_process_neighbor_rep - Handle incoming neighbor report
59 * @report: Neighbor report buffer, prefixed by a 1-byte dialog token
63 const u8 *report, size_t report_len) in wpas_rrm_process_neighbor_rep()
71 if (report[0] != wpa_s->rrm.next_neighbor_rep_token - 1) { in wpas_rrm_process_neighbor_rep()
74 report[0], wpa_s->rrm.next_neighbor_rep_token - 1); in wpas_rrm_process_neighbor_rep()
78 eloop_cancel_timeout(wpas_rrm_neighbor_rep_timeout_handler, &wpa_s->rrm, in wpas_rrm_process_neighbor_rep()
81 if (!wpa_s->rrm.notify_neighbor_rep) { in wpas_rrm_process_neighbor_rep()
87 neighbor_rep = wpabuf_alloc(report_len - 1); in wpas_rrm_process_neighbor_rep()
89 wpas_rrm_neighbor_rep_timeout_handler(&wpa_s->rrm, NULL); in wpas_rrm_process_neighbor_rep()
92 wpabuf_put_data(neighbor_rep, report + 1, report_len - 1); in wpas_rrm_process_neighbor_rep()
95 wpa_s->rrm.notify_neighbor_rep(wpa_s->rrm.neighbor_rep_cb_ctx, in wpas_rrm_process_neighbor_rep()
97 wpa_s->rrm.notify_neighbor_rep = NULL; in wpas_rrm_process_neighbor_rep()
98 wpa_s->rrm.neighbor_rep_cb_ctx = NULL; in wpas_rrm_process_neighbor_rep()
105 #define ENOTCONN -1
108 #define EOPNOTSUPP -1
111 #define ECANCELED -1
122 * wpas_rrm_send_neighbor_rep_request - Request a neighbor report from our AP
141 const struct wpa_ssid_value *ssid, in wpas_rrm_send_neighbor_rep_request()
148 const u8 *rrm_ie; in wpas_rrm_send_neighbor_rep_request()
150 if (wpa_s->wpa_state != WPA_COMPLETED || wpa_s->current_ssid == NULL) { in wpas_rrm_send_neighbor_rep_request()
152 return -ENOTCONN; in wpas_rrm_send_neighbor_rep_request()
155 if (!wpa_s->rrm.rrm_used) { in wpas_rrm_send_neighbor_rep_request()
157 return -EOPNOTSUPP; in wpas_rrm_send_neighbor_rep_request()
160 rrm_ie = wpa_bss_get_ie(wpa_s->current_bss, in wpas_rrm_send_neighbor_rep_request()
162 if (!rrm_ie || !(wpa_s->current_bss->caps & IEEE80211_CAP_RRM) || in wpas_rrm_send_neighbor_rep_request()
166 return -EOPNOTSUPP; in wpas_rrm_send_neighbor_rep_request()
170 if (wpa_s->rrm.notify_neighbor_rep) { in wpas_rrm_send_neighbor_rep_request()
173 return -EBUSY; in wpas_rrm_send_neighbor_rep_request()
177 buf = wpabuf_alloc(3 + (ssid ? 2 + ssid->ssid_len : 0) + in wpas_rrm_send_neighbor_rep_request()
183 return -ENOMEM; in wpas_rrm_send_neighbor_rep_request()
188 (ssid ? wpa_ssid_txt(ssid->ssid, ssid->ssid_len) : ""), in wpas_rrm_send_neighbor_rep_request()
189 wpa_s->rrm.next_neighbor_rep_token); in wpas_rrm_send_neighbor_rep_request()
193 wpabuf_put_u8(buf, wpa_s->rrm.next_neighbor_rep_token); in wpas_rrm_send_neighbor_rep_request()
196 wpabuf_put_u8(buf, ssid->ssid_len); in wpas_rrm_send_neighbor_rep_request()
197 wpabuf_put_data(buf, ssid->ssid, ssid->ssid_len); in wpas_rrm_send_neighbor_rep_request()
201 /* IEEE P802.11-REVmc/D5.0 9.4.2.21 */ in wpas_rrm_send_neighbor_rep_request()
215 wpabuf_put_u8(buf, 0); /* Measurement Request Mode */ in wpas_rrm_send_neighbor_rep_request()
218 /* IEEE P802.11-REVmc/D5.0 9.4.2.21.10 - LCI request */ in wpas_rrm_send_neighbor_rep_request()
224 * IEEE P802.11-REVmc/D5.0 Figure 9-170 in wpas_rrm_send_neighbor_rep_request()
235 /* IEEE P802.11-REVmc/D5.0 9.4.2.21 */ in wpas_rrm_send_neighbor_rep_request()
249 wpabuf_put_u8(buf, 0); /* Measurement Request Mode */ in wpas_rrm_send_neighbor_rep_request()
253 /* IEEE P802.11-REVmc/D5.0 9.4.2.21.14: in wpas_rrm_send_neighbor_rep_request()
260 /* Location Service Interval: 0 - Only one report is requested in wpas_rrm_send_neighbor_rep_request()
266 wpa_s->rrm.next_neighbor_rep_token++; in wpas_rrm_send_neighbor_rep_request()
268 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid, in wpas_rrm_send_neighbor_rep_request()
269 wpa_s->own_addr, wpa_s->bssid, in wpas_rrm_send_neighbor_rep_request()
274 return -ECANCELED; in wpas_rrm_send_neighbor_rep_request()
277 wpa_s->rrm.neighbor_rep_cb_ctx = cb_ctx; in wpas_rrm_send_neighbor_rep_request()
278 wpa_s->rrm.notify_neighbor_rep = cb; in wpas_rrm_send_neighbor_rep_request()
281 &wpa_s->rrm, NULL); in wpas_rrm_send_neighbor_rep_request()
288 static int wpas_rrm_report_elem(struct wpabuf **buf, u8 token, u8 mode, u8 type, in wpas_rrm_report_elem() argument
289 const u8 *data, size_t data_len) in wpas_rrm_report_elem()
292 return -1; in wpas_rrm_report_elem()
297 wpabuf_put_u8(*buf, mode); in wpas_rrm_report_elem()
309 const struct rrm_measurement_request_element *req, in wpas_rrm_build_lci_report()
316 const u8 *subelem; in wpas_rrm_build_lci_report()
317 const u8 *request = req->variable; in wpas_rrm_build_lci_report()
318 size_t len = req->len - 3; in wpas_rrm_build_lci_report()
321 return -1; in wpas_rrm_build_lci_report()
323 if (!wpa_s->lci) in wpas_rrm_build_lci_report()
327 len--; in wpas_rrm_build_lci_report()
334 "Not building LCI report - bad location subject"); in wpas_rrm_build_lci_report()
347 os_reltime_sub(&t, &wpa_s->lci_time, &diff); in wpas_rrm_build_lci_report()
354 if (wpas_rrm_report_elem(buf, req->token, in wpas_rrm_build_lci_report()
355 MEASUREMENT_REPORT_MODE_ACCEPT, req->type, in wpas_rrm_build_lci_report()
356 wpabuf_head_u8(wpa_s->lci), in wpas_rrm_build_lci_report()
357 wpabuf_len(wpa_s->lci)) < 0) { in wpas_rrm_build_lci_report()
359 return -1; in wpas_rrm_build_lci_report()
365 if (!is_multicast_ether_addr(wpa_s->rrm.dst_addr) && in wpas_rrm_build_lci_report()
366 wpas_rrm_report_elem(buf, req->token, in wpas_rrm_build_lci_report()
368 req->type, NULL, 0) < 0) { in wpas_rrm_build_lci_report()
370 return -1; in wpas_rrm_build_lci_report()
378 const u8 *data, size_t len) in wpas_rrm_send_msr_report_mpdu()
387 wpabuf_put_u8(report, wpa_s->rrm.token); in wpas_rrm_send_msr_report_mpdu()
391 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid, in wpas_rrm_send_msr_report_mpdu()
392 wpa_s->own_addr, wpa_s->bssid, in wpas_rrm_send_msr_report_mpdu()
411 while (end - pos >= (int) sizeof(*msr_rep)) { in wpas_rrm_beacon_rep_update_last_frame()
413 msr_rep_end = pos + msr_rep->len + 2; in wpas_rrm_beacon_rep_update_last_frame()
415 if (msr_rep->eid != WLAN_EID_MEASURE_REPORT || in wpas_rrm_beacon_rep_update_last_frame()
419 "RRM: non-measurement report element in measurement report frame"); in wpas_rrm_beacon_rep_update_last_frame()
420 return -1; in wpas_rrm_beacon_rep_update_last_frame()
423 if (msr_rep->type == MEASURE_TYPE_BEACON) in wpas_rrm_beacon_rep_update_last_frame()
425 msr_rep->variable; in wpas_rrm_beacon_rep_update_last_frame()
433 subelem = rep->variable; in wpas_rrm_beacon_rep_update_last_frame()
454 #define MPDU_REPORT_LEN (int) (IEEE80211_MAX_MMPDU_SIZE - IEEE80211_HDRLEN - 3) in wpas_rrm_send_msr_report()
457 int send_len = (len > MPDU_REPORT_LEN) ? next - pos : len; in wpas_rrm_send_msr_report()
465 len -= send_len; in wpas_rrm_send_msr_report()
482 u8 primary_chan = chan - (2 * num_primary_channels - 2) + i * 4; in wpas_add_channel()
495 return -1; in wpas_add_channel()
503 static int * wpas_add_channels(const struct oper_class_map *op, in wpas_add_channels() argument
504 struct hostapd_hw_modes *mode, in wpas_add_channels() argument
505 const u8 *channels, const u8 size) in wpas_add_channels()
512 (op->max_chan - op->min_chan) / op->inc + 1; in wpas_add_channels()
514 if (op->bw == BW80 || op->bw == BW80P80) in wpas_add_channels()
516 else if (op->bw == BW160) in wpas_add_channels()
518 else if (op->bw == BW320) in wpas_add_channels()
523 /* one extra place for the zero-terminator */ in wpas_add_channels()
533 u8 chan = channels ? channels[i] : op->min_chan + i * op->inc; in wpas_add_channels()
534 enum chan_allowed res = verify_channel(mode, op->op_class, chan, in wpas_add_channels()
535 op->bw); in wpas_add_channels()
540 if (wpas_add_channel(op->op_class, chan, num_primary_channels, in wpas_add_channels()
558 static int * wpas_op_class_freqs(const struct oper_class_map *op, in wpas_op_class_freqs() argument
559 struct hostapd_hw_modes *mode) in wpas_op_class_freqs() argument
567 const u8 *channels = NULL; in wpas_op_class_freqs()
569 bool is_6ghz = is_6ghz_op_class(op->op_class); in wpas_op_class_freqs()
576 if (op->bw == BW80 || op->bw == BW80P80) { in wpas_op_class_freqs()
580 } else if (op->bw == BW160) { in wpas_op_class_freqs()
585 } else if (op->bw == BW320) { in wpas_op_class_freqs()
590 return wpas_add_channels(op, mode, channels, num_chan); in wpas_op_class_freqs()
595 const char *country, const u8 *subelems, in wpas_channel_report_freqs()
599 const u8 *end = subelems + len; in wpas_channel_report_freqs()
601 while (end - subelems > 2) { in wpas_channel_report_freqs()
602 const struct oper_class_map *op; in wpas_channel_report_freqs() local
603 const u8 *ap_chan_elem, *pos; in wpas_channel_report_freqs()
605 struct hostapd_hw_modes *mode; in wpas_channel_report_freqs() local
607 ap_chan_elem = get_ie(subelems, end - subelems, in wpas_channel_report_freqs()
617 op = get_oper_class(country, *pos); in wpas_channel_report_freqs()
618 if (!op) { in wpas_channel_report_freqs()
625 left--; in wpas_channel_report_freqs()
627 mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, op->mode, in wpas_channel_report_freqs()
628 is_6ghz_op_class(op->op_class)); in wpas_channel_report_freqs()
629 if (!mode) in wpas_channel_report_freqs()
640 * IEEE Std 802.11-2016, 11.11.9.1. in wpas_channel_report_freqs()
642 new_freqs = wpas_add_channels(op, mode, pos, left); in wpas_channel_report_freqs()
658 const u8 *subelems, size_t len) in wpas_beacon_request_freqs()
661 struct hostapd_hw_modes *mode; in wpas_beacon_request_freqs() local
662 const char *country = NULL; in wpas_beacon_request_freqs()
663 const struct oper_class_map *op; in wpas_beacon_request_freqs() local
664 const u8 *elem; in wpas_beacon_request_freqs()
666 if (!wpa_s->current_bss) in wpas_beacon_request_freqs()
668 elem = wpa_bss_get_ie(wpa_s->current_bss, WLAN_EID_COUNTRY); in wpas_beacon_request_freqs()
670 country = (const char *) (elem + 2); in wpas_beacon_request_freqs()
672 op = get_oper_class(country, op_class); in wpas_beacon_request_freqs()
673 if (!op) { in wpas_beacon_request_freqs()
680 mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, op->mode, in wpas_beacon_request_freqs()
681 is_6ghz_op_class(op->op_class)); in wpas_beacon_request_freqs()
682 if (!mode) in wpas_beacon_request_freqs()
687 freqs = wpas_op_class_freqs(op, mode); in wpas_beacon_request_freqs()
695 freqs = wpas_add_channels(op, mode, &chan, 1); in wpas_beacon_request_freqs()
712 int wpas_get_op_chan_phy(int freq, const u8 *ies, size_t ies_len, in wpas_get_op_chan_phy()
715 const u8 *ie; in wpas_get_op_chan_phy()
726 sec_chan_offset = ht_oper->ht_param & in wpas_get_op_chan_phy()
732 sec_chan = -1; in wpas_get_op_chan_phy()
739 switch (vht_oper->vht_op_info_chwidth) { in wpas_get_op_chan_phy()
741 seg0 = vht_oper->vht_op_info_chan_center_freq_seg0_idx; in wpas_get_op_chan_phy()
742 seg1 = vht_oper->vht_op_info_chan_center_freq_seg1_idx; in wpas_get_op_chan_phy()
743 if (seg1 && abs(seg1 - seg0) == 8) in wpas_get_op_chan_phy()
766 return -1; in wpas_get_op_chan_phy()
773 return -1; in wpas_get_op_chan_phy()
784 size_t buf_len, const u8 **ies_buf, in wpas_beacon_rep_add_frame_body()
787 const u8 *ies = *ies_buf; in wpas_beacon_rep_add_frame_body()
792 rem_len = 255 - sizeof(struct rrm_measurement_beacon_report) - in wpas_beacon_rep_add_frame_body()
793 sizeof(struct rrm_measurement_report_element) - 2 - in wpas_beacon_rep_add_frame_body()
800 return -1; in wpas_beacon_rep_add_frame_body()
811 return -1; in wpas_beacon_rep_add_frame_body()
818 WPA_PUT_LE64(pos, bss->tsf); in wpas_beacon_rep_add_frame_body()
819 pos += sizeof(bss->tsf); in wpas_beacon_rep_add_frame_body()
820 WPA_PUT_LE16(pos, bss->beacon_int); in wpas_beacon_rep_add_frame_body()
822 WPA_PUT_LE16(pos, bss->caps); in wpas_beacon_rep_add_frame_body()
826 rem_len -= pos - buf; in wpas_beacon_rep_add_frame_body()
829 * According to IEEE Std 802.11-2016, 9.4.2.22.7, if the reported frame in wpas_beacon_rep_add_frame_body()
843 if (2 + elen > buf + buf_len - pos || in wpas_beacon_rep_add_frame_body()
851 rem_len -= 2 + elen; in wpas_beacon_rep_add_frame_body()
854 ies_len -= 2 + ies[1]; in wpas_beacon_rep_add_frame_body()
862 buf[1] = pos - buf - 2; in wpas_beacon_rep_add_frame_body()
863 return pos - buf; in wpas_beacon_rep_add_frame_body()
871 const u8 **ie, size_t *ie_len, u8 idx) in wpas_add_beacon_rep_elem()
876 (data->last_indication ? in wpas_add_beacon_rep_elem()
884 return -1; in wpas_add_beacon_rep_elem()
888 ret = wpas_beacon_rep_add_frame_body(data->eids, data->ext_eids, in wpas_add_beacon_rep_elem()
889 data->report_detail, in wpas_add_beacon_rep_elem()
909 if (data->report_detail != BEACON_REPORT_DETAIL_NONE && *ie_len) in wpas_add_beacon_rep_elem()
916 if (data->last_indication) { in wpas_add_beacon_rep_elem()
924 ret = wpas_rrm_report_elem(wpa_buf, data->token, in wpas_add_beacon_rep_elem()
938 struct beacon_rep_data *data = &wpa_s->beacon_rep_data; in wpas_add_beacon_rep()
939 const u8 *ies = wpa_bss_ie_ptr(bss); in wpas_add_beacon_rep()
940 const u8 *pos = ies; in wpas_add_beacon_rep()
941 size_t ies_len = bss->ie_len ? bss->ie_len : bss->beacon_ie_len; in wpas_add_beacon_rep()
945 if (!ether_addr_equal(data->bssid, broadcast_ether_addr) && in wpas_add_beacon_rep()
946 !ether_addr_equal(data->bssid, bss->bssid)) in wpas_add_beacon_rep()
949 if (data->ssid_len && in wpas_add_beacon_rep()
950 (data->ssid_len != bss->ssid_len || in wpas_add_beacon_rep()
951 os_memcmp(data->ssid, bss->ssid, bss->ssid_len) != 0)) in wpas_add_beacon_rep()
954 if (wpas_get_op_chan_phy(bss->freq, ies, ies_len, &rep.op_class, in wpas_add_beacon_rep()
959 rep.duration = host_to_le16(data->scan_params.duration); in wpas_add_beacon_rep()
960 rep.rcpi = rssi_to_rcpi(bss->level); in wpas_add_beacon_rep()
962 os_memcpy(rep.bssid, bss->bssid, ETH_ALEN); in wpas_add_beacon_rep()
973 } while (data->report_detail != BEACON_REPORT_DETAIL_NONE && in wpas_add_beacon_rep()
983 return wpas_rrm_report_elem(buf, wpa_s->beacon_rep_data.token, in wpas_beacon_rep_no_results()
994 for (i = 0; i < wpa_s->last_scan_res_used; i++) { in wpas_beacon_rep_table()
995 if (wpas_add_beacon_rep(wpa_s, buf, wpa_s->last_scan_res[i], in wpas_beacon_rep_table()
1009 if (!is_multicast_ether_addr(wpa_s->rrm.dst_addr)) { in wpas_rrm_refuse_request()
1012 if (wpas_rrm_report_elem(&buf, wpa_s->beacon_rep_data.token, in wpas_rrm_refuse_request()
1032 &wpa_s->beacon_rep_data.scan_params; in wpas_rrm_scan_timeout()
1033 u16 prev_duration = params->duration; in wpas_rrm_scan_timeout()
1035 if (!wpa_s->current_bss) in wpas_rrm_scan_timeout()
1038 if (!(wpa_s->drv_rrm_flags & WPA_DRIVER_FLAGS_SUPPORT_SET_SCAN_DWELL) && in wpas_rrm_scan_timeout()
1039 params->duration) { in wpas_rrm_scan_timeout()
1042 params->duration = 0; in wpas_rrm_scan_timeout()
1044 os_get_reltime(&wpa_s->beacon_rep_scan); in wpas_rrm_scan_timeout()
1045 if (wpa_s->scanning || wpas_p2p_in_progress(wpa_s) || in wpas_rrm_scan_timeout()
1048 params->duration = prev_duration; in wpas_rrm_scan_timeout()
1054 u8 sid, u8 slen, const u8 *subelem) in wpas_rm_handle_beacon_req_subelem()
1063 "SSID subelement with zero length - wildcard SSID"); in wpas_rm_handle_beacon_req_subelem()
1070 return -1; in wpas_rm_handle_beacon_req_subelem()
1073 data->ssid_len = slen; in wpas_rm_handle_beacon_req_subelem()
1074 os_memcpy(data->ssid, subelem, data->ssid_len); in wpas_rm_handle_beacon_req_subelem()
1081 return -1; in wpas_rm_handle_beacon_req_subelem()
1097 return -1; in wpas_rm_handle_beacon_req_subelem()
1100 data->report_detail = subelem[0]; in wpas_rm_handle_beacon_req_subelem()
1101 if (data->report_detail > in wpas_rm_handle_beacon_req_subelem()
1105 return -1; in wpas_rm_handle_beacon_req_subelem()
1111 if (data->report_detail != in wpas_rm_handle_beacon_req_subelem()
1115 data->report_detail); in wpas_rm_handle_beacon_req_subelem()
1116 return -1; in wpas_rm_handle_beacon_req_subelem()
1123 return -1; in wpas_rm_handle_beacon_req_subelem()
1130 return -1; in wpas_rm_handle_beacon_req_subelem()
1141 slen--; in wpas_rm_handle_beacon_req_subelem()
1145 data->eids) || in wpas_rm_handle_beacon_req_subelem()
1147 data->ext_eids)) { in wpas_rm_handle_beacon_req_subelem()
1150 return -1; in wpas_rm_handle_beacon_req_subelem()
1156 return -1; in wpas_rm_handle_beacon_req_subelem()
1160 data->eids = eids; in wpas_rm_handle_beacon_req_subelem()
1162 data->ext_eids = eids; in wpas_rm_handle_beacon_req_subelem()
1168 /* Skip - it will be processed when freqs are added */ in wpas_rm_handle_beacon_req_subelem()
1175 return -1; in wpas_rm_handle_beacon_req_subelem()
1178 data->last_indication = subelem[0]; in wpas_rm_handle_beacon_req_subelem()
1192 * triggered, and -1 if processing failed (i.e., the element is in invalid
1198 const struct rrm_measurement_beacon_request *req, in wpas_rm_handle_beacon_req()
1201 struct beacon_rep_data *data = &wpa_s->beacon_rep_data; in wpas_rm_handle_beacon_req()
1202 struct wpa_driver_scan_params *params = &data->scan_params; in wpas_rm_handle_beacon_req()
1203 const u8 *subelems; in wpas_rm_handle_beacon_req()
1212 return -1; in wpas_rm_handle_beacon_req()
1214 if (req->mode != BEACON_REPORT_MODE_PASSIVE && in wpas_rm_handle_beacon_req()
1215 req->mode != BEACON_REPORT_MODE_ACTIVE && in wpas_rm_handle_beacon_req()
1216 req->mode != BEACON_REPORT_MODE_TABLE) in wpas_rm_handle_beacon_req()
1219 subelems = req->variable; in wpas_rm_handle_beacon_req()
1220 elems_len = len - sizeof(*req); in wpas_rm_handle_beacon_req()
1221 rand_interval = le_to_host16(req->rand_interval); in wpas_rm_handle_beacon_req()
1223 os_free(params->freqs); in wpas_rm_handle_beacon_req()
1226 data->token = elem_token; in wpas_rm_handle_beacon_req()
1230 data->report_detail = BEACON_REPORT_DETAIL_ALL_FIELDS_AND_ELEMENTS; in wpas_rm_handle_beacon_req()
1231 os_memcpy(data->bssid, req->bssid, ETH_ALEN); in wpas_rm_handle_beacon_req()
1234 if (subelems[1] > elems_len - 2) { in wpas_rm_handle_beacon_req()
1237 ret = -1; in wpas_rm_handle_beacon_req()
1251 elems_len -= 2 + subelems[1]; in wpas_rm_handle_beacon_req()
1255 if (req->mode == BEACON_REPORT_MODE_TABLE) { in wpas_rm_handle_beacon_req()
1260 params->freqs = wpas_beacon_request_freqs(wpa_s, req->oper_class, in wpas_rm_handle_beacon_req()
1261 req->channel, req->variable, in wpas_rm_handle_beacon_req()
1262 len - sizeof(*req)); in wpas_rm_handle_beacon_req()
1263 if (!params->freqs) { in wpas_rm_handle_beacon_req()
1269 params->duration = le_to_host16(req->duration); in wpas_rm_handle_beacon_req()
1270 params->duration_mandatory = duration_mandatory; in wpas_rm_handle_beacon_req()
1271 if (!params->duration) { in wpas_rm_handle_beacon_req()
1273 ret = -1; in wpas_rm_handle_beacon_req()
1277 params->only_new_results = 1; in wpas_rm_handle_beacon_req()
1279 if (req->mode == BEACON_REPORT_MODE_ACTIVE) { in wpas_rm_handle_beacon_req()
1280 params->ssids[params->num_ssids].ssid = data->ssid; in wpas_rm_handle_beacon_req()
1281 params->ssids[params->num_ssids++].ssid_len = data->ssid_len; in wpas_rm_handle_beacon_req()
1291 if (!is_multicast_ether_addr(wpa_s->rrm.dst_addr) && in wpas_rm_handle_beacon_req()
1295 ret = -1; in wpas_rm_handle_beacon_req()
1306 const struct rrm_measurement_request_element *req, in wpas_rrm_handle_msr_req_element()
1312 req->type, req->token); in wpas_rrm_handle_msr_req_element()
1314 if (req->mode & MEASUREMENT_REQUEST_MODE_ENABLE) { in wpas_rrm_handle_msr_req_element()
1320 if ((req->mode & MEASUREMENT_REQUEST_MODE_PARALLEL) && in wpas_rrm_handle_msr_req_element()
1321 req->type > MEASURE_TYPE_RPI_HIST) { in wpas_rrm_handle_msr_req_element()
1329 !!(req->mode & MEASUREMENT_REQUEST_MODE_DURATION_MANDATORY); in wpas_rrm_handle_msr_req_element()
1331 switch (req->type) { in wpas_rrm_handle_msr_req_element()
1336 !(wpa_s->drv_rrm_flags & in wpas_rrm_handle_msr_req_element()
1339 …"RRM: Driver does not support dwell time configuration - reject beacon report with mandatory durat… in wpas_rrm_handle_msr_req_element()
1342 return wpas_rm_handle_beacon_req(wpa_s, req->token, in wpas_rrm_handle_msr_req_element()
1344 (const void *) req->variable, in wpas_rrm_handle_msr_req_element()
1345 req->len - 3, buf); in wpas_rrm_handle_msr_req_element()
1349 req->type); in wpas_rrm_handle_msr_req_element()
1354 if (!is_multicast_ether_addr(wpa_s->rrm.dst_addr) && in wpas_rrm_handle_msr_req_element()
1355 wpas_rrm_report_elem(buf, req->token, in wpas_rrm_handle_msr_req_element()
1357 req->type, NULL, 0) < 0) { in wpas_rrm_handle_msr_req_element()
1359 return -1; in wpas_rrm_handle_msr_req_element()
1367 wpas_rrm_process_msr_req_elems(struct wpa_supplicant *wpa_s, const u8 *pos, in wpas_rrm_process_msr_req_elems()
1373 const struct rrm_measurement_request_element *req; in wpas_rrm_process_msr_req_elems()
1381 req = (const struct rrm_measurement_request_element *) pos; in wpas_rrm_process_msr_req_elems()
1382 if (req->eid != WLAN_EID_MEASURE_REQUEST) { in wpas_rrm_process_msr_req_elems()
1385 req->eid); in wpas_rrm_process_msr_req_elems()
1389 if (req->len < 3) { in wpas_rrm_process_msr_req_elems()
1394 if (req->len > len - 2) { in wpas_rrm_process_msr_req_elems()
1403 pos += req->len + 2; in wpas_rrm_process_msr_req_elems()
1404 len -= req->len + 2; in wpas_rrm_process_msr_req_elems()
1416 const u8 *src, const u8 *dst, in wpas_rrm_handle_radio_measurement_request()
1417 const u8 *frame, size_t len) in wpas_rrm_handle_radio_measurement_request()
1421 if (wpa_s->wpa_state != WPA_COMPLETED) { in wpas_rrm_handle_radio_measurement_request()
1427 if (!wpa_s->rrm.rrm_used) { in wpas_rrm_handle_radio_measurement_request()
1439 wpa_s->rrm.token = *frame; in wpas_rrm_handle_radio_measurement_request()
1440 os_memcpy(wpa_s->rrm.dst_addr, dst, ETH_ALEN); in wpas_rrm_handle_radio_measurement_request()
1444 report = wpas_rrm_process_msr_req_elems(wpa_s, frame + 3, len - 3); in wpas_rrm_handle_radio_measurement_request()
1454 const u8 *src, in wpas_rrm_handle_link_measurement_request()
1455 const u8 *frame, size_t len, in wpas_rrm_handle_link_measurement_request()
1459 const struct rrm_link_measurement_request *req; in wpas_rrm_handle_link_measurement_request()
1462 if (wpa_s->wpa_state != WPA_COMPLETED) { in wpas_rrm_handle_link_measurement_request()
1468 if (!wpa_s->rrm.rrm_used) { in wpas_rrm_handle_link_measurement_request()
1474 if (!(wpa_s->drv_rrm_flags & WPA_DRIVER_FLAGS_TX_POWER_INSERTION)) { in wpas_rrm_handle_link_measurement_request()
1480 req = (const struct rrm_link_measurement_request *) frame; in wpas_rrm_handle_link_measurement_request()
1488 report.dialog_token = req->dialog_token; in wpas_rrm_handle_link_measurement_request()
1511 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, src, in wpas_rrm_handle_link_measurement_request()
1512 wpa_s->own_addr, wpa_s->bssid, in wpas_rrm_handle_link_measurement_request()
1522 const u8 *bssid) in wpas_beacon_rep_scan_match()
1526 if (!wpa_s->valid_links) in wpas_beacon_rep_scan_match()
1527 return ether_addr_equal(wpa_s->current_bss->bssid, bssid); in wpas_beacon_rep_scan_match()
1529 for_each_link(wpa_s->valid_links, i) { in wpas_beacon_rep_scan_match()
1530 if (ether_addr_equal(wpa_s->links[i].bssid, bssid)) in wpas_beacon_rep_scan_match()
1548 if (!wpa_s->beacon_rep_data.token) in wpas_beacon_rep_scan_process()
1551 if (!wpa_s->current_bss) in wpas_beacon_rep_scan_process()
1555 if (info->aborted) in wpas_beacon_rep_scan_process()
1559 MAC2STR(info->scan_start_tsf_bssid), in wpas_beacon_rep_scan_process()
1560 MAC2STR(wpa_s->current_bss->bssid)); in wpas_beacon_rep_scan_process()
1561 if ((wpa_s->drv_rrm_flags & WPA_DRIVER_FLAGS_SUPPORT_BEACON_REPORT) && in wpas_beacon_rep_scan_process()
1562 !wpas_beacon_rep_scan_match(wpa_s, info->scan_start_tsf_bssid)) { in wpas_beacon_rep_scan_process()
1568 for (i = 0; i < scan_res->num; i++) { in wpas_beacon_rep_scan_process()
1570 wpa_bss_get_bssid(wpa_s, scan_res->res[i]->bssid); in wpas_beacon_rep_scan_process()
1575 if ((wpa_s->drv_rrm_flags & in wpas_beacon_rep_scan_process()
1578 scan_res->res[i]->tsf_bssid)) { in wpas_beacon_rep_scan_process()
1582 MAC2STR(scan_res->res[i]->bssid), in wpas_beacon_rep_scan_process()
1583 MAC2STR(scan_res->res[i]->tsf_bssid)); in wpas_beacon_rep_scan_process()
1591 if (!(wpa_s->drv_rrm_flags & in wpas_beacon_rep_scan_process()
1600 calculate_update_time(&scan_res->fetch_time, in wpas_beacon_rep_scan_process()
1601 scan_res->res[i]->age, in wpas_beacon_rep_scan_process()
1603 os_reltime_sub(&wpa_s->beacon_rep_scan, in wpas_beacon_rep_scan_process()
1606 &wpa_s->beacon_rep_scan) && in wpas_beacon_rep_scan_process()
1611 MAC2STR(scan_res->res[i]->bssid), in wpas_beacon_rep_scan_process()
1612 scan_res->res[i]->age, in wpas_beacon_rep_scan_process()
1617 } else if (info->scan_start_tsf > in wpas_beacon_rep_scan_process()
1618 scan_res->res[i]->parent_tsf) { in wpas_beacon_rep_scan_process()
1622 if (wpas_add_beacon_rep(wpa_s, &buf, bss, info->scan_start_tsf, in wpas_beacon_rep_scan_process()
1623 scan_res->res[i]->parent_tsf) < 0) in wpas_beacon_rep_scan_process()
1643 struct beacon_rep_data *data = &wpa_s->beacon_rep_data; in wpas_clear_beacon_rep_data()
1646 bitfield_free(data->eids); in wpas_clear_beacon_rep_data()
1647 bitfield_free(data->ext_eids); in wpas_clear_beacon_rep_data()
1648 os_free(data->scan_params.freqs); in wpas_clear_beacon_rep_data()