Merge tag 'mac80211-next-for-davem-2015-02-03' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Last round of updates for net-next: * revert a patch that caused a regression with mesh userspace (Bob) * fix a number of suspend/resume related races (from Emmanuel, Luca and myself - we'll look at backporting later) * add software implementations for new ciphers (Jouni) * add a new ACPI ID for Broadcom's rfkill (Mika) * allow using netns FD for wireless (Vadim) * some other cleanups (various) Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -647,6 +647,7 @@ static int ieee80211_get_mmie_keyidx(struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_mgmt *hdr = (struct ieee80211_mgmt *) skb->data;
|
||||
struct ieee80211_mmie *mmie;
|
||||
struct ieee80211_mmie_16 *mmie16;
|
||||
|
||||
if (skb->len < 24 + sizeof(*mmie) || !is_multicast_ether_addr(hdr->da))
|
||||
return -1;
|
||||
@@ -656,11 +657,18 @@ static int ieee80211_get_mmie_keyidx(struct sk_buff *skb)
|
||||
|
||||
mmie = (struct ieee80211_mmie *)
|
||||
(skb->data + skb->len - sizeof(*mmie));
|
||||
if (mmie->element_id != WLAN_EID_MMIE ||
|
||||
mmie->length != sizeof(*mmie) - 2)
|
||||
return -1;
|
||||
if (mmie->element_id == WLAN_EID_MMIE &&
|
||||
mmie->length == sizeof(*mmie) - 2)
|
||||
return le16_to_cpu(mmie->key_id);
|
||||
|
||||
return le16_to_cpu(mmie->key_id);
|
||||
mmie16 = (struct ieee80211_mmie_16 *)
|
||||
(skb->data + skb->len - sizeof(*mmie16));
|
||||
if (skb->len >= 24 + sizeof(*mmie16) &&
|
||||
mmie16->element_id == WLAN_EID_MMIE &&
|
||||
mmie16->length == sizeof(*mmie16) - 2)
|
||||
return le16_to_cpu(mmie16->key_id);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int iwl80211_get_cs_keyid(const struct ieee80211_cipher_scheme *cs,
|
||||
@@ -1650,11 +1658,27 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
||||
result = ieee80211_crypto_tkip_decrypt(rx);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
result = ieee80211_crypto_ccmp_decrypt(rx);
|
||||
result = ieee80211_crypto_ccmp_decrypt(
|
||||
rx, IEEE80211_CCMP_MIC_LEN);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
result = ieee80211_crypto_ccmp_decrypt(
|
||||
rx, IEEE80211_CCMP_256_MIC_LEN);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
result = ieee80211_crypto_aes_cmac_decrypt(rx);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
result = ieee80211_crypto_aes_cmac_256_decrypt(rx);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
result = ieee80211_crypto_aes_gmac_decrypt(rx);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
result = ieee80211_crypto_gcmp_decrypt(rx);
|
||||
break;
|
||||
default:
|
||||
result = ieee80211_crypto_hw_decrypt(rx);
|
||||
}
|
||||
@@ -1781,7 +1805,9 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
|
||||
/* This is the first fragment of a new frame. */
|
||||
entry = ieee80211_reassemble_add(rx->sdata, frag, seq,
|
||||
rx->seqno_idx, &(rx->skb));
|
||||
if (rx->key && rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP &&
|
||||
if (rx->key &&
|
||||
(rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP ||
|
||||
rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256) &&
|
||||
ieee80211_has_protected(fc)) {
|
||||
int queue = rx->security_idx;
|
||||
/* Store CCMP PN so that we can verify that the next
|
||||
@@ -1810,7 +1836,9 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
|
||||
int i;
|
||||
u8 pn[IEEE80211_CCMP_PN_LEN], *rpn;
|
||||
int queue;
|
||||
if (!rx->key || rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP)
|
||||
if (!rx->key ||
|
||||
(rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP &&
|
||||
rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP_256))
|
||||
return RX_DROP_UNUSABLE;
|
||||
memcpy(pn, entry->last_pn, IEEE80211_CCMP_PN_LEN);
|
||||
for (i = IEEE80211_CCMP_PN_LEN - 1; i >= 0; i--) {
|
||||
@@ -2310,12 +2338,12 @@ ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
|
||||
return RX_DROP_MONITOR;
|
||||
|
||||
if (rx->sta) {
|
||||
/* The security index has the same property as needed
|
||||
/* The seqno index has the same property as needed
|
||||
* for the rx_msdu field, i.e. it is IEEE80211_NUM_TIDS
|
||||
* for non-QoS-data frames. Here we know it's a data
|
||||
* frame, so count MSDUs.
|
||||
*/
|
||||
rx->sta->rx_msdu[rx->security_idx]++;
|
||||
rx->sta->rx_msdu[rx->seqno_idx]++;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user