Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem
Conflicts: drivers/net/wireless/wl12xx/wl1271_cmd.h
This commit is contained in:
@@ -143,6 +143,11 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* reject WEP and TKIP keys if WEP failed to initialize */
|
||||
if ((alg == ALG_WEP || alg == ALG_TKIP) &&
|
||||
IS_ERR(sdata->local->wep_tx_tfm))
|
||||
return -EINVAL;
|
||||
|
||||
key = ieee80211_key_alloc(alg, key_idx, params->key_len, params->key,
|
||||
params->seq_len, params->seq);
|
||||
if (!key)
|
||||
|
||||
@@ -637,11 +637,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
goto fail_sta_info;
|
||||
|
||||
result = ieee80211_wep_init(local);
|
||||
if (result < 0) {
|
||||
if (result < 0)
|
||||
printk(KERN_DEBUG "%s: Failed to initialize wep: %d\n",
|
||||
wiphy_name(local->hw.wiphy), result);
|
||||
goto fail_wep;
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
@@ -694,7 +692,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
fail_rate:
|
||||
rtnl_unlock();
|
||||
ieee80211_wep_free(local);
|
||||
fail_wep:
|
||||
sta_info_stop(local);
|
||||
fail_sta_info:
|
||||
destroy_workqueue(local->workqueue);
|
||||
|
||||
@@ -240,6 +240,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
|
||||
MINSTREL_FRAC(3, 4)) || mr->probability > cur_prob) {
|
||||
mg->max_prob_rate = index;
|
||||
cur_prob = mr->probability;
|
||||
cur_prob_tp = mr->cur_tp;
|
||||
}
|
||||
|
||||
if (mr->cur_tp > cur_tp) {
|
||||
@@ -275,6 +276,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
|
||||
minstrel_mcs_groups[group].streams == 1) {
|
||||
mi->max_prob_rate = mg->max_prob_rate;
|
||||
cur_prob = mr->cur_prob;
|
||||
cur_prob_tp = mr->cur_tp;
|
||||
}
|
||||
|
||||
mr = minstrel_get_ratestats(mi, mg->max_tp_rate);
|
||||
@@ -441,8 +443,8 @@ minstrel_ht_tx_status(void *priv, struct ieee80211_supported_band *sband,
|
||||
minstrel_downgrade_rate(mi, &mi->max_tp_rate, true);
|
||||
|
||||
rate2 = minstrel_get_ratestats(mi, mi->max_tp_rate2);
|
||||
if (rate->attempts > 30 &&
|
||||
MINSTREL_FRAC(rate->success, rate->attempts) <
|
||||
if (rate2->attempts > 30 &&
|
||||
MINSTREL_FRAC(rate2->success, rate2->attempts) <
|
||||
MINSTREL_FRAC(20, 100))
|
||||
minstrel_downgrade_rate(mi, &mi->max_tp_rate2, false);
|
||||
|
||||
|
||||
@@ -202,9 +202,9 @@ EXPORT_SYMBOL(ieee80211_get_tkip_key);
|
||||
* @payload_len is the length of payload (_not_ including IV/ICV length).
|
||||
* @ta is the transmitter addresses.
|
||||
*/
|
||||
void ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm,
|
||||
struct ieee80211_key *key,
|
||||
u8 *pos, size_t payload_len, u8 *ta)
|
||||
int ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm,
|
||||
struct ieee80211_key *key,
|
||||
u8 *pos, size_t payload_len, u8 *ta)
|
||||
{
|
||||
u8 rc4key[16];
|
||||
struct tkip_ctx *ctx = &key->u.tkip.tx;
|
||||
@@ -216,7 +216,7 @@ void ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm,
|
||||
|
||||
tkip_mixing_phase2(tk, ctx, ctx->iv16, rc4key);
|
||||
|
||||
ieee80211_wep_encrypt_data(tfm, rc4key, 16, pos, payload_len);
|
||||
return ieee80211_wep_encrypt_data(tfm, rc4key, 16, pos, payload_len);
|
||||
}
|
||||
|
||||
/* Decrypt packet payload with TKIP using @key. @pos is a pointer to the
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, u16 iv16);
|
||||
|
||||
void ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm,
|
||||
int ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm,
|
||||
struct ieee80211_key *key,
|
||||
u8 *pos, size_t payload_len, u8 *ta);
|
||||
enum {
|
||||
|
||||
@@ -47,8 +47,10 @@ int ieee80211_wep_init(struct ieee80211_local *local)
|
||||
|
||||
void ieee80211_wep_free(struct ieee80211_local *local)
|
||||
{
|
||||
crypto_free_blkcipher(local->wep_tx_tfm);
|
||||
crypto_free_blkcipher(local->wep_rx_tfm);
|
||||
if (!IS_ERR(local->wep_tx_tfm))
|
||||
crypto_free_blkcipher(local->wep_tx_tfm);
|
||||
if (!IS_ERR(local->wep_rx_tfm))
|
||||
crypto_free_blkcipher(local->wep_rx_tfm);
|
||||
}
|
||||
|
||||
static inline bool ieee80211_wep_weak_iv(u32 iv, int keylen)
|
||||
@@ -122,19 +124,24 @@ static void ieee80211_wep_remove_iv(struct ieee80211_local *local,
|
||||
/* Perform WEP encryption using given key. data buffer must have tailroom
|
||||
* for 4-byte ICV. data_len must not include this ICV. Note: this function
|
||||
* does _not_ add IV. data = RC4(data | CRC32(data)) */
|
||||
void ieee80211_wep_encrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key,
|
||||
size_t klen, u8 *data, size_t data_len)
|
||||
int ieee80211_wep_encrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key,
|
||||
size_t klen, u8 *data, size_t data_len)
|
||||
{
|
||||
struct blkcipher_desc desc = { .tfm = tfm };
|
||||
struct scatterlist sg;
|
||||
__le32 icv;
|
||||
|
||||
if (IS_ERR(tfm))
|
||||
return -1;
|
||||
|
||||
icv = cpu_to_le32(~crc32_le(~0, data, data_len));
|
||||
put_unaligned(icv, (__le32 *)(data + data_len));
|
||||
|
||||
crypto_blkcipher_setkey(tfm, rc4key, klen);
|
||||
sg_init_one(&sg, data, data_len + WEP_ICV_LEN);
|
||||
crypto_blkcipher_encrypt(&desc, &sg, &sg, sg.length);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -168,10 +175,8 @@ int ieee80211_wep_encrypt(struct ieee80211_local *local,
|
||||
/* Add room for ICV */
|
||||
skb_put(skb, WEP_ICV_LEN);
|
||||
|
||||
ieee80211_wep_encrypt_data(local->wep_tx_tfm, rc4key, keylen + 3,
|
||||
iv + WEP_IV_LEN, len);
|
||||
|
||||
return 0;
|
||||
return ieee80211_wep_encrypt_data(local->wep_tx_tfm, rc4key, keylen + 3,
|
||||
iv + WEP_IV_LEN, len);
|
||||
}
|
||||
|
||||
|
||||
@@ -185,6 +190,9 @@ int ieee80211_wep_decrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key,
|
||||
struct scatterlist sg;
|
||||
__le32 crc;
|
||||
|
||||
if (IS_ERR(tfm))
|
||||
return -1;
|
||||
|
||||
crypto_blkcipher_setkey(tfm, rc4key, klen);
|
||||
sg_init_one(&sg, data, data_len + WEP_ICV_LEN);
|
||||
crypto_blkcipher_decrypt(&desc, &sg, &sg, sg.length);
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
int ieee80211_wep_init(struct ieee80211_local *local);
|
||||
void ieee80211_wep_free(struct ieee80211_local *local);
|
||||
void ieee80211_wep_encrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key,
|
||||
int ieee80211_wep_encrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key,
|
||||
size_t klen, u8 *data, size_t data_len);
|
||||
int ieee80211_wep_encrypt(struct ieee80211_local *local,
|
||||
struct sk_buff *skb,
|
||||
|
||||
@@ -183,9 +183,8 @@ static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
|
||||
skb_put(skb, TKIP_ICV_LEN);
|
||||
|
||||
hdr = (struct ieee80211_hdr *) skb->data;
|
||||
ieee80211_tkip_encrypt_data(tx->local->wep_tx_tfm,
|
||||
key, pos, len, hdr->addr2);
|
||||
return 0;
|
||||
return ieee80211_tkip_encrypt_data(tx->local->wep_tx_tfm,
|
||||
key, pos, len, hdr->addr2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user