Lines Matching +full:cs +full:- +full:dev +full:- +full:assoc
2 * Copyright 2002-2005, Instant802 Networks, Inc.
3 * Copyright 2005-2006, Devicescape Software, Inc.
4 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
5 * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2014 Intel Mobile Communications GmbH
7 * Copyright(c) 2015 - 2017 Intel Deutschland GmbH
8 * Copyright (C) 2018-2021 Intel Corporation
29 #include "driver-ops.h"
38 static inline void ieee80211_rx_stats(struct net_device *dev, u32 len) in ieee80211_rx_stats() argument
40 struct pcpu_sw_netstats *tstats = this_cpu_ptr(dev->tstats); in ieee80211_rx_stats()
42 u64_stats_update_begin(&tstats->syncp); in ieee80211_rx_stats()
43 tstats->rx_packets++; in ieee80211_rx_stats()
44 tstats->rx_bytes += len; in ieee80211_rx_stats()
45 u64_stats_update_end(&tstats->syncp); in ieee80211_rx_stats()
51 __le16 fc = hdr->frame_control; in ieee80211_get_bssid()
60 return hdr->addr1; in ieee80211_get_bssid()
62 return hdr->addr2; in ieee80211_get_bssid()
64 return hdr->addr3; in ieee80211_get_bssid()
70 return hdr->addr3; in ieee80211_get_bssid()
75 return hdr->addr1; in ieee80211_get_bssid()
80 return hdr->addr2; in ieee80211_get_bssid()
83 return hdr->addr1; in ieee80211_get_bssid()
104 __pskb_trim(skb, skb->len - present_fcs_len); in remove_monitor_info()
114 hdr = (void *)(skb->data + rtap_space); in should_drop_frame()
116 if (status->flag & (RX_FLAG_FAILED_FCS_CRC | in should_drop_frame()
121 if (unlikely(skb->len < 16 + present_fcs_len + rtap_space)) in should_drop_frame()
124 if (ieee80211_is_ctl(hdr->frame_control) && in should_drop_frame()
125 !ieee80211_is_pspoll(hdr->frame_control) && in should_drop_frame()
126 !ieee80211_is_back_req(hdr->frame_control)) in should_drop_frame()
143 if (status->chains) in ieee80211_rx_radiotap_hdrlen()
144 len += 4 * hweight8(status->chains); in ieee80211_rx_radiotap_hdrlen()
146 if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) in ieee80211_rx_radiotap_hdrlen()
153 if (ieee80211_hw_check(&local->hw, SIGNAL_DBM)) in ieee80211_rx_radiotap_hdrlen()
156 /* antenna field, if we don't have per-chain info */ in ieee80211_rx_radiotap_hdrlen()
157 if (!status->chains) in ieee80211_rx_radiotap_hdrlen()
163 if (status->encoding == RX_ENC_HT) /* HT info */ in ieee80211_rx_radiotap_hdrlen()
166 if (status->flag & RX_FLAG_AMPDU_DETAILS) { in ieee80211_rx_radiotap_hdrlen()
171 if (status->encoding == RX_ENC_VHT) { in ieee80211_rx_radiotap_hdrlen()
176 if (local->hw.radiotap_timestamp.units_pos >= 0) { in ieee80211_rx_radiotap_hdrlen()
181 if (status->encoding == RX_ENC_HE && in ieee80211_rx_radiotap_hdrlen()
182 status->flag & RX_FLAG_RADIOTAP_HE) { in ieee80211_rx_radiotap_hdrlen()
188 if (status->encoding == RX_ENC_HE && in ieee80211_rx_radiotap_hdrlen()
189 status->flag & RX_FLAG_RADIOTAP_HE_MU) { in ieee80211_rx_radiotap_hdrlen()
195 if (status->chains) { in ieee80211_rx_radiotap_hdrlen()
197 len += 2 * hweight8(status->chains); in ieee80211_rx_radiotap_hdrlen()
200 if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) { in ieee80211_rx_radiotap_hdrlen()
201 struct ieee80211_vendor_radiotap *rtap = (void *)skb->data; in ieee80211_rx_radiotap_hdrlen()
203 /* alignment for fixed 6-byte vendor data header */ in ieee80211_rx_radiotap_hdrlen()
207 if (WARN_ON(rtap->align == 0)) in ieee80211_rx_radiotap_hdrlen()
208 rtap->align = 1; in ieee80211_rx_radiotap_hdrlen()
209 len = ALIGN(len, rtap->align); in ieee80211_rx_radiotap_hdrlen()
210 len += rtap->len + rtap->pad; in ieee80211_rx_radiotap_hdrlen()
231 if (skb->len < rtap_space + sizeof(action) + in ieee80211_handle_mu_mimo_mon()
235 if (!is_valid_ether_addr(sdata->u.mntr.mu_follow_addr)) in ieee80211_handle_mu_mimo_mon()
249 if (!ether_addr_equal(action.hdr.addr1, sdata->u.mntr.mu_follow_addr)) in ieee80211_handle_mu_mimo_mon()
256 skb_queue_tail(&sdata->skb_queue, skb); in ieee80211_handle_mu_mimo_mon()
257 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_handle_mu_mimo_mon()
261 * ieee80211_add_rx_radiotap_header - add radiotap header
279 unsigned long chains = status->chains; in ieee80211_add_rx_radiotap_header()
284 if (status->flag & RX_FLAG_RADIOTAP_HE) { in ieee80211_add_rx_radiotap_header()
285 he = *(struct ieee80211_radiotap_he *)skb->data; in ieee80211_add_rx_radiotap_header()
287 WARN_ON_ONCE(status->encoding != RX_ENC_HE); in ieee80211_add_rx_radiotap_header()
290 if (status->flag & RX_FLAG_RADIOTAP_HE_MU) { in ieee80211_add_rx_radiotap_header()
291 he_mu = *(struct ieee80211_radiotap_he_mu *)skb->data; in ieee80211_add_rx_radiotap_header()
295 if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) { in ieee80211_add_rx_radiotap_header()
296 rtap = *(struct ieee80211_vendor_radiotap *)skb->data; in ieee80211_add_rx_radiotap_header()
301 mpdulen = skb->len; in ieee80211_add_rx_radiotap_header()
302 if (!(has_fcs && ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS))) in ieee80211_add_rx_radiotap_header()
306 memset(rthdr, 0, rtap_len - rtap.len - rtap.pad); in ieee80211_add_rx_radiotap_header()
307 it_present = &rthdr->it_present; in ieee80211_add_rx_radiotap_header()
310 rthdr->it_len = cpu_to_le16(rtap_len); in ieee80211_add_rx_radiotap_header()
315 if (!status->chains) in ieee80211_add_rx_radiotap_header()
328 if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) { in ieee80211_add_rx_radiotap_header()
345 while ((pos - (u8 *)rthdr) & 7) in ieee80211_add_rx_radiotap_header()
351 rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_TSFT); in ieee80211_add_rx_radiotap_header()
356 if (has_fcs && ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS)) in ieee80211_add_rx_radiotap_header()
358 if (status->flag & (RX_FLAG_FAILED_FCS_CRC | RX_FLAG_FAILED_PLCP_CRC)) in ieee80211_add_rx_radiotap_header()
360 if (status->enc_flags & RX_ENC_FLAG_SHORTPRE) in ieee80211_add_rx_radiotap_header()
365 if (!rate || status->encoding != RX_ENC_LEGACY) { in ieee80211_add_rx_radiotap_header()
375 rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_RATE); in ieee80211_add_rx_radiotap_header()
376 if (status->bw == RATE_INFO_BW_10) in ieee80211_add_rx_radiotap_header()
378 else if (status->bw == RATE_INFO_BW_5) in ieee80211_add_rx_radiotap_header()
380 *pos = DIV_ROUND_UP(rate->bitrate, 5 * (1 << shift)); in ieee80211_add_rx_radiotap_header()
385 put_unaligned_le16(status->freq, pos); in ieee80211_add_rx_radiotap_header()
387 if (status->bw == RATE_INFO_BW_10) in ieee80211_add_rx_radiotap_header()
389 else if (status->bw == RATE_INFO_BW_5) in ieee80211_add_rx_radiotap_header()
392 if (status->band == NL80211_BAND_5GHZ) in ieee80211_add_rx_radiotap_header()
394 else if (status->encoding != RX_ENC_LEGACY) in ieee80211_add_rx_radiotap_header()
396 else if (rate && rate->flags & IEEE80211_RATE_ERP_G) in ieee80211_add_rx_radiotap_header()
406 if (ieee80211_hw_check(&local->hw, SIGNAL_DBM) && in ieee80211_add_rx_radiotap_header()
407 !(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { in ieee80211_add_rx_radiotap_header()
408 *pos = status->signal; in ieee80211_add_rx_radiotap_header()
409 rthdr->it_present |= in ieee80211_add_rx_radiotap_header()
416 if (!status->chains) { in ieee80211_add_rx_radiotap_header()
418 *pos = status->antenna; in ieee80211_add_rx_radiotap_header()
426 if ((pos - (u8 *)rthdr) & 1) in ieee80211_add_rx_radiotap_header()
428 if (status->flag & RX_FLAG_FAILED_PLCP_CRC) in ieee80211_add_rx_radiotap_header()
433 if (status->encoding == RX_ENC_HT) { in ieee80211_add_rx_radiotap_header()
436 rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_MCS); in ieee80211_add_rx_radiotap_header()
437 *pos++ = local->hw.radiotap_mcs_details; in ieee80211_add_rx_radiotap_header()
439 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) in ieee80211_add_rx_radiotap_header()
441 if (status->bw == RATE_INFO_BW_40) in ieee80211_add_rx_radiotap_header()
443 if (status->enc_flags & RX_ENC_FLAG_HT_GF) in ieee80211_add_rx_radiotap_header()
445 if (status->enc_flags & RX_ENC_FLAG_LDPC) in ieee80211_add_rx_radiotap_header()
447 stbc = (status->enc_flags & RX_ENC_FLAG_STBC_MASK) >> RX_ENC_FLAG_STBC_SHIFT; in ieee80211_add_rx_radiotap_header()
450 *pos++ = status->rate_idx; in ieee80211_add_rx_radiotap_header()
453 if (status->flag & RX_FLAG_AMPDU_DETAILS) { in ieee80211_add_rx_radiotap_header()
457 while ((pos - (u8 *)rthdr) & 3) in ieee80211_add_rx_radiotap_header()
459 rthdr->it_present |= in ieee80211_add_rx_radiotap_header()
461 put_unaligned_le32(status->ampdu_reference, pos); in ieee80211_add_rx_radiotap_header()
463 if (status->flag & RX_FLAG_AMPDU_LAST_KNOWN) in ieee80211_add_rx_radiotap_header()
465 if (status->flag & RX_FLAG_AMPDU_IS_LAST) in ieee80211_add_rx_radiotap_header()
467 if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_ERROR) in ieee80211_add_rx_radiotap_header()
469 if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_KNOWN) in ieee80211_add_rx_radiotap_header()
471 if (status->flag & RX_FLAG_AMPDU_EOF_BIT_KNOWN) in ieee80211_add_rx_radiotap_header()
473 if (status->flag & RX_FLAG_AMPDU_EOF_BIT) in ieee80211_add_rx_radiotap_header()
477 if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_KNOWN) in ieee80211_add_rx_radiotap_header()
478 *pos++ = status->ampdu_delimiter_crc; in ieee80211_add_rx_radiotap_header()
484 if (status->encoding == RX_ENC_VHT) { in ieee80211_add_rx_radiotap_header()
485 u16 known = local->hw.radiotap_vht_details; in ieee80211_add_rx_radiotap_header()
487 rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_VHT); in ieee80211_add_rx_radiotap_header()
491 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) in ieee80211_add_rx_radiotap_header()
494 if (status->enc_flags & RX_ENC_FLAG_STBC_MASK) in ieee80211_add_rx_radiotap_header()
496 if (status->enc_flags & RX_ENC_FLAG_BF) in ieee80211_add_rx_radiotap_header()
500 switch (status->bw) { in ieee80211_add_rx_radiotap_header()
514 *pos = (status->rate_idx << 4) | status->nss; in ieee80211_add_rx_radiotap_header()
517 if (status->enc_flags & RX_ENC_FLAG_LDPC) in ieee80211_add_rx_radiotap_header()
526 if (local->hw.radiotap_timestamp.units_pos >= 0) { in ieee80211_add_rx_radiotap_header()
530 rthdr->it_present |= in ieee80211_add_rx_radiotap_header()
534 while ((pos - (u8 *)rthdr) & 7) in ieee80211_add_rx_radiotap_header()
537 put_unaligned_le64(status->device_timestamp, pos); in ieee80211_add_rx_radiotap_header()
540 if (local->hw.radiotap_timestamp.accuracy >= 0) { in ieee80211_add_rx_radiotap_header()
541 accuracy = local->hw.radiotap_timestamp.accuracy; in ieee80211_add_rx_radiotap_header()
547 *pos++ = local->hw.radiotap_timestamp.units_pos; in ieee80211_add_rx_radiotap_header()
551 if (status->encoding == RX_ENC_HE && in ieee80211_add_rx_radiotap_header()
552 status->flag & RX_FLAG_RADIOTAP_HE) { in ieee80211_add_rx_radiotap_header()
555 if (status->enc_flags & RX_ENC_FLAG_STBC_MASK) { in ieee80211_add_rx_radiotap_header()
558 status->enc_flags)); in ieee80211_add_rx_radiotap_header()
561 he.data6 |= HE_PREP(DATA6_NSTS, status->nss); in ieee80211_add_rx_radiotap_header()
572 he.data3 |= HE_PREP(DATA3_DATA_MCS, status->rate_idx); in ieee80211_add_rx_radiotap_header()
573 he.data3 |= HE_PREP(DATA3_DATA_DCM, status->he_dcm); in ieee80211_add_rx_radiotap_header()
575 !!(status->enc_flags & RX_ENC_FLAG_LDPC)); in ieee80211_add_rx_radiotap_header()
577 he.data5 |= HE_PREP(DATA5_GI, status->he_gi); in ieee80211_add_rx_radiotap_header()
579 switch (status->bw) { in ieee80211_add_rx_radiotap_header()
610 status->he_ru + 4); in ieee80211_add_rx_radiotap_header()
613 WARN_ONCE(1, "Invalid SU BW %d\n", status->bw); in ieee80211_add_rx_radiotap_header()
617 while ((pos - (u8 *)rthdr) & 1) in ieee80211_add_rx_radiotap_header()
619 rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_HE); in ieee80211_add_rx_radiotap_header()
624 if (status->encoding == RX_ENC_HE && in ieee80211_add_rx_radiotap_header()
625 status->flag & RX_FLAG_RADIOTAP_HE_MU) { in ieee80211_add_rx_radiotap_header()
627 while ((pos - (u8 *)rthdr) & 1) in ieee80211_add_rx_radiotap_header()
629 rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_HE_MU); in ieee80211_add_rx_radiotap_header()
635 *pos++ = status->chain_signal[chain]; in ieee80211_add_rx_radiotap_header()
639 if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) { in ieee80211_add_rx_radiotap_header()
641 if ((pos - (u8 *)rthdr) & 1) in ieee80211_add_rx_radiotap_header()
650 while ((pos - (u8 *)rthdr) & (rtap.align - 1)) in ieee80211_add_rx_radiotap_header()
668 needed_headroom = rt_hdrlen - rtap_space; in ieee80211_make_monitor_skb()
702 skb->ip_summed = CHECKSUM_UNNECESSARY; in ieee80211_make_monitor_skb()
703 skb->pkt_type = PACKET_OTHERHOST; in ieee80211_make_monitor_skb()
704 skb->protocol = htons(ETH_P_802_2); in ieee80211_make_monitor_skb()
711 * returns a cleaned-up SKB that no longer includes the FCS nor the
724 rcu_dereference(local->monitor_sdata); in ieee80211_rx_monitor()
727 if (status->flag & RX_FLAG_RADIOTAP_HE) in ieee80211_rx_monitor()
730 if (status->flag & RX_FLAG_RADIOTAP_HE_MU) in ieee80211_rx_monitor()
733 if (unlikely(status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA)) { in ieee80211_rx_monitor()
734 struct ieee80211_vendor_radiotap *rtap = (void *)origskb->data; in ieee80211_rx_monitor()
736 rtap_space += sizeof(*rtap) + rtap->len + rtap->pad; in ieee80211_rx_monitor()
748 if (ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS)) { in ieee80211_rx_monitor()
749 if (unlikely(origskb->len <= FCS_LEN)) { in ieee80211_rx_monitor()
758 /* ensure hdr->frame_control and vendor radiotap data are in skb head */ in ieee80211_rx_monitor()
766 if (!local->monitors || (status->flag & RX_FLAG_SKIP_MONITOR)) { in ieee80211_rx_monitor()
778 list_for_each_entry_rcu(sdata, &local->mon_list, u.mntr.list) { in ieee80211_rx_monitor()
779 bool last_monitor = list_is_last(&sdata->u.mntr.list, in ieee80211_rx_monitor()
780 &local->mon_list); in ieee80211_rx_monitor()
799 skb->dev = sdata->dev; in ieee80211_rx_monitor()
800 ieee80211_rx_stats(skb->dev, skb->len); in ieee80211_rx_monitor()
822 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_parse_qos()
823 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_parse_qos()
827 if (ieee80211_is_data_qos(hdr->frame_control)) { in ieee80211_parse_qos()
832 status->rx_flags |= IEEE80211_RX_AMSDU; in ieee80211_parse_qos()
838 * IEEE 802.11-2007, 7.1.3.4.1 ("Sequence Number field"): in ieee80211_parse_qos()
842 * Address 1 field, and all non-QoS data frames sent in ieee80211_parse_qos()
844 * modulo-4096 counter, [...] in ieee80211_parse_qos()
846 * We also use that counter for non-QoS STAs. in ieee80211_parse_qos()
850 if (ieee80211_is_mgmt(hdr->frame_control)) in ieee80211_parse_qos()
855 rx->seqno_idx = seqno_idx; in ieee80211_parse_qos()
856 rx->security_idx = security_idx; in ieee80211_parse_qos()
857 /* Set skb->priority to 1d tag if highest order bit of TID is not set. in ieee80211_parse_qos()
858 * For now, set skb->priority to 0 for other cases. */ in ieee80211_parse_qos()
859 rx->skb->priority = (tid > 7) ? 0 : tid; in ieee80211_parse_qos()
865 * Drivers always need to pass packets that are aligned to two-byte boundaries
869 * guarantees that the contained IP header is aligned to a four-byte
871 * payload to a four-byte boundary (because either the IP header is directly
877 * With A-MSDU frames, however, the payload data address must yield two modulo
878 * four because there are 14-byte 802.3 headers within the A-MSDU frames that
880 * specs were sane enough this time around to require padding each A-MSDU
890 WARN_ON_ONCE((unsigned long)rx->skb->data & 1); in ieee80211_verify_alignment()
899 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_is_unicast_robust_mgmt_frame()
901 if (is_multicast_ether_addr(hdr->addr1)) in ieee80211_is_unicast_robust_mgmt_frame()
910 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_is_multicast_robust_mgmt_frame()
912 if (!is_multicast_ether_addr(hdr->addr1)) in ieee80211_is_multicast_robust_mgmt_frame()
919 /* Get the BIP key index from MMIE; return -1 if this is not a BIP frame */
922 struct ieee80211_mgmt *hdr = (struct ieee80211_mgmt *) skb->data; in ieee80211_get_mmie_keyidx()
926 if (skb->len < 24 + sizeof(*mmie) || !is_multicast_ether_addr(hdr->da)) in ieee80211_get_mmie_keyidx()
927 return -1; in ieee80211_get_mmie_keyidx()
930 return -1; /* not a robust management frame */ in ieee80211_get_mmie_keyidx()
933 (skb->data + skb->len - sizeof(*mmie)); in ieee80211_get_mmie_keyidx()
934 if (mmie->element_id == WLAN_EID_MMIE && in ieee80211_get_mmie_keyidx()
935 mmie->length == sizeof(*mmie) - 2) in ieee80211_get_mmie_keyidx()
936 return le16_to_cpu(mmie->key_id); in ieee80211_get_mmie_keyidx()
939 (skb->data + skb->len - sizeof(*mmie16)); in ieee80211_get_mmie_keyidx()
940 if (skb->len >= 24 + sizeof(*mmie16) && in ieee80211_get_mmie_keyidx()
941 mmie16->element_id == WLAN_EID_MMIE && in ieee80211_get_mmie_keyidx()
942 mmie16->length == sizeof(*mmie16) - 2) in ieee80211_get_mmie_keyidx()
943 return le16_to_cpu(mmie16->key_id); in ieee80211_get_mmie_keyidx()
945 return -1; in ieee80211_get_mmie_keyidx()
948 static int ieee80211_get_cs_keyid(const struct ieee80211_cipher_scheme *cs, in ieee80211_get_cs_keyid() argument
951 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_get_cs_keyid()
956 fc = hdr->frame_control; in ieee80211_get_cs_keyid()
959 if (skb->len < hdrlen + cs->hdr_len) in ieee80211_get_cs_keyid()
960 return -EINVAL; in ieee80211_get_cs_keyid()
962 skb_copy_bits(skb, hdrlen + cs->key_idx_off, &keyid, 1); in ieee80211_get_cs_keyid()
963 keyid &= cs->key_idx_mask; in ieee80211_get_cs_keyid()
964 keyid >>= cs->key_idx_shift; in ieee80211_get_cs_keyid()
971 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_mesh_check()
972 char *dev_addr = rx->sdata->vif.addr; in ieee80211_rx_mesh_check()
974 if (ieee80211_is_data(hdr->frame_control)) { in ieee80211_rx_mesh_check()
975 if (is_multicast_ether_addr(hdr->addr1)) { in ieee80211_rx_mesh_check()
976 if (ieee80211_has_tods(hdr->frame_control) || in ieee80211_rx_mesh_check()
977 !ieee80211_has_fromds(hdr->frame_control)) in ieee80211_rx_mesh_check()
979 if (ether_addr_equal(hdr->addr3, dev_addr)) in ieee80211_rx_mesh_check()
982 if (!ieee80211_has_a4(hdr->frame_control)) in ieee80211_rx_mesh_check()
984 if (ether_addr_equal(hdr->addr4, dev_addr)) in ieee80211_rx_mesh_check()
993 if (!rx->sta || sta_plink_state(rx->sta) != NL80211_PLINK_ESTAB) { in ieee80211_rx_mesh_check()
996 if (!ieee80211_is_mgmt(hdr->frame_control)) in ieee80211_rx_mesh_check()
999 if (ieee80211_is_action(hdr->frame_control)) { in ieee80211_rx_mesh_check()
1003 if (rx->skb->len < IEEE80211_MIN_ACTION_SIZE) in ieee80211_rx_mesh_check()
1007 category = mgmt->u.action.category; in ieee80211_rx_mesh_check()
1014 if (ieee80211_is_probe_req(hdr->frame_control) || in ieee80211_rx_mesh_check()
1015 ieee80211_is_probe_resp(hdr->frame_control) || in ieee80211_rx_mesh_check()
1016 ieee80211_is_beacon(hdr->frame_control) || in ieee80211_rx_mesh_check()
1017 ieee80211_is_auth(hdr->frame_control)) in ieee80211_rx_mesh_check()
1029 struct sk_buff_head *frames = &tid_agg_rx->reorder_buf[index]; in ieee80211_rx_reorder_ready()
1033 if (tid_agg_rx->reorder_buf_filtered & BIT_ULL(index)) in ieee80211_rx_reorder_ready()
1040 if (status->flag & RX_FLAG_AMSDU_MORE) in ieee80211_rx_reorder_ready()
1051 struct sk_buff_head *skb_list = &tid_agg_rx->reorder_buf[index]; in ieee80211_release_reorder_frame()
1055 lockdep_assert_held(&tid_agg_rx->reorder_lock); in ieee80211_release_reorder_frame()
1066 tid_agg_rx->stored_mpdu_num--; in ieee80211_release_reorder_frame()
1069 status->rx_flags |= IEEE80211_RX_DEFERRED_RELEASE; in ieee80211_release_reorder_frame()
1074 tid_agg_rx->reorder_buf_filtered &= ~BIT_ULL(index); in ieee80211_release_reorder_frame()
1075 tid_agg_rx->head_seq_num = ieee80211_sn_inc(tid_agg_rx->head_seq_num); in ieee80211_release_reorder_frame()
1085 lockdep_assert_held(&tid_agg_rx->reorder_lock); in ieee80211_release_reorder_frames()
1087 while (ieee80211_sn_less(tid_agg_rx->head_seq_num, head_seq_num)) { in ieee80211_release_reorder_frames()
1088 index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; in ieee80211_release_reorder_frames()
1101 * Callers must hold tid_agg_rx->reorder_lock.
1111 lockdep_assert_held(&tid_agg_rx->reorder_lock); in ieee80211_sta_reorder_release()
1114 index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; in ieee80211_sta_reorder_release()
1116 tid_agg_rx->stored_mpdu_num) { in ieee80211_sta_reorder_release()
1122 for (j = (index + 1) % tid_agg_rx->buf_size; j != index; in ieee80211_sta_reorder_release()
1123 j = (j + 1) % tid_agg_rx->buf_size) { in ieee80211_sta_reorder_release()
1129 !time_after(jiffies, tid_agg_rx->reorder_time[j] + in ieee80211_sta_reorder_release()
1133 /* don't leave incomplete A-MSDUs around */ in ieee80211_sta_reorder_release()
1134 for (i = (index + 1) % tid_agg_rx->buf_size; i != j; in ieee80211_sta_reorder_release()
1135 i = (i + 1) % tid_agg_rx->buf_size) in ieee80211_sta_reorder_release()
1136 __skb_queue_purge(&tid_agg_rx->reorder_buf[i]); in ieee80211_sta_reorder_release()
1146 tid_agg_rx->head_seq_num = in ieee80211_sta_reorder_release()
1147 (tid_agg_rx->head_seq_num + in ieee80211_sta_reorder_release()
1154 index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; in ieee80211_sta_reorder_release()
1157 if (tid_agg_rx->stored_mpdu_num) { in ieee80211_sta_reorder_release()
1158 j = index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; in ieee80211_sta_reorder_release()
1160 for (; j != (index - 1) % tid_agg_rx->buf_size; in ieee80211_sta_reorder_release()
1161 j = (j + 1) % tid_agg_rx->buf_size) { in ieee80211_sta_reorder_release()
1168 if (!tid_agg_rx->removed) in ieee80211_sta_reorder_release()
1169 mod_timer(&tid_agg_rx->reorder_timer, in ieee80211_sta_reorder_release()
1170 tid_agg_rx->reorder_time[j] + 1 + in ieee80211_sta_reorder_release()
1173 del_timer(&tid_agg_rx->reorder_timer); in ieee80211_sta_reorder_release()
1187 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_sta_manage_reorder_buf()
1189 u16 sc = le16_to_cpu(hdr->seq_ctrl); in ieee80211_sta_manage_reorder_buf()
1195 spin_lock(&tid_agg_rx->reorder_lock); in ieee80211_sta_manage_reorder_buf()
1201 if (unlikely(tid_agg_rx->auto_seq)) { in ieee80211_sta_manage_reorder_buf()
1202 tid_agg_rx->auto_seq = false; in ieee80211_sta_manage_reorder_buf()
1203 tid_agg_rx->ssn = mpdu_seq_num; in ieee80211_sta_manage_reorder_buf()
1204 tid_agg_rx->head_seq_num = mpdu_seq_num; in ieee80211_sta_manage_reorder_buf()
1207 buf_size = tid_agg_rx->buf_size; in ieee80211_sta_manage_reorder_buf()
1208 head_seq_num = tid_agg_rx->head_seq_num; in ieee80211_sta_manage_reorder_buf()
1214 if (unlikely(!tid_agg_rx->started)) { in ieee80211_sta_manage_reorder_buf()
1219 tid_agg_rx->started = true; in ieee80211_sta_manage_reorder_buf()
1242 index = mpdu_seq_num % tid_agg_rx->buf_size; in ieee80211_sta_manage_reorder_buf()
1256 if (mpdu_seq_num == tid_agg_rx->head_seq_num && in ieee80211_sta_manage_reorder_buf()
1257 tid_agg_rx->stored_mpdu_num == 0) { in ieee80211_sta_manage_reorder_buf()
1258 if (!(status->flag & RX_FLAG_AMSDU_MORE)) in ieee80211_sta_manage_reorder_buf()
1259 tid_agg_rx->head_seq_num = in ieee80211_sta_manage_reorder_buf()
1260 ieee80211_sn_inc(tid_agg_rx->head_seq_num); in ieee80211_sta_manage_reorder_buf()
1266 __skb_queue_tail(&tid_agg_rx->reorder_buf[index], skb); in ieee80211_sta_manage_reorder_buf()
1267 if (!(status->flag & RX_FLAG_AMSDU_MORE)) { in ieee80211_sta_manage_reorder_buf()
1268 tid_agg_rx->reorder_time[index] = jiffies; in ieee80211_sta_manage_reorder_buf()
1269 tid_agg_rx->stored_mpdu_num++; in ieee80211_sta_manage_reorder_buf()
1274 spin_unlock(&tid_agg_rx->reorder_lock); in ieee80211_sta_manage_reorder_buf()
1279 * Reorder MPDUs from A-MPDUs, keeping them on a buffer. Returns
1285 struct sk_buff *skb = rx->skb; in ieee80211_rx_reorder_ampdu()
1286 struct ieee80211_local *local = rx->local; in ieee80211_rx_reorder_ampdu()
1287 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_rx_reorder_ampdu()
1288 struct sta_info *sta = rx->sta; in ieee80211_rx_reorder_ampdu()
1293 if (!ieee80211_is_data_qos(hdr->frame_control) || in ieee80211_rx_reorder_ampdu()
1294 is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_reorder_ampdu()
1309 tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); in ieee80211_rx_reorder_ampdu()
1312 !test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && in ieee80211_rx_reorder_ampdu()
1313 !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) in ieee80211_rx_reorder_ampdu()
1314 ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, in ieee80211_rx_reorder_ampdu()
1321 if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC))) in ieee80211_rx_reorder_ampdu()
1329 /* new, potentially un-ordered, ampdu frame - process it */ in ieee80211_rx_reorder_ampdu()
1332 if (tid_agg_rx->timeout) in ieee80211_rx_reorder_ampdu()
1333 tid_agg_rx->last_rx = jiffies; in ieee80211_rx_reorder_ampdu()
1335 /* if this mpdu is fragmented - terminate rx aggregation session */ in ieee80211_rx_reorder_ampdu()
1336 sc = le16_to_cpu(hdr->seq_ctrl); in ieee80211_rx_reorder_ampdu()
1338 skb_queue_tail(&rx->sdata->skb_queue, skb); in ieee80211_rx_reorder_ampdu()
1339 ieee80211_queue_work(&local->hw, &rx->sdata->work); in ieee80211_rx_reorder_ampdu()
1344 * No locking needed -- we will only ever process one in ieee80211_rx_reorder_ampdu()
1350 if (ieee80211_sta_manage_reorder_buf(rx->sdata, tid_agg_rx, skb, in ieee80211_rx_reorder_ampdu()
1361 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_check_dup()
1362 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_check_dup()
1364 if (status->flag & RX_FLAG_DUP_VALIDATED) in ieee80211_rx_h_check_dup()
1369 * (IEEE 802.11-2012: 9.3.2.10 "Duplicate detection and recovery") in ieee80211_rx_h_check_dup()
1372 if (rx->skb->len < 24) in ieee80211_rx_h_check_dup()
1375 if (ieee80211_is_ctl(hdr->frame_control) || in ieee80211_rx_h_check_dup()
1376 ieee80211_is_any_nullfunc(hdr->frame_control) || in ieee80211_rx_h_check_dup()
1377 is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_check_dup()
1380 if (!rx->sta) in ieee80211_rx_h_check_dup()
1383 if (unlikely(ieee80211_has_retry(hdr->frame_control) && in ieee80211_rx_h_check_dup()
1384 rx->sta->last_seq_ctrl[rx->seqno_idx] == hdr->seq_ctrl)) { in ieee80211_rx_h_check_dup()
1385 I802_DEBUG_INC(rx->local->dot11FrameDuplicateCount); in ieee80211_rx_h_check_dup()
1386 rx->sta->rx_stats.num_duplicates++; in ieee80211_rx_h_check_dup()
1388 } else if (!(status->flag & RX_FLAG_AMSDU_MORE)) { in ieee80211_rx_h_check_dup()
1389 rx->sta->last_seq_ctrl[rx->seqno_idx] = hdr->seq_ctrl; in ieee80211_rx_h_check_dup()
1398 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_check()
1400 /* Drop disallowed frame classes based on STA auth/assoc state; in ieee80211_rx_h_check()
1406 * responsible for filtering on both auth and assoc states. in ieee80211_rx_h_check()
1409 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) in ieee80211_rx_h_check()
1412 if (unlikely((ieee80211_is_data(hdr->frame_control) || in ieee80211_rx_h_check()
1413 ieee80211_is_pspoll(hdr->frame_control)) && in ieee80211_rx_h_check()
1414 rx->sdata->vif.type != NL80211_IFTYPE_ADHOC && in ieee80211_rx_h_check()
1415 rx->sdata->vif.type != NL80211_IFTYPE_WDS && in ieee80211_rx_h_check()
1416 rx->sdata->vif.type != NL80211_IFTYPE_OCB && in ieee80211_rx_h_check()
1417 (!rx->sta || !test_sta_flag(rx->sta, WLAN_STA_ASSOC)))) { in ieee80211_rx_h_check()
1420 * yet marked ASSOC to prevent a race where we don't set the in ieee80211_rx_h_check()
1421 * assoc bit quickly enough before it sends the first frame in ieee80211_rx_h_check()
1423 if (rx->sta && rx->sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_rx_h_check()
1424 ieee80211_is_data_present(hdr->frame_control)) { in ieee80211_rx_h_check()
1428 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_rx_h_check()
1430 if (rx->skb->len < hdrlen + 8) in ieee80211_rx_h_check()
1433 skb_copy_bits(rx->skb, hdrlen + 6, ðertype, 2); in ieee80211_rx_h_check()
1434 if (ethertype == rx->sdata->control_port_protocol) in ieee80211_rx_h_check()
1438 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && in ieee80211_rx_h_check()
1439 cfg80211_rx_spurious_frame(rx->sdata->dev, in ieee80211_rx_h_check()
1440 hdr->addr2, in ieee80211_rx_h_check()
1458 local = rx->local; in ieee80211_rx_h_check_more_data()
1459 skb = rx->skb; in ieee80211_rx_h_check_more_data()
1460 hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_rx_h_check_more_data()
1462 if (!local->pspolling) in ieee80211_rx_h_check_more_data()
1465 if (!ieee80211_has_fromds(hdr->frame_control)) in ieee80211_rx_h_check_more_data()
1469 if (!ieee80211_is_data(hdr->frame_control)) in ieee80211_rx_h_check_more_data()
1472 if (!ieee80211_has_moredata(hdr->frame_control)) { in ieee80211_rx_h_check_more_data()
1474 local->pspolling = false; in ieee80211_rx_h_check_more_data()
1479 ieee80211_send_pspoll(local, rx->sdata); in ieee80211_rx_h_check_more_data()
1486 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_ps_start()
1487 struct ieee80211_local *local = sdata->local; in sta_ps_start()
1491 if (sta->sdata->vif.type == NL80211_IFTYPE_AP || in sta_ps_start()
1492 sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in sta_ps_start()
1493 ps = &sdata->bss->ps; in sta_ps_start()
1497 atomic_inc(&ps->num_sta_ps); in sta_ps_start()
1499 if (!ieee80211_hw_check(&local->hw, AP_LINK_PS)) in sta_ps_start()
1500 drv_sta_notify(local, sdata, STA_NOTIFY_SLEEP, &sta->sta); in sta_ps_start()
1502 sta->sta.addr, sta->sta.aid); in sta_ps_start()
1506 if (!sta->sta.txq[0]) in sta_ps_start()
1509 for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) { in sta_ps_start()
1510 if (txq_has_queue(sta->sta.txq[tid])) in sta_ps_start()
1511 set_bit(tid, &sta->txq_buffered_tids); in sta_ps_start()
1513 clear_bit(tid, &sta->txq_buffered_tids); in sta_ps_start()
1519 ps_dbg(sta->sdata, "STA %pM aid %d exits power save mode\n", in sta_ps_end()
1520 sta->sta.addr, sta->sta.aid); in sta_ps_end()
1530 ps_dbg(sta->sdata, "STA %pM aid %d driver-ps-blocked\n", in sta_ps_end()
1531 sta->sta.addr, sta->sta.aid); in sta_ps_end()
1545 WARN_ON(!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS)); in ieee80211_sta_ps_transition()
1550 return -EINVAL; in ieee80211_sta_ps_transition()
1581 * If this AC is not trigger-enabled do nothing unless the in ieee80211_sta_uapsd_trigger()
1584 * NB: This could/should check a separate bitmap of trigger- in ieee80211_sta_uapsd_trigger()
1588 if (!(sta->sta.uapsd_queues & ieee80211_ac_to_qos_mask[ac]) && in ieee80211_sta_uapsd_trigger()
1606 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_uapsd_and_pspoll()
1607 struct ieee80211_hdr *hdr = (void *)rx->skb->data; in ieee80211_rx_h_uapsd_and_pspoll()
1608 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_uapsd_and_pspoll()
1610 if (!rx->sta) in ieee80211_rx_h_uapsd_and_pspoll()
1613 if (sdata->vif.type != NL80211_IFTYPE_AP && in ieee80211_rx_h_uapsd_and_pspoll()
1614 sdata->vif.type != NL80211_IFTYPE_AP_VLAN) in ieee80211_rx_h_uapsd_and_pspoll()
1619 * uAPSD and PS-Poll frames (the latter shouldn't even come up from in ieee80211_rx_h_uapsd_and_pspoll()
1622 if (ieee80211_hw_check(&sdata->local->hw, AP_LINK_PS)) in ieee80211_rx_h_uapsd_and_pspoll()
1628 * in the PS-Poll case the station must be confused ... in ieee80211_rx_h_uapsd_and_pspoll()
1630 if (!test_sta_flag(rx->sta, WLAN_STA_PS_STA)) in ieee80211_rx_h_uapsd_and_pspoll()
1633 if (unlikely(ieee80211_is_pspoll(hdr->frame_control))) { in ieee80211_rx_h_uapsd_and_pspoll()
1634 ieee80211_sta_pspoll(&rx->sta->sta); in ieee80211_rx_h_uapsd_and_pspoll()
1638 dev_kfree_skb(rx->skb); in ieee80211_rx_h_uapsd_and_pspoll()
1641 } else if (!ieee80211_has_morefrags(hdr->frame_control) && in ieee80211_rx_h_uapsd_and_pspoll()
1642 !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && in ieee80211_rx_h_uapsd_and_pspoll()
1643 ieee80211_has_pm(hdr->frame_control) && in ieee80211_rx_h_uapsd_and_pspoll()
1644 (ieee80211_is_data_qos(hdr->frame_control) || in ieee80211_rx_h_uapsd_and_pspoll()
1645 ieee80211_is_qos_nullfunc(hdr->frame_control))) { in ieee80211_rx_h_uapsd_and_pspoll()
1648 ieee80211_sta_uapsd_trigger(&rx->sta->sta, tid); in ieee80211_rx_h_uapsd_and_pspoll()
1657 struct sta_info *sta = rx->sta; in ieee80211_rx_h_sta_process()
1658 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_sta_process()
1660 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_rx_h_sta_process()
1674 if (rx->sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_rx_h_sta_process()
1675 u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len, in ieee80211_rx_h_sta_process()
1677 if (ether_addr_equal(bssid, rx->sdata->u.ibss.bssid) && in ieee80211_rx_h_sta_process()
1679 sta->rx_stats.last_rx = jiffies; in ieee80211_rx_h_sta_process()
1680 if (ieee80211_is_data(hdr->frame_control) && in ieee80211_rx_h_sta_process()
1681 !is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_sta_process()
1682 sta->rx_stats.last_rate = in ieee80211_rx_h_sta_process()
1685 } else if (rx->sdata->vif.type == NL80211_IFTYPE_OCB) { in ieee80211_rx_h_sta_process()
1686 sta->rx_stats.last_rx = jiffies; in ieee80211_rx_h_sta_process()
1687 } else if (!is_multicast_ether_addr(hdr->addr1)) { in ieee80211_rx_h_sta_process()
1692 sta->rx_stats.last_rx = jiffies; in ieee80211_rx_h_sta_process()
1693 if (ieee80211_is_data(hdr->frame_control)) in ieee80211_rx_h_sta_process()
1694 sta->rx_stats.last_rate = sta_stats_encode_rate(status); in ieee80211_rx_h_sta_process()
1697 if (rx->sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_rx_h_sta_process()
1698 ieee80211_sta_rx_notify(rx->sdata, hdr); in ieee80211_rx_h_sta_process()
1700 sta->rx_stats.fragments++; in ieee80211_rx_h_sta_process()
1702 u64_stats_update_begin(&rx->sta->rx_stats.syncp); in ieee80211_rx_h_sta_process()
1703 sta->rx_stats.bytes += rx->skb->len; in ieee80211_rx_h_sta_process()
1704 u64_stats_update_end(&rx->sta->rx_stats.syncp); in ieee80211_rx_h_sta_process()
1706 if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { in ieee80211_rx_h_sta_process()
1707 sta->rx_stats.last_signal = status->signal; in ieee80211_rx_h_sta_process()
1708 ewma_signal_add(&sta->rx_stats_avg.signal, -status->signal); in ieee80211_rx_h_sta_process()
1711 if (status->chains) { in ieee80211_rx_h_sta_process()
1712 sta->rx_stats.chains = status->chains; in ieee80211_rx_h_sta_process()
1713 for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) { in ieee80211_rx_h_sta_process()
1714 int signal = status->chain_signal[i]; in ieee80211_rx_h_sta_process()
1716 if (!(status->chains & BIT(i))) in ieee80211_rx_h_sta_process()
1719 sta->rx_stats.chain_signal_last[i] = signal; in ieee80211_rx_h_sta_process()
1720 ewma_signal_add(&sta->rx_stats_avg.chain_signal[i], in ieee80211_rx_h_sta_process()
1721 -signal); in ieee80211_rx_h_sta_process()
1728 * frame as specified in IEEE 802.11-2016 11.2.3.2 in ieee80211_rx_h_sta_process()
1730 if (!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS) && in ieee80211_rx_h_sta_process()
1731 !ieee80211_has_morefrags(hdr->frame_control) && in ieee80211_rx_h_sta_process()
1732 !is_multicast_ether_addr(hdr->addr1) && in ieee80211_rx_h_sta_process()
1733 (ieee80211_is_mgmt(hdr->frame_control) || in ieee80211_rx_h_sta_process()
1734 ieee80211_is_data(hdr->frame_control)) && in ieee80211_rx_h_sta_process()
1735 !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && in ieee80211_rx_h_sta_process()
1736 (rx->sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_rx_h_sta_process()
1737 rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) { in ieee80211_rx_h_sta_process()
1739 if (!ieee80211_has_pm(hdr->frame_control)) in ieee80211_rx_h_sta_process()
1742 if (ieee80211_has_pm(hdr->frame_control)) in ieee80211_rx_h_sta_process()
1748 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) in ieee80211_rx_h_sta_process()
1752 * Drop (qos-)data::nullfunc frames silently, since they in ieee80211_rx_h_sta_process()
1755 if (ieee80211_is_any_nullfunc(hdr->frame_control)) { in ieee80211_rx_h_sta_process()
1756 I802_DEBUG_INC(rx->local->rx_handlers_drop_nullfunc); in ieee80211_rx_h_sta_process()
1759 * If we receive a 4-addr nullfunc frame from a STA in ieee80211_rx_h_sta_process()
1760 * that was not moved to a 4-addr STA vlan yet send in ieee80211_rx_h_sta_process()
1764 if (ieee80211_has_a4(hdr->frame_control) && in ieee80211_rx_h_sta_process()
1765 (rx->sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_rx_h_sta_process()
1766 (rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_sta_process()
1767 !rx->sdata->u.vlan.sta))) { in ieee80211_rx_h_sta_process()
1770 rx->sdata->dev, sta->sta.addr, in ieee80211_rx_h_sta_process()
1778 sta->rx_stats.packets++; in ieee80211_rx_h_sta_process()
1779 dev_kfree_skb(rx->skb); in ieee80211_rx_h_sta_process()
1789 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_decrypt()
1791 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_rx_h_decrypt()
1796 int mmie_keyidx = -1; in ieee80211_rx_h_decrypt()
1798 const struct ieee80211_cipher_scheme *cs = NULL; in ieee80211_rx_h_decrypt() local
1804 * - GTK (group keys) in ieee80211_rx_h_decrypt()
1805 * - IGTK (group keys for management frames) in ieee80211_rx_h_decrypt()
1806 * - PTK (pairwise keys) in ieee80211_rx_h_decrypt()
1807 * - STK (station-to-station pairwise keys) in ieee80211_rx_h_decrypt()
1812 * Unless, of course, actual WEP keys ("pre-RSNA") are used, then in ieee80211_rx_h_decrypt()
1828 rx->key = NULL; in ieee80211_rx_h_decrypt()
1829 fc = hdr->frame_control; in ieee80211_rx_h_decrypt()
1831 if (rx->sta) { in ieee80211_rx_h_decrypt()
1832 int keyid = rx->sta->ptk_idx; in ieee80211_rx_h_decrypt()
1834 if (ieee80211_has_protected(fc) && rx->sta->cipher_scheme) { in ieee80211_rx_h_decrypt()
1835 cs = rx->sta->cipher_scheme; in ieee80211_rx_h_decrypt()
1836 keyid = ieee80211_get_cs_keyid(cs, rx->skb); in ieee80211_rx_h_decrypt()
1840 sta_ptk = rcu_dereference(rx->sta->ptk[keyid]); in ieee80211_rx_h_decrypt()
1844 mmie_keyidx = ieee80211_get_mmie_keyidx(rx->skb); in ieee80211_rx_h_decrypt()
1846 if (!is_multicast_ether_addr(hdr->addr1) && sta_ptk) { in ieee80211_rx_h_decrypt()
1847 rx->key = sta_ptk; in ieee80211_rx_h_decrypt()
1848 if ((status->flag & RX_FLAG_DECRYPTED) && in ieee80211_rx_h_decrypt()
1849 (status->flag & RX_FLAG_IV_STRIPPED)) in ieee80211_rx_h_decrypt()
1856 if ((status->flag & RX_FLAG_DECRYPTED) && in ieee80211_rx_h_decrypt()
1857 (status->flag & RX_FLAG_IV_STRIPPED)) in ieee80211_rx_h_decrypt()
1863 if (rx->sta) { in ieee80211_rx_h_decrypt()
1865 test_sta_flag(rx->sta, WLAN_STA_MFP)) in ieee80211_rx_h_decrypt()
1868 rx->key = rcu_dereference(rx->sta->gtk[mmie_keyidx]); in ieee80211_rx_h_decrypt()
1870 if (!rx->key) in ieee80211_rx_h_decrypt()
1871 rx->key = rcu_dereference(rx->sdata->keys[mmie_keyidx]); in ieee80211_rx_h_decrypt()
1875 * need to set rx->key if there is a key that could have been in ieee80211_rx_h_decrypt()
1880 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_decrypt()
1884 is_multicast_ether_addr(hdr->addr1) && in ieee80211_rx_h_decrypt()
1885 (key = rcu_dereference(rx->sdata->default_mgmt_key))) in ieee80211_rx_h_decrypt()
1886 rx->key = key; in ieee80211_rx_h_decrypt()
1888 if (rx->sta) { in ieee80211_rx_h_decrypt()
1890 key = rcu_dereference(rx->sta->gtk[i]); in ieee80211_rx_h_decrypt()
1897 key = rcu_dereference(sdata->keys[i]); in ieee80211_rx_h_decrypt()
1903 rx->key = key; in ieee80211_rx_h_decrypt()
1918 if ((status->flag & RX_FLAG_DECRYPTED) && in ieee80211_rx_h_decrypt()
1919 (status->flag & RX_FLAG_IV_STRIPPED)) in ieee80211_rx_h_decrypt()
1924 if (cs) { in ieee80211_rx_h_decrypt()
1925 keyidx = ieee80211_get_cs_keyid(cs, rx->skb); in ieee80211_rx_h_decrypt()
1930 if (rx->skb->len < 8 + hdrlen) in ieee80211_rx_h_decrypt()
1936 skb_copy_bits(rx->skb, hdrlen + 3, &keyid, 1); in ieee80211_rx_h_decrypt()
1940 /* check per-station GTK first, if multicast packet */ in ieee80211_rx_h_decrypt()
1941 if (is_multicast_ether_addr(hdr->addr1) && rx->sta) in ieee80211_rx_h_decrypt()
1942 rx->key = rcu_dereference(rx->sta->gtk[keyidx]); in ieee80211_rx_h_decrypt()
1945 if (!rx->key) { in ieee80211_rx_h_decrypt()
1946 rx->key = rcu_dereference(rx->sdata->keys[keyidx]); in ieee80211_rx_h_decrypt()
1949 * RSNA-protected unicast frames should always be in ieee80211_rx_h_decrypt()
1950 * sent with pairwise or station-to-station keys, in ieee80211_rx_h_decrypt()
1953 if (rx->key && in ieee80211_rx_h_decrypt()
1954 rx->key->conf.cipher != WLAN_CIPHER_SUITE_WEP40 && in ieee80211_rx_h_decrypt()
1955 rx->key->conf.cipher != WLAN_CIPHER_SUITE_WEP104 && in ieee80211_rx_h_decrypt()
1956 !is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_decrypt()
1957 rx->key = NULL; in ieee80211_rx_h_decrypt()
1961 if (rx->key) { in ieee80211_rx_h_decrypt()
1962 if (unlikely(rx->key->flags & KEY_FLAG_TAINTED)) in ieee80211_rx_h_decrypt()
1970 switch (rx->key->conf.cipher) { in ieee80211_rx_h_decrypt()
2007 status->flag |= RX_FLAG_DECRYPTED; in ieee80211_rx_h_decrypt()
2016 for (i = 0; i < ARRAY_SIZE(cache->entries); i++) in ieee80211_init_frag_cache()
2017 skb_queue_head_init(&cache->entries[i].skb_list); in ieee80211_init_frag_cache()
2024 for (i = 0; i < ARRAY_SIZE(cache->entries); i++) in ieee80211_destroy_frag_cache()
2025 __skb_queue_purge(&cache->entries[i].skb_list); in ieee80211_destroy_frag_cache()
2035 entry = &cache->entries[cache->next++]; in ieee80211_reassemble_add()
2036 if (cache->next >= IEEE80211_FRAGMENT_MAX) in ieee80211_reassemble_add()
2037 cache->next = 0; in ieee80211_reassemble_add()
2039 __skb_queue_purge(&entry->skb_list); in ieee80211_reassemble_add()
2041 __skb_queue_tail(&entry->skb_list, *skb); /* no need for locking */ in ieee80211_reassemble_add()
2043 entry->first_frag_time = jiffies; in ieee80211_reassemble_add()
2044 entry->seq = seq; in ieee80211_reassemble_add()
2045 entry->rx_queue = rx_queue; in ieee80211_reassemble_add()
2046 entry->last_frag = frag; in ieee80211_reassemble_add()
2047 entry->check_sequential_pn = false; in ieee80211_reassemble_add()
2048 entry->extra_len = 0; in ieee80211_reassemble_add()
2061 idx = cache->next; in ieee80211_reassemble_find()
2065 idx--; in ieee80211_reassemble_find()
2067 idx = IEEE80211_FRAGMENT_MAX - 1; in ieee80211_reassemble_find()
2069 entry = &cache->entries[idx]; in ieee80211_reassemble_find()
2070 if (skb_queue_empty(&entry->skb_list) || entry->seq != seq || in ieee80211_reassemble_find()
2071 entry->rx_queue != rx_queue || in ieee80211_reassemble_find()
2072 entry->last_frag + 1 != frag) in ieee80211_reassemble_find()
2075 f_hdr = (struct ieee80211_hdr *)entry->skb_list.next->data; in ieee80211_reassemble_find()
2080 if (((hdr->frame_control ^ f_hdr->frame_control) & in ieee80211_reassemble_find()
2082 !ether_addr_equal(hdr->addr1, f_hdr->addr1) || in ieee80211_reassemble_find()
2083 !ether_addr_equal(hdr->addr2, f_hdr->addr2)) in ieee80211_reassemble_find()
2086 if (time_after(jiffies, entry->first_frag_time + 2 * HZ)) { in ieee80211_reassemble_find()
2087 __skb_queue_purge(&entry->skb_list); in ieee80211_reassemble_find()
2098 return rx->key && in requires_sequential_pn()
2099 (rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP || in requires_sequential_pn()
2100 rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256 || in requires_sequential_pn()
2101 rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP || in requires_sequential_pn()
2102 rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP_256) && in requires_sequential_pn()
2109 struct ieee80211_fragment_cache *cache = &rx->sdata->frags; in ieee80211_rx_h_defragment()
2116 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_defragment()
2118 hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_defragment()
2119 fc = hdr->frame_control; in ieee80211_rx_h_defragment()
2124 sc = le16_to_cpu(hdr->seq_ctrl); in ieee80211_rx_h_defragment()
2127 if (is_multicast_ether_addr(hdr->addr1)) { in ieee80211_rx_h_defragment()
2128 I802_DEBUG_INC(rx->local->dot11MulticastReceivedFrameCount); in ieee80211_rx_h_defragment()
2132 if (rx->sta) in ieee80211_rx_h_defragment()
2133 cache = &rx->sta->frags; in ieee80211_rx_h_defragment()
2138 I802_DEBUG_INC(rx->local->rx_handlers_fragments); in ieee80211_rx_h_defragment()
2140 if (skb_linearize(rx->skb)) in ieee80211_rx_h_defragment()
2144 * skb_linearize() might change the skb->data and in ieee80211_rx_h_defragment()
2148 hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_defragment()
2154 rx->seqno_idx, &(rx->skb)); in ieee80211_rx_h_defragment()
2156 int queue = rx->security_idx; in ieee80211_rx_h_defragment()
2161 entry->check_sequential_pn = true; in ieee80211_rx_h_defragment()
2162 entry->is_protected = true; in ieee80211_rx_h_defragment()
2163 entry->key_color = rx->key->color; in ieee80211_rx_h_defragment()
2164 memcpy(entry->last_pn, in ieee80211_rx_h_defragment()
2165 rx->key->u.ccmp.rx_pn[queue], in ieee80211_rx_h_defragment()
2171 BUILD_BUG_ON(sizeof(rx->key->u.ccmp.rx_pn[queue]) != in ieee80211_rx_h_defragment()
2172 sizeof(rx->key->u.gcmp.rx_pn[queue])); in ieee80211_rx_h_defragment()
2175 } else if (rx->key && in ieee80211_rx_h_defragment()
2177 (status->flag & RX_FLAG_DECRYPTED))) { in ieee80211_rx_h_defragment()
2178 entry->is_protected = true; in ieee80211_rx_h_defragment()
2179 entry->key_color = rx->key->color; in ieee80211_rx_h_defragment()
2188 rx->seqno_idx, hdr); in ieee80211_rx_h_defragment()
2190 I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag); in ieee80211_rx_h_defragment()
2196 * see IEEE P802.11-REVmc/D5.0, 12.5.3.4.4, item d (for CCMP) in ieee80211_rx_h_defragment()
2197 * and IEEE P802.11-REVmc/D5.0, 12.5.5.4.4, item d (for GCMP) in ieee80211_rx_h_defragment()
2199 if (entry->check_sequential_pn) { in ieee80211_rx_h_defragment()
2208 if (entry->key_color != rx->key->color) in ieee80211_rx_h_defragment()
2211 memcpy(pn, entry->last_pn, IEEE80211_CCMP_PN_LEN); in ieee80211_rx_h_defragment()
2212 for (i = IEEE80211_CCMP_PN_LEN - 1; i >= 0; i--) { in ieee80211_rx_h_defragment()
2217 queue = rx->security_idx; in ieee80211_rx_h_defragment()
2218 rpn = rx->key->u.ccmp.rx_pn[queue]; in ieee80211_rx_h_defragment()
2221 memcpy(entry->last_pn, pn, IEEE80211_CCMP_PN_LEN); in ieee80211_rx_h_defragment()
2222 } else if (entry->is_protected && in ieee80211_rx_h_defragment()
2223 (!rx->key || in ieee80211_rx_h_defragment()
2225 !(status->flag & RX_FLAG_DECRYPTED)) || in ieee80211_rx_h_defragment()
2226 rx->key->color != entry->key_color)) { in ieee80211_rx_h_defragment()
2232 } else if (entry->is_protected && rx->key && in ieee80211_rx_h_defragment()
2233 entry->key_color != rx->key->color && in ieee80211_rx_h_defragment()
2234 (status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_rx_h_defragment()
2238 skb_pull(rx->skb, ieee80211_hdrlen(fc)); in ieee80211_rx_h_defragment()
2239 __skb_queue_tail(&entry->skb_list, rx->skb); in ieee80211_rx_h_defragment()
2240 entry->last_frag = frag; in ieee80211_rx_h_defragment()
2241 entry->extra_len += rx->skb->len; in ieee80211_rx_h_defragment()
2243 rx->skb = NULL; in ieee80211_rx_h_defragment()
2247 rx->skb = __skb_dequeue(&entry->skb_list); in ieee80211_rx_h_defragment()
2248 if (skb_tailroom(rx->skb) < entry->extra_len) { in ieee80211_rx_h_defragment()
2249 I802_DEBUG_INC(rx->local->rx_expand_skb_head_defrag); in ieee80211_rx_h_defragment()
2250 if (unlikely(pskb_expand_head(rx->skb, 0, entry->extra_len, in ieee80211_rx_h_defragment()
2252 I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag); in ieee80211_rx_h_defragment()
2253 __skb_queue_purge(&entry->skb_list); in ieee80211_rx_h_defragment()
2257 while ((skb = __skb_dequeue(&entry->skb_list))) { in ieee80211_rx_h_defragment()
2258 skb_put_data(rx->skb, skb->data, skb->len); in ieee80211_rx_h_defragment()
2263 ieee80211_led_rx(rx->local); in ieee80211_rx_h_defragment()
2265 if (rx->sta) in ieee80211_rx_h_defragment()
2266 rx->sta->rx_stats.packets++; in ieee80211_rx_h_defragment()
2272 if (unlikely(!rx->sta || !test_sta_flag(rx->sta, WLAN_STA_AUTHORIZED))) in ieee80211_802_1x_port_control()
2273 return -EACCES; in ieee80211_802_1x_port_control()
2280 struct ieee80211_hdr *hdr = (void *)rx->skb->data; in ieee80211_drop_unencrypted()
2281 struct sk_buff *skb = rx->skb; in ieee80211_drop_unencrypted()
2288 if (status->flag & RX_FLAG_DECRYPTED) in ieee80211_drop_unencrypted()
2292 if (unlikely(rx->sta && ieee80211_vif_is_mesh(&rx->sdata->vif) && in ieee80211_drop_unencrypted()
2299 if (!ether_addr_equal(hdr->addr1, rx->sdata->vif.addr)) in ieee80211_drop_unencrypted()
2303 if (!pskb_may_pull(rx->skb, hdr_len + 6)) in ieee80211_drop_unencrypted()
2306 mesh_hdr = (struct ieee80211s_hdr *)(skb->data + hdr_len); in ieee80211_drop_unencrypted()
2310 if (skb_copy_bits(rx->skb, ethertype_offset, ðertype, 2) == 0 && in ieee80211_drop_unencrypted()
2311 ethertype == rx->sdata->control_port_protocol) in ieee80211_drop_unencrypted()
2319 ieee80211_is_data(fc) && rx->key)) in ieee80211_drop_unencrypted()
2320 return -EACCES; in ieee80211_drop_unencrypted()
2327 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_drop_unencrypted_mgmt()
2328 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_drop_unencrypted_mgmt()
2329 __le16 fc = hdr->frame_control; in ieee80211_drop_unencrypted_mgmt()
2335 if (status->flag & RX_FLAG_DECRYPTED) in ieee80211_drop_unencrypted_mgmt()
2338 if (rx->sta && test_sta_flag(rx->sta, WLAN_STA_MFP)) { in ieee80211_drop_unencrypted_mgmt()
2340 ieee80211_is_unicast_robust_mgmt_frame(rx->skb) && in ieee80211_drop_unencrypted_mgmt()
2341 rx->key)) { in ieee80211_drop_unencrypted_mgmt()
2344 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_drop_unencrypted_mgmt()
2345 rx->skb->data, in ieee80211_drop_unencrypted_mgmt()
2346 rx->skb->len); in ieee80211_drop_unencrypted_mgmt()
2347 return -EACCES; in ieee80211_drop_unencrypted_mgmt()
2350 if (unlikely(ieee80211_is_multicast_robust_mgmt_frame(rx->skb) && in ieee80211_drop_unencrypted_mgmt()
2351 ieee80211_get_mmie_keyidx(rx->skb) < 0)) { in ieee80211_drop_unencrypted_mgmt()
2354 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_drop_unencrypted_mgmt()
2355 rx->skb->data, in ieee80211_drop_unencrypted_mgmt()
2356 rx->skb->len); in ieee80211_drop_unencrypted_mgmt()
2357 return -EACCES; in ieee80211_drop_unencrypted_mgmt()
2363 if (unlikely(ieee80211_is_action(fc) && !rx->key && in ieee80211_drop_unencrypted_mgmt()
2364 ieee80211_is_robust_mgmt_frame(rx->skb))) in ieee80211_drop_unencrypted_mgmt()
2365 return -EACCES; in ieee80211_drop_unencrypted_mgmt()
2374 struct ieee80211_sub_if_data *sdata = rx->sdata; in __ieee80211_data_to_8023()
2375 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in __ieee80211_data_to_8023()
2381 if (ieee80211_has_a4(hdr->frame_control) && in __ieee80211_data_to_8023()
2382 sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->u.vlan.sta) in __ieee80211_data_to_8023()
2383 return -1; in __ieee80211_data_to_8023()
2385 if (sdata->vif.type == NL80211_IFTYPE_STATION && in __ieee80211_data_to_8023()
2386 !!sdata->u.mgd.use_4addr != !!ieee80211_has_a4(hdr->frame_control)) { in __ieee80211_data_to_8023()
2388 if (!sdata->u.mgd.use_4addr) in __ieee80211_data_to_8023()
2389 return -1; in __ieee80211_data_to_8023()
2394 if (is_multicast_ether_addr(hdr->addr1) && in __ieee80211_data_to_8023()
2395 sdata->vif.type == NL80211_IFTYPE_AP_VLAN && sdata->u.vlan.sta) in __ieee80211_data_to_8023()
2396 return -1; in __ieee80211_data_to_8023()
2398 ret = ieee80211_data_to_8023(rx->skb, sdata->vif.addr, sdata->vif.type); in __ieee80211_data_to_8023()
2402 ehdr = (struct ethhdr *) rx->skb->data; in __ieee80211_data_to_8023()
2403 if (ehdr->h_proto == rx->sdata->control_port_protocol) in __ieee80211_data_to_8023()
2406 return -1; in __ieee80211_data_to_8023()
2412 * requires that rx->skb is a frame with ethernet header
2418 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; in ieee80211_frame_allowed()
2424 if (ehdr->h_proto == rx->sdata->control_port_protocol && in ieee80211_frame_allowed()
2425 (ether_addr_equal(ehdr->h_dest, rx->sdata->vif.addr) || in ieee80211_frame_allowed()
2426 ether_addr_equal(ehdr->h_dest, pae_group_addr))) in ieee80211_frame_allowed()
2439 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_deliver_skb_to_local_stack()
2440 struct net_device *dev = sdata->dev; in ieee80211_deliver_skb_to_local_stack() local
2442 if (unlikely((skb->protocol == sdata->control_port_protocol || in ieee80211_deliver_skb_to_local_stack()
2443 skb->protocol == cpu_to_be16(ETH_P_PREAUTH)) && in ieee80211_deliver_skb_to_local_stack()
2444 sdata->control_port_over_nl80211)) { in ieee80211_deliver_skb_to_local_stack()
2446 bool noencrypt = !(status->flag & RX_FLAG_DECRYPTED); in ieee80211_deliver_skb_to_local_stack()
2448 cfg80211_rx_control_port(dev, skb, noencrypt); in ieee80211_deliver_skb_to_local_stack()
2451 memset(skb->cb, 0, sizeof(skb->cb)); in ieee80211_deliver_skb_to_local_stack()
2454 if (rx->napi) in ieee80211_deliver_skb_to_local_stack()
2455 napi_gro_receive(rx->napi, skb); in ieee80211_deliver_skb_to_local_stack()
2462 * requires that rx->skb is a frame with ethernet header
2467 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_deliver_skb()
2468 struct net_device *dev = sdata->dev; in ieee80211_deliver_skb() local
2470 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; in ieee80211_deliver_skb()
2473 skb = rx->skb; in ieee80211_deliver_skb()
2476 ieee80211_rx_stats(dev, skb->len); in ieee80211_deliver_skb()
2478 if (rx->sta) { in ieee80211_deliver_skb()
2481 * for non-QoS-data frames. Here we know it's a data in ieee80211_deliver_skb()
2484 u64_stats_update_begin(&rx->sta->rx_stats.syncp); in ieee80211_deliver_skb()
2485 rx->sta->rx_stats.msdu[rx->seqno_idx]++; in ieee80211_deliver_skb()
2486 u64_stats_update_end(&rx->sta->rx_stats.syncp); in ieee80211_deliver_skb()
2489 if ((sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_deliver_skb()
2490 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) && in ieee80211_deliver_skb()
2491 !(sdata->flags & IEEE80211_SDATA_DONT_BRIDGE_PACKETS) && in ieee80211_deliver_skb()
2492 (sdata->vif.type != NL80211_IFTYPE_AP_VLAN || !sdata->u.vlan.sta)) { in ieee80211_deliver_skb()
2493 if (is_multicast_ether_addr(ehdr->h_dest) && in ieee80211_deliver_skb()
2502 dev->name); in ieee80211_deliver_skb()
2503 } else if (!is_multicast_ether_addr(ehdr->h_dest)) { in ieee80211_deliver_skb()
2504 dsta = sta_info_get(sdata, skb->data); in ieee80211_deliver_skb()
2521 * frames are required to be aligned to 2-byte boundaries in ieee80211_deliver_skb()
2524 * access fields as 2-byte aligned (e.g. for ether_addr_equal) in ieee80211_deliver_skb()
2528 align = (unsigned long)(skb->data + sizeof(struct ethhdr)) & 3; in ieee80211_deliver_skb()
2534 u8 *data = skb->data; in ieee80211_deliver_skb()
2536 skb->data -= align; in ieee80211_deliver_skb()
2537 memmove(skb->data, data, len); in ieee80211_deliver_skb()
2545 skb->protocol = eth_type_trans(skb, dev); in ieee80211_deliver_skb()
2555 xmit_skb->priority += 256; in ieee80211_deliver_skb()
2556 xmit_skb->protocol = htons(ETH_P_802_3); in ieee80211_deliver_skb()
2566 struct net_device *dev = rx->sdata->dev; in __ieee80211_rx_h_amsdu() local
2567 struct sk_buff *skb = rx->skb; in __ieee80211_rx_h_amsdu()
2568 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in __ieee80211_rx_h_amsdu()
2569 __le16 fc = hdr->frame_control; in __ieee80211_rx_h_amsdu()
2574 if (unlikely(ieee80211_has_a4(hdr->frame_control))) { in __ieee80211_rx_h_amsdu()
2577 } else switch (rx->sdata->vif.type) { in __ieee80211_rx_h_amsdu()
2583 if (!rx->sta || in __ieee80211_rx_h_amsdu()
2584 !test_sta_flag(rx->sta, WLAN_STA_TDLS_PEER)) in __ieee80211_rx_h_amsdu()
2594 skb->dev = dev; in __ieee80211_rx_h_amsdu()
2598 rx->sdata->vif.addr, in __ieee80211_rx_h_amsdu()
2599 rx->sdata->vif.type, in __ieee80211_rx_h_amsdu()
2603 ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr, in __ieee80211_rx_h_amsdu()
2604 rx->sdata->vif.type, in __ieee80211_rx_h_amsdu()
2605 rx->local->hw.extra_tx_headroom, in __ieee80211_rx_h_amsdu()
2609 rx->skb = __skb_dequeue(&frame_list); in __ieee80211_rx_h_amsdu()
2612 dev_kfree_skb(rx->skb); in __ieee80211_rx_h_amsdu()
2625 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_amsdu()
2627 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_rx_h_amsdu()
2628 __le16 fc = hdr->frame_control; in ieee80211_rx_h_amsdu()
2630 if (!(status->rx_flags & IEEE80211_RX_AMSDU)) in ieee80211_rx_h_amsdu()
2639 if (unlikely(ieee80211_has_a4(hdr->frame_control))) { in ieee80211_rx_h_amsdu()
2640 switch (rx->sdata->vif.type) { in ieee80211_rx_h_amsdu()
2642 if (!rx->sdata->u.vlan.sta) in ieee80211_rx_h_amsdu()
2646 if (!rx->sdata->u.mgd.use_4addr) in ieee80211_rx_h_amsdu()
2654 if (is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_amsdu()
2657 if (rx->key) { in ieee80211_rx_h_amsdu()
2659 * We should not receive A-MSDUs on pre-HT connections, in ieee80211_rx_h_amsdu()
2662 * A-MSDUs or such. in ieee80211_rx_h_amsdu()
2664 switch (rx->key->conf.cipher) { in ieee80211_rx_h_amsdu()
2684 struct sk_buff *skb = rx->skb, *fwd_skb; in ieee80211_rx_h_mesh_fwding()
2685 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_mesh_fwding()
2686 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_mesh_fwding()
2687 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_rx_h_mesh_fwding()
2691 hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_rx_h_mesh_fwding()
2692 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_rx_h_mesh_fwding()
2695 if (!pskb_may_pull(rx->skb, hdrlen + 6)) in ieee80211_rx_h_mesh_fwding()
2698 mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen); in ieee80211_rx_h_mesh_fwding()
2701 if (!pskb_may_pull(rx->skb, in ieee80211_rx_h_mesh_fwding()
2706 hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_rx_h_mesh_fwding()
2707 mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen); in ieee80211_rx_h_mesh_fwding()
2709 if (ieee80211_drop_unencrypted(rx, hdr->frame_control)) in ieee80211_rx_h_mesh_fwding()
2713 if (ieee80211_is_data(hdr->frame_control) && in ieee80211_rx_h_mesh_fwding()
2714 is_multicast_ether_addr(hdr->addr1) && in ieee80211_rx_h_mesh_fwding()
2715 mesh_rmc_check(rx->sdata, hdr->addr3, mesh_hdr)) in ieee80211_rx_h_mesh_fwding()
2718 if (!ieee80211_is_data(hdr->frame_control)) in ieee80211_rx_h_mesh_fwding()
2721 if (!mesh_hdr->ttl) in ieee80211_rx_h_mesh_fwding()
2724 if (mesh_hdr->flags & MESH_FLAGS_AE) { in ieee80211_rx_h_mesh_fwding()
2729 if (is_multicast_ether_addr(hdr->addr1)) { in ieee80211_rx_h_mesh_fwding()
2730 mpp_addr = hdr->addr3; in ieee80211_rx_h_mesh_fwding()
2731 proxied_addr = mesh_hdr->eaddr1; in ieee80211_rx_h_mesh_fwding()
2732 } else if ((mesh_hdr->flags & MESH_FLAGS_AE) == in ieee80211_rx_h_mesh_fwding()
2735 mpp_addr = hdr->addr4; in ieee80211_rx_h_mesh_fwding()
2736 proxied_addr = mesh_hdr->eaddr2; in ieee80211_rx_h_mesh_fwding()
2746 spin_lock_bh(&mppath->state_lock); in ieee80211_rx_h_mesh_fwding()
2747 if (!ether_addr_equal(mppath->mpp, mpp_addr)) in ieee80211_rx_h_mesh_fwding()
2748 memcpy(mppath->mpp, mpp_addr, ETH_ALEN); in ieee80211_rx_h_mesh_fwding()
2749 mppath->exp_time = jiffies; in ieee80211_rx_h_mesh_fwding()
2750 spin_unlock_bh(&mppath->state_lock); in ieee80211_rx_h_mesh_fwding()
2756 if (!is_multicast_ether_addr(hdr->addr1) && in ieee80211_rx_h_mesh_fwding()
2757 ether_addr_equal(sdata->vif.addr, hdr->addr3)) in ieee80211_rx_h_mesh_fwding()
2761 q = sdata->vif.hw_queue[ac]; in ieee80211_rx_h_mesh_fwding()
2762 if (ieee80211_queue_stopped(&local->hw, q)) { in ieee80211_rx_h_mesh_fwding()
2768 if (!--mesh_hdr->ttl) { in ieee80211_rx_h_mesh_fwding()
2769 if (!is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_mesh_fwding()
2775 if (!ifmsh->mshcfg.dot11MeshForwarding) in ieee80211_rx_h_mesh_fwding()
2778 if (sdata->crypto_tx_tailroom_needed_cnt) in ieee80211_rx_h_mesh_fwding()
2781 fwd_skb = skb_copy_expand(skb, local->tx_headroom + in ieee80211_rx_h_mesh_fwding()
2782 sdata->encrypt_headroom, in ieee80211_rx_h_mesh_fwding()
2787 fwd_hdr = (struct ieee80211_hdr *) fwd_skb->data; in ieee80211_rx_h_mesh_fwding()
2788 fwd_hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_RETRY); in ieee80211_rx_h_mesh_fwding()
2791 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; in ieee80211_rx_h_mesh_fwding()
2792 info->control.vif = &rx->sdata->vif; in ieee80211_rx_h_mesh_fwding()
2793 info->control.jiffies = jiffies; in ieee80211_rx_h_mesh_fwding()
2794 if (is_multicast_ether_addr(fwd_hdr->addr1)) { in ieee80211_rx_h_mesh_fwding()
2796 memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_rx_h_mesh_fwding()
2804 mesh_path_error_tx(sdata, ifmsh->mshcfg.element_ttl, in ieee80211_rx_h_mesh_fwding()
2805 fwd_hdr->addr3, 0, in ieee80211_rx_h_mesh_fwding()
2807 fwd_hdr->addr2); in ieee80211_rx_h_mesh_fwding()
2816 if (is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_mesh_fwding()
2825 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_data()
2826 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_data()
2827 struct net_device *dev = sdata->dev; in ieee80211_rx_h_data() local
2828 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_data()
2829 __le16 fc = hdr->frame_control; in ieee80211_rx_h_data()
2833 if (unlikely(!ieee80211_is_data(hdr->frame_control))) in ieee80211_rx_h_data()
2836 if (unlikely(!ieee80211_is_data_present(hdr->frame_control))) in ieee80211_rx_h_data()
2840 * Send unexpected-4addr-frame event to hostapd. For older versions, in ieee80211_rx_h_data()
2843 if (ieee80211_has_a4(hdr->frame_control) && in ieee80211_rx_h_data()
2844 sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_rx_h_data()
2845 if (rx->sta && in ieee80211_rx_h_data()
2846 !test_and_set_sta_flag(rx->sta, WLAN_STA_4ADDR_EVENT)) in ieee80211_rx_h_data()
2848 rx->sdata->dev, rx->sta->sta.addr, GFP_ATOMIC); in ieee80211_rx_h_data()
2860 if (unlikely(((struct ethhdr *)rx->skb->data)->h_proto == in ieee80211_rx_h_data()
2862 struct ieee80211_tdls_data *tf = (void *)rx->skb->data; in ieee80211_rx_h_data()
2864 if (pskb_may_pull(rx->skb, in ieee80211_rx_h_data()
2866 tf->payload_type == WLAN_TDLS_SNAP_RFTYPE && in ieee80211_rx_h_data()
2867 tf->category == WLAN_CATEGORY_TDLS && in ieee80211_rx_h_data()
2868 (tf->action_code == WLAN_TDLS_CHANNEL_SWITCH_REQUEST || in ieee80211_rx_h_data()
2869 tf->action_code == WLAN_TDLS_CHANNEL_SWITCH_RESPONSE)) { in ieee80211_rx_h_data()
2870 skb_queue_tail(&local->skb_queue_tdls_chsw, rx->skb); in ieee80211_rx_h_data()
2871 schedule_work(&local->tdls_chsw_work); in ieee80211_rx_h_data()
2872 if (rx->sta) in ieee80211_rx_h_data()
2873 rx->sta->rx_stats.packets++; in ieee80211_rx_h_data()
2879 if (rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_data()
2880 unlikely(port_control) && sdata->bss) { in ieee80211_rx_h_data()
2881 sdata = container_of(sdata->bss, struct ieee80211_sub_if_data, in ieee80211_rx_h_data()
2883 dev = sdata->dev; in ieee80211_rx_h_data()
2884 rx->sdata = sdata; in ieee80211_rx_h_data()
2887 rx->skb->dev = dev; in ieee80211_rx_h_data()
2889 if (!ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS) && in ieee80211_rx_h_data()
2890 local->ps_sdata && local->hw.conf.dynamic_ps_timeout > 0 && in ieee80211_rx_h_data()
2892 ((struct ethhdr *)rx->skb->data)->h_dest) && in ieee80211_rx_h_data()
2893 (!local->scanning && in ieee80211_rx_h_data()
2894 !test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state))) in ieee80211_rx_h_data()
2895 mod_timer(&local->dynamic_ps_timer, jiffies + in ieee80211_rx_h_data()
2896 msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout)); in ieee80211_rx_h_data()
2906 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_ctrl()
2907 struct ieee80211_bar *bar = (struct ieee80211_bar *)skb->data; in ieee80211_rx_h_ctrl()
2912 if (likely(!ieee80211_is_ctl(bar->frame_control))) in ieee80211_rx_h_ctrl()
2915 if (ieee80211_is_back_req(bar->frame_control)) { in ieee80211_rx_h_ctrl()
2923 if (!rx->sta) in ieee80211_rx_h_ctrl()
2932 if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && in ieee80211_rx_h_ctrl()
2933 !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) in ieee80211_rx_h_ctrl()
2934 ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, in ieee80211_rx_h_ctrl()
2938 tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]); in ieee80211_rx_h_ctrl()
2945 event.u.ba.sta = &rx->sta->sta; in ieee80211_rx_h_ctrl()
2948 if (tid_agg_rx->timeout) in ieee80211_rx_h_ctrl()
2949 mod_timer(&tid_agg_rx->session_timer, in ieee80211_rx_h_ctrl()
2950 TU_TO_EXP_TIME(tid_agg_rx->timeout)); in ieee80211_rx_h_ctrl()
2952 spin_lock(&tid_agg_rx->reorder_lock); in ieee80211_rx_h_ctrl()
2954 ieee80211_release_reorder_frames(rx->sdata, tid_agg_rx, in ieee80211_rx_h_ctrl()
2956 spin_unlock(&tid_agg_rx->reorder_lock); in ieee80211_rx_h_ctrl()
2958 drv_event_callback(rx->local, rx->sdata, &event); in ieee80211_rx_h_ctrl()
2976 struct ieee80211_local *local = sdata->local; in ieee80211_process_sa_query_req()
2980 if (!ether_addr_equal(mgmt->da, sdata->vif.addr)) { in ieee80211_process_sa_query_req()
2985 if (!ether_addr_equal(mgmt->sa, sdata->u.mgd.bssid) || in ieee80211_process_sa_query_req()
2986 !ether_addr_equal(mgmt->bssid, sdata->u.mgd.bssid)) { in ieee80211_process_sa_query_req()
2991 if (len < 24 + 1 + sizeof(resp->u.action.u.sa_query)) { in ieee80211_process_sa_query_req()
2996 skb = dev_alloc_skb(sizeof(*resp) + local->hw.extra_tx_headroom); in ieee80211_process_sa_query_req()
3000 skb_reserve(skb, local->hw.extra_tx_headroom); in ieee80211_process_sa_query_req()
3002 memcpy(resp->da, mgmt->sa, ETH_ALEN); in ieee80211_process_sa_query_req()
3003 memcpy(resp->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_process_sa_query_req()
3004 memcpy(resp->bssid, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_process_sa_query_req()
3005 resp->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | in ieee80211_process_sa_query_req()
3007 skb_put(skb, 1 + sizeof(resp->u.action.u.sa_query)); in ieee80211_process_sa_query_req()
3008 resp->u.action.category = WLAN_CATEGORY_SA_QUERY; in ieee80211_process_sa_query_req()
3009 resp->u.action.u.sa_query.action = WLAN_ACTION_SA_QUERY_RESPONSE; in ieee80211_process_sa_query_req()
3010 memcpy(resp->u.action.u.sa_query.trans_id, in ieee80211_process_sa_query_req()
3011 mgmt->u.action.u.sa_query.trans_id, in ieee80211_process_sa_query_req()
3020 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_mgmt_check()
3021 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_mgmt_check()
3028 if (rx->skb->len < 24) in ieee80211_rx_h_mgmt_check()
3031 if (!ieee80211_is_mgmt(mgmt->frame_control)) in ieee80211_rx_h_mgmt_check()
3034 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && in ieee80211_rx_h_mgmt_check()
3035 ieee80211_is_beacon(mgmt->frame_control) && in ieee80211_rx_h_mgmt_check()
3036 !(rx->flags & IEEE80211_RX_BEACON_REPORTED)) { in ieee80211_rx_h_mgmt_check()
3039 if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM) && in ieee80211_rx_h_mgmt_check()
3040 !(status->flag & RX_FLAG_NO_SIGNAL_VAL)) in ieee80211_rx_h_mgmt_check()
3041 sig = status->signal; in ieee80211_rx_h_mgmt_check()
3043 cfg80211_report_obss_beacon(rx->local->hw.wiphy, in ieee80211_rx_h_mgmt_check()
3044 rx->skb->data, rx->skb->len, in ieee80211_rx_h_mgmt_check()
3045 status->freq, sig); in ieee80211_rx_h_mgmt_check()
3046 rx->flags |= IEEE80211_RX_BEACON_REPORTED; in ieee80211_rx_h_mgmt_check()
3058 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_action()
3059 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_action()
3060 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_action()
3061 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_action()
3062 int len = rx->skb->len; in ieee80211_rx_h_action()
3064 if (!ieee80211_is_action(mgmt->frame_control)) in ieee80211_rx_h_action()
3071 if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC && in ieee80211_rx_h_action()
3072 mgmt->u.action.category != WLAN_CATEGORY_SELF_PROTECTED && in ieee80211_rx_h_action()
3073 mgmt->u.action.category != WLAN_CATEGORY_SPECTRUM_MGMT) in ieee80211_rx_h_action()
3076 switch (mgmt->u.action.category) { in ieee80211_rx_h_action()
3079 if (!rx->sta->sta.ht_cap.ht_supported) in ieee80211_rx_h_action()
3082 if (sdata->vif.type != NL80211_IFTYPE_STATION && in ieee80211_rx_h_action()
3083 sdata->vif.type != NL80211_IFTYPE_MESH_POINT && in ieee80211_rx_h_action()
3084 sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_action()
3085 sdata->vif.type != NL80211_IFTYPE_AP && in ieee80211_rx_h_action()
3086 sdata->vif.type != NL80211_IFTYPE_ADHOC) in ieee80211_rx_h_action()
3093 switch (mgmt->u.action.u.ht_smps.action) { in ieee80211_rx_h_action()
3100 switch (mgmt->u.action.u.ht_smps.smps_control) { in ieee80211_rx_h_action()
3115 if (rx->sta->sta.smps_mode == smps_mode) in ieee80211_rx_h_action()
3117 rx->sta->sta.smps_mode = smps_mode; in ieee80211_rx_h_action()
3122 sband = rx->local->hw.wiphy->bands[status->band]; in ieee80211_rx_h_action()
3124 rate_control_rate_update(local, sband, rx->sta, in ieee80211_rx_h_action()
3126 cfg80211_sta_opmode_change_notify(sdata->dev, in ieee80211_rx_h_action()
3127 rx->sta->addr, in ieee80211_rx_h_action()
3134 u8 chanwidth = mgmt->u.action.u.ht_notify_cw.chanwidth; in ieee80211_rx_h_action()
3139 if (!(rx->sta->sta.ht_cap.cap & in ieee80211_rx_h_action()
3146 max_bw = ieee80211_sta_cap_rx_bw(rx->sta); in ieee80211_rx_h_action()
3149 rx->sta->cur_max_bandwidth = max_bw; in ieee80211_rx_h_action()
3150 new_bw = ieee80211_sta_cur_vht_bw(rx->sta); in ieee80211_rx_h_action()
3152 if (rx->sta->sta.bandwidth == new_bw) in ieee80211_rx_h_action()
3155 rx->sta->sta.bandwidth = new_bw; in ieee80211_rx_h_action()
3156 sband = rx->local->hw.wiphy->bands[status->band]; in ieee80211_rx_h_action()
3158 ieee80211_sta_rx_bw_to_chan_width(rx->sta); in ieee80211_rx_h_action()
3161 rate_control_rate_update(local, sband, rx->sta, in ieee80211_rx_h_action()
3163 cfg80211_sta_opmode_change_notify(sdata->dev, in ieee80211_rx_h_action()
3164 rx->sta->addr, in ieee80211_rx_h_action()
3177 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_rx_h_action()
3179 if (!rx->sta) in ieee80211_rx_h_action()
3181 if (!ether_addr_equal(mgmt->bssid, sdata->u.mgd.bssid)) in ieee80211_rx_h_action()
3183 if (mgmt->u.action.u.ext_chan_switch.action_code != in ieee80211_rx_h_action()
3191 if (sdata->vif.type != NL80211_IFTYPE_STATION && in ieee80211_rx_h_action()
3192 sdata->vif.type != NL80211_IFTYPE_MESH_POINT && in ieee80211_rx_h_action()
3193 sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_action()
3194 sdata->vif.type != NL80211_IFTYPE_AP && in ieee80211_rx_h_action()
3195 sdata->vif.type != NL80211_IFTYPE_ADHOC) in ieee80211_rx_h_action()
3202 switch (mgmt->u.action.u.vht_opmode_notif.action_code) { in ieee80211_rx_h_action()
3219 if (sdata->vif.type != NL80211_IFTYPE_STATION && in ieee80211_rx_h_action()
3220 sdata->vif.type != NL80211_IFTYPE_MESH_POINT && in ieee80211_rx_h_action()
3221 sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_action()
3222 sdata->vif.type != NL80211_IFTYPE_AP && in ieee80211_rx_h_action()
3223 sdata->vif.type != NL80211_IFTYPE_ADHOC) in ieee80211_rx_h_action()
3230 switch (mgmt->u.action.u.addba_req.action_code) { in ieee80211_rx_h_action()
3233 sizeof(mgmt->u.action.u.addba_req))) in ieee80211_rx_h_action()
3238 sizeof(mgmt->u.action.u.addba_resp))) in ieee80211_rx_h_action()
3243 sizeof(mgmt->u.action.u.delba))) in ieee80211_rx_h_action()
3256 switch (mgmt->u.action.u.measurement.action_code) { in ieee80211_rx_h_action()
3258 if (status->band != NL80211_BAND_5GHZ) in ieee80211_rx_h_action()
3262 sizeof(mgmt->u.action.u.measurement))) in ieee80211_rx_h_action()
3265 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_rx_h_action()
3273 sizeof(mgmt->u.action.u.chan_switch))) in ieee80211_rx_h_action()
3276 if (sdata->vif.type != NL80211_IFTYPE_STATION && in ieee80211_rx_h_action()
3277 sdata->vif.type != NL80211_IFTYPE_ADHOC && in ieee80211_rx_h_action()
3278 sdata->vif.type != NL80211_IFTYPE_MESH_POINT) in ieee80211_rx_h_action()
3281 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_rx_h_action()
3282 bssid = sdata->u.mgd.bssid; in ieee80211_rx_h_action()
3283 else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) in ieee80211_rx_h_action()
3284 bssid = sdata->u.ibss.bssid; in ieee80211_rx_h_action()
3285 else if (sdata->vif.type == NL80211_IFTYPE_MESH_POINT) in ieee80211_rx_h_action()
3286 bssid = mgmt->sa; in ieee80211_rx_h_action()
3290 if (!ether_addr_equal(mgmt->bssid, bssid)) in ieee80211_rx_h_action()
3299 sizeof(mgmt->u.action.u.sa_query))) in ieee80211_rx_h_action()
3302 switch (mgmt->u.action.u.sa_query.action) { in ieee80211_rx_h_action()
3304 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_rx_h_action()
3312 sizeof(mgmt->u.action.u.self_prot.action_code))) in ieee80211_rx_h_action()
3315 switch (mgmt->u.action.u.self_prot.action_code) { in ieee80211_rx_h_action()
3319 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_rx_h_action()
3321 if (sdata->u.mesh.user_mpm) in ieee80211_rx_h_action()
3327 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_rx_h_action()
3334 sizeof(mgmt->u.action.u.mesh_action.action_code))) in ieee80211_rx_h_action()
3337 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_rx_h_action()
3348 status->rx_flags |= IEEE80211_RX_MALFORMED_ACTION_FRM; in ieee80211_rx_h_action()
3353 if (rx->sta) in ieee80211_rx_h_action()
3354 rx->sta->rx_stats.packets++; in ieee80211_rx_h_action()
3355 dev_kfree_skb(rx->skb); in ieee80211_rx_h_action()
3359 skb_queue_tail(&sdata->skb_queue, rx->skb); in ieee80211_rx_h_action()
3360 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_rx_h_action()
3361 if (rx->sta) in ieee80211_rx_h_action()
3362 rx->sta->rx_stats.packets++; in ieee80211_rx_h_action()
3369 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_userspace_mgmt()
3372 /* skip known-bad action frames and return them in the next handler */ in ieee80211_rx_h_userspace_mgmt()
3373 if (status->rx_flags & IEEE80211_RX_MALFORMED_ACTION_FRM) in ieee80211_rx_h_userspace_mgmt()
3383 if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM) && in ieee80211_rx_h_userspace_mgmt()
3384 !(status->flag & RX_FLAG_NO_SIGNAL_VAL)) in ieee80211_rx_h_userspace_mgmt()
3385 sig = status->signal; in ieee80211_rx_h_userspace_mgmt()
3387 if (cfg80211_rx_mgmt(&rx->sdata->wdev, status->freq, sig, in ieee80211_rx_h_userspace_mgmt()
3388 rx->skb->data, rx->skb->len, 0)) { in ieee80211_rx_h_userspace_mgmt()
3389 if (rx->sta) in ieee80211_rx_h_userspace_mgmt()
3390 rx->sta->rx_stats.packets++; in ieee80211_rx_h_userspace_mgmt()
3391 dev_kfree_skb(rx->skb); in ieee80211_rx_h_userspace_mgmt()
3401 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_action_return()
3402 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_action_return()
3404 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_action_return()
3405 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_action_return()
3407 if (!ieee80211_is_action(mgmt->frame_control)) in ieee80211_rx_h_action_return()
3415 * 802.11-2012 9.24.4. in ieee80211_rx_h_action_return()
3420 if (!(status->rx_flags & IEEE80211_RX_MALFORMED_ACTION_FRM) && in ieee80211_rx_h_action_return()
3421 (sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_rx_h_action_return()
3422 sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) in ieee80211_rx_h_action_return()
3425 if (is_multicast_ether_addr(mgmt->da)) in ieee80211_rx_h_action_return()
3429 if (mgmt->u.action.category & 0x80) in ieee80211_rx_h_action_return()
3432 nskb = skb_copy_expand(rx->skb, local->hw.extra_tx_headroom, 0, in ieee80211_rx_h_action_return()
3435 struct ieee80211_mgmt *nmgmt = (void *)nskb->data; in ieee80211_rx_h_action_return()
3437 nmgmt->u.action.category |= 0x80; in ieee80211_rx_h_action_return()
3438 memcpy(nmgmt->da, nmgmt->sa, ETH_ALEN); in ieee80211_rx_h_action_return()
3439 memcpy(nmgmt->sa, rx->sdata->vif.addr, ETH_ALEN); in ieee80211_rx_h_action_return()
3441 memset(nskb->cb, 0, sizeof(nskb->cb)); in ieee80211_rx_h_action_return()
3443 if (rx->sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) { in ieee80211_rx_h_action_return()
3446 info->flags = IEEE80211_TX_CTL_TX_OFFCHAN | in ieee80211_rx_h_action_return()
3449 if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) in ieee80211_rx_h_action_return()
3450 info->hw_queue = in ieee80211_rx_h_action_return()
3451 local->hw.offchannel_tx_hw_queue; in ieee80211_rx_h_action_return()
3454 __ieee80211_tx_skb_tid_band(rx->sdata, nskb, 7, in ieee80211_rx_h_action_return()
3455 status->band, 0); in ieee80211_rx_h_action_return()
3457 dev_kfree_skb(rx->skb); in ieee80211_rx_h_action_return()
3464 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_mgmt()
3465 struct ieee80211_mgmt *mgmt = (void *)rx->skb->data; in ieee80211_rx_h_mgmt()
3468 stype = mgmt->frame_control & cpu_to_le16(IEEE80211_FCTL_STYPE); in ieee80211_rx_h_mgmt()
3470 if (!ieee80211_vif_is_mesh(&sdata->vif) && in ieee80211_rx_h_mgmt()
3471 sdata->vif.type != NL80211_IFTYPE_ADHOC && in ieee80211_rx_h_mgmt()
3472 sdata->vif.type != NL80211_IFTYPE_OCB && in ieee80211_rx_h_mgmt()
3473 sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_rx_h_mgmt()
3483 if (is_multicast_ether_addr(mgmt->da) && in ieee80211_rx_h_mgmt()
3484 !is_broadcast_ether_addr(mgmt->da)) in ieee80211_rx_h_mgmt()
3488 if (sdata->vif.type != NL80211_IFTYPE_STATION && in ieee80211_rx_h_mgmt()
3489 sdata->vif.type != NL80211_IFTYPE_ADHOC) in ieee80211_rx_h_mgmt()
3495 if (is_multicast_ether_addr(mgmt->da) && in ieee80211_rx_h_mgmt()
3496 !is_broadcast_ether_addr(mgmt->da)) in ieee80211_rx_h_mgmt()
3500 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_rx_h_mgmt()
3505 if (sdata->vif.type != NL80211_IFTYPE_ADHOC && in ieee80211_rx_h_mgmt()
3506 sdata->vif.type != NL80211_IFTYPE_MESH_POINT) in ieee80211_rx_h_mgmt()
3514 skb_queue_tail(&sdata->skb_queue, rx->skb); in ieee80211_rx_h_mgmt()
3515 ieee80211_queue_work(&rx->local->hw, &sdata->work); in ieee80211_rx_h_mgmt()
3516 if (rx->sta) in ieee80211_rx_h_mgmt()
3517 rx->sta->rx_stats.packets++; in ieee80211_rx_h_mgmt()
3526 struct ieee80211_local *local = rx->local; in ieee80211_rx_cooked_monitor()
3527 struct sk_buff *skb = rx->skb, *skb2; in ieee80211_rx_cooked_monitor()
3536 if (rx->flags & IEEE80211_RX_CMNTR) in ieee80211_rx_cooked_monitor()
3538 rx->flags |= IEEE80211_RX_CMNTR; in ieee80211_rx_cooked_monitor()
3541 if (!local->cooked_mntrs) in ieee80211_rx_cooked_monitor()
3545 status->flag &= ~RX_FLAG_RADIOTAP_VENDOR_DATA; in ieee80211_rx_cooked_monitor()
3558 skb->ip_summed = CHECKSUM_UNNECESSARY; in ieee80211_rx_cooked_monitor()
3559 skb->pkt_type = PACKET_OTHERHOST; in ieee80211_rx_cooked_monitor()
3560 skb->protocol = htons(ETH_P_802_2); in ieee80211_rx_cooked_monitor()
3562 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_rx_cooked_monitor()
3566 if (sdata->vif.type != NL80211_IFTYPE_MONITOR || in ieee80211_rx_cooked_monitor()
3567 !(sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES)) in ieee80211_rx_cooked_monitor()
3573 skb2->dev = prev_dev; in ieee80211_rx_cooked_monitor()
3578 prev_dev = sdata->dev; in ieee80211_rx_cooked_monitor()
3579 ieee80211_rx_stats(sdata->dev, skb->len); in ieee80211_rx_cooked_monitor()
3583 skb->dev = prev_dev; in ieee80211_rx_cooked_monitor()
3597 I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop); in ieee80211_rx_handlers_result()
3598 if (rx->sta) in ieee80211_rx_handlers_result()
3599 rx->sta->rx_stats.dropped++; in ieee80211_rx_handlers_result()
3606 status = IEEE80211_SKB_RXCB((rx->skb)); in ieee80211_rx_handlers_result()
3608 sband = rx->local->hw.wiphy->bands[status->band]; in ieee80211_rx_handlers_result()
3609 if (status->encoding == RX_ENC_LEGACY) in ieee80211_rx_handlers_result()
3610 rate = &sband->bitrates[status->rate_idx]; in ieee80211_rx_handlers_result()
3616 I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop); in ieee80211_rx_handlers_result()
3617 if (rx->sta) in ieee80211_rx_handlers_result()
3618 rx->sta->rx_stats.dropped++; in ieee80211_rx_handlers_result()
3619 dev_kfree_skb(rx->skb); in ieee80211_rx_handlers_result()
3622 I802_DEBUG_INC(rx->sdata->local->rx_handlers_queued); in ieee80211_rx_handlers_result()
3646 spin_lock_bh(&rx->local->rx_path_lock); in ieee80211_rx_handlers()
3654 rx->skb = skb; in ieee80211_rx_handlers()
3664 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) in ieee80211_rx_handlers()
3670 /* special treatment -- needs the queue */ in ieee80211_rx_handlers()
3687 spin_unlock_bh(&rx->local->rx_path_lock); in ieee80211_rx_handlers()
3727 .sdata = sta->sdata, in ieee80211_release_reorder_timeout()
3728 .local = sta->local, in ieee80211_release_reorder_timeout()
3729 /* This is OK -- must be QoS data frame */ in ieee80211_release_reorder_timeout()
3736 tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); in ieee80211_release_reorder_timeout()
3742 spin_lock(&tid_agg_rx->reorder_lock); in ieee80211_release_reorder_timeout()
3743 ieee80211_sta_reorder_release(sta->sdata, tid_agg_rx, &frames); in ieee80211_release_reorder_timeout()
3744 spin_unlock(&tid_agg_rx->reorder_lock); in ieee80211_release_reorder_timeout()
3750 .u.ba.sta = &sta->sta, in ieee80211_release_reorder_timeout()
3766 /* This is OK -- must be QoS data frame */ in ieee80211_mark_rx_ba_filtered_frames()
3780 rx.sdata = sta->sdata; in ieee80211_mark_rx_ba_filtered_frames()
3781 rx.local = sta->local; in ieee80211_mark_rx_ba_filtered_frames()
3784 tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); in ieee80211_mark_rx_ba_filtered_frames()
3788 spin_lock_bh(&tid_agg_rx->reorder_lock); in ieee80211_mark_rx_ba_filtered_frames()
3794 release = (tid_agg_rx->head_seq_num + tid_agg_rx->buf_size) % in ieee80211_mark_rx_ba_filtered_frames()
3796 ieee80211_release_reorder_frames(sta->sdata, tid_agg_rx, in ieee80211_mark_rx_ba_filtered_frames()
3799 tid_agg_rx->head_seq_num = ssn; in ieee80211_mark_rx_ba_filtered_frames()
3801 ieee80211_release_reorder_frames(sta->sdata, tid_agg_rx, ssn, in ieee80211_mark_rx_ba_filtered_frames()
3806 * it can be tid_agg_rx->buf_size behind and still be valid */ in ieee80211_mark_rx_ba_filtered_frames()
3807 diff = (tid_agg_rx->head_seq_num - ssn) & IEEE80211_SN_MASK; in ieee80211_mark_rx_ba_filtered_frames()
3808 if (diff >= tid_agg_rx->buf_size) { in ieee80211_mark_rx_ba_filtered_frames()
3809 tid_agg_rx->reorder_buf_filtered = 0; in ieee80211_mark_rx_ba_filtered_frames()
3816 for (i = 0; i < tid_agg_rx->buf_size; i++) { in ieee80211_mark_rx_ba_filtered_frames()
3817 int index = (ssn + i) % tid_agg_rx->buf_size; in ieee80211_mark_rx_ba_filtered_frames()
3819 tid_agg_rx->reorder_buf_filtered &= ~BIT_ULL(index); in ieee80211_mark_rx_ba_filtered_frames()
3821 tid_agg_rx->reorder_buf_filtered |= BIT_ULL(index); in ieee80211_mark_rx_ba_filtered_frames()
3825 ieee80211_sta_reorder_release(sta->sdata, tid_agg_rx, &frames); in ieee80211_mark_rx_ba_filtered_frames()
3828 spin_unlock_bh(&tid_agg_rx->reorder_lock); in ieee80211_mark_rx_ba_filtered_frames()
3841 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_accept_frame()
3842 struct sk_buff *skb = rx->skb; in ieee80211_accept_frame()
3843 struct ieee80211_hdr *hdr = (void *)skb->data; in ieee80211_accept_frame()
3845 u8 *bssid = ieee80211_get_bssid(hdr, skb->len, sdata->vif.type); in ieee80211_accept_frame()
3846 bool multicast = is_multicast_ether_addr(hdr->addr1); in ieee80211_accept_frame()
3848 switch (sdata->vif.type) { in ieee80211_accept_frame()
3850 if (!bssid && !sdata->u.mgd.use_4addr) in ieee80211_accept_frame()
3852 if (ieee80211_is_robust_mgmt_frame(skb) && !rx->sta) in ieee80211_accept_frame()
3856 return ether_addr_equal(sdata->vif.addr, hdr->addr1); in ieee80211_accept_frame()
3860 if (ether_addr_equal(sdata->vif.addr, hdr->addr2) || in ieee80211_accept_frame()
3861 ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2)) in ieee80211_accept_frame()
3863 if (ieee80211_is_beacon(hdr->frame_control)) in ieee80211_accept_frame()
3865 if (!ieee80211_bssid_match(bssid, sdata->u.ibss.bssid)) in ieee80211_accept_frame()
3868 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) in ieee80211_accept_frame()
3870 if (!rx->sta) { in ieee80211_accept_frame()
3872 if (status->encoding != RX_ENC_LEGACY) in ieee80211_accept_frame()
3875 rate_idx = status->rate_idx; in ieee80211_accept_frame()
3876 ieee80211_ibss_rx_no_sta(sdata, bssid, hdr->addr2, in ieee80211_accept_frame()
3883 if (!ieee80211_is_data_present(hdr->frame_control)) in ieee80211_accept_frame()
3888 !ether_addr_equal(sdata->dev->dev_addr, hdr->addr1)) in ieee80211_accept_frame()
3890 if (!rx->sta) { in ieee80211_accept_frame()
3892 if (status->encoding != RX_ENC_LEGACY) in ieee80211_accept_frame()
3895 rate_idx = status->rate_idx; in ieee80211_accept_frame()
3896 ieee80211_ocb_rx_no_sta(sdata, bssid, hdr->addr2, in ieee80211_accept_frame()
3901 if (ether_addr_equal(sdata->vif.addr, hdr->addr2)) in ieee80211_accept_frame()
3905 return ether_addr_equal(sdata->vif.addr, hdr->addr1); in ieee80211_accept_frame()
3909 return ether_addr_equal(sdata->vif.addr, hdr->addr1); in ieee80211_accept_frame()
3911 if (!ieee80211_bssid_match(bssid, sdata->vif.addr)) { in ieee80211_accept_frame()
3919 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) in ieee80211_accept_frame()
3921 if (ieee80211_is_public_action(hdr, skb->len)) in ieee80211_accept_frame()
3923 return ieee80211_is_beacon(hdr->frame_control); in ieee80211_accept_frame()
3926 if (!ieee80211_has_tods(hdr->frame_control)) { in ieee80211_accept_frame()
3927 /* ignore data frames to TDLS-peers */ in ieee80211_accept_frame()
3928 if (ieee80211_is_data(hdr->frame_control)) in ieee80211_accept_frame()
3930 /* ignore action frames to TDLS-peers */ in ieee80211_accept_frame()
3931 if (ieee80211_is_action(hdr->frame_control) && in ieee80211_accept_frame()
3933 !ether_addr_equal(bssid, hdr->addr1)) in ieee80211_accept_frame()
3938 * 802.11-2016 Table 9-26 says that for data frames, A1 must be in ieee80211_accept_frame()
3939 * the BSSID - we've checked that already but may have accepted in ieee80211_accept_frame()
3954 if (ieee80211_is_data(hdr->frame_control) && multicast) in ieee80211_accept_frame()
3959 if (bssid || !ieee80211_is_data(hdr->frame_control)) in ieee80211_accept_frame()
3961 return ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2); in ieee80211_accept_frame()
3963 return ieee80211_is_public_action(hdr, skb->len) || in ieee80211_accept_frame()
3964 ieee80211_is_probe_req(hdr->frame_control) || in ieee80211_accept_frame()
3965 ieee80211_is_probe_resp(hdr->frame_control) || in ieee80211_accept_frame()
3966 ieee80211_is_beacon(hdr->frame_control); in ieee80211_accept_frame()
3980 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_check_fast_rx()
3981 struct ieee80211_local *local = sdata->local; in ieee80211_check_fast_rx()
3984 .dev = sdata->dev, in ieee80211_check_fast_rx()
3985 .vif_type = sdata->vif.type, in ieee80211_check_fast_rx()
3986 .control_port_protocol = sdata->control_port_protocol, in ieee80211_check_fast_rx()
3996 ether_addr_copy(fastrx.vif_addr, sdata->vif.addr); in ieee80211_check_fast_rx()
3998 fastrx.uses_rss = ieee80211_hw_check(&local->hw, USES_RSS); in ieee80211_check_fast_rx()
4000 /* fast-rx doesn't do reordering */ in ieee80211_check_fast_rx()
4001 if (ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION) && in ieee80211_check_fast_rx()
4002 !ieee80211_hw_check(&local->hw, SUPPORTS_REORDERING_BUFFER)) in ieee80211_check_fast_rx()
4005 switch (sdata->vif.type) { in ieee80211_check_fast_rx()
4007 if (sta->sta.tdls) { in ieee80211_check_fast_rx()
4012 fastrx.sta_notify = sdata->u.mgd.probe_send_count > 0; in ieee80211_check_fast_rx()
4019 if (sdata->u.mgd.use_4addr && !sta->sta.tdls) { in ieee80211_check_fast_rx()
4026 if (!sdata->u.mgd.powersave) in ieee80211_check_fast_rx()
4030 if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) in ieee80211_check_fast_rx()
4032 if (ieee80211_hw_check(&local->hw, SUPPORTS_PS) && in ieee80211_check_fast_rx()
4033 !ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS)) in ieee80211_check_fast_rx()
4038 /* parallel-rx requires this, at least with calls to in ieee80211_check_fast_rx()
4041 if (!ieee80211_hw_check(&local->hw, AP_LINK_PS)) in ieee80211_check_fast_rx()
4048 !(sdata->flags & IEEE80211_SDATA_DONT_BRIDGE_PACKETS) && in ieee80211_check_fast_rx()
4049 (sdata->vif.type != NL80211_IFTYPE_AP_VLAN || in ieee80211_check_fast_rx()
4050 !sdata->u.vlan.sta); in ieee80211_check_fast_rx()
4052 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_check_fast_rx()
4053 sdata->u.vlan.sta) { in ieee80211_check_fast_rx()
4069 key = rcu_dereference(sta->ptk[sta->ptk_idx]); in ieee80211_check_fast_rx()
4071 switch (key->conf.cipher) { in ieee80211_check_fast_rx()
4073 /* we don't want to deal with MMIC in fast-rx */ in ieee80211_check_fast_rx()
4092 fastrx.icv_len = key->conf.icv_len; in ieee80211_check_fast_rx()
4104 spin_lock_bh(&sta->lock); in ieee80211_check_fast_rx()
4105 old = rcu_dereference_protected(sta->fast_rx, true); in ieee80211_check_fast_rx()
4106 rcu_assign_pointer(sta->fast_rx, new); in ieee80211_check_fast_rx()
4107 spin_unlock_bh(&sta->lock); in ieee80211_check_fast_rx()
4117 spin_lock_bh(&sta->lock); in ieee80211_clear_fast_rx()
4118 old = rcu_dereference_protected(sta->fast_rx, true); in ieee80211_clear_fast_rx()
4119 RCU_INIT_POINTER(sta->fast_rx, NULL); in ieee80211_clear_fast_rx()
4120 spin_unlock_bh(&sta->lock); in ieee80211_clear_fast_rx()
4128 struct ieee80211_local *local = sdata->local; in __ieee80211_check_fast_rx_iface()
4131 lockdep_assert_held(&local->sta_mtx); in __ieee80211_check_fast_rx_iface()
4133 list_for_each_entry(sta, &local->sta_list, list) { in __ieee80211_check_fast_rx_iface()
4134 if (sdata != sta->sdata && in __ieee80211_check_fast_rx_iface()
4135 (!sta->sdata->bss || sta->sdata->bss != sdata->bss)) in __ieee80211_check_fast_rx_iface()
4143 struct ieee80211_local *local = sdata->local; in ieee80211_check_fast_rx_iface()
4145 mutex_lock(&local->sta_mtx); in ieee80211_check_fast_rx_iface()
4147 mutex_unlock(&local->sta_mtx); in ieee80211_check_fast_rx_iface()
4153 struct sk_buff *skb = rx->skb; in ieee80211_invoke_fast_rx()
4154 struct ieee80211_hdr *hdr = (void *)skb->data; in ieee80211_invoke_fast_rx()
4156 struct sta_info *sta = rx->sta; in ieee80211_invoke_fast_rx()
4157 int orig_len = skb->len; in ieee80211_invoke_fast_rx()
4158 int hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_invoke_fast_rx()
4168 struct ieee80211_sta_rx_stats *stats = &sta->rx_stats; in ieee80211_invoke_fast_rx()
4170 if (fast_rx->uses_rss) in ieee80211_invoke_fast_rx()
4171 stats = this_cpu_ptr(sta->pcpu_rx_stats); in ieee80211_invoke_fast_rx()
4173 /* for parallel-rx, we need to have DUP_VALIDATED, otherwise we write in ieee80211_invoke_fast_rx()
4177 if (!(status->flag & RX_FLAG_DUP_VALIDATED)) in ieee80211_invoke_fast_rx()
4183 * - PN_VALIDATED: similar, but the implementation is tricky in ieee80211_invoke_fast_rx()
4184 * - DECRYPTED: necessary for PN_VALIDATED in ieee80211_invoke_fast_rx()
4186 if (fast_rx->key && in ieee80211_invoke_fast_rx()
4187 (status->flag & FAST_RX_CRYPT_FLAGS) != FAST_RX_CRYPT_FLAGS) in ieee80211_invoke_fast_rx()
4190 if (unlikely(!ieee80211_is_data_present(hdr->frame_control))) in ieee80211_invoke_fast_rx()
4205 if (!ether_addr_equal(fast_rx->vif_addr, hdr->addr1)) in ieee80211_invoke_fast_rx()
4208 if ((hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_FROMDS | in ieee80211_invoke_fast_rx()
4210 fast_rx->expected_ds_bits) in ieee80211_invoke_fast_rx()
4216 if (fast_rx->key && !(status->flag & RX_FLAG_IV_STRIPPED)) { in ieee80211_invoke_fast_rx()
4221 if (!(status->rx_flags & IEEE80211_RX_AMSDU)) { in ieee80211_invoke_fast_rx()
4225 payload = (void *)(skb->data + snap_offs); in ieee80211_invoke_fast_rx()
4227 if (!ether_addr_equal(payload->snap, fast_rx->rfc1042_hdr)) in ieee80211_invoke_fast_rx()
4232 * bridge-tunnel header - but if we get them this way then in ieee80211_invoke_fast_rx()
4235 if (unlikely(payload->proto == cpu_to_be16(ETH_P_TDLS) || in ieee80211_invoke_fast_rx()
4236 payload->proto == fast_rx->control_port_protocol)) in ieee80211_invoke_fast_rx()
4242 if (rx->key && !(status->flag & RX_FLAG_MIC_STRIPPED) && in ieee80211_invoke_fast_rx()
4243 pskb_trim(skb, skb->len - fast_rx->icv_len)) in ieee80211_invoke_fast_rx()
4246 if (unlikely(fast_rx->sta_notify)) { in ieee80211_invoke_fast_rx()
4247 ieee80211_sta_rx_notify(rx->sdata, hdr); in ieee80211_invoke_fast_rx()
4248 fast_rx->sta_notify = false; in ieee80211_invoke_fast_rx()
4252 if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { in ieee80211_invoke_fast_rx()
4253 stats->last_signal = status->signal; in ieee80211_invoke_fast_rx()
4254 if (!fast_rx->uses_rss) in ieee80211_invoke_fast_rx()
4255 ewma_signal_add(&sta->rx_stats_avg.signal, in ieee80211_invoke_fast_rx()
4256 -status->signal); in ieee80211_invoke_fast_rx()
4259 if (status->chains) { in ieee80211_invoke_fast_rx()
4262 stats->chains = status->chains; in ieee80211_invoke_fast_rx()
4263 for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) { in ieee80211_invoke_fast_rx()
4264 int signal = status->chain_signal[i]; in ieee80211_invoke_fast_rx()
4266 if (!(status->chains & BIT(i))) in ieee80211_invoke_fast_rx()
4269 stats->chain_signal_last[i] = signal; in ieee80211_invoke_fast_rx()
4270 if (!fast_rx->uses_rss) in ieee80211_invoke_fast_rx()
4271 ewma_signal_add(&sta->rx_stats_avg.chain_signal[i], in ieee80211_invoke_fast_rx()
4272 -signal); in ieee80211_invoke_fast_rx()
4277 if (rx->key && !ieee80211_has_protected(hdr->frame_control)) in ieee80211_invoke_fast_rx()
4280 if (status->rx_flags & IEEE80211_RX_AMSDU) { in ieee80211_invoke_fast_rx()
4281 if (__ieee80211_rx_h_amsdu(rx, snap_offs - hdrlen) != in ieee80211_invoke_fast_rx()
4288 stats->last_rx = jiffies; in ieee80211_invoke_fast_rx()
4289 stats->last_rate = sta_stats_encode_rate(status); in ieee80211_invoke_fast_rx()
4291 stats->fragments++; in ieee80211_invoke_fast_rx()
4292 stats->packets++; in ieee80211_invoke_fast_rx()
4294 /* do the header conversion - first grab the addresses */ in ieee80211_invoke_fast_rx()
4295 ether_addr_copy(addrs.da, skb->data + fast_rx->da_offs); in ieee80211_invoke_fast_rx()
4296 ether_addr_copy(addrs.sa, skb->data + fast_rx->sa_offs); in ieee80211_invoke_fast_rx()
4302 skb->dev = fast_rx->dev; in ieee80211_invoke_fast_rx()
4304 ieee80211_rx_stats(fast_rx->dev, skb->len); in ieee80211_invoke_fast_rx()
4308 * for non-QoS-data frames. Here we know it's a data in ieee80211_invoke_fast_rx()
4311 u64_stats_update_begin(&stats->syncp); in ieee80211_invoke_fast_rx()
4312 stats->msdu[rx->seqno_idx]++; in ieee80211_invoke_fast_rx()
4313 stats->bytes += orig_len; in ieee80211_invoke_fast_rx()
4314 u64_stats_update_end(&stats->syncp); in ieee80211_invoke_fast_rx()
4316 if (fast_rx->internal_forward) { in ieee80211_invoke_fast_rx()
4318 bool multicast = is_multicast_ether_addr(skb->data); in ieee80211_invoke_fast_rx()
4322 } else if (sta_info_get(rx->sdata, skb->data)) { in ieee80211_invoke_fast_rx()
4333 xmit_skb->priority += 256; in ieee80211_invoke_fast_rx()
4334 xmit_skb->protocol = htons(ETH_P_802_3); in ieee80211_invoke_fast_rx()
4345 skb->protocol = eth_type_trans(skb, fast_rx->dev); in ieee80211_invoke_fast_rx()
4346 memset(skb->cb, 0, sizeof(skb->cb)); in ieee80211_invoke_fast_rx()
4347 if (rx->napi) in ieee80211_invoke_fast_rx()
4348 napi_gro_receive(rx->napi, skb); in ieee80211_invoke_fast_rx()
4355 stats->dropped++; in ieee80211_invoke_fast_rx()
4368 struct ieee80211_local *local = rx->local; in ieee80211_prepare_and_rx_handle()
4369 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_prepare_and_rx_handle()
4371 rx->skb = skb; in ieee80211_prepare_and_rx_handle()
4373 /* See if we can do fast-rx; if we have to copy we already lost, in ieee80211_prepare_and_rx_handle()
4380 if (consume && rx->sta) { in ieee80211_prepare_and_rx_handle()
4383 fast_rx = rcu_dereference(rx->sta->fast_rx); in ieee80211_prepare_and_rx_handle()
4395 wiphy_debug(local->hw.wiphy, in ieee80211_prepare_and_rx_handle()
4397 sdata->name); in ieee80211_prepare_and_rx_handle()
4401 rx->skb = skb; in ieee80211_prepare_and_rx_handle()
4426 fc = ((struct ieee80211_hdr *)skb->data)->frame_control; in __ieee80211_rx_handle_packet()
4433 I802_DEBUG_INC(local->dot11ReceivedFragmentCount); in __ieee80211_rx_handle_packet()
4437 if (skb->len < ieee80211_hdrlen(fc)) in __ieee80211_rx_handle_packet()
4438 err = -ENOBUFS; in __ieee80211_rx_handle_packet()
4450 hdr = (struct ieee80211_hdr *)skb->data; in __ieee80211_rx_handle_packet()
4454 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control) || in __ieee80211_rx_handle_packet()
4455 ieee80211_is_beacon(hdr->frame_control))) in __ieee80211_rx_handle_packet()
4463 rx.sdata = rx.sta->sdata; in __ieee80211_rx_handle_packet()
4471 for_each_sta_info(local, hdr->addr2, sta, tmp) { in __ieee80211_rx_handle_packet()
4478 rx.sdata = prev_sta->sdata; in __ieee80211_rx_handle_packet()
4486 rx.sdata = prev_sta->sdata; in __ieee80211_rx_handle_packet()
4496 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in __ieee80211_rx_handle_packet()
4500 if (sdata->vif.type == NL80211_IFTYPE_MONITOR || in __ieee80211_rx_handle_packet()
4501 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in __ieee80211_rx_handle_packet()
4515 rx.sta = sta_info_get_bss(prev, hdr->addr2); in __ieee80211_rx_handle_packet()
4523 rx.sta = sta_info_get_bss(prev, hdr->addr2); in __ieee80211_rx_handle_packet()
4548 if (WARN_ON(status->band >= NUM_NL80211_BANDS)) in ieee80211_rx_napi()
4551 sband = local->hw.wiphy->bands[status->band]; in ieee80211_rx_napi()
4562 if (unlikely(local->quiescing || local->suspended)) in ieee80211_rx_napi()
4566 if (unlikely(local->in_reconfig)) in ieee80211_rx_napi()
4573 if (WARN_ON(!local->started)) in ieee80211_rx_napi()
4576 if (likely(!(status->flag & RX_FLAG_FAILED_PLCP_CRC))) { in ieee80211_rx_napi()
4582 switch (status->encoding) { in ieee80211_rx_napi()
4585 * rate_idx is MCS index, which can be [0-76] in ieee80211_rx_napi()
4594 if (WARN(status->rate_idx > 76, in ieee80211_rx_napi()
4596 "status->rate_idx is not " in ieee80211_rx_napi()
4597 "an MCS index [0-76]: %d (0x%02x)\n", in ieee80211_rx_napi()
4598 status->rate_idx, in ieee80211_rx_napi()
4599 status->rate_idx)) in ieee80211_rx_napi()
4603 if (WARN_ONCE(status->rate_idx > 9 || in ieee80211_rx_napi()
4604 !status->nss || in ieee80211_rx_napi()
4605 status->nss > 8, in ieee80211_rx_napi()
4607 status->rate_idx, status->nss)) in ieee80211_rx_napi()
4611 if (WARN_ONCE(status->rate_idx > 11 || in ieee80211_rx_napi()
4612 !status->nss || in ieee80211_rx_napi()
4613 status->nss > 8, in ieee80211_rx_napi()
4615 status->rate_idx, status->nss)) in ieee80211_rx_napi()
4622 if (WARN_ON(status->rate_idx >= sband->n_bitrates)) in ieee80211_rx_napi()
4624 rate = &sband->bitrates[status->rate_idx]; in ieee80211_rx_napi()
4628 status->rx_flags = 0; in ieee80211_rx_napi()
4632 * and this requires that we are in a read-side RCU section during in ieee80211_rx_napi()
4650 ((struct ieee80211_hdr *)skb->data)->frame_control, in ieee80211_rx_napi()
4651 skb->len); in ieee80211_rx_napi()
4669 BUILD_BUG_ON(sizeof(struct ieee80211_rx_status) > sizeof(skb->cb)); in ieee80211_rx_irqsafe()
4671 skb->pkt_type = IEEE80211_RX_MSG; in ieee80211_rx_irqsafe()
4672 skb_queue_tail(&local->skb_queue, skb); in ieee80211_rx_irqsafe()
4673 tasklet_schedule(&local->tasklet); in ieee80211_rx_irqsafe()