[DTV00857290][[DTV][Coverity Scanned Code Defect] 15367: Out-of-bounds write]
[Description]
Fix coverity defects under mgmt/
i. Fix "dereference before null check" issues.
ii. Remove do-while style flow.
[Related CIDs]
CID70633, CID79629, CID70627, CID70626, CID70625
Change-Id: I9850e7b898e655f33ba10216d6e6f6d6f552f22c
Signed-off-by: Awk Jiang <awk.jiang@mediatek.com>
CR-Id: DTV00857290
Feature: misc
(cherry picked from commit a37e4e8c7ed569067a5c7e44f1b3719a5c98ca01)
diff --git a/mgmt/p2p_role_fsm.c b/mgmt/p2p_role_fsm.c
index d611c2b..9dc0e04 100644
--- a/mgmt/p2p_role_fsm.c
+++ b/mgmt/p2p_role_fsm.c
@@ -1510,159 +1510,155 @@
P_MSG_P2P_CONNECTION_ABORT_T prDisconnMsg = (P_MSG_P2P_CONNECTION_ABORT_T) NULL;
P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
+ prDisconnMsg = (P_MSG_P2P_CONNECTION_ABORT_T) prMsgHdr;
- prDisconnMsg = (P_MSG_P2P_CONNECTION_ABORT_T) prMsgHdr;
+ prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prDisconnMsg->ucRoleIdx);
- prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prDisconnMsg->ucRoleIdx);
+ DBGLOG(P2P, TRACE, "p2pFsmRunEventConnectionAbort: Connection Abort.\n");
- DBGLOG(P2P, TRACE, "p2pFsmRunEventConnectionAbort: Connection Abort.\n");
+ if (!prP2pRoleFsmInfo) {
+ DBGLOG(P2P, ERROR,
+ "p2pRoleFsmRunEventConnectionAbort: Corresponding P2P Role FSM empty: %d.\n",
+ prDisconnMsg->ucRoleIdx);
+ goto error;
+ }
- if (!prP2pRoleFsmInfo) {
- DBGLOG(P2P, ERROR,
- "p2pRoleFsmRunEventConnectionAbort: Corresponding P2P Role FSM empty: %d.\n",
- prDisconnMsg->ucRoleIdx);
- break;
- }
+ prP2pBssInfo = prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex];
- prP2pBssInfo = prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex];
+ if (!prP2pBssInfo) {
+ DBGLOG(P2P, ERROR,
+ "prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex(%d)] is NULL!",
+ prP2pRoleFsmInfo->ucBssIndex);
+ goto error;
+ }
- if (!prP2pBssInfo)
- break;
+ switch (prP2pBssInfo->eCurrentOPMode) {
+ case OP_MODE_INFRASTRUCTURE:
+ {
+ UINT_8 aucBCBSSID[] = BC_BSSID;
- switch (prP2pBssInfo->eCurrentOPMode) {
- case OP_MODE_INFRASTRUCTURE:
- {
- UINT_8 aucBCBSSID[] = BC_BSSID;
-
- if (!prP2pBssInfo->prStaRecOfAP) {
- DBGLOG(P2P, TRACE, "GO's StaRec is NULL\n");
- break;
- }
- if (UNEQUAL_MAC_ADDR(prP2pBssInfo->prStaRecOfAP->aucMacAddr, prDisconnMsg->aucTargetID)
- && UNEQUAL_MAC_ADDR(prDisconnMsg->aucTargetID, aucBCBSSID)) {
- DBGLOG(P2P, TRACE,
- "Unequal MAC ADDR [" MACSTR ":" MACSTR "]\n",
- MAC2STR(prP2pBssInfo->prStaRecOfAP->aucMacAddr),
- MAC2STR(prDisconnMsg->aucTargetID));
- break;
- }
+ if (!prP2pBssInfo->prStaRecOfAP) {
+ DBGLOG(P2P, TRACE, "GO's StaRec is NULL\n");
+ break;
+ }
+ if (UNEQUAL_MAC_ADDR(prP2pBssInfo->prStaRecOfAP->aucMacAddr, prDisconnMsg->aucTargetID)
+ && UNEQUAL_MAC_ADDR(prDisconnMsg->aucTargetID, aucBCBSSID)) {
+ DBGLOG(P2P, TRACE,
+ "Unequal MAC ADDR [" MACSTR ":" MACSTR "]\n",
+ MAC2STR(prP2pBssInfo->prStaRecOfAP->aucMacAddr),
+ MAC2STR(prDisconnMsg->aucTargetID));
+ break;
+ }
#if CFG_WPS_DISCONNECT || (KERNEL_VERSION(4, 4, 0) <= CFG80211_VERSION_CODE)
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
- prP2pRoleFsmInfo->ucRoleIndex,
- NULL, NULL, 0, 0,
- WLAN_STATUS_MEDIA_DISCONNECT);
+ kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
+ prP2pRoleFsmInfo->ucRoleIndex,
+ NULL, NULL, 0, 0,
+ WLAN_STATUS_MEDIA_DISCONNECT);
#else
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
- prP2pRoleFsmInfo->ucRoleIndex, NULL, NULL, 0, 0);
+ kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
+ prP2pRoleFsmInfo->ucRoleIndex, NULL, NULL, 0, 0);
#endif
- prStaRec = prP2pBssInfo->prStaRecOfAP;
+ prStaRec = prP2pBssInfo->prStaRecOfAP;
- /* Stop rejoin timer if it is started. */
- /* TODO: If it has. */
+ /* Stop rejoin timer if it is started. */
+ /* TODO: If it has. */
- p2pFuncDisconnect(prAdapter, prP2pBssInfo,
- prStaRec,
+ p2pFuncDisconnect(prAdapter, prP2pBssInfo,
+ prStaRec,
+ prDisconnMsg->fgSendDeauth, prDisconnMsg->u2ReasonCode);
+
+ cnmTimerStopTimer(prAdapter, &(prStaRec->rDeauthTxDoneTimer));
+
+ cnmTimerInitTimer(prAdapter,
+ &(prStaRec->rDeauthTxDoneTimer),
+ (PFN_MGMT_TIMEOUT_FUNC) p2pRoleFsmDeauthTimeout, (ULONG) prStaRec);
+
+ cnmTimerStartTimer(prAdapter, &(prStaRec->rDeauthTxDoneTimer),
+ P2P_DEAUTH_TIMEOUT_TIME_MS);
+
+ SET_NET_PWR_STATE_IDLE(prAdapter, prP2pBssInfo->ucBssIndex);
+
+ p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
+ }
+ break;
+ case OP_MODE_ACCESS_POINT:
+ {
+ /* Search specific client device, and disconnect. */
+ /* 1. Send deauthentication frame. */
+ /* 2. Indication: Device disconnect. */
+ P_STA_RECORD_T prCurrStaRec = (P_STA_RECORD_T) NULL;
+
+ DBGLOG(P2P, TRACE, "Disconnecting with Target ID: " MACSTR "\n",
+ MAC2STR(prDisconnMsg->aucTargetID));
+
+ prCurrStaRec = bssGetClientByMac(prAdapter, prP2pBssInfo, prDisconnMsg->aucTargetID);
+
+ if (prCurrStaRec) {
+ DBGLOG(P2P, TRACE, "Disconnecting: " MACSTR "\n",
+ MAC2STR(prCurrStaRec->aucMacAddr));
+
+ /* Glue layer indication. */
+ /* kalP2PGOStationUpdate(prAdapter->prGlueInfo, prCurrStaRec, FALSE); */
+
+ /* Send deauth & do indication. */
+ p2pFuncDisconnect(prAdapter, prP2pBssInfo, prCurrStaRec,
prDisconnMsg->fgSendDeauth, prDisconnMsg->u2ReasonCode);
- cnmTimerStopTimer(prAdapter, &(prStaRec->rDeauthTxDoneTimer));
+ cnmTimerStopTimer(prAdapter, &(prCurrStaRec->rDeauthTxDoneTimer));
cnmTimerInitTimer(prAdapter,
- &(prStaRec->rDeauthTxDoneTimer),
- (PFN_MGMT_TIMEOUT_FUNC) p2pRoleFsmDeauthTimeout, (ULONG) prStaRec);
+ &(prCurrStaRec->rDeauthTxDoneTimer),
+ (PFN_MGMT_TIMEOUT_FUNC) p2pRoleFsmDeauthTimeout,
+ (ULONG) prCurrStaRec);
- cnmTimerStartTimer(prAdapter, &(prStaRec->rDeauthTxDoneTimer),
+ cnmTimerStartTimer(prAdapter, &(prCurrStaRec->rDeauthTxDoneTimer),
P2P_DEAUTH_TIMEOUT_TIME_MS);
-
- SET_NET_PWR_STATE_IDLE(prAdapter, prP2pBssInfo->ucBssIndex);
-
- p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
}
- break;
- case OP_MODE_ACCESS_POINT:
- {
- /* Search specific client device, and disconnect. */
- /* 1. Send deauthentication frame. */
- /* 2. Indication: Device disconnect. */
- P_STA_RECORD_T prCurrStaRec = (P_STA_RECORD_T) NULL;
+#if 0
+ LINK_FOR_EACH(prLinkEntry, prStaRecOfClientList) {
+ prCurrStaRec = LINK_ENTRY(prLinkEntry, STA_RECORD_T, rLinkEntry);
- DBGLOG(P2P, TRACE, "Disconnecting with Target ID: " MACSTR "\n",
- MAC2STR(prDisconnMsg->aucTargetID));
+ ASSERT(prCurrStaRec);
- prCurrStaRec = bssGetClientByMac(prAdapter, prP2pBssInfo, prDisconnMsg->aucTargetID);
+ if (EQUAL_MAC_ADDR(prCurrStaRec->aucMacAddr, prDisconnMsg->aucTargetID)) {
- if (prCurrStaRec) {
- DBGLOG(P2P, TRACE, "Disconnecting: " MACSTR "\n",
+ DBGLOG(P2P, TRACE,
+ "Disconnecting: " MACSTR "\n",
MAC2STR(prCurrStaRec->aucMacAddr));
+ /* Remove STA from client list. */
+ LINK_REMOVE_KNOWN_ENTRY(prStaRecOfClientList,
+ &prCurrStaRec->rLinkEntry);
+
/* Glue layer indication. */
/* kalP2PGOStationUpdate(prAdapter->prGlueInfo, prCurrStaRec, FALSE); */
/* Send deauth & do indication. */
- p2pFuncDisconnect(prAdapter, prP2pBssInfo, prCurrStaRec,
- prDisconnMsg->fgSendDeauth, prDisconnMsg->u2ReasonCode);
+ p2pFuncDisconnect(prAdapter, prP2pBssInfo,
+ prCurrStaRec,
+ prDisconnMsg->fgSendDeauth,
+ prDisconnMsg->u2ReasonCode);
- cnmTimerStopTimer(prAdapter, &(prCurrStaRec->rDeauthTxDoneTimer));
+ /* prTargetStaRec = prCurrStaRec; */
- cnmTimerInitTimer(prAdapter,
- &(prCurrStaRec->rDeauthTxDoneTimer),
- (PFN_MGMT_TIMEOUT_FUNC) p2pRoleFsmDeauthTimeout,
- (ULONG) prCurrStaRec);
-
- cnmTimerStartTimer(prAdapter, &(prCurrStaRec->rDeauthTxDoneTimer),
- P2P_DEAUTH_TIMEOUT_TIME_MS);
+ break;
}
-#if 0
- LINK_FOR_EACH(prLinkEntry, prStaRecOfClientList) {
- prCurrStaRec = LINK_ENTRY(prLinkEntry, STA_RECORD_T, rLinkEntry);
-
- ASSERT(prCurrStaRec);
-
- if (EQUAL_MAC_ADDR(prCurrStaRec->aucMacAddr, prDisconnMsg->aucTargetID)) {
-
- DBGLOG(P2P, TRACE,
- "Disconnecting: " MACSTR "\n",
- MAC2STR(prCurrStaRec->aucMacAddr));
-
- /* Remove STA from client list. */
- LINK_REMOVE_KNOWN_ENTRY(prStaRecOfClientList,
- &prCurrStaRec->rLinkEntry);
-
- /* Glue layer indication. */
- /* kalP2PGOStationUpdate(prAdapter->prGlueInfo, prCurrStaRec, FALSE); */
-
- /* Send deauth & do indication. */
- p2pFuncDisconnect(prAdapter, prP2pBssInfo,
- prCurrStaRec,
- prDisconnMsg->fgSendDeauth,
- prDisconnMsg->u2ReasonCode);
-
- /* prTargetStaRec = prCurrStaRec; */
-
- break;
- }
- }
+ }
#endif
- }
- break;
- case OP_MODE_P2P_DEVICE:
- default:
- ASSERT(FALSE);
- break;
}
+ break;
+ case OP_MODE_P2P_DEVICE:
+ default:
+ ASSERT(FALSE);
+ break;
+ }
- } while (FALSE);
-
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
-
- return;
-
+error:
+ cnmMemFree(prAdapter, prMsgHdr);
} /* p2pRoleFsmRunEventConnectionAbort */
/*----------------------------------------------------------------------------*/
@@ -1683,151 +1679,159 @@
P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
+ prJoinCompMsg = (P_MSG_JOIN_COMP_T) prMsgHdr;
+ prStaRec = prJoinCompMsg->prStaRec;
+ prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
- prJoinCompMsg = (P_MSG_JOIN_COMP_T) prMsgHdr;
- prStaRec = prJoinCompMsg->prStaRec;
- prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
+ DBGLOG(P2P, TRACE, "P2P BSS %d, Join Complete\n", prStaRec->ucBssIndex);
- DBGLOG(P2P, TRACE, "P2P BSS %d, Join Complete\n", prStaRec->ucBssIndex);
+ ASSERT(prStaRec)
+ if (!prStaRec) {
+ DBGLOG(P2P, ERROR, "prJoinCompMsg->prStaRec is NULL!\n");
+ goto error;
+ }
- if (prStaRec == NULL) {
- ASSERT(FALSE);
- break;
- } else if (prStaRec->ucBssIndex >= P2P_DEV_BSS_INDEX) {
- ASSERT(FALSE);
- break;
- }
+ ASSERT(prStaRec->ucBssIndex < P2P_DEV_BSS_INDEX);
+ if (!(prStaRec->ucBssIndex < P2P_DEV_BSS_INDEX)) {
+ DBGLOG(P2P, ERROR, "prStaRec->ucBssIndex % should < P2P_DEV_BSS_INDEX(%d)!\n",
+ prStaRec->ucBssIndex, P2P_DEV_BSS_INDEX);
+ goto error;
+ }
- prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex);
+ prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex);
- if (prP2pBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
- if (prP2pBssInfo->u4PrivateData >= BSS_P2P_NUM)
- break;
+ ASSERT(prP2pBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE);
+ if (prP2pBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE) {
+ DBGLOG(P2P, ERROR, "prP2pBssInfo->eCurrentOPMode %d != OP_MODE_INFRASTRUCTURE(%d)!\n",
+ prP2pBssInfo->eCurrentOPMode, OP_MODE_INFRASTRUCTURE);
+ goto error;
+ }
- prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prP2pBssInfo->u4PrivateData);
+ ASSERT(prP2pBssInfo->u4PrivateData < BSS_P2P_NUM);
+ if (!(prP2pBssInfo->u4PrivateData < BSS_P2P_NUM)) {
+ DBGLOG(P2P, ERROR, "prP2pBssInfo->u4PrivateData %s should < BSS_P2P_NUM(%d)!\n",
+ prP2pBssInfo->u4PrivateData, BSS_P2P_NUM);
+ goto error;
+ }
- prJoinInfo = &(prP2pRoleFsmInfo->rJoinInfo);
+ prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prP2pBssInfo->u4PrivateData);
- /* Check SEQ NUM */
- if (prJoinCompMsg->ucSeqNum == prJoinInfo->ucSeqNumOfReqMsg) {
- ASSERT(prStaRec == prJoinInfo->prTargetStaRec);
- prJoinInfo->fgIsJoinComplete = TRUE;
+ prJoinInfo = &(prP2pRoleFsmInfo->rJoinInfo);
- if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
+ /* Check SEQ NUM */
+ if (prJoinCompMsg->ucSeqNum == prJoinInfo->ucSeqNumOfReqMsg) {
+ ASSERT(prStaRec == prJoinInfo->prTargetStaRec);
+ prJoinInfo->fgIsJoinComplete = TRUE;
- /* 4 <1.1> Change FW's Media State immediately. */
- p2pChangeMediaState(prAdapter, prP2pBssInfo, PARAM_MEDIA_STATE_CONNECTED);
+ if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
- /* 4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have. */
- if ((prP2pBssInfo->prStaRecOfAP) && (prP2pBssInfo->prStaRecOfAP != prStaRec)) {
- cnmStaRecChangeState(prAdapter,
- prP2pBssInfo->prStaRecOfAP, STA_STATE_1);
+ /* 4 <1.1> Change FW's Media State immediately. */
+ p2pChangeMediaState(prAdapter, prP2pBssInfo, PARAM_MEDIA_STATE_CONNECTED);
- cnmStaRecFree(prAdapter, prP2pBssInfo->prStaRecOfAP);
+ /* 4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have. */
+ if ((prP2pBssInfo->prStaRecOfAP) && (prP2pBssInfo->prStaRecOfAP != prStaRec)) {
+ cnmStaRecChangeState(prAdapter,
+ prP2pBssInfo->prStaRecOfAP, STA_STATE_1);
- prP2pBssInfo->prStaRecOfAP = NULL;
- }
- /* 4 <1.3> Update BSS_INFO_T */
- p2pFuncUpdateBssInfoForJOIN(prAdapter,
- prJoinInfo->prTargetBssDesc,
- prStaRec, prP2pBssInfo, prAssocRspSwRfb);
+ cnmStaRecFree(prAdapter, prP2pBssInfo->prStaRecOfAP);
- /* 4 <1.4> Activate current AP's STA_RECORD_T in Driver. */
- cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
+ prP2pBssInfo->prStaRecOfAP = NULL;
+ }
+ /* 4 <1.3> Update BSS_INFO_T */
+ if (prAssocRspSwRfb) {
+ p2pFuncUpdateBssInfoForJOIN(prAdapter,
+ prJoinInfo->prTargetBssDesc,
+ prStaRec, prP2pBssInfo, prAssocRspSwRfb);
+ } else {
+ DBGLOG(P2P, INFO,
+ "prAssocRspSwRfb is NULL! Skip p2pFuncUpdateBssInfoForJOIN\n");
+ }
+
+ /* 4 <1.4> Activate current AP's STA_RECORD_T in Driver. */
+ cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
#if CFG_SUPPORT_P2P_RSSI_QUERY
- /* <1.5> Update RSSI if necessary */
- nicUpdateRSSI(prAdapter, prP2pBssInfo->ucBssIndex,
- (INT_8) (RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
+ /* <1.5> Update RSSI if necessary */
+ nicUpdateRSSI(prAdapter, prP2pBssInfo->ucBssIndex,
+ (INT_8) (RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
#endif
- /* 4 <1.6> Indicate Connected Event to Host immediately. */
- /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
- /* p2pIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED,
- * prStaRec->aucMacAddr);
- */
- if (prJoinInfo->prTargetBssDesc)
- scanReportBss2Cfg80211(prAdapter,
- OP_MODE_P2P_DEVICE, prJoinInfo->prTargetBssDesc);
+ /* 4 <1.6> Indicate Connected Event to Host immediately. */
+ /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
+ /* p2pIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED,
+ * prStaRec->aucMacAddr);
+ */
+ if (prJoinInfo->prTargetBssDesc)
+ scanReportBss2Cfg80211(prAdapter,
+ OP_MODE_P2P_DEVICE, prJoinInfo->prTargetBssDesc);
#if CFG_WPS_DISCONNECT || (KERNEL_VERSION(4, 4, 0) <= CFG80211_VERSION_CODE)
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
- prP2pRoleFsmInfo->ucRoleIndex,
- &prP2pRoleFsmInfo->rConnReqInfo,
- prJoinInfo->aucIEBuf,
- prJoinInfo->u4BufLength,
- prStaRec->u2StatusCode,
- WLAN_STATUS_MEDIA_DISCONNECT);
+ kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
+ prP2pRoleFsmInfo->ucRoleIndex,
+ &prP2pRoleFsmInfo->rConnReqInfo,
+ prJoinInfo->aucIEBuf,
+ prJoinInfo->u4BufLength,
+ prStaRec->u2StatusCode,
+ WLAN_STATUS_MEDIA_DISCONNECT);
#else
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
- prP2pRoleFsmInfo->ucRoleIndex,
- &prP2pRoleFsmInfo->rConnReqInfo,
- prJoinInfo->aucIEBuf,
- prJoinInfo->u4BufLength,
- prStaRec->u2StatusCode);
+ kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
+ prP2pRoleFsmInfo->ucRoleIndex,
+ &prP2pRoleFsmInfo->rConnReqInfo,
+ prJoinInfo->aucIEBuf,
+ prJoinInfo->u4BufLength,
+ prStaRec->u2StatusCode);
#endif
- } else {
- /* Join Fail */
- /* 4 <2.1> Redo JOIN process with other Auth Type if possible */
- if (p2pFuncRetryJOIN(prAdapter, prStaRec, prJoinInfo) == FALSE) {
- P_BSS_DESC_T prBssDesc;
-
- /* Increase Failure Count */
- prStaRec->ucJoinFailureCount++;
-
- prBssDesc = prJoinInfo->prTargetBssDesc;
-
- ASSERT(prBssDesc);
- ASSERT(prBssDesc->fgIsConnecting);
-
- prBssDesc->fgIsConnecting = FALSE;
-
-#if CFG_WPS_DISCONNECT || (KERNEL_VERSION(4, 4, 0) <= CFG80211_VERSION_CODE)
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
- prP2pRoleFsmInfo->ucRoleIndex,
- &prP2pRoleFsmInfo->rConnReqInfo,
- prJoinInfo->aucIEBuf,
- prJoinInfo->u4BufLength,
- prStaRec->u2StatusCode,
- WLAN_STATUS_MEDIA_DISCONNECT);
-#else
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
- prP2pRoleFsmInfo->ucRoleIndex,
- &prP2pRoleFsmInfo->rConnReqInfo,
- prJoinInfo->aucIEBuf,
- prJoinInfo->u4BufLength,
- prStaRec->u2StatusCode);
-#endif
-
- }
-
- }
- }
-
- if (prP2pRoleFsmInfo->eCurrentState == P2P_ROLE_STATE_GC_JOIN) {
- /* Return to IDLE state. */
- p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
- }
} else {
- ASSERT(FALSE);
- break;
+ /* Join Fail */
+ /* 4 <2.1> Redo JOIN process with other Auth Type if possible */
+ if (p2pFuncRetryJOIN(prAdapter, prStaRec, prJoinInfo) == FALSE) {
+ P_BSS_DESC_T prBssDesc;
+
+ /* Increase Failure Count */
+ prStaRec->ucJoinFailureCount++;
+
+ prBssDesc = prJoinInfo->prTargetBssDesc;
+
+ ASSERT(prBssDesc);
+ ASSERT(prBssDesc->fgIsConnecting);
+
+ prBssDesc->fgIsConnecting = FALSE;
+
+#if CFG_WPS_DISCONNECT || (KERNEL_VERSION(4, 4, 0) <= CFG80211_VERSION_CODE)
+ kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
+ prP2pRoleFsmInfo->ucRoleIndex,
+ &prP2pRoleFsmInfo->rConnReqInfo,
+ prJoinInfo->aucIEBuf,
+ prJoinInfo->u4BufLength,
+ prStaRec->u2StatusCode,
+ WLAN_STATUS_MEDIA_DISCONNECT);
+#else
+ kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
+ prP2pRoleFsmInfo->ucRoleIndex,
+ &prP2pRoleFsmInfo->rConnReqInfo,
+ prJoinInfo->aucIEBuf,
+ prJoinInfo->u4BufLength,
+ prStaRec->u2StatusCode);
+#endif
+
+ }
+
}
+ }
- } while (FALSE);
+ if (prP2pRoleFsmInfo->eCurrentState == P2P_ROLE_STATE_GC_JOIN) {
+ /* Return to IDLE state. */
+ p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
+ }
+error:
if (prAssocRspSwRfb)
nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
-
- return;
-
+ cnmMemFree(prAdapter, prMsgHdr);
} /* p2pRoleFsmRunEventJoinComplete */
VOID p2pRoleFsmRunEventScanRequest(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
@@ -1839,78 +1843,76 @@
P_P2P_SSID_STRUCT_T prP2pSsidStruct = (P_P2P_SSID_STRUCT_T) NULL;
P_BSS_INFO_T prP2pBssInfo = NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) prMsgHdr;
+ prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) prMsgHdr;
- prP2pBssInfo = prAdapter->aprBssInfo[prP2pScanReqMsg->ucBssIdx];
+ prP2pBssInfo = prAdapter->aprBssInfo[prP2pScanReqMsg->ucBssIdx];
- prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prP2pBssInfo->u4PrivateData);
+ prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prP2pBssInfo->u4PrivateData);
- if (prP2pRoleFsmInfo == NULL)
- break;
+ if (!prP2pRoleFsmInfo) {
+ DBGLOG(P2P, ERROR, "prP2pRoleFsmInfo is NULL!");
+ goto error;
+ }
- prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) prMsgHdr;
- prScanReqInfo = &(prP2pRoleFsmInfo->rScanReqInfo);
+ prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) prMsgHdr;
+ prScanReqInfo = &(prP2pRoleFsmInfo->rScanReqInfo);
- DBGLOG(P2P, TRACE, "p2pDevFsmRunEventScanRequest\n");
+ DBGLOG(P2P, TRACE, "p2pDevFsmRunEventScanRequest\n");
- /* Do we need to be in IDLE state? */
- /* p2pDevFsmRunEventAbort(prAdapter, prP2pDevFsmInfo); */
+ /* Do we need to be in IDLE state? */
+ /* p2pDevFsmRunEventAbort(prAdapter, prP2pDevFsmInfo); */
- ASSERT(prScanReqInfo->fgIsScanRequest == FALSE);
+ ASSERT(prScanReqInfo->fgIsScanRequest == FALSE);
- prScanReqInfo->fgIsAbort = TRUE;
- prScanReqInfo->eScanType = prP2pScanReqMsg->eScanType;
+ prScanReqInfo->fgIsAbort = TRUE;
+ prScanReqInfo->eScanType = prP2pScanReqMsg->eScanType;
- if (prP2pScanReqMsg->u4NumChannel) {
- prScanReqInfo->eChannelSet = SCAN_CHANNEL_SPECIFIED;
+ if (prP2pScanReqMsg->u4NumChannel) {
+ prScanReqInfo->eChannelSet = SCAN_CHANNEL_SPECIFIED;
- /* Channel List */
- prScanReqInfo->ucNumChannelList = prP2pScanReqMsg->u4NumChannel;
- DBGLOG(P2P, TRACE, "Scan Request Channel List Number: %d\n", prScanReqInfo->ucNumChannelList);
- if (prScanReqInfo->ucNumChannelList > MAXIMUM_OPERATION_CHANNEL_LIST) {
- DBGLOG(P2P, TRACE,
- "Channel List Number Overloaded: %d, change to: %d\n",
- prScanReqInfo->ucNumChannelList, MAXIMUM_OPERATION_CHANNEL_LIST);
- prScanReqInfo->ucNumChannelList = MAXIMUM_OPERATION_CHANNEL_LIST;
- }
-
- u4ChnlListSize = sizeof(RF_CHANNEL_INFO_T) * prScanReqInfo->ucNumChannelList;
- kalMemCopy(prScanReqInfo->arScanChannelList,
- prP2pScanReqMsg->arChannelListInfo, u4ChnlListSize);
- } else {
- /* If channel number is ZERO.
- * It means do a FULL channel scan.
- */
- prScanReqInfo->eChannelSet = SCAN_CHANNEL_FULL;
+ /* Channel List */
+ prScanReqInfo->ucNumChannelList = prP2pScanReqMsg->u4NumChannel;
+ DBGLOG(P2P, TRACE, "Scan Request Channel List Number: %d\n", prScanReqInfo->ucNumChannelList);
+ if (prScanReqInfo->ucNumChannelList > MAXIMUM_OPERATION_CHANNEL_LIST) {
+ DBGLOG(P2P, TRACE,
+ "Channel List Number Overloaded: %d, change to: %d\n",
+ prScanReqInfo->ucNumChannelList, MAXIMUM_OPERATION_CHANNEL_LIST);
+ prScanReqInfo->ucNumChannelList = MAXIMUM_OPERATION_CHANNEL_LIST;
}
- /* SSID */
- prP2pSsidStruct = prP2pScanReqMsg->prSSID;
- for (prScanReqInfo->ucSsidNum = 0;
- prScanReqInfo->ucSsidNum < prP2pScanReqMsg->i4SsidNum; prScanReqInfo->ucSsidNum++) {
+ u4ChnlListSize = sizeof(RF_CHANNEL_INFO_T) * prScanReqInfo->ucNumChannelList;
+ kalMemCopy(prScanReqInfo->arScanChannelList,
+ prP2pScanReqMsg->arChannelListInfo, u4ChnlListSize);
+ } else {
+ /* If channel number is ZERO.
+ * It means do a FULL channel scan.
+ */
+ prScanReqInfo->eChannelSet = SCAN_CHANNEL_FULL;
+ }
- kalMemCopy(prScanReqInfo->arSsidStruct[prScanReqInfo->ucSsidNum].aucSsid,
- prP2pSsidStruct->aucSsid, prP2pSsidStruct->ucSsidLen);
+ /* SSID */
+ prP2pSsidStruct = prP2pScanReqMsg->prSSID;
+ for (prScanReqInfo->ucSsidNum = 0;
+ prScanReqInfo->ucSsidNum < prP2pScanReqMsg->i4SsidNum; prScanReqInfo->ucSsidNum++) {
- prScanReqInfo->arSsidStruct[prScanReqInfo->ucSsidNum].ucSsidLen = prP2pSsidStruct->ucSsidLen;
+ kalMemCopy(prScanReqInfo->arSsidStruct[prScanReqInfo->ucSsidNum].aucSsid,
+ prP2pSsidStruct->aucSsid, prP2pSsidStruct->ucSsidLen);
- prP2pSsidStruct++;
- }
+ prScanReqInfo->arSsidStruct[prScanReqInfo->ucSsidNum].ucSsidLen = prP2pSsidStruct->ucSsidLen;
- /* IE Buffer */
- kalMemCopy(prScanReqInfo->aucIEBuf, prP2pScanReqMsg->pucIEBuf, prP2pScanReqMsg->u4IELen);
+ prP2pSsidStruct++;
+ }
- prScanReqInfo->u4BufLength = prP2pScanReqMsg->u4IELen;
+ /* IE Buffer */
+ kalMemCopy(prScanReqInfo->aucIEBuf, prP2pScanReqMsg->pucIEBuf, prP2pScanReqMsg->u4IELen);
- p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_SCAN);
+ prScanReqInfo->u4BufLength = prP2pScanReqMsg->u4IELen;
- } while (FALSE);
+ p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_SCAN);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
+error:
+ cnmMemFree(prAdapter, prMsgHdr);
} /* p2pDevFsmRunEventScanRequest */
VOID
@@ -1926,93 +1928,94 @@
#if CFG_SUPPORT_DBDC
CNM_DBDC_CAP_T rDbdcCap;
#endif /*CFG_SUPPORT_DBDC*/
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL) && (prP2pRoleFsmInfo != NULL));
- DBGLOG(P2P, TRACE, "P2P Role Scan Done Event\n");
+ if (prP2pRoleFsmInfo != NULL) {
+ DBGLOG(P2P, TRACE, "prP2pRoleFsmInfo is NULL\n");
+ goto error;
+ }
- prScanReqInfo = &(prP2pRoleFsmInfo->rScanReqInfo);
- prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) prMsgHdr;
+ DBGLOG(P2P, TRACE, "P2P Role Scan Done Event\n");
- if (prScanDoneMsg->ucSeqNum != prScanReqInfo->ucSeqNumOfScnMsg) {
- /* Scan Done message sequence number mismatch.
- * Ignore this event. (P2P FSM issue two scan events.)
- */
- /* The scan request has been cancelled.
- * Ignore this message. It is possible.
- */
- DBGLOG(P2P, TRACE,
- "P2P Role Scan Don SeqNum Received:%d <-> P2P Role Fsm SCAN Seq Issued:%d\n",
- prScanDoneMsg->ucSeqNum, prScanReqInfo->ucSeqNumOfScnMsg);
+ prScanReqInfo = &(prP2pRoleFsmInfo->rScanReqInfo);
+ prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) prMsgHdr;
- break;
- }
+ if (prScanDoneMsg->ucSeqNum != prScanReqInfo->ucSeqNumOfScnMsg) {
+ /* Scan Done message sequence number mismatch.
+ * Ignore this event. (P2P FSM issue two scan events.)
+ */
+ /* The scan request has been cancelled.
+ * Ignore this message. It is possible.
+ */
+ DBGLOG(P2P, TRACE,
+ "P2P Role Scan Don SeqNum Received:%d <-> P2P Role Fsm SCAN Seq Issued:%d\n",
+ prScanDoneMsg->ucSeqNum, prScanReqInfo->ucSeqNumOfScnMsg);
- switch (prP2pRoleFsmInfo->eCurrentState) {
- case P2P_ROLE_STATE_SCAN:
- prScanReqInfo->fgIsAbort = FALSE;
+ goto error;
+ }
- if (prConnReqInfo->eConnRequest == P2P_CONNECTION_TYPE_GC) {
+ switch (prP2pRoleFsmInfo->eCurrentState) {
+ case P2P_ROLE_STATE_SCAN:
+ prScanReqInfo->fgIsAbort = FALSE;
- prP2pJoinInfo->prTargetBssDesc =
- p2pFuncKeepOnConnection(prAdapter,
- prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex],
- prConnReqInfo,
- &prP2pRoleFsmInfo->rChnlReqInfo,
- &prP2pRoleFsmInfo->rScanReqInfo);
- if ((prP2pJoinInfo->prTargetBssDesc) == NULL) {
- eNextState = P2P_ROLE_STATE_SCAN;
- } else {
- prP2pBssInfo = prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex];
- if (!prP2pBssInfo)
- break;
- prChnlReqInfo = &(prP2pRoleFsmInfo->rChnlReqInfo);
- if (!prChnlReqInfo)
- break;
-#if CFG_SUPPORT_DBDC
- cnmDbdcEnableDecision(prAdapter,
- prP2pRoleFsmInfo->ucBssIndex,
- prChnlReqInfo->eBand);
- cnmGetDbdcCapability(prAdapter,
- prP2pRoleFsmInfo->ucBssIndex,
- prChnlReqInfo->eBand,
- prChnlReqInfo->ucReqChnlNum,
- wlanGetSupportNss(prAdapter, prP2pRoleFsmInfo->ucBssIndex),
- &rDbdcCap);
+ if (prConnReqInfo->eConnRequest == P2P_CONNECTION_TYPE_GC) {
- DBGLOG(P2P, INFO,
- "p2pRoleFsmRunEventScanDone: start GC at CH %u, NSS=%u.\n",
- prChnlReqInfo->ucReqChnlNum,
- rDbdcCap.ucNss);
-
- prP2pBssInfo->eDBDCBand = ENUM_BAND_AUTO;
- prP2pBssInfo->ucNss = rDbdcCap.ucNss;
- prP2pBssInfo->ucWmmQueSet = rDbdcCap.ucWmmSetIndex;
-#endif
- /* For GC join. */
- eNextState = P2P_ROLE_STATE_REQING_CHANNEL;
- }
+ prP2pJoinInfo->prTargetBssDesc =
+ p2pFuncKeepOnConnection(prAdapter,
+ prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex],
+ prConnReqInfo,
+ &prP2pRoleFsmInfo->rChnlReqInfo,
+ &prP2pRoleFsmInfo->rScanReqInfo);
+ if ((prP2pJoinInfo->prTargetBssDesc) == NULL) {
+ eNextState = P2P_ROLE_STATE_SCAN;
} else {
- eNextState = P2P_ROLE_STATE_IDLE;
+ prP2pBssInfo = prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex];
+ if (!prP2pBssInfo)
+ break;
+ prChnlReqInfo = &(prP2pRoleFsmInfo->rChnlReqInfo);
+ if (!prChnlReqInfo)
+ break;
+#if CFG_SUPPORT_DBDC
+ cnmDbdcEnableDecision(prAdapter,
+ prP2pRoleFsmInfo->ucBssIndex,
+ prChnlReqInfo->eBand);
+ cnmGetDbdcCapability(prAdapter,
+ prP2pRoleFsmInfo->ucBssIndex,
+ prChnlReqInfo->eBand,
+ prChnlReqInfo->ucReqChnlNum,
+ wlanGetSupportNss(prAdapter, prP2pRoleFsmInfo->ucBssIndex),
+ &rDbdcCap);
+
+ DBGLOG(P2P, INFO,
+ "p2pRoleFsmRunEventScanDone: start GC at CH %u, NSS=%u.\n",
+ prChnlReqInfo->ucReqChnlNum,
+ rDbdcCap.ucNss);
+
+ prP2pBssInfo->eDBDCBand = ENUM_BAND_AUTO;
+ prP2pBssInfo->ucNss = rDbdcCap.ucNss;
+ prP2pBssInfo->ucWmmQueSet = rDbdcCap.ucWmmSetIndex;
+#endif
+ /* For GC join. */
+ eNextState = P2P_ROLE_STATE_REQING_CHANNEL;
}
- break;
- case P2P_ROLE_STATE_AP_CHNL_DETECTION:
- eNextState = P2P_ROLE_STATE_REQING_CHANNEL;
- break;
- default:
- /* Unexpected channel scan done event without being chanceled. */
- ASSERT(FALSE);
- break;
+ } else {
+ eNextState = P2P_ROLE_STATE_IDLE;
}
+ break;
+ case P2P_ROLE_STATE_AP_CHNL_DETECTION:
+ eNextState = P2P_ROLE_STATE_REQING_CHANNEL;
+ break;
+ default:
+ /* Unexpected channel scan done event without being chanceled. */
+ ASSERT(FALSE);
+ break;
+ }
- prScanReqInfo->fgIsScanRequest = FALSE;
+ prScanReqInfo->fgIsScanRequest = FALSE;
- p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, eNextState);
+ p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, eNextState);
- } while (FALSE);
-
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
+error:
+ cnmMemFree(prAdapter, prMsgHdr);
} /* p2pRoleFsmRunEventScanDone */
@@ -2028,102 +2031,103 @@
#endif
UINT_8 ucTokenID = 0;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL) && (prP2pRoleFsmInfo != NULL));
- DBGLOG(P2P, TRACE, "P2P Run Event Role Channel Grant\n");
+ if (!prP2pRoleFsmInfo) {
+ DBGLOG(P2P, ERROR, "prP2pRoleFsmInfo is NULL!\n");
+ goto error;
+ }
- prMsgChGrant = (P_MSG_CH_GRANT_T) prMsgHdr;
- ucTokenID = prMsgChGrant->ucTokenID;
- prChnlReqInfo = &(prP2pRoleFsmInfo->rChnlReqInfo);
+ DBGLOG(P2P, TRACE, "P2P Run Event Role Channel Grant\n");
+
+ prMsgChGrant = (P_MSG_CH_GRANT_T) prMsgHdr;
+ ucTokenID = prMsgChGrant->ucTokenID;
+ prChnlReqInfo = &(prP2pRoleFsmInfo->rChnlReqInfo);
#if (CFG_SUPPORT_DFS_MASTER == 1)
- prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prMsgChGrant->ucBssIndex);
+ prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prMsgChGrant->ucBssIndex);
#endif
- if (prChnlReqInfo->u4MaxInterval != prMsgChGrant->u4GrantInterval) {
- DBGLOG(P2P, WARN,
- "P2P Role:%d Request Channel Interval:%d, Grant Interval:%d\n",
- prP2pRoleFsmInfo->ucRoleIndex, prChnlReqInfo->u4MaxInterval,
- prMsgChGrant->u4GrantInterval);
- prChnlReqInfo->u4MaxInterval = prMsgChGrant->u4GrantInterval;
- }
+ if (prChnlReqInfo->u4MaxInterval != prMsgChGrant->u4GrantInterval) {
+ DBGLOG(P2P, WARN,
+ "P2P Role:%d Request Channel Interval:%d, Grant Interval:%d\n",
+ prP2pRoleFsmInfo->ucRoleIndex, prChnlReqInfo->u4MaxInterval,
+ prMsgChGrant->u4GrantInterval);
+ prChnlReqInfo->u4MaxInterval = prMsgChGrant->u4GrantInterval;
+ }
- if (ucTokenID == prChnlReqInfo->ucSeqNumOfChReq) {
- ENUM_P2P_ROLE_STATE_T eNextState = P2P_ROLE_STATE_NUM;
+ if (ucTokenID == prChnlReqInfo->ucSeqNumOfChReq) {
+ ENUM_P2P_ROLE_STATE_T eNextState = P2P_ROLE_STATE_NUM;
- switch (prP2pRoleFsmInfo->eCurrentState) {
- case P2P_ROLE_STATE_REQING_CHANNEL:
- switch (prChnlReqInfo->eChnlReqType) {
- case CH_REQ_TYPE_JOIN:
- eNextState = P2P_ROLE_STATE_GC_JOIN;
- break;
- case CH_REQ_TYPE_GO_START_BSS:
- eNextState = P2P_ROLE_STATE_IDLE;
- break;
- default:
- DBGLOG(P2P, WARN,
- "p2pRoleFsmRunEventChnlGrant: Invalid Channel Request Type:%d\n",
- prChnlReqInfo->eChnlReqType);
- ASSERT(FALSE);
- break;
- }
-
- p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, eNextState);
+ switch (prP2pRoleFsmInfo->eCurrentState) {
+ case P2P_ROLE_STATE_REQING_CHANNEL:
+ switch (prChnlReqInfo->eChnlReqType) {
+ case CH_REQ_TYPE_JOIN:
+ eNextState = P2P_ROLE_STATE_GC_JOIN;
break;
-
-#if (CFG_SUPPORT_DFS_MASTER == 1)
- case P2P_ROLE_STATE_DFS_CAC:
- p2pFuncStartRdd(prAdapter, prMsgChGrant->ucBssIndex);
-
- if (p2pFuncCheckWeatherRadarBand(prChnlReqInfo))
- u4CacTimeMs = P2P_AP_CAC_WEATHER_CHNL_HOLD_TIME_MS;
- else
- u4CacTimeMs = prP2pRoleFsmInfo->rChnlReqInfo.u4MaxInterval;
-
- if (p2pFuncIsManualCac())
- u4CacTimeMs = p2pFuncGetDriverCacTime() * 1000;
- else
- p2pFuncSetDriverCacTime(u4CacTimeMs/1000);
-
- cnmTimerStartTimer(prAdapter, &(prP2pRoleFsmInfo->rP2pRoleFsmTimeoutTimer),
- u4CacTimeMs);
-
- p2pFuncRecordCacStartBootTime();
-
- p2pFuncSetDfsState(DFS_STATE_CHECKING);
-
- DBGLOG(P2P, INFO, "p2pRoleFsmRunEventChnlGrant: CAC time = %ds\n",
- u4CacTimeMs/1000);
+ case CH_REQ_TYPE_GO_START_BSS:
+ eNextState = P2P_ROLE_STATE_IDLE;
break;
- case P2P_ROLE_STATE_SWITCH_CHANNEL:
- p2pFuncDfsSwitchCh(prAdapter, prP2pBssInfo, prP2pRoleFsmInfo->rChnlReqInfo);
- p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
- break;
-#endif
default:
- /* Channel is granted under unexpected state.
- * Driver should cancel channel privileagea before leaving the states.
- */
- if (IS_BSS_ACTIVE(prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex])) {
- DBGLOG(P2P, WARN,
- "p2pRoleFsmRunEventChnlGrant: Invalid CurrentState:%d\n",
- prP2pRoleFsmInfo->eCurrentState);
- ASSERT(FALSE);
- }
+ DBGLOG(P2P, WARN,
+ "p2pRoleFsmRunEventChnlGrant: Invalid Channel Request Type:%d\n",
+ prChnlReqInfo->eChnlReqType);
+ ASSERT(FALSE);
break;
}
- } else {
- /* Channel requsted, but released. */
- ASSERT(!prChnlReqInfo->fgIsChannelRequested);
+
+ p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, eNextState);
+ break;
+
+#if (CFG_SUPPORT_DFS_MASTER == 1)
+ case P2P_ROLE_STATE_DFS_CAC:
+ p2pFuncStartRdd(prAdapter, prMsgChGrant->ucBssIndex);
+
+ if (p2pFuncCheckWeatherRadarBand(prChnlReqInfo))
+ u4CacTimeMs = P2P_AP_CAC_WEATHER_CHNL_HOLD_TIME_MS;
+ else
+ u4CacTimeMs = prP2pRoleFsmInfo->rChnlReqInfo.u4MaxInterval;
+
+ if (p2pFuncIsManualCac())
+ u4CacTimeMs = p2pFuncGetDriverCacTime() * 1000;
+ else
+ p2pFuncSetDriverCacTime(u4CacTimeMs/1000);
+
+ cnmTimerStartTimer(prAdapter, &(prP2pRoleFsmInfo->rP2pRoleFsmTimeoutTimer),
+ u4CacTimeMs);
+
+ p2pFuncRecordCacStartBootTime();
+
+ p2pFuncSetDfsState(DFS_STATE_CHECKING);
+
+ DBGLOG(P2P, INFO, "p2pRoleFsmRunEventChnlGrant: CAC time = %ds\n",
+ u4CacTimeMs/1000);
+ break;
+ case P2P_ROLE_STATE_SWITCH_CHANNEL:
+ p2pFuncDfsSwitchCh(prAdapter, prP2pBssInfo, prP2pRoleFsmInfo->rChnlReqInfo);
+ p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
+ break;
+#endif
+ default:
+ /* Channel is granted under unexpected state.
+ * Driver should cancel channel privileagea before leaving the states.
+ */
+ if (IS_BSS_ACTIVE(prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex])) {
+ DBGLOG(P2P, WARN,
+ "p2pRoleFsmRunEventChnlGrant: Invalid CurrentState:%d\n",
+ prP2pRoleFsmInfo->eCurrentState);
+ ASSERT(FALSE);
+ }
+ break;
}
+ } else {
+ /* Channel requsted, but released. */
+ ASSERT(!prChnlReqInfo->fgIsChannelRequested);
+ if (prChnlReqInfo->fgIsChannelRequested)
+ DBGLOG(P2P, ERROR,
+ "fgIsChannelRequested is TRUE!Channel was requested, but released!\n");
+ }
- } while (FALSE);
-
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
-
- return;
-
+error:
+ cnmMemFree(prAdapter, prMsgHdr);
} /* p2pRoleFsmRunEventChnlGrant */
/* ////////////////////////////////////// */