/*----------------------------------------------------------------------------*/ VOID secFsmEvent4ndEapolTxDone(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prSta) { P_SEC_INFO_T prSecInfo; ENUM_SEC_STATE_T eNextState; BOOLEAN fgIsTransition = (BOOLEAN) FALSE; P_CMD_802_11_KEY prStoredKey; DEBUGFUNC("secFsmRunEvent4ndEapolTx"); ASSERT(prSta); prSecInfo = &prSta->rSecInfo; eNextState = prSecInfo->eCurrentState; #if DBG DBGLOG(RSN, TRACE, (MACSTR " Sec state %s\n", MAC2STR(prSta->aucMacAddr), apucDebugSecState[prSecInfo->eCurrentState])); #else DBGLOG(RSN, TRACE, (MACSTR " Sec state [%d]\n", MAC2STR(prSta->aucMacAddr), prSecInfo->eCurrentState)); #endif switch (prSecInfo->eCurrentState) { case SEC_STATE_INITIATOR_PORT_BLOCKED: case SEC_STATE_CHECK_OK: prSecInfo->fg2nd1xSend = FALSE; if (prSecInfo->fgKeyStored) { prStoredKey = (P_CMD_802_11_KEY) prSecInfo->aucStoredKey; /* prSta = rxmLookupStaRecIndexFromTA(prStoredKey->aucPeerAddr); */ /* if (nicPrivacySetKeyEntry(prStoredKey, prSta->ucWlanIndex) == FALSE) */ /* DBGLOG(RSN, WARN, ("nicPrivacySetKeyEntry() fail,..\n")); */ /* key update */ prSecInfo->fgKeyStored = FALSE; prSta->fgTransmitKeyExist = TRUE; } if (prSecInfo->eCurrentState == SEC_STATE_INITIATOR_PORT_BLOCKED) { SEC_STATE_TRANSITION(prAdapter, prSta, INITIATOR_PORT_BLOCKED, CHECK_OK); } break; default: #if DBG DBGLOG(RSN, WARN, ("Rcv thh EAPoL Tx done at %s\n", apucDebugSecState[prSecInfo->eCurrentState])); #else DBGLOG(RSN, WARN, ("Rcv thh EAPoL Tx done at [%d]\n", prSecInfo->eCurrentState)); #endif break; } if (prSecInfo->eCurrentState != eNextState) { secFsmSteps(prAdapter, prSta, eNextState); } return; } /* secFsmRunEvent4ndEapolTx */
/*----------------------------------------------------------------------------*/ VOID secFsmEventEapolTxDone(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus) { P_SEC_INFO_T prSecInfo; ENUM_SEC_STATE_T eNextState; BOOLEAN fgIsTransition = (BOOLEAN) FALSE; P_AIS_SPECIFIC_BSS_INFO_T prAisBssInfo; DEBUGFUNC("secFsmRunEventEapolTxDone"); ASSERT(prStaRec); if (rTxDoneStatus != TX_RESULT_SUCCESS) { DBGLOG(RSN, INFO, "Error EAPoL fram fail to send!!\n"); /* ASSERT(0); */ return; } if (!IS_STA_IN_AIS(prStaRec)) { DBGLOG(RSN, INFO, "Counter Measure should occur at AIS network!!\n"); /* ASSERT(0); */ return; } prAisBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo; ASSERT(prAisBssInfo); prSecInfo = &prStaRec->rSecInfo; eNextState = prSecInfo->eCurrentState; #if DBG DBGLOG(RSN, TRACE, "%pM Sec state %s\n", prStaRec->aucMacAddr, apucDebugSecState[prSecInfo->eCurrentState]); #else DBGLOG(RSN, TRACE, "%pM Sec state [%d]\n", prStaRec->aucMacAddr, prSecInfo->eCurrentState); #endif switch (prSecInfo->eCurrentState) { case SEC_STATE_SEND_EAPOL: if (prAisBssInfo->fgCheckEAPoLTxDone == FALSE) ASSERT(0); prAisBssInfo->fgCheckEAPoLTxDone = FALSE; /* cnmTimerStopTimer(prAdapter, &prAisBssInfo->rRsnaEAPoLReportTimeoutTimer); */ SEC_STATE_TRANSITION(prAdapter, prStaRec, SEND_EAPOL, SEND_DEAUTH); break; default: break; } if (prSecInfo->eCurrentState != eNextState) secFsmSteps(prAdapter, prStaRec, eNextState); return; } /* secFsmRunEventEapolTxDone */
/*----------------------------------------------------------------------------*/ BOOLEAN secFsmEventPTKInstalled(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prSta) { P_SEC_INFO_T prSecInfo; ENUM_SEC_STATE_T eNextState; BOOLEAN fgStatus = TRUE; BOOLEAN fgIsTransition = (BOOLEAN) FALSE; ASSERT(prSta); prSecInfo = &prSta->rSecInfo; if (prSecInfo == NULL) return TRUE; /* Not PTK */ #if DBG DBGLOG(RSN, TRACE, (MACSTR " Sec state %s\n", MAC2STR(prSta->aucMacAddr), apucDebugSecState[prSecInfo->eCurrentState])); #else DBGLOG(RSN, TRACE, (MACSTR " Sec state [%d]\n", MAC2STR(prSta->aucMacAddr), prSecInfo->eCurrentState)); #endif eNextState = prSecInfo->eCurrentState; switch (prSecInfo->eCurrentState) { case SEC_STATE_INIT: /* Legacy wep, wpa-none */ break; case SEC_STATE_INITIATOR_PORT_BLOCKED: if (prSecInfo->fg2nd1xSend) { } else { SEC_STATE_TRANSITION(prAdapter, prSta, INITIATOR_PORT_BLOCKED, CHECK_OK); } break; case SEC_STATE_RESPONDER_PORT_BLOCKED: SEC_STATE_TRANSITION(prAdapter, prSta, RESPONDER_PORT_BLOCKED, CHECK_OK); break; case SEC_STATE_CHECK_OK: break; default: fgStatus = FALSE; break; } if (prSecInfo->eCurrentState != eNextState) { secFsmSteps(prAdapter, prSta, eNextState); } return fgStatus; } /* end of secFsmRunEventPTKInstalled() */
/*----------------------------------------------------------------------------*/ VOID secFsmEventStartCounterMeasure(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prSta) { P_SEC_INFO_T prSecInfo; ENUM_SEC_STATE_T eNextState; BOOLEAN fgIsTransition = (BOOLEAN) FALSE; DEBUGFUNC("secFsmRunEventStartCounterMeasure"); ASSERT(prSta); if (!IS_STA_IN_AIS(prSta)) { DBGLOG(RSN, INFO, ("Counter Measure should occur at AIS network!!\n")); /* ASSERT(0); */ return; } prSecInfo = &prSta->rSecInfo; eNextState = prSecInfo->eCurrentState; #if DBG DBGLOG(RSN, TRACE, (MACSTR " Sec state %s\n", MAC2STR(prSta->aucMacAddr), apucDebugSecState[prSecInfo->eCurrentState])); #else DBGLOG(RSN, TRACE, (MACSTR " Sec state [%d]\n", MAC2STR(prSta->aucMacAddr), prSecInfo->eCurrentState)); #endif prAdapter->rWifiVar.rAisSpecificBssInfo.u4RsnaLastMICFailTime = 0; switch (prSecInfo->eCurrentState) { case SEC_STATE_CHECK_OK: { prAdapter->rWifiVar.rAisSpecificBssInfo.fgCounterMeasure = TRUE; /* <Todo> dls port control */ SEC_STATE_TRANSITION(prAdapter, prSta, CHECK_OK, SEND_EAPOL); } break; default: break; } /* Call arbFsmSteps() when we are going to change ARB STATE */ if (prSecInfo->eCurrentState != eNextState) { secFsmSteps(prAdapter, prSta, eNextState); } return; } /* secFsmRunEventStartCounterMeasure */
/*----------------------------------------------------------------------------*/ VOID secFsmEventEndOfCounterMeasure(IN P_ADAPTER_T prAdapter, UINT_32 u4Parm) { P_STA_RECORD_T prSta; P_SEC_INFO_T prSecInfo; ENUM_SEC_STATE_T eNextState; BOOLEAN fgIsTransition = (BOOLEAN) FALSE; DEBUGFUNC("secFsmRunEventEndOfCounterMeasure"); prSta = (P_STA_RECORD_T) u4Parm; ASSERT(prSta); if (!IS_STA_IN_AIS(prSta)) { DBGLOG(RSN, INFO, ("Counter Measure should occur at AIS network!!\n")); /* ASSERT(0); */ return; } prSecInfo = &prSta->rSecInfo; eNextState = prSecInfo->eCurrentState; #if DBG DBGLOG(RSN, TRACE, (MACSTR " Sec state %s\n", MAC2STR(prSta->aucMacAddr), apucDebugSecState[prSecInfo->eCurrentState])); #else DBGLOG(RSN, TRACE, (MACSTR " Sec state [%d]\n", MAC2STR(prSta->aucMacAddr), prSecInfo->eCurrentState)); #endif switch (prSecInfo->eCurrentState) { case SEC_STATE_SEND_DEAUTH: { prAdapter->rWifiVar.rAisSpecificBssInfo.fgCounterMeasure = FALSE; SEC_STATE_TRANSITION(prAdapter, prSta, COUNTERMEASURE, INIT); } break; default: ASSERT(0); } /* Call arbFsmSteps() when we are going to change ARB STATE */ if (prSecInfo->eCurrentState != eNextState) { secFsmSteps(prAdapter, prSta, eNextState); } return; } /* end of secFsmRunEventEndOfCounterMeasure */
/*----------------------------------------------------------------------------*/ VOID secFsmEvent2ndEapolTx(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prSta) { P_SEC_INFO_T prSecInfo; ENUM_SEC_STATE_T eNextState; /* BOOLEAN fgIsTransition = (BOOLEAN)FALSE; */ DEBUGFUNC("secFsmRunEvent2ndEapolTx"); ASSERT(prSta); prSecInfo = &prSta->rSecInfo; eNextState = prSecInfo->eCurrentState; #if DBG DBGLOG(RSN, TRACE, (MACSTR " Sec state %s\n", MAC2STR(prSta->aucMacAddr), apucDebugSecState[prSecInfo->eCurrentState])); #else DBGLOG(RSN, TRACE, (MACSTR " Sec state [%d]\n", MAC2STR(prSta->aucMacAddr), prSecInfo->eCurrentState)); #endif switch (prSecInfo->eCurrentState) { case SEC_STATE_INITIATOR_PORT_BLOCKED: case SEC_STATE_CHECK_OK: prSecInfo->fg2nd1xSend = TRUE; break; default: #if DBG DBGLOG(RSN, WARN, ("Rcv 2nd EAPoL at %s\n", apucDebugSecState[prSecInfo->eCurrentState])); #else DBGLOG(RSN, WARN, ("Rcv 2nd EAPoL at [%d]\n", prSecInfo->eCurrentState)); #endif break; } if (prSecInfo->eCurrentState != eNextState) { secFsmSteps(prAdapter, prSta, eNextState); } return; } /* secFsmRunEvent2ndEapolTx */
/*----------------------------------------------------------------------------*/ VOID secFsmEventStart(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prSta) { P_SEC_INFO_T prSecInfo; BOOLEAN fgIsTransition = (BOOLEAN) FALSE; ENUM_SEC_STATE_T eNextState; DBGLOG(RSN, TRACE, "secFsmRunEventStart\n"); ASSERT(prSta); if (!prSta) return; if (!IS_STA_IN_AIS(prSta)) return; DBGLOG(RSN, TRACE, "secFsmRunEventStart for sta %pM network %d\n", prSta->aucMacAddr, prSta->ucNetTypeIndex); prSecInfo = (P_SEC_INFO_T) &prSta->rSecInfo; eNextState = prSecInfo->eCurrentState; secSetPortBlocked(prAdapter, prSta, TRUE); /* prSta->fgTransmitKeyExist = FALSE; */ /* whsu:: nicPrivacySetStaDefaultWTIdx(prSta); */ #if 1 /* Since the 1x and key can set to firmware in order, always enter the check ok state */ SEC_STATE_TRANSITION(prAdapter, prSta, INIT, CHECK_OK); #else if (IS_STA_IN_AIS(prSta->eStaType)) { if (secRsnKeyHandshakeEnabled(prAdapter) == TRUE #if CFG_SUPPORT_WAPI || (prAdapter->rWifiVar.rConnSettings.fgWapiMode) #endif ) { prSta->fgTransmitKeyExist = FALSE; /* nicPrivacyInitialize(prSta->ucNetTypeIndex); */ SEC_STATE_TRANSITION(prAdapter, prSta, INIT, INITIATOR_PORT_BLOCKED); } else { SEC_STATE_TRANSITION(prAdapter, prSta, INIT, CHECK_OK); } } #if CFG_ENABLE_WIFI_DIRECT || CFG_ENABLE_BT_OVER_WIFI #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_BT_OVER_WIFI else if ((prSta->eStaType == STA_TYPE_BOW_CLIENT) || (prSta->eStaType == STA_TYPE_P2P_GC)) { #elif CFG_ENABLE_WIFI_DIRECT else if (prSta->eStaType == STA_TYPE_P2P_GC) { #elif CFG_ENABLE_BT_OVER_WIFI else if (prSta->eStaType == STA_TYPE_BOW_CLIENT) { #endif SEC_STATE_TRANSITION(prAdapter, prSta, INIT, RESPONDER_PORT_BLOCKED); } #endif else SEC_STATE_TRANSITION(prAdapter, prSta, INIT, INITIATOR_PORT_BLOCKED); #endif if (prSecInfo->eCurrentState != eNextState) secFsmSteps(prAdapter, prSta, eNextState); return; } /* secFsmRunEventStart */ /*----------------------------------------------------------------------------*/ /*! * \brief This function called by reset procedure to force the sec fsm enter * idle state * * \param[in] ucNetTypeIdx The Specific Network type index * \param[in] prSta Pointer to the Sta record * * \return none */ /*----------------------------------------------------------------------------*/ VOID secFsmEventAbort(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prSta) { P_SEC_INFO_T prSecInfo; DBGLOG(RSN, TRACE, "secFsmEventAbort for sta %pM network %d\n", prSta->aucMacAddr, prSta->ucNetTypeIndex); ASSERT(prSta); if (!prSta) return; if (!IS_STA_IN_AIS(prSta)) return; prSecInfo = (P_SEC_INFO_T) &prSta->rSecInfo; prSta->fgTransmitKeyExist = FALSE; secSetPortBlocked(prAdapter, prSta, TRUE); if (prSecInfo == NULL) return; if (IS_STA_IN_AIS(prSta)) { prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist = FALSE; if (prSecInfo->eCurrentState == SEC_STATE_SEND_EAPOL) { if (prAdapter->rWifiVar.rAisSpecificBssInfo.fgCheckEAPoLTxDone == FALSE) { DBGLOG(RSN, TRACE, "EAPOL STATE not match the flag\n"); /* cnmTimerStopTimer(prAdapter, &prAdapter->rWifiVar. * rAisSpecificBssInfo.rRsnaEAPoLReportTimeoutTimer); */ } } } prSecInfo->eCurrentState = SEC_STATE_INIT; } /*----------------------------------------------------------------------------*/ /*! * \brief This function will indicate an Event of "2nd EAPoL Tx is sending" to Sec FSM. * * \param[in] prSta Pointer to the Sta record * * \return - */ /*----------------------------------------------------------------------------*/ VOID secFsmEvent2ndEapolTx(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prSta) { P_SEC_INFO_T prSecInfo; ENUM_SEC_STATE_T eNextState; /* BOOLEAN fgIsTransition = (BOOLEAN)FALSE; */ DEBUGFUNC("secFsmRunEvent2ndEapolTx"); ASSERT(prSta); prSecInfo = &prSta->rSecInfo; eNextState = prSecInfo->eCurrentState; #if DBG DBGLOG(RSN, TRACE, "%pM Sec state %s\n", prSta->aucMacAddr, apucDebugSecState[prSecInfo->eCurrentState]); #else DBGLOG(RSN, TRACE, "%pM Sec state [%d]\n", prSta->aucMacAddr, prSecInfo->eCurrentState); #endif switch (prSecInfo->eCurrentState) { case SEC_STATE_INITIATOR_PORT_BLOCKED: case SEC_STATE_CHECK_OK: prSecInfo->fg2nd1xSend = TRUE; break; default: #if DBG DBGLOG(RSN, WARN, "Rcv 2nd EAPoL at %s\n", apucDebugSecState[prSecInfo->eCurrentState]); #else DBGLOG(RSN, WARN, "Rcv 2nd EAPoL at [%d]\n", prSecInfo->eCurrentState); #endif break; } if (prSecInfo->eCurrentState != eNextState) secFsmSteps(prAdapter, prSta, eNextState); return; } /* secFsmRunEvent2ndEapolTx */
/*----------------------------------------------------------------------------*/ VOID secFsmEventStart(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prSta) { P_SEC_INFO_T prSecInfo; BOOLEAN fgIsTransition = (BOOLEAN) FALSE; ENUM_SEC_STATE_T eNextState; DBGLOG(RSN, TRACE, ("secFsmRunEventStart\n")); ASSERT(prSta); if (!prSta) return; if (!IS_STA_IN_AIS(prSta)) return; DBGLOG(RSN, TRACE, ("secFsmRunEventStart for sta " MACSTR " bss %d\n", MAC2STR(prSta->aucMacAddr), prSta->ucBssIndex)); prSecInfo = (P_SEC_INFO_T) &prSta->rSecInfo; eNextState = prSecInfo->eCurrentState; secSetPortBlocked(prAdapter, prSta, TRUE); /* prSta->fgTransmitKeyExist = FALSE; */ /* whsu:: nicPrivacySetStaDefaultWTIdx(prSta); */ #if 1 /* Since the 1x and key can set to firmware in order, always enter the check ok state */ SEC_STATE_TRANSITION(prAdapter, prSta, INIT, CHECK_OK); #else if (IS_STA_IN_AIS(prSta->eStaType)) { if (secRsnKeyHandshakeEnabled(prAdapter) == TRUE #if CFG_SUPPORT_WAPI || (prAdapter->rWifiVar.rConnSettings.fgWapiMode) #endif ) { prSta->fgTransmitKeyExist = FALSE; /* nicPrivacyInitialize(prSta->ucNetTypeIndex); */ SEC_STATE_TRANSITION(prAdapter, prSta, INIT, INITIATOR_PORT_BLOCKED); } else { SEC_STATE_TRANSITION(prAdapter, prSta, INIT, CHECK_OK); } } #if CFG_ENABLE_WIFI_DIRECT || CFG_ENABLE_BT_OVER_WIFI #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_BT_OVER_WIFI else if ((prSta->eStaType == STA_TYPE_BOW_CLIENT) || (prSta->eStaType == STA_TYPE_P2P_GC)) #elif CFG_ENABLE_WIFI_DIRECT else if (prSta->eStaType == STA_TYPE_P2P_GC) #elif CFG_ENABLE_BT_OVER_WIFI else if (prSta->eStaType == STA_TYPE_BOW_CLIENT) #endif { SEC_STATE_TRANSITION(prAdapter, prSta, INIT, RESPONDER_PORT_BLOCKED); } #endif else { SEC_STATE_TRANSITION(prAdapter, prSta, INIT, INITIATOR_PORT_BLOCKED); } #endif if (prSecInfo->eCurrentState != eNextState) { secFsmSteps(prAdapter, prSta, eNextState); } return; } /* secFsmRunEventStart */