aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-11-16 07:58:20 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-11-18 17:09:17 -0500
commiteb9fb5b8883535c27d2cc5d4e4dbab3532f97b18 (patch)
treeb83fa5189be8144736ace469bb7bd1c294ae2f9c
parenta02ae758e8780d737b6d0135d6292bb3043e7eea (diff)
mac80211: trim RX data
The RX data contains the netdev, which is duplicated since we have the sdata, and the RX status pointer, which is duplicate since we have the skb. Remove those two fields to have fewer fields that depend on each other and simply load them as necessary. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--net/mac80211/ieee80211_i.h2
-rw-r--r--net/mac80211/rx.c80
-rw-r--r--net/mac80211/wep.c8
-rw-r--r--net/mac80211/wpa.c25
4 files changed, 61 insertions, 54 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index b7598db5ade2..c612981fc23e 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -167,12 +167,10 @@ typedef unsigned __bitwise__ ieee80211_rx_result;
167 167
168struct ieee80211_rx_data { 168struct ieee80211_rx_data {
169 struct sk_buff *skb; 169 struct sk_buff *skb;
170 struct net_device *dev;
171 struct ieee80211_local *local; 170 struct ieee80211_local *local;
172 struct ieee80211_sub_if_data *sdata; 171 struct ieee80211_sub_if_data *sdata;
173 struct sta_info *sta; 172 struct sta_info *sta;
174 struct ieee80211_key *key; 173 struct ieee80211_key *key;
175 struct ieee80211_rx_status *status;
176 struct ieee80211_rate *rate; 174 struct ieee80211_rate *rate;
177 175
178 unsigned int flags; 176 unsigned int flags;
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 37e9891605b4..904aaea081c8 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -477,7 +477,7 @@ ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
477{ 477{
478 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; 478 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
479 unsigned int hdrlen = ieee80211_hdrlen(hdr->frame_control); 479 unsigned int hdrlen = ieee80211_hdrlen(hdr->frame_control);
480 char *dev_addr = rx->dev->dev_addr; 480 char *dev_addr = rx->sdata->dev->dev_addr;
481 481
482 if (ieee80211_is_data(hdr->frame_control)) { 482 if (ieee80211_is_data(hdr->frame_control)) {
483 if (is_multicast_ether_addr(hdr->addr1)) { 483 if (is_multicast_ether_addr(hdr->addr1)) {
@@ -591,7 +591,9 @@ ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
591static ieee80211_rx_result debug_noinline 591static ieee80211_rx_result debug_noinline
592ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx) 592ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
593{ 593{
594 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; 594 struct sk_buff *skb = rx->skb;
595 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
596 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
595 int keyidx; 597 int keyidx;
596 int hdrlen; 598 int hdrlen;
597 ieee80211_rx_result result = RX_DROP_UNUSABLE; 599 ieee80211_rx_result result = RX_DROP_UNUSABLE;
@@ -645,8 +647,8 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
645 return RX_CONTINUE; 647 return RX_CONTINUE;
646 } else if (mmie_keyidx >= 0) { 648 } else if (mmie_keyidx >= 0) {
647 /* Broadcast/multicast robust management frame / BIP */ 649 /* Broadcast/multicast robust management frame / BIP */
648 if ((rx->status->flag & RX_FLAG_DECRYPTED) && 650 if ((status->flag & RX_FLAG_DECRYPTED) &&
649 (rx->status->flag & RX_FLAG_IV_STRIPPED)) 651 (status->flag & RX_FLAG_IV_STRIPPED))
650 return RX_CONTINUE; 652 return RX_CONTINUE;
651 653
652 if (mmie_keyidx < NUM_DEFAULT_KEYS || 654 if (mmie_keyidx < NUM_DEFAULT_KEYS ||
@@ -678,8 +680,8 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
678 * we somehow allow the driver to tell us which key 680 * we somehow allow the driver to tell us which key
679 * the hardware used if this flag is set? 681 * the hardware used if this flag is set?
680 */ 682 */
681 if ((rx->status->flag & RX_FLAG_DECRYPTED) && 683 if ((status->flag & RX_FLAG_DECRYPTED) &&
682 (rx->status->flag & RX_FLAG_IV_STRIPPED)) 684 (status->flag & RX_FLAG_IV_STRIPPED))
683 return RX_CONTINUE; 685 return RX_CONTINUE;
684 686
685 hdrlen = ieee80211_hdrlen(hdr->frame_control); 687 hdrlen = ieee80211_hdrlen(hdr->frame_control);
@@ -715,8 +717,8 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
715 /* Check for weak IVs if possible */ 717 /* Check for weak IVs if possible */
716 if (rx->sta && rx->key->conf.alg == ALG_WEP && 718 if (rx->sta && rx->key->conf.alg == ALG_WEP &&
717 ieee80211_is_data(hdr->frame_control) && 719 ieee80211_is_data(hdr->frame_control) &&
718 (!(rx->status->flag & RX_FLAG_IV_STRIPPED) || 720 (!(status->flag & RX_FLAG_IV_STRIPPED) ||
719 !(rx->status->flag & RX_FLAG_DECRYPTED)) && 721 !(status->flag & RX_FLAG_DECRYPTED)) &&
720 ieee80211_wep_is_weak_iv(rx->skb, rx->key)) 722 ieee80211_wep_is_weak_iv(rx->skb, rx->key))
721 rx->sta->wep_weak_iv_count++; 723 rx->sta->wep_weak_iv_count++;
722 724
@@ -736,7 +738,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
736 } 738 }
737 739
738 /* either the frame has been decrypted or will be dropped */ 740 /* either the frame has been decrypted or will be dropped */
739 rx->status->flag |= RX_FLAG_DECRYPTED; 741 status->flag |= RX_FLAG_DECRYPTED;
740 742
741 return result; 743 return result;
742} 744}
@@ -816,7 +818,9 @@ static ieee80211_rx_result debug_noinline
816ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx) 818ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
817{ 819{
818 struct sta_info *sta = rx->sta; 820 struct sta_info *sta = rx->sta;
819 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; 821 struct sk_buff *skb = rx->skb;
822 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
823 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
820 824
821 if (!sta) 825 if (!sta)
822 return RX_CONTINUE; 826 return RX_CONTINUE;
@@ -847,8 +851,8 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
847 851
848 sta->rx_fragments++; 852 sta->rx_fragments++;
849 sta->rx_bytes += rx->skb->len; 853 sta->rx_bytes += rx->skb->len;
850 sta->last_signal = rx->status->signal; 854 sta->last_signal = status->signal;
851 sta->last_noise = rx->status->noise; 855 sta->last_noise = status->noise;
852 856
853 /* 857 /*
854 * Change STA power saving mode only at the end of a frame 858 * Change STA power saving mode only at the end of a frame
@@ -1140,11 +1144,14 @@ ieee80211_802_1x_port_control(struct ieee80211_rx_data *rx)
1140static int 1144static int
1141ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc) 1145ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
1142{ 1146{
1147 struct sk_buff *skb = rx->skb;
1148 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
1149
1143 /* 1150 /*
1144 * Pass through unencrypted frames if the hardware has 1151 * Pass through unencrypted frames if the hardware has
1145 * decrypted them already. 1152 * decrypted them already.
1146 */ 1153 */
1147 if (rx->status->flag & RX_FLAG_DECRYPTED) 1154 if (status->flag & RX_FLAG_DECRYPTED)
1148 return 0; 1155 return 0;
1149 1156
1150 /* Drop unencrypted frames if key is set. */ 1157 /* Drop unencrypted frames if key is set. */
@@ -1178,8 +1185,8 @@ ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
1178static int 1185static int
1179__ieee80211_data_to_8023(struct ieee80211_rx_data *rx) 1186__ieee80211_data_to_8023(struct ieee80211_rx_data *rx)
1180{ 1187{
1181 struct net_device *dev = rx->dev; 1188 struct ieee80211_sub_if_data *sdata = rx->sdata;
1182 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 1189 struct net_device *dev = sdata->dev;
1183 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; 1190 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
1184 1191
1185 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->use_4addr && 1192 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->use_4addr &&
@@ -1205,7 +1212,7 @@ static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx, __le16 fc)
1205 * of whether the frame was encrypted or not. 1212 * of whether the frame was encrypted or not.
1206 */ 1213 */
1207 if (ehdr->h_proto == htons(ETH_P_PAE) && 1214 if (ehdr->h_proto == htons(ETH_P_PAE) &&
1208 (compare_ether_addr(ehdr->h_dest, rx->dev->dev_addr) == 0 || 1215 (compare_ether_addr(ehdr->h_dest, rx->sdata->dev->dev_addr) == 0 ||
1209 compare_ether_addr(ehdr->h_dest, pae_group_addr) == 0)) 1216 compare_ether_addr(ehdr->h_dest, pae_group_addr) == 0))
1210 return true; 1217 return true;
1211 1218
@@ -1222,10 +1229,10 @@ static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx, __le16 fc)
1222static void 1229static void
1223ieee80211_deliver_skb(struct ieee80211_rx_data *rx) 1230ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
1224{ 1231{
1225 struct net_device *dev = rx->dev; 1232 struct ieee80211_sub_if_data *sdata = rx->sdata;
1233 struct net_device *dev = sdata->dev;
1226 struct ieee80211_local *local = rx->local; 1234 struct ieee80211_local *local = rx->local;
1227 struct sk_buff *skb, *xmit_skb; 1235 struct sk_buff *skb, *xmit_skb;
1228 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1229 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; 1236 struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data;
1230 struct sta_info *dsta; 1237 struct sta_info *dsta;
1231 1238
@@ -1306,7 +1313,7 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
1306static ieee80211_rx_result debug_noinline 1313static ieee80211_rx_result debug_noinline
1307ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx) 1314ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
1308{ 1315{
1309 struct net_device *dev = rx->dev; 1316 struct net_device *dev = rx->sdata->dev;
1310 struct ieee80211_local *local = rx->local; 1317 struct ieee80211_local *local = rx->local;
1311 u16 ethertype; 1318 u16 ethertype;
1312 u8 *payload; 1319 u8 *payload;
@@ -1431,12 +1438,11 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
1431 unsigned int hdrlen; 1438 unsigned int hdrlen;
1432 struct sk_buff *skb = rx->skb, *fwd_skb; 1439 struct sk_buff *skb = rx->skb, *fwd_skb;
1433 struct ieee80211_local *local = rx->local; 1440 struct ieee80211_local *local = rx->local;
1434 struct ieee80211_sub_if_data *sdata; 1441 struct ieee80211_sub_if_data *sdata = rx->sdata;
1435 1442
1436 hdr = (struct ieee80211_hdr *) skb->data; 1443 hdr = (struct ieee80211_hdr *) skb->data;
1437 hdrlen = ieee80211_hdrlen(hdr->frame_control); 1444 hdrlen = ieee80211_hdrlen(hdr->frame_control);
1438 mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen); 1445 mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen);
1439 sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev);
1440 1446
1441 if (!ieee80211_is_data(hdr->frame_control)) 1447 if (!ieee80211_is_data(hdr->frame_control))
1442 return RX_CONTINUE; 1448 return RX_CONTINUE;
@@ -1474,7 +1480,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
1474 1480
1475 /* Frame has reached destination. Don't forward */ 1481 /* Frame has reached destination. Don't forward */
1476 if (!is_multicast_ether_addr(hdr->addr1) && 1482 if (!is_multicast_ether_addr(hdr->addr1) &&
1477 compare_ether_addr(rx->dev->dev_addr, hdr->addr3) == 0) 1483 compare_ether_addr(sdata->dev->dev_addr, hdr->addr3) == 0)
1478 return RX_CONTINUE; 1484 return RX_CONTINUE;
1479 1485
1480 mesh_hdr->ttl--; 1486 mesh_hdr->ttl--;
@@ -1491,10 +1497,10 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
1491 1497
1492 if (!fwd_skb && net_ratelimit()) 1498 if (!fwd_skb && net_ratelimit())
1493 printk(KERN_DEBUG "%s: failed to clone mesh frame\n", 1499 printk(KERN_DEBUG "%s: failed to clone mesh frame\n",
1494 rx->dev->name); 1500 sdata->dev->name);
1495 1501
1496 fwd_hdr = (struct ieee80211_hdr *) fwd_skb->data; 1502 fwd_hdr = (struct ieee80211_hdr *) fwd_skb->data;
1497 memcpy(fwd_hdr->addr2, rx->dev->dev_addr, ETH_ALEN); 1503 memcpy(fwd_hdr->addr2, sdata->dev->dev_addr, ETH_ALEN);
1498 info = IEEE80211_SKB_CB(fwd_skb); 1504 info = IEEE80211_SKB_CB(fwd_skb);
1499 memset(info, 0, sizeof(*info)); 1505 memset(info, 0, sizeof(*info));
1500 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; 1506 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
@@ -1528,7 +1534,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
1528 } 1534 }
1529 1535
1530 if (is_multicast_ether_addr(hdr->addr1) || 1536 if (is_multicast_ether_addr(hdr->addr1) ||
1531 rx->dev->flags & IFF_PROMISC) 1537 sdata->dev->flags & IFF_PROMISC)
1532 return RX_CONTINUE; 1538 return RX_CONTINUE;
1533 else 1539 else
1534 return RX_DROP_MONITOR; 1540 return RX_DROP_MONITOR;
@@ -1538,9 +1544,9 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
1538static ieee80211_rx_result debug_noinline 1544static ieee80211_rx_result debug_noinline
1539ieee80211_rx_h_data(struct ieee80211_rx_data *rx) 1545ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
1540{ 1546{
1541 struct net_device *dev = rx->dev; 1547 struct ieee80211_sub_if_data *sdata = rx->sdata;
1548 struct net_device *dev = sdata->dev;
1542 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; 1549 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
1543 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1544 __le16 fc = hdr->frame_control; 1550 __le16 fc = hdr->frame_control;
1545 int err; 1551 int err;
1546 1552
@@ -1664,7 +1670,7 @@ static ieee80211_rx_result debug_noinline
1664ieee80211_rx_h_action(struct ieee80211_rx_data *rx) 1670ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
1665{ 1671{
1666 struct ieee80211_local *local = rx->local; 1672 struct ieee80211_local *local = rx->local;
1667 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev); 1673 struct ieee80211_sub_if_data *sdata = rx->sdata;
1668 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; 1674 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;
1669 int len = rx->skb->len; 1675 int len = rx->skb->len;
1670 1676
@@ -1776,7 +1782,7 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
1776static ieee80211_rx_result debug_noinline 1782static ieee80211_rx_result debug_noinline
1777ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx) 1783ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
1778{ 1784{
1779 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev); 1785 struct ieee80211_sub_if_data *sdata = rx->sdata;
1780 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; 1786 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;
1781 1787
1782 if (!(rx->flags & IEEE80211_RX_RA_MATCH)) 1788 if (!(rx->flags & IEEE80211_RX_RA_MATCH))
@@ -1852,7 +1858,7 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx)
1852 } __attribute__ ((packed)) *rthdr; 1858 } __attribute__ ((packed)) *rthdr;
1853 struct sk_buff *skb = rx->skb, *skb2; 1859 struct sk_buff *skb = rx->skb, *skb2;
1854 struct net_device *prev_dev = NULL; 1860 struct net_device *prev_dev = NULL;
1855 struct ieee80211_rx_status *status = rx->status; 1861 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
1856 1862
1857 if (rx->flags & IEEE80211_RX_CMNTR_REPORTED) 1863 if (rx->flags & IEEE80211_RX_CMNTR_REPORTED)
1858 goto out_free_skb; 1864 goto out_free_skb;
@@ -1928,7 +1934,6 @@ static void ieee80211_invoke_rx_handlers(struct ieee80211_sub_if_data *sdata,
1928 1934
1929 rx->skb = skb; 1935 rx->skb = skb;
1930 rx->sdata = sdata; 1936 rx->sdata = sdata;
1931 rx->dev = sdata->dev;
1932 1937
1933#define CALL_RXH(rxh) \ 1938#define CALL_RXH(rxh) \
1934 do { \ 1939 do { \
@@ -1987,7 +1992,9 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
1987 struct ieee80211_rx_data *rx, 1992 struct ieee80211_rx_data *rx,
1988 struct ieee80211_hdr *hdr) 1993 struct ieee80211_hdr *hdr)
1989{ 1994{
1990 u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len, sdata->vif.type); 1995 struct sk_buff *skb = rx->skb;
1996 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
1997 u8 *bssid = ieee80211_get_bssid(hdr, skb->len, sdata->vif.type);
1991 int multicast = is_multicast_ether_addr(hdr->addr1); 1998 int multicast = is_multicast_ether_addr(hdr->addr1);
1992 1999
1993 switch (sdata->vif.type) { 2000 switch (sdata->vif.type) {
@@ -2019,10 +2026,10 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
2019 rx->flags &= ~IEEE80211_RX_RA_MATCH; 2026 rx->flags &= ~IEEE80211_RX_RA_MATCH;
2020 } else if (!rx->sta) { 2027 } else if (!rx->sta) {
2021 int rate_idx; 2028 int rate_idx;
2022 if (rx->status->flag & RX_FLAG_HT) 2029 if (status->flag & RX_FLAG_HT)
2023 rate_idx = 0; /* TODO: HT rates */ 2030 rate_idx = 0; /* TODO: HT rates */
2024 else 2031 else
2025 rate_idx = rx->status->rate_idx; 2032 rate_idx = status->rate_idx;
2026 rx->sta = ieee80211_ibss_add_sta(sdata, bssid, hdr->addr2, 2033 rx->sta = ieee80211_ibss_add_sta(sdata, bssid, hdr->addr2,
2027 BIT(rate_idx)); 2034 BIT(rate_idx));
2028 } 2035 }
@@ -2088,7 +2095,6 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
2088 memset(&rx, 0, sizeof(rx)); 2095 memset(&rx, 0, sizeof(rx));
2089 rx.skb = skb; 2096 rx.skb = skb;
2090 rx.local = local; 2097 rx.local = local;
2091 rx.status = status;
2092 rx.rate = rate; 2098 rx.rate = rate;
2093 2099
2094 if (ieee80211_is_data(hdr->frame_control) || ieee80211_is_mgmt(hdr->frame_control)) 2100 if (ieee80211_is_data(hdr->frame_control) || ieee80211_is_mgmt(hdr->frame_control))
@@ -2102,10 +2108,8 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
2102 ieee80211_verify_alignment(&rx); 2108 ieee80211_verify_alignment(&rx);
2103 2109
2104 rx.sta = sta_info_get(local, hdr->addr2); 2110 rx.sta = sta_info_get(local, hdr->addr2);
2105 if (rx.sta) { 2111 if (rx.sta)
2106 rx.sdata = rx.sta->sdata; 2112 rx.sdata = rx.sta->sdata;
2107 rx.dev = rx.sta->sdata->dev;
2108 }
2109 2113
2110 if (rx.sdata && ieee80211_is_data(hdr->frame_control)) { 2114 if (rx.sdata && ieee80211_is_data(hdr->frame_control)) {
2111 rx.flags |= IEEE80211_RX_RA_MATCH; 2115 rx.flags |= IEEE80211_RX_RA_MATCH;
diff --git a/net/mac80211/wep.c b/net/mac80211/wep.c
index 8a980f136941..247123fe1a7a 100644
--- a/net/mac80211/wep.c
+++ b/net/mac80211/wep.c
@@ -281,16 +281,18 @@ bool ieee80211_wep_is_weak_iv(struct sk_buff *skb, struct ieee80211_key *key)
281ieee80211_rx_result 281ieee80211_rx_result
282ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx) 282ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx)
283{ 283{
284 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; 284 struct sk_buff *skb = rx->skb;
285 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
286 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
285 287
286 if (!ieee80211_is_data(hdr->frame_control) && 288 if (!ieee80211_is_data(hdr->frame_control) &&
287 !ieee80211_is_auth(hdr->frame_control)) 289 !ieee80211_is_auth(hdr->frame_control))
288 return RX_CONTINUE; 290 return RX_CONTINUE;
289 291
290 if (!(rx->status->flag & RX_FLAG_DECRYPTED)) { 292 if (!(status->flag & RX_FLAG_DECRYPTED)) {
291 if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) 293 if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key))
292 return RX_DROP_UNUSABLE; 294 return RX_DROP_UNUSABLE;
293 } else if (!(rx->status->flag & RX_FLAG_IV_STRIPPED)) { 295 } else if (!(status->flag & RX_FLAG_IV_STRIPPED)) {
294 ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key); 296 ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key);
295 /* remove ICV */ 297 /* remove ICV */
296 skb_trim(rx->skb, rx->skb->len - WEP_ICV_LEN); 298 skb_trim(rx->skb, rx->skb->len - WEP_ICV_LEN);
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c
index 70778694877b..5332014cb229 100644
--- a/net/mac80211/wpa.c
+++ b/net/mac80211/wpa.c
@@ -85,16 +85,16 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
85 u8 *data, *key = NULL, key_offset; 85 u8 *data, *key = NULL, key_offset;
86 size_t data_len; 86 size_t data_len;
87 unsigned int hdrlen; 87 unsigned int hdrlen;
88 struct ieee80211_hdr *hdr;
89 u8 mic[MICHAEL_MIC_LEN]; 88 u8 mic[MICHAEL_MIC_LEN];
90 struct sk_buff *skb = rx->skb; 89 struct sk_buff *skb = rx->skb;
90 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
91 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
91 int authenticator = 1, wpa_test = 0; 92 int authenticator = 1, wpa_test = 0;
92 93
93 /* No way to verify the MIC if the hardware stripped it */ 94 /* No way to verify the MIC if the hardware stripped it */
94 if (rx->status->flag & RX_FLAG_MMIC_STRIPPED) 95 if (status->flag & RX_FLAG_MMIC_STRIPPED)
95 return RX_CONTINUE; 96 return RX_CONTINUE;
96 97
97 hdr = (struct ieee80211_hdr *)skb->data;
98 if (!rx->key || rx->key->conf.alg != ALG_TKIP || 98 if (!rx->key || rx->key->conf.alg != ALG_TKIP ||
99 !ieee80211_has_protected(hdr->frame_control) || 99 !ieee80211_has_protected(hdr->frame_control) ||
100 !ieee80211_is_data_present(hdr->frame_control)) 100 !ieee80211_is_data_present(hdr->frame_control))
@@ -216,6 +216,7 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
216 int hdrlen, res, hwaccel = 0, wpa_test = 0; 216 int hdrlen, res, hwaccel = 0, wpa_test = 0;
217 struct ieee80211_key *key = rx->key; 217 struct ieee80211_key *key = rx->key;
218 struct sk_buff *skb = rx->skb; 218 struct sk_buff *skb = rx->skb;
219 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
219 220
220 hdrlen = ieee80211_hdrlen(hdr->frame_control); 221 hdrlen = ieee80211_hdrlen(hdr->frame_control);
221 222
@@ -225,8 +226,8 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
225 if (!rx->sta || skb->len - hdrlen < 12) 226 if (!rx->sta || skb->len - hdrlen < 12)
226 return RX_DROP_UNUSABLE; 227 return RX_DROP_UNUSABLE;
227 228
228 if (rx->status->flag & RX_FLAG_DECRYPTED) { 229 if (status->flag & RX_FLAG_DECRYPTED) {
229 if (rx->status->flag & RX_FLAG_IV_STRIPPED) { 230 if (status->flag & RX_FLAG_IV_STRIPPED) {
230 /* 231 /*
231 * Hardware took care of all processing, including 232 * Hardware took care of all processing, including
232 * replay protection, and stripped the ICV/IV so 233 * replay protection, and stripped the ICV/IV so
@@ -442,6 +443,7 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx)
442 int hdrlen; 443 int hdrlen;
443 struct ieee80211_key *key = rx->key; 444 struct ieee80211_key *key = rx->key;
444 struct sk_buff *skb = rx->skb; 445 struct sk_buff *skb = rx->skb;
446 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
445 u8 pn[CCMP_PN_LEN]; 447 u8 pn[CCMP_PN_LEN];
446 int data_len; 448 int data_len;
447 449
@@ -455,8 +457,8 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx)
455 if (!rx->sta || data_len < 0) 457 if (!rx->sta || data_len < 0)
456 return RX_DROP_UNUSABLE; 458 return RX_DROP_UNUSABLE;
457 459
458 if ((rx->status->flag & RX_FLAG_DECRYPTED) && 460 if ((status->flag & RX_FLAG_DECRYPTED) &&
459 (rx->status->flag & RX_FLAG_IV_STRIPPED)) 461 (status->flag & RX_FLAG_IV_STRIPPED))
460 return RX_CONTINUE; 462 return RX_CONTINUE;
461 463
462 ccmp_hdr2pn(pn, skb->data + hdrlen); 464 ccmp_hdr2pn(pn, skb->data + hdrlen);
@@ -466,7 +468,7 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx)
466 return RX_DROP_UNUSABLE; 468 return RX_DROP_UNUSABLE;
467 } 469 }
468 470
469 if (!(rx->status->flag & RX_FLAG_DECRYPTED)) { 471 if (!(status->flag & RX_FLAG_DECRYPTED)) {
470 /* hardware didn't decrypt/verify MIC */ 472 /* hardware didn't decrypt/verify MIC */
471 ccmp_special_blocks(skb, pn, key->u.ccmp.rx_crypto_buf, 1); 473 ccmp_special_blocks(skb, pn, key->u.ccmp.rx_crypto_buf, 1);
472 474
@@ -563,6 +565,7 @@ ieee80211_rx_result
563ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx) 565ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx)
564{ 566{
565 struct sk_buff *skb = rx->skb; 567 struct sk_buff *skb = rx->skb;
568 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
566 struct ieee80211_key *key = rx->key; 569 struct ieee80211_key *key = rx->key;
567 struct ieee80211_mmie *mmie; 570 struct ieee80211_mmie *mmie;
568 u8 aad[20], mic[8], ipn[6]; 571 u8 aad[20], mic[8], ipn[6];
@@ -571,8 +574,8 @@ ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx)
571 if (!ieee80211_is_mgmt(hdr->frame_control)) 574 if (!ieee80211_is_mgmt(hdr->frame_control))
572 return RX_CONTINUE; 575 return RX_CONTINUE;
573 576
574 if ((rx->status->flag & RX_FLAG_DECRYPTED) && 577 if ((status->flag & RX_FLAG_DECRYPTED) &&
575 (rx->status->flag & RX_FLAG_IV_STRIPPED)) 578 (status->flag & RX_FLAG_IV_STRIPPED))
576 return RX_CONTINUE; 579 return RX_CONTINUE;
577 580
578 if (skb->len < 24 + sizeof(*mmie)) 581 if (skb->len < 24 + sizeof(*mmie))
@@ -591,7 +594,7 @@ ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx)
591 return RX_DROP_UNUSABLE; 594 return RX_DROP_UNUSABLE;
592 } 595 }
593 596
594 if (!(rx->status->flag & RX_FLAG_DECRYPTED)) { 597 if (!(status->flag & RX_FLAG_DECRYPTED)) {
595 /* hardware didn't decrypt/verify MIC */ 598 /* hardware didn't decrypt/verify MIC */
596 bip_aad(skb, aad); 599 bip_aad(skb, aad);
597 ieee80211_aes_cmac(key->u.aes_cmac.tfm, 600 ieee80211_aes_cmac(key->u.aes_cmac.tfm,