diff options
-rw-r--r-- | drivers/net/wireless/ath5k/base.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/b43/xmit.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/b43legacy/xmit.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl4965-base.c | 6 | ||||
-rw-r--r-- | include/net/mac80211.h | 19 | ||||
-rw-r--r-- | net/mac80211/wep.c | 2 | ||||
-rw-r--r-- | net/mac80211/wpa.c | 8 |
8 files changed, 30 insertions, 18 deletions
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index 4e5c8fc35200..3854619f3514 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c | |||
@@ -1319,7 +1319,7 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf, | |||
1319 | pktlen = skb->len; | 1319 | pktlen = skb->len; |
1320 | 1320 | ||
1321 | if (!(ctl->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT)) { | 1321 | if (!(ctl->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT)) { |
1322 | keyidx = ctl->key_idx; | 1322 | keyidx = ctl->hw_key->hw_key_idx; |
1323 | pktlen += ctl->icv_len; | 1323 | pktlen += ctl->icv_len; |
1324 | } | 1324 | } |
1325 | 1325 | ||
diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c index 19aefbfb2c93..88491947a209 100644 --- a/drivers/net/wireless/b43/xmit.c +++ b/drivers/net/wireless/b43/xmit.c | |||
@@ -235,7 +235,7 @@ int b43_generate_txhdr(struct b43_wldev *dev, | |||
235 | 235 | ||
236 | plcp_fragment_len = fragment_len + FCS_LEN; | 236 | plcp_fragment_len = fragment_len + FCS_LEN; |
237 | if (use_encryption) { | 237 | if (use_encryption) { |
238 | u8 key_idx = (u16) (txctl->key_idx); | 238 | u8 key_idx = txctl->hw_key->hw_key_idx; |
239 | struct b43_key *key; | 239 | struct b43_key *key; |
240 | int wlhdr_len; | 240 | int wlhdr_len; |
241 | size_t iv_len; | 241 | size_t iv_len; |
diff --git a/drivers/net/wireless/b43legacy/xmit.c b/drivers/net/wireless/b43legacy/xmit.c index dcad2491a606..fc83dab6e2c7 100644 --- a/drivers/net/wireless/b43legacy/xmit.c +++ b/drivers/net/wireless/b43legacy/xmit.c | |||
@@ -232,7 +232,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, | |||
232 | 232 | ||
233 | plcp_fragment_len = fragment_len + FCS_LEN; | 233 | plcp_fragment_len = fragment_len + FCS_LEN; |
234 | if (use_encryption) { | 234 | if (use_encryption) { |
235 | u8 key_idx = (u16)(txctl->key_idx); | 235 | u8 key_idx = txctl->hw_key->hw_key_idx; |
236 | struct b43legacy_key *key; | 236 | struct b43legacy_key *key; |
237 | int wlhdr_len; | 237 | int wlhdr_len; |
238 | size_t iv_len; | 238 | size_t iv_len; |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 13925b627e3b..7bdffa9cfea6 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -2391,7 +2391,8 @@ static void iwl3945_build_tx_cmd_hwcrypto(struct iwl3945_priv *priv, | |||
2391 | struct sk_buff *skb_frag, | 2391 | struct sk_buff *skb_frag, |
2392 | int last_frag) | 2392 | int last_frag) |
2393 | { | 2393 | { |
2394 | struct iwl3945_hw_key *keyinfo = &priv->stations[ctl->key_idx].keyinfo; | 2394 | struct iwl3945_hw_key *keyinfo = |
2395 | &priv->stations[ctl->hw_key->hw_key_idx].keyinfo; | ||
2395 | 2396 | ||
2396 | switch (keyinfo->alg) { | 2397 | switch (keyinfo->alg) { |
2397 | case ALG_CCMP: | 2398 | case ALG_CCMP: |
@@ -2414,7 +2415,7 @@ static void iwl3945_build_tx_cmd_hwcrypto(struct iwl3945_priv *priv, | |||
2414 | 2415 | ||
2415 | case ALG_WEP: | 2416 | case ALG_WEP: |
2416 | cmd->cmd.tx.sec_ctl = TX_CMD_SEC_WEP | | 2417 | cmd->cmd.tx.sec_ctl = TX_CMD_SEC_WEP | |
2417 | (ctl->key_idx & TX_CMD_SEC_MSK) << TX_CMD_SEC_SHIFT; | 2418 | (ctl->hw_key->hw_key_idx & TX_CMD_SEC_MSK) << TX_CMD_SEC_SHIFT; |
2418 | 2419 | ||
2419 | if (keyinfo->keylen == 13) | 2420 | if (keyinfo->keylen == 13) |
2420 | cmd->cmd.tx.sec_ctl |= TX_CMD_SEC_KEY128; | 2421 | cmd->cmd.tx.sec_ctl |= TX_CMD_SEC_KEY128; |
@@ -2422,7 +2423,7 @@ static void iwl3945_build_tx_cmd_hwcrypto(struct iwl3945_priv *priv, | |||
2422 | memcpy(&cmd->cmd.tx.key[3], keyinfo->key, keyinfo->keylen); | 2423 | memcpy(&cmd->cmd.tx.key[3], keyinfo->key, keyinfo->keylen); |
2423 | 2424 | ||
2424 | IWL_DEBUG_TX("Configuring packet for WEP encryption " | 2425 | IWL_DEBUG_TX("Configuring packet for WEP encryption " |
2425 | "with key %d\n", ctl->key_idx); | 2426 | "with key %d\n", ctl->hw_key->hw_key_idx); |
2426 | break; | 2427 | break; |
2427 | 2428 | ||
2428 | default: | 2429 | default: |
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index c8cbf70600da..e43ea5377d8e 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
@@ -1926,7 +1926,7 @@ static void iwl4965_build_tx_cmd_hwcrypto(struct iwl_priv *priv, | |||
1926 | struct iwl_wep_key *wepkey; | 1926 | struct iwl_wep_key *wepkey; |
1927 | int keyidx = 0; | 1927 | int keyidx = 0; |
1928 | 1928 | ||
1929 | BUG_ON(ctl->key_idx > 3); | 1929 | BUG_ON(ctl->hw_key->hw_key_idx > 3); |
1930 | 1930 | ||
1931 | switch (keyinfo->alg) { | 1931 | switch (keyinfo->alg) { |
1932 | case ALG_CCMP: | 1932 | case ALG_CCMP: |
@@ -1945,11 +1945,11 @@ static void iwl4965_build_tx_cmd_hwcrypto(struct iwl_priv *priv, | |||
1945 | break; | 1945 | break; |
1946 | 1946 | ||
1947 | case ALG_WEP: | 1947 | case ALG_WEP: |
1948 | wepkey = &priv->wep_keys[ctl->key_idx]; | 1948 | wepkey = &priv->wep_keys[ctl->hw_key->hw_key_idx]; |
1949 | cmd->cmd.tx.sec_ctl = 0; | 1949 | cmd->cmd.tx.sec_ctl = 0; |
1950 | if (priv->default_wep_key) { | 1950 | if (priv->default_wep_key) { |
1951 | /* the WEP key was sent as static */ | 1951 | /* the WEP key was sent as static */ |
1952 | keyidx = ctl->key_idx; | 1952 | keyidx = ctl->hw_key->hw_key_idx; |
1953 | memcpy(&cmd->cmd.tx.key[3], wepkey->key, | 1953 | memcpy(&cmd->cmd.tx.key[3], wepkey->key, |
1954 | wepkey->key_size); | 1954 | wepkey->key_size); |
1955 | if (wepkey->key_size == WEP_KEY_LEN_128) | 1955 | if (wepkey->key_size == WEP_KEY_LEN_128) |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 4a80d74975e8..27ef9f761ac5 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -286,8 +286,17 @@ enum mac80211_tx_control_flags { | |||
286 | 286 | ||
287 | /* Transmit control fields. This data structure is passed to low-level driver | 287 | /* Transmit control fields. This data structure is passed to low-level driver |
288 | * with each TX frame. The low-level driver is responsible for configuring | 288 | * with each TX frame. The low-level driver is responsible for configuring |
289 | * the hardware to use given values (depending on what is supported). */ | 289 | * the hardware to use given values (depending on what is supported). |
290 | 290 | * | |
291 | * NOTE: Be careful with using the pointers outside of the ieee80211_ops->tx() | ||
292 | * context (i.e. when defering the work to a workqueue). | ||
293 | * The vif pointer is valid until the it has been removed with the | ||
294 | * ieee80211_ops->remove_interface() callback funtion. | ||
295 | * The hw_key pointer is valid until it has been removed with the | ||
296 | * ieee80211_ops->set_key() callback function. | ||
297 | * The tx_rate and alt_retry_rate pointers are valid until the phy is | ||
298 | * deregistered. | ||
299 | */ | ||
291 | struct ieee80211_tx_control { | 300 | struct ieee80211_tx_control { |
292 | struct ieee80211_vif *vif; | 301 | struct ieee80211_vif *vif; |
293 | struct ieee80211_rate *tx_rate; | 302 | struct ieee80211_rate *tx_rate; |
@@ -298,9 +307,11 @@ struct ieee80211_tx_control { | |||
298 | /* retry rate for the last retries */ | 307 | /* retry rate for the last retries */ |
299 | struct ieee80211_rate *alt_retry_rate; | 308 | struct ieee80211_rate *alt_retry_rate; |
300 | 309 | ||
310 | /* Key used for hardware encryption | ||
311 | * NULL if IEEE80211_TXCTL_DO_NOT_ENCRYPT is set */ | ||
312 | struct ieee80211_key_conf *hw_key; | ||
313 | |||
301 | u32 flags; /* tx control flags defined above */ | 314 | u32 flags; /* tx control flags defined above */ |
302 | u8 key_idx; /* keyidx from hw->set_key(), undefined if | ||
303 | * IEEE80211_TXCTL_DO_NOT_ENCRYPT is set */ | ||
304 | u8 retry_limit; /* 1 = only first attempt, 2 = one retry, .. | 315 | u8 retry_limit; /* 1 = only first attempt, 2 = one retry, .. |
305 | * This could be used when set_retry_limit | 316 | * This could be used when set_retry_limit |
306 | * is not implemented by the driver */ | 317 | * is not implemented by the driver */ |
diff --git a/net/mac80211/wep.c b/net/mac80211/wep.c index affcecd78c10..3cbae42ec504 100644 --- a/net/mac80211/wep.c +++ b/net/mac80211/wep.c | |||
@@ -337,7 +337,7 @@ static int wep_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb) | |||
337 | if (ieee80211_wep_encrypt(tx->local, skb, tx->key)) | 337 | if (ieee80211_wep_encrypt(tx->local, skb, tx->key)) |
338 | return -1; | 338 | return -1; |
339 | } else { | 339 | } else { |
340 | tx->control->key_idx = tx->key->conf.hw_key_idx; | 340 | tx->control->hw_key = &tx->key->conf; |
341 | if (tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) { | 341 | if (tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) { |
342 | if (!ieee80211_wep_add_iv(tx->local, skb, tx->key)) | 342 | if (!ieee80211_wep_add_iv(tx->local, skb, tx->key)) |
343 | return -1; | 343 | return -1; |
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c index 45709ada8fee..42f3654e1c5e 100644 --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c | |||
@@ -228,7 +228,7 @@ static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, | |||
228 | 0x7f), | 228 | 0x7f), |
229 | (u8) key->u.tkip.iv16); | 229 | (u8) key->u.tkip.iv16); |
230 | 230 | ||
231 | tx->control->key_idx = tx->key->conf.hw_key_idx; | 231 | tx->control->hw_key = &tx->key->conf; |
232 | return 0; | 232 | return 0; |
233 | } | 233 | } |
234 | 234 | ||
@@ -256,7 +256,7 @@ ieee80211_crypto_tkip_encrypt(struct ieee80211_tx_data *tx) | |||
256 | !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) && | 256 | !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) && |
257 | !wpa_test) { | 257 | !wpa_test) { |
258 | /* hwaccel - with no need for preallocated room for IV/ICV */ | 258 | /* hwaccel - with no need for preallocated room for IV/ICV */ |
259 | tx->control->key_idx = tx->key->conf.hw_key_idx; | 259 | tx->control->hw_key = &tx->key->conf; |
260 | return TX_CONTINUE; | 260 | return TX_CONTINUE; |
261 | } | 261 | } |
262 | 262 | ||
@@ -478,7 +478,7 @@ static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, | |||
478 | 478 | ||
479 | if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) { | 479 | if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) { |
480 | /* hwaccel - with preallocated room for CCMP header */ | 480 | /* hwaccel - with preallocated room for CCMP header */ |
481 | tx->control->key_idx = key->conf.hw_key_idx; | 481 | tx->control->hw_key = &tx->key->conf; |
482 | return 0; | 482 | return 0; |
483 | } | 483 | } |
484 | 484 | ||
@@ -505,7 +505,7 @@ ieee80211_crypto_ccmp_encrypt(struct ieee80211_tx_data *tx) | |||
505 | !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { | 505 | !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { |
506 | /* hwaccel - with no need for preallocated room for CCMP " | 506 | /* hwaccel - with no need for preallocated room for CCMP " |
507 | * header or MIC fields */ | 507 | * header or MIC fields */ |
508 | tx->control->key_idx = tx->key->conf.hw_key_idx; | 508 | tx->control->hw_key = &tx->key->conf; |
509 | return TX_CONTINUE; | 509 | return TX_CONTINUE; |
510 | } | 510 | } |
511 | 511 | ||