wl1271: Security sequence number handling for TX (for WPA)
Add security sequence number handling to the driver TX data path needed by WPA. Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com> Reviewed-by: Kalle Valo <kalle.valo@nokia.com> Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:

committed by
John W. Linville

parent
3b4be9e08a
commit
ac4e4ce54e
@@ -592,6 +592,9 @@ static void wl1271_op_stop(struct ieee80211_hw *hw)
|
||||
wl->tx_blocks_available = 0;
|
||||
wl->tx_results_count = 0;
|
||||
wl->tx_packets_count = 0;
|
||||
wl->tx_security_last_seq = 0;
|
||||
wl->tx_security_seq_16 = 0;
|
||||
wl->tx_security_seq_32 = 0;
|
||||
wl->time_offset = 0;
|
||||
wl->session_counter = 0;
|
||||
for (i = 0; i < NUM_TX_QUEUES; i++)
|
||||
@@ -823,6 +826,8 @@ static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
struct wl1271 *wl = hw->priv;
|
||||
const u8 *addr;
|
||||
int ret;
|
||||
u32 tx_seq_32 = 0;
|
||||
u16 tx_seq_16 = 0;
|
||||
u8 key_type;
|
||||
|
||||
static const u8 bcast_addr[ETH_ALEN] =
|
||||
@@ -861,11 +866,15 @@ static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
key_type = KEY_TKIP;
|
||||
|
||||
key_conf->hw_key_idx = key_conf->keyidx;
|
||||
tx_seq_32 = wl->tx_security_seq_32;
|
||||
tx_seq_16 = wl->tx_security_seq_16;
|
||||
break;
|
||||
case ALG_CCMP:
|
||||
key_type = KEY_AES;
|
||||
|
||||
key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
|
||||
tx_seq_32 = wl->tx_security_seq_32;
|
||||
tx_seq_16 = wl->tx_security_seq_16;
|
||||
break;
|
||||
default:
|
||||
wl1271_error("Unknown key algo 0x%x", key_conf->alg);
|
||||
@@ -879,7 +888,7 @@ static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
ret = wl1271_cmd_set_key(wl, KEY_ADD_OR_REPLACE,
|
||||
key_conf->keyidx, key_type,
|
||||
key_conf->keylen, key_conf->key,
|
||||
addr);
|
||||
addr, tx_seq_32, tx_seq_16);
|
||||
if (ret < 0) {
|
||||
wl1271_error("Could not add or replace key");
|
||||
goto out_sleep;
|
||||
@@ -890,7 +899,7 @@ static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
ret = wl1271_cmd_set_key(wl, KEY_REMOVE,
|
||||
key_conf->keyidx, key_type,
|
||||
key_conf->keylen, key_conf->key,
|
||||
addr);
|
||||
addr, 0, 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("Could not remove key");
|
||||
goto out_sleep;
|
||||
|
Reference in New Issue
Block a user