Lines Matching +full:cs +full:- +full:dev +full:- +full:assoc
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright 2002-2005, Instant802 Networks, Inc.
4 * Copyright 2005-2006, Devicescape Software, Inc.
5 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
6 * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net>
7 * Copyright 2013-2014 Intel Mobile Communications GmbH
8 * Copyright(c) 2015 - 2017 Intel Deutschland GmbH
9 * Copyright (C) 2018-2021 Intel Corporation
27 #include "driver-ops.h"
51 __pskb_trim(skb, skb->len - present_fcs_len); in ieee80211_clean_skb()
54 hdr = (void *)skb->data; in ieee80211_clean_skb()
55 fc = hdr->frame_control; in ieee80211_clean_skb()
58 * Remove the HT-Control field (if present) on management in ieee80211_clean_skb()
68 hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_ORDER); in ieee80211_clean_skb()
75 memmove(skb->data + IEEE80211_HT_CTL_LEN, skb->data, in ieee80211_clean_skb()
76 hdrlen - IEEE80211_HT_CTL_LEN); in ieee80211_clean_skb()
88 hdr = (void *)(skb->data + rtap_space); in should_drop_frame()
90 if (status->flag & (RX_FLAG_FAILED_FCS_CRC | in should_drop_frame()
96 if (unlikely(skb->len < 16 + present_fcs_len + rtap_space)) in should_drop_frame()
99 if (ieee80211_is_ctl(hdr->frame_control) && in should_drop_frame()
100 !ieee80211_is_pspoll(hdr->frame_control) && in should_drop_frame()
101 !ieee80211_is_back_req(hdr->frame_control)) in should_drop_frame()
118 if (status->chains) in ieee80211_rx_radiotap_hdrlen()
119 len += 4 * hweight8(status->chains); in ieee80211_rx_radiotap_hdrlen()
121 if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) in ieee80211_rx_radiotap_hdrlen()
128 if (ieee80211_hw_check(&local->hw, SIGNAL_DBM)) in ieee80211_rx_radiotap_hdrlen()
131 /* antenna field, if we don't have per-chain info */ in ieee80211_rx_radiotap_hdrlen()
132 if (!status->chains) in ieee80211_rx_radiotap_hdrlen()
138 if (status->encoding == RX_ENC_HT) /* HT info */ in ieee80211_rx_radiotap_hdrlen()
141 if (status->flag & RX_FLAG_AMPDU_DETAILS) { in ieee80211_rx_radiotap_hdrlen()
146 if (status->encoding == RX_ENC_VHT) { in ieee80211_rx_radiotap_hdrlen()
151 if (local->hw.radiotap_timestamp.units_pos >= 0) { in ieee80211_rx_radiotap_hdrlen()
156 if (status->encoding == RX_ENC_HE && in ieee80211_rx_radiotap_hdrlen()
157 status->flag & RX_FLAG_RADIOTAP_HE) { in ieee80211_rx_radiotap_hdrlen()
163 if (status->encoding == RX_ENC_HE && in ieee80211_rx_radiotap_hdrlen()
164 status->flag & RX_FLAG_RADIOTAP_HE_MU) { in ieee80211_rx_radiotap_hdrlen()
170 if (status->flag & RX_FLAG_NO_PSDU) in ieee80211_rx_radiotap_hdrlen()
173 if (status->flag & RX_FLAG_RADIOTAP_LSIG) { in ieee80211_rx_radiotap_hdrlen()
179 if (status->chains) { in ieee80211_rx_radiotap_hdrlen()
181 len += 2 * hweight8(status->chains); in ieee80211_rx_radiotap_hdrlen()
184 if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) { in ieee80211_rx_radiotap_hdrlen()
189 * The position to look at depends on the existence (or non- in ieee80211_rx_radiotap_hdrlen()
192 if (status->flag & RX_FLAG_RADIOTAP_HE) in ieee80211_rx_radiotap_hdrlen()
195 if (status->flag & RX_FLAG_RADIOTAP_HE_MU) in ieee80211_rx_radiotap_hdrlen()
198 if (status->flag & RX_FLAG_RADIOTAP_LSIG) in ieee80211_rx_radiotap_hdrlen()
202 rtap = (void *)&skb->data[vendor_data_offset]; in ieee80211_rx_radiotap_hdrlen()
204 /* alignment for fixed 6-byte vendor data header */ in ieee80211_rx_radiotap_hdrlen()
208 if (WARN_ON(rtap->align == 0)) in ieee80211_rx_radiotap_hdrlen()
209 rtap->align = 1; in ieee80211_rx_radiotap_hdrlen()
210 len = ALIGN(len, rtap->align); in ieee80211_rx_radiotap_hdrlen()
211 len += rtap->len + rtap->pad; in ieee80211_rx_radiotap_hdrlen()
221 skb_queue_tail(&sdata->skb_queue, skb); in __ieee80211_queue_skb_to_iface()
222 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in __ieee80211_queue_skb_to_iface()
224 sta->rx_stats.packets++; in __ieee80211_queue_skb_to_iface()
231 skb->protocol = 0; in ieee80211_queue_skb_to_iface()
250 if (skb->len < rtap_space + sizeof(action) + in ieee80211_handle_mu_mimo_mon()
254 if (!is_valid_ether_addr(sdata->u.mntr.mu_follow_addr)) in ieee80211_handle_mu_mimo_mon()
268 if (!ether_addr_equal(action.hdr.addr1, sdata->u.mntr.mu_follow_addr)) in ieee80211_handle_mu_mimo_mon()
279 * ieee80211_add_rx_radiotap_header - add radiotap header
297 unsigned long chains = status->chains; in ieee80211_add_rx_radiotap_header()
303 if (status->flag & RX_FLAG_RADIOTAP_HE) { in ieee80211_add_rx_radiotap_header()
304 he = *(struct ieee80211_radiotap_he *)skb->data; in ieee80211_add_rx_radiotap_header()
306 WARN_ON_ONCE(status->encoding != RX_ENC_HE); in ieee80211_add_rx_radiotap_header()
309 if (status->flag & RX_FLAG_RADIOTAP_HE_MU) { in ieee80211_add_rx_radiotap_header()
310 he_mu = *(struct ieee80211_radiotap_he_mu *)skb->data; in ieee80211_add_rx_radiotap_header()
314 if (status->flag & RX_FLAG_RADIOTAP_LSIG) { in ieee80211_add_rx_radiotap_header()
315 lsig = *(struct ieee80211_radiotap_lsig *)skb->data; in ieee80211_add_rx_radiotap_header()
319 if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) { in ieee80211_add_rx_radiotap_header()
320 rtap = *(struct ieee80211_vendor_radiotap *)skb->data; in ieee80211_add_rx_radiotap_header()
325 mpdulen = skb->len; in ieee80211_add_rx_radiotap_header()
326 if (!(has_fcs && ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS))) in ieee80211_add_rx_radiotap_header()
330 memset(rthdr, 0, rtap_len - rtap.len - rtap.pad); in ieee80211_add_rx_radiotap_header()
331 it_present = &rthdr->it_present; in ieee80211_add_rx_radiotap_header()
334 rthdr->it_len = cpu_to_le16(rtap_len); in ieee80211_add_rx_radiotap_header()
339 if (!status->chains) in ieee80211_add_rx_radiotap_header()
352 if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) { in ieee80211_add_rx_radiotap_header()
367 pos = (void *)&rthdr->it_optional[it_present - rthdr->it_optional]; in ieee80211_add_rx_radiotap_header()
374 while ((pos - (u8 *)rthdr) & 7) in ieee80211_add_rx_radiotap_header()
380 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_TSFT)); in ieee80211_add_rx_radiotap_header()
385 if (has_fcs && ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS)) in ieee80211_add_rx_radiotap_header()
387 if (status->flag & (RX_FLAG_FAILED_FCS_CRC | RX_FLAG_FAILED_PLCP_CRC)) in ieee80211_add_rx_radiotap_header()
389 if (status->enc_flags & RX_ENC_FLAG_SHORTPRE) in ieee80211_add_rx_radiotap_header()
394 if (!rate || status->encoding != RX_ENC_LEGACY) { in ieee80211_add_rx_radiotap_header()
404 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_RATE)); in ieee80211_add_rx_radiotap_header()
405 if (status->bw == RATE_INFO_BW_10) in ieee80211_add_rx_radiotap_header()
407 else if (status->bw == RATE_INFO_BW_5) in ieee80211_add_rx_radiotap_header()
409 *pos = DIV_ROUND_UP(rate->bitrate, 5 * (1 << shift)); in ieee80211_add_rx_radiotap_header()
415 put_unaligned_le16(status->freq, pos); in ieee80211_add_rx_radiotap_header()
417 if (status->bw == RATE_INFO_BW_10) in ieee80211_add_rx_radiotap_header()
419 else if (status->bw == RATE_INFO_BW_5) in ieee80211_add_rx_radiotap_header()
422 if (status->band == NL80211_BAND_5GHZ || in ieee80211_add_rx_radiotap_header()
423 status->band == NL80211_BAND_6GHZ) in ieee80211_add_rx_radiotap_header()
425 else if (status->encoding != RX_ENC_LEGACY) in ieee80211_add_rx_radiotap_header()
427 else if (rate && rate->flags & IEEE80211_RATE_ERP_G) in ieee80211_add_rx_radiotap_header()
437 if (ieee80211_hw_check(&local->hw, SIGNAL_DBM) && in ieee80211_add_rx_radiotap_header()
438 !(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { in ieee80211_add_rx_radiotap_header()
439 *pos = status->signal; in ieee80211_add_rx_radiotap_header()
440 rthdr->it_present |= in ieee80211_add_rx_radiotap_header()
447 if (!status->chains) { in ieee80211_add_rx_radiotap_header()
449 *pos = status->antenna; in ieee80211_add_rx_radiotap_header()
457 if ((pos - (u8 *)rthdr) & 1) in ieee80211_add_rx_radiotap_header()
459 if (status->flag & RX_FLAG_FAILED_PLCP_CRC) in ieee80211_add_rx_radiotap_header()
464 if (status->encoding == RX_ENC_HT) { in ieee80211_add_rx_radiotap_header()
467 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_MCS)); in ieee80211_add_rx_radiotap_header()
468 *pos++ = local->hw.radiotap_mcs_details; in ieee80211_add_rx_radiotap_header()
470 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) in ieee80211_add_rx_radiotap_header()
472 if (status->bw == RATE_INFO_BW_40) in ieee80211_add_rx_radiotap_header()
474 if (status->enc_flags & RX_ENC_FLAG_HT_GF) in ieee80211_add_rx_radiotap_header()
476 if (status->enc_flags & RX_ENC_FLAG_LDPC) in ieee80211_add_rx_radiotap_header()
478 stbc = (status->enc_flags & RX_ENC_FLAG_STBC_MASK) >> RX_ENC_FLAG_STBC_SHIFT; in ieee80211_add_rx_radiotap_header()
481 *pos++ = status->rate_idx; in ieee80211_add_rx_radiotap_header()
484 if (status->flag & RX_FLAG_AMPDU_DETAILS) { in ieee80211_add_rx_radiotap_header()
488 while ((pos - (u8 *)rthdr) & 3) in ieee80211_add_rx_radiotap_header()
490 rthdr->it_present |= in ieee80211_add_rx_radiotap_header()
492 put_unaligned_le32(status->ampdu_reference, pos); in ieee80211_add_rx_radiotap_header()
494 if (status->flag & RX_FLAG_AMPDU_LAST_KNOWN) in ieee80211_add_rx_radiotap_header()
496 if (status->flag & RX_FLAG_AMPDU_IS_LAST) in ieee80211_add_rx_radiotap_header()
498 if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_ERROR) in ieee80211_add_rx_radiotap_header()
500 if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_KNOWN) in ieee80211_add_rx_radiotap_header()
502 if (status->flag & RX_FLAG_AMPDU_EOF_BIT_KNOWN) in ieee80211_add_rx_radiotap_header()
504 if (status->flag & RX_FLAG_AMPDU_EOF_BIT) in ieee80211_add_rx_radiotap_header()
508 if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_KNOWN) in ieee80211_add_rx_radiotap_header()
509 *pos++ = status->ampdu_delimiter_crc; in ieee80211_add_rx_radiotap_header()
515 if (status->encoding == RX_ENC_VHT) { in ieee80211_add_rx_radiotap_header()
516 u16 known = local->hw.radiotap_vht_details; in ieee80211_add_rx_radiotap_header()
518 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_VHT)); in ieee80211_add_rx_radiotap_header()
522 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) in ieee80211_add_rx_radiotap_header()
525 if (status->enc_flags & RX_ENC_FLAG_STBC_MASK) in ieee80211_add_rx_radiotap_header()
527 if (status->enc_flags & RX_ENC_FLAG_BF) in ieee80211_add_rx_radiotap_header()
531 switch (status->bw) { in ieee80211_add_rx_radiotap_header()
545 *pos = (status->rate_idx << 4) | status->nss; in ieee80211_add_rx_radiotap_header()
548 if (status->enc_flags & RX_ENC_FLAG_LDPC) in ieee80211_add_rx_radiotap_header()
557 if (local->hw.radiotap_timestamp.units_pos >= 0) { in ieee80211_add_rx_radiotap_header()
561 rthdr->it_present |= in ieee80211_add_rx_radiotap_header()
565 while ((pos - (u8 *)rthdr) & 7) in ieee80211_add_rx_radiotap_header()
568 put_unaligned_le64(status->device_timestamp, pos); in ieee80211_add_rx_radiotap_header()
571 if (local->hw.radiotap_timestamp.accuracy >= 0) { in ieee80211_add_rx_radiotap_header()
572 accuracy = local->hw.radiotap_timestamp.accuracy; in ieee80211_add_rx_radiotap_header()
578 *pos++ = local->hw.radiotap_timestamp.units_pos; in ieee80211_add_rx_radiotap_header()
582 if (status->encoding == RX_ENC_HE && in ieee80211_add_rx_radiotap_header()
583 status->flag & RX_FLAG_RADIOTAP_HE) { in ieee80211_add_rx_radiotap_header()
586 if (status->enc_flags & RX_ENC_FLAG_STBC_MASK) { in ieee80211_add_rx_radiotap_header()
589 status->enc_flags)); in ieee80211_add_rx_radiotap_header()
592 he.data6 |= HE_PREP(DATA6_NSTS, status->nss); in ieee80211_add_rx_radiotap_header()
603 he.data3 |= HE_PREP(DATA3_DATA_MCS, status->rate_idx); in ieee80211_add_rx_radiotap_header()
604 he.data3 |= HE_PREP(DATA3_DATA_DCM, status->he_dcm); in ieee80211_add_rx_radiotap_header()
606 !!(status->enc_flags & RX_ENC_FLAG_LDPC)); in ieee80211_add_rx_radiotap_header()
608 he.data5 |= HE_PREP(DATA5_GI, status->he_gi); in ieee80211_add_rx_radiotap_header()
610 switch (status->bw) { in ieee80211_add_rx_radiotap_header()
641 status->he_ru + 4); in ieee80211_add_rx_radiotap_header()
644 WARN_ONCE(1, "Invalid SU BW %d\n", status->bw); in ieee80211_add_rx_radiotap_header()
648 while ((pos - (u8 *)rthdr) & 1) in ieee80211_add_rx_radiotap_header()
650 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_HE)); in ieee80211_add_rx_radiotap_header()
655 if (status->encoding == RX_ENC_HE && in ieee80211_add_rx_radiotap_header()
656 status->flag & RX_FLAG_RADIOTAP_HE_MU) { in ieee80211_add_rx_radiotap_header()
658 while ((pos - (u8 *)rthdr) & 1) in ieee80211_add_rx_radiotap_header()
660 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_HE_MU)); in ieee80211_add_rx_radiotap_header()
665 if (status->flag & RX_FLAG_NO_PSDU) { in ieee80211_add_rx_radiotap_header()
666 rthdr->it_present |= in ieee80211_add_rx_radiotap_header()
668 *pos++ = status->zero_length_psdu_type; in ieee80211_add_rx_radiotap_header()
671 if (status->flag & RX_FLAG_RADIOTAP_LSIG) { in ieee80211_add_rx_radiotap_header()
673 while ((pos - (u8 *)rthdr) & 1) in ieee80211_add_rx_radiotap_header()
675 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_LSIG)); in ieee80211_add_rx_radiotap_header()
681 *pos++ = status->chain_signal[chain]; in ieee80211_add_rx_radiotap_header()
685 if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) { in ieee80211_add_rx_radiotap_header()
687 if ((pos - (u8 *)rthdr) & 1) in ieee80211_add_rx_radiotap_header()
696 while ((pos - (u8 *)rthdr) & (rtap.align - 1)) in ieee80211_add_rx_radiotap_header()
714 needed_headroom = rt_hdrlen - rtap_space; in ieee80211_make_monitor_skb()
749 skb->ip_summed = CHECKSUM_UNNECESSARY; in ieee80211_make_monitor_skb()
750 skb->pkt_type = PACKET_OTHERHOST; in ieee80211_make_monitor_skb()
751 skb->protocol = htons(ETH_P_802_2); in ieee80211_make_monitor_skb()
758 * returns a cleaned-up SKB that no longer includes the FCS nor the
771 rcu_dereference(local->monitor_sdata); in ieee80211_rx_monitor()
775 if (status->flag & RX_FLAG_RADIOTAP_HE) in ieee80211_rx_monitor()
778 if (status->flag & RX_FLAG_RADIOTAP_HE_MU) in ieee80211_rx_monitor()
781 if (status->flag & RX_FLAG_RADIOTAP_LSIG) in ieee80211_rx_monitor()
784 if (unlikely(status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA)) { in ieee80211_rx_monitor()
786 (void *)(origskb->data + rtap_space); in ieee80211_rx_monitor()
788 rtap_space += sizeof(*rtap) + rtap->len + rtap->pad; in ieee80211_rx_monitor()
802 if (!(status->flag & RX_FLAG_NO_PSDU)) { in ieee80211_rx_monitor()
803 if (ieee80211_hw_check(&local->hw, RX_INCLUDES_FCS)) { in ieee80211_rx_monitor()
804 if (unlikely(origskb->len <= FCS_LEN + rtap_space)) { in ieee80211_rx_monitor()
813 /* also consider the hdr->frame_control */ in ieee80211_rx_monitor()
825 if (!local->monitors || (status->flag & RX_FLAG_SKIP_MONITOR)) { in ieee80211_rx_monitor()
837 list_for_each_entry_rcu(sdata, &local->mon_list, u.mntr.list) { in ieee80211_rx_monitor()
838 bool last_monitor = list_is_last(&sdata->u.mntr.list, in ieee80211_rx_monitor()
839 &local->mon_list); in ieee80211_rx_monitor()
858 skb->dev = sdata->dev; in ieee80211_rx_monitor()
859 dev_sw_netstats_rx_add(skb->dev, skb->len); in ieee80211_rx_monitor()
880 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_parse_qos()
881 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_parse_qos()
885 if (ieee80211_is_data_qos(hdr->frame_control)) { in ieee80211_parse_qos()
890 status->rx_flags |= IEEE80211_RX_AMSDU; in ieee80211_parse_qos()
896 * IEEE 802.11-2007, 7.1.3.4.1 ("Sequence Number field"): in ieee80211_parse_qos()
900 * Address 1 field, and all non-QoS data frames sent in ieee80211_parse_qos()
902 * modulo-4096 counter, [...] in ieee80211_parse_qos()
904 * We also use that counter for non-QoS STAs. in ieee80211_parse_qos()
908 if (ieee80211_is_mgmt(hdr->frame_control)) in ieee80211_parse_qos()
913 rx->seqno_idx = seqno_idx; in ieee80211_parse_qos()
914 rx->security_idx = security_idx; in ieee80211_parse_qos()
915 /* Set skb->priority to 1d tag if highest order bit of TID is not set. in ieee80211_parse_qos()
916 * For now, set skb->priority to 0 for other cases. */ in ieee80211_parse_qos()
917 rx->skb->priority = (tid > 7) ? 0 : tid; in ieee80211_parse_qos()
923 * Drivers always need to pass packets that are aligned to two-byte boundaries
927 * guarantees that the contained IP header is aligned to a four-byte
929 * payload to a four-byte boundary (because either the IP header is directly
935 * With A-MSDU frames, however, the payload data address must yield two modulo
936 * four because there are 14-byte 802.3 headers within the A-MSDU frames that
938 * specs were sane enough this time around to require padding each A-MSDU
948 WARN_ON_ONCE((unsigned long)rx->skb->data & 1); in ieee80211_verify_alignment()
957 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_is_unicast_robust_mgmt_frame()
959 if (is_multicast_ether_addr(hdr->addr1)) in ieee80211_is_unicast_robust_mgmt_frame()
968 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_is_multicast_robust_mgmt_frame()
970 if (!is_multicast_ether_addr(hdr->addr1)) in ieee80211_is_multicast_robust_mgmt_frame()
977 /* Get the BIP key index from MMIE; return -1 if this is not a BIP frame */
980 struct ieee80211_mgmt *hdr = (struct ieee80211_mgmt *) skb->data; in ieee80211_get_mmie_keyidx()
984 if (skb->len < 24 + sizeof(*mmie) || !is_multicast_ether_addr(hdr->da)) in ieee80211_get_mmie_keyidx()
985 return -1; in ieee80211_get_mmie_keyidx()
988 !ieee80211_is_beacon(hdr->frame_control)) in ieee80211_get_mmie_keyidx()
989 return -1; /* not a robust management frame */ in ieee80211_get_mmie_keyidx()
992 (skb->data + skb->len - sizeof(*mmie)); in ieee80211_get_mmie_keyidx()
993 if (mmie->element_id == WLAN_EID_MMIE && in ieee80211_get_mmie_keyidx()
994 mmie->length == sizeof(*mmie) - 2) in ieee80211_get_mmie_keyidx()
995 return le16_to_cpu(mmie->key_id); in ieee80211_get_mmie_keyidx()
998 (skb->data + skb->len - sizeof(*mmie16)); in ieee80211_get_mmie_keyidx()
999 if (skb->len >= 24 + sizeof(*mmie16) && in ieee80211_get_mmie_keyidx()
1000 mmie16->element_id == WLAN_EID_MMIE && in ieee80211_get_mmie_keyidx()
1001 mmie16->length == sizeof(*mmie16) - 2) in ieee80211_get_mmie_keyidx()
1002 return le16_to_cpu(mmie16->key_id); in ieee80211_get_mmie_keyidx()
1004 return -1; in ieee80211_get_mmie_keyidx()
1008 const struct ieee80211_cipher_scheme *cs) in ieee80211_get_keyid() argument
1010 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_get_keyid()
1018 fc = hdr->frame_control; in ieee80211_get_keyid()
1021 if (cs) { in ieee80211_get_keyid()
1022 minlen = hdrlen + cs->hdr_len; in ieee80211_get_keyid()
1023 key_idx_off = hdrlen + cs->key_idx_off; in ieee80211_get_keyid()
1024 key_idx_shift = cs->key_idx_shift; in ieee80211_get_keyid()
1032 if (unlikely(skb->len < minlen)) in ieee80211_get_keyid()
1033 return -EINVAL; in ieee80211_get_keyid()
1037 if (cs) in ieee80211_get_keyid()
1038 keyid &= cs->key_idx_mask; in ieee80211_get_keyid()
1041 /* cs could use more than the usual two bits for the keyid */ in ieee80211_get_keyid()
1043 return -EINVAL; in ieee80211_get_keyid()
1050 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_mesh_check()
1051 char *dev_addr = rx->sdata->vif.addr; in ieee80211_rx_mesh_check()
1053 if (ieee80211_is_data(hdr->frame_control)) { in ieee80211_rx_mesh_check()
1054 if (is_multicast_ether_addr(hdr->addr1)) { in ieee80211_rx_mesh_check()
1055 if (ieee80211_has_tods(hdr->frame_control) || in ieee80211_rx_mesh_check()
1056 !ieee80211_has_fromds(hdr->frame_control)) in ieee80211_rx_mesh_check()
1058 if (ether_addr_equal(hdr->addr3, dev_addr)) in ieee80211_rx_mesh_check()
1061 if (!ieee80211_has_a4(hdr->frame_control)) in ieee80211_rx_mesh_check()
1063 if (ether_addr_equal(hdr->addr4, dev_addr)) in ieee80211_rx_mesh_check()
1072 if (!rx->sta || sta_plink_state(rx->sta) != NL80211_PLINK_ESTAB) { in ieee80211_rx_mesh_check()
1075 if (!ieee80211_is_mgmt(hdr->frame_control)) in ieee80211_rx_mesh_check()
1078 if (ieee80211_is_action(hdr->frame_control)) { in ieee80211_rx_mesh_check()
1082 if (rx->skb->len < IEEE80211_MIN_ACTION_SIZE) in ieee80211_rx_mesh_check()
1086 category = mgmt->u.action.category; in ieee80211_rx_mesh_check()
1093 if (ieee80211_is_probe_req(hdr->frame_control) || in ieee80211_rx_mesh_check()
1094 ieee80211_is_probe_resp(hdr->frame_control) || in ieee80211_rx_mesh_check()
1095 ieee80211_is_beacon(hdr->frame_control) || in ieee80211_rx_mesh_check()
1096 ieee80211_is_auth(hdr->frame_control)) in ieee80211_rx_mesh_check()
1108 struct sk_buff_head *frames = &tid_agg_rx->reorder_buf[index]; in ieee80211_rx_reorder_ready()
1112 if (tid_agg_rx->reorder_buf_filtered & BIT_ULL(index)) in ieee80211_rx_reorder_ready()
1119 if (status->flag & RX_FLAG_AMSDU_MORE) in ieee80211_rx_reorder_ready()
1130 struct sk_buff_head *skb_list = &tid_agg_rx->reorder_buf[index]; in ieee80211_release_reorder_frame()
1134 lockdep_assert_held(&tid_agg_rx->reorder_lock); in ieee80211_release_reorder_frame()
1145 tid_agg_rx->stored_mpdu_num--; in ieee80211_release_reorder_frame()
1148 status->rx_flags |= IEEE80211_RX_DEFERRED_RELEASE; in ieee80211_release_reorder_frame()
1153 tid_agg_rx->reorder_buf_filtered &= ~BIT_ULL(index); in ieee80211_release_reorder_frame()
1154 tid_agg_rx->head_seq_num = ieee80211_sn_inc(tid_agg_rx->head_seq_num); in ieee80211_release_reorder_frame()
1164 lockdep_assert_held(&tid_agg_rx->reorder_lock); in ieee80211_release_reorder_frames()
1166 while (ieee80211_sn_less(tid_agg_rx->head_seq_num, head_seq_num)) { in ieee80211_release_reorder_frames()
1167 index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; in ieee80211_release_reorder_frames()
1180 * Callers must hold tid_agg_rx->reorder_lock.
1190 lockdep_assert_held(&tid_agg_rx->reorder_lock); in ieee80211_sta_reorder_release()
1193 index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; in ieee80211_sta_reorder_release()
1195 tid_agg_rx->stored_mpdu_num) { in ieee80211_sta_reorder_release()
1201 for (j = (index + 1) % tid_agg_rx->buf_size; j != index; in ieee80211_sta_reorder_release()
1202 j = (j + 1) % tid_agg_rx->buf_size) { in ieee80211_sta_reorder_release()
1208 !time_after(jiffies, tid_agg_rx->reorder_time[j] + in ieee80211_sta_reorder_release()
1212 /* don't leave incomplete A-MSDUs around */ in ieee80211_sta_reorder_release()
1213 for (i = (index + 1) % tid_agg_rx->buf_size; i != j; in ieee80211_sta_reorder_release()
1214 i = (i + 1) % tid_agg_rx->buf_size) in ieee80211_sta_reorder_release()
1215 __skb_queue_purge(&tid_agg_rx->reorder_buf[i]); in ieee80211_sta_reorder_release()
1225 tid_agg_rx->head_seq_num = in ieee80211_sta_reorder_release()
1226 (tid_agg_rx->head_seq_num + in ieee80211_sta_reorder_release()
1233 index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; in ieee80211_sta_reorder_release()
1236 if (tid_agg_rx->stored_mpdu_num) { in ieee80211_sta_reorder_release()
1237 j = index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; in ieee80211_sta_reorder_release()
1239 for (; j != (index - 1) % tid_agg_rx->buf_size; in ieee80211_sta_reorder_release()
1240 j = (j + 1) % tid_agg_rx->buf_size) { in ieee80211_sta_reorder_release()
1247 if (!tid_agg_rx->removed) in ieee80211_sta_reorder_release()
1248 mod_timer(&tid_agg_rx->reorder_timer, in ieee80211_sta_reorder_release()
1249 tid_agg_rx->reorder_time[j] + 1 + in ieee80211_sta_reorder_release()
1252 del_timer(&tid_agg_rx->reorder_timer); in ieee80211_sta_reorder_release()
1266 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_sta_manage_reorder_buf()
1268 u16 sc = le16_to_cpu(hdr->seq_ctrl); in ieee80211_sta_manage_reorder_buf()
1274 spin_lock(&tid_agg_rx->reorder_lock); in ieee80211_sta_manage_reorder_buf()
1280 if (unlikely(tid_agg_rx->auto_seq)) { in ieee80211_sta_manage_reorder_buf()
1281 tid_agg_rx->auto_seq = false; in ieee80211_sta_manage_reorder_buf()
1282 tid_agg_rx->ssn = mpdu_seq_num; in ieee80211_sta_manage_reorder_buf()
1283 tid_agg_rx->head_seq_num = mpdu_seq_num; in ieee80211_sta_manage_reorder_buf()
1286 buf_size = tid_agg_rx->buf_size; in ieee80211_sta_manage_reorder_buf()
1287 head_seq_num = tid_agg_rx->head_seq_num; in ieee80211_sta_manage_reorder_buf()
1293 if (unlikely(!tid_agg_rx->started)) { in ieee80211_sta_manage_reorder_buf()
1298 tid_agg_rx->started = true; in ieee80211_sta_manage_reorder_buf()
1321 index = mpdu_seq_num % tid_agg_rx->buf_size; in ieee80211_sta_manage_reorder_buf()
1335 if (mpdu_seq_num == tid_agg_rx->head_seq_num && in ieee80211_sta_manage_reorder_buf()
1336 tid_agg_rx->stored_mpdu_num == 0) { in ieee80211_sta_manage_reorder_buf()
1337 if (!(status->flag & RX_FLAG_AMSDU_MORE)) in ieee80211_sta_manage_reorder_buf()
1338 tid_agg_rx->head_seq_num = in ieee80211_sta_manage_reorder_buf()
1339 ieee80211_sn_inc(tid_agg_rx->head_seq_num); in ieee80211_sta_manage_reorder_buf()
1345 __skb_queue_tail(&tid_agg_rx->reorder_buf[index], skb); in ieee80211_sta_manage_reorder_buf()
1346 if (!(status->flag & RX_FLAG_AMSDU_MORE)) { in ieee80211_sta_manage_reorder_buf()
1347 tid_agg_rx->reorder_time[index] = jiffies; in ieee80211_sta_manage_reorder_buf()
1348 tid_agg_rx->stored_mpdu_num++; in ieee80211_sta_manage_reorder_buf()
1353 spin_unlock(&tid_agg_rx->reorder_lock); in ieee80211_sta_manage_reorder_buf()
1358 * Reorder MPDUs from A-MPDUs, keeping them on a buffer. Returns
1364 struct sk_buff *skb = rx->skb; in ieee80211_rx_reorder_ampdu()
1365 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_rx_reorder_ampdu()
1366 struct sta_info *sta = rx->sta; in ieee80211_rx_reorder_ampdu()
1371 if (!ieee80211_is_data_qos(hdr->frame_control) || in ieee80211_rx_reorder_ampdu()
1372 is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_reorder_ampdu()
1387 tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); in ieee80211_rx_reorder_ampdu()
1390 !test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && in ieee80211_rx_reorder_ampdu()
1391 !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) in ieee80211_rx_reorder_ampdu()
1392 ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, in ieee80211_rx_reorder_ampdu()
1399 if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC))) in ieee80211_rx_reorder_ampdu()
1407 /* new, potentially un-ordered, ampdu frame - process it */ in ieee80211_rx_reorder_ampdu()
1410 if (tid_agg_rx->timeout) in ieee80211_rx_reorder_ampdu()
1411 tid_agg_rx->last_rx = jiffies; in ieee80211_rx_reorder_ampdu()
1413 /* if this mpdu is fragmented - terminate rx aggregation session */ in ieee80211_rx_reorder_ampdu()
1414 sc = le16_to_cpu(hdr->seq_ctrl); in ieee80211_rx_reorder_ampdu()
1416 ieee80211_queue_skb_to_iface(rx->sdata, NULL, skb); in ieee80211_rx_reorder_ampdu()
1421 * No locking needed -- we will only ever process one in ieee80211_rx_reorder_ampdu()
1427 if (ieee80211_sta_manage_reorder_buf(rx->sdata, tid_agg_rx, skb, in ieee80211_rx_reorder_ampdu()
1438 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_check_dup()
1439 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_check_dup()
1441 if (status->flag & RX_FLAG_DUP_VALIDATED) in ieee80211_rx_h_check_dup()
1446 * (IEEE 802.11-2012: 9.3.2.10 "Duplicate detection and recovery") in ieee80211_rx_h_check_dup()
1449 if (rx->skb->len < 24) in ieee80211_rx_h_check_dup()
1452 if (ieee80211_is_ctl(hdr->frame_control) || in ieee80211_rx_h_check_dup()
1453 ieee80211_is_any_nullfunc(hdr->frame_control) || in ieee80211_rx_h_check_dup()
1454 is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_check_dup()
1457 if (!rx->sta) in ieee80211_rx_h_check_dup()
1460 if (unlikely(ieee80211_has_retry(hdr->frame_control) && in ieee80211_rx_h_check_dup()
1461 rx->sta->last_seq_ctrl[rx->seqno_idx] == hdr->seq_ctrl)) { in ieee80211_rx_h_check_dup()
1462 I802_DEBUG_INC(rx->local->dot11FrameDuplicateCount); in ieee80211_rx_h_check_dup()
1463 rx->sta->rx_stats.num_duplicates++; in ieee80211_rx_h_check_dup()
1465 } else if (!(status->flag & RX_FLAG_AMSDU_MORE)) { in ieee80211_rx_h_check_dup()
1466 rx->sta->last_seq_ctrl[rx->seqno_idx] = hdr->seq_ctrl; in ieee80211_rx_h_check_dup()
1475 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_check()
1477 /* Drop disallowed frame classes based on STA auth/assoc state; in ieee80211_rx_h_check()
1483 * responsible for filtering on both auth and assoc states. in ieee80211_rx_h_check()
1486 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) in ieee80211_rx_h_check()
1489 if (unlikely((ieee80211_is_data(hdr->frame_control) || in ieee80211_rx_h_check()
1490 ieee80211_is_pspoll(hdr->frame_control)) && in ieee80211_rx_h_check()
1491 rx->sdata->vif.type != NL80211_IFTYPE_ADHOC && in ieee80211_rx_h_check()
1492 rx->sdata->vif.type != NL80211_IFTYPE_OCB && in ieee80211_rx_h_check()
1493 (!rx->sta || !test_sta_flag(rx->sta, WLAN_STA_ASSOC)))) { in ieee80211_rx_h_check()
1496 * yet marked ASSOC to prevent a race where we don't set the in ieee80211_rx_h_check()
1497 * assoc bit quickly enough before it sends the first frame in ieee80211_rx_h_check()
1499 if (rx->sta && rx->sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_rx_h_check()
1500 ieee80211_is_data_present(hdr->frame_control)) { in ieee80211_rx_h_check()
1504 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_rx_h_check()
1506 if (rx->skb->len < hdrlen + 8) in ieee80211_rx_h_check()
1509 skb_copy_bits(rx->skb, hdrlen + 6, ðertype, 2); in ieee80211_rx_h_check()
1510 if (ethertype == rx->sdata->control_port_protocol) in ieee80211_rx_h_check()
1514 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && in ieee80211_rx_h_check()
1515 cfg80211_rx_spurious_frame(rx->sdata->dev, in ieee80211_rx_h_check()
1516 hdr->addr2, in ieee80211_rx_h_check()
1534 local = rx->local; in ieee80211_rx_h_check_more_data()
1535 skb = rx->skb; in ieee80211_rx_h_check_more_data()
1536 hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_rx_h_check_more_data()
1538 if (!local->pspolling) in ieee80211_rx_h_check_more_data()
1541 if (!ieee80211_has_fromds(hdr->frame_control)) in ieee80211_rx_h_check_more_data()
1545 if (!ieee80211_is_data(hdr->frame_control)) in ieee80211_rx_h_check_more_data()
1548 if (!ieee80211_has_moredata(hdr->frame_control)) { in ieee80211_rx_h_check_more_data()
1550 local->pspolling = false; in ieee80211_rx_h_check_more_data()
1555 ieee80211_send_pspoll(local, rx->sdata); in ieee80211_rx_h_check_more_data()
1562 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_ps_start()
1563 struct ieee80211_local *local = sdata->local; in sta_ps_start()
1567 if (sta->sdata->vif.type == NL80211_IFTYPE_AP || in sta_ps_start()
1568 sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in sta_ps_start()
1569 ps = &sdata->bss->ps; in sta_ps_start()
1573 atomic_inc(&ps->num_sta_ps); in sta_ps_start()
1575 if (!ieee80211_hw_check(&local->hw, AP_LINK_PS)) in sta_ps_start()
1576 drv_sta_notify(local, sdata, STA_NOTIFY_SLEEP, &sta->sta); in sta_ps_start()
1578 sta->sta.addr, sta->sta.aid); in sta_ps_start()
1582 if (!sta->sta.txq[0]) in sta_ps_start()
1586 struct ieee80211_txq *txq = sta->sta.txq[tid]; in sta_ps_start()
1588 ieee80211_unschedule_txq(&local->hw, txq, false); in sta_ps_start()
1591 set_bit(tid, &sta->txq_buffered_tids); in sta_ps_start()
1593 clear_bit(tid, &sta->txq_buffered_tids); in sta_ps_start()
1599 ps_dbg(sta->sdata, "STA %pM aid %d exits power save mode\n", in sta_ps_end()
1600 sta->sta.addr, sta->sta.aid); in sta_ps_end()
1610 ps_dbg(sta->sdata, "STA %pM aid %d driver-ps-blocked\n", in sta_ps_end()
1611 sta->sta.addr, sta->sta.aid); in sta_ps_end()
1625 WARN_ON(!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS)); in ieee80211_sta_ps_transition()
1630 return -EINVAL; in ieee80211_sta_ps_transition()
1661 * If this AC is not trigger-enabled do nothing unless the in ieee80211_sta_uapsd_trigger()
1664 * NB: This could/should check a separate bitmap of trigger- in ieee80211_sta_uapsd_trigger()
1668 if (!(sta->sta.uapsd_queues & ieee80211_ac_to_qos_mask[ac]) && in ieee80211_sta_uapsd_trigger()
1686 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_uapsd_and_pspoll()
1687 struct ieee80211_hdr *hdr = (void *)rx->skb->data; in ieee80211_rx_h_uapsd_and_pspoll()
1688 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_uapsd_and_pspoll()
1690 if (!rx->sta) in ieee80211_rx_h_uapsd_and_pspoll()
1693 if (sdata->vif.type != NL80211_IFTYPE_AP && in ieee80211_rx_h_uapsd_and_pspoll()
1694 sdata->vif.type != NL80211_IFTYPE_AP_VLAN) in ieee80211_rx_h_uapsd_and_pspoll()
1699 * uAPSD and PS-Poll frames (the latter shouldn't even come up from in ieee80211_rx_h_uapsd_and_pspoll()
1702 if (ieee80211_hw_check(&sdata->local->hw, AP_LINK_PS)) in ieee80211_rx_h_uapsd_and_pspoll()
1708 * in the PS-Poll case the station must be confused ... in ieee80211_rx_h_uapsd_and_pspoll()
1710 if (!test_sta_flag(rx->sta, WLAN_STA_PS_STA)) in ieee80211_rx_h_uapsd_and_pspoll()
1713 if (unlikely(ieee80211_is_pspoll(hdr->frame_control))) { in ieee80211_rx_h_uapsd_and_pspoll()
1714 ieee80211_sta_pspoll(&rx->sta->sta); in ieee80211_rx_h_uapsd_and_pspoll()
1718 dev_kfree_skb(rx->skb); in ieee80211_rx_h_uapsd_and_pspoll()
1721 } else if (!ieee80211_has_morefrags(hdr->frame_control) && in ieee80211_rx_h_uapsd_and_pspoll()
1722 !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && in ieee80211_rx_h_uapsd_and_pspoll()
1723 ieee80211_has_pm(hdr->frame_control) && in ieee80211_rx_h_uapsd_and_pspoll()
1724 (ieee80211_is_data_qos(hdr->frame_control) || in ieee80211_rx_h_uapsd_and_pspoll()
1725 ieee80211_is_qos_nullfunc(hdr->frame_control))) { in ieee80211_rx_h_uapsd_and_pspoll()
1728 ieee80211_sta_uapsd_trigger(&rx->sta->sta, tid); in ieee80211_rx_h_uapsd_and_pspoll()
1737 struct sta_info *sta = rx->sta; in ieee80211_rx_h_sta_process()
1738 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_sta_process()
1740 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_rx_h_sta_process()
1754 if (rx->sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_rx_h_sta_process()
1755 u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len, in ieee80211_rx_h_sta_process()
1757 if (ether_addr_equal(bssid, rx->sdata->u.ibss.bssid) && in ieee80211_rx_h_sta_process()
1759 sta->rx_stats.last_rx = jiffies; in ieee80211_rx_h_sta_process()
1760 if (ieee80211_is_data(hdr->frame_control) && in ieee80211_rx_h_sta_process()
1761 !is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_sta_process()
1762 sta->rx_stats.last_rate = in ieee80211_rx_h_sta_process()
1765 } else if (rx->sdata->vif.type == NL80211_IFTYPE_OCB) { in ieee80211_rx_h_sta_process()
1766 sta->rx_stats.last_rx = jiffies; in ieee80211_rx_h_sta_process()
1767 } else if (!ieee80211_is_s1g_beacon(hdr->frame_control) && in ieee80211_rx_h_sta_process()
1768 !is_multicast_ether_addr(hdr->addr1)) { in ieee80211_rx_h_sta_process()
1773 sta->rx_stats.last_rx = jiffies; in ieee80211_rx_h_sta_process()
1774 if (ieee80211_is_data(hdr->frame_control)) in ieee80211_rx_h_sta_process()
1775 sta->rx_stats.last_rate = sta_stats_encode_rate(status); in ieee80211_rx_h_sta_process()
1778 sta->rx_stats.fragments++; in ieee80211_rx_h_sta_process()
1780 u64_stats_update_begin(&rx->sta->rx_stats.syncp); in ieee80211_rx_h_sta_process()
1781 sta->rx_stats.bytes += rx->skb->len; in ieee80211_rx_h_sta_process()
1782 u64_stats_update_end(&rx->sta->rx_stats.syncp); in ieee80211_rx_h_sta_process()
1784 if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { in ieee80211_rx_h_sta_process()
1785 sta->rx_stats.last_signal = status->signal; in ieee80211_rx_h_sta_process()
1786 ewma_signal_add(&sta->rx_stats_avg.signal, -status->signal); in ieee80211_rx_h_sta_process()
1789 if (status->chains) { in ieee80211_rx_h_sta_process()
1790 sta->rx_stats.chains = status->chains; in ieee80211_rx_h_sta_process()
1791 for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) { in ieee80211_rx_h_sta_process()
1792 int signal = status->chain_signal[i]; in ieee80211_rx_h_sta_process()
1794 if (!(status->chains & BIT(i))) in ieee80211_rx_h_sta_process()
1797 sta->rx_stats.chain_signal_last[i] = signal; in ieee80211_rx_h_sta_process()
1798 ewma_signal_add(&sta->rx_stats_avg.chain_signal[i], in ieee80211_rx_h_sta_process()
1799 -signal); in ieee80211_rx_h_sta_process()
1803 if (ieee80211_is_s1g_beacon(hdr->frame_control)) in ieee80211_rx_h_sta_process()
1809 * frame as specified in IEEE 802.11-2016 11.2.3.2 in ieee80211_rx_h_sta_process()
1811 if (!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS) && in ieee80211_rx_h_sta_process()
1812 !ieee80211_has_morefrags(hdr->frame_control) && in ieee80211_rx_h_sta_process()
1813 !is_multicast_ether_addr(hdr->addr1) && in ieee80211_rx_h_sta_process()
1814 (ieee80211_is_mgmt(hdr->frame_control) || in ieee80211_rx_h_sta_process()
1815 ieee80211_is_data(hdr->frame_control)) && in ieee80211_rx_h_sta_process()
1816 !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && in ieee80211_rx_h_sta_process()
1817 (rx->sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_rx_h_sta_process()
1818 rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) { in ieee80211_rx_h_sta_process()
1820 if (!ieee80211_has_pm(hdr->frame_control)) in ieee80211_rx_h_sta_process()
1823 if (ieee80211_has_pm(hdr->frame_control)) in ieee80211_rx_h_sta_process()
1829 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) in ieee80211_rx_h_sta_process()
1833 * Drop (qos-)data::nullfunc frames silently, since they in ieee80211_rx_h_sta_process()
1836 if (ieee80211_is_any_nullfunc(hdr->frame_control)) { in ieee80211_rx_h_sta_process()
1837 I802_DEBUG_INC(rx->local->rx_handlers_drop_nullfunc); in ieee80211_rx_h_sta_process()
1840 * If we receive a 4-addr nullfunc frame from a STA in ieee80211_rx_h_sta_process()
1841 * that was not moved to a 4-addr STA vlan yet send in ieee80211_rx_h_sta_process()
1845 if (ieee80211_has_a4(hdr->frame_control) && in ieee80211_rx_h_sta_process()
1846 (rx->sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_rx_h_sta_process()
1847 (rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_sta_process()
1848 !rx->sdata->u.vlan.sta))) { in ieee80211_rx_h_sta_process()
1851 rx->sdata->dev, sta->sta.addr, in ieee80211_rx_h_sta_process()
1859 sta->rx_stats.packets++; in ieee80211_rx_h_sta_process()
1860 dev_kfree_skb(rx->skb); in ieee80211_rx_h_sta_process()
1871 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_get_bigtk()
1887 idx2 = idx - 1; in ieee80211_rx_get_bigtk()
1890 if (rx->sta) in ieee80211_rx_get_bigtk()
1891 key = rcu_dereference(rx->sta->gtk[idx]); in ieee80211_rx_get_bigtk()
1893 key = rcu_dereference(sdata->keys[idx]); in ieee80211_rx_get_bigtk()
1894 if (!key && rx->sta) in ieee80211_rx_get_bigtk()
1895 key = rcu_dereference(rx->sta->gtk[idx2]); in ieee80211_rx_get_bigtk()
1897 key = rcu_dereference(sdata->keys[idx2]); in ieee80211_rx_get_bigtk()
1905 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_decrypt()
1907 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_rx_h_decrypt()
1912 int mmie_keyidx = -1; in ieee80211_rx_h_decrypt()
1914 const struct ieee80211_cipher_scheme *cs = NULL; in ieee80211_rx_h_decrypt() local
1916 if (ieee80211_is_ext(hdr->frame_control)) in ieee80211_rx_h_decrypt()
1923 * - GTK (group keys) in ieee80211_rx_h_decrypt()
1924 * - IGTK (group keys for management frames) in ieee80211_rx_h_decrypt()
1925 * - BIGTK (group keys for Beacon frames) in ieee80211_rx_h_decrypt()
1926 * - PTK (pairwise keys) in ieee80211_rx_h_decrypt()
1927 * - STK (station-to-station pairwise keys) in ieee80211_rx_h_decrypt()
1932 * BIGTKs. Unless, of course, actual WEP keys ("pre-RSNA") are used, in ieee80211_rx_h_decrypt()
1948 rx->key = NULL; in ieee80211_rx_h_decrypt()
1949 fc = hdr->frame_control; in ieee80211_rx_h_decrypt()
1951 if (rx->sta) { in ieee80211_rx_h_decrypt()
1952 int keyid = rx->sta->ptk_idx; in ieee80211_rx_h_decrypt()
1953 sta_ptk = rcu_dereference(rx->sta->ptk[keyid]); in ieee80211_rx_h_decrypt()
1956 cs = rx->sta->cipher_scheme; in ieee80211_rx_h_decrypt()
1957 keyid = ieee80211_get_keyid(rx->skb, cs); in ieee80211_rx_h_decrypt()
1962 ptk_idx = rcu_dereference(rx->sta->ptk[keyid]); in ieee80211_rx_h_decrypt()
1967 mmie_keyidx = ieee80211_get_mmie_keyidx(rx->skb); in ieee80211_rx_h_decrypt()
1969 if (!is_multicast_ether_addr(hdr->addr1) && sta_ptk) { in ieee80211_rx_h_decrypt()
1970 rx->key = ptk_idx ? ptk_idx : sta_ptk; in ieee80211_rx_h_decrypt()
1971 if ((status->flag & RX_FLAG_DECRYPTED) && in ieee80211_rx_h_decrypt()
1972 (status->flag & RX_FLAG_IV_STRIPPED)) in ieee80211_rx_h_decrypt()
1979 if ((status->flag & RX_FLAG_DECRYPTED) && in ieee80211_rx_h_decrypt()
1980 (status->flag & RX_FLAG_IV_STRIPPED)) in ieee80211_rx_h_decrypt()
1986 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_rx_h_decrypt()
1987 skb->data, in ieee80211_rx_h_decrypt()
1988 skb->len); in ieee80211_rx_h_decrypt()
1992 rx->key = ieee80211_rx_get_bigtk(rx, mmie_keyidx); in ieee80211_rx_h_decrypt()
1993 if (!rx->key) in ieee80211_rx_h_decrypt()
1997 if ((status->flag & RX_FLAG_DECRYPTED) && in ieee80211_rx_h_decrypt()
1998 (status->flag & RX_FLAG_IV_STRIPPED)) in ieee80211_rx_h_decrypt()
2004 if (rx->sta) { in ieee80211_rx_h_decrypt()
2006 test_sta_flag(rx->sta, WLAN_STA_MFP)) in ieee80211_rx_h_decrypt()
2009 rx->key = rcu_dereference(rx->sta->gtk[mmie_keyidx]); in ieee80211_rx_h_decrypt()
2011 if (!rx->key) in ieee80211_rx_h_decrypt()
2012 rx->key = rcu_dereference(rx->sdata->keys[mmie_keyidx]); in ieee80211_rx_h_decrypt()
2016 * need to set rx->key if there is a key that could have been in ieee80211_rx_h_decrypt()
2021 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_decrypt()
2025 key = ieee80211_rx_get_bigtk(rx, -1); in ieee80211_rx_h_decrypt()
2027 is_multicast_ether_addr(hdr->addr1)) { in ieee80211_rx_h_decrypt()
2028 key = rcu_dereference(rx->sdata->default_mgmt_key); in ieee80211_rx_h_decrypt()
2030 if (rx->sta) { in ieee80211_rx_h_decrypt()
2032 key = rcu_dereference(rx->sta->gtk[i]); in ieee80211_rx_h_decrypt()
2039 key = rcu_dereference(sdata->keys[i]); in ieee80211_rx_h_decrypt()
2046 rx->key = key; in ieee80211_rx_h_decrypt()
2058 if ((status->flag & RX_FLAG_DECRYPTED) && in ieee80211_rx_h_decrypt()
2059 (status->flag & RX_FLAG_IV_STRIPPED)) in ieee80211_rx_h_decrypt()
2062 keyidx = ieee80211_get_keyid(rx->skb, cs); in ieee80211_rx_h_decrypt()
2067 /* check per-station GTK first, if multicast packet */ in ieee80211_rx_h_decrypt()
2068 if (is_multicast_ether_addr(hdr->addr1) && rx->sta) in ieee80211_rx_h_decrypt()
2069 rx->key = rcu_dereference(rx->sta->gtk[keyidx]); in ieee80211_rx_h_decrypt()
2072 if (!rx->key) { in ieee80211_rx_h_decrypt()
2073 rx->key = rcu_dereference(rx->sdata->keys[keyidx]); in ieee80211_rx_h_decrypt()
2076 * RSNA-protected unicast frames should always be in ieee80211_rx_h_decrypt()
2077 * sent with pairwise or station-to-station keys, in ieee80211_rx_h_decrypt()
2080 if (rx->key && in ieee80211_rx_h_decrypt()
2081 rx->key->conf.cipher != WLAN_CIPHER_SUITE_WEP40 && in ieee80211_rx_h_decrypt()
2082 rx->key->conf.cipher != WLAN_CIPHER_SUITE_WEP104 && in ieee80211_rx_h_decrypt()
2083 !is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_decrypt()
2084 rx->key = NULL; in ieee80211_rx_h_decrypt()
2088 if (rx->key) { in ieee80211_rx_h_decrypt()
2089 if (unlikely(rx->key->flags & KEY_FLAG_TAINTED)) in ieee80211_rx_h_decrypt()
2097 switch (rx->key->conf.cipher) { in ieee80211_rx_h_decrypt()
2134 status->flag |= RX_FLAG_DECRYPTED; in ieee80211_rx_h_decrypt()
2137 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_rx_h_decrypt()
2138 skb->data, skb->len); in ieee80211_rx_h_decrypt()
2147 for (i = 0; i < ARRAY_SIZE(cache->entries); i++) in ieee80211_init_frag_cache()
2148 skb_queue_head_init(&cache->entries[i].skb_list); in ieee80211_init_frag_cache()
2155 for (i = 0; i < ARRAY_SIZE(cache->entries); i++) in ieee80211_destroy_frag_cache()
2156 __skb_queue_purge(&cache->entries[i].skb_list); in ieee80211_destroy_frag_cache()
2166 entry = &cache->entries[cache->next++]; in ieee80211_reassemble_add()
2167 if (cache->next >= IEEE80211_FRAGMENT_MAX) in ieee80211_reassemble_add()
2168 cache->next = 0; in ieee80211_reassemble_add()
2170 __skb_queue_purge(&entry->skb_list); in ieee80211_reassemble_add()
2172 __skb_queue_tail(&entry->skb_list, *skb); /* no need for locking */ in ieee80211_reassemble_add()
2174 entry->first_frag_time = jiffies; in ieee80211_reassemble_add()
2175 entry->seq = seq; in ieee80211_reassemble_add()
2176 entry->rx_queue = rx_queue; in ieee80211_reassemble_add()
2177 entry->last_frag = frag; in ieee80211_reassemble_add()
2178 entry->check_sequential_pn = false; in ieee80211_reassemble_add()
2179 entry->extra_len = 0; in ieee80211_reassemble_add()
2192 idx = cache->next; in ieee80211_reassemble_find()
2197 idx--; in ieee80211_reassemble_find()
2199 idx = IEEE80211_FRAGMENT_MAX - 1; in ieee80211_reassemble_find()
2201 entry = &cache->entries[idx]; in ieee80211_reassemble_find()
2202 if (skb_queue_empty(&entry->skb_list) || entry->seq != seq || in ieee80211_reassemble_find()
2203 entry->rx_queue != rx_queue || in ieee80211_reassemble_find()
2204 entry->last_frag + 1 != frag) in ieee80211_reassemble_find()
2207 f_skb = __skb_peek(&entry->skb_list); in ieee80211_reassemble_find()
2208 f_hdr = (struct ieee80211_hdr *) f_skb->data; in ieee80211_reassemble_find()
2213 if (((hdr->frame_control ^ f_hdr->frame_control) & in ieee80211_reassemble_find()
2215 !ether_addr_equal(hdr->addr1, f_hdr->addr1) || in ieee80211_reassemble_find()
2216 !ether_addr_equal(hdr->addr2, f_hdr->addr2)) in ieee80211_reassemble_find()
2219 if (time_after(jiffies, entry->first_frag_time + 2 * HZ)) { in ieee80211_reassemble_find()
2220 __skb_queue_purge(&entry->skb_list); in ieee80211_reassemble_find()
2231 return rx->key && in requires_sequential_pn()
2232 (rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP || in requires_sequential_pn()
2233 rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256 || in requires_sequential_pn()
2234 rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP || in requires_sequential_pn()
2235 rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP_256) && in requires_sequential_pn()
2242 struct ieee80211_fragment_cache *cache = &rx->sdata->frags; in ieee80211_rx_h_defragment()
2249 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_defragment()
2251 hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_defragment()
2252 fc = hdr->frame_control; in ieee80211_rx_h_defragment()
2257 sc = le16_to_cpu(hdr->seq_ctrl); in ieee80211_rx_h_defragment()
2260 if (rx->sta) in ieee80211_rx_h_defragment()
2261 cache = &rx->sta->frags; in ieee80211_rx_h_defragment()
2266 if (is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_defragment()
2269 I802_DEBUG_INC(rx->local->rx_handlers_fragments); in ieee80211_rx_h_defragment()
2271 if (skb_linearize(rx->skb)) in ieee80211_rx_h_defragment()
2275 * skb_linearize() might change the skb->data and in ieee80211_rx_h_defragment()
2279 hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_defragment()
2285 rx->seqno_idx, &(rx->skb)); in ieee80211_rx_h_defragment()
2287 int queue = rx->security_idx; in ieee80211_rx_h_defragment()
2292 entry->check_sequential_pn = true; in ieee80211_rx_h_defragment()
2293 entry->is_protected = true; in ieee80211_rx_h_defragment()
2294 entry->key_color = rx->key->color; in ieee80211_rx_h_defragment()
2295 memcpy(entry->last_pn, in ieee80211_rx_h_defragment()
2296 rx->key->u.ccmp.rx_pn[queue], in ieee80211_rx_h_defragment()
2302 BUILD_BUG_ON(sizeof(rx->key->u.ccmp.rx_pn[queue]) != in ieee80211_rx_h_defragment()
2303 sizeof(rx->key->u.gcmp.rx_pn[queue])); in ieee80211_rx_h_defragment()
2306 } else if (rx->key && in ieee80211_rx_h_defragment()
2308 (status->flag & RX_FLAG_DECRYPTED))) { in ieee80211_rx_h_defragment()
2309 entry->is_protected = true; in ieee80211_rx_h_defragment()
2310 entry->key_color = rx->key->color; in ieee80211_rx_h_defragment()
2319 rx->seqno_idx, hdr); in ieee80211_rx_h_defragment()
2321 I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag); in ieee80211_rx_h_defragment()
2327 * see IEEE P802.11-REVmc/D5.0, 12.5.3.4.4, item d (for CCMP) in ieee80211_rx_h_defragment()
2328 * and IEEE P802.11-REVmc/D5.0, 12.5.5.4.4, item d (for GCMP) in ieee80211_rx_h_defragment()
2330 if (entry->check_sequential_pn) { in ieee80211_rx_h_defragment()
2338 if (entry->key_color != rx->key->color) in ieee80211_rx_h_defragment()
2341 memcpy(pn, entry->last_pn, IEEE80211_CCMP_PN_LEN); in ieee80211_rx_h_defragment()
2342 for (i = IEEE80211_CCMP_PN_LEN - 1; i >= 0; i--) { in ieee80211_rx_h_defragment()
2348 rpn = rx->ccm_gcm.pn; in ieee80211_rx_h_defragment()
2351 memcpy(entry->last_pn, pn, IEEE80211_CCMP_PN_LEN); in ieee80211_rx_h_defragment()
2352 } else if (entry->is_protected && in ieee80211_rx_h_defragment()
2353 (!rx->key || in ieee80211_rx_h_defragment()
2355 !(status->flag & RX_FLAG_DECRYPTED)) || in ieee80211_rx_h_defragment()
2356 rx->key->color != entry->key_color)) { in ieee80211_rx_h_defragment()
2362 } else if (entry->is_protected && rx->key && in ieee80211_rx_h_defragment()
2363 entry->key_color != rx->key->color && in ieee80211_rx_h_defragment()
2364 (status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_rx_h_defragment()
2368 skb_pull(rx->skb, ieee80211_hdrlen(fc)); in ieee80211_rx_h_defragment()
2369 __skb_queue_tail(&entry->skb_list, rx->skb); in ieee80211_rx_h_defragment()
2370 entry->last_frag = frag; in ieee80211_rx_h_defragment()
2371 entry->extra_len += rx->skb->len; in ieee80211_rx_h_defragment()
2373 rx->skb = NULL; in ieee80211_rx_h_defragment()
2377 rx->skb = __skb_dequeue(&entry->skb_list); in ieee80211_rx_h_defragment()
2378 if (skb_tailroom(rx->skb) < entry->extra_len) { in ieee80211_rx_h_defragment()
2379 I802_DEBUG_INC(rx->local->rx_expand_skb_head_defrag); in ieee80211_rx_h_defragment()
2380 if (unlikely(pskb_expand_head(rx->skb, 0, entry->extra_len, in ieee80211_rx_h_defragment()
2382 I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag); in ieee80211_rx_h_defragment()
2383 __skb_queue_purge(&entry->skb_list); in ieee80211_rx_h_defragment()
2387 while ((skb = __skb_dequeue(&entry->skb_list))) { in ieee80211_rx_h_defragment()
2388 skb_put_data(rx->skb, skb->data, skb->len); in ieee80211_rx_h_defragment()
2393 ieee80211_led_rx(rx->local); in ieee80211_rx_h_defragment()
2394 if (rx->sta) in ieee80211_rx_h_defragment()
2395 rx->sta->rx_stats.packets++; in ieee80211_rx_h_defragment()
2401 if (unlikely(!rx->sta || !test_sta_flag(rx->sta, WLAN_STA_AUTHORIZED))) in ieee80211_802_1x_port_control()
2402 return -EACCES; in ieee80211_802_1x_port_control()
2409 struct ieee80211_hdr *hdr = (void *)rx->skb->data; in ieee80211_drop_unencrypted()
2410 struct sk_buff *skb = rx->skb; in ieee80211_drop_unencrypted()
2417 if (status->flag & RX_FLAG_DECRYPTED) in ieee80211_drop_unencrypted()
2421 if (unlikely(rx->sta && ieee80211_vif_is_mesh(&rx->sdata->vif) && in ieee80211_drop_unencrypted()
2428 if (!ether_addr_equal(hdr->addr1, rx->sdata->vif.addr)) in ieee80211_drop_unencrypted()
2432 if (!pskb_may_pull(rx->skb, hdr_len + 6)) in ieee80211_drop_unencrypted()
2435 mesh_hdr = (struct ieee80211s_hdr *)(skb->data + hdr_len); in ieee80211_drop_unencrypted()
2439 if (skb_copy_bits(rx->skb, ethertype_offset, ðertype, 2) == 0 && in ieee80211_drop_unencrypted()
2440 ethertype == rx->sdata->control_port_protocol) in ieee80211_drop_unencrypted()
2448 ieee80211_is_data(fc) && rx->key)) in ieee80211_drop_unencrypted()
2449 return -EACCES; in ieee80211_drop_unencrypted()
2456 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_drop_unencrypted_mgmt()
2457 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_drop_unencrypted_mgmt()
2458 __le16 fc = hdr->frame_control; in ieee80211_drop_unencrypted_mgmt()
2464 if (status->flag & RX_FLAG_DECRYPTED) in ieee80211_drop_unencrypted_mgmt()
2467 if (rx->sta && test_sta_flag(rx->sta, WLAN_STA_MFP)) { in ieee80211_drop_unencrypted_mgmt()
2469 ieee80211_is_unicast_robust_mgmt_frame(rx->skb) && in ieee80211_drop_unencrypted_mgmt()
2470 rx->key)) { in ieee80211_drop_unencrypted_mgmt()
2473 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_drop_unencrypted_mgmt()
2474 rx->skb->data, in ieee80211_drop_unencrypted_mgmt()
2475 rx->skb->len); in ieee80211_drop_unencrypted_mgmt()
2476 return -EACCES; in ieee80211_drop_unencrypted_mgmt()
2479 if (unlikely(ieee80211_is_multicast_robust_mgmt_frame(rx->skb) && in ieee80211_drop_unencrypted_mgmt()
2480 ieee80211_get_mmie_keyidx(rx->skb) < 0)) { in ieee80211_drop_unencrypted_mgmt()
2483 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_drop_unencrypted_mgmt()
2484 rx->skb->data, in ieee80211_drop_unencrypted_mgmt()
2485 rx->skb->len); in ieee80211_drop_unencrypted_mgmt()
2486 return -EACCES; in ieee80211_drop_unencrypted_mgmt()
2488 if (unlikely(ieee80211_is_beacon(fc) && rx->key && in ieee80211_drop_unencrypted_mgmt()
2489 ieee80211_get_mmie_keyidx(rx->skb) < 0)) { in ieee80211_drop_unencrypted_mgmt()
2490 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_drop_unencrypted_mgmt()
2491 rx->skb->data, in ieee80211_drop_unencrypted_mgmt()
2492 rx->skb->len); in ieee80211_drop_unencrypted_mgmt()
2493 return -EACCES; in ieee80211_drop_unencrypted_mgmt()
2499 if (unlikely(ieee80211_is_action(fc) && !rx->key && in ieee80211_drop_unencrypted_mgmt()
2500 ieee80211_is_robust_mgmt_frame(rx->skb))) in ieee80211_drop_unencrypted_mgmt()
2501 return -EACCES; in ieee80211_drop_unencrypted_mgmt()
2510 struct ieee80211_sub_if_data *sdata = rx->sdata; in __ieee80211_data_to_8023()
2511 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in __ieee80211_data_to_8023()
2517 if (ieee80211_has_a4(hdr->frame_control) && in __ieee80211_data_to_8023()
2518 sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->u.vlan.sta) in __ieee80211_data_to_8023()
2519 return -1; in __ieee80211_data_to_8023()
2521 if (sdata->vif.type == NL80211_IFTYPE_STATION && in __ieee80211_data_to_8023()
2522 !!sdata->u.mgd.use_4addr != !!ieee80211_has_a4(hdr->frame_control)) { in __ieee80211_data_to_8023()
2524 if (!sdata->u.mgd.use_4addr) in __ieee80211_data_to_8023()
2525 return -1; in __ieee80211_data_to_8023()
2526 else if (!ether_addr_equal(hdr->addr1, sdata->vif.addr)) in __ieee80211_data_to_8023()
2530 if (is_multicast_ether_addr(hdr->addr1) && in __ieee80211_data_to_8023()
2531 sdata->vif.type == NL80211_IFTYPE_AP_VLAN && sdata->u.vlan.sta) in __ieee80211_data_to_8023()
2532 return -1; in __ieee80211_data_to_8023()
2534 ret = ieee80211_data_to_8023(rx->skb, sdata->vif.addr, sdata->vif.type); in __ieee80211_data_to_8023()
2538 ehdr = (struct ethhdr *) rx->skb->data; in __ieee80211_data_to_8023()
2539 if (ehdr->h_proto == rx->sdata->control_port_protocol) in __ieee80211_data_to_8023()
2542 return -1; in __ieee80211_data_to_8023()
2548 * requires that rx->skb is a frame with ethernet header
2554 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; in ieee80211_frame_allowed()
2561 if (unlikely(ehdr->h_proto == rx->sdata->control_port_protocol)) in ieee80211_frame_allowed()
2562 return ether_addr_equal(ehdr->h_dest, rx->sdata->vif.addr) || in ieee80211_frame_allowed()
2563 ether_addr_equal(ehdr->h_dest, pae_group_addr); in ieee80211_frame_allowed()
2575 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_deliver_skb_to_local_stack()
2576 struct net_device *dev = sdata->dev; in ieee80211_deliver_skb_to_local_stack() local
2578 if (unlikely((skb->protocol == sdata->control_port_protocol || in ieee80211_deliver_skb_to_local_stack()
2579 (skb->protocol == cpu_to_be16(ETH_P_PREAUTH) && in ieee80211_deliver_skb_to_local_stack()
2580 !sdata->control_port_no_preauth)) && in ieee80211_deliver_skb_to_local_stack()
2581 sdata->control_port_over_nl80211)) { in ieee80211_deliver_skb_to_local_stack()
2583 bool noencrypt = !(status->flag & RX_FLAG_DECRYPTED); in ieee80211_deliver_skb_to_local_stack()
2585 cfg80211_rx_control_port(dev, skb, noencrypt); in ieee80211_deliver_skb_to_local_stack()
2590 memset(skb->cb, 0, sizeof(skb->cb)); in ieee80211_deliver_skb_to_local_stack()
2606 if (unlikely(skb->protocol == sdata->control_port_protocol && in ieee80211_deliver_skb_to_local_stack()
2607 !ether_addr_equal(ehdr->h_dest, sdata->vif.addr))) in ieee80211_deliver_skb_to_local_stack()
2608 ether_addr_copy(ehdr->h_dest, sdata->vif.addr); in ieee80211_deliver_skb_to_local_stack()
2611 if (rx->list) in ieee80211_deliver_skb_to_local_stack()
2612 list_add_tail(&skb->list, rx->list); in ieee80211_deliver_skb_to_local_stack()
2619 * requires that rx->skb is a frame with ethernet header
2624 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_deliver_skb()
2625 struct net_device *dev = sdata->dev; in ieee80211_deliver_skb() local
2627 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; in ieee80211_deliver_skb()
2630 skb = rx->skb; in ieee80211_deliver_skb()
2633 dev_sw_netstats_rx_add(dev, skb->len); in ieee80211_deliver_skb()
2635 if (rx->sta) { in ieee80211_deliver_skb()
2638 * for non-QoS-data frames. Here we know it's a data in ieee80211_deliver_skb()
2641 u64_stats_update_begin(&rx->sta->rx_stats.syncp); in ieee80211_deliver_skb()
2642 rx->sta->rx_stats.msdu[rx->seqno_idx]++; in ieee80211_deliver_skb()
2643 u64_stats_update_end(&rx->sta->rx_stats.syncp); in ieee80211_deliver_skb()
2646 if ((sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_deliver_skb()
2647 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) && in ieee80211_deliver_skb()
2648 !(sdata->flags & IEEE80211_SDATA_DONT_BRIDGE_PACKETS) && in ieee80211_deliver_skb()
2649 ehdr->h_proto != rx->sdata->control_port_protocol && in ieee80211_deliver_skb()
2650 (sdata->vif.type != NL80211_IFTYPE_AP_VLAN || !sdata->u.vlan.sta)) { in ieee80211_deliver_skb()
2651 if (is_multicast_ether_addr(ehdr->h_dest) && in ieee80211_deliver_skb()
2660 dev->name); in ieee80211_deliver_skb()
2661 } else if (!is_multicast_ether_addr(ehdr->h_dest) && in ieee80211_deliver_skb()
2662 !ether_addr_equal(ehdr->h_dest, ehdr->h_source)) { in ieee80211_deliver_skb()
2663 dsta = sta_info_get(sdata, ehdr->h_dest); in ieee80211_deliver_skb()
2680 * frames are required to be aligned to 2-byte boundaries in ieee80211_deliver_skb()
2683 * access fields as 2-byte aligned (e.g. for ether_addr_equal) in ieee80211_deliver_skb()
2687 align = (unsigned long)(skb->data + sizeof(struct ethhdr)) & 3; in ieee80211_deliver_skb()
2693 u8 *data = skb->data; in ieee80211_deliver_skb()
2695 skb->data -= align; in ieee80211_deliver_skb()
2696 memmove(skb->data, data, len); in ieee80211_deliver_skb()
2704 skb->protocol = eth_type_trans(skb, dev); in ieee80211_deliver_skb()
2714 xmit_skb->priority += 256; in ieee80211_deliver_skb()
2715 xmit_skb->protocol = htons(ETH_P_802_3); in ieee80211_deliver_skb()
2725 struct net_device *dev = rx->sdata->dev; in __ieee80211_rx_h_amsdu() local
2726 struct sk_buff *skb = rx->skb; in __ieee80211_rx_h_amsdu()
2727 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in __ieee80211_rx_h_amsdu()
2728 __le16 fc = hdr->frame_control; in __ieee80211_rx_h_amsdu()
2733 if (unlikely(ieee80211_has_a4(hdr->frame_control))) { in __ieee80211_rx_h_amsdu()
2736 } else switch (rx->sdata->vif.type) { in __ieee80211_rx_h_amsdu()
2742 if (!rx->sta || in __ieee80211_rx_h_amsdu()
2743 !test_sta_flag(rx->sta, WLAN_STA_TDLS_PEER)) in __ieee80211_rx_h_amsdu()
2753 skb->dev = dev; in __ieee80211_rx_h_amsdu()
2757 rx->sdata->vif.addr, in __ieee80211_rx_h_amsdu()
2758 rx->sdata->vif.type, in __ieee80211_rx_h_amsdu()
2762 ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr, in __ieee80211_rx_h_amsdu()
2763 rx->sdata->vif.type, in __ieee80211_rx_h_amsdu()
2764 rx->local->hw.extra_tx_headroom, in __ieee80211_rx_h_amsdu()
2768 rx->skb = __skb_dequeue(&frame_list); in __ieee80211_rx_h_amsdu()
2771 dev_kfree_skb(rx->skb); in __ieee80211_rx_h_amsdu()
2784 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_amsdu()
2786 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_rx_h_amsdu()
2787 __le16 fc = hdr->frame_control; in ieee80211_rx_h_amsdu()
2789 if (!(status->rx_flags & IEEE80211_RX_AMSDU)) in ieee80211_rx_h_amsdu()
2798 if (unlikely(ieee80211_has_a4(hdr->frame_control))) { in ieee80211_rx_h_amsdu()
2799 switch (rx->sdata->vif.type) { in ieee80211_rx_h_amsdu()
2801 if (!rx->sdata->u.vlan.sta) in ieee80211_rx_h_amsdu()
2805 if (!rx->sdata->u.mgd.use_4addr) in ieee80211_rx_h_amsdu()
2813 if (is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_amsdu()
2816 if (rx->key) { in ieee80211_rx_h_amsdu()
2818 * We should not receive A-MSDUs on pre-HT connections, in ieee80211_rx_h_amsdu()
2821 * A-MSDUs or such. in ieee80211_rx_h_amsdu()
2823 switch (rx->key->conf.cipher) { in ieee80211_rx_h_amsdu()
2843 struct sk_buff *skb = rx->skb, *fwd_skb; in ieee80211_rx_h_mesh_fwding()
2844 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_mesh_fwding()
2845 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_mesh_fwding()
2846 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_rx_h_mesh_fwding()
2850 hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_rx_h_mesh_fwding()
2851 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_rx_h_mesh_fwding()
2854 if (!pskb_may_pull(rx->skb, hdrlen + 6)) in ieee80211_rx_h_mesh_fwding()
2857 mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen); in ieee80211_rx_h_mesh_fwding()
2860 if (!pskb_may_pull(rx->skb, in ieee80211_rx_h_mesh_fwding()
2865 hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_rx_h_mesh_fwding()
2866 mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen); in ieee80211_rx_h_mesh_fwding()
2868 if (ieee80211_drop_unencrypted(rx, hdr->frame_control)) in ieee80211_rx_h_mesh_fwding()
2872 if (ieee80211_is_data(hdr->frame_control) && in ieee80211_rx_h_mesh_fwding()
2873 is_multicast_ether_addr(hdr->addr1) && in ieee80211_rx_h_mesh_fwding()
2874 mesh_rmc_check(rx->sdata, hdr->addr3, mesh_hdr)) in ieee80211_rx_h_mesh_fwding()
2877 if (!ieee80211_is_data(hdr->frame_control)) in ieee80211_rx_h_mesh_fwding()
2880 if (!mesh_hdr->ttl) in ieee80211_rx_h_mesh_fwding()
2883 if (mesh_hdr->flags & MESH_FLAGS_AE) { in ieee80211_rx_h_mesh_fwding()
2888 if (is_multicast_ether_addr(hdr->addr1)) { in ieee80211_rx_h_mesh_fwding()
2889 mpp_addr = hdr->addr3; in ieee80211_rx_h_mesh_fwding()
2890 proxied_addr = mesh_hdr->eaddr1; in ieee80211_rx_h_mesh_fwding()
2891 } else if ((mesh_hdr->flags & MESH_FLAGS_AE) == in ieee80211_rx_h_mesh_fwding()
2894 mpp_addr = hdr->addr4; in ieee80211_rx_h_mesh_fwding()
2895 proxied_addr = mesh_hdr->eaddr2; in ieee80211_rx_h_mesh_fwding()
2905 spin_lock_bh(&mppath->state_lock); in ieee80211_rx_h_mesh_fwding()
2906 if (!ether_addr_equal(mppath->mpp, mpp_addr)) in ieee80211_rx_h_mesh_fwding()
2907 memcpy(mppath->mpp, mpp_addr, ETH_ALEN); in ieee80211_rx_h_mesh_fwding()
2908 mppath->exp_time = jiffies; in ieee80211_rx_h_mesh_fwding()
2909 spin_unlock_bh(&mppath->state_lock); in ieee80211_rx_h_mesh_fwding()
2915 if (!is_multicast_ether_addr(hdr->addr1) && in ieee80211_rx_h_mesh_fwding()
2916 ether_addr_equal(sdata->vif.addr, hdr->addr3)) in ieee80211_rx_h_mesh_fwding()
2920 q = sdata->vif.hw_queue[ac]; in ieee80211_rx_h_mesh_fwding()
2921 if (ieee80211_queue_stopped(&local->hw, q)) { in ieee80211_rx_h_mesh_fwding()
2927 if (!--mesh_hdr->ttl) { in ieee80211_rx_h_mesh_fwding()
2928 if (!is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_mesh_fwding()
2934 if (!ifmsh->mshcfg.dot11MeshForwarding) in ieee80211_rx_h_mesh_fwding()
2937 if (sdata->crypto_tx_tailroom_needed_cnt) in ieee80211_rx_h_mesh_fwding()
2940 fwd_skb = skb_copy_expand(skb, local->tx_headroom + in ieee80211_rx_h_mesh_fwding()
2941 sdata->encrypt_headroom, in ieee80211_rx_h_mesh_fwding()
2946 fwd_hdr = (struct ieee80211_hdr *) fwd_skb->data; in ieee80211_rx_h_mesh_fwding()
2947 fwd_hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_RETRY); in ieee80211_rx_h_mesh_fwding()
2950 info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING; in ieee80211_rx_h_mesh_fwding()
2951 info->control.vif = &rx->sdata->vif; in ieee80211_rx_h_mesh_fwding()
2952 info->control.jiffies = jiffies; in ieee80211_rx_h_mesh_fwding()
2953 if (is_multicast_ether_addr(fwd_hdr->addr1)) { in ieee80211_rx_h_mesh_fwding()
2955 memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_rx_h_mesh_fwding()
2963 mesh_path_error_tx(sdata, ifmsh->mshcfg.element_ttl, in ieee80211_rx_h_mesh_fwding()
2964 fwd_hdr->addr3, 0, in ieee80211_rx_h_mesh_fwding()
2966 fwd_hdr->addr2); in ieee80211_rx_h_mesh_fwding()
2975 if (is_multicast_ether_addr(hdr->addr1)) in ieee80211_rx_h_mesh_fwding()
2984 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_data()
2985 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_data()
2986 struct net_device *dev = sdata->dev; in ieee80211_rx_h_data() local
2987 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_data()
2988 __le16 fc = hdr->frame_control; in ieee80211_rx_h_data()
2992 if (unlikely(!ieee80211_is_data(hdr->frame_control))) in ieee80211_rx_h_data()
2995 if (unlikely(!ieee80211_is_data_present(hdr->frame_control))) in ieee80211_rx_h_data()
2999 * Send unexpected-4addr-frame event to hostapd. For older versions, in ieee80211_rx_h_data()
3002 if (ieee80211_has_a4(hdr->frame_control) && in ieee80211_rx_h_data()
3003 sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_rx_h_data()
3004 if (rx->sta && in ieee80211_rx_h_data()
3005 !test_and_set_sta_flag(rx->sta, WLAN_STA_4ADDR_EVENT)) in ieee80211_rx_h_data()
3007 rx->sdata->dev, rx->sta->sta.addr, GFP_ATOMIC); in ieee80211_rx_h_data()
3019 if (unlikely(((struct ethhdr *)rx->skb->data)->h_proto == in ieee80211_rx_h_data()
3021 struct ieee80211_tdls_data *tf = (void *)rx->skb->data; in ieee80211_rx_h_data()
3023 if (pskb_may_pull(rx->skb, in ieee80211_rx_h_data()
3025 tf->payload_type == WLAN_TDLS_SNAP_RFTYPE && in ieee80211_rx_h_data()
3026 tf->category == WLAN_CATEGORY_TDLS && in ieee80211_rx_h_data()
3027 (tf->action_code == WLAN_TDLS_CHANNEL_SWITCH_REQUEST || in ieee80211_rx_h_data()
3028 tf->action_code == WLAN_TDLS_CHANNEL_SWITCH_RESPONSE)) { in ieee80211_rx_h_data()
3029 rx->skb->protocol = cpu_to_be16(ETH_P_TDLS); in ieee80211_rx_h_data()
3030 __ieee80211_queue_skb_to_iface(sdata, rx->sta, rx->skb); in ieee80211_rx_h_data()
3035 if (rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_data()
3036 unlikely(port_control) && sdata->bss) { in ieee80211_rx_h_data()
3037 sdata = container_of(sdata->bss, struct ieee80211_sub_if_data, in ieee80211_rx_h_data()
3039 dev = sdata->dev; in ieee80211_rx_h_data()
3040 rx->sdata = sdata; in ieee80211_rx_h_data()
3043 rx->skb->dev = dev; in ieee80211_rx_h_data()
3045 if (!ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS) && in ieee80211_rx_h_data()
3046 local->ps_sdata && local->hw.conf.dynamic_ps_timeout > 0 && in ieee80211_rx_h_data()
3048 ((struct ethhdr *)rx->skb->data)->h_dest) && in ieee80211_rx_h_data()
3049 (!local->scanning && in ieee80211_rx_h_data()
3050 !test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state))) in ieee80211_rx_h_data()
3051 mod_timer(&local->dynamic_ps_timer, jiffies + in ieee80211_rx_h_data()
3052 msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout)); in ieee80211_rx_h_data()
3062 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_ctrl()
3063 struct ieee80211_bar *bar = (struct ieee80211_bar *)skb->data; in ieee80211_rx_h_ctrl()
3068 if (likely(!ieee80211_is_ctl(bar->frame_control))) in ieee80211_rx_h_ctrl()
3071 if (ieee80211_is_back_req(bar->frame_control)) { in ieee80211_rx_h_ctrl()
3079 if (!rx->sta) in ieee80211_rx_h_ctrl()
3088 if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && in ieee80211_rx_h_ctrl()
3089 !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) in ieee80211_rx_h_ctrl()
3090 ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, in ieee80211_rx_h_ctrl()
3094 tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]); in ieee80211_rx_h_ctrl()
3101 event.u.ba.sta = &rx->sta->sta; in ieee80211_rx_h_ctrl()
3104 if (tid_agg_rx->timeout) in ieee80211_rx_h_ctrl()
3105 mod_timer(&tid_agg_rx->session_timer, in ieee80211_rx_h_ctrl()
3106 TU_TO_EXP_TIME(tid_agg_rx->timeout)); in ieee80211_rx_h_ctrl()
3108 spin_lock(&tid_agg_rx->reorder_lock); in ieee80211_rx_h_ctrl()
3110 ieee80211_release_reorder_frames(rx->sdata, tid_agg_rx, in ieee80211_rx_h_ctrl()
3112 spin_unlock(&tid_agg_rx->reorder_lock); in ieee80211_rx_h_ctrl()
3114 drv_event_callback(rx->local, rx->sdata, &event); in ieee80211_rx_h_ctrl()
3132 struct ieee80211_local *local = sdata->local; in ieee80211_process_sa_query_req()
3136 if (!ether_addr_equal(mgmt->da, sdata->vif.addr)) { in ieee80211_process_sa_query_req()
3141 if (!ether_addr_equal(mgmt->sa, sdata->u.mgd.bssid) || in ieee80211_process_sa_query_req()
3142 !ether_addr_equal(mgmt->bssid, sdata->u.mgd.bssid)) { in ieee80211_process_sa_query_req()
3147 if (len < 24 + 1 + sizeof(resp->u.action.u.sa_query)) { in ieee80211_process_sa_query_req()
3152 skb = dev_alloc_skb(sizeof(*resp) + local->hw.extra_tx_headroom); in ieee80211_process_sa_query_req()
3156 skb_reserve(skb, local->hw.extra_tx_headroom); in ieee80211_process_sa_query_req()
3158 memcpy(resp->da, mgmt->sa, ETH_ALEN); in ieee80211_process_sa_query_req()
3159 memcpy(resp->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_process_sa_query_req()
3160 memcpy(resp->bssid, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_process_sa_query_req()
3161 resp->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | in ieee80211_process_sa_query_req()
3163 skb_put(skb, 1 + sizeof(resp->u.action.u.sa_query)); in ieee80211_process_sa_query_req()
3164 resp->u.action.category = WLAN_CATEGORY_SA_QUERY; in ieee80211_process_sa_query_req()
3165 resp->u.action.u.sa_query.action = WLAN_ACTION_SA_QUERY_RESPONSE; in ieee80211_process_sa_query_req()
3166 memcpy(resp->u.action.u.sa_query.trans_id, in ieee80211_process_sa_query_req()
3167 mgmt->u.action.u.sa_query.trans_id, in ieee80211_process_sa_query_req()
3176 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_mgmt_check()
3177 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_mgmt_check()
3179 if (ieee80211_is_s1g_beacon(mgmt->frame_control)) in ieee80211_rx_h_mgmt_check()
3187 if (rx->skb->len < 24) in ieee80211_rx_h_mgmt_check()
3190 if (!ieee80211_is_mgmt(mgmt->frame_control)) in ieee80211_rx_h_mgmt_check()
3193 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && in ieee80211_rx_h_mgmt_check()
3194 ieee80211_is_beacon(mgmt->frame_control) && in ieee80211_rx_h_mgmt_check()
3195 !(rx->flags & IEEE80211_RX_BEACON_REPORTED)) { in ieee80211_rx_h_mgmt_check()
3198 if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM) && in ieee80211_rx_h_mgmt_check()
3199 !(status->flag & RX_FLAG_NO_SIGNAL_VAL)) in ieee80211_rx_h_mgmt_check()
3200 sig = status->signal; in ieee80211_rx_h_mgmt_check()
3202 cfg80211_report_obss_beacon_khz(rx->local->hw.wiphy, in ieee80211_rx_h_mgmt_check()
3203 rx->skb->data, rx->skb->len, in ieee80211_rx_h_mgmt_check()
3206 rx->flags |= IEEE80211_RX_BEACON_REPORTED; in ieee80211_rx_h_mgmt_check()
3218 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)rx->skb->data; in ieee80211_process_rx_twt_action()
3219 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_process_rx_twt_action()
3220 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_process_rx_twt_action()
3225 if (sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_process_rx_twt_action()
3228 if (!rx->local->ops->add_twt_setup) in ieee80211_process_rx_twt_action()
3231 sband = rx->local->hw.wiphy->bands[status->band]; in ieee80211_process_rx_twt_action()
3233 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_process_rx_twt_action()
3237 if (!(hecap->he_cap_elem.mac_cap_info[0] & in ieee80211_process_rx_twt_action()
3241 if (!rx->sta) in ieee80211_process_rx_twt_action()
3244 switch (mgmt->u.action.u.s1g.action_code) { in ieee80211_process_rx_twt_action()
3248 if (rx->skb->len < IEEE80211_MIN_ACTION_SIZE + in ieee80211_process_rx_twt_action()
3254 twt = (void *)mgmt->u.action.u.s1g.variable; in ieee80211_process_rx_twt_action()
3255 if (twt->element_id != WLAN_EID_S1G_TWT) in ieee80211_process_rx_twt_action()
3258 if (rx->skb->len < IEEE80211_MIN_ACTION_SIZE + in ieee80211_process_rx_twt_action()
3260 twt->length) in ieee80211_process_rx_twt_action()
3266 if (rx->skb->len < IEEE80211_MIN_ACTION_SIZE + 2) in ieee80211_process_rx_twt_action()
3280 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_action()
3281 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_action()
3282 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_action()
3283 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_action()
3284 int len = rx->skb->len; in ieee80211_rx_h_action()
3286 if (!ieee80211_is_action(mgmt->frame_control)) in ieee80211_rx_h_action()
3293 if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC && in ieee80211_rx_h_action()
3294 mgmt->u.action.category != WLAN_CATEGORY_SELF_PROTECTED && in ieee80211_rx_h_action()
3295 mgmt->u.action.category != WLAN_CATEGORY_SPECTRUM_MGMT) in ieee80211_rx_h_action()
3298 switch (mgmt->u.action.category) { in ieee80211_rx_h_action()
3301 if (!rx->sta->sta.ht_cap.ht_supported) in ieee80211_rx_h_action()
3304 if (sdata->vif.type != NL80211_IFTYPE_STATION && in ieee80211_rx_h_action()
3305 sdata->vif.type != NL80211_IFTYPE_MESH_POINT && in ieee80211_rx_h_action()
3306 sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_action()
3307 sdata->vif.type != NL80211_IFTYPE_AP && in ieee80211_rx_h_action()
3308 sdata->vif.type != NL80211_IFTYPE_ADHOC) in ieee80211_rx_h_action()
3315 switch (mgmt->u.action.u.ht_smps.action) { in ieee80211_rx_h_action()
3321 if (sdata->vif.type != NL80211_IFTYPE_AP && in ieee80211_rx_h_action()
3322 sdata->vif.type != NL80211_IFTYPE_AP_VLAN) in ieee80211_rx_h_action()
3326 switch (mgmt->u.action.u.ht_smps.smps_control) { in ieee80211_rx_h_action()
3341 if (rx->sta->sta.smps_mode == smps_mode) in ieee80211_rx_h_action()
3343 rx->sta->sta.smps_mode = smps_mode; in ieee80211_rx_h_action()
3348 sband = rx->local->hw.wiphy->bands[status->band]; in ieee80211_rx_h_action()
3350 rate_control_rate_update(local, sband, rx->sta, in ieee80211_rx_h_action()
3352 cfg80211_sta_opmode_change_notify(sdata->dev, in ieee80211_rx_h_action()
3353 rx->sta->addr, in ieee80211_rx_h_action()
3360 u8 chanwidth = mgmt->u.action.u.ht_notify_cw.chanwidth; in ieee80211_rx_h_action()
3365 if (!(rx->sta->sta.ht_cap.cap & in ieee80211_rx_h_action()
3372 max_bw = ieee80211_sta_cap_rx_bw(rx->sta); in ieee80211_rx_h_action()
3375 rx->sta->cur_max_bandwidth = max_bw; in ieee80211_rx_h_action()
3376 new_bw = ieee80211_sta_cur_vht_bw(rx->sta); in ieee80211_rx_h_action()
3378 if (rx->sta->sta.bandwidth == new_bw) in ieee80211_rx_h_action()
3381 rx->sta->sta.bandwidth = new_bw; in ieee80211_rx_h_action()
3382 sband = rx->local->hw.wiphy->bands[status->band]; in ieee80211_rx_h_action()
3384 ieee80211_sta_rx_bw_to_chan_width(rx->sta); in ieee80211_rx_h_action()
3387 rate_control_rate_update(local, sband, rx->sta, in ieee80211_rx_h_action()
3389 cfg80211_sta_opmode_change_notify(sdata->dev, in ieee80211_rx_h_action()
3390 rx->sta->addr, in ieee80211_rx_h_action()
3403 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_rx_h_action()
3405 if (!rx->sta) in ieee80211_rx_h_action()
3407 if (!ether_addr_equal(mgmt->bssid, sdata->u.mgd.bssid)) in ieee80211_rx_h_action()
3409 if (mgmt->u.action.u.ext_chan_switch.action_code != in ieee80211_rx_h_action()
3417 if (sdata->vif.type != NL80211_IFTYPE_STATION && in ieee80211_rx_h_action()
3418 sdata->vif.type != NL80211_IFTYPE_MESH_POINT && in ieee80211_rx_h_action()
3419 sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_action()
3420 sdata->vif.type != NL80211_IFTYPE_AP && in ieee80211_rx_h_action()
3421 sdata->vif.type != NL80211_IFTYPE_ADHOC) in ieee80211_rx_h_action()
3428 switch (mgmt->u.action.u.vht_opmode_notif.action_code) { in ieee80211_rx_h_action()
3445 if (sdata->vif.type != NL80211_IFTYPE_STATION && in ieee80211_rx_h_action()
3446 sdata->vif.type != NL80211_IFTYPE_MESH_POINT && in ieee80211_rx_h_action()
3447 sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_action()
3448 sdata->vif.type != NL80211_IFTYPE_AP && in ieee80211_rx_h_action()
3449 sdata->vif.type != NL80211_IFTYPE_ADHOC) in ieee80211_rx_h_action()
3456 switch (mgmt->u.action.u.addba_req.action_code) { in ieee80211_rx_h_action()
3459 sizeof(mgmt->u.action.u.addba_req))) in ieee80211_rx_h_action()
3464 sizeof(mgmt->u.action.u.addba_resp))) in ieee80211_rx_h_action()
3469 sizeof(mgmt->u.action.u.delba))) in ieee80211_rx_h_action()
3482 switch (mgmt->u.action.u.measurement.action_code) { in ieee80211_rx_h_action()
3484 if (status->band != NL80211_BAND_5GHZ) in ieee80211_rx_h_action()
3488 sizeof(mgmt->u.action.u.measurement))) in ieee80211_rx_h_action()
3491 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_rx_h_action()
3499 sizeof(mgmt->u.action.u.chan_switch))) in ieee80211_rx_h_action()
3502 if (sdata->vif.type != NL80211_IFTYPE_STATION && in ieee80211_rx_h_action()
3503 sdata->vif.type != NL80211_IFTYPE_ADHOC && in ieee80211_rx_h_action()
3504 sdata->vif.type != NL80211_IFTYPE_MESH_POINT) in ieee80211_rx_h_action()
3507 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_rx_h_action()
3508 bssid = sdata->u.mgd.bssid; in ieee80211_rx_h_action()
3509 else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) in ieee80211_rx_h_action()
3510 bssid = sdata->u.ibss.bssid; in ieee80211_rx_h_action()
3511 else if (sdata->vif.type == NL80211_IFTYPE_MESH_POINT) in ieee80211_rx_h_action()
3512 bssid = mgmt->sa; in ieee80211_rx_h_action()
3516 if (!ether_addr_equal(mgmt->bssid, bssid)) in ieee80211_rx_h_action()
3525 sizeof(mgmt->u.action.u.self_prot.action_code))) in ieee80211_rx_h_action()
3528 switch (mgmt->u.action.u.self_prot.action_code) { in ieee80211_rx_h_action()
3532 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_rx_h_action()
3534 if (sdata->u.mesh.user_mpm) in ieee80211_rx_h_action()
3540 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_rx_h_action()
3547 sizeof(mgmt->u.action.u.mesh_action.action_code))) in ieee80211_rx_h_action()
3550 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_rx_h_action()
3557 switch (mgmt->u.action.u.s1g.action_code) { in ieee80211_rx_h_action()
3572 status->rx_flags |= IEEE80211_RX_MALFORMED_ACTION_FRM; in ieee80211_rx_h_action()
3577 if (rx->sta) in ieee80211_rx_h_action()
3578 rx->sta->rx_stats.packets++; in ieee80211_rx_h_action()
3579 dev_kfree_skb(rx->skb); in ieee80211_rx_h_action()
3583 ieee80211_queue_skb_to_iface(sdata, rx->sta, rx->skb); in ieee80211_rx_h_action()
3590 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_userspace_mgmt()
3593 /* skip known-bad action frames and return them in the next handler */ in ieee80211_rx_h_userspace_mgmt()
3594 if (status->rx_flags & IEEE80211_RX_MALFORMED_ACTION_FRM) in ieee80211_rx_h_userspace_mgmt()
3604 if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM) && in ieee80211_rx_h_userspace_mgmt()
3605 !(status->flag & RX_FLAG_NO_SIGNAL_VAL)) in ieee80211_rx_h_userspace_mgmt()
3606 sig = status->signal; in ieee80211_rx_h_userspace_mgmt()
3608 if (cfg80211_rx_mgmt_khz(&rx->sdata->wdev, in ieee80211_rx_h_userspace_mgmt()
3610 rx->skb->data, rx->skb->len, 0)) { in ieee80211_rx_h_userspace_mgmt()
3611 if (rx->sta) in ieee80211_rx_h_userspace_mgmt()
3612 rx->sta->rx_stats.packets++; in ieee80211_rx_h_userspace_mgmt()
3613 dev_kfree_skb(rx->skb); in ieee80211_rx_h_userspace_mgmt()
3623 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_action_post_userspace()
3624 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_action_post_userspace()
3625 int len = rx->skb->len; in ieee80211_rx_h_action_post_userspace()
3627 if (!ieee80211_is_action(mgmt->frame_control)) in ieee80211_rx_h_action_post_userspace()
3630 switch (mgmt->u.action.category) { in ieee80211_rx_h_action_post_userspace()
3633 sizeof(mgmt->u.action.u.sa_query))) in ieee80211_rx_h_action_post_userspace()
3636 switch (mgmt->u.action.u.sa_query.action) { in ieee80211_rx_h_action_post_userspace()
3638 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_rx_h_action_post_userspace()
3649 if (rx->sta) in ieee80211_rx_h_action_post_userspace()
3650 rx->sta->rx_stats.packets++; in ieee80211_rx_h_action_post_userspace()
3651 dev_kfree_skb(rx->skb); in ieee80211_rx_h_action_post_userspace()
3658 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_action_return()
3659 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_action_return()
3661 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_action_return()
3662 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_action_return()
3664 if (!ieee80211_is_action(mgmt->frame_control)) in ieee80211_rx_h_action_return()
3672 * 802.11-2012 9.24.4. in ieee80211_rx_h_action_return()
3677 if (!(status->rx_flags & IEEE80211_RX_MALFORMED_ACTION_FRM) && in ieee80211_rx_h_action_return()
3678 (sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_rx_h_action_return()
3679 sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) in ieee80211_rx_h_action_return()
3682 if (is_multicast_ether_addr(mgmt->da)) in ieee80211_rx_h_action_return()
3686 if (mgmt->u.action.category & 0x80) in ieee80211_rx_h_action_return()
3689 nskb = skb_copy_expand(rx->skb, local->hw.extra_tx_headroom, 0, in ieee80211_rx_h_action_return()
3692 struct ieee80211_mgmt *nmgmt = (void *)nskb->data; in ieee80211_rx_h_action_return()
3694 nmgmt->u.action.category |= 0x80; in ieee80211_rx_h_action_return()
3695 memcpy(nmgmt->da, nmgmt->sa, ETH_ALEN); in ieee80211_rx_h_action_return()
3696 memcpy(nmgmt->sa, rx->sdata->vif.addr, ETH_ALEN); in ieee80211_rx_h_action_return()
3698 memset(nskb->cb, 0, sizeof(nskb->cb)); in ieee80211_rx_h_action_return()
3700 if (rx->sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) { in ieee80211_rx_h_action_return()
3703 info->flags = IEEE80211_TX_CTL_TX_OFFCHAN | in ieee80211_rx_h_action_return()
3706 if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) in ieee80211_rx_h_action_return()
3707 info->hw_queue = in ieee80211_rx_h_action_return()
3708 local->hw.offchannel_tx_hw_queue; in ieee80211_rx_h_action_return()
3711 __ieee80211_tx_skb_tid_band(rx->sdata, nskb, 7, in ieee80211_rx_h_action_return()
3712 status->band); in ieee80211_rx_h_action_return()
3714 dev_kfree_skb(rx->skb); in ieee80211_rx_h_action_return()
3721 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_ext()
3722 struct ieee80211_hdr *hdr = (void *)rx->skb->data; in ieee80211_rx_h_ext()
3724 if (!ieee80211_is_ext(hdr->frame_control)) in ieee80211_rx_h_ext()
3727 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_rx_h_ext()
3731 ieee80211_queue_skb_to_iface(sdata, rx->sta, rx->skb); in ieee80211_rx_h_ext()
3739 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_mgmt()
3740 struct ieee80211_mgmt *mgmt = (void *)rx->skb->data; in ieee80211_rx_h_mgmt()
3743 stype = mgmt->frame_control & cpu_to_le16(IEEE80211_FCTL_STYPE); in ieee80211_rx_h_mgmt()
3745 if (!ieee80211_vif_is_mesh(&sdata->vif) && in ieee80211_rx_h_mgmt()
3746 sdata->vif.type != NL80211_IFTYPE_ADHOC && in ieee80211_rx_h_mgmt()
3747 sdata->vif.type != NL80211_IFTYPE_OCB && in ieee80211_rx_h_mgmt()
3748 sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_rx_h_mgmt()
3758 if (is_multicast_ether_addr(mgmt->da) && in ieee80211_rx_h_mgmt()
3759 !is_broadcast_ether_addr(mgmt->da)) in ieee80211_rx_h_mgmt()
3763 if (sdata->vif.type != NL80211_IFTYPE_STATION && in ieee80211_rx_h_mgmt()
3764 sdata->vif.type != NL80211_IFTYPE_ADHOC) in ieee80211_rx_h_mgmt()
3770 if (is_multicast_ether_addr(mgmt->da) && in ieee80211_rx_h_mgmt()
3771 !is_broadcast_ether_addr(mgmt->da)) in ieee80211_rx_h_mgmt()
3775 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_rx_h_mgmt()
3780 if (sdata->vif.type != NL80211_IFTYPE_ADHOC && in ieee80211_rx_h_mgmt()
3781 sdata->vif.type != NL80211_IFTYPE_MESH_POINT) in ieee80211_rx_h_mgmt()
3788 ieee80211_queue_skb_to_iface(sdata, rx->sta, rx->skb); in ieee80211_rx_h_mgmt()
3797 struct ieee80211_local *local = rx->local; in ieee80211_rx_cooked_monitor()
3798 struct sk_buff *skb = rx->skb, *skb2; in ieee80211_rx_cooked_monitor()
3807 if (rx->flags & IEEE80211_RX_CMNTR) in ieee80211_rx_cooked_monitor()
3809 rx->flags |= IEEE80211_RX_CMNTR; in ieee80211_rx_cooked_monitor()
3812 if (!local->cooked_mntrs) in ieee80211_rx_cooked_monitor()
3816 status->flag &= ~RX_FLAG_RADIOTAP_VENDOR_DATA; in ieee80211_rx_cooked_monitor()
3829 skb->ip_summed = CHECKSUM_UNNECESSARY; in ieee80211_rx_cooked_monitor()
3830 skb->pkt_type = PACKET_OTHERHOST; in ieee80211_rx_cooked_monitor()
3831 skb->protocol = htons(ETH_P_802_2); in ieee80211_rx_cooked_monitor()
3833 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_rx_cooked_monitor()
3837 if (sdata->vif.type != NL80211_IFTYPE_MONITOR || in ieee80211_rx_cooked_monitor()
3838 !(sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES)) in ieee80211_rx_cooked_monitor()
3844 skb2->dev = prev_dev; in ieee80211_rx_cooked_monitor()
3849 prev_dev = sdata->dev; in ieee80211_rx_cooked_monitor()
3850 dev_sw_netstats_rx_add(sdata->dev, skb->len); in ieee80211_rx_cooked_monitor()
3854 skb->dev = prev_dev; in ieee80211_rx_cooked_monitor()
3868 I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop); in ieee80211_rx_handlers_result()
3869 if (rx->sta) in ieee80211_rx_handlers_result()
3870 rx->sta->rx_stats.dropped++; in ieee80211_rx_handlers_result()
3877 status = IEEE80211_SKB_RXCB((rx->skb)); in ieee80211_rx_handlers_result()
3879 sband = rx->local->hw.wiphy->bands[status->band]; in ieee80211_rx_handlers_result()
3880 if (status->encoding == RX_ENC_LEGACY) in ieee80211_rx_handlers_result()
3881 rate = &sband->bitrates[status->rate_idx]; in ieee80211_rx_handlers_result()
3887 I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop); in ieee80211_rx_handlers_result()
3888 if (rx->sta) in ieee80211_rx_handlers_result()
3889 rx->sta->rx_stats.dropped++; in ieee80211_rx_handlers_result()
3890 dev_kfree_skb(rx->skb); in ieee80211_rx_handlers_result()
3893 I802_DEBUG_INC(rx->sdata->local->rx_handlers_queued); in ieee80211_rx_handlers_result()
3917 spin_lock_bh(&rx->local->rx_path_lock); in ieee80211_rx_handlers()
3925 rx->skb = skb; in ieee80211_rx_handlers()
3935 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) in ieee80211_rx_handlers()
3941 /* special treatment -- needs the queue */ in ieee80211_rx_handlers()
3960 spin_unlock_bh(&rx->local->rx_path_lock); in ieee80211_rx_handlers()
4000 .sdata = sta->sdata, in ieee80211_release_reorder_timeout()
4001 .local = sta->local, in ieee80211_release_reorder_timeout()
4002 /* This is OK -- must be QoS data frame */ in ieee80211_release_reorder_timeout()
4008 tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); in ieee80211_release_reorder_timeout()
4014 spin_lock(&tid_agg_rx->reorder_lock); in ieee80211_release_reorder_timeout()
4015 ieee80211_sta_reorder_release(sta->sdata, tid_agg_rx, &frames); in ieee80211_release_reorder_timeout()
4016 spin_unlock(&tid_agg_rx->reorder_lock); in ieee80211_release_reorder_timeout()
4022 .u.ba.sta = &sta->sta, in ieee80211_release_reorder_timeout()
4038 /* This is OK -- must be QoS data frame */ in ieee80211_mark_rx_ba_filtered_frames()
4052 rx.sdata = sta->sdata; in ieee80211_mark_rx_ba_filtered_frames()
4053 rx.local = sta->local; in ieee80211_mark_rx_ba_filtered_frames()
4056 tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); in ieee80211_mark_rx_ba_filtered_frames()
4060 spin_lock_bh(&tid_agg_rx->reorder_lock); in ieee80211_mark_rx_ba_filtered_frames()
4066 release = (tid_agg_rx->head_seq_num + tid_agg_rx->buf_size) % in ieee80211_mark_rx_ba_filtered_frames()
4068 ieee80211_release_reorder_frames(sta->sdata, tid_agg_rx, in ieee80211_mark_rx_ba_filtered_frames()
4071 tid_agg_rx->head_seq_num = ssn; in ieee80211_mark_rx_ba_filtered_frames()
4073 ieee80211_release_reorder_frames(sta->sdata, tid_agg_rx, ssn, in ieee80211_mark_rx_ba_filtered_frames()
4078 * it can be tid_agg_rx->buf_size behind and still be valid */ in ieee80211_mark_rx_ba_filtered_frames()
4079 diff = (tid_agg_rx->head_seq_num - ssn) & IEEE80211_SN_MASK; in ieee80211_mark_rx_ba_filtered_frames()
4080 if (diff >= tid_agg_rx->buf_size) { in ieee80211_mark_rx_ba_filtered_frames()
4081 tid_agg_rx->reorder_buf_filtered = 0; in ieee80211_mark_rx_ba_filtered_frames()
4088 for (i = 0; i < tid_agg_rx->buf_size; i++) { in ieee80211_mark_rx_ba_filtered_frames()
4089 int index = (ssn + i) % tid_agg_rx->buf_size; in ieee80211_mark_rx_ba_filtered_frames()
4091 tid_agg_rx->reorder_buf_filtered &= ~BIT_ULL(index); in ieee80211_mark_rx_ba_filtered_frames()
4093 tid_agg_rx->reorder_buf_filtered |= BIT_ULL(index); in ieee80211_mark_rx_ba_filtered_frames()
4097 ieee80211_sta_reorder_release(sta->sdata, tid_agg_rx, &frames); in ieee80211_mark_rx_ba_filtered_frames()
4100 spin_unlock_bh(&tid_agg_rx->reorder_lock); in ieee80211_mark_rx_ba_filtered_frames()
4113 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_accept_frame()
4114 struct sk_buff *skb = rx->skb; in ieee80211_accept_frame()
4115 struct ieee80211_hdr *hdr = (void *)skb->data; in ieee80211_accept_frame()
4117 u8 *bssid = ieee80211_get_bssid(hdr, skb->len, sdata->vif.type); in ieee80211_accept_frame()
4118 bool multicast = is_multicast_ether_addr(hdr->addr1) || in ieee80211_accept_frame()
4119 ieee80211_is_s1g_beacon(hdr->frame_control); in ieee80211_accept_frame()
4121 switch (sdata->vif.type) { in ieee80211_accept_frame()
4123 if (!bssid && !sdata->u.mgd.use_4addr) in ieee80211_accept_frame()
4125 if (ieee80211_is_robust_mgmt_frame(skb) && !rx->sta) in ieee80211_accept_frame()
4129 return ether_addr_equal(sdata->vif.addr, hdr->addr1); in ieee80211_accept_frame()
4133 if (ether_addr_equal(sdata->vif.addr, hdr->addr2) || in ieee80211_accept_frame()
4134 ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2) || in ieee80211_accept_frame()
4135 !is_valid_ether_addr(hdr->addr2)) in ieee80211_accept_frame()
4137 if (ieee80211_is_beacon(hdr->frame_control)) in ieee80211_accept_frame()
4139 if (!ieee80211_bssid_match(bssid, sdata->u.ibss.bssid)) in ieee80211_accept_frame()
4142 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) in ieee80211_accept_frame()
4144 if (!rx->sta) { in ieee80211_accept_frame()
4146 if (status->encoding != RX_ENC_LEGACY) in ieee80211_accept_frame()
4149 rate_idx = status->rate_idx; in ieee80211_accept_frame()
4150 ieee80211_ibss_rx_no_sta(sdata, bssid, hdr->addr2, in ieee80211_accept_frame()
4157 if (!ieee80211_is_data_present(hdr->frame_control)) in ieee80211_accept_frame()
4162 !ether_addr_equal(sdata->dev->dev_addr, hdr->addr1)) in ieee80211_accept_frame()
4164 if (!rx->sta) { in ieee80211_accept_frame()
4166 if (status->encoding != RX_ENC_LEGACY) in ieee80211_accept_frame()
4169 rate_idx = status->rate_idx; in ieee80211_accept_frame()
4170 ieee80211_ocb_rx_no_sta(sdata, bssid, hdr->addr2, in ieee80211_accept_frame()
4175 if (ether_addr_equal(sdata->vif.addr, hdr->addr2)) in ieee80211_accept_frame()
4179 return ether_addr_equal(sdata->vif.addr, hdr->addr1); in ieee80211_accept_frame()
4183 return ether_addr_equal(sdata->vif.addr, hdr->addr1); in ieee80211_accept_frame()
4185 if (!ieee80211_bssid_match(bssid, sdata->vif.addr)) { in ieee80211_accept_frame()
4193 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) in ieee80211_accept_frame()
4195 if (ieee80211_is_public_action(hdr, skb->len)) in ieee80211_accept_frame()
4197 return ieee80211_is_beacon(hdr->frame_control); in ieee80211_accept_frame()
4200 if (!ieee80211_has_tods(hdr->frame_control)) { in ieee80211_accept_frame()
4201 /* ignore data frames to TDLS-peers */ in ieee80211_accept_frame()
4202 if (ieee80211_is_data(hdr->frame_control)) in ieee80211_accept_frame()
4204 /* ignore action frames to TDLS-peers */ in ieee80211_accept_frame()
4205 if (ieee80211_is_action(hdr->frame_control) && in ieee80211_accept_frame()
4207 !ether_addr_equal(bssid, hdr->addr1)) in ieee80211_accept_frame()
4212 * 802.11-2016 Table 9-26 says that for data frames, A1 must be in ieee80211_accept_frame()
4213 * the BSSID - we've checked that already but may have accepted in ieee80211_accept_frame()
4228 if (ieee80211_is_data(hdr->frame_control) && multicast) in ieee80211_accept_frame()
4233 return ieee80211_is_public_action(hdr, skb->len) || in ieee80211_accept_frame()
4234 ieee80211_is_probe_req(hdr->frame_control) || in ieee80211_accept_frame()
4235 ieee80211_is_probe_resp(hdr->frame_control) || in ieee80211_accept_frame()
4236 ieee80211_is_beacon(hdr->frame_control); in ieee80211_accept_frame()
4250 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_check_fast_rx()
4251 struct ieee80211_local *local = sdata->local; in ieee80211_check_fast_rx()
4254 .dev = sdata->dev, in ieee80211_check_fast_rx()
4255 .vif_type = sdata->vif.type, in ieee80211_check_fast_rx()
4256 .control_port_protocol = sdata->control_port_protocol, in ieee80211_check_fast_rx()
4268 ether_addr_copy(fastrx.vif_addr, sdata->vif.addr); in ieee80211_check_fast_rx()
4270 fastrx.uses_rss = ieee80211_hw_check(&local->hw, USES_RSS); in ieee80211_check_fast_rx()
4272 /* fast-rx doesn't do reordering */ in ieee80211_check_fast_rx()
4273 if (ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION) && in ieee80211_check_fast_rx()
4274 !ieee80211_hw_check(&local->hw, SUPPORTS_REORDERING_BUFFER)) in ieee80211_check_fast_rx()
4277 switch (sdata->vif.type) { in ieee80211_check_fast_rx()
4279 if (sta->sta.tdls) { in ieee80211_check_fast_rx()
4290 if (sdata->u.mgd.use_4addr && !sta->sta.tdls) { in ieee80211_check_fast_rx()
4297 if (!sdata->u.mgd.powersave) in ieee80211_check_fast_rx()
4301 if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) in ieee80211_check_fast_rx()
4303 if (ieee80211_hw_check(&local->hw, SUPPORTS_PS) && in ieee80211_check_fast_rx()
4304 !ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS)) in ieee80211_check_fast_rx()
4309 /* parallel-rx requires this, at least with calls to in ieee80211_check_fast_rx()
4312 if (!ieee80211_hw_check(&local->hw, AP_LINK_PS)) in ieee80211_check_fast_rx()
4319 !(sdata->flags & IEEE80211_SDATA_DONT_BRIDGE_PACKETS) && in ieee80211_check_fast_rx()
4320 (sdata->vif.type != NL80211_IFTYPE_AP_VLAN || in ieee80211_check_fast_rx()
4321 !sdata->u.vlan.sta); in ieee80211_check_fast_rx()
4323 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_check_fast_rx()
4324 sdata->u.vlan.sta) { in ieee80211_check_fast_rx()
4340 key = rcu_dereference(sta->ptk[sta->ptk_idx]); in ieee80211_check_fast_rx()
4342 key = rcu_dereference(sdata->default_unicast_key); in ieee80211_check_fast_rx()
4344 switch (key->conf.cipher) { in ieee80211_check_fast_rx()
4346 /* we don't want to deal with MMIC in fast-rx */ in ieee80211_check_fast_rx()
4361 fastrx.icv_len = key->conf.icv_len; in ieee80211_check_fast_rx()
4374 (sdata->vif.offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED); in ieee80211_check_fast_rx()
4382 drv_sta_set_decap_offload(local, sdata, &sta->sta, assign); in ieee80211_check_fast_rx()
4384 spin_lock_bh(&sta->lock); in ieee80211_check_fast_rx()
4385 old = rcu_dereference_protected(sta->fast_rx, true); in ieee80211_check_fast_rx()
4386 rcu_assign_pointer(sta->fast_rx, new); in ieee80211_check_fast_rx()
4387 spin_unlock_bh(&sta->lock); in ieee80211_check_fast_rx()
4397 spin_lock_bh(&sta->lock); in ieee80211_clear_fast_rx()
4398 old = rcu_dereference_protected(sta->fast_rx, true); in ieee80211_clear_fast_rx()
4399 RCU_INIT_POINTER(sta->fast_rx, NULL); in ieee80211_clear_fast_rx()
4400 spin_unlock_bh(&sta->lock); in ieee80211_clear_fast_rx()
4408 struct ieee80211_local *local = sdata->local; in __ieee80211_check_fast_rx_iface()
4411 lockdep_assert_held(&local->sta_mtx); in __ieee80211_check_fast_rx_iface()
4413 list_for_each_entry(sta, &local->sta_list, list) { in __ieee80211_check_fast_rx_iface()
4414 if (sdata != sta->sdata && in __ieee80211_check_fast_rx_iface()
4415 (!sta->sdata->bss || sta->sdata->bss != sdata->bss)) in __ieee80211_check_fast_rx_iface()
4423 struct ieee80211_local *local = sdata->local; in ieee80211_check_fast_rx_iface()
4425 mutex_lock(&local->sta_mtx); in ieee80211_check_fast_rx_iface()
4427 mutex_unlock(&local->sta_mtx); in ieee80211_check_fast_rx_iface()
4435 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_8023()
4436 struct sta_info *sta = rx->sta; in ieee80211_rx_8023()
4437 struct sk_buff *skb = rx->skb; in ieee80211_rx_8023()
4438 void *sa = skb->data + ETH_ALEN; in ieee80211_rx_8023()
4439 void *da = skb->data; in ieee80211_rx_8023()
4441 stats = &sta->rx_stats; in ieee80211_rx_8023()
4442 if (fast_rx->uses_rss) in ieee80211_rx_8023()
4443 stats = this_cpu_ptr(sta->pcpu_rx_stats); in ieee80211_rx_8023()
4446 if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { in ieee80211_rx_8023()
4447 stats->last_signal = status->signal; in ieee80211_rx_8023()
4448 if (!fast_rx->uses_rss) in ieee80211_rx_8023()
4449 ewma_signal_add(&sta->rx_stats_avg.signal, in ieee80211_rx_8023()
4450 -status->signal); in ieee80211_rx_8023()
4453 if (status->chains) { in ieee80211_rx_8023()
4456 stats->chains = status->chains; in ieee80211_rx_8023()
4457 for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) { in ieee80211_rx_8023()
4458 int signal = status->chain_signal[i]; in ieee80211_rx_8023()
4460 if (!(status->chains & BIT(i))) in ieee80211_rx_8023()
4463 stats->chain_signal_last[i] = signal; in ieee80211_rx_8023()
4464 if (!fast_rx->uses_rss) in ieee80211_rx_8023()
4465 ewma_signal_add(&sta->rx_stats_avg.chain_signal[i], in ieee80211_rx_8023()
4466 -signal); in ieee80211_rx_8023()
4471 stats->last_rx = jiffies; in ieee80211_rx_8023()
4472 stats->last_rate = sta_stats_encode_rate(status); in ieee80211_rx_8023()
4474 stats->fragments++; in ieee80211_rx_8023()
4475 stats->packets++; in ieee80211_rx_8023()
4477 skb->dev = fast_rx->dev; in ieee80211_rx_8023()
4479 dev_sw_netstats_rx_add(fast_rx->dev, skb->len); in ieee80211_rx_8023()
4483 * for non-QoS-data frames. Here we know it's a data in ieee80211_rx_8023()
4486 u64_stats_update_begin(&stats->syncp); in ieee80211_rx_8023()
4487 stats->msdu[rx->seqno_idx]++; in ieee80211_rx_8023()
4488 stats->bytes += orig_len; in ieee80211_rx_8023()
4489 u64_stats_update_end(&stats->syncp); in ieee80211_rx_8023()
4491 if (fast_rx->internal_forward) { in ieee80211_rx_8023()
4496 sta_info_get(rx->sdata, da)) { in ieee80211_rx_8023()
4507 xmit_skb->priority += 256; in ieee80211_rx_8023()
4508 xmit_skb->protocol = htons(ETH_P_802_3); in ieee80211_rx_8023()
4519 skb->protocol = eth_type_trans(skb, fast_rx->dev); in ieee80211_rx_8023()
4520 memset(skb->cb, 0, sizeof(skb->cb)); in ieee80211_rx_8023()
4521 if (rx->list) in ieee80211_rx_8023()
4522 list_add_tail(&skb->list, rx->list); in ieee80211_rx_8023()
4531 struct sk_buff *skb = rx->skb; in ieee80211_invoke_fast_rx()
4532 struct ieee80211_hdr *hdr = (void *)skb->data; in ieee80211_invoke_fast_rx()
4534 struct sta_info *sta = rx->sta; in ieee80211_invoke_fast_rx()
4535 int orig_len = skb->len; in ieee80211_invoke_fast_rx()
4536 int hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_invoke_fast_rx()
4546 struct ieee80211_sta_rx_stats *stats = &sta->rx_stats; in ieee80211_invoke_fast_rx()
4548 /* for parallel-rx, we need to have DUP_VALIDATED, otherwise we write in ieee80211_invoke_fast_rx()
4552 if (!(status->flag & RX_FLAG_DUP_VALIDATED)) in ieee80211_invoke_fast_rx()
4558 * - PN_VALIDATED: similar, but the implementation is tricky in ieee80211_invoke_fast_rx()
4559 * - DECRYPTED: necessary for PN_VALIDATED in ieee80211_invoke_fast_rx()
4561 if (fast_rx->key && in ieee80211_invoke_fast_rx()
4562 (status->flag & FAST_RX_CRYPT_FLAGS) != FAST_RX_CRYPT_FLAGS) in ieee80211_invoke_fast_rx()
4565 if (unlikely(!ieee80211_is_data_present(hdr->frame_control))) in ieee80211_invoke_fast_rx()
4580 if (!ether_addr_equal(fast_rx->vif_addr, hdr->addr1)) in ieee80211_invoke_fast_rx()
4583 if ((hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_FROMDS | in ieee80211_invoke_fast_rx()
4585 fast_rx->expected_ds_bits) in ieee80211_invoke_fast_rx()
4591 if (fast_rx->key && !(status->flag & RX_FLAG_IV_STRIPPED)) { in ieee80211_invoke_fast_rx()
4596 if (!(status->rx_flags & IEEE80211_RX_AMSDU)) { in ieee80211_invoke_fast_rx()
4600 payload = (void *)(skb->data + snap_offs); in ieee80211_invoke_fast_rx()
4602 if (!ether_addr_equal(payload->snap, fast_rx->rfc1042_hdr)) in ieee80211_invoke_fast_rx()
4607 * bridge-tunnel header - but if we get them this way then in ieee80211_invoke_fast_rx()
4610 if (unlikely(payload->proto == cpu_to_be16(ETH_P_TDLS) || in ieee80211_invoke_fast_rx()
4611 payload->proto == fast_rx->control_port_protocol)) in ieee80211_invoke_fast_rx()
4617 if (rx->key && !(status->flag & RX_FLAG_MIC_STRIPPED) && in ieee80211_invoke_fast_rx()
4618 pskb_trim(skb, skb->len - fast_rx->icv_len)) in ieee80211_invoke_fast_rx()
4621 if (rx->key && !ieee80211_has_protected(hdr->frame_control)) in ieee80211_invoke_fast_rx()
4624 if (status->rx_flags & IEEE80211_RX_AMSDU) { in ieee80211_invoke_fast_rx()
4625 if (__ieee80211_rx_h_amsdu(rx, snap_offs - hdrlen) != in ieee80211_invoke_fast_rx()
4632 /* do the header conversion - first grab the addresses */ in ieee80211_invoke_fast_rx()
4633 ether_addr_copy(addrs.da, skb->data + fast_rx->da_offs); in ieee80211_invoke_fast_rx()
4634 ether_addr_copy(addrs.sa, skb->data + fast_rx->sa_offs); in ieee80211_invoke_fast_rx()
4645 if (fast_rx->uses_rss) in ieee80211_invoke_fast_rx()
4646 stats = this_cpu_ptr(sta->pcpu_rx_stats); in ieee80211_invoke_fast_rx()
4648 stats->dropped++; in ieee80211_invoke_fast_rx()
4661 struct ieee80211_local *local = rx->local; in ieee80211_prepare_and_rx_handle()
4662 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_prepare_and_rx_handle()
4664 rx->skb = skb; in ieee80211_prepare_and_rx_handle()
4666 /* See if we can do fast-rx; if we have to copy we already lost, in ieee80211_prepare_and_rx_handle()
4673 if (consume && rx->sta) { in ieee80211_prepare_and_rx_handle()
4676 fast_rx = rcu_dereference(rx->sta->fast_rx); in ieee80211_prepare_and_rx_handle()
4688 wiphy_debug(local->hw.wiphy, in ieee80211_prepare_and_rx_handle()
4690 sdata->name); in ieee80211_prepare_and_rx_handle()
4694 rx->skb = skb; in ieee80211_prepare_and_rx_handle()
4715 I802_DEBUG_INC(local->dot11ReceivedFragmentCount); in __ieee80211_rx_handle_8023()
4718 if (skb->len < sizeof(struct ethhdr)) in __ieee80211_rx_handle_8023()
4725 rx.sdata = rx.sta->sdata; in __ieee80211_rx_handle_8023()
4727 fast_rx = rcu_dereference(rx.sta->fast_rx); in __ieee80211_rx_handle_8023()
4731 ieee80211_rx_8023(&rx, fast_rx, skb->len); in __ieee80211_rx_handle_8023()
4756 fc = ((struct ieee80211_hdr *)skb->data)->frame_control; in __ieee80211_rx_handle_packet()
4763 I802_DEBUG_INC(local->dot11ReceivedFragmentCount); in __ieee80211_rx_handle_packet()
4767 if (skb->len < ieee80211_hdrlen(fc)) in __ieee80211_rx_handle_packet()
4768 err = -ENOBUFS; in __ieee80211_rx_handle_packet()
4780 hdr = (struct ieee80211_hdr *)skb->data; in __ieee80211_rx_handle_packet()
4784 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control) || in __ieee80211_rx_handle_packet()
4785 ieee80211_is_beacon(hdr->frame_control) || in __ieee80211_rx_handle_packet()
4786 ieee80211_is_s1g_beacon(hdr->frame_control))) in __ieee80211_rx_handle_packet()
4794 rx.sdata = rx.sta->sdata; in __ieee80211_rx_handle_packet()
4802 for_each_sta_info(local, hdr->addr2, sta, tmp) { in __ieee80211_rx_handle_packet()
4809 rx.sdata = prev_sta->sdata; in __ieee80211_rx_handle_packet()
4817 rx.sdata = prev_sta->sdata; in __ieee80211_rx_handle_packet()
4827 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in __ieee80211_rx_handle_packet()
4831 if (sdata->vif.type == NL80211_IFTYPE_MONITOR || in __ieee80211_rx_handle_packet()
4832 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in __ieee80211_rx_handle_packet()
4846 rx.sta = sta_info_get_bss(prev, hdr->addr2); in __ieee80211_rx_handle_packet()
4854 rx.sta = sta_info_get_bss(prev, hdr->addr2); in __ieee80211_rx_handle_packet()
4879 if (WARN_ON(status->band >= NUM_NL80211_BANDS)) in ieee80211_rx_list()
4882 sband = local->hw.wiphy->bands[status->band]; in ieee80211_rx_list()
4893 if (unlikely(local->quiescing || local->suspended)) in ieee80211_rx_list()
4897 if (unlikely(local->in_reconfig)) in ieee80211_rx_list()
4904 if (WARN_ON(!local->started)) in ieee80211_rx_list()
4907 if (likely(!(status->flag & RX_FLAG_FAILED_PLCP_CRC))) { in ieee80211_rx_list()
4913 switch (status->encoding) { in ieee80211_rx_list()
4916 * rate_idx is MCS index, which can be [0-76] in ieee80211_rx_list()
4925 if (WARN(status->rate_idx > 76, in ieee80211_rx_list()
4927 "status->rate_idx is not " in ieee80211_rx_list()
4928 "an MCS index [0-76]: %d (0x%02x)\n", in ieee80211_rx_list()
4929 status->rate_idx, in ieee80211_rx_list()
4930 status->rate_idx)) in ieee80211_rx_list()
4934 if (WARN_ONCE(status->rate_idx > 9 || in ieee80211_rx_list()
4935 !status->nss || in ieee80211_rx_list()
4936 status->nss > 8, in ieee80211_rx_list()
4938 status->rate_idx, status->nss)) in ieee80211_rx_list()
4942 if (WARN_ONCE(status->rate_idx > 11 || in ieee80211_rx_list()
4943 !status->nss || in ieee80211_rx_list()
4944 status->nss > 8, in ieee80211_rx_list()
4946 status->rate_idx, status->nss)) in ieee80211_rx_list()
4953 if (WARN_ON(status->rate_idx >= sband->n_bitrates)) in ieee80211_rx_list()
4955 rate = &sband->bitrates[status->rate_idx]; in ieee80211_rx_list()
4959 status->rx_flags = 0; in ieee80211_rx_list()
4969 if (!(status->flag & RX_FLAG_8023)) in ieee80211_rx_list()
4973 ((struct ieee80211_hdr *)skb->data)->frame_control, in ieee80211_rx_list()
4974 skb->len); in ieee80211_rx_list()
4976 if (status->flag & RX_FLAG_8023) in ieee80211_rx_list()
4998 * and this requires that we are in a read-side RCU section during in ieee80211_rx_napi()
5023 BUILD_BUG_ON(sizeof(struct ieee80211_rx_status) > sizeof(skb->cb)); in ieee80211_rx_irqsafe()
5025 skb->pkt_type = IEEE80211_RX_MSG; in ieee80211_rx_irqsafe()
5026 skb_queue_tail(&local->skb_queue, skb); in ieee80211_rx_irqsafe()
5027 tasklet_schedule(&local->tasklet); in ieee80211_rx_irqsafe()