if (keyconf->link_id >= 0) {
link_info = mvmvif->link[keyconf->link_id]; if (!link_info) return0;
}
/* AP group keys are per link and should be on the mcast/bcast STA */ if (vif->type == NL80211_IFTYPE_AP &&
!(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE)) { /* IGTK/BIGTK to bcast STA */ if (keyconf->keyidx >= 4) return BIT(link_info->bcast_sta.sta_id); /* GTK for data to mcast STA */ return BIT(link_info->mcast_sta.sta_id);
}
/* for client mode use the AP STA also for group keys */ if (!sta && vif->type == NL80211_IFTYPE_STATION)
sta = mvmvif->ap_sta;
/* During remove the STA was removed and the group keys come later *(whichsoundslikeabadsequence,butrememberthattomac80211the *groupkeyshavenostapointer),sowedon'thaveaSTAnow. *Sincethishappensforgroupkeysonly,justusethelink_infoas *thegroupkeysareperlink;makesurethatisthecasebychecking *wedohavealink_idorarenotdoingMLO. *Ofcoursethesamecanbedoneduringaddaswell,butwemustdo *itduringremove,sincewedon'thavethemvmvif->ap_stapointer.
*/ if (!sta && (keyconf->link_id >= 0 || !ieee80211_vif_is_mld(vif))) return BIT(link_info->ap_sta_id);
/* STA should be non-NULL now, but iwl_mvm_sta_fw_id_mask() checks */
/* pass link_id to filter by it if not -1 (GTK on client) */ return iwl_mvm_sta_fw_id_mask(mvm, sta, keyconf->link_id);
}
/* set to -1 for non-MLO right now */ if (keyconf->link_id >= 0)
link_id = keyconf->link_id;
mvm_link = mvmvif->link[link_id]; if (WARN_ON(!mvm_link)) return -EINVAL;
if (mvm_link->igtk) {
IWL_DEBUG_MAC80211(mvm, "remove old IGTK %d\n",
mvm_link->igtk->keyidx);
ret = iwl_mvm_sec_key_del(mvm, vif, sta,
mvm_link->igtk); if (ret)
IWL_ERR(mvm, "failed to remove old IGTK (ret=%d)\n",
ret);
}
WARN_ON(mvm_link->igtk);
}
ret = iwl_mvm_mld_send_key(mvm, sta_mask, key_flags, keyconf); if (ret) return ret;
if (mvm_link)
mvm_link->igtk = keyconf;
/* We don't really need this, but need it to be not invalid, *andifweswitchlinksmultipletimesitmightgotobe *invalidwhenremoved.
*/
keyconf->hw_key_idx = 0;
/* set to -1 for non-MLO right now */ if (keyconf->link_id >= 0)
link_id = keyconf->link_id;
mvm_link = mvmvif->link[link_id]; if (WARN_ON(!mvm_link)) return -EINVAL;
if (mvm_link->igtk == keyconf) { /* no longer in HW - mark for later */
mvm_link->igtk->hw_key_idx = STA_KEY_IDX_INVALID;
mvm_link->igtk = NULL;
}
}
ret = __iwl_mvm_sec_key_del(mvm, sta_mask, key_flags, keyconf->keyidx,
flags); if (ret) return ret;
/* For WEP, delete the key again as unicast */ if (keyconf->cipher == WLAN_CIPHER_SUITE_WEP40 ||
keyconf->cipher == WLAN_CIPHER_SUITE_WEP104) {
key_flags ^= IWL_SEC_KEY_FLAG_MCAST_KEY;
ret = __iwl_mvm_sec_key_del(mvm, sta_mask, key_flags,
keyconf->keyidx, flags);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.