提交 1e2b7976 编写于 作者: J Juuso Oikarinen 提交者: John W. Linville

wl1271: Correct TKIP header space handling in TX path

Correct the position to which TKIP header space is appended for TX
packets.
Signed-off-by: NJuuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: NVidhya Govindan <vidhya.govindan@nokia.com>
Signed-off-by: NLuciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 ac4e4ce5
...@@ -1160,12 +1160,9 @@ static int wl1271_register_hw(struct wl1271 *wl) ...@@ -1160,12 +1160,9 @@ static int wl1271_register_hw(struct wl1271 *wl)
static int wl1271_init_ieee80211(struct wl1271 *wl) static int wl1271_init_ieee80211(struct wl1271 *wl)
{ {
/* /* The tx descriptor buffer and the TKIP space. */
* The tx descriptor buffer and the TKIP space. wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
* sizeof(struct wl1271_tx_hw_descr);
* FIXME: add correct 1271 descriptor size
*/
wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE;
/* unit us */ /* unit us */
/* FIXME: find a proper value */ /* FIXME: find a proper value */
......
...@@ -92,6 +92,14 @@ static int wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb, ...@@ -92,6 +92,14 @@ static int wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb,
desc = (struct wl1271_tx_hw_descr *) skb->data; desc = (struct wl1271_tx_hw_descr *) skb->data;
/* relocate space for security header */
if (extra) {
void *framestart = skb->data + sizeof(*desc);
u16 fc = *(u16 *)(framestart + extra);
int hdrlen = ieee80211_hdrlen(fc);
memmove(framestart, framestart + extra, hdrlen);
}
/* configure packet life time */ /* configure packet life time */
desc->start_time = jiffies_to_usecs(jiffies) - wl->time_offset; desc->start_time = jiffies_to_usecs(jiffies) - wl->time_offset;
desc->life_time = TX_HW_MGMT_PKT_LIFETIME_TU; desc->life_time = TX_HW_MGMT_PKT_LIFETIME_TU;
...@@ -257,7 +265,6 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl, ...@@ -257,7 +265,6 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
struct ieee80211_tx_info *info; struct ieee80211_tx_info *info;
struct sk_buff *skb; struct sk_buff *skb;
u32 header_len;
u16 seq; u16 seq;
int id = result->id; int id = result->id;
...@@ -295,22 +302,22 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl, ...@@ -295,22 +302,22 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
wl->tx_security_seq_32++; wl->tx_security_seq_32++;
wl->tx_security_seq_16 = seq; wl->tx_security_seq_16 = seq;
/* get header len */ /* remove private header from packet */
skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));
/* remove TKIP header space if present */
if (info->control.hw_key && if (info->control.hw_key &&
info->control.hw_key->alg == ALG_TKIP) info->control.hw_key->alg == ALG_TKIP) {
header_len = WL1271_TKIP_IV_SPACE + int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
sizeof(struct wl1271_tx_hw_descr); memmove(skb->data + WL1271_TKIP_IV_SPACE, skb->data, hdrlen);
else skb_pull(skb, WL1271_TKIP_IV_SPACE);
header_len = sizeof(struct wl1271_tx_hw_descr); }
wl1271_debug(DEBUG_TX, "tx status id %u skb 0x%p failures %u rate 0x%x" wl1271_debug(DEBUG_TX, "tx status id %u skb 0x%p failures %u rate 0x%x"
" status 0x%x", " status 0x%x",
result->id, skb, result->ack_failures, result->id, skb, result->ack_failures,
result->rate_class_index, result->status); result->rate_class_index, result->status);
/* remove private header from packet */
skb_pull(skb, header_len);
/* return the packet to the stack */ /* return the packet to the stack */
ieee80211_tx_status(wl->hw, skb); ieee80211_tx_status(wl->hw, skb);
wl->tx_frames[result->id] = NULL; wl->tx_frames[result->id] = NULL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册