]> err.no Git - linux-2.6/commitdiff
mac80211: Replace ieee80211_tx_control->key_idx with ieee80211_key_conf
authorIvo van Doorn <ivdoorn@gmail.com>
Thu, 17 Apr 2008 17:41:02 +0000 (19:41 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 7 May 2008 19:02:11 +0000 (15:02 -0400)
The hw_key_idx inside the ieee80211_key_conf structure does
not provide all the information drivers might need to perform
hardware encryption.

This is in particular true for rt2x00 who needs to know the
key algorithm and whether it is a shared or pairwise key.

By passing the ieee80211_key_conf pointer it assures us that
drivers can make full use of all information that it should know
about a particular key.

Additionally this patch updates all drivers to grab the hw_key_idx from
the ieee80211_key_conf structure.

v2: Removed bogus u16 cast
v3: Add warning about ieee80211_tx_control pointers
v4: Update warning about ieee80211_tx_control pointers

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath5k/base.c
drivers/net/wireless/b43/xmit.c
drivers/net/wireless/b43legacy/xmit.c
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/iwlwifi/iwl4965-base.c
include/net/mac80211.h
net/mac80211/wep.c
net/mac80211/wpa.c

index 4e5c8fc35200a8b0abcaaefe4e8148cf85cb20b5..3854619f3514889c7ac3e23ea501deff74516442 100644 (file)
@@ -1319,7 +1319,7 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf,
        pktlen = skb->len;
 
        if (!(ctl->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT)) {
-               keyidx = ctl->key_idx;
+               keyidx = ctl->hw_key->hw_key_idx;
                pktlen += ctl->icv_len;
        }
 
index 19aefbfb2c930137d6ca8ea1d5a5532713a1f46f..88491947a20913dfe458fecc675885b8d9f3d68d 100644 (file)
@@ -235,7 +235,7 @@ int b43_generate_txhdr(struct b43_wldev *dev,
 
        plcp_fragment_len = fragment_len + FCS_LEN;
        if (use_encryption) {
-               u8 key_idx = (u16) (txctl->key_idx);
+               u8 key_idx = txctl->hw_key->hw_key_idx;
                struct b43_key *key;
                int wlhdr_len;
                size_t iv_len;
index dcad2491a6066ca72d8b7e448494f41ea7936dc0..fc83dab6e2c7aedc51ca4270a8196c515c1f2c88 100644 (file)
@@ -232,7 +232,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
 
        plcp_fragment_len = fragment_len + FCS_LEN;
        if (use_encryption) {
-               u8 key_idx = (u16)(txctl->key_idx);
+               u8 key_idx = txctl->hw_key->hw_key_idx;
                struct b43legacy_key *key;
                int wlhdr_len;
                size_t iv_len;
index 13925b627e3b5569f5ebaf1399f121dea3d489d2..7bdffa9cfea6fe8608a84f34d4aa5ae3d5b9d1e5 100644 (file)
@@ -2391,7 +2391,8 @@ static void iwl3945_build_tx_cmd_hwcrypto(struct iwl3945_priv *priv,
                                      struct sk_buff *skb_frag,
                                      int last_frag)
 {
-       struct iwl3945_hw_key *keyinfo = &priv->stations[ctl->key_idx].keyinfo;
+       struct iwl3945_hw_key *keyinfo =
+           &priv->stations[ctl->hw_key->hw_key_idx].keyinfo;
 
        switch (keyinfo->alg) {
        case ALG_CCMP:
@@ -2414,7 +2415,7 @@ static void iwl3945_build_tx_cmd_hwcrypto(struct iwl3945_priv *priv,
 
        case ALG_WEP:
                cmd->cmd.tx.sec_ctl = TX_CMD_SEC_WEP |
-                   (ctl->key_idx & TX_CMD_SEC_MSK) << TX_CMD_SEC_SHIFT;
+                   (ctl->hw_key->hw_key_idx & TX_CMD_SEC_MSK) << TX_CMD_SEC_SHIFT;
 
                if (keyinfo->keylen == 13)
                        cmd->cmd.tx.sec_ctl |= TX_CMD_SEC_KEY128;
@@ -2422,7 +2423,7 @@ static void iwl3945_build_tx_cmd_hwcrypto(struct iwl3945_priv *priv,
                memcpy(&cmd->cmd.tx.key[3], keyinfo->key, keyinfo->keylen);
 
                IWL_DEBUG_TX("Configuring packet for WEP encryption "
-                            "with key %d\n", ctl->key_idx);
+                            "with key %d\n", ctl->hw_key->hw_key_idx);
                break;
 
        default:
index c8cbf70600da0db0f10cda38d165d5cf7a5f50b8..e43ea5377d8ed01b8cc72682171ad17159198281 100644 (file)
@@ -1926,7 +1926,7 @@ static void iwl4965_build_tx_cmd_hwcrypto(struct iwl_priv *priv,
        struct iwl_wep_key *wepkey;
        int keyidx = 0;
 
-       BUG_ON(ctl->key_idx > 3);
+       BUG_ON(ctl->hw_key->hw_key_idx > 3);
 
        switch (keyinfo->alg) {
        case ALG_CCMP:
@@ -1945,11 +1945,11 @@ static void iwl4965_build_tx_cmd_hwcrypto(struct iwl_priv *priv,
                break;
 
        case ALG_WEP:
-               wepkey = &priv->wep_keys[ctl->key_idx];
+               wepkey = &priv->wep_keys[ctl->hw_key->hw_key_idx];
                cmd->cmd.tx.sec_ctl = 0;
                if (priv->default_wep_key) {
                        /* the WEP key was sent as static */
-                       keyidx = ctl->key_idx;
+                       keyidx = ctl->hw_key->hw_key_idx;
                        memcpy(&cmd->cmd.tx.key[3], wepkey->key,
                                                        wepkey->key_size);
                        if (wepkey->key_size == WEP_KEY_LEN_128)
index 4a80d74975e843d6fed5511a477c009ed9b1667e..27ef9f761ac502596447cbe79898b2afa9109a15 100644 (file)
@@ -286,8 +286,17 @@ enum mac80211_tx_control_flags {
 
 /* Transmit control fields. This data structure is passed to low-level driver
  * with each TX frame. The low-level driver is responsible for configuring
- * the hardware to use given values (depending on what is supported). */
-
+ * the hardware to use given values (depending on what is supported).
+ *
+ * NOTE: Be careful with using the pointers outside of the ieee80211_ops->tx()
+ * context (i.e. when defering the work to a workqueue).
+ * The vif pointer is valid until the it has been removed with the
+ * ieee80211_ops->remove_interface() callback funtion.
+ * The hw_key pointer is valid until it has been removed with the
+ * ieee80211_ops->set_key() callback function.
+ * The tx_rate and alt_retry_rate pointers are valid until the phy is
+ * deregistered.
+ */
 struct ieee80211_tx_control {
        struct ieee80211_vif *vif;
        struct ieee80211_rate *tx_rate;
@@ -298,9 +307,11 @@ struct ieee80211_tx_control {
        /* retry rate for the last retries */
        struct ieee80211_rate *alt_retry_rate;
 
+       /* Key used for hardware encryption
+        * NULL if IEEE80211_TXCTL_DO_NOT_ENCRYPT is set */
+       struct ieee80211_key_conf *hw_key;
+
        u32 flags;              /* tx control flags defined above */
-       u8 key_idx;             /* keyidx from hw->set_key(), undefined if
-                                * IEEE80211_TXCTL_DO_NOT_ENCRYPT is set */
        u8 retry_limit;         /* 1 = only first attempt, 2 = one retry, ..
                                 * This could be used when set_retry_limit
                                 * is not implemented by the driver */
index affcecd78c1076b09affa30e721999cd960fd926..3cbae42ec50417022d7e903f59cfb6e9f7c8a377 100644 (file)
@@ -337,7 +337,7 @@ static int wep_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
                if (ieee80211_wep_encrypt(tx->local, skb, tx->key))
                        return -1;
        } else {
-               tx->control->key_idx = tx->key->conf.hw_key_idx;
+               tx->control->hw_key = &tx->key->conf;
                if (tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) {
                        if (!ieee80211_wep_add_iv(tx->local, skb, tx->key))
                                return -1;
index 45709ada8fee2c2ba222d7e8fb5743e62b2f6d27..42f3654e1c5ed6555d05bf4799f19424c9fc6fb6 100644 (file)
@@ -228,7 +228,7 @@ static int tkip_encrypt_skb(struct ieee80211_tx_data *tx,
                                            0x7f),
                                      (u8) key->u.tkip.iv16);
 
-               tx->control->key_idx = tx->key->conf.hw_key_idx;
+               tx->control->hw_key = &tx->key->conf;
                return 0;
        }
 
@@ -256,7 +256,7 @@ ieee80211_crypto_tkip_encrypt(struct ieee80211_tx_data *tx)
            !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
            !wpa_test) {
                /* hwaccel - with no need for preallocated room for IV/ICV */
-               tx->control->key_idx = tx->key->conf.hw_key_idx;
+               tx->control->hw_key = &tx->key->conf;
                return TX_CONTINUE;
        }
 
@@ -478,7 +478,7 @@ static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx,
 
        if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) {
                /* hwaccel - with preallocated room for CCMP header */
-               tx->control->key_idx = key->conf.hw_key_idx;
+               tx->control->hw_key = &tx->key->conf;
                return 0;
        }
 
@@ -505,7 +505,7 @@ ieee80211_crypto_ccmp_encrypt(struct ieee80211_tx_data *tx)
            !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
                /* hwaccel - with no need for preallocated room for CCMP "
                 * header or MIC fields */
-               tx->control->key_idx = tx->key->conf.hw_key_idx;
+               tx->control->hw_key = &tx->key->conf;
                return TX_CONTINUE;
        }