rt2x00: Move iv_len into tx descriptor data
authorIvo van Doorn <ivdoorn@gmail.com>
Sun, 26 Apr 2009 14:08:30 +0000 (16:08 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 6 May 2009 19:14:49 +0000 (15:14 -0400)
By placing the iv_len into the tx descriptor data and
by passing this data to the crypto IV handlers we can
save multiple calls to ieee80211_get_hdrlen_from_skb()
and some if-statements when copying/removing the IV data
from the outgoing frame.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2x00crypto.c
drivers/net/wireless/rt2x00/rt2x00lib.h
drivers/net/wireless/rt2x00/rt2x00queue.c
drivers/net/wireless/rt2x00/rt2x00queue.h

index 0b41845d9543a1653d3893e22d7f4c56d1719c35..ae31581372c00498c0194dc3a46c050a6f2eff9c 100644 (file)
@@ -66,6 +66,7 @@ void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry,
 
        txdesc->key_idx = hw_key->hw_key_idx;
        txdesc->iv_offset = ieee80211_get_hdrlen_from_skb(entry->skb);
+       txdesc->iv_len = hw_key->iv_len;
 
        if (!(hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV))
                __set_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags);
@@ -103,34 +104,32 @@ unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev,
        return overhead;
 }
 
-void rt2x00crypto_tx_copy_iv(struct sk_buff *skb, unsigned int iv_len)
+void rt2x00crypto_tx_copy_iv(struct sk_buff *skb, struct txentry_desc *txdesc)
 {
        struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
-       unsigned int header_length = ieee80211_get_hdrlen_from_skb(skb);
 
-       if (unlikely(!iv_len))
+       if (unlikely(!txdesc->iv_len))
                return;
 
        /* Copy IV/EIV data */
-       memcpy(skbdesc->iv, skb->data + header_length, iv_len);
+       memcpy(skbdesc->iv, skb->data + txdesc->iv_offset, txdesc->iv_len);
 }
 
-void rt2x00crypto_tx_remove_iv(struct sk_buff *skb, unsigned int iv_len)
+void rt2x00crypto_tx_remove_iv(struct sk_buff *skb, struct txentry_desc *txdesc)
 {
        struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
-       unsigned int header_length = ieee80211_get_hdrlen_from_skb(skb);
 
-       if (unlikely(!iv_len))
+       if (unlikely(!txdesc->iv_len))
                return;
 
        /* Copy IV/EIV data */
-       memcpy(skbdesc->iv, skb->data + header_length, iv_len);
+       memcpy(skbdesc->iv, skb->data + txdesc->iv_offset, txdesc->iv_len);
 
        /* Move ieee80211 header */
-       memmove(skb->data + iv_len, skb->data, header_length);
+       memmove(skb->data + txdesc->iv_len, skb->data, txdesc->iv_offset);
 
        /* Pull buffer to correct size */
-       skb_pull(skb, iv_len);
+       skb_pull(skb, txdesc->iv_len);
 
        /* IV/EIV data has officially be stripped */
        skbdesc->flags |= FRAME_DESC_IV_STRIPPED;
index a631613177d037b744e8f866bfde1cf6e2f491e0..af3c47bd43bddf65c327d26efa72e085928a9b3e 100644 (file)
@@ -295,8 +295,10 @@ void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry,
                                       struct txentry_desc *txdesc);
 unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev,
                                      struct sk_buff *skb);
-void rt2x00crypto_tx_copy_iv(struct sk_buff *skb, unsigned int iv_len);
-void rt2x00crypto_tx_remove_iv(struct sk_buff *skb, unsigned int iv_len);
+void rt2x00crypto_tx_copy_iv(struct sk_buff *skb,
+                            struct txentry_desc *txdesc);
+void rt2x00crypto_tx_remove_iv(struct sk_buff *skb,
+                              struct txentry_desc *txdesc);
 void rt2x00crypto_tx_insert_iv(struct sk_buff *skb);
 void rt2x00crypto_rx_insert_iv(struct sk_buff *skb, unsigned int align,
                               unsigned int header_length,
@@ -319,12 +321,12 @@ static inline unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev
 }
 
 static inline void rt2x00crypto_tx_copy_iv(struct sk_buff *skb,
-                                          unsigned int iv_len)
+                                          struct txentry_desc *txdesc)
 {
 }
 
 static inline void rt2x00crypto_tx_remove_iv(struct sk_buff *skb,
-                                            unsigned int iv_len)
+                                            struct txentry_desc *txdesc)
 {
 }
 
index a5664bd8493e878062e32bd4e0ec055800faad79..6f78915b364c1b4d2d489ac84dc7db8b8ca70ac3 100644 (file)
@@ -368,7 +368,6 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)
        struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX);
        struct txentry_desc txdesc;
        struct skb_frame_desc *skbdesc;
-       unsigned int iv_len = 0;
        u8 rate_idx, rate_flags;
 
        if (unlikely(rt2x00queue_full(queue)))
@@ -390,9 +389,6 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)
        entry->skb = skb;
        rt2x00queue_create_tx_descriptor(entry, &txdesc);
 
-       if (IEEE80211_SKB_CB(skb)->control.hw_key != NULL)
-               iv_len = IEEE80211_SKB_CB(skb)->control.hw_key->iv_len;
-
        /*
         * All information is retrieved from the skb->cb array,
         * now we should claim ownership of the driver part of that
@@ -415,9 +411,9 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)
        if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc.flags) &&
            !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags)) {
                if (test_bit(DRIVER_REQUIRE_COPY_IV, &queue->rt2x00dev->flags))
-                       rt2x00crypto_tx_copy_iv(skb, iv_len);
+                       rt2x00crypto_tx_copy_iv(skb, &txdesc);
                else
-                       rt2x00crypto_tx_remove_iv(skb, iv_len);
+                       rt2x00crypto_tx_remove_iv(skb, &txdesc);
        }
 
        /*
index 97e2ab08f080153bf1576d14701d4b18e1650437..e3bfd73e319b73947e3d58bfa65d8bbfb0b9c846 100644 (file)
@@ -280,6 +280,7 @@ enum txentry_desc_flags {
  * @cipher: Cipher type used for encryption.
  * @key_idx: Key index used for encryption.
  * @iv_offset: Position where IV should be inserted by hardware.
+ * @iv_len: Length of IV data.
  */
 struct txentry_desc {
        unsigned long flags;
@@ -302,6 +303,7 @@ struct txentry_desc {
        enum cipher cipher;
        u16 key_idx;
        u16 iv_offset;
+       u16 iv_len;
 };
 
 /**