|
@@ -745,7 +745,7 @@ static void p54_rx_frame_sent(struct ieee80211_hw *dev, struct sk_buff *skb)
|
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(entry);
|
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(entry);
|
|
struct p54_hdr *entry_hdr;
|
|
struct p54_hdr *entry_hdr;
|
|
struct p54_tx_data *entry_data;
|
|
struct p54_tx_data *entry_data;
|
|
- int pad = 0;
|
|
|
|
|
|
+ unsigned int pad = 0, frame_len;
|
|
|
|
|
|
range = (void *)info->rate_driver_data;
|
|
range = (void *)info->rate_driver_data;
|
|
if (range->start_addr != addr) {
|
|
if (range->start_addr != addr) {
|
|
@@ -768,6 +768,7 @@ static void p54_rx_frame_sent(struct ieee80211_hw *dev, struct sk_buff *skb)
|
|
__skb_unlink(entry, &priv->tx_queue);
|
|
__skb_unlink(entry, &priv->tx_queue);
|
|
spin_unlock_irqrestore(&priv->tx_queue.lock, flags);
|
|
spin_unlock_irqrestore(&priv->tx_queue.lock, flags);
|
|
|
|
|
|
|
|
+ frame_len = entry->len;
|
|
entry_hdr = (struct p54_hdr *) entry->data;
|
|
entry_hdr = (struct p54_hdr *) entry->data;
|
|
entry_data = (struct p54_tx_data *) entry_hdr->data;
|
|
entry_data = (struct p54_tx_data *) entry_hdr->data;
|
|
priv->tx_stats[entry_data->hw_queue].len--;
|
|
priv->tx_stats[entry_data->hw_queue].len--;
|
|
@@ -814,15 +815,28 @@ static void p54_rx_frame_sent(struct ieee80211_hw *dev, struct sk_buff *skb)
|
|
info->status.ack_signal = p54_rssi_to_dbm(dev,
|
|
info->status.ack_signal = p54_rssi_to_dbm(dev,
|
|
(int)payload->ack_rssi);
|
|
(int)payload->ack_rssi);
|
|
|
|
|
|
- if (entry_data->key_type == P54_CRYPTO_TKIPMICHAEL) {
|
|
|
|
|
|
+ /* Undo all changes to the frame. */
|
|
|
|
+ switch (entry_data->key_type) {
|
|
|
|
+ case P54_CRYPTO_TKIPMICHAEL: {
|
|
u8 *iv = (u8 *)(entry_data->align + pad +
|
|
u8 *iv = (u8 *)(entry_data->align + pad +
|
|
- entry_data->crypt_offset);
|
|
|
|
|
|
+ entry_data->crypt_offset);
|
|
|
|
|
|
/* Restore the original TKIP IV. */
|
|
/* Restore the original TKIP IV. */
|
|
iv[2] = iv[0];
|
|
iv[2] = iv[0];
|
|
iv[0] = iv[1];
|
|
iv[0] = iv[1];
|
|
iv[1] = (iv[0] | 0x20) & 0x7f; /* WEPSeed - 8.3.2.2 */
|
|
iv[1] = (iv[0] | 0x20) & 0x7f; /* WEPSeed - 8.3.2.2 */
|
|
|
|
+
|
|
|
|
+ frame_len -= 12; /* remove TKIP_MMIC + TKIP_ICV */
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case P54_CRYPTO_AESCCMP:
|
|
|
|
+ frame_len -= 8; /* remove CCMP_MIC */
|
|
|
|
+ break;
|
|
|
|
+ case P54_CRYPTO_WEP:
|
|
|
|
+ frame_len -= 4; /* remove WEP_ICV */
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
+ skb_trim(entry, frame_len);
|
|
skb_pull(entry, sizeof(*hdr) + pad + sizeof(*entry_data));
|
|
skb_pull(entry, sizeof(*hdr) + pad + sizeof(*entry_data));
|
|
ieee80211_tx_status_irqsafe(dev, entry);
|
|
ieee80211_tx_status_irqsafe(dev, entry);
|
|
goto out;
|
|
goto out;
|