diff options
author | Christian Lamparter <chunkeey@web.de> | 2008-12-19 20:21:37 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-01-12 14:24:52 -0500 |
commit | c1d34c1dad76be6d515ef33e24eb92f10547b08b (patch) | |
tree | 65412ed008bf4558a87c87d3c9b0e6a7224ef127 /drivers | |
parent | 706ea9b66935e341b063d860c9c8f279b37b5578 (diff) |
p54: crypto offload fixes
This patch fixes two small flaws:
- restore the original TKIP IV if we altered it.
- reserve & initialize ICV with zeros.
This is actually only necessary for some obsolete p54usb firmwares.
But we don't know yet, if all devices are compatible with the new revisions.
Signed-off-by: Christian Lamparter <chunkeey@web.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/p54/p54common.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index 06c64744df27..37294a657f8b 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
@@ -809,6 +809,16 @@ static void p54_rx_frame_sent(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
809 | info->flags |= IEEE80211_TX_STAT_TX_FILTERED; | 809 | info->flags |= IEEE80211_TX_STAT_TX_FILTERED; |
810 | info->status.ack_signal = p54_rssi_to_dbm(dev, | 810 | info->status.ack_signal = p54_rssi_to_dbm(dev, |
811 | (int)payload->ack_rssi); | 811 | (int)payload->ack_rssi); |
812 | |||
813 | if (entry_data->key_type == P54_CRYPTO_TKIPMICHAEL) { | ||
814 | u8 *iv = (u8 *)(entry_data->align + pad + | ||
815 | entry_data->crypt_offset); | ||
816 | |||
817 | /* Restore the original TKIP IV. */ | ||
818 | iv[2] = iv[0]; | ||
819 | iv[0] = iv[1]; | ||
820 | iv[1] = (iv[0] | 0x20) & 0x7f; /* WEPSeed - 8.3.2.2 */ | ||
821 | } | ||
812 | skb_pull(entry, sizeof(*hdr) + pad + sizeof(*entry_data)); | 822 | skb_pull(entry, sizeof(*hdr) + pad + sizeof(*entry_data)); |
813 | ieee80211_tx_status_irqsafe(dev, entry); | 823 | ieee80211_tx_status_irqsafe(dev, entry); |
814 | goto out; | 824 | goto out; |
@@ -1394,7 +1404,6 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
1394 | hdr->tries = ridx; | 1404 | hdr->tries = ridx; |
1395 | txhdr->rts_rate_idx = 0; | 1405 | txhdr->rts_rate_idx = 0; |
1396 | if (info->control.hw_key) { | 1406 | if (info->control.hw_key) { |
1397 | crypt_offset += info->control.hw_key->iv_len; | ||
1398 | txhdr->key_type = p54_convert_algo(info->control.hw_key->alg); | 1407 | txhdr->key_type = p54_convert_algo(info->control.hw_key->alg); |
1399 | txhdr->key_len = min((u8)16, info->control.hw_key->keylen); | 1408 | txhdr->key_len = min((u8)16, info->control.hw_key->keylen); |
1400 | memcpy(txhdr->key, info->control.hw_key->key, txhdr->key_len); | 1409 | memcpy(txhdr->key, info->control.hw_key->key, txhdr->key_len); |
@@ -1408,6 +1417,8 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
1408 | } | 1417 | } |
1409 | /* reserve some space for ICV */ | 1418 | /* reserve some space for ICV */ |
1410 | len += info->control.hw_key->icv_len; | 1419 | len += info->control.hw_key->icv_len; |
1420 | memset(skb_put(skb, info->control.hw_key->icv_len), 0, | ||
1421 | info->control.hw_key->icv_len); | ||
1411 | } else { | 1422 | } else { |
1412 | txhdr->key_type = 0; | 1423 | txhdr->key_type = 0; |
1413 | txhdr->key_len = 0; | 1424 | txhdr->key_len = 0; |