> + * @IEEE80211_KEY_FLAG_RX_ONLY: Set by mac80211 to indicate that the key
> + * must not be used for TX (yet).
I'm not sure that's relevant, since you have one key pointer for TX?
> + * @IEEE80211_KEY_FLAG_SET_TX: Set by mac80211 to indicate that a previously
> + * installed key with IEEE80211_KEY_FLAG_RX_ONLY should take over TX
> also.
That also doesn't seem relevant ...
Oh, all of this is for HW offloads?
I _think_ I would prefer to have new key ops instead. Now you'd have
SET_KEY / <empty flags>
SET_KEY / RX_ONLY
SET_KEY / SET_TX
but I think maybe
SET_KEY
SET_KEY_RX_ONLY
KEY_ENABLE_TX
would make more sense?
> + if (pairwise && params->flag == NL80211_KEY_SET_TX) {
> + mutex_lock(&local->sta_mtx);
> + sta = sta_info_get_bss(sdata, mac_addr);
> +
> + if (!sta ||
> + !(key = rcu_dereference(sta->ptk[key_idx])) ||
indentation here is off by one
> + !(key->conf.flags | IEEE80211_KEY_FLAG_RX_ONLY)) {
that makes no sense, should be & I guess
> - /* PTK only using key ID 0 needs special handling on rekey */
> - if (new_key && sta && ptk0rekey) {
> + /* PTK rekey without Extended Key ID needs special handling */
> + if (new_key && pairwise && sta &&
> + !test_sta_flag(sta, WLAN_STA_EXT_KEY_ID)) {
> local = old_key->local;
> sdata = old_key->sdata;
This seems wrong, even if you have ext key ID support and everything,
but you do 0 -> 0 rekeying, then you still need all the special handling
(in fact also then if you go 1->1!). So it seems you'd instead want to
see if you're going from a TX key to a TX key with the same key ID, and
then you don't need this flag at all.
> +++ b/net/mac80211/sta_info.c
> @@ -350,6 +350,7 @@ struct sta_info *sta_info_alloc(struct
> ieee80211_sub_if_data *sdata,
> sta->sta.max_rx_aggregation_subframes =
> local->hw.max_rx_aggregation_subframes;
>
> + sta->ptk_idx = NUM_DEFAULT_KEYS - 1;
That makes no sense? Why should it be 3? That's invalid anyway?
johannes