Lines Matching full:rx
733 * RX header they pull before we get here, and that should in ieee80211_make_monitor_skb()
809 * (2) the other RX handlers will modify the skb we got. in ieee80211_rx_monitor()
903 static void ieee80211_parse_qos(struct ieee80211_rx_data *rx) in ieee80211_parse_qos() argument
905 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_parse_qos()
906 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_parse_qos()
938 rx->seqno_idx = seqno_idx; in ieee80211_parse_qos()
939 rx->security_idx = security_idx; in ieee80211_parse_qos()
942 rx->skb->priority = (tid > 7) ? 0 : tid; in ieee80211_parse_qos()
970 static void ieee80211_verify_alignment(struct ieee80211_rx_data *rx) in ieee80211_verify_alignment() argument
973 WARN_ON_ONCE((unsigned long)rx->skb->data & 1); in ieee80211_verify_alignment()
978 /* rx handlers */
1050 static ieee80211_rx_result ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx) in ieee80211_rx_mesh_check() argument
1052 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_mesh_check()
1053 char *dev_addr = rx->sdata->vif.addr; in ieee80211_rx_mesh_check()
1074 if (!rx->sta || sta_plink_state(rx->sta) != NL80211_PLINK_ESTAB) { in ieee80211_rx_mesh_check()
1084 if (rx->skb->len < IEEE80211_MIN_ACTION_SIZE) in ieee80211_rx_mesh_check()
1178 * Timeout (in jiffies) for skb's that are waiting in the RX reorder buffer. If
1222 "release an RX reorder frame due to timeout on earlier frames\n"); in ieee80211_sta_reorder_release()
1261 * As this function belongs to the RX path it must be under
1364 static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx, in ieee80211_rx_reorder_ampdu() argument
1367 struct sk_buff *skb = rx->skb; in ieee80211_rx_reorder_ampdu()
1369 struct sta_info *sta = rx->sta; in ieee80211_rx_reorder_ampdu()
1379 * filter the QoS data rx stream according to in ieee80211_rx_reorder_ampdu()
1393 !test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && in ieee80211_rx_reorder_ampdu()
1394 !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) in ieee80211_rx_reorder_ampdu()
1395 ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, in ieee80211_rx_reorder_ampdu()
1415 /* if this mpdu is fragmented - terminate rx aggregation session */ in ieee80211_rx_reorder_ampdu()
1418 ieee80211_queue_skb_to_iface(rx->sdata, rx->link_id, NULL, skb); in ieee80211_rx_reorder_ampdu()
1424 * RX packet at a time, and thus own tid_agg_rx. All in ieee80211_rx_reorder_ampdu()
1429 if (ieee80211_sta_manage_reorder_buf(rx->sdata, tid_agg_rx, skb, in ieee80211_rx_reorder_ampdu()
1438 ieee80211_rx_h_check_dup(struct ieee80211_rx_data *rx) in ieee80211_rx_h_check_dup() argument
1440 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_check_dup()
1441 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_check_dup()
1451 if (rx->skb->len < 24) in ieee80211_rx_h_check_dup()
1458 if (!rx->sta) in ieee80211_rx_h_check_dup()
1462 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_check_dup()
1481 rx->sta->last_seq_ctrl[rx->seqno_idx] == hdr->seq_ctrl)) { in ieee80211_rx_h_check_dup()
1482 I802_DEBUG_INC(rx->local->dot11FrameDuplicateCount); in ieee80211_rx_h_check_dup()
1483 rx->link_sta->rx_stats.num_duplicates++; in ieee80211_rx_h_check_dup()
1486 rx->sta->last_seq_ctrl[rx->seqno_idx] = hdr->seq_ctrl; in ieee80211_rx_h_check_dup()
1493 ieee80211_rx_h_check(struct ieee80211_rx_data *rx) in ieee80211_rx_h_check() argument
1495 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_check()
1506 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) in ieee80211_rx_h_check()
1507 return ieee80211_rx_mesh_check(rx); in ieee80211_rx_h_check()
1511 rx->sdata->vif.type != NL80211_IFTYPE_ADHOC && in ieee80211_rx_h_check()
1512 rx->sdata->vif.type != NL80211_IFTYPE_OCB && in ieee80211_rx_h_check()
1513 (!rx->sta || !test_sta_flag(rx->sta, WLAN_STA_ASSOC)))) { in ieee80211_rx_h_check()
1519 if (rx->sta && rx->sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_rx_h_check()
1526 if (rx->skb->len < hdrlen + 8) in ieee80211_rx_h_check()
1529 skb_copy_bits(rx->skb, hdrlen + 6, ðertype, 2); in ieee80211_rx_h_check()
1530 if (ethertype == rx->sdata->control_port_protocol) in ieee80211_rx_h_check()
1534 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && in ieee80211_rx_h_check()
1535 cfg80211_rx_spurious_frame(rx->sdata->dev, hdr->addr2, in ieee80211_rx_h_check()
1536 rx->link_id, GFP_ATOMIC)) in ieee80211_rx_h_check()
1547 ieee80211_rx_h_check_more_data(struct ieee80211_rx_data *rx) in ieee80211_rx_h_check_more_data() argument
1553 local = rx->local; in ieee80211_rx_h_check_more_data()
1554 skb = rx->skb; in ieee80211_rx_h_check_more_data()
1574 ieee80211_send_pspoll(local, rx->sdata); in ieee80211_rx_h_check_more_data()
1704 ieee80211_rx_h_uapsd_and_pspoll(struct ieee80211_rx_data *rx) in ieee80211_rx_h_uapsd_and_pspoll() argument
1706 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_uapsd_and_pspoll()
1707 struct ieee80211_hdr *hdr = (void *)rx->skb->data; in ieee80211_rx_h_uapsd_and_pspoll()
1708 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_uapsd_and_pspoll()
1710 if (!rx->sta) in ieee80211_rx_h_uapsd_and_pspoll()
1730 if (!test_sta_flag(rx->sta, WLAN_STA_PS_STA)) in ieee80211_rx_h_uapsd_and_pspoll()
1734 ieee80211_sta_pspoll(&rx->sta->sta); in ieee80211_rx_h_uapsd_and_pspoll()
1738 dev_kfree_skb(rx->skb); in ieee80211_rx_h_uapsd_and_pspoll()
1748 ieee80211_sta_uapsd_trigger(&rx->sta->sta, tid); in ieee80211_rx_h_uapsd_and_pspoll()
1755 ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx) in ieee80211_rx_h_sta_process() argument
1757 struct sta_info *sta = rx->sta; in ieee80211_rx_h_sta_process()
1758 struct link_sta_info *link_sta = rx->link_sta; in ieee80211_rx_h_sta_process()
1759 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_sta_process()
1775 if (rx->sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_rx_h_sta_process()
1776 u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len, in ieee80211_rx_h_sta_process()
1778 if (ether_addr_equal(bssid, rx->sdata->u.ibss.bssid) && in ieee80211_rx_h_sta_process()
1786 } else if (rx->sdata->vif.type == NL80211_IFTYPE_OCB) { in ieee80211_rx_h_sta_process()
1802 link_sta->rx_stats.bytes += rx->skb->len; in ieee80211_rx_h_sta_process()
1839 (rx->sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_rx_h_sta_process()
1840 rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) { in ieee80211_rx_h_sta_process()
1851 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) in ieee80211_rx_h_sta_process()
1859 I802_DEBUG_INC(rx->local->rx_handlers_drop_nullfunc); in ieee80211_rx_h_sta_process()
1868 (rx->sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_rx_h_sta_process()
1869 (rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_sta_process()
1870 !rx->sdata->u.vlan.sta))) { in ieee80211_rx_h_sta_process()
1873 rx->sdata->dev, sta->sta.addr, in ieee80211_rx_h_sta_process()
1874 rx->link_id, GFP_ATOMIC); in ieee80211_rx_h_sta_process()
1882 dev_kfree_skb(rx->skb); in ieee80211_rx_h_sta_process()
1890 ieee80211_rx_get_bigtk(struct ieee80211_rx_data *rx, int idx) in ieee80211_rx_get_bigtk() argument
1911 if (rx->link_sta) in ieee80211_rx_get_bigtk()
1912 key = rcu_dereference(rx->link_sta->gtk[idx]); in ieee80211_rx_get_bigtk()
1914 key = rcu_dereference(rx->link->gtk[idx]); in ieee80211_rx_get_bigtk()
1915 if (!key && rx->link_sta) in ieee80211_rx_get_bigtk()
1916 key = rcu_dereference(rx->link_sta->gtk[idx2]); in ieee80211_rx_get_bigtk()
1918 key = rcu_dereference(rx->link->gtk[idx2]); in ieee80211_rx_get_bigtk()
1924 ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx) in ieee80211_rx_h_decrypt() argument
1926 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_decrypt()
1968 rx->key = NULL; in ieee80211_rx_h_decrypt()
1971 if (rx->sta) { in ieee80211_rx_h_decrypt()
1972 int keyid = rx->sta->ptk_idx; in ieee80211_rx_h_decrypt()
1973 sta_ptk = rcu_dereference(rx->sta->ptk[keyid]); in ieee80211_rx_h_decrypt()
1977 keyid = ieee80211_get_keyid(rx->skb); in ieee80211_rx_h_decrypt()
1982 ptk_idx = rcu_dereference(rx->sta->ptk[keyid]); in ieee80211_rx_h_decrypt()
1987 mmie_keyidx = ieee80211_get_mmie_keyidx(rx->skb); in ieee80211_rx_h_decrypt()
1990 rx->key = ptk_idx ? ptk_idx : sta_ptk; in ieee80211_rx_h_decrypt()
2006 if (rx->sdata->dev) in ieee80211_rx_h_decrypt()
2007 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_rx_h_decrypt()
2013 rx->key = ieee80211_rx_get_bigtk(rx, mmie_keyidx); in ieee80211_rx_h_decrypt()
2014 if (!rx->key) in ieee80211_rx_h_decrypt()
2025 if (rx->link_sta) { in ieee80211_rx_h_decrypt()
2027 test_sta_flag(rx->sta, WLAN_STA_MFP)) in ieee80211_rx_h_decrypt()
2030 rx->key = rcu_dereference(rx->link_sta->gtk[mmie_keyidx]); in ieee80211_rx_h_decrypt()
2032 if (!rx->key) in ieee80211_rx_h_decrypt()
2033 rx->key = rcu_dereference(rx->link->gtk[mmie_keyidx]); in ieee80211_rx_h_decrypt()
2037 * need to set rx->key if there is a key that could have been in ieee80211_rx_h_decrypt()
2045 key = ieee80211_rx_get_bigtk(rx, -1); in ieee80211_rx_h_decrypt()
2048 key = rcu_dereference(rx->link->default_mgmt_key); in ieee80211_rx_h_decrypt()
2050 if (rx->link_sta) { in ieee80211_rx_h_decrypt()
2052 key = rcu_dereference(rx->link_sta->gtk[i]); in ieee80211_rx_h_decrypt()
2059 key = rcu_dereference(rx->link->gtk[i]); in ieee80211_rx_h_decrypt()
2066 rx->key = key; in ieee80211_rx_h_decrypt()
2082 keyidx = ieee80211_get_keyid(rx->skb); in ieee80211_rx_h_decrypt()
2088 if (is_multicast_ether_addr(hdr->addr1) && rx->link_sta) in ieee80211_rx_h_decrypt()
2089 rx->key = rcu_dereference(rx->link_sta->gtk[keyidx]); in ieee80211_rx_h_decrypt()
2092 if (!rx->key) { in ieee80211_rx_h_decrypt()
2094 rx->key = rcu_dereference(rx->link->gtk[keyidx]); in ieee80211_rx_h_decrypt()
2095 if (!rx->key) in ieee80211_rx_h_decrypt()
2096 rx->key = rcu_dereference(rx->sdata->keys[keyidx]); in ieee80211_rx_h_decrypt()
2103 if (rx->key && in ieee80211_rx_h_decrypt()
2104 rx->key->conf.cipher != WLAN_CIPHER_SUITE_WEP40 && in ieee80211_rx_h_decrypt()
2105 rx->key->conf.cipher != WLAN_CIPHER_SUITE_WEP104 && in ieee80211_rx_h_decrypt()
2107 rx->key = NULL; in ieee80211_rx_h_decrypt()
2111 if (rx->key) { in ieee80211_rx_h_decrypt()
2112 if (unlikely(rx->key->flags & KEY_FLAG_TAINTED)) in ieee80211_rx_h_decrypt()
2120 switch (rx->key->conf.cipher) { in ieee80211_rx_h_decrypt()
2123 result = ieee80211_crypto_wep_decrypt(rx); in ieee80211_rx_h_decrypt()
2126 result = ieee80211_crypto_tkip_decrypt(rx); in ieee80211_rx_h_decrypt()
2130 rx, IEEE80211_CCMP_MIC_LEN); in ieee80211_rx_h_decrypt()
2134 rx, IEEE80211_CCMP_256_MIC_LEN); in ieee80211_rx_h_decrypt()
2137 result = ieee80211_crypto_aes_cmac_decrypt(rx); in ieee80211_rx_h_decrypt()
2140 result = ieee80211_crypto_aes_cmac_256_decrypt(rx); in ieee80211_rx_h_decrypt()
2144 result = ieee80211_crypto_aes_gmac_decrypt(rx); in ieee80211_rx_h_decrypt()
2148 result = ieee80211_crypto_gcmp_decrypt(rx); in ieee80211_rx_h_decrypt()
2160 rx->sdata->dev)) in ieee80211_rx_h_decrypt()
2161 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_rx_h_decrypt()
2253 static bool requires_sequential_pn(struct ieee80211_rx_data *rx, __le16 fc) in requires_sequential_pn() argument
2255 return rx->key && in requires_sequential_pn()
2256 (rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP || in requires_sequential_pn()
2257 rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256 || in requires_sequential_pn()
2258 rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP || in requires_sequential_pn()
2259 rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP_256) && in requires_sequential_pn()
2264 ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) in ieee80211_rx_h_defragment() argument
2266 struct ieee80211_fragment_cache *cache = &rx->sdata->frags; in ieee80211_rx_h_defragment()
2273 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_defragment()
2275 hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_defragment()
2284 if (rx->sta) in ieee80211_rx_h_defragment()
2285 cache = &rx->sta->frags; in ieee80211_rx_h_defragment()
2293 I802_DEBUG_INC(rx->local->rx_handlers_fragments); in ieee80211_rx_h_defragment()
2295 if (skb_linearize(rx->skb)) in ieee80211_rx_h_defragment()
2303 hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_defragment()
2309 rx->seqno_idx, &(rx->skb)); in ieee80211_rx_h_defragment()
2310 if (requires_sequential_pn(rx, fc)) { in ieee80211_rx_h_defragment()
2311 int queue = rx->security_idx; in ieee80211_rx_h_defragment()
2318 entry->key_color = rx->key->color; in ieee80211_rx_h_defragment()
2320 rx->key->u.ccmp.rx_pn[queue], in ieee80211_rx_h_defragment()
2326 BUILD_BUG_ON(sizeof(rx->key->u.ccmp.rx_pn[queue]) != in ieee80211_rx_h_defragment()
2327 sizeof(rx->key->u.gcmp.rx_pn[queue])); in ieee80211_rx_h_defragment()
2330 } else if (rx->key && in ieee80211_rx_h_defragment()
2334 entry->key_color = rx->key->color; in ieee80211_rx_h_defragment()
2343 rx->seqno_idx, hdr); in ieee80211_rx_h_defragment()
2345 I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag); in ieee80211_rx_h_defragment()
2358 if (!requires_sequential_pn(rx, fc)) in ieee80211_rx_h_defragment()
2362 if (entry->key_color != rx->key->color) in ieee80211_rx_h_defragment()
2372 rpn = rx->ccm_gcm.pn; in ieee80211_rx_h_defragment()
2377 (!rx->key || in ieee80211_rx_h_defragment()
2380 rx->key->color != entry->key_color)) { in ieee80211_rx_h_defragment()
2386 } else if (entry->is_protected && rx->key && in ieee80211_rx_h_defragment()
2387 entry->key_color != rx->key->color && in ieee80211_rx_h_defragment()
2392 skb_pull(rx->skb, ieee80211_hdrlen(fc)); in ieee80211_rx_h_defragment()
2393 __skb_queue_tail(&entry->skb_list, rx->skb); in ieee80211_rx_h_defragment()
2395 entry->extra_len += rx->skb->len; in ieee80211_rx_h_defragment()
2397 rx->skb = NULL; in ieee80211_rx_h_defragment()
2401 rx->skb = __skb_dequeue(&entry->skb_list); in ieee80211_rx_h_defragment()
2402 if (skb_tailroom(rx->skb) < entry->extra_len) { in ieee80211_rx_h_defragment()
2403 I802_DEBUG_INC(rx->local->rx_expand_skb_head_defrag); in ieee80211_rx_h_defragment()
2404 if (unlikely(pskb_expand_head(rx->skb, 0, entry->extra_len, in ieee80211_rx_h_defragment()
2406 I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag); in ieee80211_rx_h_defragment()
2412 skb_put_data(rx->skb, skb->data, skb->len); in ieee80211_rx_h_defragment()
2417 ieee80211_led_rx(rx->local); in ieee80211_rx_h_defragment()
2418 if (rx->sta) in ieee80211_rx_h_defragment()
2419 rx->link_sta->rx_stats.packets++; in ieee80211_rx_h_defragment()
2423 static int ieee80211_802_1x_port_control(struct ieee80211_rx_data *rx) in ieee80211_802_1x_port_control() argument
2425 if (unlikely(!rx->sta || !test_sta_flag(rx->sta, WLAN_STA_AUTHORIZED))) in ieee80211_802_1x_port_control()
2431 static int ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc) in ieee80211_drop_unencrypted() argument
2433 struct sk_buff *skb = rx->skb; in ieee80211_drop_unencrypted()
2446 ieee80211_is_data(fc) && rx->key)) in ieee80211_drop_unencrypted()
2453 ieee80211_drop_unencrypted_mgmt(struct ieee80211_rx_data *rx) in ieee80211_drop_unencrypted_mgmt() argument
2455 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_drop_unencrypted_mgmt()
2456 struct ieee80211_mgmt *mgmt = (void *)rx->skb->data; in ieee80211_drop_unencrypted_mgmt()
2471 if (rx->sta && test_sta_flag(rx->sta, WLAN_STA_MFP)) { in ieee80211_drop_unencrypted_mgmt()
2473 ieee80211_is_unicast_robust_mgmt_frame(rx->skb))) { in ieee80211_drop_unencrypted_mgmt()
2480 if (!rx->key) 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()
2490 if (unlikely(ieee80211_is_multicast_robust_mgmt_frame(rx->skb) && in ieee80211_drop_unencrypted_mgmt()
2491 ieee80211_get_mmie_keyidx(rx->skb) < 0)) { in ieee80211_drop_unencrypted_mgmt()
2494 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_drop_unencrypted_mgmt()
2495 rx->skb->data, in ieee80211_drop_unencrypted_mgmt()
2496 rx->skb->len); in ieee80211_drop_unencrypted_mgmt()
2499 if (unlikely(ieee80211_is_beacon(fc) && rx->key && in ieee80211_drop_unencrypted_mgmt()
2500 ieee80211_get_mmie_keyidx(rx->skb) < 0)) { in ieee80211_drop_unencrypted_mgmt()
2501 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev, in ieee80211_drop_unencrypted_mgmt()
2502 rx->skb->data, in ieee80211_drop_unencrypted_mgmt()
2503 rx->skb->len); in ieee80211_drop_unencrypted_mgmt()
2510 if (unlikely(ieee80211_is_action(fc) && !rx->key && in ieee80211_drop_unencrypted_mgmt()
2511 ieee80211_is_robust_mgmt_frame(rx->skb))) in ieee80211_drop_unencrypted_mgmt()
2516 ieee80211_is_protected_dual_of_public_action(rx->skb)) in ieee80211_drop_unencrypted_mgmt()
2525 ieee80211_is_robust_mgmt_frame(rx->skb) && in ieee80211_drop_unencrypted_mgmt()
2526 (!rx->sta || !test_sta_flag(rx->sta, WLAN_STA_ASSOC))) in ieee80211_drop_unencrypted_mgmt()
2534 __ieee80211_data_to_8023(struct ieee80211_rx_data *rx, bool *port_control) in __ieee80211_data_to_8023() argument
2536 struct ieee80211_sub_if_data *sdata = rx->sdata; in __ieee80211_data_to_8023()
2537 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in __ieee80211_data_to_8023()
2559 ret = ieee80211_data_to_8023(rx->skb, sdata->vif.addr, sdata->vif.type); in __ieee80211_data_to_8023()
2563 ehdr = (struct ethhdr *) rx->skb->data; in __ieee80211_data_to_8023()
2564 if (ehdr->h_proto == rx->sdata->control_port_protocol) in __ieee80211_data_to_8023()
2602 * requires that rx->skb is a frame with ethernet header
2604 static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx, __le16 fc) in ieee80211_frame_allowed() argument
2608 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; in ieee80211_frame_allowed()
2615 if (unlikely(ehdr->h_proto == rx->sdata->control_port_protocol)) in ieee80211_frame_allowed()
2616 return ieee80211_is_our_addr(rx->sdata, ehdr->h_dest, NULL) || in ieee80211_frame_allowed()
2619 if (ieee80211_802_1x_port_control(rx) || in ieee80211_frame_allowed()
2620 ieee80211_drop_unencrypted(rx, fc)) in ieee80211_frame_allowed()
2627 struct ieee80211_rx_data *rx) in ieee80211_deliver_skb_to_local_stack() argument
2629 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_deliver_skb_to_local_stack()
2639 cfg80211_rx_control_port(dev, skb, noencrypt, rx->link_id); in ieee80211_deliver_skb_to_local_stack()
2666 if (rx->list) in ieee80211_deliver_skb_to_local_stack()
2667 list_add_tail(&skb->list, rx->list); in ieee80211_deliver_skb_to_local_stack()
2674 * requires that rx->skb is a frame with ethernet header
2677 ieee80211_deliver_skb(struct ieee80211_rx_data *rx) in ieee80211_deliver_skb() argument
2679 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_deliver_skb()
2682 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; in ieee80211_deliver_skb()
2685 skb = rx->skb; in ieee80211_deliver_skb()
2690 if (rx->sta) { in ieee80211_deliver_skb()
2696 u64_stats_update_begin(&rx->link_sta->rx_stats.syncp); in ieee80211_deliver_skb()
2697 rx->link_sta->rx_stats.msdu[rx->seqno_idx]++; in ieee80211_deliver_skb()
2698 u64_stats_update_end(&rx->link_sta->rx_stats.syncp); in ieee80211_deliver_skb()
2704 ehdr->h_proto != rx->sdata->control_port_protocol && in ieee80211_deliver_skb()
2760 ieee80211_deliver_skb_to_local_stack(skb, rx); in ieee80211_deliver_skb()
3028 __ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx, u8 data_offset) in __ieee80211_rx_h_amsdu() argument
3030 struct net_device *dev = rx->sdata->dev; in __ieee80211_rx_h_amsdu()
3031 struct sk_buff *skb = rx->skb; in __ieee80211_rx_h_amsdu()
3041 } else switch (rx->sdata->vif.type) { in __ieee80211_rx_h_amsdu()
3047 if (!test_sta_flag(rx->sta, WLAN_STA_TDLS_PEER)) in __ieee80211_rx_h_amsdu()
3062 rx->sdata->vif.addr, in __ieee80211_rx_h_amsdu()
3063 rx->sdata->vif.type, in __ieee80211_rx_h_amsdu()
3067 if (rx->sta->amsdu_mesh_control < 0) { in __ieee80211_rx_h_amsdu()
3084 rx->sta->amsdu_mesh_control = valid; in __ieee80211_rx_h_amsdu()
3088 rx->sdata->vif.type, in __ieee80211_rx_h_amsdu()
3089 rx->local->hw.extra_tx_headroom, in __ieee80211_rx_h_amsdu()
3091 rx->sta->amsdu_mesh_control); in __ieee80211_rx_h_amsdu()
3094 rx->skb = __skb_dequeue(&frame_list); in __ieee80211_rx_h_amsdu()
3096 switch (ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb)) { in __ieee80211_rx_h_amsdu()
3100 if (ieee80211_frame_allowed(rx, fc)) { in __ieee80211_rx_h_amsdu()
3101 ieee80211_deliver_skb(rx); in __ieee80211_rx_h_amsdu()
3106 dev_kfree_skb(rx->skb); in __ieee80211_rx_h_amsdu()
3114 ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx) in ieee80211_rx_h_amsdu() argument
3116 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_amsdu()
3131 switch (rx->sdata->vif.type) { in ieee80211_rx_h_amsdu()
3133 if (!rx->sdata->u.vlan.sta) in ieee80211_rx_h_amsdu()
3137 if (!rx->sdata->u.mgd.use_4addr) in ieee80211_rx_h_amsdu()
3147 if (is_multicast_ether_addr(hdr->addr1) || !rx->sta) in ieee80211_rx_h_amsdu()
3150 if (rx->key) { in ieee80211_rx_h_amsdu()
3157 switch (rx->key->conf.cipher) { in ieee80211_rx_h_amsdu()
3167 return __ieee80211_rx_h_amsdu(rx, 0); in ieee80211_rx_h_amsdu()
3171 ieee80211_rx_h_data(struct ieee80211_rx_data *rx) in ieee80211_rx_h_data() argument
3173 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_data()
3174 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_data()
3176 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_rx_h_data()
3190 if (rx->sta && in ieee80211_rx_h_data()
3191 !test_and_set_sta_flag(rx->sta, WLAN_STA_4ADDR_EVENT)) in ieee80211_rx_h_data()
3193 rx->sdata->dev, rx->sta->sta.addr, rx->link_id, in ieee80211_rx_h_data()
3198 res = __ieee80211_data_to_8023(rx, &port_control); in ieee80211_rx_h_data()
3202 res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb); in ieee80211_rx_h_data()
3206 if (!ieee80211_frame_allowed(rx, fc)) in ieee80211_rx_h_data()
3210 if (unlikely(((struct ethhdr *)rx->skb->data)->h_proto == in ieee80211_rx_h_data()
3212 struct ieee80211_tdls_data *tf = (void *)rx->skb->data; in ieee80211_rx_h_data()
3214 if (pskb_may_pull(rx->skb, in ieee80211_rx_h_data()
3220 rx->skb->protocol = cpu_to_be16(ETH_P_TDLS); in ieee80211_rx_h_data()
3221 __ieee80211_queue_skb_to_iface(sdata, rx->link_id, in ieee80211_rx_h_data()
3222 rx->sta, rx->skb); in ieee80211_rx_h_data()
3227 if (rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_rx_h_data()
3232 rx->sdata = sdata; in ieee80211_rx_h_data()
3235 rx->skb->dev = dev; in ieee80211_rx_h_data()
3240 ((struct ethhdr *)rx->skb->data)->h_dest) && in ieee80211_rx_h_data()
3246 ieee80211_deliver_skb(rx); in ieee80211_rx_h_data()
3252 ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx, struct sk_buff_head *frames) in ieee80211_rx_h_ctrl() argument
3254 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_ctrl()
3271 if (!rx->sta) in ieee80211_rx_h_ctrl()
3280 if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && in ieee80211_rx_h_ctrl()
3281 !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) in ieee80211_rx_h_ctrl()
3282 ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, in ieee80211_rx_h_ctrl()
3286 tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]); in ieee80211_rx_h_ctrl()
3293 event.u.ba.sta = &rx->sta->sta; in ieee80211_rx_h_ctrl()
3302 ieee80211_release_reorder_frames(rx->sdata, tid_agg_rx, in ieee80211_rx_h_ctrl()
3306 drv_event_callback(rx->local, rx->sdata, &event); in ieee80211_rx_h_ctrl()
3361 ieee80211_rx_check_bss_color_collision(struct ieee80211_rx_data *rx) in ieee80211_rx_check_bss_color_collision() argument
3363 struct ieee80211_mgmt *mgmt = (void *)rx->skb->data; in ieee80211_rx_check_bss_color_collision()
3368 if (!wiphy_ext_feature_isset(rx->local->hw.wiphy, in ieee80211_rx_check_bss_color_collision()
3372 if (ieee80211_hw_check(&rx->local->hw, DETECTS_COLOR_COLLISION)) in ieee80211_rx_check_bss_color_collision()
3375 bss_conf = rx->link->conf; in ieee80211_rx_check_bss_color_collision()
3380 baselen = mgmt->u.beacon.variable - rx->skb->data; in ieee80211_rx_check_bss_color_collision()
3381 if (baselen > rx->skb->len) in ieee80211_rx_check_bss_color_collision()
3386 rx->skb->len - baselen); in ieee80211_rx_check_bss_color_collision()
3400 ieee80211_obss_color_collision_notify(&rx->sdata->vif, in ieee80211_rx_check_bss_color_collision()
3407 ieee80211_rx_h_mgmt_check(struct ieee80211_rx_data *rx) in ieee80211_rx_h_mgmt_check() argument
3409 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_mgmt_check()
3410 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_mgmt_check()
3420 if (rx->skb->len < 24) in ieee80211_rx_h_mgmt_check()
3428 rx->skb->len < IEEE80211_MIN_ACTION_SIZE) in ieee80211_rx_h_mgmt_check()
3431 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && in ieee80211_rx_h_mgmt_check()
3433 !(rx->flags & IEEE80211_RX_BEACON_REPORTED)) { in ieee80211_rx_h_mgmt_check()
3437 ieee80211_rx_check_bss_color_collision(rx); in ieee80211_rx_h_mgmt_check()
3439 if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM) && in ieee80211_rx_h_mgmt_check()
3443 cfg80211_report_obss_beacon_khz(rx->local->hw.wiphy, in ieee80211_rx_h_mgmt_check()
3444 rx->skb->data, rx->skb->len, in ieee80211_rx_h_mgmt_check()
3447 rx->flags |= IEEE80211_RX_BEACON_REPORTED; in ieee80211_rx_h_mgmt_check()
3450 return ieee80211_drop_unencrypted_mgmt(rx); in ieee80211_rx_h_mgmt_check()
3454 ieee80211_process_rx_twt_action(struct ieee80211_rx_data *rx) in ieee80211_process_rx_twt_action() argument
3456 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)rx->skb->data; in ieee80211_process_rx_twt_action()
3457 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_process_rx_twt_action()
3463 if (!rx->local->ops->add_twt_setup) in ieee80211_process_rx_twt_action()
3469 if (!rx->sta) in ieee80211_process_rx_twt_action()
3476 if (rx->skb->len < IEEE80211_MIN_ACTION_SIZE + in ieee80211_process_rx_twt_action()
3486 if (rx->skb->len < IEEE80211_MIN_ACTION_SIZE + in ieee80211_process_rx_twt_action()
3494 if (rx->skb->len < IEEE80211_MIN_ACTION_SIZE + 2) in ieee80211_process_rx_twt_action()
3506 ieee80211_rx_h_action(struct ieee80211_rx_data *rx) in ieee80211_rx_h_action() argument
3508 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_action()
3509 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_action()
3510 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_action()
3511 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_action()
3512 int len = rx->skb->len; in ieee80211_rx_h_action()
3517 if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC && in ieee80211_rx_h_action()
3525 if (!rx->link_sta->pub->ht_cap.ht_supported) in ieee80211_rx_h_action()
3565 if (rx->link_sta->pub->smps_mode == smps_mode) in ieee80211_rx_h_action()
3567 rx->link_sta->pub->smps_mode = smps_mode; in ieee80211_rx_h_action()
3572 sband = rx->local->hw.wiphy->bands[status->band]; in ieee80211_rx_h_action()
3574 rate_control_rate_update(local, sband, rx->link_sta, in ieee80211_rx_h_action()
3577 rx->sta->addr, in ieee80211_rx_h_action()
3590 if (!(rx->link_sta->pub->ht_cap.cap & in ieee80211_rx_h_action()
3607 if (!rx->sta) in ieee80211_rx_h_action()
3766 if (ieee80211_process_rx_twt_action(rx)) in ieee80211_rx_h_action()
3846 if (rx->sta) in ieee80211_rx_h_action()
3847 rx->link_sta->rx_stats.packets++; in ieee80211_rx_h_action()
3848 dev_kfree_skb(rx->skb); in ieee80211_rx_h_action()
3852 ieee80211_queue_skb_to_iface(sdata, rx->link_id, rx->sta, rx->skb); in ieee80211_rx_h_action()
3857 ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx) in ieee80211_rx_h_userspace_mgmt() argument
3859 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_userspace_mgmt()
3862 .buf = rx->skb->data, in ieee80211_rx_h_userspace_mgmt()
3863 .len = rx->skb->len, in ieee80211_rx_h_userspace_mgmt()
3864 .link_id = rx->link_id, in ieee80211_rx_h_userspace_mgmt()
3865 .have_link_id = rx->link_id >= 0, in ieee80211_rx_h_userspace_mgmt()
3879 if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM) && in ieee80211_rx_h_userspace_mgmt()
3883 if (ieee80211_is_timing_measurement(rx->skb) || in ieee80211_rx_h_userspace_mgmt()
3884 ieee80211_is_ftm(rx->skb)) { in ieee80211_rx_h_userspace_mgmt()
3885 info.rx_tstamp = ktime_to_ns(skb_hwtstamps(rx->skb)->hwtstamp); in ieee80211_rx_h_userspace_mgmt()
3889 if (cfg80211_rx_mgmt_ext(&rx->sdata->wdev, &info)) { in ieee80211_rx_h_userspace_mgmt()
3890 if (rx->sta) in ieee80211_rx_h_userspace_mgmt()
3891 rx->link_sta->rx_stats.packets++; in ieee80211_rx_h_userspace_mgmt()
3892 dev_kfree_skb(rx->skb); in ieee80211_rx_h_userspace_mgmt()
3900 ieee80211_rx_h_action_post_userspace(struct ieee80211_rx_data *rx) in ieee80211_rx_h_action_post_userspace() argument
3902 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_action_post_userspace()
3903 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_action_post_userspace()
3904 int len = rx->skb->len; in ieee80211_rx_h_action_post_userspace()
3928 if (rx->sta) in ieee80211_rx_h_action_post_userspace()
3929 rx->link_sta->rx_stats.packets++; in ieee80211_rx_h_action_post_userspace()
3930 dev_kfree_skb(rx->skb); in ieee80211_rx_h_action_post_userspace()
3935 ieee80211_rx_h_action_return(struct ieee80211_rx_data *rx) in ieee80211_rx_h_action_return() argument
3937 struct ieee80211_local *local = rx->local; in ieee80211_rx_h_action_return()
3938 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; in ieee80211_rx_h_action_return()
3940 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_action_return()
3941 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_h_action_return()
3967 nskb = skb_copy_expand(rx->skb, local->hw.extra_tx_headroom, 0, in ieee80211_rx_h_action_return()
3974 memcpy(nmgmt->sa, rx->sdata->vif.addr, ETH_ALEN); in ieee80211_rx_h_action_return()
3978 if (rx->sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) { in ieee80211_rx_h_action_return()
3989 __ieee80211_tx_skb_tid_band(rx->sdata, nskb, 7, -1, in ieee80211_rx_h_action_return()
3997 ieee80211_rx_h_ext(struct ieee80211_rx_data *rx) in ieee80211_rx_h_ext() argument
3999 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_ext()
4000 struct ieee80211_hdr *hdr = (void *)rx->skb->data; in ieee80211_rx_h_ext()
4009 ieee80211_queue_skb_to_iface(sdata, rx->link_id, rx->sta, rx->skb); in ieee80211_rx_h_ext()
4015 ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx) in ieee80211_rx_h_mgmt() argument
4017 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_rx_h_mgmt()
4018 struct ieee80211_mgmt *mgmt = (void *)rx->skb->data; in ieee80211_rx_h_mgmt()
4066 ieee80211_queue_skb_to_iface(sdata, rx->link_id, rx->sta, rx->skb); in ieee80211_rx_h_mgmt()
4071 static void ieee80211_rx_handlers_result(struct ieee80211_rx_data *rx, in ieee80211_rx_handlers_result() argument
4075 I802_DEBUG_INC(rx->sdata->local->rx_handlers_queued); in ieee80211_rx_handlers_result()
4080 I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop); in ieee80211_rx_handlers_result()
4081 if (rx->sta) in ieee80211_rx_handlers_result()
4082 rx->link_sta->rx_stats.dropped++; in ieee80211_rx_handlers_result()
4085 kfree_skb_reason(rx->skb, (__force u32)res); in ieee80211_rx_handlers_result()
4088 static void ieee80211_rx_handlers(struct ieee80211_rx_data *rx, in ieee80211_rx_handlers() argument
4096 res = rxh(rx); \ in ieee80211_rx_handlers()
4101 /* Lock here to avoid hitting all of the data used in the RX in ieee80211_rx_handlers()
4104 * from the timer, potentially concurrently with RX from the in ieee80211_rx_handlers()
4107 spin_lock_bh(&rx->local->rx_path_lock); in ieee80211_rx_handlers()
4115 rx->skb = skb; in ieee80211_rx_handlers()
4117 if (WARN_ON_ONCE(!rx->link)) in ieee80211_rx_handlers()
4131 res = ieee80211_rx_h_ctrl(rx, frames); in ieee80211_rx_handlers()
4144 ieee80211_rx_handlers_result(rx, res); in ieee80211_rx_handlers()
4149 spin_unlock_bh(&rx->local->rx_path_lock); in ieee80211_rx_handlers()
4152 static void ieee80211_invoke_rx_handlers(struct ieee80211_rx_data *rx) in ieee80211_invoke_rx_handlers() argument
4161 res = rxh(rx); \ in ieee80211_invoke_rx_handlers()
4169 ieee80211_rx_reorder_ampdu(rx, &reorder_release); in ieee80211_invoke_rx_handlers()
4171 ieee80211_rx_handlers(rx, &reorder_release); in ieee80211_invoke_rx_handlers()
4175 ieee80211_rx_handlers_result(rx, res); in ieee80211_invoke_rx_handlers()
4186 static bool ieee80211_rx_data_set_link(struct ieee80211_rx_data *rx, in ieee80211_rx_data_set_link() argument
4189 rx->link_id = link_id; in ieee80211_rx_data_set_link()
4190 rx->link = rcu_dereference(rx->sdata->link[link_id]); in ieee80211_rx_data_set_link()
4192 if (!rx->sta) in ieee80211_rx_data_set_link()
4193 return rx->link; in ieee80211_rx_data_set_link()
4195 if (!ieee80211_rx_is_valid_sta_link_id(&rx->sta->sta, link_id)) in ieee80211_rx_data_set_link()
4198 rx->link_sta = rcu_dereference(rx->sta->link[link_id]); in ieee80211_rx_data_set_link()
4200 return rx->link && rx->link_sta; in ieee80211_rx_data_set_link()
4203 static bool ieee80211_rx_data_set_sta(struct ieee80211_rx_data *rx, in ieee80211_rx_data_set_sta() argument
4206 rx->link_id = link_id; in ieee80211_rx_data_set_sta()
4207 rx->sta = sta; in ieee80211_rx_data_set_sta()
4210 rx->local = sta->sdata->local; in ieee80211_rx_data_set_sta()
4211 if (!rx->sdata) in ieee80211_rx_data_set_sta()
4212 rx->sdata = sta->sdata; in ieee80211_rx_data_set_sta()
4213 rx->link_sta = &sta->deflink; in ieee80211_rx_data_set_sta()
4215 rx->link_sta = NULL; in ieee80211_rx_data_set_sta()
4219 if (ieee80211_vif_is_mld(&rx->sdata->vif) && in ieee80211_rx_data_set_sta()
4221 rx->link = in ieee80211_rx_data_set_sta()
4222 rcu_dereference(rx->sdata->link[sta->deflink.link_id]); in ieee80211_rx_data_set_sta()
4224 rx->link = &rx->sdata->deflink; in ieee80211_rx_data_set_sta()
4225 } else if (!ieee80211_rx_data_set_link(rx, link_id)) { in ieee80211_rx_data_set_sta()
4233 * This function makes calls into the RX path, therefore
4239 struct ieee80211_rx_data rx = { in ieee80211_release_reorder_timeout() local
4251 if (!ieee80211_rx_data_set_sta(&rx, sta, link_id)) in ieee80211_release_reorder_timeout()
4270 drv_event_callback(rx.local, rx.sdata, &event); in ieee80211_release_reorder_timeout()
4273 ieee80211_rx_handlers(&rx, &frames); in ieee80211_release_reorder_timeout()
4284 struct ieee80211_rx_data rx = { in ieee80211_mark_rx_ba_filtered_frames() local
4300 "RX BA marker can't support max_rx_aggregation_subframes %u > 64\n", in ieee80211_mark_rx_ba_filtered_frames()
4303 if (!ieee80211_rx_data_set_sta(&rx, sta, -1)) in ieee80211_mark_rx_ba_filtered_frames()
4353 ieee80211_rx_handlers(&rx, &frames); in ieee80211_mark_rx_ba_filtered_frames()
4368 static bool ieee80211_accept_frame(struct ieee80211_rx_data *rx) in ieee80211_accept_frame() argument
4370 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_accept_frame()
4371 struct sk_buff *skb = rx->skb; in ieee80211_accept_frame()
4383 ieee80211_is_robust_mgmt_frame(skb) && !rx->sta) in ieee80211_accept_frame()
4387 return ieee80211_is_our_addr(sdata, hdr->addr1, &rx->link_id); in ieee80211_accept_frame()
4402 if (!rx->sta) { in ieee80211_accept_frame()
4426 if (!rx->sta) { in ieee80211_accept_frame()
4446 &rx->link_id); in ieee80211_accept_frame()
4458 &rx->link_id)) in ieee80211_accept_frame()
4548 /* fast-rx doesn't do reordering */ in ieee80211_check_fast_rx()
4585 /* parallel-rx requires this, at least with calls to in ieee80211_check_fast_rx()
4628 /* we don't want to deal with MMIC in fast-rx */ in ieee80211_check_fast_rx()
4712 static void ieee80211_rx_8023(struct ieee80211_rx_data *rx, in ieee80211_rx_8023() argument
4717 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_rx_8023()
4718 struct sta_info *sta = rx->sta; in ieee80211_rx_8023()
4720 struct sk_buff *skb = rx->skb; in ieee80211_rx_8023()
4724 if (rx->link_id >= 0) { in ieee80211_rx_8023()
4725 link_sta = rcu_dereference(sta->link[rx->link_id]); in ieee80211_rx_8023()
4727 dev_kfree_skb(rx->skb); in ieee80211_rx_8023()
4780 stats->msdu[rx->seqno_idx]++; in ieee80211_rx_8023()
4789 sta_info_get(rx->sdata, da)) { in ieee80211_rx_8023()
4813 ieee80211_deliver_skb_to_local_stack(skb, rx); in ieee80211_rx_8023()
4816 static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx, in ieee80211_invoke_fast_rx() argument
4819 struct sk_buff *skb = rx->skb; in ieee80211_invoke_fast_rx()
4836 /* for parallel-rx, we need to have DUP_VALIDATED, otherwise we write in ieee80211_invoke_fast_rx()
4884 if (!ieee80211_vif_is_mesh(&rx->sdata->vif) && in ieee80211_invoke_fast_rx()
4906 if (rx->key && !(status->flag & RX_FLAG_MIC_STRIPPED) && in ieee80211_invoke_fast_rx()
4910 if (rx->key && !ieee80211_has_protected(hdr->frame_control)) in ieee80211_invoke_fast_rx()
4914 if (__ieee80211_rx_h_amsdu(rx, snap_offs - hdrlen) != in ieee80211_invoke_fast_rx()
4924 if (ieee80211_vif_is_mesh(&rx->sdata->vif)) { in ieee80211_invoke_fast_rx()
4937 res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb); in ieee80211_invoke_fast_rx()
4947 ieee80211_rx_8023(rx, fast_rx, orig_len); in ieee80211_invoke_fast_rx()
4954 stats = this_cpu_ptr(rx->link_sta->pcpu_rx_stats); in ieee80211_invoke_fast_rx()
4956 stats = &rx->link_sta->rx_stats; in ieee80211_invoke_fast_rx()
4964 * was destined for RX processing or not, which,
4968 static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx, in ieee80211_prepare_and_rx_handle() argument
4971 struct ieee80211_local *local = rx->local; in ieee80211_prepare_and_rx_handle()
4972 struct ieee80211_sub_if_data *sdata = rx->sdata; in ieee80211_prepare_and_rx_handle()
4974 struct link_sta_info *link_sta = rx->link_sta; in ieee80211_prepare_and_rx_handle()
4975 struct ieee80211_link_data *link = rx->link; in ieee80211_prepare_and_rx_handle()
4977 rx->skb = skb; in ieee80211_prepare_and_rx_handle()
4979 /* See if we can do fast-rx; if we have to copy we already lost, in ieee80211_prepare_and_rx_handle()
4986 if (consume && rx->sta) { in ieee80211_prepare_and_rx_handle()
4989 fast_rx = rcu_dereference(rx->sta->fast_rx); in ieee80211_prepare_and_rx_handle()
4990 if (fast_rx && ieee80211_invoke_fast_rx(rx, fast_rx)) in ieee80211_prepare_and_rx_handle()
4994 if (!ieee80211_accept_frame(rx)) in ieee80211_prepare_and_rx_handle()
5000 rx->skb = skb_copy(skb, GFP_ATOMIC); in ieee80211_prepare_and_rx_handle()
5001 if (!rx->skb) { in ieee80211_prepare_and_rx_handle()
5012 shwt = skb_hwtstamps(rx->skb); in ieee80211_prepare_and_rx_handle()
5016 hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_prepare_and_rx_handle()
5019 if (unlikely(rx->sta && rx->sta->sta.mlo) && in ieee80211_prepare_and_rx_handle()
5025 ether_addr_copy(hdr->addr1, rx->sdata->vif.addr); in ieee80211_prepare_and_rx_handle()
5027 ether_addr_copy(hdr->addr2, rx->sta->addr); in ieee80211_prepare_and_rx_handle()
5032 ether_addr_copy(hdr->addr3, rx->sta->addr); in ieee80211_prepare_and_rx_handle()
5034 ether_addr_copy(hdr->addr3, rx->sdata->vif.addr); in ieee80211_prepare_and_rx_handle()
5039 ieee80211_invoke_rx_handlers(rx); in ieee80211_prepare_and_rx_handle()
5051 struct ieee80211_rx_data rx; in __ieee80211_rx_handle_8023() local
5055 memset(&rx, 0, sizeof(rx)); in __ieee80211_rx_handle_8023()
5056 rx.skb = skb; in __ieee80211_rx_handle_8023()
5057 rx.local = local; in __ieee80211_rx_handle_8023()
5058 rx.list = list; in __ieee80211_rx_handle_8023()
5059 rx.link_id = -1; in __ieee80211_rx_handle_8023()
5081 if (!ieee80211_rx_data_set_sta(&rx, sta, link_id)) in __ieee80211_rx_handle_8023()
5084 fast_rx = rcu_dereference(rx.sta->fast_rx); in __ieee80211_rx_handle_8023()
5088 ieee80211_rx_8023(&rx, fast_rx, skb->len); in __ieee80211_rx_handle_8023()
5095 static bool ieee80211_rx_for_interface(struct ieee80211_rx_data *rx, in ieee80211_rx_for_interface() argument
5109 link_sta = link_sta_info_get_bss(rx->sdata, hdr->addr2); in ieee80211_rx_for_interface()
5116 sta = sta_info_get_bss(rx->sdata, hdr->addr2); in ieee80211_rx_for_interface()
5119 } else if (ieee80211_vif_is_mld(&rx->sdata->vif) && in ieee80211_rx_for_interface()
5124 for_each_link_data_rcu(rx->sdata, link) { in ieee80211_rx_for_interface()
5137 if (!ieee80211_rx_data_set_sta(rx, sta, link_id)) in ieee80211_rx_for_interface()
5140 return ieee80211_prepare_and_rx_handle(rx, skb, consume); in ieee80211_rx_for_interface()
5144 * This is the actual Rx frames handler. as it belongs to Rx path it must
5157 struct ieee80211_rx_data rx; in __ieee80211_rx_handle_packet() local
5163 memset(&rx, 0, sizeof(rx)); in __ieee80211_rx_handle_packet()
5164 rx.skb = skb; in __ieee80211_rx_handle_packet()
5165 rx.local = local; in __ieee80211_rx_handle_packet()
5166 rx.list = list; in __ieee80211_rx_handle_packet()
5167 rx.link_id = -1; in __ieee80211_rx_handle_packet()
5188 ieee80211_parse_qos(&rx); in __ieee80211_rx_handle_packet()
5189 ieee80211_verify_alignment(&rx); in __ieee80211_rx_handle_packet()
5205 if (!ieee80211_rx_data_set_sta(&rx, sta, link_id)) in __ieee80211_rx_handle_packet()
5219 link_sta = link_sta_info_get_bss(rx.sdata, in __ieee80211_rx_handle_packet()
5224 ieee80211_rx_data_set_link(&rx, link_sta->link_id); in __ieee80211_rx_handle_packet()
5227 if (ieee80211_prepare_and_rx_handle(&rx, skb, true)) in __ieee80211_rx_handle_packet()
5240 rx.sdata = prev_sta->sdata; in __ieee80211_rx_handle_packet()
5244 link_sta = link_sta_info_get_bss(rx.sdata, in __ieee80211_rx_handle_packet()
5252 if (!ieee80211_rx_data_set_sta(&rx, prev_sta, link_id)) in __ieee80211_rx_handle_packet()
5255 ieee80211_prepare_and_rx_handle(&rx, skb, false); in __ieee80211_rx_handle_packet()
5261 rx.sdata = prev_sta->sdata; in __ieee80211_rx_handle_packet()
5265 link_sta = link_sta_info_get_bss(rx.sdata, in __ieee80211_rx_handle_packet()
5273 if (!ieee80211_rx_data_set_sta(&rx, prev_sta, link_id)) in __ieee80211_rx_handle_packet()
5276 if (ieee80211_prepare_and_rx_handle(&rx, skb, true)) in __ieee80211_rx_handle_packet()
5303 rx.sdata = prev; in __ieee80211_rx_handle_packet()
5304 ieee80211_rx_for_interface(&rx, skb, false); in __ieee80211_rx_handle_packet()
5310 rx.sdata = prev; in __ieee80211_rx_handle_packet()
5312 if (ieee80211_rx_for_interface(&rx, skb, true)) in __ieee80211_rx_handle_packet()
5352 /* We might be during a HW reconfig, prevent Rx for the same reason */ in ieee80211_rx_list()
5489 /* This is a version of the rx handler that can be called from hard irq