• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/net/mac80211/

Lines Matching refs:rx

315 static void ieee80211_parse_qos(struct ieee80211_rx_data *rx)
317 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
326 rx->flags |= IEEE80211_RX_AMSDU;
328 rx->flags &= ~IEEE80211_RX_AMSDU;
344 rx->queue = tid;
347 rx->skb->priority = (tid > 7) ? 0 : tid;
375 static void ieee80211_verify_alignment(struct ieee80211_rx_data *rx)
378 WARN_ONCE((unsigned long)rx->skb->data & 1,
379 "unaligned packet at 0x%p\n", rx->skb->data);
384 /* rx handlers */
387 ieee80211_rx_h_passive_scan(struct ieee80211_rx_data *rx)
389 struct ieee80211_local *local = rx->local;
390 struct sk_buff *skb = rx->skb;
393 return ieee80211_scan_rx(rx->sdata, skb);
396 (rx->flags & IEEE80211_RX_IN_SCAN))) {
398 if (ieee80211_scan_rx(rx->sdata, skb) != RX_QUEUED)
403 if (unlikely(rx->flags & IEEE80211_RX_IN_SCAN)) {
459 ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
461 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
463 char *dev_addr = rx->sdata->vif.addr;
484 if (!rx->sta || sta_plink_state(rx->sta) != PLINK_ESTAB) {
510 mesh_rmc_check(hdr->addr3, msh_h_get(hdr, hdrlen), rx->sdata))
697 static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx,
700 struct sk_buff *skb = rx->skb;
701 struct ieee80211_local *local = rx->local;
704 struct sta_info *sta = rx->sta;
713 * filter the QoS data rx stream according to
737 /* if this mpdu is fragmented - terminate rx aggregation session */
741 skb_queue_tail(&rx->sdata->skb_queue, skb);
742 ieee80211_queue_work(&local->hw, &rx->sdata->work);
761 ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
763 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
766 if (rx->sta && !is_multicast_ether_addr(hdr->addr1)) {
768 rx->sta->last_seq_ctrl[rx->queue] ==
770 if (rx->flags & IEEE80211_RX_RA_MATCH) {
771 rx->local->dot11FrameDuplicateCount++;
772 rx->sta->num_duplicates++;
776 rx->sta->last_seq_ctrl[rx->queue] = hdr->seq_ctrl;
779 if (unlikely(rx->skb->len < 16)) {
780 I802_DEBUG_INC(rx->local->rx_handlers_drop_short);
793 if (ieee80211_vif_is_mesh(&rx->sdata->vif))
794 return ieee80211_rx_mesh_check(rx);
798 rx->sdata->vif.type != NL80211_IFTYPE_ADHOC &&
799 (!rx->sta || !test_sta_flags(rx->sta, WLAN_STA_ASSOC)))) {
803 !(rx->flags & IEEE80211_RX_RA_MATCH)) {
817 ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
819 struct sk_buff *skb = rx->skb;
860 if (!(rx->flags & IEEE80211_RX_RA_MATCH))
864 rx->key = NULL;
866 if (rx->sta)
867 stakey = rcu_dereference(rx->sta->key);
872 mmie_keyidx = ieee80211_get_mmie_keyidx(rx->skb);
875 rx->key = stakey;
888 rx->key = rcu_dereference(rx->sdata->keys[mmie_keyidx]);
892 * need to set rx->key if there is a key that could have been
899 (key = rcu_dereference(rx->sdata->default_mgmt_key)))
900 rx->key = key;
901 else if ((key = rcu_dereference(rx->sdata->default_key)))
902 rx->key = key;
921 if (rx->skb->len < 8 + hdrlen)
928 skb_copy_bits(rx->skb, hdrlen + 3, &keyid, 1);
931 rx->key = rcu_dereference(rx->sdata->keys[keyidx]);
938 if (rx->key && rx->key->conf.alg != ALG_WEP &&
940 rx->key = NULL;
943 if (rx->key) {
944 rx->key->tx_rx_count++;
950 if (skb_linearize(rx->skb))
954 switch (rx->key->conf.alg) {
957 if (rx->sta && ieee80211_is_data(fc) &&
960 ieee80211_wep_is_weak_iv(rx->skb, rx->key))
961 rx->sta->wep_weak_iv_count++;
963 result = ieee80211_crypto_wep_decrypt(rx);
966 result = ieee80211_crypto_tkip_decrypt(rx);
969 result = ieee80211_crypto_ccmp_decrypt(rx);
972 result = ieee80211_crypto_aes_cmac_decrypt(rx);
983 ieee80211_rx_h_check_more_data(struct ieee80211_rx_data *rx)
989 local = rx->local;
990 skb = rx->skb;
1010 ieee80211_send_pspoll(local, rx->sdata);
1054 ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
1056 struct sta_info *sta = rx->sta;
1057 struct sk_buff *skb = rx->skb;
1069 if (rx->sdata->vif.type == NL80211_IFTYPE_ADHOC) {
1070 u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len,
1072 if (compare_ether_addr(bssid, rx->sdata->u.ibss.bssid) == 0)
1082 if (!(rx->flags & IEEE80211_RX_RA_MATCH))
1085 if (rx->sdata->vif.type == NL80211_IFTYPE_STATION)
1086 ieee80211_sta_rx_notify(rx->sdata, hdr);
1089 sta->rx_bytes += rx->skb->len;
1097 (rx->sdata->vif.type == NL80211_IFTYPE_AP ||
1098 rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) {
1123 I802_DEBUG_INC(rx->local->rx_handlers_drop_nullfunc);
1132 (rx->sdata->vif.type == NL80211_IFTYPE_AP ||
1133 (rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
1134 !rx->sdata->u.vlan.sta)))
1141 dev_kfree_skb(rx->skb);
1231 ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
1240 hdr = (struct ieee80211_hdr *)rx->skb->data;
1246 (rx->skb)->len < 24 ||
1251 I802_DEBUG_INC(rx->local->rx_handlers_fragments);
1253 if (skb_linearize(rx->skb))
1261 hdr = (struct ieee80211_hdr *)rx->skb->data;
1266 entry = ieee80211_reassemble_add(rx->sdata, frag, seq,
1267 rx->queue, &(rx->skb));
1268 if (rx->key && rx->key->conf.alg == ALG_CCMP &&
1271 NUM_RX_DATA_QUEUES : rx->queue;
1276 rx->key->u.ccmp.rx_pn[queue],
1285 entry = ieee80211_reassemble_find(rx->sdata, frag, seq, rx->queue, hdr);
1287 I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag);
1297 if (!rx->key || rx->key->conf.alg != ALG_CCMP)
1306 NUM_RX_DATA_QUEUES : rx->queue;
1307 rpn = rx->key->u.ccmp.rx_pn[queue];
1313 skb_pull(rx->skb, ieee80211_hdrlen(fc));
1314 __skb_queue_tail(&entry->skb_list, rx->skb);
1316 entry->extra_len += rx->skb->len;
1318 rx->skb = NULL;
1322 rx->skb = __skb_dequeue(&entry->skb_list);
1323 if (skb_tailroom(rx->skb) < entry->extra_len) {
1324 I802_DEBUG_INC(rx->local->rx_expand_skb_head2);
1325 if (unlikely(pskb_expand_head(rx->skb, 0, entry->extra_len,
1327 I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag);
1333 memcpy(skb_put(rx->skb, skb->len), skb->data, skb->len);
1338 rx->flags |= IEEE80211_RX_FRAGMENTED;
1341 if (rx->sta)
1342 rx->sta->rx_packets++;
1344 rx->local->dot11MulticastReceivedFrameCount++;
1346 ieee80211_led_rx(rx->local);
1351 ieee80211_rx_h_ps_poll(struct ieee80211_rx_data *rx)
1353 struct ieee80211_sub_if_data *sdata = rx->sdata;
1354 __le16 fc = ((struct ieee80211_hdr *)rx->skb->data)->frame_control;
1356 if (likely(!rx->sta || !ieee80211_is_pspoll(fc) ||
1357 !(rx->flags & IEEE80211_RX_RA_MATCH)))
1364 if (!test_sta_flags(rx->sta, WLAN_STA_PS_DRIVER))
1365 ieee80211_sta_ps_deliver_poll_response(rx->sta);
1367 set_sta_flags(rx->sta, WLAN_STA_PSPOLL);
1371 dev_kfree_skb(rx->skb);
1377 ieee80211_rx_h_remove_qos_control(struct ieee80211_rx_data *rx)
1379 u8 *data = rx->skb->data;
1388 hdr = (struct ieee80211_hdr *)skb_pull(rx->skb, IEEE80211_QOS_CTL_LEN);
1396 ieee80211_802_1x_port_control(struct ieee80211_rx_data *rx)
1398 if (unlikely(!rx->sta ||
1399 !test_sta_flags(rx->sta, WLAN_STA_AUTHORIZED)))
1406 ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
1408 struct sk_buff *skb = rx->skb;
1422 (rx->key || rx->sdata->drop_unencrypted)))
1429 ieee80211_drop_unencrypted_mgmt(struct ieee80211_rx_data *rx)
1431 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
1432 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
1442 if (rx->sta && test_sta_flags(rx->sta, WLAN_STA_MFP)) {
1444 ieee80211_is_unicast_robust_mgmt_frame(rx->skb) &&
1445 rx->key))
1448 if (unlikely(ieee80211_is_multicast_robust_mgmt_frame(rx->skb) &&
1449 ieee80211_get_mmie_keyidx(rx->skb) < 0))
1455 if (unlikely(ieee80211_is_action(fc) && !rx->key &&
1457 (struct ieee80211_hdr *) rx->skb->data)))
1465 __ieee80211_data_to_8023(struct ieee80211_rx_data *rx)
1467 struct ieee80211_sub_if_data *sdata = rx->sdata;
1468 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
1479 return ieee80211_data_to_8023(rx->skb, sdata->vif.addr, sdata->vif.type);
1483 * requires that rx->skb is a frame with ethernet header
1485 static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx, __le16 fc)
1489 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data;
1496 (compare_ether_addr(ehdr->h_dest, rx->sdata->vif.addr) == 0 ||
1500 if (ieee80211_802_1x_port_control(rx) ||
1501 ieee80211_drop_unencrypted(rx, fc))
1508 * requires that rx->skb is a frame with ethernet header
1511 ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
1513 struct ieee80211_sub_if_data *sdata = rx->sdata;
1516 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data;
1519 skb = rx->skb;
1525 (rx->flags & IEEE80211_RX_RA_MATCH) &&
1595 ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
1597 struct net_device *dev = rx->sdata->dev;
1598 struct sk_buff *skb = rx->skb;
1609 if (!(rx->flags & IEEE80211_RX_AMSDU))
1613 rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
1614 !rx->sdata->u.vlan.sta)
1618 ((rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
1619 rx->sdata->u.vlan.sta) ||
1620 (rx->sdata->vif.type == NL80211_IFTYPE_STATION &&
1621 rx->sdata->u.mgd.use_4addr)))
1631 rx->sdata->vif.type,
1632 rx->local->hw.extra_tx_headroom);
1635 rx->skb = __skb_dequeue(&frame_list);
1637 if (!ieee80211_frame_allowed(rx, fc)) {
1638 dev_kfree_skb(rx->skb);
1642 dev->stats.rx_bytes += rx->skb->len;
1644 ieee80211_deliver_skb(rx);
1652 ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
1657 struct sk_buff *skb = rx->skb, *fwd_skb;
1658 struct ieee80211_local *local = rx->local;
1659 struct ieee80211_sub_if_data *sdata = rx->sdata;
1705 if (rx->flags & IEEE80211_RX_RA_MATCH) {
1707 IEEE80211_IFSTA_MESH_CTR_INC(&rx->sdata->u.mesh,
1726 info->control.vif = &rx->sdata->vif;
1728 ieee80211_select_queue(rx->sdata, fwd_skb));
1767 ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
1769 struct ieee80211_sub_if_data *sdata = rx->sdata;
1770 struct ieee80211_local *local = rx->local;
1772 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
1790 err = __ieee80211_data_to_8023(rx);
1794 if (!ieee80211_frame_allowed(rx, fc))
1797 rx->skb->dev = dev;
1800 dev->stats.rx_bytes += rx->skb->len;
1809 ieee80211_deliver_skb(rx);
1815 ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx, struct sk_buff_head *frames)
1817 struct ieee80211_local *local = rx->local;
1819 struct sk_buff *skb = rx->skb;
1833 if (!rx->sta)
1842 tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]);
1915 ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
1917 struct ieee80211_local *local = rx->local;
1918 struct ieee80211_sub_if_data *sdata = rx->sdata;
1919 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;
1922 int len = rx->skb->len;
1931 if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC)
1934 if (!(rx->flags & IEEE80211_RX_RA_MATCH))
1937 if (ieee80211_drop_unencrypted_mgmt(rx))
2048 status = IEEE80211_SKB_RXCB(rx->skb);
2050 if (cfg80211_rx_action(rx->sdata->dev, status->freq,
2051 rx->skb->data, rx->skb->len,
2059 nskb = skb_copy_expand(rx->skb, local->hw.extra_tx_headroom, 0,
2066 memcpy(nmgmt->sa, rx->sdata->vif.addr, ETH_ALEN);
2070 ieee80211_tx_skb(rx->sdata, nskb);
2074 if (rx->sta)
2075 rx->sta->rx_packets++;
2076 dev_kfree_skb(rx->skb);
2080 rx->skb->pkt_type = IEEE80211_SDATA_QUEUE_TYPE_FRAME;
2081 skb_queue_tail(&sdata->skb_queue, rx->skb);
2083 if (rx->sta)
2084 rx->sta->rx_packets++;
2089 ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
2091 struct ieee80211_sub_if_data *sdata = rx->sdata;
2093 struct ieee80211_mgmt *mgmt = (void *)rx->skb->data;
2096 if (!(rx->flags & IEEE80211_RX_RA_MATCH))
2099 if (rx->skb->len < 24)
2102 if (ieee80211_drop_unencrypted_mgmt(rx))
2105 rxs = ieee80211_work_rx_mgmt(rx->sdata, rx->skb);
2138 rx->skb->pkt_type = IEEE80211_SDATA_QUEUE_TYPE_FRAME;
2139 skb_queue_tail(&sdata->skb_queue, rx->skb);
2140 ieee80211_queue_work(&rx->local->hw, &sdata->work);
2141 if (rx->sta)
2142 rx->sta->rx_packets++;
2148 struct ieee80211_rx_data *rx)
2154 if (rx->skb->len >= hdrlen + 4)
2155 keyidx = rx->skb->data[hdrlen + 3] >> 6;
2159 if (!rx->sta) {
2170 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && keyidx) {
2184 mac80211_ev_michael_mic_failure(rx->sdata, keyidx, hdr, NULL,
2189 static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx,
2193 struct ieee80211_local *local = rx->local;
2201 struct sk_buff *skb = rx->skb, *skb2;
2271 struct ieee80211_rx_data *rx,
2280 rx->skb = skb;
2281 rx->sdata = sdata;
2285 res = rxh(rx); \
2298 ieee80211_rx_reorder_ampdu(rx, &reorder_release);
2306 rx->skb = skb;
2324 res = ieee80211_rx_h_ctrl(rx, &reorder_release);
2337 if (rx->sta)
2338 rx->sta->rx_dropped++;
2341 ieee80211_rx_cooked_monitor(rx, rate);
2345 if (rx->sta)
2346 rx->sta->rx_dropped++;
2347 dev_kfree_skb(rx->skb);
2359 struct ieee80211_rx_data *rx,
2362 struct sk_buff *skb = rx->skb;
2375 rx->flags &= ~IEEE80211_RX_RA_MATCH;
2385 if (!(rx->flags & IEEE80211_RX_IN_SCAN))
2387 rx->flags &= ~IEEE80211_RX_RA_MATCH;
2393 rx->flags &= ~IEEE80211_RX_RA_MATCH;
2394 } else if (!rx->sta) {
2400 rx->sta = ieee80211_ibss_add_sta(sdata, bssid,
2411 rx->flags &= ~IEEE80211_RX_RA_MATCH;
2422 if (!(rx->flags & IEEE80211_RX_IN_SCAN))
2424 rx->flags &= ~IEEE80211_RX_RA_MATCH;
2457 struct ieee80211_rx_data rx;
2466 memset(&rx, 0, sizeof(rx));
2467 rx.skb = skb;
2468 rx.local = local;
2475 rx.flags |= IEEE80211_RX_IN_SCAN;
2488 ieee80211_parse_qos(&rx);
2489 ieee80211_verify_alignment(&rx);
2493 rx.sta = sta;
2495 rx.sdata = sta->sdata;
2497 rx.flags |= IEEE80211_RX_RA_MATCH;
2498 prepares = prepare_for_handlers(rx.sdata, &rx, hdr);
2501 if (rx.flags & IEEE80211_RX_RA_MATCH)
2502 ieee80211_rx_michael_mic_report(hdr, &rx);
2504 prev = rx.sdata;
2528 rx.sta = sta_info_get_bss(prev, hdr->addr2);
2530 rx.flags |= IEEE80211_RX_RA_MATCH;
2531 prepares = prepare_for_handlers(prev, &rx, hdr);
2537 rx.sdata = prev;
2538 if (rx.flags & IEEE80211_RX_RA_MATCH)
2540 &rx);
2558 ieee80211_invoke_rx_handlers(prev, &rx, skb_new, rate);
2564 rx.sta = sta_info_get_bss(prev, hdr->addr2);
2566 rx.flags |= IEEE80211_RX_RA_MATCH;
2567 prepares = prepare_for_handlers(prev, &rx, hdr);
2574 ieee80211_invoke_rx_handlers(prev, &rx, skb, rate);
2670 /* This is a version of the rx handler that can be called from hard irq