Skip to content

Commit

Permalink
mac80211: Skip tailroom reservation for full HW-crypto devices
Browse files Browse the repository at this point in the history
In xmit path, devices that do full hardware crypto (including
TKIP MMIC) need no tailroom. For such devices, tailroom
reservation can be skipped if all the keys are programmed into
the hardware (i.e software crypto is not used for any of the
keys) and none of the keys wants software to generate Michael
MIC.

Signed-off-by: Yogesh Ashok Powar <yogeshp@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Yogesh Ashok Powar authored and John W. Linville committed Apr 28, 2011
1 parent e2186b7 commit aac6af5
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 8 deletions.
3 changes: 3 additions & 0 deletions net/mac80211/ieee80211_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -766,6 +766,9 @@ struct ieee80211_local {

int tx_headroom; /* required headroom for hardware/radiotap */

/* count for keys needing tailroom space allocation */
int crypto_tx_tailroom_needed_cnt;

/* Tasklet and skb queue to process calls from IRQ mode. All frames
* added to skb_queue will be processed, but frames in
* skb_queue_unreliable may be dropped if the total length of these
Expand Down
19 changes: 17 additions & 2 deletions net/mac80211/key.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)

if (!ret) {
key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE;

if (!(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC))
key->local->crypto_tx_tailroom_needed_cnt--;

return 0;
}

Expand Down Expand Up @@ -156,6 +160,9 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
key->conf.keyidx, sta ? sta->addr : bcast_addr, ret);

key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;

if (!(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC))
key->local->crypto_tx_tailroom_needed_cnt++;
}

void ieee80211_key_removed(struct ieee80211_key_conf *key_conf)
Expand Down Expand Up @@ -388,8 +395,10 @@ static void __ieee80211_key_destroy(struct ieee80211_key *key)
ieee80211_aes_key_free(key->u.ccmp.tfm);
if (key->conf.cipher == WLAN_CIPHER_SUITE_AES_CMAC)
ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm);
if (key->local)
if (key->local) {
ieee80211_debugfs_key_remove(key);
key->local->crypto_tx_tailroom_needed_cnt--;
}

kfree(key);
}
Expand Down Expand Up @@ -451,6 +460,8 @@ int ieee80211_key_link(struct ieee80211_key *key,

ieee80211_debugfs_key_add(key);

key->local->crypto_tx_tailroom_needed_cnt++;

ret = ieee80211_key_enable_hw_accel(key);

mutex_unlock(&sdata->local->key_mtx);
Expand Down Expand Up @@ -492,8 +503,12 @@ void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata)

mutex_lock(&sdata->local->key_mtx);

list_for_each_entry(key, &sdata->key_list, list)
sdata->local->crypto_tx_tailroom_needed_cnt = 0;

list_for_each_entry(key, &sdata->key_list, list) {
sdata->local->crypto_tx_tailroom_needed_cnt++;
ieee80211_key_enable_hw_accel(key);
}

mutex_unlock(&sdata->local->key_mtx);
}
Expand Down
7 changes: 1 addition & 6 deletions net/mac80211/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1476,12 +1476,7 @@ static int ieee80211_skb_resize(struct ieee80211_local *local,
{
int tail_need = 0;

/*
* This could be optimised, devices that do full hardware
* crypto (including TKIP MMIC) need no tailroom... But we
* have no drivers for such devices currently.
*/
if (may_encrypt) {
if (may_encrypt && local->crypto_tx_tailroom_needed_cnt) {
tail_need = IEEE80211_ENCRYPT_TAILROOM;
tail_need -= skb_tailroom(skb);
tail_need = max_t(int, tail_need, 0);
Expand Down

0 comments on commit aac6af5

Please sign in to comment.