Some chips can encrypt managment frames in HW, but require generated IV in the frame. Add a key flag that allows us to achieve this. Signed-off-by: Marek Kwaczynski <marek.kwaczynski@xxxxxxxxx> --- include/net/mac80211.h | 16 ++++++++++------ net/mac80211/tx.c | 5 +++-- net/mac80211/wpa.c | 6 ++++-- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 2de7ff4..c81415f 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -1202,14 +1202,18 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev); * fall back to software crypto. Note that this flag deals only with * RX, if your crypto engine can't deal with TX you can also set the * %IEEE80211_KEY_FLAG_SW_MGMT_TX flag to encrypt such frames in SW. + * @IEEE80211_KEY_FLAG_GENERATE_MGMT_IV: This flag should be set by the + * driver for a CCMP key to indicate that is requires IV generation + * only for managment frames (MFP). */ enum ieee80211_key_flags { - IEEE80211_KEY_FLAG_GENERATE_IV = 1<<1, - IEEE80211_KEY_FLAG_GENERATE_MMIC= 1<<2, - IEEE80211_KEY_FLAG_PAIRWISE = 1<<3, - IEEE80211_KEY_FLAG_SW_MGMT_TX = 1<<4, - IEEE80211_KEY_FLAG_PUT_IV_SPACE = 1<<5, - IEEE80211_KEY_FLAG_RX_MGMT = 1<<6, + IEEE80211_KEY_FLAG_GENERATE_IV = 1<<1, + IEEE80211_KEY_FLAG_GENERATE_MMIC = 1<<2, + IEEE80211_KEY_FLAG_PAIRWISE = 1<<3, + IEEE80211_KEY_FLAG_SW_MGMT_TX = 1<<4, + IEEE80211_KEY_FLAG_PUT_IV_SPACE = 1<<5, + IEEE80211_KEY_FLAG_RX_MGMT = 1<<6, + IEEE80211_KEY_FLAG_SW_MGMT_IV_TX = 1<<7, }; /** diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 19d36d4..49b19ab 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -625,8 +625,9 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) tx->key = NULL; else skip_hw = (tx->key->conf.flags & - IEEE80211_KEY_FLAG_SW_MGMT_TX) && - ieee80211_is_mgmt(hdr->frame_control); + (IEEE80211_KEY_FLAG_SW_MGMT_TX | + IEEE80211_KEY_FLAG_GENERATE_MGMT_IV)) && + ieee80211_is_mgmt(hdr->frame_control); break; case WLAN_CIPHER_SUITE_AES_CMAC: if (!ieee80211_is_mgmt(hdr->frame_control)) diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c index b8600e3..a5fe1d9 100644 --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c @@ -450,8 +450,10 @@ static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb) ccmp_pn2hdr(pos, pn, key->conf.keyidx); - /* hwaccel - with software CCMP header */ - if (info->control.hw_key) + /* hwaccel - with software CCMP header or the HW needs + * generated the IV */ + if (info->control.hw_key || + (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MGMT_IV)) return 0; pos += IEEE80211_CCMP_HDR_LEN; -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html