mac80211: use ieee80211 frame control directly
Remove the last users of the rx/tx_data->fc data members and use the le16 frame_control from the header directly. Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
e7827a7031
commit
358c8d9d33
@@ -867,16 +867,18 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
|
|||||||
{
|
{
|
||||||
struct ieee80211_hdr *hdr;
|
struct ieee80211_hdr *hdr;
|
||||||
u16 sc;
|
u16 sc;
|
||||||
|
__le16 fc;
|
||||||
unsigned int frag, seq;
|
unsigned int frag, seq;
|
||||||
struct ieee80211_fragment_entry *entry;
|
struct ieee80211_fragment_entry *entry;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
DECLARE_MAC_BUF(mac);
|
DECLARE_MAC_BUF(mac);
|
||||||
|
|
||||||
hdr = (struct ieee80211_hdr *)rx->skb->data;
|
hdr = (struct ieee80211_hdr *)rx->skb->data;
|
||||||
|
fc = hdr->frame_control;
|
||||||
sc = le16_to_cpu(hdr->seq_ctrl);
|
sc = le16_to_cpu(hdr->seq_ctrl);
|
||||||
frag = sc & IEEE80211_SCTL_FRAG;
|
frag = sc & IEEE80211_SCTL_FRAG;
|
||||||
|
|
||||||
if (likely((!ieee80211_has_morefrags(hdr->frame_control) && frag == 0) ||
|
if (likely((!ieee80211_has_morefrags(fc) && frag == 0) ||
|
||||||
(rx->skb)->len < 24 ||
|
(rx->skb)->len < 24 ||
|
||||||
is_multicast_ether_addr(hdr->addr1))) {
|
is_multicast_ether_addr(hdr->addr1))) {
|
||||||
/* not fragmented */
|
/* not fragmented */
|
||||||
@@ -891,7 +893,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
|
|||||||
entry = ieee80211_reassemble_add(rx->sdata, frag, seq,
|
entry = ieee80211_reassemble_add(rx->sdata, frag, seq,
|
||||||
rx->queue, &(rx->skb));
|
rx->queue, &(rx->skb));
|
||||||
if (rx->key && rx->key->conf.alg == ALG_CCMP &&
|
if (rx->key && rx->key->conf.alg == ALG_CCMP &&
|
||||||
ieee80211_has_protected(hdr->frame_control)) {
|
ieee80211_has_protected(fc)) {
|
||||||
/* Store CCMP PN so that we can verify that the next
|
/* Store CCMP PN so that we can verify that the next
|
||||||
* fragment has a sequential PN value. */
|
* fragment has a sequential PN value. */
|
||||||
entry->ccmp = 1;
|
entry->ccmp = 1;
|
||||||
@@ -930,11 +932,11 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
|
|||||||
memcpy(entry->last_pn, pn, CCMP_PN_LEN);
|
memcpy(entry->last_pn, pn, CCMP_PN_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
skb_pull(rx->skb, ieee80211_hdrlen(hdr->frame_control));
|
skb_pull(rx->skb, ieee80211_hdrlen(fc));
|
||||||
__skb_queue_tail(&entry->skb_list, rx->skb);
|
__skb_queue_tail(&entry->skb_list, rx->skb);
|
||||||
entry->last_frag = frag;
|
entry->last_frag = frag;
|
||||||
entry->extra_len += rx->skb->len;
|
entry->extra_len += rx->skb->len;
|
||||||
if (rx->fc & IEEE80211_FCTL_MOREFRAGS) {
|
if (ieee80211_has_morefrags(fc)) {
|
||||||
rx->skb = NULL;
|
rx->skb = NULL;
|
||||||
return RX_QUEUED;
|
return RX_QUEUED;
|
||||||
}
|
}
|
||||||
@@ -974,10 +976,9 @@ ieee80211_rx_h_ps_poll(struct ieee80211_rx_data *rx)
|
|||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
int no_pending_pkts;
|
int no_pending_pkts;
|
||||||
DECLARE_MAC_BUF(mac);
|
DECLARE_MAC_BUF(mac);
|
||||||
|
__le16 fc = ((struct ieee80211_hdr *)rx->skb->data)->frame_control;
|
||||||
|
|
||||||
if (likely(!rx->sta ||
|
if (likely(!rx->sta || !ieee80211_is_pspoll(fc) ||
|
||||||
(rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_CTL ||
|
|
||||||
(rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_PSPOLL ||
|
|
||||||
!(rx->flags & IEEE80211_RX_RA_MATCH)))
|
!(rx->flags & IEEE80211_RX_RA_MATCH)))
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
|
|
||||||
@@ -1073,7 +1074,7 @@ ieee80211_802_1x_port_control(struct ieee80211_rx_data *rx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx)
|
ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Pass through unencrypted frames if the hardware has
|
* Pass through unencrypted frames if the hardware has
|
||||||
@@ -1083,9 +1084,8 @@ ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Drop unencrypted frames if key is set. */
|
/* Drop unencrypted frames if key is set. */
|
||||||
if (unlikely(!(rx->fc & IEEE80211_FCTL_PROTECTED) &&
|
if (unlikely(!ieee80211_has_protected(fc) &&
|
||||||
(rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA &&
|
!ieee80211_is_nullfunc(fc) &&
|
||||||
(rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_NULLFUNC &&
|
|
||||||
(rx->key || rx->sdata->drop_unencrypted)))
|
(rx->key || rx->sdata->drop_unencrypted)))
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
|
||||||
@@ -1184,7 +1184,7 @@ ieee80211_data_to_8023(struct ieee80211_rx_data *rx)
|
|||||||
/*
|
/*
|
||||||
* requires that rx->skb is a frame with ethernet header
|
* requires that rx->skb is a frame with ethernet header
|
||||||
*/
|
*/
|
||||||
static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx)
|
static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx, __le16 fc)
|
||||||
{
|
{
|
||||||
static const u8 pae_group_addr[ETH_ALEN] __aligned(2)
|
static const u8 pae_group_addr[ETH_ALEN] __aligned(2)
|
||||||
= { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x03 };
|
= { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x03 };
|
||||||
@@ -1200,7 +1200,7 @@ static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx)
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (ieee80211_802_1x_port_control(rx) ||
|
if (ieee80211_802_1x_port_control(rx) ||
|
||||||
ieee80211_drop_unencrypted(rx))
|
ieee80211_drop_unencrypted(rx, fc))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -1270,20 +1270,21 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
|
|||||||
{
|
{
|
||||||
struct net_device *dev = rx->dev;
|
struct net_device *dev = rx->dev;
|
||||||
struct ieee80211_local *local = rx->local;
|
struct ieee80211_local *local = rx->local;
|
||||||
u16 fc, ethertype;
|
u16 ethertype;
|
||||||
u8 *payload;
|
u8 *payload;
|
||||||
struct sk_buff *skb = rx->skb, *frame = NULL;
|
struct sk_buff *skb = rx->skb, *frame = NULL;
|
||||||
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||||
|
__le16 fc = hdr->frame_control;
|
||||||
const struct ethhdr *eth;
|
const struct ethhdr *eth;
|
||||||
int remaining, err;
|
int remaining, err;
|
||||||
u8 dst[ETH_ALEN];
|
u8 dst[ETH_ALEN];
|
||||||
u8 src[ETH_ALEN];
|
u8 src[ETH_ALEN];
|
||||||
DECLARE_MAC_BUF(mac);
|
DECLARE_MAC_BUF(mac);
|
||||||
|
|
||||||
fc = rx->fc;
|
if (unlikely(!ieee80211_is_data(fc)))
|
||||||
if (unlikely((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA))
|
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
|
|
||||||
if (unlikely(!WLAN_FC_DATA_PRESENT(fc)))
|
if (unlikely(!ieee80211_is_data_present(fc)))
|
||||||
return RX_DROP_MONITOR;
|
return RX_DROP_MONITOR;
|
||||||
|
|
||||||
if (!(rx->flags & IEEE80211_RX_AMSDU))
|
if (!(rx->flags & IEEE80211_RX_AMSDU))
|
||||||
@@ -1365,7 +1366,7 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
|
|||||||
memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN);
|
memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ieee80211_frame_allowed(rx)) {
|
if (!ieee80211_frame_allowed(rx, fc)) {
|
||||||
if (skb == frame) /* last frame */
|
if (skb == frame) /* last frame */
|
||||||
return RX_DROP_UNUSABLE;
|
return RX_DROP_UNUSABLE;
|
||||||
dev_kfree_skb(frame);
|
dev_kfree_skb(frame);
|
||||||
@@ -1439,21 +1440,21 @@ static ieee80211_rx_result debug_noinline
|
|||||||
ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
|
ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
|
||||||
{
|
{
|
||||||
struct net_device *dev = rx->dev;
|
struct net_device *dev = rx->dev;
|
||||||
u16 fc;
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
|
||||||
|
__le16 fc = hdr->frame_control;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
fc = rx->fc;
|
if (unlikely(!ieee80211_is_data(hdr->frame_control)))
|
||||||
if (unlikely((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA))
|
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
|
|
||||||
if (unlikely(!WLAN_FC_DATA_PRESENT(fc)))
|
if (unlikely(!ieee80211_is_data_present(hdr->frame_control)))
|
||||||
return RX_DROP_MONITOR;
|
return RX_DROP_MONITOR;
|
||||||
|
|
||||||
err = ieee80211_data_to_8023(rx);
|
err = ieee80211_data_to_8023(rx);
|
||||||
if (unlikely(err))
|
if (unlikely(err))
|
||||||
return RX_DROP_UNUSABLE;
|
return RX_DROP_UNUSABLE;
|
||||||
|
|
||||||
if (!ieee80211_frame_allowed(rx))
|
if (!ieee80211_frame_allowed(rx, fc))
|
||||||
return RX_DROP_MONITOR;
|
return RX_DROP_MONITOR;
|
||||||
|
|
||||||
rx->skb->dev = dev;
|
rx->skb->dev = dev;
|
||||||
@@ -1818,13 +1819,12 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
|
|||||||
struct ieee80211_sub_if_data *sdata;
|
struct ieee80211_sub_if_data *sdata;
|
||||||
struct ieee80211_hdr *hdr;
|
struct ieee80211_hdr *hdr;
|
||||||
struct ieee80211_rx_data rx;
|
struct ieee80211_rx_data rx;
|
||||||
u16 type;
|
|
||||||
int prepares;
|
int prepares;
|
||||||
struct ieee80211_sub_if_data *prev = NULL;
|
struct ieee80211_sub_if_data *prev = NULL;
|
||||||
struct sk_buff *skb_new;
|
struct sk_buff *skb_new;
|
||||||
u8 *bssid;
|
u8 *bssid;
|
||||||
|
|
||||||
hdr = (struct ieee80211_hdr *) skb->data;
|
hdr = (struct ieee80211_hdr *)skb->data;
|
||||||
memset(&rx, 0, sizeof(rx));
|
memset(&rx, 0, sizeof(rx));
|
||||||
rx.skb = skb;
|
rx.skb = skb;
|
||||||
rx.local = local;
|
rx.local = local;
|
||||||
@@ -1832,9 +1832,8 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
|
|||||||
rx.status = status;
|
rx.status = status;
|
||||||
rx.rate = rate;
|
rx.rate = rate;
|
||||||
rx.fc = le16_to_cpu(hdr->frame_control);
|
rx.fc = le16_to_cpu(hdr->frame_control);
|
||||||
type = rx.fc & IEEE80211_FCTL_FTYPE;
|
|
||||||
|
|
||||||
if (type == IEEE80211_FTYPE_DATA || type == IEEE80211_FTYPE_MGMT)
|
if (ieee80211_is_data(hdr->frame_control) || ieee80211_is_mgmt(hdr->frame_control))
|
||||||
local->dot11ReceivedFragmentCount++;
|
local->dot11ReceivedFragmentCount++;
|
||||||
|
|
||||||
rx.sta = sta_info_get(local, hdr->addr2);
|
rx.sta = sta_info_get(local, hdr->addr2);
|
||||||
|
@@ -82,6 +82,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr,
|
|||||||
struct ieee80211_rate *txrate;
|
struct ieee80211_rate *txrate;
|
||||||
struct ieee80211_local *local = tx->local;
|
struct ieee80211_local *local = tx->local;
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
|
struct ieee80211_hdr *hdr;
|
||||||
|
|
||||||
sband = local->hw.wiphy->bands[tx->channel->band];
|
sband = local->hw.wiphy->bands[tx->channel->band];
|
||||||
txrate = &sband->bitrates[tx->rate_idx];
|
txrate = &sband->bitrates[tx->rate_idx];
|
||||||
@@ -107,8 +108,8 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr,
|
|||||||
* at the highest possible rate belonging to the PHY rates in the
|
* at the highest possible rate belonging to the PHY rates in the
|
||||||
* BSSBasicRateSet
|
* BSSBasicRateSet
|
||||||
*/
|
*/
|
||||||
|
hdr = (struct ieee80211_hdr *)tx->skb->data;
|
||||||
if ((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) {
|
if (ieee80211_is_ctl(hdr->frame_control)) {
|
||||||
/* TODO: These control frames are not currently sent by
|
/* TODO: These control frames are not currently sent by
|
||||||
* 80211.o, but should they be implemented, this function
|
* 80211.o, but should they be implemented, this function
|
||||||
* needs to be updated to support duration field calculation.
|
* needs to be updated to support duration field calculation.
|
||||||
@@ -213,9 +214,8 @@ static int inline is_ieee80211_device(struct net_device *dev,
|
|||||||
static ieee80211_tx_result debug_noinline
|
static ieee80211_tx_result debug_noinline
|
||||||
ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
|
ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
|
|
||||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
|
||||||
#endif /* CONFIG_MAC80211_VERBOSE_DEBUG */
|
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
||||||
u32 sta_flags;
|
u32 sta_flags;
|
||||||
|
|
||||||
@@ -223,8 +223,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
|
|||||||
return TX_CONTINUE;
|
return TX_CONTINUE;
|
||||||
|
|
||||||
if (unlikely(tx->local->sta_sw_scanning) &&
|
if (unlikely(tx->local->sta_sw_scanning) &&
|
||||||
((tx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT ||
|
!ieee80211_is_probe_req(hdr->frame_control))
|
||||||
(tx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_PROBE_REQ))
|
|
||||||
return TX_DROP;
|
return TX_DROP;
|
||||||
|
|
||||||
if (tx->sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT)
|
if (tx->sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT)
|
||||||
@@ -238,7 +237,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
|
|||||||
if (likely(tx->flags & IEEE80211_TX_UNICAST)) {
|
if (likely(tx->flags & IEEE80211_TX_UNICAST)) {
|
||||||
if (unlikely(!(sta_flags & WLAN_STA_ASSOC) &&
|
if (unlikely(!(sta_flags & WLAN_STA_ASSOC) &&
|
||||||
tx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS &&
|
tx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS &&
|
||||||
(tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)) {
|
ieee80211_is_data(hdr->frame_control))) {
|
||||||
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
|
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
|
||||||
DECLARE_MAC_BUF(mac);
|
DECLARE_MAC_BUF(mac);
|
||||||
printk(KERN_DEBUG "%s: dropped data frame to not "
|
printk(KERN_DEBUG "%s: dropped data frame to not "
|
||||||
@@ -249,7 +248,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
|
|||||||
return TX_DROP;
|
return TX_DROP;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (unlikely((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA &&
|
if (unlikely(ieee80211_is_data(hdr->frame_control) &&
|
||||||
tx->local->num_sta == 0 &&
|
tx->local->num_sta == 0 &&
|
||||||
tx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS)) {
|
tx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS)) {
|
||||||
/*
|
/*
|
||||||
@@ -315,6 +314,7 @@ static ieee80211_tx_result
|
|||||||
ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
|
ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
|
||||||
{
|
{
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
||||||
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* broadcast/multicast frame
|
* broadcast/multicast frame
|
||||||
@@ -329,7 +329,7 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
|
|||||||
return TX_CONTINUE;
|
return TX_CONTINUE;
|
||||||
|
|
||||||
/* no buffering for ordered frames */
|
/* no buffering for ordered frames */
|
||||||
if (tx->fc & IEEE80211_FCTL_ORDER)
|
if (ieee80211_has_order(hdr->frame_control))
|
||||||
return TX_CONTINUE;
|
return TX_CONTINUE;
|
||||||
|
|
||||||
/* no stations in PS mode */
|
/* no stations in PS mode */
|
||||||
@@ -367,12 +367,11 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
|
|||||||
{
|
{
|
||||||
struct sta_info *sta = tx->sta;
|
struct sta_info *sta = tx->sta;
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
||||||
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
|
||||||
u32 staflags;
|
u32 staflags;
|
||||||
DECLARE_MAC_BUF(mac);
|
DECLARE_MAC_BUF(mac);
|
||||||
|
|
||||||
if (unlikely(!sta ||
|
if (unlikely(!sta || ieee80211_is_probe_resp(hdr->frame_control)))
|
||||||
((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT &&
|
|
||||||
(tx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP)))
|
|
||||||
return TX_CONTINUE;
|
return TX_CONTINUE;
|
||||||
|
|
||||||
staflags = get_sta_flags(sta);
|
staflags = get_sta_flags(sta);
|
||||||
@@ -437,7 +436,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
|
|||||||
{
|
{
|
||||||
struct ieee80211_key *key;
|
struct ieee80211_key *key;
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
||||||
u16 fc = tx->fc;
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
|
||||||
|
|
||||||
if (unlikely(tx->skb->do_not_encrypt))
|
if (unlikely(tx->skb->do_not_encrypt))
|
||||||
tx->key = NULL;
|
tx->key = NULL;
|
||||||
@@ -454,22 +453,16 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
|
|||||||
tx->key = NULL;
|
tx->key = NULL;
|
||||||
|
|
||||||
if (tx->key) {
|
if (tx->key) {
|
||||||
u16 ftype, stype;
|
|
||||||
|
|
||||||
tx->key->tx_rx_count++;
|
tx->key->tx_rx_count++;
|
||||||
/* TODO: add threshold stuff again */
|
/* TODO: add threshold stuff again */
|
||||||
|
|
||||||
switch (tx->key->conf.alg) {
|
switch (tx->key->conf.alg) {
|
||||||
case ALG_WEP:
|
case ALG_WEP:
|
||||||
ftype = fc & IEEE80211_FCTL_FTYPE;
|
if (ieee80211_is_auth(hdr->frame_control))
|
||||||
stype = fc & IEEE80211_FCTL_STYPE;
|
|
||||||
|
|
||||||
if (ftype == IEEE80211_FTYPE_MGMT &&
|
|
||||||
stype == IEEE80211_STYPE_AUTH)
|
|
||||||
break;
|
break;
|
||||||
case ALG_TKIP:
|
case ALG_TKIP:
|
||||||
case ALG_CCMP:
|
case ALG_CCMP:
|
||||||
if (!WLAN_FC_DATA_PRESENT(fc))
|
if (!ieee80211_is_data_present(hdr->frame_control))
|
||||||
tx->key = NULL;
|
tx->key = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -291,9 +291,10 @@ u8 * ieee80211_wep_is_weak_iv(struct sk_buff *skb, struct ieee80211_key *key)
|
|||||||
ieee80211_rx_result
|
ieee80211_rx_result
|
||||||
ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx)
|
ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx)
|
||||||
{
|
{
|
||||||
if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA &&
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
|
||||||
((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT ||
|
|
||||||
(rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_AUTH))
|
if (!ieee80211_is_data(hdr->frame_control) &&
|
||||||
|
!ieee80211_is_auth(hdr->frame_control))
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
|
|
||||||
if (!(rx->status->flag & RX_FLAG_DECRYPTED)) {
|
if (!(rx->status->flag & RX_FLAG_DECRYPTED)) {
|
||||||
|
Reference in New Issue
Block a user