Beispiel #1
0
/*----------------------------------------------------------------------------*/
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() */
Beispiel #2
0
/*----------------------------------------------------------------------------*/
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 */
Beispiel #3
0
/*----------------------------------------------------------------------------*/
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 */
Beispiel #4
0
/*----------------------------------------------------------------------------*/
VOID
secFsmEventDeauthTxDone(IN P_ADAPTER_T prAdapter,
			IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus)
{
	P_STA_RECORD_T prStaRec;
	P_SEC_INFO_T prSecInfo;
	ENUM_SEC_STATE_T eNextState;
	BOOLEAN fgIsTransition = (BOOLEAN) FALSE;

	DEBUGFUNC("secFsmRunEventDeauthTxDone");

	ASSERT(prMsduInfo);

	prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);

	ASSERT(prStaRec);

	if (!prStaRec)
		return;

	if (!IS_STA_IN_AIS(prStaRec)) {
		DBGLOG(RSN, INFO, ("Counter Measure should occur at AIS network!!\n"));
		/* ASSERT(0); */
		return;
	}

	prSecInfo = (P_SEC_INFO_T) &prStaRec->rSecInfo;

#if DBG
	DBGLOG(RSN, TRACE, (MACSTR " Sec state %s\n", MAC2STR(prStaRec->aucMacAddr),
			    apucDebugSecState[prSecInfo->eCurrentState]));
#else
	DBGLOG(RSN, TRACE,
	       (MACSTR " Sec state [%d]\n", MAC2STR(prStaRec->aucMacAddr),
		prSecInfo->eCurrentState));
#endif

	switch (prSecInfo->eCurrentState) {
	case SEC_STATE_SEND_DEAUTH:

		DBGLOG(RSN, TRACE, ("Set timer %d\n", COUNTER_MEASURE_TIMEOUT_INTERVAL_SEC));

		SEC_STATE_TRANSITION(prAdapter, prStaRec, SEND_DEAUTH, COUNTERMEASURE);

		break;

	default:
		ASSERT(0);
		break;
	}

	return;
}				/* secFsmRunEventDeauthTxDone */
Beispiel #5
0
/*----------------------------------------------------------------------------*/
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 */
Beispiel #6
0
/*----------------------------------------------------------------------------*/
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 */
Beispiel #7
0
/*----------------------------------------------------------------------------*/
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 */
Beispiel #8
0
/*----------------------------------------------------------------------------*/
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 */