mac80211: remove one user of ieee80211_get_hdr_info
ccmp_special_blocks was only using it to calculate data_len, calculate that directly. Use unaligned helpers rather than masking/shifting. Use symbolic constants for the masked frame_control, and do it directly on a le16 value. Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
73e1f7c823
commit
f14df8049f
|
@ -11,6 +11,8 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
|
#include <linux/ieee80211.h>
|
||||||
|
#include <asm/unaligned.h>
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
|
|
||||||
#include "ieee80211_i.h"
|
#include "ieee80211_i.h"
|
||||||
|
@ -296,67 +298,61 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
|
||||||
static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad,
|
static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad,
|
||||||
int encrypted)
|
int encrypted)
|
||||||
{
|
{
|
||||||
u16 fc;
|
__le16 mask_fc;
|
||||||
int a4_included, qos_included;
|
int a4_included;
|
||||||
u8 qos_tid, *fc_pos, *data, *sa, *da;
|
u8 qos_tid;
|
||||||
int len_a;
|
u16 data_len, len_a;
|
||||||
size_t data_len;
|
unsigned int hdrlen;
|
||||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||||
|
|
||||||
fc_pos = (u8 *) &hdr->frame_control;
|
/*
|
||||||
fc = fc_pos[0] ^ (fc_pos[1] << 8);
|
* Mask FC: zero subtype b4 b5 b6
|
||||||
a4_included = (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
|
* Retry, PwrMgt, MoreData; set Protected
|
||||||
(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
|
*/
|
||||||
|
mask_fc = hdr->frame_control;
|
||||||
|
mask_fc &= ~cpu_to_le16(0x0070 | IEEE80211_FCTL_RETRY |
|
||||||
|
IEEE80211_FCTL_PM | IEEE80211_FCTL_MOREDATA);
|
||||||
|
mask_fc |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
|
||||||
|
|
||||||
|
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||||
|
len_a = hdrlen - 2;
|
||||||
|
a4_included = ieee80211_has_a4(hdr->frame_control);
|
||||||
|
|
||||||
|
if (ieee80211_is_data_qos(hdr->frame_control))
|
||||||
|
qos_tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
|
||||||
|
else
|
||||||
|
qos_tid = 0;
|
||||||
|
|
||||||
|
data_len = skb->len - hdrlen - CCMP_HDR_LEN;
|
||||||
|
if (encrypted)
|
||||||
|
data_len -= CCMP_MIC_LEN;
|
||||||
|
|
||||||
ieee80211_get_hdr_info(skb, &sa, &da, &qos_tid, &data, &data_len);
|
|
||||||
data_len -= CCMP_HDR_LEN + (encrypted ? CCMP_MIC_LEN : 0);
|
|
||||||
if (qos_tid & 0x80) {
|
|
||||||
qos_included = 1;
|
|
||||||
qos_tid &= IEEE80211_QOS_CTL_TID_MASK;
|
|
||||||
} else
|
|
||||||
qos_included = 0;
|
|
||||||
/* First block, b_0 */
|
/* First block, b_0 */
|
||||||
|
|
||||||
b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
|
b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
|
||||||
/* Nonce: QoS Priority | A2 | PN */
|
/* Nonce: QoS Priority | A2 | PN */
|
||||||
b_0[1] = qos_tid;
|
b_0[1] = qos_tid;
|
||||||
memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
|
memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
|
||||||
memcpy(&b_0[8], pn, CCMP_PN_LEN);
|
memcpy(&b_0[8], pn, CCMP_PN_LEN);
|
||||||
/* l(m) */
|
/* l(m) */
|
||||||
b_0[14] = (data_len >> 8) & 0xff;
|
put_unaligned_be16(data_len, &b_0[14]);
|
||||||
b_0[15] = data_len & 0xff;
|
|
||||||
|
|
||||||
|
|
||||||
/* AAD (extra authenticate-only data) / masked 802.11 header
|
/* AAD (extra authenticate-only data) / masked 802.11 header
|
||||||
* FC | A1 | A2 | A3 | SC | [A4] | [QC] */
|
* FC | A1 | A2 | A3 | SC | [A4] | [QC] */
|
||||||
|
put_unaligned_be16(len_a, &aad[0]);
|
||||||
len_a = a4_included ? 28 : 22;
|
put_unaligned(mask_fc, (__le16 *)&aad[2]);
|
||||||
if (qos_included)
|
|
||||||
len_a += IEEE80211_QOS_CTL_LEN;
|
|
||||||
|
|
||||||
aad[0] = 0; /* (len_a >> 8) & 0xff; */
|
|
||||||
aad[1] = len_a & 0xff;
|
|
||||||
/* Mask FC: zero subtype b4 b5 b6 */
|
|
||||||
aad[2] = fc_pos[0] & ~(BIT(4) | BIT(5) | BIT(6));
|
|
||||||
/* Retry, PwrMgt, MoreData; set Protected */
|
|
||||||
aad[3] = (fc_pos[1] & ~(BIT(3) | BIT(4) | BIT(5))) | BIT(6);
|
|
||||||
memcpy(&aad[4], &hdr->addr1, 3 * ETH_ALEN);
|
memcpy(&aad[4], &hdr->addr1, 3 * ETH_ALEN);
|
||||||
|
|
||||||
/* Mask Seq#, leave Frag# */
|
/* Mask Seq#, leave Frag# */
|
||||||
aad[22] = *((u8 *) &hdr->seq_ctrl) & 0x0f;
|
aad[22] = *((u8 *) &hdr->seq_ctrl) & 0x0f;
|
||||||
aad[23] = 0;
|
aad[23] = 0;
|
||||||
|
|
||||||
if (a4_included) {
|
if (a4_included) {
|
||||||
memcpy(&aad[24], hdr->addr4, ETH_ALEN);
|
memcpy(&aad[24], hdr->addr4, ETH_ALEN);
|
||||||
aad[30] = 0;
|
aad[30] = qos_tid;
|
||||||
aad[31] = 0;
|
aad[31] = 0;
|
||||||
} else
|
} else {
|
||||||
memset(&aad[24], 0, ETH_ALEN + IEEE80211_QOS_CTL_LEN);
|
memset(&aad[24], 0, ETH_ALEN + IEEE80211_QOS_CTL_LEN);
|
||||||
if (qos_included) {
|
aad[24] = qos_tid;
|
||||||
u8 *dpos = &aad[a4_included ? 30 : 24];
|
|
||||||
|
|
||||||
/* Mask QoS Control field */
|
|
||||||
dpos[0] = qos_tid;
|
|
||||||
dpos[1] = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue