qcacld-3.0: Add vdev state machine for IBSS

Add support for VDEV state machine support for IBSS join, leave and
coalesce.

Change-Id: Iaf93f1a1b92f63b35add2f98146f4af12dc09d9c
CRs-Fixed: 2330961
Esse commit está contido em:
Rajeev Kumar Sirasanagandla
2018-10-03 17:24:20 +05:30
commit de nshrivas
commit 2f17f8d2fd
6 arquivos alterados com 136 adições e 33 exclusões

Ver arquivo

@@ -476,7 +476,7 @@ ibss_status_chg_notify(tpAniSirGlobal pMac, tSirMacAddr peerAddr,
}
}
static void ibss_bss_add(tpAniSirGlobal pMac, tpPESession psessionEntry)
void ibss_bss_add(tpAniSirGlobal pMac, tpPESession psessionEntry)
{
tLimMlmStartReq mlmStartReq;
uint32_t cfg;
@@ -569,11 +569,17 @@ static void ibss_bss_add(tpAniSirGlobal pMac, tpPESession psessionEntry)
psessionEntry->pLimStartBssReq->ssId.length + 1);
pe_debug("invoking ADD_BSS as part of coalescing!");
#ifdef CONFIG_VDEV_SM
wlan_vdev_mlme_sm_deliver_evt(psessionEntry->vdev,
WLAN_VDEV_SM_EV_START,
sizeof(mlmStartReq), &mlmStartReq);
#else
if (lim_mlm_add_bss(pMac, &mlmStartReq, psessionEntry) !=
eSIR_SME_SUCCESS) {
pe_err("AddBss failure");
return;
}
#endif
/* Update fields in Beacon */
if (sch_set_fixed_beacon_fields(pMac, psessionEntry) != QDF_STATUS_SUCCESS) {
pe_err("Unable to set fixed Beacon fields");
@@ -582,21 +588,19 @@ static void ibss_bss_add(tpAniSirGlobal pMac, tpPESession psessionEntry)
}
/* delete the current BSS */
static void ibss_bss_delete(tpAniSirGlobal pMac, tpPESession psessionEntry)
void ibss_bss_delete(tpAniSirGlobal mac_ctx, tpPESession session)
{
QDF_STATUS status;
pe_debug("Initiating IBSS Delete BSS");
if (psessionEntry->limMlmState != eLIM_MLM_BSS_STARTED_STATE) {
if (session->limMlmState != eLIM_MLM_BSS_STARTED_STATE) {
pe_warn("Incorrect LIM MLM state for delBss: %d",
psessionEntry->limMlmState);
session->limMlmState);
return;
}
status = lim_del_bss(pMac, NULL, psessionEntry->bssIdx, psessionEntry);
if (status != QDF_STATUS_SUCCESS)
pe_err("delBss failed for bss: %d",
psessionEntry->bssIdx);
status = lim_del_bss(mac_ctx, NULL, session->bssIdx, session);
if (QDF_IS_STATUS_ERROR(status))
pe_err("delBss failed for bss: %d", session->bssIdx);
}
/**
@@ -641,13 +645,15 @@ void lim_ibss_init(tpAniSirGlobal pMac)
* @param pMac - Pointer to Global MAC structure
* @return None
*/
static void lim_ibss_delete_all_peers(tpAniSirGlobal pMac,
tpPESession psessionEntry)
void lim_ibss_delete_all_peers(tpAniSirGlobal pMac,
tpPESession psessionEntry)
{
tLimIbssPeerNode *pCurrNode, *pTempNode;
tpDphHashNode pStaDs;
uint16_t peerIdx;
#ifdef CONFIG_VDEV_SM
QDF_STATUS status;
#endif
pCurrNode = pTempNode = pMac->lim.gLimIbssPeerList;
@@ -669,6 +675,7 @@ static void lim_ibss_delete_all_peers(tpAniSirGlobal pMac,
pStaDs->staIndex,
eWNI_SME_IBSS_PEER_DEPARTED_IND,
psessionEntry->smeSessionId);
lim_del_sta(pMac, pStaDs, false, psessionEntry);
lim_release_peer_idx(pMac, peerIdx, psessionEntry);
dph_delete_hash_entry(pMac, pStaDs->staAddr, peerIdx,
&psessionEntry->dph.dphHashTable);
@@ -700,7 +707,18 @@ static void lim_ibss_delete_all_peers(tpAniSirGlobal pMac,
pMac->lim.gLimNumIbssPeers = 0;
pMac->lim.gLimIbssPeerList = NULL;
#ifdef CONFIG_VDEV_SM
status =
wlan_vdev_mlme_sm_deliver_evt(psessionEntry->vdev,
WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE,
sizeof(*psessionEntry), psessionEntry);
if (!pMac->lim.gLimIbssCoalescingHappened &&
QDF_IS_STATUS_ERROR(status)) {
pe_err("failed to post WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE for vdevid %d",
psessionEntry->smeSessionId);
lim_send_stop_bss_failure_resp(pMac, psessionEntry);
}
#endif
}
/**
@@ -714,7 +732,9 @@ static void lim_ibss_delete_all_peers(tpAniSirGlobal pMac,
void lim_ibss_delete(tpAniSirGlobal pMac, tpPESession psessionEntry)
{
#ifndef CONFIG_VDEV_SM
lim_ibss_delete_all_peers(pMac, psessionEntry);
#endif
ibss_coalesce_free(pMac);
}
@@ -1227,12 +1247,13 @@ void lim_ibss_del_bss_rsp_when_coalescing(tpAniSirGlobal pMac, void *msg,
pDelBss->status, pDelBss->bssIdx);
goto end;
}
#ifndef CONFIG_VDEV_SM
/* Delete peer entries. */
lim_ibss_delete_all_peers(pMac, psessionEntry);
#endif
/* add the new bss */
ibss_bss_add(pMac, psessionEntry);
end:
if (pDelBss != NULL)
qdf_mem_free(pDelBss);
@@ -1271,7 +1292,7 @@ void lim_ibss_add_bss_rsp_when_coalescing(tpAniSirGlobal pMac, void *msg,
infoLen, pSessionEntry->smeSessionId);
{
/* Configure beacon and send beacons to HAL */
lim_send_beacon_ind(pMac, pSessionEntry);
lim_send_beacon(pMac, pSessionEntry);
}
end:
@@ -1430,7 +1451,14 @@ lim_ibss_coalesce(tpAniSirGlobal pMac,
ibss_coalesce_save(pMac, pHdr, pBeacon);
pe_debug("IBSS Coalescing happened Delete BSSID :" MAC_ADDRESS_STR,
MAC_ADDR_ARRAY(currentBssId));
#ifdef CONFIG_VDEV_SM
wlan_vdev_mlme_sm_deliver_evt(psessionEntry->vdev,
WLAN_VDEV_SM_EV_DOWN,
sizeof(*psessionEntry),
psessionEntry);
#else
ibss_bss_delete(pMac, psessionEntry);
#endif
return QDF_STATUS_SUCCESS;
} else {
if (qdf_mem_cmp

Ver arquivo

@@ -30,6 +30,33 @@
#include "sir_common.h"
#include "lim_utils.h"
/**
* ibss_bss_delete()- start the ibss
* @mac_ctx: Pointer to Global MAC structure
* @session: pe session
*
* Return: None
*/
void ibss_bss_add(tpAniSirGlobal mac_ctx, tpPESession session);
/**
* ibss_bss_delete()- delete the current BSS
* @mac_ctx: Pointer to Global MAC structure
* @session: pe session
*
* Return: None
*/
void ibss_bss_delete(tpAniSirGlobal mac_ctx, tpPESession session);
/**
* lim_ibss_delete_all_peers: delete all IBSS peers.
* @mac_ctx: Pointer to Global MAC structure
* @session: pe session
*
* Return: None
*/
void lim_ibss_delete_all_peers(tpAniSirGlobal mac_ctx, tpPESession session);
void lim_ibss_init(tpAniSirGlobal);
void lim_ibss_delete(tpAniSirGlobal, tpPESession psessionEntry);
QDF_STATUS lim_ibss_coalesce(tpAniSirGlobal, tpSirMacMgmtHdr,

Ver arquivo

@@ -676,9 +676,6 @@ end:
/* Update PE session Id */
mlm_start_cnf.sessionId = mlm_start_req->sessionId;
/* Free up buffer allocated for LimMlmScanReq */
qdf_mem_free(mlm_start_req);
/*
* Respond immediately to LIM, only if MLME has not been
* successfully able to send WMA_ADD_BSS_REQ to HAL.

Ver arquivo

@@ -1065,6 +1065,7 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
qdf_status = lim_send_start_vdev_req(session, mlm_start_req);
if (QDF_IS_STATUS_ERROR(qdf_status))
goto free;
qdf_mem_free(mlm_start_req);
return;
} else {
@@ -2892,15 +2893,8 @@ static void __lim_counter_measures(tpAniSirGlobal pMac, tpPESession psessionEntr
mac, psessionEntry, false);
};
/**
* lim_send_stop_bss_failure_resp() -send failure delete bss resp to sme
* @mac_ctx: mac ctx
* @session: session pointer
*
* Return None
*/
static void lim_send_stop_bss_failure_resp(tpAniSirGlobal mac_ctx,
tpPESession session)
void lim_send_stop_bss_failure_resp(tpAniSirGlobal mac_ctx,
tpPESession session)
{
session->limSmeState = session->limPrevSmeState;

Ver arquivo

@@ -8471,17 +8471,40 @@ void lim_send_beacon(tpAniSirGlobal mac_ctx, tpPESession session)
QDF_STATUS lim_ap_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
tpPESession session;
tSirResultCodes ret;
tpLimMlmStartReq start_req = (tLimMlmStartReq *)data;
tpAniSirGlobal mac_ctx;
if (!data) {
pe_err("data is NULL");
return QDF_STATUS_E_INVAL;
}
mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
if (!mac_ctx) {
pe_err("mac_ctx is NULL");
if (data)
qdf_mem_free(data);
return QDF_STATUS_E_INVAL;
}
lim_process_mlm_start_req(mac_ctx, (tLimMlmStartReq *)data);
session = pe_find_session_by_session_id(mac_ctx,
start_req->sessionId);
if (!session) {
pe_err("session is NULL");
return QDF_STATUS_E_INVAL;
}
if (LIM_IS_IBSS_ROLE(session) &&
session->mac_ctx->lim.gLimIbssCoalescingHappened) {
ibss_bss_add(session->mac_ctx, session);
ret = lim_mlm_add_bss(session->mac_ctx, start_req, session);
if (ret != eSIR_SME_SUCCESS) {
pe_err("AddBss failure");
return QDF_STATUS_E_INVAL;
}
} else {
lim_process_mlm_start_req(session->mac_ctx, start_req);
}
return QDF_STATUS_SUCCESS;
}
@@ -8546,7 +8569,17 @@ QDF_STATUS lim_ap_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
QDF_STATUS lim_ap_mlme_vdev_disconnect_peers(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
lim_delete_all_peers((tpPESession)data);
tpPESession session = (tpPESession)data;
if (!data) {
pe_err("data is NULL");
return QDF_STATUS_E_INVAL;
}
if (LIM_IS_IBSS_ROLE(session))
lim_ibss_delete_all_peers(session->mac_ctx, session);
else
lim_delete_all_peers(session);
return QDF_STATUS_SUCCESS;
}
@@ -8554,7 +8587,21 @@ QDF_STATUS lim_ap_mlme_vdev_disconnect_peers(struct vdev_mlme_obj *vdev_mlme,
QDF_STATUS lim_ap_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
return lim_send_vdev_stop((tpPESession)data);
tpPESession session = (tpPESession)data;
QDF_STATUS status = QDF_STATUS_SUCCESS;
if (!data) {
pe_err("data is NULL");
return QDF_STATUS_E_INVAL;
}
if (LIM_IS_IBSS_ROLE(session) &&
session->mac_ctx->lim.gLimIbssCoalescingHappened)
ibss_bss_delete(session->mac_ctx, session);
else
status = lim_send_vdev_stop(session);
return status;
}
QDF_STATUS lim_ap_mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme,

Ver arquivo

@@ -1365,6 +1365,16 @@ void lim_send_dfs_chan_sw_ie_update(tpAniSirGlobal mac_ctx,
*/
void lim_process_ap_ecsa_timeout(void *session);
/**
* lim_send_stop_bss_failure_resp() -send failure delete bss resp to sme
* @mac_ctx: mac ctx
* @session: session pointer
*
* Return None
*/
void lim_send_stop_bss_failure_resp(tpAniSirGlobal mac_ctx,
tpPESession session);
/**
* lim_delete_all_peers() -delete all connected peers
* @session: session pointer