diff options
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r-- | net/mac80211/rx.c | 168 |
1 files changed, 98 insertions, 70 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 2b0debb0422b..3e57f96c9666 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -638,6 +638,27 @@ static int ieee80211_get_mmie_keyidx(struct sk_buff *skb) | |||
638 | return le16_to_cpu(mmie->key_id); | 638 | return le16_to_cpu(mmie->key_id); |
639 | } | 639 | } |
640 | 640 | ||
641 | static int iwl80211_get_cs_keyid(const struct ieee80211_cipher_scheme *cs, | ||
642 | struct sk_buff *skb) | ||
643 | { | ||
644 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | ||
645 | __le16 fc; | ||
646 | int hdrlen; | ||
647 | u8 keyid; | ||
648 | |||
649 | fc = hdr->frame_control; | ||
650 | hdrlen = ieee80211_hdrlen(fc); | ||
651 | |||
652 | if (skb->len < hdrlen + cs->hdr_len) | ||
653 | return -EINVAL; | ||
654 | |||
655 | skb_copy_bits(skb, hdrlen + cs->key_idx_off, &keyid, 1); | ||
656 | keyid &= cs->key_idx_mask; | ||
657 | keyid >>= cs->key_idx_shift; | ||
658 | |||
659 | return keyid; | ||
660 | } | ||
661 | |||
641 | static ieee80211_rx_result ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx) | 662 | static ieee80211_rx_result ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx) |
642 | { | 663 | { |
643 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; | 664 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; |
@@ -729,9 +750,7 @@ static void ieee80211_release_reorder_frames(struct ieee80211_sub_if_data *sdata | |||
729 | lockdep_assert_held(&tid_agg_rx->reorder_lock); | 750 | lockdep_assert_held(&tid_agg_rx->reorder_lock); |
730 | 751 | ||
731 | while (ieee80211_sn_less(tid_agg_rx->head_seq_num, head_seq_num)) { | 752 | while (ieee80211_sn_less(tid_agg_rx->head_seq_num, head_seq_num)) { |
732 | index = ieee80211_sn_sub(tid_agg_rx->head_seq_num, | 753 | index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; |
733 | tid_agg_rx->ssn) % | ||
734 | tid_agg_rx->buf_size; | ||
735 | ieee80211_release_reorder_frame(sdata, tid_agg_rx, index, | 754 | ieee80211_release_reorder_frame(sdata, tid_agg_rx, index, |
736 | frames); | 755 | frames); |
737 | } | 756 | } |
@@ -757,8 +776,7 @@ static void ieee80211_sta_reorder_release(struct ieee80211_sub_if_data *sdata, | |||
757 | lockdep_assert_held(&tid_agg_rx->reorder_lock); | 776 | lockdep_assert_held(&tid_agg_rx->reorder_lock); |
758 | 777 | ||
759 | /* release the buffer until next missing frame */ | 778 | /* release the buffer until next missing frame */ |
760 | index = ieee80211_sn_sub(tid_agg_rx->head_seq_num, | 779 | index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; |
761 | tid_agg_rx->ssn) % tid_agg_rx->buf_size; | ||
762 | if (!tid_agg_rx->reorder_buf[index] && | 780 | if (!tid_agg_rx->reorder_buf[index] && |
763 | tid_agg_rx->stored_mpdu_num) { | 781 | tid_agg_rx->stored_mpdu_num) { |
764 | /* | 782 | /* |
@@ -793,15 +811,11 @@ static void ieee80211_sta_reorder_release(struct ieee80211_sub_if_data *sdata, | |||
793 | } else while (tid_agg_rx->reorder_buf[index]) { | 811 | } else while (tid_agg_rx->reorder_buf[index]) { |
794 | ieee80211_release_reorder_frame(sdata, tid_agg_rx, index, | 812 | ieee80211_release_reorder_frame(sdata, tid_agg_rx, index, |
795 | frames); | 813 | frames); |
796 | index = ieee80211_sn_sub(tid_agg_rx->head_seq_num, | 814 | index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; |
797 | tid_agg_rx->ssn) % | ||
798 | tid_agg_rx->buf_size; | ||
799 | } | 815 | } |
800 | 816 | ||
801 | if (tid_agg_rx->stored_mpdu_num) { | 817 | if (tid_agg_rx->stored_mpdu_num) { |
802 | j = index = ieee80211_sn_sub(tid_agg_rx->head_seq_num, | 818 | j = index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size; |
803 | tid_agg_rx->ssn) % | ||
804 | tid_agg_rx->buf_size; | ||
805 | 819 | ||
806 | for (; j != (index - 1) % tid_agg_rx->buf_size; | 820 | for (; j != (index - 1) % tid_agg_rx->buf_size; |
807 | j = (j + 1) % tid_agg_rx->buf_size) { | 821 | j = (j + 1) % tid_agg_rx->buf_size) { |
@@ -861,8 +875,7 @@ static bool ieee80211_sta_manage_reorder_buf(struct ieee80211_sub_if_data *sdata | |||
861 | 875 | ||
862 | /* Now the new frame is always in the range of the reordering buffer */ | 876 | /* Now the new frame is always in the range of the reordering buffer */ |
863 | 877 | ||
864 | index = ieee80211_sn_sub(mpdu_seq_num, | 878 | index = mpdu_seq_num % tid_agg_rx->buf_size; |
865 | tid_agg_rx->ssn) % tid_agg_rx->buf_size; | ||
866 | 879 | ||
867 | /* check if we already stored this frame */ | 880 | /* check if we already stored this frame */ |
868 | if (tid_agg_rx->reorder_buf[index]) { | 881 | if (tid_agg_rx->reorder_buf[index]) { |
@@ -1115,6 +1128,13 @@ static void sta_ps_end(struct sta_info *sta) | |||
1115 | sta->sta.addr, sta->sta.aid); | 1128 | sta->sta.addr, sta->sta.aid); |
1116 | 1129 | ||
1117 | if (test_sta_flag(sta, WLAN_STA_PS_DRIVER)) { | 1130 | if (test_sta_flag(sta, WLAN_STA_PS_DRIVER)) { |
1131 | /* | ||
1132 | * Clear the flag only if the other one is still set | ||
1133 | * so that the TX path won't start TX'ing new frames | ||
1134 | * directly ... In the case that the driver flag isn't | ||
1135 | * set ieee80211_sta_ps_deliver_wakeup() will clear it. | ||
1136 | */ | ||
1137 | clear_sta_flag(sta, WLAN_STA_PS_STA); | ||
1118 | ps_dbg(sta->sdata, "STA %pM aid %d driver-ps-blocked\n", | 1138 | ps_dbg(sta->sdata, "STA %pM aid %d driver-ps-blocked\n", |
1119 | sta->sta.addr, sta->sta.aid); | 1139 | sta->sta.addr, sta->sta.aid); |
1120 | return; | 1140 | return; |
@@ -1369,6 +1389,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx) | |||
1369 | struct ieee80211_key *sta_ptk = NULL; | 1389 | struct ieee80211_key *sta_ptk = NULL; |
1370 | int mmie_keyidx = -1; | 1390 | int mmie_keyidx = -1; |
1371 | __le16 fc; | 1391 | __le16 fc; |
1392 | const struct ieee80211_cipher_scheme *cs = NULL; | ||
1372 | 1393 | ||
1373 | /* | 1394 | /* |
1374 | * Key selection 101 | 1395 | * Key selection 101 |
@@ -1406,11 +1427,19 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx) | |||
1406 | 1427 | ||
1407 | /* start without a key */ | 1428 | /* start without a key */ |
1408 | rx->key = NULL; | 1429 | rx->key = NULL; |
1430 | fc = hdr->frame_control; | ||
1409 | 1431 | ||
1410 | if (rx->sta) | 1432 | if (rx->sta) { |
1411 | sta_ptk = rcu_dereference(rx->sta->ptk); | 1433 | int keyid = rx->sta->ptk_idx; |
1412 | 1434 | ||
1413 | fc = hdr->frame_control; | 1435 | if (ieee80211_has_protected(fc) && rx->sta->cipher_scheme) { |
1436 | cs = rx->sta->cipher_scheme; | ||
1437 | keyid = iwl80211_get_cs_keyid(cs, rx->skb); | ||
1438 | if (unlikely(keyid < 0)) | ||
1439 | return RX_DROP_UNUSABLE; | ||
1440 | } | ||
1441 | sta_ptk = rcu_dereference(rx->sta->ptk[keyid]); | ||
1442 | } | ||
1414 | 1443 | ||
1415 | if (!ieee80211_has_protected(fc)) | 1444 | if (!ieee80211_has_protected(fc)) |
1416 | mmie_keyidx = ieee80211_get_mmie_keyidx(rx->skb); | 1445 | mmie_keyidx = ieee80211_get_mmie_keyidx(rx->skb); |
@@ -1472,6 +1501,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx) | |||
1472 | return RX_CONTINUE; | 1501 | return RX_CONTINUE; |
1473 | } else { | 1502 | } else { |
1474 | u8 keyid; | 1503 | u8 keyid; |
1504 | |||
1475 | /* | 1505 | /* |
1476 | * The device doesn't give us the IV so we won't be | 1506 | * The device doesn't give us the IV so we won't be |
1477 | * able to look up the key. That's ok though, we | 1507 | * able to look up the key. That's ok though, we |
@@ -1487,15 +1517,21 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx) | |||
1487 | 1517 | ||
1488 | hdrlen = ieee80211_hdrlen(fc); | 1518 | hdrlen = ieee80211_hdrlen(fc); |
1489 | 1519 | ||
1490 | if (rx->skb->len < 8 + hdrlen) | 1520 | if (cs) { |
1491 | return RX_DROP_UNUSABLE; /* TODO: count this? */ | 1521 | keyidx = iwl80211_get_cs_keyid(cs, rx->skb); |
1492 | 1522 | ||
1493 | /* | 1523 | if (unlikely(keyidx < 0)) |
1494 | * no need to call ieee80211_wep_get_keyidx, | 1524 | return RX_DROP_UNUSABLE; |
1495 | * it verifies a bunch of things we've done already | 1525 | } else { |
1496 | */ | 1526 | if (rx->skb->len < 8 + hdrlen) |
1497 | skb_copy_bits(rx->skb, hdrlen + 3, &keyid, 1); | 1527 | return RX_DROP_UNUSABLE; /* TODO: count this? */ |
1498 | keyidx = keyid >> 6; | 1528 | /* |
1529 | * no need to call ieee80211_wep_get_keyidx, | ||
1530 | * it verifies a bunch of things we've done already | ||
1531 | */ | ||
1532 | skb_copy_bits(rx->skb, hdrlen + 3, &keyid, 1); | ||
1533 | keyidx = keyid >> 6; | ||
1534 | } | ||
1499 | 1535 | ||
1500 | /* check per-station GTK first, if multicast packet */ | 1536 | /* check per-station GTK first, if multicast packet */ |
1501 | if (is_multicast_ether_addr(hdr->addr1) && rx->sta) | 1537 | if (is_multicast_ether_addr(hdr->addr1) && rx->sta) |
@@ -1543,11 +1579,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx) | |||
1543 | result = ieee80211_crypto_aes_cmac_decrypt(rx); | 1579 | result = ieee80211_crypto_aes_cmac_decrypt(rx); |
1544 | break; | 1580 | break; |
1545 | default: | 1581 | default: |
1546 | /* | 1582 | result = ieee80211_crypto_hw_decrypt(rx); |
1547 | * We can reach here only with HW-only algorithms | ||
1548 | * but why didn't it decrypt the frame?! | ||
1549 | */ | ||
1550 | return RX_DROP_UNUSABLE; | ||
1551 | } | 1583 | } |
1552 | 1584 | ||
1553 | /* the hdr variable is invalid after the decrypt handlers */ | 1585 | /* the hdr variable is invalid after the decrypt handlers */ |
@@ -1938,20 +1970,17 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx) | |||
1938 | } | 1970 | } |
1939 | } | 1971 | } |
1940 | 1972 | ||
1941 | if (skb) { | ||
1942 | int align __maybe_unused; | ||
1943 | |||
1944 | #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS | 1973 | #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS |
1945 | /* | 1974 | if (skb) { |
1946 | * 'align' will only take the values 0 or 2 here | 1975 | /* 'align' will only take the values 0 or 2 here since all |
1947 | * since all frames are required to be aligned | 1976 | * frames are required to be aligned to 2-byte boundaries |
1948 | * to 2-byte boundaries when being passed to | 1977 | * when being passed to mac80211; the code here works just |
1949 | * mac80211; the code here works just as well if | 1978 | * as well if that isn't true, but mac80211 assumes it can |
1950 | * that isn't true, but mac80211 assumes it can | 1979 | * access fields as 2-byte aligned (e.g. for ether_addr_equal) |
1951 | * access fields as 2-byte aligned (e.g. for | ||
1952 | * compare_ether_addr) | ||
1953 | */ | 1980 | */ |
1954 | align = ((unsigned long)(skb->data + sizeof(struct ethhdr))) & 3; | 1981 | int align; |
1982 | |||
1983 | align = (unsigned long)(skb->data + sizeof(struct ethhdr)) & 3; | ||
1955 | if (align) { | 1984 | if (align) { |
1956 | if (WARN_ON(skb_headroom(skb) < 3)) { | 1985 | if (WARN_ON(skb_headroom(skb) < 3)) { |
1957 | dev_kfree_skb(skb); | 1986 | dev_kfree_skb(skb); |
@@ -1964,14 +1993,14 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx) | |||
1964 | skb_set_tail_pointer(skb, len); | 1993 | skb_set_tail_pointer(skb, len); |
1965 | } | 1994 | } |
1966 | } | 1995 | } |
1996 | } | ||
1967 | #endif | 1997 | #endif |
1968 | 1998 | ||
1969 | if (skb) { | 1999 | if (skb) { |
1970 | /* deliver to local stack */ | 2000 | /* deliver to local stack */ |
1971 | skb->protocol = eth_type_trans(skb, dev); | 2001 | skb->protocol = eth_type_trans(skb, dev); |
1972 | memset(skb->cb, 0, sizeof(skb->cb)); | 2002 | memset(skb->cb, 0, sizeof(skb->cb)); |
1973 | netif_receive_skb(skb); | 2003 | netif_receive_skb(skb); |
1974 | } | ||
1975 | } | 2004 | } |
1976 | 2005 | ||
1977 | if (xmit_skb) { | 2006 | if (xmit_skb) { |
@@ -2057,7 +2086,6 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | |||
2057 | struct ieee80211_sub_if_data *sdata = rx->sdata; | 2086 | struct ieee80211_sub_if_data *sdata = rx->sdata; |
2058 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); | 2087 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); |
2059 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; | 2088 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; |
2060 | __le16 reason = cpu_to_le16(WLAN_REASON_MESH_PATH_NOFORWARD); | ||
2061 | u16 q, hdrlen; | 2089 | u16 q, hdrlen; |
2062 | 2090 | ||
2063 | hdr = (struct ieee80211_hdr *) skb->data; | 2091 | hdr = (struct ieee80211_hdr *) skb->data; |
@@ -2165,7 +2193,9 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | |||
2165 | } else { | 2193 | } else { |
2166 | /* unable to resolve next hop */ | 2194 | /* unable to resolve next hop */ |
2167 | mesh_path_error_tx(sdata, ifmsh->mshcfg.element_ttl, | 2195 | mesh_path_error_tx(sdata, ifmsh->mshcfg.element_ttl, |
2168 | fwd_hdr->addr3, 0, reason, fwd_hdr->addr2); | 2196 | fwd_hdr->addr3, 0, |
2197 | WLAN_REASON_MESH_PATH_NOFORWARD, | ||
2198 | fwd_hdr->addr2); | ||
2169 | IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_no_route); | 2199 | IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_no_route); |
2170 | kfree_skb(fwd_skb); | 2200 | kfree_skb(fwd_skb); |
2171 | return RX_DROP_MONITOR; | 2201 | return RX_DROP_MONITOR; |
@@ -3053,8 +3083,8 @@ void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid) | |||
3053 | 3083 | ||
3054 | /* main receive path */ | 3084 | /* main receive path */ |
3055 | 3085 | ||
3056 | static int prepare_for_handlers(struct ieee80211_rx_data *rx, | 3086 | static bool prepare_for_handlers(struct ieee80211_rx_data *rx, |
3057 | struct ieee80211_hdr *hdr) | 3087 | struct ieee80211_hdr *hdr) |
3058 | { | 3088 | { |
3059 | struct ieee80211_sub_if_data *sdata = rx->sdata; | 3089 | struct ieee80211_sub_if_data *sdata = rx->sdata; |
3060 | struct sk_buff *skb = rx->skb; | 3090 | struct sk_buff *skb = rx->skb; |
@@ -3065,29 +3095,29 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx, | |||
3065 | switch (sdata->vif.type) { | 3095 | switch (sdata->vif.type) { |
3066 | case NL80211_IFTYPE_STATION: | 3096 | case NL80211_IFTYPE_STATION: |
3067 | if (!bssid && !sdata->u.mgd.use_4addr) | 3097 | if (!bssid && !sdata->u.mgd.use_4addr) |
3068 | return 0; | 3098 | return false; |
3069 | if (!multicast && | 3099 | if (!multicast && |
3070 | !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { | 3100 | !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { |
3071 | if (!(sdata->dev->flags & IFF_PROMISC) || | 3101 | if (!(sdata->dev->flags & IFF_PROMISC) || |
3072 | sdata->u.mgd.use_4addr) | 3102 | sdata->u.mgd.use_4addr) |
3073 | return 0; | 3103 | return false; |
3074 | status->rx_flags &= ~IEEE80211_RX_RA_MATCH; | 3104 | status->rx_flags &= ~IEEE80211_RX_RA_MATCH; |
3075 | } | 3105 | } |
3076 | break; | 3106 | break; |
3077 | case NL80211_IFTYPE_ADHOC: | 3107 | case NL80211_IFTYPE_ADHOC: |
3078 | if (!bssid) | 3108 | if (!bssid) |
3079 | return 0; | 3109 | return false; |
3080 | if (ether_addr_equal(sdata->vif.addr, hdr->addr2) || | 3110 | if (ether_addr_equal(sdata->vif.addr, hdr->addr2) || |
3081 | ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2)) | 3111 | ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2)) |
3082 | return 0; | 3112 | return false; |
3083 | if (ieee80211_is_beacon(hdr->frame_control)) { | 3113 | if (ieee80211_is_beacon(hdr->frame_control)) { |
3084 | return 1; | 3114 | return true; |
3085 | } else if (!ieee80211_bssid_match(bssid, sdata->u.ibss.bssid)) { | 3115 | } else if (!ieee80211_bssid_match(bssid, sdata->u.ibss.bssid)) { |
3086 | return 0; | 3116 | return false; |
3087 | } else if (!multicast && | 3117 | } else if (!multicast && |
3088 | !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { | 3118 | !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { |
3089 | if (!(sdata->dev->flags & IFF_PROMISC)) | 3119 | if (!(sdata->dev->flags & IFF_PROMISC)) |
3090 | return 0; | 3120 | return false; |
3091 | status->rx_flags &= ~IEEE80211_RX_RA_MATCH; | 3121 | status->rx_flags &= ~IEEE80211_RX_RA_MATCH; |
3092 | } else if (!rx->sta) { | 3122 | } else if (!rx->sta) { |
3093 | int rate_idx; | 3123 | int rate_idx; |
@@ -3103,7 +3133,7 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx, | |||
3103 | if (!multicast && | 3133 | if (!multicast && |
3104 | !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { | 3134 | !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { |
3105 | if (!(sdata->dev->flags & IFF_PROMISC)) | 3135 | if (!(sdata->dev->flags & IFF_PROMISC)) |
3106 | return 0; | 3136 | return false; |
3107 | 3137 | ||
3108 | status->rx_flags &= ~IEEE80211_RX_RA_MATCH; | 3138 | status->rx_flags &= ~IEEE80211_RX_RA_MATCH; |
3109 | } | 3139 | } |
@@ -3112,7 +3142,7 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx, | |||
3112 | case NL80211_IFTYPE_AP: | 3142 | case NL80211_IFTYPE_AP: |
3113 | if (!bssid) { | 3143 | if (!bssid) { |
3114 | if (!ether_addr_equal(sdata->vif.addr, hdr->addr1)) | 3144 | if (!ether_addr_equal(sdata->vif.addr, hdr->addr1)) |
3115 | return 0; | 3145 | return false; |
3116 | } else if (!ieee80211_bssid_match(bssid, sdata->vif.addr)) { | 3146 | } else if (!ieee80211_bssid_match(bssid, sdata->vif.addr)) { |
3117 | /* | 3147 | /* |
3118 | * Accept public action frames even when the | 3148 | * Accept public action frames even when the |
@@ -3122,26 +3152,26 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx, | |||
3122 | */ | 3152 | */ |
3123 | if (!multicast && | 3153 | if (!multicast && |
3124 | !ether_addr_equal(sdata->vif.addr, hdr->addr1)) | 3154 | !ether_addr_equal(sdata->vif.addr, hdr->addr1)) |
3125 | return 0; | 3155 | return false; |
3126 | if (ieee80211_is_public_action(hdr, skb->len)) | 3156 | if (ieee80211_is_public_action(hdr, skb->len)) |
3127 | return 1; | 3157 | return true; |
3128 | if (!ieee80211_is_beacon(hdr->frame_control)) | 3158 | if (!ieee80211_is_beacon(hdr->frame_control)) |
3129 | return 0; | 3159 | return false; |
3130 | status->rx_flags &= ~IEEE80211_RX_RA_MATCH; | 3160 | status->rx_flags &= ~IEEE80211_RX_RA_MATCH; |
3131 | } | 3161 | } |
3132 | break; | 3162 | break; |
3133 | case NL80211_IFTYPE_WDS: | 3163 | case NL80211_IFTYPE_WDS: |
3134 | if (bssid || !ieee80211_is_data(hdr->frame_control)) | 3164 | if (bssid || !ieee80211_is_data(hdr->frame_control)) |
3135 | return 0; | 3165 | return false; |
3136 | if (!ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2)) | 3166 | if (!ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2)) |
3137 | return 0; | 3167 | return false; |
3138 | break; | 3168 | break; |
3139 | case NL80211_IFTYPE_P2P_DEVICE: | 3169 | case NL80211_IFTYPE_P2P_DEVICE: |
3140 | if (!ieee80211_is_public_action(hdr, skb->len) && | 3170 | if (!ieee80211_is_public_action(hdr, skb->len) && |
3141 | !ieee80211_is_probe_req(hdr->frame_control) && | 3171 | !ieee80211_is_probe_req(hdr->frame_control) && |
3142 | !ieee80211_is_probe_resp(hdr->frame_control) && | 3172 | !ieee80211_is_probe_resp(hdr->frame_control) && |
3143 | !ieee80211_is_beacon(hdr->frame_control)) | 3173 | !ieee80211_is_beacon(hdr->frame_control)) |
3144 | return 0; | 3174 | return false; |
3145 | if (!ether_addr_equal(sdata->vif.addr, hdr->addr1) && | 3175 | if (!ether_addr_equal(sdata->vif.addr, hdr->addr1) && |
3146 | !multicast) | 3176 | !multicast) |
3147 | status->rx_flags &= ~IEEE80211_RX_RA_MATCH; | 3177 | status->rx_flags &= ~IEEE80211_RX_RA_MATCH; |
@@ -3152,7 +3182,7 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx, | |||
3152 | break; | 3182 | break; |
3153 | } | 3183 | } |
3154 | 3184 | ||
3155 | return 1; | 3185 | return true; |
3156 | } | 3186 | } |
3157 | 3187 | ||
3158 | /* | 3188 | /* |
@@ -3168,13 +3198,11 @@ static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx, | |||
3168 | struct ieee80211_sub_if_data *sdata = rx->sdata; | 3198 | struct ieee80211_sub_if_data *sdata = rx->sdata; |
3169 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); | 3199 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); |
3170 | struct ieee80211_hdr *hdr = (void *)skb->data; | 3200 | struct ieee80211_hdr *hdr = (void *)skb->data; |
3171 | int prepares; | ||
3172 | 3201 | ||
3173 | rx->skb = skb; | 3202 | rx->skb = skb; |
3174 | status->rx_flags |= IEEE80211_RX_RA_MATCH; | 3203 | status->rx_flags |= IEEE80211_RX_RA_MATCH; |
3175 | prepares = prepare_for_handlers(rx, hdr); | ||
3176 | 3204 | ||
3177 | if (!prepares) | 3205 | if (!prepare_for_handlers(rx, hdr)) |
3178 | return false; | 3206 | return false; |
3179 | 3207 | ||
3180 | if (!consume) { | 3208 | if (!consume) { |