Lines Matching full:rx

722 		 * RX header they pull before we get here, and that should  in ieee80211_make_monitor_skb()
794 * (2) the other RX handlers will modify the skb we got. in ieee80211_rx_monitor()
877 static void ieee80211_parse_qos(struct ieee80211_rx_data *rx) in ieee80211_parse_qos() argument
879 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_parse_qos()
880 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_parse_qos()
912 rx->seqno_idx = seqno_idx; in ieee80211_parse_qos()
913 rx->security_idx = security_idx; in ieee80211_parse_qos()
916 rx->skb->priority = (tid > 7) ? 0 : tid; in ieee80211_parse_qos()
944 static void ieee80211_verify_alignment(struct ieee80211_rx_data *rx) in ieee80211_verify_alignment() argument
947 WARN_ON_ONCE((unsigned long)rx->skb->data & 1); in ieee80211_verify_alignment()
952 /* rx handlers */
1046 static ieee80211_rx_result ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx) in ieee80211_rx_mesh_check() argument
1048 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_mesh_check()
1049 char *dev_addr = rx->sdata->vif.addr; in ieee80211_rx_mesh_check()
1070 if (!rx->sta || sta_plink_state(rx->sta) != NL80211_PLINK_ESTAB) { in ieee80211_rx_mesh_check()
1080 if (rx->skb->len < IEEE80211_MIN_ACTION_SIZE) in ieee80211_rx_mesh_check()
1172 * Timeout (in jiffies) for skb's that are waiting in the RX reorder buffer. If
1216 "release an RX reorder frame due to timeout on earlier frames\n"); in ieee80211_sta_reorder_release()
1255 * As this function belongs to the RX path it must be under
1359 static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx, in ieee80211_rx_reorder_ampdu() argument
1362 struct sk_buff *skb = rx->skb; in ieee80211_rx_reorder_ampdu()
1363 struct ieee80211_local *local = rx->local; in ieee80211_rx_reorder_ampdu()
1365 struct sta_info *sta = rx->sta; in ieee80211_rx_reorder_ampdu()
1375 * filter the QoS data rx stream according to in ieee80211_rx_reorder_ampdu()
1389 !test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && in ieee80211_rx_reorder_ampdu()
1390 !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) in ieee80211_rx_reorder_ampdu()
1391 ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, in ieee80211_rx_reorder_ampdu()
1412 /* if this mpdu is fragmented - terminate rx aggregation session */ in ieee80211_rx_reorder_ampdu()
1415 skb_queue_tail(&rx->sdata->skb_queue, skb); in ieee80211_rx_reorder_ampdu()
1416 ieee80211_queue_work(&local->hw, &rx->sdata->work); in ieee80211_rx_reorder_ampdu()
1422 * RX packet at a time, and thus own tid_agg_rx. All in ieee80211_rx_reorder_ampdu()
1427 if (ieee80211_sta_manage_reorder_buf(rx->sdata, tid_agg_rx, skb, in ieee80211_rx_reorder_ampdu()
1436 ieee80211_rx_h_check_dup(struct ieee80211_rx_data *rx) in ieee80211_rx_h_check_dup() argument
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()
1449 if (rx->skb->len < 24) in ieee80211_rx_h_check_dup()
1458 if (!rx->sta) in ieee80211_rx_h_check_dup()
1462 rx->sta->last_seq_ctrl[rx->seqno_idx] == hdr->seq_ctrl)) { in ieee80211_rx_h_check_dup()
1463 I802_DEBUG_INC(rx->local->dot11FrameDuplicateCount); in ieee80211_rx_h_check_dup()
1464 rx->sta->rx_stats.num_duplicates++; in ieee80211_rx_h_check_dup()
1467 rx->sta->last_seq_ctrl[rx->seqno_idx] = hdr->seq_ctrl; in ieee80211_rx_h_check_dup()
1474 ieee80211_rx_h_check(struct ieee80211_rx_data *rx) in ieee80211_rx_h_check() argument
1476 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_check()
1487 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) in ieee80211_rx_h_check()
1488 return ieee80211_rx_mesh_check(rx); in ieee80211_rx_h_check()
1492 rx->sdata->vif.type != NL80211_IFTYPE_ADHOC && in ieee80211_rx_h_check()
1493 rx->sdata->vif.type != NL80211_IFTYPE_WDS && in ieee80211_rx_h_check()
1494 rx->sdata->vif.type != NL80211_IFTYPE_OCB && in ieee80211_rx_h_check()
1495 (!rx->sta || !test_sta_flag(rx->sta, WLAN_STA_ASSOC)))) { in ieee80211_rx_h_check()
1501 if (rx->sta && rx->sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_rx_h_check()
1508 if (rx->skb->len < hdrlen + 8) in ieee80211_rx_h_check()
1511 skb_copy_bits(rx->skb, hdrlen + 6, &ethertype, 2); in ieee80211_rx_h_check()
1512 if (ethertype == rx->sdata->control_port_protocol) in ieee80211_rx_h_check()
1516 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && in ieee80211_rx_h_check()
1517 cfg80211_rx_spurious_frame(rx->sdata->dev, in ieee80211_rx_h_check()
1530 ieee80211_rx_h_check_more_data(struct ieee80211_rx_data *rx) in ieee80211_rx_h_check_more_data() argument
1536 local = rx->local; in ieee80211_rx_h_check_more_data()
1537 skb = rx->skb; in ieee80211_rx_h_check_more_data()
1557 ieee80211_send_pspoll(local, rx->sdata); in ieee80211_rx_h_check_more_data()
1690 ieee80211_rx_h_uapsd_and_pspoll(struct ieee80211_rx_data *rx) in ieee80211_rx_h_uapsd_and_pspoll() argument
1692 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_uapsd_and_pspoll()
1693 struct ieee80211_hdr *hdr = (void *)rx->skb->data; in ieee80211_rx_h_uapsd_and_pspoll()
1694 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_uapsd_and_pspoll()
1696 if (!rx->sta) in ieee80211_rx_h_uapsd_and_pspoll()
1716 if (!test_sta_flag(rx->sta, WLAN_STA_PS_STA)) in ieee80211_rx_h_uapsd_and_pspoll()
1720 ieee80211_sta_pspoll(&rx->sta->sta); in ieee80211_rx_h_uapsd_and_pspoll()
1724 dev_kfree_skb(rx->skb); in ieee80211_rx_h_uapsd_and_pspoll()
1734 ieee80211_sta_uapsd_trigger(&rx->sta->sta, tid); in ieee80211_rx_h_uapsd_and_pspoll()
1741 ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx) in ieee80211_rx_h_sta_process() argument
1743 struct sta_info *sta = rx->sta; in ieee80211_rx_h_sta_process()
1744 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_sta_process()
1760 if (rx->sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_rx_h_sta_process()
1761 u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len, in ieee80211_rx_h_sta_process()
1763 if (ether_addr_equal(bssid, rx->sdata->u.ibss.bssid) && in ieee80211_rx_h_sta_process()
1771 } else if (rx->sdata->vif.type == NL80211_IFTYPE_OCB) { in ieee80211_rx_h_sta_process()
1783 if (rx->sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_rx_h_sta_process()
1784 ieee80211_sta_rx_notify(rx->sdata, hdr); in ieee80211_rx_h_sta_process()
1788 u64_stats_update_begin(&rx->sta->rx_stats.syncp); in ieee80211_rx_h_sta_process()
1789 sta->rx_stats.bytes += rx->skb->len; in ieee80211_rx_h_sta_process()
1790 u64_stats_update_end(&rx->sta->rx_stats.syncp); in ieee80211_rx_h_sta_process()
1822 (rx->sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_rx_h_sta_process()
1823 rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) { in ieee80211_rx_h_sta_process()
1834 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) in ieee80211_rx_h_sta_process()
1843 I802_DEBUG_INC(rx->local->rx_handlers_drop_nullfunc); in ieee80211_rx_h_sta_process()
1852 (rx->sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_rx_h_sta_process()
1853 (rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_sta_process()
1854 !rx->sdata->u.vlan.sta))) { in ieee80211_rx_h_sta_process()
1857 rx->sdata->dev, sta->sta.addr, in ieee80211_rx_h_sta_process()
1866 dev_kfree_skb(rx->skb); in ieee80211_rx_h_sta_process()
1874 ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx) in ieee80211_rx_h_decrypt() argument
1876 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_decrypt()
1915 rx->key = NULL; in ieee80211_rx_h_decrypt()
1918 if (rx->sta) { in ieee80211_rx_h_decrypt()
1919 int keyid = rx->sta->ptk_idx; in ieee80211_rx_h_decrypt()
1920 sta_ptk = rcu_dereference(rx->sta->ptk[keyid]); in ieee80211_rx_h_decrypt()
1923 cs = rx->sta->cipher_scheme; in ieee80211_rx_h_decrypt()
1924 keyid = ieee80211_get_keyid(rx->skb, cs); in ieee80211_rx_h_decrypt()
1929 ptk_idx = rcu_dereference(rx->sta->ptk[keyid]); in ieee80211_rx_h_decrypt()
1934 mmie_keyidx = ieee80211_get_mmie_keyidx(rx->skb); in ieee80211_rx_h_decrypt()
1937 rx->key = ptk_idx ? ptk_idx : sta_ptk; in ieee80211_rx_h_decrypt()
1953 if (rx->sta) { in ieee80211_rx_h_decrypt()
1955 test_sta_flag(rx->sta, WLAN_STA_MFP)) in ieee80211_rx_h_decrypt()
1958 rx->key = rcu_dereference(rx->sta->gtk[mmie_keyidx]); in ieee80211_rx_h_decrypt()
1960 if (!rx->key) in ieee80211_rx_h_decrypt()
1961 rx->key = rcu_dereference(rx->sdata->keys[mmie_keyidx]); in ieee80211_rx_h_decrypt()
1965 * need to set rx->key if there is a key that could have been in ieee80211_rx_h_decrypt()
1970 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_decrypt()
1975 (key = rcu_dereference(rx->sdata->default_mgmt_key))) in ieee80211_rx_h_decrypt()
1976 rx->key = key; in ieee80211_rx_h_decrypt()
1978 if (rx->sta) { in ieee80211_rx_h_decrypt()
1980 key = rcu_dereference(rx->sta->gtk[i]); in ieee80211_rx_h_decrypt()
1993 rx->key = key; in ieee80211_rx_h_decrypt()
2010 keyidx = ieee80211_get_keyid(rx->skb, cs); in ieee80211_rx_h_decrypt()
2016 if (is_multicast_ether_addr(hdr->addr1) && rx->sta) in ieee80211_rx_h_decrypt()
2017 rx->key = rcu_dereference(rx->sta->gtk[keyidx]); in ieee80211_rx_h_decrypt()
2020 if (!rx->key) { in ieee80211_rx_h_decrypt()
2021 rx->key = rcu_dereference(rx->sdata->keys[keyidx]); in ieee80211_rx_h_decrypt()
2028 if (rx->key && in ieee80211_rx_h_decrypt()
2029 rx->key->conf.cipher != WLAN_CIPHER_SUITE_WEP40 && in ieee80211_rx_h_decrypt()
2030 rx->key->conf.cipher != WLAN_CIPHER_SUITE_WEP104 && in ieee80211_rx_h_decrypt()
2032 rx->key = NULL; in ieee80211_rx_h_decrypt()
2036 if (rx->key) { in ieee80211_rx_h_decrypt()
2037 if (unlikely(rx->key->flags & KEY_FLAG_TAINTED)) in ieee80211_rx_h_decrypt()
2045 switch (rx->key->conf.cipher) { in ieee80211_rx_h_decrypt()
2048 result = ieee80211_crypto_wep_decrypt(rx); in ieee80211_rx_h_decrypt()
2051 result = ieee80211_crypto_tkip_decrypt(rx); in ieee80211_rx_h_decrypt()
2055 rx, IEEE80211_CCMP_MIC_LEN); in ieee80211_rx_h_decrypt()
2059 rx, IEEE80211_CCMP_256_MIC_LEN); in ieee80211_rx_h_decrypt()
2062 result = ieee80211_crypto_aes_cmac_decrypt(rx); in ieee80211_rx_h_decrypt()
2065 result = ieee80211_crypto_aes_cmac_256_decrypt(rx); in ieee80211_rx_h_decrypt()
2069 result = ieee80211_crypto_aes_gmac_decrypt(rx); in ieee80211_rx_h_decrypt()
2073 result = ieee80211_crypto_gcmp_decrypt(rx); in ieee80211_rx_h_decrypt()
2076 result = ieee80211_crypto_hw_decrypt(rx); in ieee80211_rx_h_decrypt()
2159 ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) in ieee80211_rx_h_defragment() argument
2168 hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_defragment()
2178 I802_DEBUG_INC(rx->local->dot11MulticastReceivedFrameCount); in ieee80211_rx_h_defragment()
2185 I802_DEBUG_INC(rx->local->rx_handlers_fragments); in ieee80211_rx_h_defragment()
2187 if (skb_linearize(rx->skb)) in ieee80211_rx_h_defragment()
2195 hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_defragment()
2200 entry = ieee80211_reassemble_add(rx->sdata, frag, seq, in ieee80211_rx_h_defragment()
2201 rx->seqno_idx, &(rx->skb)); in ieee80211_rx_h_defragment()
2202 if (rx->key && in ieee80211_rx_h_defragment()
2203 (rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP || in ieee80211_rx_h_defragment()
2204 rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256 || in ieee80211_rx_h_defragment()
2205 rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP || in ieee80211_rx_h_defragment()
2206 rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP_256) && in ieee80211_rx_h_defragment()
2208 int queue = rx->security_idx; in ieee80211_rx_h_defragment()
2215 rx->key->u.ccmp.rx_pn[queue], in ieee80211_rx_h_defragment()
2221 BUILD_BUG_ON(sizeof(rx->key->u.ccmp.rx_pn[queue]) != in ieee80211_rx_h_defragment()
2222 sizeof(rx->key->u.gcmp.rx_pn[queue])); in ieee80211_rx_h_defragment()
2232 entry = ieee80211_reassemble_find(rx->sdata, frag, seq, in ieee80211_rx_h_defragment()
2233 rx->seqno_idx, hdr); in ieee80211_rx_h_defragment()
2235 I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag); in ieee80211_rx_h_defragment()
2249 if (!rx->key || in ieee80211_rx_h_defragment()
2250 (rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP && in ieee80211_rx_h_defragment()
2251 rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP_256 && in ieee80211_rx_h_defragment()
2252 rx->key->conf.cipher != WLAN_CIPHER_SUITE_GCMP && in ieee80211_rx_h_defragment()
2253 rx->key->conf.cipher != WLAN_CIPHER_SUITE_GCMP_256)) in ieee80211_rx_h_defragment()
2261 queue = rx->security_idx; in ieee80211_rx_h_defragment()
2262 rpn = rx->key->u.ccmp.rx_pn[queue]; in ieee80211_rx_h_defragment()
2268 skb_pull(rx->skb, ieee80211_hdrlen(fc)); in ieee80211_rx_h_defragment()
2269 __skb_queue_tail(&entry->skb_list, rx->skb); in ieee80211_rx_h_defragment()
2271 entry->extra_len += rx->skb->len; in ieee80211_rx_h_defragment()
2273 rx->skb = NULL; in ieee80211_rx_h_defragment()
2277 rx->skb = __skb_dequeue(&entry->skb_list); in ieee80211_rx_h_defragment()
2278 if (skb_tailroom(rx->skb) < entry->extra_len) { in ieee80211_rx_h_defragment()
2279 I802_DEBUG_INC(rx->local->rx_expand_skb_head_defrag); in ieee80211_rx_h_defragment()
2280 if (unlikely(pskb_expand_head(rx->skb, 0, entry->extra_len, in ieee80211_rx_h_defragment()
2282 I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag); in ieee80211_rx_h_defragment()
2288 skb_put_data(rx->skb, skb->data, skb->len); in ieee80211_rx_h_defragment()
2293 ieee80211_led_rx(rx->local); in ieee80211_rx_h_defragment()
2295 if (rx->sta) in ieee80211_rx_h_defragment()
2296 rx->sta->rx_stats.packets++; in ieee80211_rx_h_defragment()
2300 static int ieee80211_802_1x_port_control(struct ieee80211_rx_data *rx) in ieee80211_802_1x_port_control() argument
2302 if (unlikely(!rx->sta || !test_sta_flag(rx->sta, WLAN_STA_AUTHORIZED))) in ieee80211_802_1x_port_control()
2308 static int ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc) in ieee80211_drop_unencrypted() argument
2310 struct sk_buff *skb = rx->skb; in ieee80211_drop_unencrypted()
2323 ieee80211_is_data(fc) && rx->key)) in ieee80211_drop_unencrypted()
2329 static int ieee80211_drop_unencrypted_mgmt(struct ieee80211_rx_data *rx) in ieee80211_drop_unencrypted_mgmt() argument
2331 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_drop_unencrypted_mgmt()
2332 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_drop_unencrypted_mgmt()
2342 if (rx->sta && test_sta_flag(rx->sta, WLAN_STA_MFP)) { in ieee80211_drop_unencrypted_mgmt()
2344 ieee80211_is_unicast_robust_mgmt_frame(rx->skb) && in ieee80211_drop_unencrypted_mgmt()
2345 rx->key)) { in ieee80211_drop_unencrypted_mgmt()
2348 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_drop_unencrypted_mgmt()
2349 rx->skb->data, in ieee80211_drop_unencrypted_mgmt()
2350 rx->skb->len); in ieee80211_drop_unencrypted_mgmt()
2354 if (unlikely(ieee80211_is_multicast_robust_mgmt_frame(rx->skb) && in ieee80211_drop_unencrypted_mgmt()
2355 ieee80211_get_mmie_keyidx(rx->skb) < 0)) { in ieee80211_drop_unencrypted_mgmt()
2358 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_drop_unencrypted_mgmt()
2359 rx->skb->data, in ieee80211_drop_unencrypted_mgmt()
2360 rx->skb->len); in ieee80211_drop_unencrypted_mgmt()
2367 if (unlikely(ieee80211_is_action(fc) && !rx->key && in ieee80211_drop_unencrypted_mgmt()
2368 ieee80211_is_robust_mgmt_frame(rx->skb))) in ieee80211_drop_unencrypted_mgmt()
2376 __ieee80211_data_to_8023(struct ieee80211_rx_data *rx, bool *port_control) in __ieee80211_data_to_8023() argument
2378 struct ieee80211_sub_if_data *sdata = rx->sdata; in __ieee80211_data_to_8023()
2379 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in __ieee80211_data_to_8023()
2402 ret = ieee80211_data_to_8023(rx->skb, sdata->vif.addr, sdata->vif.type); in __ieee80211_data_to_8023()
2406 ehdr = (struct ethhdr *) rx->skb->data; in __ieee80211_data_to_8023()
2407 if (ehdr->h_proto == rx->sdata->control_port_protocol) in __ieee80211_data_to_8023()
2416 * requires that rx->skb is a frame with ethernet header
2418 static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx, __le16 fc) in ieee80211_frame_allowed() argument
2422 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; in ieee80211_frame_allowed()
2428 if (ehdr->h_proto == rx->sdata->control_port_protocol && in ieee80211_frame_allowed()
2429 (ether_addr_equal(ehdr->h_dest, rx->sdata->vif.addr) || in ieee80211_frame_allowed()
2433 if (ieee80211_802_1x_port_control(rx) || in ieee80211_frame_allowed()
2434 ieee80211_drop_unencrypted(rx, fc)) in ieee80211_frame_allowed()
2441 struct ieee80211_rx_data *rx) in ieee80211_deliver_skb_to_local_stack() argument
2443 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_deliver_skb_to_local_stack()
2458 if (rx->napi) in ieee80211_deliver_skb_to_local_stack()
2459 napi_gro_receive(rx->napi, skb); in ieee80211_deliver_skb_to_local_stack()
2466 * requires that rx->skb is a frame with ethernet header
2469 ieee80211_deliver_skb(struct ieee80211_rx_data *rx) in ieee80211_deliver_skb() argument
2471 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_deliver_skb()
2474 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; in ieee80211_deliver_skb()
2477 skb = rx->skb; in ieee80211_deliver_skb()
2482 if (rx->sta) { in ieee80211_deliver_skb()
2488 u64_stats_update_begin(&rx->sta->rx_stats.syncp); in ieee80211_deliver_skb()
2489 rx->sta->rx_stats.msdu[rx->seqno_idx]++; in ieee80211_deliver_skb()
2490 u64_stats_update_end(&rx->sta->rx_stats.syncp); in ieee80211_deliver_skb()
2551 ieee80211_deliver_skb_to_local_stack(skb, rx); in ieee80211_deliver_skb()
2569 __ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx, u8 data_offset) in __ieee80211_rx_h_amsdu() argument
2571 struct net_device *dev = rx->sdata->dev; in __ieee80211_rx_h_amsdu()
2572 struct sk_buff *skb = rx->skb; in __ieee80211_rx_h_amsdu()
2582 } else switch (rx->sdata->vif.type) { in __ieee80211_rx_h_amsdu()
2588 if (!rx->sta || in __ieee80211_rx_h_amsdu()
2589 !test_sta_flag(rx->sta, WLAN_STA_TDLS_PEER)) in __ieee80211_rx_h_amsdu()
2603 rx->sdata->vif.addr, in __ieee80211_rx_h_amsdu()
2604 rx->sdata->vif.type, in __ieee80211_rx_h_amsdu()
2609 rx->sdata->vif.type, in __ieee80211_rx_h_amsdu()
2610 rx->local->hw.extra_tx_headroom, in __ieee80211_rx_h_amsdu()
2614 rx->skb = __skb_dequeue(&frame_list); in __ieee80211_rx_h_amsdu()
2616 if (!ieee80211_frame_allowed(rx, fc)) { in __ieee80211_rx_h_amsdu()
2617 dev_kfree_skb(rx->skb); in __ieee80211_rx_h_amsdu()
2621 ieee80211_deliver_skb(rx); in __ieee80211_rx_h_amsdu()
2628 ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx) in ieee80211_rx_h_amsdu() argument
2630 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_amsdu()
2645 switch (rx->sdata->vif.type) { in ieee80211_rx_h_amsdu()
2647 if (!rx->sdata->u.vlan.sta) in ieee80211_rx_h_amsdu()
2651 if (!rx->sdata->u.mgd.use_4addr) in ieee80211_rx_h_amsdu()
2662 return __ieee80211_rx_h_amsdu(rx, 0); in ieee80211_rx_h_amsdu()
2667 ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) in ieee80211_rx_h_mesh_fwding() argument
2672 struct sk_buff *skb = rx->skb, *fwd_skb; in ieee80211_rx_h_mesh_fwding()
2673 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_mesh_fwding()
2674 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_mesh_fwding()
2683 if (!pskb_may_pull(rx->skb, hdrlen + 6)) in ieee80211_rx_h_mesh_fwding()
2689 if (!pskb_may_pull(rx->skb, in ieee80211_rx_h_mesh_fwding()
2697 if (ieee80211_drop_unencrypted(rx, hdr->frame_control)) in ieee80211_rx_h_mesh_fwding()
2703 mesh_rmc_check(rx->sdata, hdr->addr3, mesh_hdr)) in ieee80211_rx_h_mesh_fwding()
2780 info->control.vif = &rx->sdata->vif; in ieee80211_rx_h_mesh_fwding()
2811 ieee80211_rx_h_data(struct ieee80211_rx_data *rx) in ieee80211_rx_h_data() argument
2813 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_data()
2814 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_data()
2816 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_data()
2833 if (rx->sta && in ieee80211_rx_h_data()
2834 !test_and_set_sta_flag(rx->sta, WLAN_STA_4ADDR_EVENT)) in ieee80211_rx_h_data()
2836 rx->sdata->dev, rx->sta->sta.addr, GFP_ATOMIC); in ieee80211_rx_h_data()
2840 err = __ieee80211_data_to_8023(rx, &port_control); in ieee80211_rx_h_data()
2844 if (!ieee80211_frame_allowed(rx, fc)) in ieee80211_rx_h_data()
2848 if (unlikely(((struct ethhdr *)rx->skb->data)->h_proto == in ieee80211_rx_h_data()
2850 struct ieee80211_tdls_data *tf = (void *)rx->skb->data; in ieee80211_rx_h_data()
2852 if (pskb_may_pull(rx->skb, in ieee80211_rx_h_data()
2858 skb_queue_tail(&local->skb_queue_tdls_chsw, rx->skb); in ieee80211_rx_h_data()
2860 if (rx->sta) in ieee80211_rx_h_data()
2861 rx->sta->rx_stats.packets++; in ieee80211_rx_h_data()
2867 if (rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_data()
2872 rx->sdata = sdata; in ieee80211_rx_h_data()
2875 rx->skb->dev = dev; in ieee80211_rx_h_data()
2880 ((struct ethhdr *)rx->skb->data)->h_dest) && in ieee80211_rx_h_data()
2886 ieee80211_deliver_skb(rx); in ieee80211_rx_h_data()
2892 ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx, struct sk_buff_head *frames) in ieee80211_rx_h_ctrl() argument
2894 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_ctrl()
2911 if (!rx->sta) in ieee80211_rx_h_ctrl()
2920 if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && in ieee80211_rx_h_ctrl()
2921 !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) in ieee80211_rx_h_ctrl()
2922 ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, in ieee80211_rx_h_ctrl()
2926 tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]); in ieee80211_rx_h_ctrl()
2933 event.u.ba.sta = &rx->sta->sta; in ieee80211_rx_h_ctrl()
2942 ieee80211_release_reorder_frames(rx->sdata, tid_agg_rx, in ieee80211_rx_h_ctrl()
2946 drv_event_callback(rx->local, rx->sdata, &event); in ieee80211_rx_h_ctrl()
3006 ieee80211_rx_h_mgmt_check(struct ieee80211_rx_data *rx) in ieee80211_rx_h_mgmt_check() argument
3008 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_mgmt_check()
3009 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_mgmt_check()
3016 if (rx->skb->len < 24) in ieee80211_rx_h_mgmt_check()
3022 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && in ieee80211_rx_h_mgmt_check()
3024 !(rx->flags & IEEE80211_RX_BEACON_REPORTED)) { in ieee80211_rx_h_mgmt_check()
3027 if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM) && in ieee80211_rx_h_mgmt_check()
3031 cfg80211_report_obss_beacon(rx->local->hw.wiphy, in ieee80211_rx_h_mgmt_check()
3032 rx->skb->data, rx->skb->len, in ieee80211_rx_h_mgmt_check()
3034 rx->flags |= IEEE80211_RX_BEACON_REPORTED; in ieee80211_rx_h_mgmt_check()
3037 if (ieee80211_drop_unencrypted_mgmt(rx)) in ieee80211_rx_h_mgmt_check()
3044 ieee80211_rx_h_action(struct ieee80211_rx_data *rx) in ieee80211_rx_h_action() argument
3046 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_action()
3047 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_action()
3048 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_action()
3049 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_action()
3050 int len = rx->skb->len; in ieee80211_rx_h_action()
3059 if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC && in ieee80211_rx_h_action()
3067 if (!rx->sta->sta.ht_cap.ht_supported) in ieee80211_rx_h_action()
3103 if (rx->sta->sta.smps_mode == smps_mode) in ieee80211_rx_h_action()
3105 rx->sta->sta.smps_mode = smps_mode; in ieee80211_rx_h_action()
3110 sband = rx->local->hw.wiphy->bands[status->band]; in ieee80211_rx_h_action()
3112 rate_control_rate_update(local, sband, rx->sta, in ieee80211_rx_h_action()
3115 rx->sta->addr, in ieee80211_rx_h_action()
3127 if (!(rx->sta->sta.ht_cap.cap & in ieee80211_rx_h_action()
3134 max_bw = ieee80211_sta_cap_rx_bw(rx->sta); in ieee80211_rx_h_action()
3137 rx->sta->cur_max_bandwidth = max_bw; in ieee80211_rx_h_action()
3138 new_bw = ieee80211_sta_cur_vht_bw(rx->sta); in ieee80211_rx_h_action()
3140 if (rx->sta->sta.bandwidth == new_bw) in ieee80211_rx_h_action()
3143 rx->sta->sta.bandwidth = new_bw; in ieee80211_rx_h_action()
3144 sband = rx->local->hw.wiphy->bands[status->band]; in ieee80211_rx_h_action()
3146 ieee80211_sta_rx_bw_to_chan_width(rx->sta); in ieee80211_rx_h_action()
3149 rate_control_rate_update(local, sband, rx->sta, in ieee80211_rx_h_action()
3152 rx->sta->addr, in ieee80211_rx_h_action()
3167 if (!rx->sta) in ieee80211_rx_h_action()
3341 if (rx->sta) in ieee80211_rx_h_action()
3342 rx->sta->rx_stats.packets++; in ieee80211_rx_h_action()
3343 dev_kfree_skb(rx->skb); in ieee80211_rx_h_action()
3347 skb_queue_tail(&sdata->skb_queue, rx->skb); in ieee80211_rx_h_action()
3349 if (rx->sta) in ieee80211_rx_h_action()
3350 rx->sta->rx_stats.packets++; in ieee80211_rx_h_action()
3355 ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx) in ieee80211_rx_h_userspace_mgmt() argument
3357 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_userspace_mgmt()
3371 if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM) && in ieee80211_rx_h_userspace_mgmt()
3375 if (cfg80211_rx_mgmt(&rx->sdata->wdev, status->freq, sig, in ieee80211_rx_h_userspace_mgmt()
3376 rx->skb->data, rx->skb->len, 0)) { in ieee80211_rx_h_userspace_mgmt()
3377 if (rx->sta) in ieee80211_rx_h_userspace_mgmt()
3378 rx->sta->rx_stats.packets++; in ieee80211_rx_h_userspace_mgmt()
3379 dev_kfree_skb(rx->skb); in ieee80211_rx_h_userspace_mgmt()
3387 ieee80211_rx_h_action_return(struct ieee80211_rx_data *rx) in ieee80211_rx_h_action_return() argument
3389 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_action_return()
3390 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_action_return()
3392 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_action_return()
3393 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_action_return()
3420 nskb = skb_copy_expand(rx->skb, local->hw.extra_tx_headroom, 0, in ieee80211_rx_h_action_return()
3427 memcpy(nmgmt->sa, rx->sdata->vif.addr, ETH_ALEN); in ieee80211_rx_h_action_return()
3431 if (rx->sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) { in ieee80211_rx_h_action_return()
3442 __ieee80211_tx_skb_tid_band(rx->sdata, nskb, 7, in ieee80211_rx_h_action_return()
3445 dev_kfree_skb(rx->skb); in ieee80211_rx_h_action_return()
3450 ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx) in ieee80211_rx_h_mgmt() argument
3452 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_mgmt()
3453 struct ieee80211_mgmt *mgmt = (void *)rx->skb->data; in ieee80211_rx_h_mgmt()
3502 skb_queue_tail(&sdata->skb_queue, rx->skb); in ieee80211_rx_h_mgmt()
3503 ieee80211_queue_work(&rx->local->hw, &sdata->work); in ieee80211_rx_h_mgmt()
3504 if (rx->sta) in ieee80211_rx_h_mgmt()
3505 rx->sta->rx_stats.packets++; in ieee80211_rx_h_mgmt()
3510 static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx, in ieee80211_rx_cooked_monitor() argument
3514 struct ieee80211_local *local = rx->local; in ieee80211_rx_cooked_monitor()
3515 struct sk_buff *skb = rx->skb, *skb2; in ieee80211_rx_cooked_monitor()
3524 if (rx->flags & IEEE80211_RX_CMNTR) in ieee80211_rx_cooked_monitor()
3526 rx->flags |= IEEE80211_RX_CMNTR; in ieee80211_rx_cooked_monitor()
3580 static void ieee80211_rx_handlers_result(struct ieee80211_rx_data *rx, in ieee80211_rx_handlers_result() argument
3585 I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop); in ieee80211_rx_handlers_result()
3586 if (rx->sta) in ieee80211_rx_handlers_result()
3587 rx->sta->rx_stats.dropped++; in ieee80211_rx_handlers_result()
3594 status = IEEE80211_SKB_RXCB((rx->skb)); in ieee80211_rx_handlers_result()
3596 sband = rx->local->hw.wiphy->bands[status->band]; in ieee80211_rx_handlers_result()
3600 ieee80211_rx_cooked_monitor(rx, rate); in ieee80211_rx_handlers_result()
3604 I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop); in ieee80211_rx_handlers_result()
3605 if (rx->sta) in ieee80211_rx_handlers_result()
3606 rx->sta->rx_stats.dropped++; in ieee80211_rx_handlers_result()
3607 dev_kfree_skb(rx->skb); in ieee80211_rx_handlers_result()
3610 I802_DEBUG_INC(rx->sdata->local->rx_handlers_queued); in ieee80211_rx_handlers_result()
3615 static void ieee80211_rx_handlers(struct ieee80211_rx_data *rx, in ieee80211_rx_handlers() argument
3623 res = rxh(rx); \ in ieee80211_rx_handlers()
3628 /* Lock here to avoid hitting all of the data used in the RX in ieee80211_rx_handlers()
3631 * from the timer, potentially concurrently with RX from the in ieee80211_rx_handlers()
3634 spin_lock_bh(&rx->local->rx_path_lock); in ieee80211_rx_handlers()
3642 rx->skb = skb; in ieee80211_rx_handlers()
3652 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) in ieee80211_rx_handlers()
3659 res = ieee80211_rx_h_ctrl(rx, frames); in ieee80211_rx_handlers()
3670 ieee80211_rx_handlers_result(rx, res); in ieee80211_rx_handlers()
3675 spin_unlock_bh(&rx->local->rx_path_lock); in ieee80211_rx_handlers()
3678 static void ieee80211_invoke_rx_handlers(struct ieee80211_rx_data *rx) in ieee80211_invoke_rx_handlers() argument
3687 res = rxh(rx); \ in ieee80211_invoke_rx_handlers()
3695 ieee80211_rx_reorder_ampdu(rx, &reorder_release); in ieee80211_invoke_rx_handlers()
3697 ieee80211_rx_handlers(rx, &reorder_release); in ieee80211_invoke_rx_handlers()
3701 ieee80211_rx_handlers_result(rx, res); in ieee80211_invoke_rx_handlers()
3707 * This function makes calls into the RX path, therefore
3713 struct ieee80211_rx_data rx = { in ieee80211_release_reorder_timeout() local
3740 drv_event_callback(rx.local, rx.sdata, &event); in ieee80211_release_reorder_timeout()
3743 ieee80211_rx_handlers(&rx, &frames); in ieee80211_release_reorder_timeout()
3753 struct ieee80211_rx_data rx = { in ieee80211_mark_rx_ba_filtered_frames() local
3767 rx.sta = sta; in ieee80211_mark_rx_ba_filtered_frames()
3768 rx.sdata = sta->sdata; in ieee80211_mark_rx_ba_filtered_frames()
3769 rx.local = sta->local; in ieee80211_mark_rx_ba_filtered_frames()
3818 ieee80211_rx_handlers(&rx, &frames); in ieee80211_mark_rx_ba_filtered_frames()
3827 static bool ieee80211_accept_frame(struct ieee80211_rx_data *rx) in ieee80211_accept_frame() argument
3829 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_accept_frame()
3830 struct sk_buff *skb = rx->skb; in ieee80211_accept_frame()
3840 if (ieee80211_is_robust_mgmt_frame(skb) && !rx->sta) in ieee80211_accept_frame()
3858 if (!rx->sta) { in ieee80211_accept_frame()
3878 if (!rx->sta) { in ieee80211_accept_frame()
3988 /* fast-rx doesn't do reordering */ in ieee80211_check_fast_rx()
4026 /* parallel-rx requires this, at least with calls to in ieee80211_check_fast_rx()
4061 /* we don't want to deal with MMIC in fast-rx */ in ieee80211_check_fast_rx()
4134 static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx, in ieee80211_invoke_fast_rx() argument
4137 struct sk_buff *skb = rx->skb; in ieee80211_invoke_fast_rx()
4140 struct sta_info *sta = rx->sta; in ieee80211_invoke_fast_rx()
4157 /* for parallel-rx, we need to have DUP_VALIDATED, otherwise we write in ieee80211_invoke_fast_rx()
4226 if (rx->key && !(status->flag & RX_FLAG_MIC_STRIPPED) && in ieee80211_invoke_fast_rx()
4231 ieee80211_sta_rx_notify(rx->sdata, hdr); in ieee80211_invoke_fast_rx()
4261 if (rx->key && !ieee80211_has_protected(hdr->frame_control)) in ieee80211_invoke_fast_rx()
4265 if (__ieee80211_rx_h_amsdu(rx, snap_offs - hdrlen) != in ieee80211_invoke_fast_rx()
4296 stats->msdu[rx->seqno_idx]++; in ieee80211_invoke_fast_rx()
4305 sta_info_get(rx->sdata, addrs.da)) { in ieee80211_invoke_fast_rx()
4330 if (rx->napi) in ieee80211_invoke_fast_rx()
4331 napi_gro_receive(rx->napi, skb); in ieee80211_invoke_fast_rx()
4344 * was destined for RX processing or not, which,
4348 static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx, in ieee80211_prepare_and_rx_handle() argument
4351 struct ieee80211_local *local = rx->local; in ieee80211_prepare_and_rx_handle()
4352 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_prepare_and_rx_handle()
4354 rx->skb = skb; in ieee80211_prepare_and_rx_handle()
4356 /* See if we can do fast-rx; if we have to copy we already lost, in ieee80211_prepare_and_rx_handle()
4363 if (consume && rx->sta) { in ieee80211_prepare_and_rx_handle()
4366 fast_rx = rcu_dereference(rx->sta->fast_rx); in ieee80211_prepare_and_rx_handle()
4367 if (fast_rx && ieee80211_invoke_fast_rx(rx, fast_rx)) in ieee80211_prepare_and_rx_handle()
4371 if (!ieee80211_accept_frame(rx)) in ieee80211_prepare_and_rx_handle()
4384 rx->skb = skb; in ieee80211_prepare_and_rx_handle()
4387 ieee80211_invoke_rx_handlers(rx); in ieee80211_prepare_and_rx_handle()
4392 * This is the actual Rx frames handler. as it belongs to Rx path it must
4404 struct ieee80211_rx_data rx; in __ieee80211_rx_handle_packet() local
4410 memset(&rx, 0, sizeof(rx)); in __ieee80211_rx_handle_packet()
4411 rx.skb = skb; in __ieee80211_rx_handle_packet()
4412 rx.local = local; in __ieee80211_rx_handle_packet()
4413 rx.napi = napi; in __ieee80211_rx_handle_packet()
4434 ieee80211_parse_qos(&rx); in __ieee80211_rx_handle_packet()
4435 ieee80211_verify_alignment(&rx); in __ieee80211_rx_handle_packet()
4445 rx.sta = container_of(pubsta, struct sta_info, sta); in __ieee80211_rx_handle_packet()
4446 rx.sdata = rx.sta->sdata; in __ieee80211_rx_handle_packet()
4447 if (ieee80211_prepare_and_rx_handle(&rx, skb, true)) in __ieee80211_rx_handle_packet()
4460 rx.sta = prev_sta; in __ieee80211_rx_handle_packet()
4461 rx.sdata = prev_sta->sdata; in __ieee80211_rx_handle_packet()
4462 ieee80211_prepare_and_rx_handle(&rx, skb, false); in __ieee80211_rx_handle_packet()
4468 rx.sta = prev_sta; in __ieee80211_rx_handle_packet()
4469 rx.sdata = prev_sta->sdata; in __ieee80211_rx_handle_packet()
4471 if (ieee80211_prepare_and_rx_handle(&rx, skb, true)) in __ieee80211_rx_handle_packet()
4498 rx.sta = sta_info_get_bss(prev, hdr->addr2); in __ieee80211_rx_handle_packet()
4499 rx.sdata = prev; in __ieee80211_rx_handle_packet()
4500 ieee80211_prepare_and_rx_handle(&rx, skb, false); in __ieee80211_rx_handle_packet()
4506 rx.sta = sta_info_get_bss(prev, hdr->addr2); in __ieee80211_rx_handle_packet()
4507 rx.sdata = prev; in __ieee80211_rx_handle_packet()
4509 if (ieee80211_prepare_and_rx_handle(&rx, skb, true)) in __ieee80211_rx_handle_packet()
4548 /* We might be during a HW reconfig, prevent Rx for the same reason */ in ieee80211_rx_napi()
4646 /* This is a version of the rx handler that can be called from hard irq