diff --git a/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h b/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h index 84c96f650936..34bea3450e89 100644 --- a/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h +++ b/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h @@ -49,6 +49,9 @@ #define WLAN_CRYPTO_KEYIX_NONE ((uint16_t)-1) #define WLAN_CRYPTO_MAXKEYIDX (4) #define WLAN_CRYPTO_MAXIGTKKEYIDX (2) +#ifndef WLAN_CRYPTO_MAX_VLANKEYIX +#define WLAN_CRYPTO_MAX_VLANKEYIX WLAN_CRYPTO_MAXKEYIDX +#endif #define WLAN_CRYPTO_MAX_PMKID (3) /* 40 bit wep key len */ diff --git a/umac/cmn_services/crypto/src/wlan_crypto_def_i.h b/umac/cmn_services/crypto/src/wlan_crypto_def_i.h index 7c21ccc02663..adfdb5f29270 100644 --- a/umac/cmn_services/crypto/src/wlan_crypto_def_i.h +++ b/umac/cmn_services/crypto/src/wlan_crypto_def_i.h @@ -433,7 +433,7 @@ struct wlan_crypto_mmie { */ struct wlan_crypto_comp_priv { struct wlan_crypto_params crypto_params; - struct wlan_crypto_key *key[WLAN_CRYPTO_MAXKEYIDX]; + struct wlan_crypto_key *key[WLAN_CRYPTO_MAX_VLANKEYIX]; struct wlan_crypto_key *igtk_key[WLAN_CRYPTO_MAXIGTKKEYIDX]; uint32_t igtk_key_type; uint8_t def_tx_keyid; diff --git a/umac/cmn_services/crypto/src/wlan_crypto_global_api.c b/umac/cmn_services/crypto/src/wlan_crypto_global_api.c index ddb87d8c6db6..9914dd7871bf 100644 --- a/umac/cmn_services/crypto/src/wlan_crypto_global_api.c +++ b/umac/cmn_services/crypto/src/wlan_crypto_global_api.c @@ -571,7 +571,7 @@ QDF_STATUS wlan_crypto_setkey(struct wlan_objmgr_vdev *vdev, | WLAN_CRYPTO_KEY_RECV); } } else { - if ((req_key->keyix >= WLAN_CRYPTO_MAXKEYIDX) + if ((req_key->keyix >= WLAN_CRYPTO_MAX_VLANKEYIX) && (!IS_MGMT_CIPHER(req_key->type))) { return QDF_STATUS_E_INVAL; } @@ -711,7 +711,7 @@ QDF_STATUS wlan_crypto_setkey(struct wlan_objmgr_vdev *vdev, uint16_t kid = req_key->keyix; if (kid == WLAN_CRYPTO_KEYIX_NONE) kid = 0; - if (kid >= WLAN_CRYPTO_MAXKEYIDX) { + if (kid >= WLAN_CRYPTO_MAX_VLANKEYIX) { crypto_err("invalid keyid %d", kid); return QDF_STATUS_E_INVAL; } diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index b2b10bbf03e1..82c33584b20c 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -1795,6 +1795,7 @@ struct wmi_probe_resp_params { * @vdev_id: vdev id * @key_len: key length * @key_idx: key index + * @group_key_idx: group key index for VLAN * @peer_mac: peer mac address * @key_flags: key flags, 0:pairwise key, 1:group key, 2:static key * @key_cipher: key cipher based on security mode @@ -1812,6 +1813,7 @@ struct set_key_params { uint8_t vdev_id; uint16_t key_len; uint32_t key_idx; + uint32_t group_key_idx; uint8_t peer_mac[QDF_MAC_ADDR_SIZE]; uint32_t key_flags; uint32_t key_cipher; diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 5e0e05395b57..823c00fb7cc1 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -4117,6 +4117,10 @@ static QDF_STATUS send_setup_install_key_cmd_tlv(wmi_unified_t wmi_handle, (wmi_vdev_install_key_cmd_fixed_param)); cmd->vdev_id = key_params->vdev_id; cmd->key_ix = key_params->key_idx; + if (key_params->group_key_idx) { + cmd->is_group_key_ix_valid = 1; + cmd->group_key_ix = key_params->group_key_idx; + } WMI_CHAR_ARRAY_TO_MAC_ADDR(key_params->peer_mac, &cmd->peer_macaddr);