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

2  * Driver interaction with Linux nl80211/cfg80211 - Event processing
3 * Copyright (c) 2002-2017, Jouni Malinen <j@w1.fi>
5 * Copyright (c) 2009-2010, Atheros Communications
16 #include "common/qca-vendor.h"
17 #include "common/qca-vendor-attr.h"
197 static void mlme_event_auth(struct wpa_driver_nl80211_data *drv, in mlme_event_auth() argument
203 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME) && in mlme_event_auth()
204 drv->force_connect_cmd) { in mlme_event_auth()
216 if (len < 24 + sizeof(mgmt->u.auth)) { in mlme_event_auth()
222 os_memcpy(drv->auth_bssid, mgmt->sa, ETH_ALEN); in mlme_event_auth()
223 os_memset(drv->auth_attempt_bssid, 0, ETH_ALEN); in mlme_event_auth()
224 os_memset(&event, 0, sizeof(event)); in mlme_event_auth()
225 os_memcpy(event.auth.peer, mgmt->sa, ETH_ALEN); in mlme_event_auth()
226 event.auth.auth_type = le_to_host16(mgmt->u.auth.auth_alg); in mlme_event_auth()
228 le_to_host16(mgmt->u.auth.auth_transaction); in mlme_event_auth()
229 event.auth.status_code = le_to_host16(mgmt->u.auth.status_code); in mlme_event_auth()
230 if (len > 24 + sizeof(mgmt->u.auth)) { in mlme_event_auth()
231 event.auth.ies = mgmt->u.auth.variable; in mlme_event_auth()
232 event.auth.ies_len = len - 24 - sizeof(mgmt->u.auth); in mlme_event_auth()
235 wpa_supplicant_event(drv->ctx, EVENT_AUTH, &event); in mlme_event_auth()
253 wmm_params->uapsd_queues = in nl80211_parse_wmm_params()
255 wmm_params->info_bitmap |= WMM_PARAMS_UAPSD_QUEUES_INFO; in nl80211_parse_wmm_params()
259 static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv, in mlme_event_assoc() argument
268 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME) && in mlme_event_assoc()
269 drv->force_connect_cmd) { in mlme_event_assoc()
281 if (len < 24 + sizeof(mgmt->u.assoc_resp)) { in mlme_event_assoc()
287 status = le_to_host16(mgmt->u.assoc_resp.status_code); in mlme_event_assoc()
289 os_memset(&event, 0, sizeof(event)); in mlme_event_assoc()
290 event.assoc_reject.bssid = mgmt->bssid; in mlme_event_assoc()
291 if (len > 24 + sizeof(mgmt->u.assoc_resp)) { in mlme_event_assoc()
293 (u8 *) mgmt->u.assoc_resp.variable; in mlme_event_assoc()
295 len - 24 - sizeof(mgmt->u.assoc_resp); in mlme_event_assoc()
299 wpa_supplicant_event(drv->ctx, EVENT_ASSOC_REJECT, &event); in mlme_event_assoc()
303 drv->associated = 1; in mlme_event_assoc()
304 os_memcpy(drv->bssid, mgmt->sa, ETH_ALEN); in mlme_event_assoc()
305 os_memcpy(drv->prev_bssid, mgmt->sa, ETH_ALEN); in mlme_event_assoc()
307 os_memset(&event, 0, sizeof(event)); in mlme_event_assoc()
310 if (len > 24 + sizeof(mgmt->u.assoc_resp)) { in mlme_event_assoc()
311 event.assoc_info.resp_ies = (u8 *) mgmt->u.assoc_resp.variable; in mlme_event_assoc()
313 len - 24 - sizeof(mgmt->u.assoc_resp); in mlme_event_assoc()
322 * drv->ssid needs to be set here to satisfy later checking. */ in mlme_event_assoc()
323 ssid_len = nl80211_get_assoc_ssid(drv, drv->ssid); in mlme_event_assoc()
324 if (ssid_len > 0) { in mlme_event_assoc()
325 drv->ssid_len = ssid_len; in mlme_event_assoc()
327 "nl80211: Set drv->ssid based on scan res info to '%s'", in mlme_event_assoc()
328 wpa_ssid_txt(drv->ssid, drv->ssid_len)); in mlme_event_assoc()
331 event.assoc_info.freq = drv->assoc_freq; in mlme_event_assoc()
332 drv->first_bss->flink->freq = drv->assoc_freq; in mlme_event_assoc()
336 wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event); in mlme_event_assoc()
350 *reason_code = 0; in qca_drv_connect_fail_reason_code_handler()
351 nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), in qca_drv_connect_fail_reason_code_handler()
352 genlmsg_attrlen(gnlh, 0), NULL); in qca_drv_connect_fail_reason_code_handler()
375 drv_get_connect_fail_reason_code(struct wpa_driver_nl80211_data *drv) in drv_get_connect_fail_reason_code() argument
381 msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR); in drv_get_connect_fail_reason_code()
386 return 0; in drv_get_connect_fail_reason_code()
389 ret = send_and_recv_resp(drv, msg, in drv_get_connect_fail_reason_code()
395 ret, strerror(-ret)); in drv_get_connect_fail_reason_code()
426 static void qca_nl80211_link_reconfig_event(struct wpa_driver_nl80211_data *drv, in qca_nl80211_link_reconfig_event() argument
445 if (!drv->sta_mlo_info.valid_links || in qca_nl80211_link_reconfig_event()
446 !ether_addr_equal(drv->sta_mlo_info.ap_mld_addr, ap_mld)) { in qca_nl80211_link_reconfig_event()
447 if (drv->pending_link_reconfig_data == data) { in qca_nl80211_link_reconfig_event()
450 os_free(drv->pending_link_reconfig_data); in qca_nl80211_link_reconfig_event()
451 drv->pending_link_reconfig_data = NULL; in qca_nl80211_link_reconfig_event()
457 if (drv->pending_link_reconfig_data) { in qca_nl80211_link_reconfig_event()
459 os_free(drv->pending_link_reconfig_data); in qca_nl80211_link_reconfig_event()
461 drv->pending_link_reconfig_data = os_memdup(data, len); in qca_nl80211_link_reconfig_event()
462 if (!drv->pending_link_reconfig_data) in qca_nl80211_link_reconfig_event()
464 drv->pending_link_reconfig_data_len = len; in qca_nl80211_link_reconfig_event()
473 drv->sta_mlo_info.valid_links &= ~removed_links; in qca_nl80211_link_reconfig_event()
479 if (removed_links & BIT(drv->sta_mlo_info.assoc_link_id)) { in qca_nl80211_link_reconfig_event()
480 for_each_link(drv->sta_mlo_info.valid_links, i) { in qca_nl80211_link_reconfig_event()
481 os_memcpy(drv->bssid, drv->sta_mlo_info.links[i].bssid, in qca_nl80211_link_reconfig_event()
483 drv->sta_mlo_info.assoc_link_id = i; in qca_nl80211_link_reconfig_event()
488 wpa_printf(MSG_DEBUG, "nl80211: Removed MLO links bitmap: 0x%x", in qca_nl80211_link_reconfig_event()
491 wpa_supplicant_event(drv->ctx, EVENT_LINK_RECONFIG, NULL); in qca_nl80211_link_reconfig_event()
518 mlo->valid_links |= BIT(link_id); in nl80211_parse_qca_vendor_mlo_link_info()
519 os_memcpy(mlo->links[link_id].addr, in nl80211_parse_qca_vendor_mlo_link_info()
522 os_memcpy(mlo->links[link_id].bssid, in nl80211_parse_qca_vendor_mlo_link_info()
527 link_id, MAC2STR(mlo->links[link_id].addr), in nl80211_parse_qca_vendor_mlo_link_info()
528 MAC2STR(mlo->links[link_id].bssid)); in nl80211_parse_qca_vendor_mlo_link_info()
558 mlo->req_links |= BIT(link_id); in nl80211_parse_mlo_link_info()
561 mlo->valid_links |= BIT(link_id); in nl80211_parse_mlo_link_info()
563 mlo->valid_links |= BIT(link_id); in nl80211_parse_mlo_link_info()
566 os_memcpy(mlo->links[link_id].addr, in nl80211_parse_mlo_link_info()
568 os_memcpy(mlo->links[link_id].bssid, in nl80211_parse_mlo_link_info()
572 link_id, MAC2STR(mlo->links[link_id].addr), in nl80211_parse_mlo_link_info()
573 MAC2STR(mlo->links[link_id].bssid)); in nl80211_parse_mlo_link_info()
579 /* bitmap of link IDs in Per-STA profile subelements */
592 mle_len - MULTI_LINK_CONTROL_LEN < mle[MULTI_LINK_CONTROL_LEN]) in nl80211_get_basic_mle_links_info()
597 rem_len = mle_len - in nl80211_get_basic_mle_links_info()
607 if (pos[0] == MULTI_LINK_SUB_ELEM_ID_PER_STA_PROFILE) { in nl80211_get_basic_mle_links_info()
624 info->non_assoc_links |= BIT(link_id); in nl80211_get_basic_mle_links_info()
625 os_memcpy(info->addr[link_id], in nl80211_get_basic_mle_links_info()
631 rem_len -= ie_len; in nl80211_get_basic_mle_links_info()
648 return -1; in nl80211_update_rejected_links_info()
652 &req_elems, 0) == ParseFailed || in nl80211_update_rejected_links_info()
654 &resp_elems, 0) == ParseFailed) { in nl80211_update_rejected_links_info()
657 return -1; in nl80211_update_rejected_links_info()
664 "nl80211: MLO: Basic Multi-Link element not found in Association Request"); in nl80211_update_rejected_links_info()
665 return -1; in nl80211_update_rejected_links_info()
667 os_memset(&req_info, 0, sizeof(req_info)); in nl80211_update_rejected_links_info()
676 "nl80211: MLO: Basic Multi-Link element not found in Association Response"); in nl80211_update_rejected_links_info()
677 return -1; in nl80211_update_rejected_links_info()
679 os_memset(&resp_info, 0, sizeof(resp_info)); in nl80211_update_rejected_links_info()
686 "nl80211: MLO: Association Request and Response links bitmaps not equal (0x%x != 0x%x)", in nl80211_update_rejected_links_info()
689 return -1; in nl80211_update_rejected_links_info()
692 mlo->req_links = BIT(mlo->assoc_link_id) | req_info.non_assoc_links; in nl80211_update_rejected_links_info()
693 if ((mlo->req_links & mlo->valid_links) != mlo->valid_links) { in nl80211_update_rejected_links_info()
695 …are not a subset of requested links (req_links=0x%x valid_links=0x%x non_assoc_links=0x%x assoc_li… in nl80211_update_rejected_links_info()
696 mlo->req_links, mlo->valid_links, in nl80211_update_rejected_links_info()
697 req_info.non_assoc_links, BIT(mlo->assoc_link_id)); in nl80211_update_rejected_links_info()
698 return -1; in nl80211_update_rejected_links_info()
702 for_each_link((mlo->req_links & ~mlo->valid_links), i) { in nl80211_update_rejected_links_info()
703 os_memcpy(mlo->links[i].bssid, resp_info.addr[i], ETH_ALEN); in nl80211_update_rejected_links_info()
704 os_memcpy(mlo->links[i].addr, req_info.addr[i], ETH_ALEN); in nl80211_update_rejected_links_info()
707 return 0; in nl80211_update_rejected_links_info()
716 return -1; in nl80211_get_assoc_link_id()
720 return -1; in nl80211_get_assoc_link_id()
723 (2 + /* Multi-Link Control field */ \ in nl80211_get_assoc_link_id()
727 return -1; in nl80211_get_assoc_link_id()
729 return data[BASIC_ML_IE_COMMON_INFO_LINK_ID_IDX] & 0x0F; in nl80211_get_assoc_link_id()
733 static void nl80211_parse_mlo_info(struct wpa_driver_nl80211_data *drv, in nl80211_parse_mlo_info() argument
741 struct driver_sta_mlo_info *mlo = &drv->sta_mlo_info; in nl80211_parse_mlo_info()
752 res = nl80211_get_assoc_link_id(&ml_ie[3], ml_ie[1] - 1); in nl80211_parse_mlo_info()
753 if (res < 0 || res >= MAX_NUM_MLD_LINKS) { in nl80211_parse_mlo_info()
759 drv->sta_mlo_info.assoc_link_id = res; in nl80211_parse_mlo_info()
761 os_memcpy(mlo->ap_mld_addr, nla_data(addr), ETH_ALEN); in nl80211_parse_mlo_info()
763 MAC2STR(mlo->ap_mld_addr)); in nl80211_parse_mlo_info()
772 if (!(mlo->valid_links & BIT(mlo->assoc_link_id)) || in nl80211_parse_mlo_info()
773 (!mlo->req_links && in nl80211_parse_mlo_info()
776 mlo->valid_links = 0; in nl80211_parse_mlo_info()
780 os_memcpy(drv->bssid, mlo->links[drv->sta_mlo_info.assoc_link_id].bssid, in nl80211_parse_mlo_info()
782 os_memcpy(drv->prev_bssid, drv->bssid, ETH_ALEN); in nl80211_parse_mlo_info()
788 qca_nl80211_tid_to_link_map_event(struct wpa_driver_nl80211_data *drv, in qca_nl80211_tid_to_link_map_event() argument
795 int i, rem, tidnum = 0; in qca_nl80211_tid_to_link_map_event()
797 os_memset(&event, 0, sizeof(event)); in qca_nl80211_tid_to_link_map_event()
808 if (!drv->sta_mlo_info.valid_links || in qca_nl80211_tid_to_link_map_event()
809 !ether_addr_equal(drv->sta_mlo_info.ap_mld_addr, ap_mld)) { in qca_nl80211_tid_to_link_map_event()
810 if (drv->pending_t2lm_data == data) { in qca_nl80211_tid_to_link_map_event()
812 …"nl80211: Drop pending TID-to-link mapping event since AP MLD not matched even after new connect/r… in qca_nl80211_tid_to_link_map_event()
813 os_free(drv->pending_t2lm_data); in qca_nl80211_tid_to_link_map_event()
814 drv->pending_t2lm_data = NULL; in qca_nl80211_tid_to_link_map_event()
818 "nl80211: Cache new TID-to-link map event until the next connect/roam event"); in qca_nl80211_tid_to_link_map_event()
819 if (drv->pending_t2lm_data) { in qca_nl80211_tid_to_link_map_event()
821 "nl80211: Override old TID-to-link map event data"); in qca_nl80211_tid_to_link_map_event()
822 os_free(drv->pending_t2lm_data); in qca_nl80211_tid_to_link_map_event()
824 drv->pending_t2lm_data = os_memdup(data, len); in qca_nl80211_tid_to_link_map_event()
825 if (!drv->pending_t2lm_data) in qca_nl80211_tid_to_link_map_event()
827 drv->pending_t2lm_data_len = len; in qca_nl80211_tid_to_link_map_event()
832 wpa_printf(MSG_DEBUG, "nl80211: Default TID-to-link map"); in qca_nl80211_tid_to_link_map_event()
849 "nl80211: TID-to-link: nla_parse_nested() failed"); in qca_nl80211_tid_to_link_map_event()
855 "nl80211: TID-to-link: uplink not present for tid: %d", in qca_nl80211_tid_to_link_map_event()
863 "nl80211: TID-to-link: downlink not present for tid: %d", in qca_nl80211_tid_to_link_map_event()
870 "nl80211: TID-to-link: Received uplink %x downlink %x", in qca_nl80211_tid_to_link_map_event()
872 for_each_link(drv->sta_mlo_info.valid_links, i) { in qca_nl80211_tid_to_link_map_event()
885 drv->sta_mlo_info.default_map = event.t2l_map_info.default_map; in qca_nl80211_tid_to_link_map_event()
887 event.t2l_map_info.valid_links = drv->sta_mlo_info.valid_links; in qca_nl80211_tid_to_link_map_event()
888 for (i = 0; i < MAX_NUM_MLD_LINKS && !drv->sta_mlo_info.default_map; in qca_nl80211_tid_to_link_map_event()
890 if (!(drv->sta_mlo_info.valid_links & BIT(i))) in qca_nl80211_tid_to_link_map_event()
893 drv->sta_mlo_info.links[i].t2lmap.uplink = in qca_nl80211_tid_to_link_map_event()
895 drv->sta_mlo_info.links[i].t2lmap.downlink = in qca_nl80211_tid_to_link_map_event()
899 wpa_supplicant_event(drv->ctx, EVENT_TID_LINK_MAP, &event); in qca_nl80211_tid_to_link_map_event()
904 static void mlme_event_connect(struct wpa_driver_nl80211_data *drv, in mlme_event_connect() argument
926 if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) { in mlme_event_connect()
936 drv->connect_reassoc = 0; in mlme_event_connect()
943 status_code, drv->ignore_next_local_disconnect); in mlme_event_connect()
948 os_memset(&event, 0, sizeof(event)); in mlme_event_connect()
952 if (drv->ignore_next_local_disconnect) { in mlme_event_connect()
953 drv->ignore_next_local_disconnect = 0; in mlme_event_connect()
956 drv->auth_attempt_bssid)) { in mlme_event_connect()
996 if (drv->get_sta_info_vendor_cmd_avail) { in mlme_event_connect()
999 reason_code = drv_get_connect_fail_reason_code(drv); in mlme_event_connect()
1005 wpa_supplicant_event(drv->ctx, EVENT_ASSOC_REJECT, &event); in mlme_event_connect()
1009 drv->associated = 1; in mlme_event_connect()
1010 os_memset(&drv->sta_mlo_info, 0, sizeof(drv->sta_mlo_info)); in mlme_event_connect()
1011 nl80211_parse_mlo_info(drv, qca_roam_auth, addr, mlo_links, req_ie, in mlme_event_connect()
1013 if (!drv->sta_mlo_info.valid_links && addr) { in mlme_event_connect()
1014 os_memcpy(drv->bssid, nla_data(addr), ETH_ALEN); in mlme_event_connect()
1015 os_memcpy(drv->prev_bssid, drv->bssid, ETH_ALEN); in mlme_event_connect()
1026 if (ssid && ssid[1] > 0 && ssid[1] <= 32) { in mlme_event_connect()
1027 drv->ssid_len = ssid[1]; in mlme_event_connect()
1028 os_memcpy(drv->ssid, ssid + 2, ssid[1]); in mlme_event_connect()
1030 "nl80211: Set drv->ssid based on req_ie to '%s'", in mlme_event_connect()
1031 wpa_ssid_txt(drv->ssid, in mlme_event_connect()
1032 drv->ssid_len)); in mlme_event_connect()
1041 event.assoc_info.freq = nl80211_get_assoc_freq(drv); in mlme_event_connect()
1042 drv->first_bss->flink->freq = drv->assoc_freq; in mlme_event_connect()
1044 if ((!ssid || ssid[1] == 0 || ssid[1] > 32) && in mlme_event_connect()
1045 (ssid_len = nl80211_get_assoc_ssid(drv, drv->ssid)) > 0) { in mlme_event_connect()
1047 * drv->ssid needs to be set here to satisfy later checking. */ in mlme_event_connect()
1048 drv->ssid_len = ssid_len; in mlme_event_connect()
1050 "nl80211: Set drv->ssid based on scan res info to '%s'", in mlme_event_connect()
1051 wpa_ssid_txt(drv->ssid, drv->ssid_len)); in mlme_event_connect()
1075 * attribute has the same values 0, 1, 2 as are used in the in mlme_event_connect()
1094 wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event); in mlme_event_connect()
1101 drv->ignore_next_local_disconnect = 0; in mlme_event_connect()
1104 if (drv->pending_t2lm_data) in mlme_event_connect()
1105 qca_nl80211_tid_to_link_map_event(drv, drv->pending_t2lm_data, in mlme_event_connect()
1106 drv->pending_t2lm_data_len); in mlme_event_connect()
1108 drv->sta_mlo_info.default_map = true; in mlme_event_connect()
1110 if (drv->pending_link_reconfig_data) in mlme_event_connect()
1112 drv, drv->pending_link_reconfig_data, in mlme_event_connect()
1113 drv->pending_link_reconfig_data_len); in mlme_event_connect()
1118 static void mlme_event_disconnect(struct wpa_driver_nl80211_data *drv, in mlme_event_disconnect() argument
1125 if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) { in mlme_event_disconnect()
1135 if (drv->ignore_next_local_disconnect) { in mlme_event_disconnect()
1136 drv->ignore_next_local_disconnect = 0; in mlme_event_disconnect()
1148 nl80211_mark_disconnected(drv); in mlme_event_disconnect()
1149 os_memset(&data, 0, sizeof(data)); in mlme_event_disconnect()
1153 wpa_supplicant_event(drv->ctx, EVENT_DEAUTH, &data); in mlme_event_disconnect()
1159 int freq1 = 0; in calculate_chan_offset()
1164 return 0; in calculate_chan_offset()
1166 freq1 = cf1 - 10; in calculate_chan_offset()
1169 freq1 = cf1 - 30; in calculate_chan_offset()
1172 freq1 = cf1 - 70; in calculate_chan_offset()
1175 freq1 = cf1 - 30; in calculate_chan_offset()
1178 freq1 = cf1 - 150; in calculate_chan_offset()
1186 return 0; in calculate_chan_offset()
1189 return (abs(freq - freq1) / 20) % 2 == 0 ? 1 : -1; in calculate_chan_offset()
1193 static void mlme_event_ch_switch(struct wpa_driver_nl80211_data *drv, in mlme_event_ch_switch() argument
1204 int chan_offset = 0; in mlme_event_ch_switch()
1214 bss = get_bss_ifindex(drv, ifidx); in mlme_event_ch_switch()
1227 ht_enabled = 0; in mlme_event_ch_switch()
1235 chan_offset = -1; in mlme_event_ch_switch()
1243 cf2 ? nla_get_u32(cf2) : 0); in mlme_event_ch_switch()
1247 …wpa_printf(MSG_WARNING, "nl80211: Unknown secondary channel information - following channel defini… in mlme_event_ch_switch()
1250 os_memset(&data, 0, sizeof(data)); in mlme_event_ch_switch()
1274 mld_link->freq = data.ch_switch.freq; in mlme_event_ch_switch()
1276 mld_link->bandwidth = channel_width_to_int( in mlme_event_ch_switch()
1279 bss->flink->freq = data.ch_switch.freq; in mlme_event_ch_switch()
1281 bss->flink->bandwidth = channel_width_to_int( in mlme_event_ch_switch()
1286 if (link && is_sta_interface(drv->nlmode)) { in mlme_event_ch_switch()
1290 drv->sta_mlo_info.valid_links & BIT(link_id)) { in mlme_event_ch_switch()
1291 drv->sta_mlo_info.links[link_id].freq = in mlme_event_ch_switch()
1294 bss->ctx, in mlme_event_ch_switch()
1299 if (link_id != drv->sta_mlo_info.assoc_link_id) in mlme_event_ch_switch()
1303 drv->assoc_freq = data.ch_switch.freq; in mlme_event_ch_switch()
1305 wpa_supplicant_event(bss->ctx, finished ? in mlme_event_ch_switch()
1310 static void mlme_timeout_event(struct wpa_driver_nl80211_data *drv, in mlme_timeout_event() argument
1329 os_memset(&event, 0, sizeof(event)); in mlme_timeout_event()
1331 wpa_supplicant_event(drv->ctx, ev, &event); in mlme_timeout_event()
1340 struct wpa_driver_nl80211_data *drv = bss->drv; in mlme_event_mgmt() local
1344 int ssi_signal = 0; in mlme_event_mgmt()
1345 int rx_freq = 0; in mlme_event_mgmt()
1354 fc = le_to_host16(mgmt->frame_control); in mlme_event_mgmt()
1360 os_memset(&event, 0, sizeof(event)); in mlme_event_mgmt()
1363 rx_freq = drv->last_mgmt_freq = event.rx_mgmt.freq; in mlme_event_mgmt()
1367 " freq=%d ssi_signal=%d fc=0x%x seq_ctrl=0x%x stype=%u (%s) len=%u", in mlme_event_mgmt()
1368 MAC2STR(mgmt->da), MAC2STR(mgmt->sa), MAC2STR(mgmt->bssid), in mlme_event_mgmt()
1370 le_to_host16(mgmt->seq_ctrl), stype, fc2str(fc), in mlme_event_mgmt()
1376 event.rx_mgmt.ctx = bss->ctx; in mlme_event_mgmt()
1379 wpa_supplicant_event(drv->ctx, EVENT_RX_MGMT, &event); in mlme_event_mgmt()
1389 struct wpa_driver_nl80211_data *drv = bss->drv; in mlme_event_mgmt_tx_status() local
1390 u16 fc = le_to_host16(hdr->frame_control); in mlme_event_mgmt_tx_status()
1391 u64 cookie_val = 0; in mlme_event_mgmt_tx_status()
1397 " %sstype=%d cookie=0x%llx%s ack=%d", in mlme_event_mgmt_tx_status()
1398 MAC2STR(hdr->addr1), in mlme_event_mgmt_tx_status()
1399 WLAN_FC_GET_TYPE(fc) != WLAN_FC_TYPE_MGMT ? "not-mgmt " : "", in mlme_event_mgmt_tx_status()
1403 if (cookie_val && cookie_val == drv->eapol_tx_cookie && in mlme_event_mgmt_tx_status()
1416 if (!is_ap_interface(drv->nlmode) && in mlme_event_mgmt_tx_status()
1422 "nl80211: Frame TX status: cookie=0x%llx%s (ack=%d)", in mlme_event_mgmt_tx_status()
1424 cookie_val == drv->send_frame_cookie ? in mlme_event_mgmt_tx_status()
1426 if (cookie_val != drv->send_frame_cookie) in mlme_event_mgmt_tx_status()
1428 } else if (!is_ap_interface(drv->nlmode) && in mlme_event_mgmt_tx_status()
1435 os_memset(&event, 0, sizeof(event)); in mlme_event_mgmt_tx_status()
1438 event.tx_status.dst = hdr->addr1; in mlme_event_mgmt_tx_status()
1442 event.tx_status.link_id = cookie_val == drv->send_frame_cookie ? in mlme_event_mgmt_tx_status()
1443 drv->send_frame_link_id : NL80211_DRV_LINK_ID_NA; in mlme_event_mgmt_tx_status()
1444 wpa_supplicant_event(bss->ctx, EVENT_TX_STATUS, &event); in mlme_event_mgmt_tx_status()
1448 static void mlme_event_deauth_disassoc(struct wpa_driver_nl80211_data *drv, in mlme_event_deauth_disassoc() argument
1455 u16 reason_code = 0; in mlme_event_deauth_disassoc()
1464 bssid = mgmt->bssid; in mlme_event_deauth_disassoc()
1466 if ((drv->capa.flags & WPA_DRIVER_FLAGS_SME) && in mlme_event_deauth_disassoc()
1467 !drv->associated && in mlme_event_deauth_disassoc()
1468 !ether_addr_equal(bssid, drv->auth_bssid) && in mlme_event_deauth_disassoc()
1469 !ether_addr_equal(bssid, drv->auth_attempt_bssid) && in mlme_event_deauth_disassoc()
1470 ether_addr_equal(bssid, drv->prev_bssid)) { in mlme_event_deauth_disassoc()
1479 if (ether_addr_equal(mgmt->sa, drv->first_bss->addr) || in mlme_event_deauth_disassoc()
1480 (!is_zero_ether_addr(drv->first_bss->prev_addr) && in mlme_event_deauth_disassoc()
1481 ether_addr_equal(mgmt->sa, in mlme_event_deauth_disassoc()
1482 drv->first_bss->prev_addr))) { in mlme_event_deauth_disassoc()
1485 drv->ignore_next_local_deauth = 0; in mlme_event_deauth_disassoc()
1490 MAC2STR(drv->auth_attempt_bssid)); in mlme_event_deauth_disassoc()
1495 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME) && in mlme_event_deauth_disassoc()
1496 drv->connect_reassoc && drv->associated && in mlme_event_deauth_disassoc()
1497 ether_addr_equal(bssid, drv->prev_bssid) && in mlme_event_deauth_disassoc()
1498 !ether_addr_equal(bssid, drv->auth_attempt_bssid)) { in mlme_event_deauth_disassoc()
1509 MAC2STR(drv->auth_attempt_bssid)); in mlme_event_deauth_disassoc()
1513 if (drv->associated != 0 && in mlme_event_deauth_disassoc()
1514 !ether_addr_equal(bssid, drv->bssid) && in mlme_event_deauth_disassoc()
1515 !ether_addr_equal(bssid, drv->auth_bssid)) { in mlme_event_deauth_disassoc()
1522 "from Unknown BSSID " MACSTR " -- ignoring", in mlme_event_deauth_disassoc()
1528 nl80211_mark_disconnected(drv); in mlme_event_deauth_disassoc()
1529 os_memset(&event, 0, sizeof(event)); in mlme_event_deauth_disassoc()
1532 if (len >= 24 + sizeof(mgmt->u.deauth)) in mlme_event_deauth_disassoc()
1533 reason_code = le_to_host16(mgmt->u.deauth.reason_code); in mlme_event_deauth_disassoc()
1537 ether_addr_equal(mgmt->sa, drv->first_bss->addr); in mlme_event_deauth_disassoc()
1540 if (frame + len > mgmt->u.disassoc.variable) { in mlme_event_deauth_disassoc()
1541 event.disassoc_info.ie = mgmt->u.disassoc.variable; in mlme_event_deauth_disassoc()
1542 event.disassoc_info.ie_len = frame + len - in mlme_event_deauth_disassoc()
1543 mgmt->u.disassoc.variable; in mlme_event_deauth_disassoc()
1547 ether_addr_equal(mgmt->sa, drv->first_bss->addr); in mlme_event_deauth_disassoc()
1548 if (drv->ignore_deauth_event) { in mlme_event_deauth_disassoc()
1549 wpa_printf(MSG_DEBUG, "nl80211: Ignore deauth event due to previous forced deauth-during-auth"); in mlme_event_deauth_disassoc()
1550 drv->ignore_deauth_event = 0; in mlme_event_deauth_disassoc()
1552 drv->ignore_next_local_deauth = 0; in mlme_event_deauth_disassoc()
1555 if (drv->ignore_next_local_deauth) { in mlme_event_deauth_disassoc()
1556 drv->ignore_next_local_deauth = 0; in mlme_event_deauth_disassoc()
1565 if (frame + len > mgmt->u.deauth.variable) { in mlme_event_deauth_disassoc()
1566 event.deauth_info.ie = mgmt->u.deauth.variable; in mlme_event_deauth_disassoc()
1567 event.deauth_info.ie_len = frame + len - in mlme_event_deauth_disassoc()
1568 mgmt->u.deauth.variable; in mlme_event_deauth_disassoc()
1572 wpa_supplicant_event(drv->ctx, type, &event); in mlme_event_deauth_disassoc()
1576 static void mlme_event_unprot_disconnect(struct wpa_driver_nl80211_data *drv, in mlme_event_unprot_disconnect() argument
1582 u16 reason_code = 0; in mlme_event_unprot_disconnect()
1594 os_memset(&event, 0, sizeof(event)); in mlme_event_unprot_disconnect()
1596 if (len >= 24 + sizeof(mgmt->u.deauth)) in mlme_event_unprot_disconnect()
1597 reason_code = le_to_host16(mgmt->u.deauth.reason_code); in mlme_event_unprot_disconnect()
1600 event.unprot_disassoc.sa = mgmt->sa; in mlme_event_unprot_disconnect()
1601 event.unprot_disassoc.da = mgmt->da; in mlme_event_unprot_disconnect()
1604 event.unprot_deauth.sa = mgmt->sa; in mlme_event_unprot_disconnect()
1605 event.unprot_deauth.da = mgmt->da; in mlme_event_unprot_disconnect()
1609 wpa_supplicant_event(drv->ctx, type, &event); in mlme_event_unprot_disconnect()
1613 static void mlme_event_unprot_beacon(struct wpa_driver_nl80211_data *drv, in mlme_event_unprot_beacon() argument
1624 os_memset(&event, 0, sizeof(event)); in mlme_event_unprot_beacon()
1625 event.unprot_beacon.sa = mgmt->sa; in mlme_event_unprot_beacon()
1626 wpa_supplicant_event(drv->ctx, EVENT_UNPROT_BEACON, &event); in mlme_event_unprot_beacon()
1635 for_each_link(bss->valid_links, i) { in nl80211_get_link_id_by_freq()
1636 if ((unsigned int) bss->links[i].freq == freq) in nl80211_get_link_id_by_freq()
1652 struct wpa_driver_nl80211_data *drv = bss->drv; in mlme_event() local
1653 u16 stype = 0, auth_type = 0; in mlme_event()
1656 int link_id = -1; in mlme_event()
1660 mlme_timeout_event(drv, cmd, addr); in mlme_event()
1678 if (nl80211_link_valid(bss->valid_links, link_id)) in mlme_event()
1685 MACSTR ") - too short", in mlme_event()
1686 cmd, nl80211_command_to_string(cmd), bss->ifname, in mlme_event()
1687 MAC2STR(bss->addr)); in mlme_event()
1692 nl80211_command_to_string(cmd), bss->ifname, in mlme_event()
1693 MAC2STR(bss->addr), MAC2STR(data + 4), in mlme_event()
1704 fc = le_to_host16(mgmt->frame_control); in mlme_event()
1706 auth_type = le_to_host16(mgmt->u.auth.auth_alg); in mlme_event()
1713 bss->ifname); in mlme_event()
1715 !(data[4] & 0x01) && in mlme_event()
1716 !ether_addr_equal(bss->addr, data + 4) && in mlme_event()
1717 (is_zero_ether_addr(bss->rand_addr) || in mlme_event()
1718 !ether_addr_equal(bss->rand_addr, data + 4)) && in mlme_event()
1719 !ether_addr_equal(bss->addr, data + 4 + ETH_ALEN) && in mlme_event()
1720 (is_zero_ether_addr(drv->first_bss->prev_addr) || in mlme_event()
1721 !ether_addr_equal(bss->prev_addr, data + 4 + ETH_ALEN)) && in mlme_event()
1723 !ether_addr_equal(mld_link->addr, data + 4))) { in mlme_event()
1725 "for foreign address", bss->ifname); in mlme_event()
1733 mlme_event_auth(drv, nla_data(frame), nla_len(frame)); in mlme_event()
1736 mlme_event_assoc(drv, nla_data(frame), nla_len(frame), wmm, in mlme_event()
1740 mlme_event_deauth_disassoc(drv, EVENT_DEAUTH, in mlme_event()
1744 mlme_event_deauth_disassoc(drv, EVENT_DISASSOC, in mlme_event()
1756 mlme_event_unprot_disconnect(drv, EVENT_UNPROT_DEAUTH, in mlme_event()
1760 mlme_event_unprot_disconnect(drv, EVENT_UNPROT_DISASSOC, in mlme_event()
1764 mlme_event_unprot_beacon(drv, nla_data(frame), nla_len(frame)); in mlme_event()
1778 os_memset(&data, 0, sizeof(data)); in mlme_event_michael_mic_failure()
1804 wpa_supplicant_event(bss->ctx, EVENT_MICHAEL_MIC_FAILURE, &data); in mlme_event_michael_mic_failure()
1808 static void mlme_event_join_ibss(struct wpa_driver_nl80211_data *drv, in mlme_event_join_ibss() argument
1819 os_memcpy(drv->bssid, nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN); in mlme_event_join_ibss()
1821 drv->associated = 1; in mlme_event_join_ibss()
1823 MAC2STR(drv->bssid)); in mlme_event_join_ibss()
1825 freq = nl80211_get_assoc_freq(drv); in mlme_event_join_ibss()
1829 drv->first_bss->flink->freq = freq; in mlme_event_join_ibss()
1832 os_memset(&event, 0, sizeof(event)); in mlme_event_join_ibss()
1835 wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event); in mlme_event_join_ibss()
1839 static void mlme_event_remain_on_channel(struct wpa_driver_nl80211_data *drv, in mlme_event_remain_on_channel() argument
1849 freq = 0; in mlme_event_remain_on_channel()
1854 chan_type = 0; in mlme_event_remain_on_channel()
1859 duration = 0; in mlme_event_remain_on_channel()
1864 cookie = 0; in mlme_event_remain_on_channel()
1866 wpa_printf(MSG_DEBUG, "nl80211: Remain-on-channel event (cancel=%d " in mlme_event_remain_on_channel()
1867 "freq=%u channel_type=%u duration=%u cookie=0x%llx (%s))", in mlme_event_remain_on_channel()
1870 cookie == drv->remain_on_chan_cookie ? "match" : "unknown"); in mlme_event_remain_on_channel()
1872 if (cookie != drv->remain_on_chan_cookie) in mlme_event_remain_on_channel()
1876 drv->pending_remain_on_chan = 0; in mlme_event_remain_on_channel()
1878 os_memset(&data, 0, sizeof(data)); in mlme_event_remain_on_channel()
1881 wpa_supplicant_event(drv->ctx, cancel_event ? in mlme_event_remain_on_channel()
1887 static void mlme_event_ft_event(struct wpa_driver_nl80211_data *drv, in mlme_event_ft_event() argument
1892 os_memset(&data, 0, sizeof(data)); in mlme_event_ft_event()
1911 wpa_supplicant_event(drv->ctx, EVENT_FT_RESPONSE, &data); in mlme_event_ft_event()
1915 static void mlme_event_dh_event(struct wpa_driver_nl80211_data *drv, in mlme_event_dh_event() argument
1921 int assoc_link_id = -1; in mlme_event_dh_event()
1923 if (!is_ap_interface(drv->nlmode)) in mlme_event_dh_event()
1928 os_memset(&data, 0, sizeof(data)); in mlme_event_dh_event()
1931 if (!bss->valid_links && in mlme_event_dh_event()
1935 "nl80211: Link info not expected for DH event for non-MLD AP"); in mlme_event_dh_event()
1961 wpa_printf(MSG_DEBUG, "nl80211: DH event - peer " MACSTR, in mlme_event_dh_event()
1964 wpa_supplicant_event(bss->ctx, EVENT_UPDATE_DH, &data); in mlme_event_dh_event()
1968 static void send_scan_event(struct wpa_driver_nl80211_data *drv, int aborted, in send_scan_event() argument
1977 int num_freqs = 0; in send_scan_event()
1979 if (!external_scan && drv->scan_for_auth) { in send_scan_event()
1980 drv->scan_for_auth = 0; in send_scan_event()
1983 wpa_driver_nl80211_authenticate_retry(drv); in send_scan_event()
1987 os_memset(&event, 0, sizeof(event)); in send_scan_event()
1989 info->aborted = aborted; in send_scan_event()
1990 info->external_scan = external_scan; in send_scan_event()
1991 info->nl_scan_event = 1; in send_scan_event()
1996 &info->ssids[info->num_ssids]; in send_scan_event()
1997 s->ssid = nla_data(nl); in send_scan_event()
1998 s->ssid_len = nla_len(nl); in send_scan_event()
2000 wpa_ssid_txt(s->ssid, s->ssid_len)); in send_scan_event()
2001 info->num_ssids++; in send_scan_event()
2002 if (info->num_ssids == WPAS_MAX_SCAN_SSIDS) in send_scan_event()
2012 *pos = '\0'; in send_scan_event()
2017 res = os_snprintf(pos, end - pos, " %d", in send_scan_event()
2019 if (!os_snprintf_error(end - pos, res)) in send_scan_event()
2025 info->freqs = freqs; in send_scan_event()
2026 info->num_freqs = num_freqs; in send_scan_event()
2027 msg[sizeof(msg) - 1] = '\0'; in send_scan_event()
2034 info->scan_start_tsf = in send_scan_event()
2036 os_memcpy(info->scan_start_tsf_bssid, in send_scan_event()
2041 wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, &event); in send_scan_event()
2045 static void nl80211_cqm_event(struct wpa_driver_nl80211_data *drv, in nl80211_cqm_event() argument
2070 os_memset(&ed, 0, sizeof(ed)); in nl80211_cqm_event()
2082 wpa_supplicant_event(drv->ctx, EVENT_STATION_LOW_ACK, &ed); in nl80211_cqm_event()
2088 wpa_supplicant_event(drv->ctx, EVENT_BEACON_LOSS, NULL); in nl80211_cqm_event()
2119 ed.signal_change.above_threshold = 0; in nl80211_cqm_event()
2131 res = nl80211_get_link_signal(drv, drv->bssid, &ed.signal_change.data); in nl80211_cqm_event()
2132 if (res == 0) { in nl80211_cqm_event()
2141 res = nl80211_get_link_noise(drv, &ed.signal_change); in nl80211_cqm_event()
2142 if (res == 0) { in nl80211_cqm_event()
2150 wpa_supplicant_event(drv->ctx, EVENT_SIGNAL_CHANGE, &ed); in nl80211_cqm_event()
2154 static void nl80211_new_peer_candidate(struct wpa_driver_nl80211_data *drv, in nl80211_new_peer_candidate() argument
2160 if (drv->nlmode != NL80211_IFTYPE_MESH_POINT || in nl80211_new_peer_candidate()
2168 os_memset(&data, 0, sizeof(data)); in nl80211_new_peer_candidate()
2172 wpa_supplicant_event(drv->ctx, EVENT_NEW_PEER_CANDIDATE, &data); in nl80211_new_peer_candidate()
2176 static void nl80211_new_station_event(struct wpa_driver_nl80211_data *drv, in nl80211_new_station_event() argument
2189 if (is_ap_interface(drv->nlmode) && drv->device_ap_sme) { in nl80211_new_station_event()
2191 int assoc_link_id = -1; in nl80211_new_station_event()
2193 size_t req_ies_len = 0, resp_ies_len = 0; in nl80211_new_station_event()
2195 if (!bss->valid_links && in nl80211_new_station_event()
2199 "nl80211: MLO info not expected for new station event for non-MLD AP"); in nl80211_new_station_event()
2231 drv_event_assoc(bss->ctx, peer_addr, req_ies, req_ies_len, in nl80211_new_station_event()
2233 assoc_link_id, 0); in nl80211_new_station_event()
2237 if (drv->nlmode != NL80211_IFTYPE_ADHOC) in nl80211_new_station_event()
2240 os_memset(&data, 0, sizeof(data)); in nl80211_new_station_event()
2242 wpa_supplicant_event(bss->ctx, EVENT_IBSS_RSN_START, &data); in nl80211_new_station_event()
2246 static void nl80211_del_station_event(struct wpa_driver_nl80211_data *drv, in nl80211_del_station_event() argument
2259 if (is_ap_interface(drv->nlmode) && drv->device_ap_sme) { in nl80211_del_station_event()
2260 drv_event_disassoc(bss->ctx, addr); in nl80211_del_station_event()
2264 if (drv->nlmode != NL80211_IFTYPE_ADHOC) in nl80211_del_station_event()
2267 os_memset(&data, 0, sizeof(data)); in nl80211_del_station_event()
2269 wpa_supplicant_event(bss->ctx, EVENT_IBSS_PEER_LOST, &data); in nl80211_del_station_event()
2273 static void nl80211_rekey_offload_event(struct wpa_driver_nl80211_data *drv, in nl80211_rekey_offload_event() argument
2300 os_memset(&data, 0, sizeof(data)); in nl80211_rekey_offload_event()
2306 wpa_hexdump(MSG_DEBUG, "nl80211: Rekey offload - Replay Counter", in nl80211_rekey_offload_event()
2308 wpa_supplicant_event(drv->ctx, EVENT_DRIVER_GTK_REKEY, &data); in nl80211_rekey_offload_event()
2312 static void nl80211_pmksa_candidate_event(struct wpa_driver_nl80211_data *drv, in nl80211_pmksa_candidate_event() argument
2335 os_memset(&data, 0, sizeof(data)); in nl80211_pmksa_candidate_event()
2342 wpa_supplicant_event(drv->ctx, EVENT_PMKID_CANDIDATE, &data); in nl80211_pmksa_candidate_event()
2346 static void nl80211_client_probe_event(struct wpa_driver_nl80211_data *drv, in nl80211_client_probe_event() argument
2351 u64 cookie = 0; in nl80211_client_probe_event()
2365 os_memset(&data, 0, sizeof(data)); in nl80211_client_probe_event()
2367 wpa_supplicant_event(drv->ctx, EVENT_DRIVER_CLIENT_POLL_OK, &data); in nl80211_client_probe_event()
2371 static void nl80211_tdls_oper_event(struct wpa_driver_nl80211_data *drv, in nl80211_tdls_oper_event() argument
2381 os_memset(&data, 0, sizeof(data)); in nl80211_tdls_oper_event()
2410 wpa_supplicant_event(drv->ctx, EVENT_TDLS, &data); in nl80211_tdls_oper_event()
2414 static void nl80211_stop_ap(struct wpa_driver_nl80211_data *drv, in nl80211_stop_ap() argument
2417 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_UNAVAILABLE, NULL); in nl80211_stop_ap()
2421 static void nl80211_connect_failed_event(struct wpa_driver_nl80211_data *drv, in nl80211_connect_failed_event() argument
2432 os_memset(&data, 0, sizeof(data)); in nl80211_connect_failed_event()
2454 wpa_supplicant_event(drv->ctx, EVENT_CONNECT_FAILED_REASON, &data); in nl80211_connect_failed_event()
2458 static void nl80211_radar_event(struct wpa_driver_nl80211_data *drv, in nl80211_radar_event() argument
2467 os_memset(&data, 0, sizeof(data)); in nl80211_radar_event()
2477 nl80211_get_link_id_by_freq(drv->first_bss, in nl80211_radar_event()
2484 data.dfs_event.chan_offset = 0; in nl80211_radar_event()
2488 data.dfs_event.ht_enabled = 0; in nl80211_radar_event()
2496 data.dfs_event.chan_offset = -1; in nl80211_radar_event()
2520 wpa_supplicant_event(drv->ctx, EVENT_DFS_RADAR_DETECTED, &data); in nl80211_radar_event()
2523 wpa_supplicant_event(drv->ctx, EVENT_DFS_CAC_FINISHED, &data); in nl80211_radar_event()
2526 wpa_supplicant_event(drv->ctx, EVENT_DFS_CAC_ABORTED, &data); in nl80211_radar_event()
2529 wpa_supplicant_event(drv->ctx, EVENT_DFS_NOP_FINISHED, &data); in nl80211_radar_event()
2532 wpa_supplicant_event(drv->ctx, EVENT_DFS_PRE_CAC_EXPIRED, in nl80211_radar_event()
2536 wpa_supplicant_event(drv->ctx, EVENT_DFS_CAC_STARTED, &data); in nl80211_radar_event()
2549 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_spurious_frame() local
2555 os_memset(&event, 0, sizeof(event)); in nl80211_spurious_frame()
2556 event.rx_from_unknown.bssid = bss->addr; in nl80211_spurious_frame()
2560 wpa_supplicant_event(drv->ctx, EVENT_RX_FROM_UNKNOWN, &event); in nl80211_spurious_frame()
2566 static void qca_nl80211_avoid_freq(struct wpa_driver_nl80211_data *drv, in qca_nl80211_avoid_freq() argument
2575 if (len < sizeof(freq_range->count)) in qca_nl80211_avoid_freq()
2578 count = freq_range->count; in qca_nl80211_avoid_freq()
2579 if (len < sizeof(freq_range->count) + in qca_nl80211_avoid_freq()
2586 if (count > 0) { in qca_nl80211_avoid_freq()
2592 os_memset(&event, 0, sizeof(event)); in qca_nl80211_avoid_freq()
2593 for (i = 0; i < count; i++) { in qca_nl80211_avoid_freq()
2595 range[idx].min = freq_range->range[i].start_freq; in qca_nl80211_avoid_freq()
2596 range[idx].max = freq_range->range[i].end_freq; in qca_nl80211_avoid_freq()
2597 wpa_printf(MSG_DEBUG, "nl80211: Avoid frequency range: %u-%u", in qca_nl80211_avoid_freq()
2607 wpa_supplicant_event(drv->ctx, EVENT_AVOID_FREQUENCIES, &event); in qca_nl80211_avoid_freq()
2632 static unsigned int chan_to_freq(struct wpa_driver_nl80211_data *drv, in chan_to_freq() argument
2642 modes = nl80211_get_hw_feature_data(drv->first_bss, &num_modes, in chan_to_freq()
2650 hw_mode = modes[0].mode; in chan_to_freq()
2652 for (i = 0; i < num_modes; i++) { in chan_to_freq()
2663 return 0; in chan_to_freq()
2674 return 0; in chan_to_freq()
2678 static void qca_nl80211_acs_select_ch(struct wpa_driver_nl80211_data *drv, in qca_nl80211_acs_select_ch() argument
2696 os_memset(&event, 0, sizeof(event)); in qca_nl80211_acs_select_ch()
2719 chan_to_freq(drv, chan, in qca_nl80211_acs_select_ch()
2730 chan_to_freq(drv, chan, in qca_nl80211_acs_select_ch()
2753 event.acs_selected_channels.link_id = -1; in qca_nl80211_acs_select_ch()
2756 … PFreq: %d SFreq: %d BW: %d VHT0: %d VHT1: %d HW_MODE: %d EDMGCH: %d PUNCBITMAP: 0x%x, LinkId: %d", in qca_nl80211_acs_select_ch()
2769 wpa_supplicant_event(drv->ctx, EVENT_ACS_CHANNEL_SELECTED, &event); in qca_nl80211_acs_select_ch()
2773 static void qca_nl80211_key_mgmt_auth(struct wpa_driver_nl80211_data *drv, in qca_nl80211_key_mgmt_auth() argument
2794 mlme_event_connect(drv, NL80211_CMD_ROAM, true, NULL, in qca_nl80211_key_mgmt_auth()
2812 drv, OUI_QCA, QCA_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH, in qca_nl80211_key_mgmt_auth()
2820 qca_nl80211_key_mgmt_auth_handler(struct wpa_driver_nl80211_data *drv, in qca_nl80211_key_mgmt_auth_handler() argument
2823 if (!drv->roam_indication_done) { in qca_nl80211_key_mgmt_auth_handler()
2827 os_free(drv->pending_roam_data); in qca_nl80211_key_mgmt_auth_handler()
2828 drv->pending_roam_data = os_memdup(data, len); in qca_nl80211_key_mgmt_auth_handler()
2829 if (!drv->pending_roam_data) in qca_nl80211_key_mgmt_auth_handler()
2831 drv->pending_roam_data_len = len; in qca_nl80211_key_mgmt_auth_handler()
2834 drv->roam_indication_done = false; in qca_nl80211_key_mgmt_auth_handler()
2835 qca_nl80211_key_mgmt_auth(drv, data, len); in qca_nl80211_key_mgmt_auth_handler()
2840 struct wpa_driver_nl80211_data *drv, u32 subcmd, u8 *msg, int length) in qca_nl80211_dfs_offload_radar_event() argument
2858 os_memset(&data, 0, sizeof(data)); in qca_nl80211_dfs_offload_radar_event()
2867 nl80211_get_link_id_by_freq(drv->first_bss, in qca_nl80211_dfs_offload_radar_event()
2877 data.dfs_event.chan_offset = 0; in qca_nl80211_dfs_offload_radar_event()
2881 data.dfs_event.ht_enabled = 0; in qca_nl80211_dfs_offload_radar_event()
2889 data.dfs_event.chan_offset = -1; in qca_nl80211_dfs_offload_radar_event()
2912 wpa_supplicant_event(drv->ctx, EVENT_DFS_RADAR_DETECTED, &data); in qca_nl80211_dfs_offload_radar_event()
2915 wpa_supplicant_event(drv->ctx, EVENT_DFS_CAC_STARTED, &data); in qca_nl80211_dfs_offload_radar_event()
2918 wpa_supplicant_event(drv->ctx, EVENT_DFS_CAC_FINISHED, &data); in qca_nl80211_dfs_offload_radar_event()
2921 wpa_supplicant_event(drv->ctx, EVENT_DFS_CAC_ABORTED, &data); in qca_nl80211_dfs_offload_radar_event()
2924 wpa_supplicant_event(drv->ctx, EVENT_DFS_NOP_FINISHED, &data); in qca_nl80211_dfs_offload_radar_event()
2935 static void qca_nl80211_scan_trigger_event(struct wpa_driver_nl80211_data *drv, in qca_nl80211_scan_trigger_event() argument
2939 u64 cookie = 0; in qca_nl80211_scan_trigger_event()
2949 if (cookie != drv->vendor_scan_cookie) { in qca_nl80211_scan_trigger_event()
2955 os_memset(&event, 0, sizeof(event)); in qca_nl80211_scan_trigger_event()
2957 info->external_scan = 0; in qca_nl80211_scan_trigger_event()
2958 info->nl_scan_event = 0; in qca_nl80211_scan_trigger_event()
2960 drv->scan_state = SCAN_STARTED; in qca_nl80211_scan_trigger_event()
2961 wpa_supplicant_event(drv->ctx, EVENT_SCAN_STARTED, &event); in qca_nl80211_scan_trigger_event()
2965 static void send_vendor_scan_event(struct wpa_driver_nl80211_data *drv, in send_vendor_scan_event() argument
2974 int num_freqs = 0; in send_vendor_scan_event()
2976 os_memset(&event, 0, sizeof(event)); in send_vendor_scan_event()
2978 info->aborted = aborted; in send_vendor_scan_event()
2979 info->external_scan = external_scan; in send_vendor_scan_event()
2980 info->scan_cookie = nla_get_u64(tb[QCA_WLAN_VENDOR_ATTR_SCAN_COOKIE]); in send_vendor_scan_event()
2986 &info->ssids[info->num_ssids]; in send_vendor_scan_event()
2987 s->ssid = nla_data(nl); in send_vendor_scan_event()
2988 s->ssid_len = nla_len(nl); in send_vendor_scan_event()
2991 wpa_ssid_txt(s->ssid, s->ssid_len)); in send_vendor_scan_event()
2992 info->num_ssids++; in send_vendor_scan_event()
2993 if (info->num_ssids == WPAS_MAX_SCAN_SSIDS) in send_vendor_scan_event()
3004 *pos = '\0'; in send_vendor_scan_event()
3010 res = os_snprintf(pos, end - pos, " %d", in send_vendor_scan_event()
3012 if (!os_snprintf_error(end - pos, res)) in send_vendor_scan_event()
3015 if (num_freqs == MAX_REPORT_FREQS - 1) in send_vendor_scan_event()
3019 info->freqs = freqs; in send_vendor_scan_event()
3020 info->num_freqs = num_freqs; in send_vendor_scan_event()
3024 wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, &event); in send_vendor_scan_event()
3028 static void qca_nl80211_scan_done_event(struct wpa_driver_nl80211_data *drv, in qca_nl80211_scan_done_event() argument
3032 u64 cookie = 0; in qca_nl80211_scan_done_event()
3047 if (cookie != drv->vendor_scan_cookie) { in qca_nl80211_scan_done_event()
3051 external_scan = 0; in qca_nl80211_scan_done_event()
3053 drv->scan_state = SCAN_COMPLETED; in qca_nl80211_scan_done_event()
3055 drv->scan_state = SCAN_ABORTED; in qca_nl80211_scan_done_event()
3057 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, in qca_nl80211_scan_done_event()
3058 drv->ctx); in qca_nl80211_scan_done_event()
3059 drv->vendor_scan_cookie = 0; in qca_nl80211_scan_done_event()
3060 drv->last_scan_cmd = 0; in qca_nl80211_scan_done_event()
3063 send_vendor_scan_event(drv, (status == VENDOR_SCAN_STATUS_ABORTED), tb, in qca_nl80211_scan_done_event()
3068 static void qca_nl80211_p2p_lo_stop_event(struct wpa_driver_nl80211_data *drv, in qca_nl80211_p2p_lo_stop_event() argument
3082 os_memset(&event, 0, sizeof(event)); in qca_nl80211_p2p_lo_stop_event()
3089 wpa_supplicant_event(drv->ctx, EVENT_P2P_LO_STOP, &event); in qca_nl80211_p2p_lo_stop_event()
3095 static void qca_nl80211_pasn_auth(struct wpa_driver_nl80211_data *drv, in qca_nl80211_pasn_auth() argument
3098 int ret = -EINVAL; in qca_nl80211_pasn_auth()
3102 unsigned int n_peers = 0, idx = 0; in qca_nl80211_pasn_auth()
3114 os_memset(&event, 0, sizeof(event)); in qca_nl80211_pasn_auth()
3163 wpa_supplicant_event(drv->ctx, EVENT_PASN_AUTH, &event); in qca_nl80211_pasn_auth()
3171 static void nl80211_vendor_event_qca(struct wpa_driver_nl80211_data *drv, in nl80211_vendor_event_qca() argument
3180 qca_nl80211_avoid_freq(drv, data, len); in nl80211_vendor_event_qca()
3183 qca_nl80211_key_mgmt_auth_handler(drv, data, len); in nl80211_vendor_event_qca()
3186 qca_nl80211_acs_select_ch(drv, data, len); in nl80211_vendor_event_qca()
3193 qca_nl80211_dfs_offload_radar_event(drv, subcmd, data, len); in nl80211_vendor_event_qca()
3196 qca_nl80211_scan_trigger_event(drv, data, len); in nl80211_vendor_event_qca()
3199 qca_nl80211_scan_done_event(drv, data, len); in nl80211_vendor_event_qca()
3202 qca_nl80211_p2p_lo_stop_event(drv, data, len); in nl80211_vendor_event_qca()
3206 qca_nl80211_pasn_auth(drv, data, len); in nl80211_vendor_event_qca()
3210 qca_nl80211_tid_to_link_map_event(drv, data, len); in nl80211_vendor_event_qca()
3213 qca_nl80211_link_reconfig_event(drv, data, len); in nl80211_vendor_event_qca()
3227 static void brcm_nl80211_acs_select_ch(struct wpa_driver_nl80211_data *drv, in brcm_nl80211_acs_select_ch() argument
3242 os_memset(&event, 0, sizeof(event)); in brcm_nl80211_acs_select_ch()
3278 wpa_supplicant_event(drv->ctx, EVENT_ACS_CHANNEL_SELECTED, &event); in brcm_nl80211_acs_select_ch()
3282 static void nl80211_vendor_event_brcm(struct wpa_driver_nl80211_data *drv, in nl80211_vendor_event_brcm() argument
3293 brcm_nl80211_acs_select_ch(drv, data, len); in nl80211_vendor_event_brcm()
3306 static void nl80211_vendor_event(struct wpa_driver_nl80211_data *drv, in nl80211_vendor_event() argument
3309 u32 vendor_id, subcmd, wiphy = 0; in nl80211_vendor_event()
3312 size_t len = 0; in nl80211_vendor_event()
3324 wpa_printf(MSG_DEBUG, "nl80211: Vendor event: wiphy=%u vendor_id=0x%x subcmd=%u", in nl80211_vendor_event()
3333 wiphy_idx = nl80211_get_wiphy_index(drv->first_bss); in nl80211_vendor_event()
3334 if (wiphy_idx >= 0 && wiphy_idx != (int) wiphy) { in nl80211_vendor_event()
3344 * qca_nl80211_key_mgmt_auth() and drv->pending_roam_data). */ in nl80211_vendor_event()
3347 wpa_driver_nl80211_driver_event(drv, vendor_id, subcmd, data, in nl80211_vendor_event()
3354 nl80211_vendor_event_qca(drv, subcmd, data, len); in nl80211_vendor_event()
3358 nl80211_vendor_event_brcm(drv, subcmd, data, len); in nl80211_vendor_event()
3368 static void nl80211_reg_change_event(struct wpa_driver_nl80211_data *drv, in nl80211_reg_change_event() argument
3379 os_memset(&data, 0, sizeof(data)); in nl80211_reg_change_event()
3427 wpa_supplicant_event(drv->ctx, EVENT_CHANNEL_LIST_CHANGED, &data); in nl80211_reg_change_event()
3442 u32 freq = 0, max_tx_power = 0; in nl80211_parse_freq_attrs()
3457 tb[NL80211_FREQUENCY_ATTR_NO_IR] ? " no-IR" : "", in nl80211_parse_freq_attrs()
3460 attrs->freq = freq; in nl80211_parse_freq_attrs()
3461 attrs->max_tx_power = max_tx_power; in nl80211_parse_freq_attrs()
3463 attrs->disabled = true; in nl80211_parse_freq_attrs()
3465 attrs->no_ir = true; in nl80211_parse_freq_attrs()
3467 attrs->radar = true; in nl80211_parse_freq_attrs()
3471 static void nl80211_reg_beacon_hint_event(struct wpa_driver_nl80211_data *drv, in nl80211_reg_beacon_hint_event() argument
3477 os_memset(&data, 0, sizeof(data)); in nl80211_reg_beacon_hint_event()
3489 wpa_supplicant_event(drv->ctx, EVENT_CHANNEL_LIST_CHANGED, &data); in nl80211_reg_beacon_hint_event()
3493 static void nl80211_external_auth(struct wpa_driver_nl80211_data *drv, in nl80211_external_auth() argument
3506 os_memset(&event, 0, sizeof(event)); in nl80211_external_auth()
3529 mld_addr[0] = '\0'; in nl80211_external_auth()
3538 "nl80211: External auth action: %u, AKM: 0x%x, SSID: %s, BSSID: " MACSTR "%s", in nl80211_external_auth()
3544 wpa_supplicant_event(drv->ctx, EVENT_EXTERNAL_AUTH, &event); in nl80211_external_auth()
3548 static void nl80211_port_authorized(struct wpa_driver_nl80211_data *drv, in nl80211_port_authorized() argument
3554 os_memset(&event, 0, sizeof(event)); in nl80211_port_authorized()
3564 if (is_ap_interface(drv->nlmode) && drv->device_ap_sme) { in nl80211_port_authorized()
3569 } else if (is_sta_interface(drv->nlmode)) { in nl80211_port_authorized()
3572 connected_addr = drv->sta_mlo_info.valid_links ? in nl80211_port_authorized()
3573 drv->sta_mlo_info.ap_mld_addr : drv->bssid; in nl80211_port_authorized()
3587 if (event.port_authorized.td_bitmap_len > 0) in nl80211_port_authorized()
3592 wpa_supplicant_event(drv->ctx, EVENT_PORT_AUTHORIZED, &event); in nl80211_port_authorized()
3596 static void nl80211_sta_opmode_change_event(struct wpa_driver_nl80211_data *drv, in nl80211_sta_opmode_change_event() argument
3610 ed.sta_opmode.rx_nss = 0xff; in nl80211_sta_opmode_change_event()
3665 wpa_supplicant_event(drv->ctx, EVENT_STATION_OPMODE_CHANGED, &ed); in nl80211_sta_opmode_change_event()
3689 link_id = -1; in nl80211_control_port_frame()
3693 wpa_printf(MSG_INFO, "nl80211: Got pre-auth frame from " in nl80211_control_port_frame()
3698 drv_event_eapol_rx2(bss->ctx, src_addr, in nl80211_control_port_frame()
3705 "nl80211: Unexpected ethertype 0x%04x from " in nl80211_control_port_frame()
3718 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_control_port_frame_tx_status() local
3728 os_memset(&event, 0, sizeof(event)); in nl80211_control_port_frame_tx_status()
3731 event.eapol_tx_status.data_len = len - ETH_HLEN; in nl80211_control_port_frame_tx_status()
3734 nla_get_u64(cookie) == drv->eapol_tx_cookie ? in nl80211_control_port_frame_tx_status()
3735 drv->eapol_tx_link_id : NL80211_DRV_LINK_ID_NA; in nl80211_control_port_frame_tx_status()
3737 wpa_supplicant_event(bss->ctx, EVENT_EAPOL_TX_STATUS, &event); in nl80211_control_port_frame_tx_status()
3741 static void nl80211_frame_wait_cancel(struct wpa_driver_nl80211_data *drv, in nl80211_frame_wait_cancel() argument
3752 for (i = 0; i < drv->num_send_frame_cookies; i++) { in nl80211_frame_wait_cancel()
3753 if (cookie == drv->send_frame_cookies[i]) { in nl80211_frame_wait_cancel()
3759 "nl80211: TX frame wait expired for cookie 0x%llx%s%s", in nl80211_frame_wait_cancel()
3762 drv->send_frame_cookie == cookie ? " (match-saved)" : ""); in nl80211_frame_wait_cancel()
3763 if (drv->send_frame_cookie == cookie) { in nl80211_frame_wait_cancel()
3764 drv->send_frame_cookie = (u64) -1; in nl80211_frame_wait_cancel()
3771 if (i < drv->num_send_frame_cookies - 1) in nl80211_frame_wait_cancel()
3772 os_memmove(&drv->send_frame_cookies[i], in nl80211_frame_wait_cancel()
3773 &drv->send_frame_cookies[i + 1], in nl80211_frame_wait_cancel()
3774 (drv->num_send_frame_cookies - i - 1) * sizeof(u64)); in nl80211_frame_wait_cancel()
3775 drv->num_send_frame_cookies--; in nl80211_frame_wait_cancel()
3778 wpa_supplicant_event(drv->ctx, EVENT_TX_WAIT_EXPIRE, NULL); in nl80211_frame_wait_cancel()
3782 static void nl80211_assoc_comeback(struct wpa_driver_nl80211_data *drv, in nl80211_assoc_comeback() argument
3802 os_memset(&data, 0, sizeof(data)); in nl80211_obss_color_event()
3813 "nl80211: BSS color collision - bitmap %08llx", in nl80211_obss_color_event()
3838 if (!nl80211_link_valid(bss->valid_links, in nl80211_obss_color_event()
3846 wpa_printf(MSG_DEBUG, "nl80211: BSS color event - Link ID %d", in nl80211_obss_color_event()
3850 wpa_supplicant_event(bss->ctx, event_type, &data); in nl80211_obss_color_event()
3859 struct wpa_driver_nl80211_data *drv = bss->drv; in do_process_drv_event() local
3860 int external_scan_event = 0; in do_process_drv_event()
3863 wpa_printf(MSG_DEBUG, "nl80211: Drv Event %d (%s) received for %s", in do_process_drv_event()
3864 cmd, nl80211_command_to_string(cmd), bss->ifname); in do_process_drv_event()
3868 (drv->capa.flags & WPA_DRIVER_FLAGS_KEY_MGMT_OFFLOAD)) { in do_process_drv_event()
3869 if (drv->pending_roam_data) { in do_process_drv_event()
3872 qca_nl80211_key_mgmt_auth(drv, drv->pending_roam_data, in do_process_drv_event()
3873 drv->pending_roam_data_len); in do_process_drv_event()
3874 os_free(drv->pending_roam_data); in do_process_drv_event()
3875 drv->pending_roam_data = NULL; in do_process_drv_event()
3882 drv->roam_indication_done = true; in do_process_drv_event()
3890 if (drv->ap_scan_as_station != NL80211_IFTYPE_UNSPECIFIED && in do_process_drv_event()
3897 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Scan trigger"); in do_process_drv_event()
3898 drv->scan_state = SCAN_STARTED; in do_process_drv_event()
3899 if (drv->scan_for_auth) { in do_process_drv_event()
3906 wpa_printf(MSG_DEBUG, "nl80211: Do not indicate scan-start event due to internal scan_for_auth"); in do_process_drv_event()
3909 wpa_supplicant_event(drv->ctx, EVENT_SCAN_STARTED, NULL); in do_process_drv_event()
3912 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Sched scan started"); in do_process_drv_event()
3913 drv->scan_state = SCHED_SCAN_STARTED; in do_process_drv_event()
3916 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Sched scan stopped"); in do_process_drv_event()
3917 drv->scan_state = SCHED_SCAN_STOPPED; in do_process_drv_event()
3918 wpa_supplicant_event(drv->ctx, EVENT_SCHED_SCAN_STOPPED, NULL); in do_process_drv_event()
3921 wpa_dbg(drv->ctx, MSG_DEBUG, in do_process_drv_event()
3923 if (drv->last_scan_cmd != NL80211_CMD_VENDOR) in do_process_drv_event()
3924 drv->scan_state = SCAN_COMPLETED; in do_process_drv_event()
3925 drv->scan_complete_events = 1; in do_process_drv_event()
3926 if (drv->last_scan_cmd == NL80211_CMD_TRIGGER_SCAN) { in do_process_drv_event()
3928 drv, drv->ctx); in do_process_drv_event()
3929 drv->last_scan_cmd = 0; in do_process_drv_event()
3933 send_scan_event(drv, 0, tb, external_scan_event); in do_process_drv_event()
3936 wpa_dbg(drv->ctx, MSG_DEBUG, in do_process_drv_event()
3938 drv->scan_state = SCHED_SCAN_RESULTS; in do_process_drv_event()
3939 send_scan_event(drv, 0, tb, 0); in do_process_drv_event()
3942 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Scan aborted"); in do_process_drv_event()
3943 if (drv->last_scan_cmd != NL80211_CMD_VENDOR) in do_process_drv_event()
3944 drv->scan_state = SCAN_ABORTED; in do_process_drv_event()
3945 if (drv->last_scan_cmd == NL80211_CMD_TRIGGER_SCAN) { in do_process_drv_event()
3951 drv, drv->ctx); in do_process_drv_event()
3952 drv->last_scan_cmd = 0; in do_process_drv_event()
3956 send_scan_event(drv, 1, tb, external_scan_event); in do_process_drv_event()
3977 mlme_event_connect(drv, cmd, false, in do_process_drv_event()
3993 mlme_event_ch_switch(drv, in do_process_drv_event()
4002 0); in do_process_drv_event()
4005 mlme_event_ch_switch(drv, in do_process_drv_event()
4017 mlme_event_disconnect(drv, tb[NL80211_ATTR_REASON_CODE], in do_process_drv_event()
4025 mlme_event_join_ibss(drv, tb); in do_process_drv_event()
4028 mlme_event_remain_on_channel(drv, 0, tb); in do_process_drv_event()
4031 mlme_event_remain_on_channel(drv, 1, tb); in do_process_drv_event()
4034 nl80211_cqm_event(drv, tb); in do_process_drv_event()
4038 nl80211_reg_change_event(drv, tb); in do_process_drv_event()
4041 nl80211_reg_beacon_hint_event(drv, tb); in do_process_drv_event()
4044 nl80211_new_station_event(drv, bss, tb); in do_process_drv_event()
4047 nl80211_del_station_event(drv, bss, tb); in do_process_drv_event()
4050 nl80211_rekey_offload_event(drv, tb); in do_process_drv_event()
4053 nl80211_pmksa_candidate_event(drv, tb); in do_process_drv_event()
4056 nl80211_client_probe_event(drv, tb); in do_process_drv_event()
4059 nl80211_tdls_oper_event(drv, tb); in do_process_drv_event()
4062 nl80211_connect_failed_event(drv, tb); in do_process_drv_event()
4065 mlme_event_ft_event(drv, tb); in do_process_drv_event()
4068 nl80211_radar_event(drv, tb); in do_process_drv_event()
4071 nl80211_stop_ap(drv, tb); in do_process_drv_event()
4074 nl80211_vendor_event(drv, tb); in do_process_drv_event()
4077 nl80211_new_peer_candidate(drv, tb); in do_process_drv_event()
4080 nl80211_port_authorized(drv, tb); in do_process_drv_event()
4083 nl80211_sta_opmode_change_event(drv, tb); in do_process_drv_event()
4086 mlme_event_dh_event(drv, bss, tb); in do_process_drv_event()
4090 mlme_event_unprot_beacon(drv, nla_data(frame), in do_process_drv_event()
4103 nl80211_frame_wait_cancel(drv, tb[NL80211_ATTR_COOKIE]); in do_process_drv_event()
4106 nl80211_assoc_comeback(drv, tb[NL80211_ATTR_MAC], in do_process_drv_event()
4118 wpa_supplicant_event(drv->ctx, EVENT_LINK_RECONFIG, NULL); in do_process_drv_event()
4121 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Ignored unknown event " in do_process_drv_event()
4129 struct wpa_driver_nl80211_data *drv) in nl80211_drv_in_list() argument
4133 dl_list_for_each(tmp, &global->interfaces, in nl80211_drv_in_list()
4135 if (drv == tmp) in nl80211_drv_in_list()
4148 struct wpa_driver_nl80211_data *drv, *tmp; in process_global_event() local
4149 int ifidx = -1, wiphy_idx = -1, wiphy_idx_rx = -1; in process_global_event()
4151 u64 wdev_id = 0; in process_global_event()
4152 int wdev_id_set = 0; in process_global_event()
4153 int wiphy_idx_set = 0; in process_global_event()
4157 if (gnlh->cmd == NL80211_CMD_GET_PROTOCOL_FEATURES) { in process_global_event()
4158 u32 seq = nlmsg_hdr(msg)->nlmsg_seq; in process_global_event()
4160 dl_list_for_each_safe(drv, tmp, &global->interfaces, in process_global_event()
4162 if (drv->ignore_next_local_deauth > 0 && in process_global_event()
4163 drv->ignore_next_local_deauth <= seq) { in process_global_event()
4166 drv->ignore_next_local_deauth = 0; in process_global_event()
4169 if (drv->ignore_next_local_disconnect > 0 && in process_global_event()
4170 drv->ignore_next_local_disconnect <= seq) { in process_global_event()
4173 drv->ignore_next_local_disconnect = 0; in process_global_event()
4180 nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), in process_global_event()
4181 genlmsg_attrlen(gnlh, 0), NULL); in process_global_event()
4193 dl_list_for_each_safe(drv, tmp, &global->interfaces, in process_global_event()
4195 for (bss = drv->first_bss; bss; bss = bss->next) { in process_global_event()
4198 if ((ifidx == -1 && !wiphy_idx_set && !wdev_id_set) || in process_global_event()
4199 ifidx == bss->ifindex || in process_global_event()
4201 (wdev_id_set && bss->wdev_id_set && in process_global_event()
4202 wdev_id == bss->wdev_id)) { in process_global_event()
4204 do_process_drv_event(bss, gnlh->cmd, tb); in process_global_event()
4211 if (!nl80211_drv_in_list(global, drv)) in process_global_event()
4221 "nl80211: Ignored event %d (%s) for foreign interface (ifindex %d wdev 0x%llx wiphy %d)", in process_global_event()
4222 gnlh->cmd, nl80211_command_to_string(gnlh->cmd), in process_global_event()
4235 nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), in process_bss_event()
4236 genlmsg_attrlen(gnlh, 0), NULL); in process_bss_event()
4239 gnlh->cmd, nl80211_command_to_string(gnlh->cmd), in process_bss_event()
4240 bss->ifname); in process_bss_event()
4242 switch (gnlh->cmd) { in process_bss_event()
4245 mlme_event(bss, gnlh->cmd, tb[NL80211_ATTR_FRAME], in process_bss_event()
4254 nl80211_spurious_frame(bss, tb, 0); in process_bss_event()
4260 nl80211_external_auth(bss->drv, tb); in process_bss_event()
4267 "(cmd=%d)", gnlh->cmd); in process_bss_event()