qcacld-3.0: Add conditional check for SAP key clearing

qcacld-2.0 to qcacld-3.0 propagation

SAP keys should be retained at HDD layer when wlan driver
performs internal restarting due to MCC to SCC switch

Change-Id: I5458f7602a0e3851d678981e107ef3b5bda17dd7
CRs-Fixed: 1095584
This commit is contained in:
wadesong
2017-02-07 16:42:09 +08:00
committed by qcabuildsw
parent 6435f4fc2c
commit 9b81907d27
3 changed files with 36 additions and 3 deletions

View File

@@ -5982,9 +5982,13 @@ static void cds_check_sta_ap_concurrent_ch_intf(void *data)
if (intf_ch == 0) if (intf_ch == 0)
return; return;
cds_info("SAP restarts due to MCC->SCC switch, orig chan: %d, new chan: %d",
hdd_ap_ctx->sapConfig.channel, intf_ch);
hdd_ap_ctx->sapConfig.channel = intf_ch; hdd_ap_ctx->sapConfig.channel = intf_ch;
hdd_ap_ctx->sapConfig.ch_params.ch_width = hdd_ap_ctx->sapConfig.ch_params.ch_width =
hdd_ap_ctx->sapConfig.ch_width_orig; hdd_ap_ctx->sapConfig.ch_width_orig;
hdd_ap_ctx->bss_stop_reason = BSS_STOP_DUE_TO_MCC_SCC_SWITCH;
cds_set_channel_params(hdd_ap_ctx->sapConfig.channel, cds_set_channel_params(hdd_ap_ctx->sapConfig.channel,
hdd_ap_ctx->sapConfig.sec_ch, hdd_ap_ctx->sapConfig.sec_ch,
&hdd_ap_ctx->sapConfig.ch_params); &hdd_ap_ctx->sapConfig.ch_params);

View File

@@ -708,6 +708,20 @@ typedef struct hdd_hostapd_state_s {
} hdd_hostapd_state_t; } hdd_hostapd_state_t;
/**
* enum bss_stop_reason - reasons why a BSS is stopped.
* @BSS_STOP_REASON_INVALID: no reason specified explicitly.
* @BSS_STOP_DUE_TO_MCC_SCC_SWITCH: BSS stopped due to host
* driver is trying to switch AP role to a different channel
* to maintain SCC mode with the STA role on the same card.
* this usually happens when STA is connected to an external
* AP that runs on a different channel
*/
enum bss_stop_reason {
BSS_STOP_REASON_INVALID = 0,
BSS_STOP_DUE_TO_MCC_SCC_SWITCH = 1,
};
/* /*
* Per station structure kept in HDD for multiple station support for SoftAP * Per station structure kept in HDD for multiple station support for SoftAP
*/ */
@@ -789,6 +803,8 @@ struct hdd_ap_ctx_s {
void *sapContext; void *sapContext;
bool dfs_cac_block_tx; bool dfs_cac_block_tx;
enum bss_stop_reason bss_stop_reason;
}; };
typedef struct hdd_scaninfo_s { typedef struct hdd_scaninfo_s {

View File

@@ -1356,9 +1356,22 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
hdd_info("P2PGO is going down now"); hdd_info("P2PGO is going down now");
hdd_issue_stored_joinreq(sta_adapter, pHddCtx); hdd_issue_stored_joinreq(sta_adapter, pHddCtx);
} }
pHddApCtx->groupKey.keyLength = 0; hdd_info("bss_stop_reason=%d", pHddApCtx->bss_stop_reason);
for (i = 0; i < CSR_MAX_NUM_KEY; i++) if (pHddApCtx->bss_stop_reason !=
pHddApCtx->wepKey[i].keyLength = 0; BSS_STOP_DUE_TO_MCC_SCC_SWITCH) {
/* when MCC to SCC switching happens, key storage
* should not be cleared due to hostapd will not
* repopulate the original keys
*/
pHddApCtx->groupKey.keyLength = 0;
for (i = 0; i < CSR_MAX_NUM_KEY; i++)
pHddApCtx->wepKey[i].keyLength = 0;
}
/* clear the reason code in case BSS is stopped
* in another place
*/
pHddApCtx->bss_stop_reason = BSS_STOP_REASON_INVALID;
goto stopbss; goto stopbss;
case eSAP_DFS_CAC_START: case eSAP_DFS_CAC_START: