/*----------------------------------------------------------------------------*/ BOOLEAN cnmPreferredChannel(P_ADAPTER_T prAdapter, P_ENUM_BAND_T prBand, PUINT_8 pucPrimaryChannel, P_ENUM_CHNL_EXT_T prBssSCO) { P_BSS_INFO_T prBssInfo; UINT_8 i; ASSERT(prAdapter); ASSERT(prBand); ASSERT(pucPrimaryChannel); ASSERT(prBssSCO); for (i = 0; i < BSS_INFO_NUM; i++) { prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, i); if (prBssInfo) { if (IS_BSS_AIS(prBssInfo) && RLM_NET_PARAM_VALID(prBssInfo)) { *prBand = prBssInfo->eBand; *pucPrimaryChannel = prBssInfo->ucPrimaryChannel; *prBssSCO = prBssInfo->eBssSCO; return TRUE; } } } return FALSE; }
BOOLEAN p2pDevStateInit_REQING_CHANNEL(IN P_ADAPTER_T prAdapter, IN UINT_8 ucBssIdx, IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo, OUT P_ENUM_P2P_DEV_STATE_T peNextState) { BOOLEAN fgIsTransition = FALSE; P_MSG_P2P_CHNL_REQUEST_T prP2pMsgChnlReq = (P_MSG_P2P_CHNL_REQUEST_T)NULL; P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T)NULL; do { ASSERT_BREAK((prAdapter != NULL) && (prChnlReqInfo != NULL) && (peNextState != NULL)); prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIdx); if (LINK_IS_EMPTY(&(prChnlReqInfo->rP2pChnlReqLink))) { /* NO Channel Request Pending. */ DBGLOG(P2P, ERROR, ("NO Pending Channel Request, but enter Req Channel State\n")); fgIsTransition = TRUE; *peNextState = P2P_DEV_STATE_IDLE; break; } LINK_REMOVE_HEAD(&(prChnlReqInfo->rP2pChnlReqLink), prP2pMsgChnlReq, P_MSG_P2P_CHNL_REQUEST_T); ASSERT(prP2pMsgChnlReq); prChnlReqInfo->u4MaxInterval = prP2pMsgChnlReq->u4Duration; prChnlReqInfo->ucReqChnlNum = prP2pMsgChnlReq->rChannelInfo.ucChannelNum; prChnlReqInfo->eChnlSco = prP2pMsgChnlReq->eChnlSco; prChnlReqInfo->eBand = prP2pMsgChnlReq->rChannelInfo.eBand; prChnlReqInfo->u8Cookie = prP2pMsgChnlReq->u8Cookie; prChnlReqInfo->eChnlReqType = prP2pMsgChnlReq->eChnlReqType; prChnlReqInfo->eChannelWidth = prBssInfo->ucVhtChannelWidth; prChnlReqInfo->ucCenterFreqS1 = prBssInfo->ucVhtChannelFrequencyS1; prChnlReqInfo->ucCenterFreqS2 = prBssInfo->ucVhtChannelFrequencyS2; p2pFuncAcquireCh(prAdapter, ucBssIdx, prChnlReqInfo); } while (FALSE); if (prP2pMsgChnlReq) { cnmMemFree(prAdapter, prP2pMsgChnlReq); } return fgIsTransition; } /* p2pDevStateInit_REQING_CHANNEL */
VOID kalP2PIndicateMgmtTxStatus ( IN P_GLUE_INFO_T prGlueInfo, IN P_MSDU_INFO_T prMsduInfo, IN BOOLEAN fgIsAck ) { P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL; PUINT_64 pu8GlCookie = (PUINT_64)NULL; struct net_device *prNetdevice = (struct net_device *)NULL; do { if ((prGlueInfo == NULL) || (prMsduInfo == NULL)) { DBGLOG(P2P, WARN, ("Unexpected pointer PARAM. 0x%lx, 0x%lx.\n", prGlueInfo, prMsduInfo)); ASSERT(FALSE); break; } prGlueP2pInfo = prGlueInfo->prP2PInfo; pu8GlCookie = (PUINT_64)((UINT_32)prMsduInfo->prPacket + (UINT_32)prMsduInfo->u2FrameLength + MAC_TX_RESERVED_FIELD); if (prMsduInfo->ucBssIndex == P2P_DEV_BSS_INDEX) { prNetdevice = prGlueP2pInfo->prDevHandler; } else { P_BSS_INFO_T prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prGlueInfo->prAdapter, prMsduInfo->ucBssIndex); prNetdevice = prGlueP2pInfo->aprRoleHandler[prP2pBssInfo->u4PrivateData]; } #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) cfg80211_mgmt_tx_status(&prGlueP2pInfo->wdev, //struct net_device * dev, #else cfg80211_mgmt_tx_status(prGlueP2pInfo->prDevHandler, //struct net_device * dev, #endif /* LINUX_VERSION_CODE */ *pu8GlCookie, (PUINT_8)((UINT_32)prMsduInfo->prPacket + MAC_TX_RESERVED_FIELD), prMsduInfo->u2FrameLength, fgIsAck, GFP_KERNEL); } while (FALSE); } /* kalP2PIndicateMgmtTxStatus */
/*----------------------------------------------------------------------------*/ VOID rlmRspGenerateObssScanIE(P_ADAPTER_T prAdapter, P_MSDU_INFO_T prMsduInfo) { P_BSS_INFO_T prBssInfo; P_IE_OBSS_SCAN_PARAM_T prObssScanIe; P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL; ASSERT(prAdapter); ASSERT(prMsduInfo); prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex); prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prMsduInfo->ucBssIndex); if (!prBssInfo) { return; } if (!IS_BSS_ACTIVE(prBssInfo)) { return; } if (RLM_NET_IS_11N(prBssInfo) && /* !RLM_NET_IS_BOW(prBssInfo) && FIXME. */ prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT && (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N)) && prBssInfo->eBand == BAND_2G4 && prBssInfo->eBssSCO != CHNL_EXT_SCN) { prObssScanIe = (P_IE_OBSS_SCAN_PARAM_T) (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength); /* Add 20/40 BSS coexistence IE */ prObssScanIe->ucId = ELEM_ID_OBSS_SCAN_PARAMS; prObssScanIe->ucLength = sizeof(IE_OBSS_SCAN_PARAM_T) - ELEM_HDR_LEN; prObssScanIe->u2ScanPassiveDwell = dot11OBSSScanPassiveDwell; prObssScanIe->u2ScanActiveDwell = dot11OBSSScanActiveDwell; prObssScanIe->u2TriggerScanInterval = dot11BSSWidthTriggerScanInterval; prObssScanIe->u2ScanPassiveTotalPerChnl = dot11OBSSScanPassiveTotalPerChannel; prObssScanIe->u2ScanActiveTotalPerChnl = dot11OBSSScanActiveTotalPerChannel; prObssScanIe->u2WidthTransDelayFactor = dot11BSSWidthChannelTransitionDelayFactor; prObssScanIe->u2ScanActivityThres = dot11OBSSScanActivityThreshold; ASSERT(IE_SIZE(prObssScanIe) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_OBSS_SCAN)); prMsduInfo->u2FrameLength += IE_SIZE(prObssScanIe); } }
BOOLEAN secIsProtected1xFrame(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec) { P_BSS_INFO_T prBssInfo; ASSERT(prAdapter); if (prStaRec) { prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex); if (prBssInfo && prBssInfo->eNetworkType == NETWORK_TYPE_AIS) { #if CFG_SUPPORT_WAPI if (wlanQueryWapiMode(prAdapter)) return FALSE; #endif } return prStaRec->fgTransmitKeyExist; } return FALSE; }
/*----------------------------------------------------------------------------*/ VOID rlmHandleObssStatusEventPkt(P_ADAPTER_T prAdapter, P_EVENT_AP_OBSS_STATUS_T prObssStatus) { P_BSS_INFO_T prBssInfo; ASSERT(prAdapter); ASSERT(prObssStatus); ASSERT(prObssStatus->ucBssIndex < MAX_BSS_INDEX); prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prObssStatus->ucBssIndex); if (prBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT) { return; } prBssInfo->fgObssErpProtectMode = (BOOLEAN) prObssStatus->ucObssErpProtectMode; prBssInfo->eObssHtProtectMode = (ENUM_HT_PROTECT_MODE_T) prObssStatus->ucObssHtProtectMode; prBssInfo->eObssGfOperationMode = (ENUM_GF_MODE_T) prObssStatus->ucObssGfOperationMode; prBssInfo->fgObssRifsOperationMode = (BOOLEAN) prObssStatus->ucObssRifsOperationMode; prBssInfo->fgObssBeaconForcedTo20M = (BOOLEAN) prObssStatus->ucObssBeaconForcedTo20M; /* Check if Beacon content need to be updated */ rlmUpdateParamsForAP(prAdapter, prBssInfo, TRUE); }
/*----------------------------------------------------------------------------*/ VOID rlmProcessPublicAction(P_ADAPTER_T prAdapter, P_SW_RFB_T prSwRfb) { P_ACTION_20_40_COEXIST_FRAME prRxFrame; P_IE_20_40_COEXIST_T prCoexist; P_IE_INTOLERANT_CHNL_REPORT_T prChnlReport; P_BSS_INFO_T prBssInfo; P_STA_RECORD_T prStaRec; PUINT_8 pucIE; UINT_16 u2IELength, u2Offset; UINT_8 i, j; ASSERT(prAdapter); ASSERT(prSwRfb); prRxFrame = (P_ACTION_20_40_COEXIST_FRAME) prSwRfb->pvHeader; prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); if (prRxFrame->ucAction != ACTION_PUBLIC_20_40_COEXIST || !prStaRec || prStaRec->ucStaState != STA_STATE_3 || prSwRfb->u2PacketLen < (WLAN_MAC_MGMT_HEADER_LEN + 5) || prSwRfb->prStaRec->ucBssIndex != /* HIF_RX_HDR_GET_NETWORK_IDX(prSwRfb->prHifRxHdr) != */ prStaRec->ucBssIndex) { return; } prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex); ASSERT(prBssInfo); if (!IS_BSS_ACTIVE(prBssInfo) || prBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT || prBssInfo->eBssSCO == CHNL_EXT_SCN) { return; } prCoexist = &prRxFrame->rBssCoexist; if (prCoexist->ucData & (BSS_COEXIST_40M_INTOLERANT | BSS_COEXIST_20M_REQ)) { ASSERT(prBssInfo->auc2G_20mReqChnlList[0] <= CHNL_LIST_SZ_2G); for (i = 1; i <= prBssInfo->auc2G_20mReqChnlList[0] && i <= CHNL_LIST_SZ_2G; i++) { if (prBssInfo->auc2G_20mReqChnlList[i] == prBssInfo->ucPrimaryChannel) { break; } } if ((i > prBssInfo->auc2G_20mReqChnlList[0]) && (i <= CHNL_LIST_SZ_2G)) { prBssInfo->auc2G_20mReqChnlList[i] = prBssInfo->ucPrimaryChannel; prBssInfo->auc2G_20mReqChnlList[0]++; } } /* Process intolerant channel report IE */ pucIE = (PUINT_8) &prRxFrame->rChnlReport; u2IELength = prSwRfb->u2PacketLen - (WLAN_MAC_MGMT_HEADER_LEN + 5); IE_FOR_EACH(pucIE, u2IELength, u2Offset) { switch (IE_ID(pucIE)) { case ELEM_ID_20_40_INTOLERANT_CHNL_REPORT: prChnlReport = (P_IE_INTOLERANT_CHNL_REPORT_T) pucIE; if (prChnlReport->ucLength <= 1) { break; } /* To do: process regulatory class. Now we assume 2.4G band */ for (j = 0; j < prChnlReport->ucLength - 1; j++) { /* Update non-HT channel list */ ASSERT(prBssInfo->auc2G_NonHtChnlList[0] <= CHNL_LIST_SZ_2G); for (i = 1; i <= prBssInfo->auc2G_NonHtChnlList[0] && i <= CHNL_LIST_SZ_2G; i++) { if (prBssInfo->auc2G_NonHtChnlList[i] == prChnlReport->aucChannelList[j]) { break; } } if ((i > prBssInfo->auc2G_NonHtChnlList[0]) && (i <= CHNL_LIST_SZ_2G)) { prBssInfo->auc2G_NonHtChnlList[i] = prChnlReport->aucChannelList[j]; prBssInfo->auc2G_NonHtChnlList[0]++; } } break; default: break; } } /* end of IE_FOR_EACH */ if (rlmUpdateBwByChListForAP(prAdapter, prBssInfo)) { bssUpdateBeaconContent(prAdapter, prBssInfo->ucBssIndex); rlmSyncOperationParams(prAdapter, prBssInfo); } /* Check if OBSS scan exemption response should be sent */ if (prCoexist->ucData & BSS_COEXIST_OBSS_SCAN_EXEMPTION_REQ) { rlmObssScanExemptionRsp(prAdapter, prBssInfo, prSwRfb); } }
VOID scanP2pProcessBeaconAndProbeResp(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb, IN P_WLAN_STATUS prStatus, IN P_BSS_DESC_T prBssDesc, IN P_WLAN_BEACON_FRAME_T prWlanBeaconFrame) { if (prBssDesc->fgIsP2PPresent) { if ((prBssDesc->fgIsConnected) && /* P2P GC connected. */ ((prWlanBeaconFrame->u2FrameCtrl & MASK_FRAME_TYPE) == MAC_FRAME_BEACON) /* TX Beacon */ ) { UINT_32 u4Idx = 0; P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL; for (u4Idx = 0; u4Idx < BSS_INFO_NUM; u4Idx++) { /* Check BSS for P2P. */ /* Check BSSID. */ prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, (UINT_8) u4Idx); if (!IS_BSS_ACTIVE(prP2pBssInfo)) { continue; } if ((prP2pBssInfo->eNetworkType != NETWORK_TYPE_P2P) || (UNEQUAL_MAC_ADDR(prP2pBssInfo->aucBSSID, prBssDesc->aucBSSID) || (!EQUAL_SSID (prP2pBssInfo->aucSSID, prP2pBssInfo->ucSSIDLen, prBssDesc->aucSSID, prBssDesc->ucSSIDLen)))) { continue; } if ((prP2pBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) && /* P2P GC */ (prP2pBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) && /* Connected */ (!prP2pBssInfo->ucDTIMPeriod)) { /* First Time. */ prP2pBssInfo->ucDTIMPeriod = prBssDesc->ucDTIMPeriod; nicPmIndicateBssConnected(prAdapter, prP2pBssInfo->ucBssIndex); } } } do { RF_CHANNEL_INFO_T rChannelInfo; ASSERT_BREAK((prSwRfb != NULL) && (prBssDesc != NULL)); if (((prWlanBeaconFrame->u2FrameCtrl & MASK_FRAME_TYPE) != MAC_FRAME_PROBE_RSP)) { /* Only report Probe Response frame to supplicant. */ /* Probe response collect much more information. */ break; } rChannelInfo.ucChannelNum = prBssDesc->ucChannelNum; rChannelInfo.eBand = prBssDesc->eBand; prBssDesc->fgIsP2PReport = TRUE; DBGLOG(P2P, INFO, ("indicate %s [%d]\n", prBssDesc->aucSSID, prBssDesc->ucChannelNum)); kalP2PIndicateBssInfo(prAdapter->prGlueInfo, (PUINT_8) prSwRfb->pvHeader, (UINT_32) prSwRfb->u2PacketLen, &rChannelInfo, RCPI_TO_dBm(prBssDesc->ucRCPI)); } while (FALSE); } }
/*----------------------------------------------------------------------------*/ WLAN_STATUS authSendAuthFrame(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN UINT_8 ucBssIndex, IN P_SW_RFB_T prFalseAuthSwRfb, IN UINT_16 u2TransactionSeqNum, IN UINT_16 u2StatusCode) { PUINT_8 pucReceiveAddr; PUINT_8 pucTransmitAddr; P_MSDU_INFO_T prMsduInfo; P_BSS_INFO_T prBssInfo; /*get from input parameter */ /* ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex = NETWORK_TYPE_AIS_INDEX; */ PFN_TX_DONE_HANDLER pfTxDoneHandler = (PFN_TX_DONE_HANDLER) NULL; UINT_16 u2EstimatedFrameLen; UINT_16 u2EstimatedExtraIELen; UINT_16 u2PayloadLen; UINT_16 ucAuthAlgNum; UINT_32 i; DBGLOG(SAA, LOUD, "Send Auth Frame %d, Status Code = %d\n", u2TransactionSeqNum, u2StatusCode); /* 4 <1> Allocate a PKT_INFO_T for Authentication Frame */ /* Init with MGMT Header Length + Length of Fixed Fields */ u2EstimatedFrameLen = (MAC_TX_RESERVED_FIELD + WLAN_MAC_MGMT_HEADER_LEN + AUTH_ALGORITHM_NUM_FIELD_LEN + AUTH_TRANSACTION_SEQENCE_NUM_FIELD_LEN + STATUS_CODE_FIELD_LEN); /* + Extra IE Length */ u2EstimatedExtraIELen = 0; for (i = 0; i < sizeof(txAuthIETable) / sizeof(APPEND_IE_ENTRY_T); i++) u2EstimatedExtraIELen += txAuthIETable[i].u2EstimatedIELen; u2EstimatedFrameLen += u2EstimatedExtraIELen; /* Allocate a MSDU_INFO_T */ prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen); if (prMsduInfo == NULL) { DBGLOG(SAA, WARN, "No PKT_INFO_T for sending Auth Frame.\n"); return WLAN_STATUS_RESOURCES; } /* 4 <2> Compose Authentication Request frame header and fixed fields in MSDU_INfO_T. */ if (prStaRec) { ASSERT(prStaRec->ucBssIndex <= MAX_BSS_INDEX); prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex); pucTransmitAddr = prBssInfo->aucOwnMacAddr; pucReceiveAddr = prStaRec->aucMacAddr; ucAuthAlgNum = prStaRec->ucAuthAlgNum; switch (u2TransactionSeqNum) { case AUTH_TRANSACTION_SEQ_1: case AUTH_TRANSACTION_SEQ_3: pfTxDoneHandler = saaFsmRunEventTxDone; break; case AUTH_TRANSACTION_SEQ_2: case AUTH_TRANSACTION_SEQ_4: pfTxDoneHandler = aaaFsmRunEventTxDone; break; } } else { /* For Error Status Code */ P_WLAN_AUTH_FRAME_T prFalseAuthFrame; ASSERT(prFalseAuthSwRfb); prFalseAuthFrame = (P_WLAN_AUTH_FRAME_T) prFalseAuthSwRfb->pvHeader; ASSERT(u2StatusCode != STATUS_CODE_SUCCESSFUL); pucTransmitAddr = prFalseAuthFrame->aucDestAddr; pucReceiveAddr = prFalseAuthFrame->aucSrcAddr; ucAuthAlgNum = prFalseAuthFrame->u2AuthAlgNum; u2TransactionSeqNum = (prFalseAuthFrame->u2AuthTransSeqNo + 1); } /* Compose Header and some Fixed Fields */ authComposeAuthFrameHeaderAndFF((PUINT_8) ((ULONG) (prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD), pucReceiveAddr, pucTransmitAddr, ucAuthAlgNum, u2TransactionSeqNum, u2StatusCode); u2PayloadLen = (AUTH_ALGORITHM_NUM_FIELD_LEN + AUTH_TRANSACTION_SEQENCE_NUM_FIELD_LEN + STATUS_CODE_FIELD_LEN); /* 4 <3> Update information of MSDU_INFO_T */ TX_SET_MMPDU(prAdapter, prMsduInfo, ucBssIndex, (prStaRec != NULL) ? (prStaRec->ucIndex) : (STA_REC_INDEX_NOT_FOUND), WLAN_MAC_MGMT_HEADER_LEN, WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen, pfTxDoneHandler, MSDU_RATE_MODE_AUTO); if ((ucAuthAlgNum == AUTH_ALGORITHM_NUM_SHARED_KEY) && (u2TransactionSeqNum == AUTH_TRANSACTION_SEQ_3)) nicTxConfigPktOption(prMsduInfo, MSDU_OPT_PROTECTED_FRAME, TRUE); /* 4 <4> Compose IEs in MSDU_INFO_T */ for (i = 0; i < sizeof(txAuthIETable) / sizeof(APPEND_IE_ENTRY_T); i++) { if (txAuthIETable[i].pfnAppendIE) txAuthIETable[i].pfnAppendIE(prAdapter, prMsduInfo); } /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */ nicTxConfigPktControlFlag(prMsduInfo, MSDU_CONTROL_FLAG_FORCE_TX, TRUE); /* 4 <6> Inform TXM to send this Authentication frame. */ nicTxEnqueueMsdu(prAdapter, prMsduInfo); return WLAN_STATUS_SUCCESS; } /* end of authSendAuthFrame() */
/*----------------------------------------------------------------------------*/ WLAN_STATUS authSendAuthFrame(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN UINT_16 u2TransactionSeqNum) { P_MSDU_INFO_T prMsduInfo; P_BSS_INFO_T prBssInfo; UINT_16 u2EstimatedFrameLen; UINT_16 u2EstimatedExtraIELen; UINT_16 u2PayloadLen; UINT_32 i; DBGLOG(SAA, LOUD, "Send Auth Frame\n"); ASSERT(prStaRec); /* 4 <1> Allocate a PKT_INFO_T for Authentication Frame */ /* Init with MGMT Header Length + Length of Fixed Fields */ u2EstimatedFrameLen = (MAC_TX_RESERVED_FIELD + WLAN_MAC_MGMT_HEADER_LEN + AUTH_ALGORITHM_NUM_FIELD_LEN + AUTH_TRANSACTION_SEQENCE_NUM_FIELD_LEN + STATUS_CODE_FIELD_LEN); /* + Extra IE Length */ u2EstimatedExtraIELen = 0; for (i = 0; i < sizeof(txAuthIETable) / sizeof(APPEND_IE_ENTRY_T); i++) u2EstimatedExtraIELen += txAuthIETable[i].u2EstimatedIELen; u2EstimatedFrameLen += u2EstimatedExtraIELen; /* Allocate a MSDU_INFO_T */ prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen); if (prMsduInfo == NULL) { DBGLOG(SAA, WARN, "No PKT_INFO_T for sending Auth Frame.\n"); return WLAN_STATUS_RESOURCES; } /* 4 <2> Compose Authentication Request frame header and fixed fields in MSDU_INfO_T. */ ASSERT(prStaRec->ucBssIndex <= MAX_BSS_INDEX); prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex) /* Compose Header and some Fixed Fields */ authComposeAuthFrameHeaderAndFF((PUINT_8) ((UINT_32) (prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD), prStaRec->aucMacAddr, prBssInfo->aucOwnMacAddr, prStaRec->ucAuthAlgNum, u2TransactionSeqNum, STATUS_CODE_RESERVED); u2PayloadLen = (AUTH_ALGORITHM_NUM_FIELD_LEN + AUTH_TRANSACTION_SEQENCE_NUM_FIELD_LEN + STATUS_CODE_FIELD_LEN); /* 4 <3> Update information of MSDU_INFO_T */ TX_SET_MMPDU(prAdapter, prMsduInfo, prStaRec->ucBssIndex, prStaRec->ucIndex, WLAN_MAC_MGMT_HEADER_LEN, WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen, saaFsmRunEventTxDone, MSDU_RATE_MODE_AUTO); /* 4 <4> Compose IEs in MSDU_INFO_T */ for (i = 0; i < sizeof(txAuthIETable) / sizeof(APPEND_IE_ENTRY_T); i++) { if (txAuthIETable[i].pfnAppendIE) txAuthIETable[i].pfnAppendIE(prAdapter, prMsduInfo); } /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */ nicTxConfigPktControlFlag(prMsduInfo, MSDU_CONTROL_FLAG_FORCE_TX, TRUE); /* 4 <6> Inform TXM to send this Authentication frame. */ nicTxEnqueueMsdu(prAdapter, prMsduInfo); return WLAN_STATUS_SUCCESS; } /* end of authSendAuthFrame() */
/*----------------------------------------------------------------------------*/ BOOLEAN secIsProtectedFrame ( IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsdu, IN P_STA_RECORD_T prStaRec ) { //P_BSS_INFO_T prBssInfo; ASSERT(prAdapter); ASSERT(prMsdu); //ASSERT(prStaRec); #if CFG_SUPPORT_802_11W if (prMsdu->ucPacketType == TX_PACKET_TYPE_MGMT) { BOOL fgRobustActionWithProtect = FALSE; #if 0 /* Decide by Compose module */ P_BSS_INFO_T prBssInfo; if (prStaRec) { prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex); ASSERT(prBssInfo); if ((prBssInfo->eNetworkType == NETWORK_TYPE_AIS) && prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection /* Use MFP */) { fgRobustActionWithProtect = TRUE; } } #endif if (prStaRec && fgRobustActionWithProtect /* AIS & Robust action frame */) return TRUE; else return FALSE; } #else if (prMsdu->ucPacketType == TX_PACKET_TYPE_MGMT) { return FALSE; } #endif #if 1 return secIsProtectedBss(prAdapter, GET_BSS_INFO_BY_INDEX(prAdapter, prMsdu->ucBssIndex)); #else prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prMsdu->ucBssIndex); ASSERT(prBssInfo); if (prBssInfo->eNetworkType == NETWORK_TYPE_AIS) { #if CFG_SUPPORT_WAPI if (wlanQueryWapiMode(prAdapter)) return TRUE; #endif return secEnabledInAis(prAdapter); } #if CFG_ENABLE_WIFI_DIRECT else if (prBssInfo->eNetworkType == NETWORK_TYPE_P2P) { return kalP2PGetCipher(prAdapter->prGlueInfo); } #endif else if (prBssInfo->eNetworkType == NETWORK_TYPE_BOW) { return TRUE; } ASSERT(FALSE); return FALSE; #endif }
/*----------------------------------------------------------------------------*/ VOID secInit ( IN P_ADAPTER_T prAdapter, IN UINT_8 ucBssIndex ) { UINT_8 i; P_CONNECTION_SETTINGS_T prConnSettings; P_BSS_INFO_T prBssInfo; P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo; DEBUGFUNC("secInit"); ASSERT(prAdapter); prConnSettings = &prAdapter->rWifiVar.rConnSettings; prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIndex); prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo; prBssInfo->u4RsnSelectedGroupCipher = 0; prBssInfo->u4RsnSelectedPairwiseCipher = 0; prBssInfo->u4RsnSelectedAKMSuite = 0; #if 0// CFG_ENABLE_WIFI_DIRECT prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P]; prBssInfo->u4RsnSelectedGroupCipher = RSN_CIPHER_SUITE_CCMP; prBssInfo->u4RsnSelectedPairwiseCipher = RSN_CIPHER_SUITE_CCMP; prBssInfo->u4RsnSelectedAKMSuite = RSN_AKM_SUITE_PSK; #endif #if 0//CFG_ENABLE_BT_OVER_WIFI prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW]; prBssInfo->u4RsnSelectedGroupCipher = RSN_CIPHER_SUITE_CCMP; prBssInfo->u4RsnSelectedPairwiseCipher = RSN_CIPHER_SUITE_CCMP; prBssInfo->u4RsnSelectedAKMSuite = RSN_AKM_SUITE_PSK; #endif prAdapter->rMib.dot11RSNAConfigPairwiseCiphersTable[0].dot11RSNAConfigPairwiseCipher = WPA_CIPHER_SUITE_WEP40; prAdapter->rMib.dot11RSNAConfigPairwiseCiphersTable[1].dot11RSNAConfigPairwiseCipher = WPA_CIPHER_SUITE_TKIP; prAdapter->rMib.dot11RSNAConfigPairwiseCiphersTable[2].dot11RSNAConfigPairwiseCipher = WPA_CIPHER_SUITE_CCMP; prAdapter->rMib.dot11RSNAConfigPairwiseCiphersTable[3].dot11RSNAConfigPairwiseCipher = WPA_CIPHER_SUITE_WEP104; prAdapter->rMib.dot11RSNAConfigPairwiseCiphersTable[4].dot11RSNAConfigPairwiseCipher = RSN_CIPHER_SUITE_WEP40; prAdapter->rMib.dot11RSNAConfigPairwiseCiphersTable[5].dot11RSNAConfigPairwiseCipher = RSN_CIPHER_SUITE_TKIP; prAdapter->rMib.dot11RSNAConfigPairwiseCiphersTable[6].dot11RSNAConfigPairwiseCipher = RSN_CIPHER_SUITE_CCMP; prAdapter->rMib.dot11RSNAConfigPairwiseCiphersTable[7].dot11RSNAConfigPairwiseCipher = RSN_CIPHER_SUITE_WEP104; for (i = 0; i < MAX_NUM_SUPPORTED_CIPHER_SUITES; i ++) { prAdapter->rMib.dot11RSNAConfigPairwiseCiphersTable[i].dot11RSNAConfigPairwiseCipherEnabled = FALSE; } prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[0].dot11RSNAConfigAuthenticationSuite = WPA_AKM_SUITE_NONE; prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[1].dot11RSNAConfigAuthenticationSuite = WPA_AKM_SUITE_802_1X; prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[2].dot11RSNAConfigAuthenticationSuite = WPA_AKM_SUITE_PSK; prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[3].dot11RSNAConfigAuthenticationSuite = RSN_AKM_SUITE_NONE; prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[4].dot11RSNAConfigAuthenticationSuite = RSN_AKM_SUITE_802_1X; prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[5].dot11RSNAConfigAuthenticationSuite = RSN_AKM_SUITE_PSK; #if CFG_SUPPORT_802_11W prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[6].dot11RSNAConfigAuthenticationSuite = RSN_AKM_SUITE_802_1X_SHA256; prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[7].dot11RSNAConfigAuthenticationSuite = RSN_AKM_SUITE_PSK_SHA256; #endif for (i = 0; i < MAX_NUM_SUPPORTED_AKM_SUITES; i ++) { prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[i].dot11RSNAConfigAuthenticationSuiteEnabled = FALSE; } secClearPmkid(prAdapter); cnmTimerInitTimer(prAdapter, &prAisSpecBssInfo->rPreauthenticationTimer, (PFN_MGMT_TIMEOUT_FUNC)rsnIndicatePmkidCand, (UINT_32)NULL); #if CFG_SUPPORT_802_11W cnmTimerInitTimer(prAdapter, &prAisSpecBssInfo->rSaQueryTimer, (PFN_MGMT_TIMEOUT_FUNC)rsnStartSaQueryTimer, (UINT_32)NULL); #endif prAisSpecBssInfo->fgCounterMeasure = FALSE; prAdapter->prAisBssInfo->ucTxDefaultKeyID = 0; prAdapter->prAisBssInfo->fgTxBcKeyExist = FALSE; #if 0 for (i=0;i<WTBL_SIZE;i++) { g_prWifiVar->arWtbl[i].ucUsed = FALSE; g_prWifiVar->arWtbl[i].prSta = NULL; g_prWifiVar->arWtbl[i].ucNetTypeIdx = NETWORK_TYPE_INDEX_NUM; } nicPrivacyInitialize((UINT_8)NETWORK_TYPE_INDEX_NUM); #endif } /* secInit */
/*----------------------------------------------------------------------------*/ WLAN_STATUS aaaFsmRunEventTxDone(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus) { P_STA_RECORD_T prStaRec; P_BSS_INFO_T prBssInfo; ASSERT(prAdapter); ASSERT(prMsduInfo); DBGLOG(AAA, LOUD, ("EVENT-TX DONE: Current Time = %ld\n", kalGetTimeTick())); prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex); if ((!prStaRec) || (!prStaRec->fgIsInUse)) return WLAN_STATUS_SUCCESS; /* For the case of replying ERROR STATUS CODE */ ASSERT(prStaRec->ucBssIndex <= MAX_BSS_INDEX); prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex); /* Trigger statistics log if Auth/Assoc Tx failed */ if(rTxDoneStatus != TX_RESULT_SUCCESS) { wlanTriggerStatsLog(prAdapter, prAdapter->rWifiVar.u4StatsLogDuration); } switch (prStaRec->eAuthAssocState) { case AAA_STATE_SEND_AUTH2: { /* Strictly check the outgoing frame is matched with current AA STATE */ if (authCheckTxAuthFrame(prAdapter, prMsduInfo, AUTH_TRANSACTION_SEQ_2) != WLAN_STATUS_SUCCESS) { break; } if (STATUS_CODE_SUCCESSFUL == prStaRec->u2StatusCode) { if (TX_RESULT_SUCCESS == rTxDoneStatus) { /* NOTE(Kevin): Change to STATE_2 at TX Done */ cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2); } else { prStaRec->eAuthAssocState = AA_STATE_IDLE; /* NOTE(Kevin): Change to STATE_1 */ cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1); #if CFG_ENABLE_WIFI_DIRECT if (prBssInfo->eNetworkType == NETWORK_TYPE_P2P) { p2pRoleFsmRunEventAAATxFail(prAdapter, prStaRec, prBssInfo); } #endif /* CFG_ENABLE_WIFI_DIRECT */ #if CFG_ENABLE_BT_OVER_WIFI if (IS_STA_BOW_TYPE(prStaRec)) bowRunEventAAATxFail(prAdapter, prStaRec); #endif /* CFG_ENABLE_BT_OVER_WIFI */ } } /* NOTE(Kevin): Ignore the TX Done Event of Auth Frame with Error Status Code */ } break; case AAA_STATE_SEND_ASSOC2: { /* Strictly check the outgoing frame is matched with current SAA STATE */ if (assocCheckTxReAssocRespFrame(prAdapter, prMsduInfo) != WLAN_STATUS_SUCCESS) { break; } if (STATUS_CODE_SUCCESSFUL == prStaRec->u2StatusCode) { if (TX_RESULT_SUCCESS == rTxDoneStatus) { prStaRec->eAuthAssocState = AA_STATE_IDLE; /* NOTE(Kevin): Change to STATE_3 at TX Done */ #if CFG_ENABLE_WIFI_DIRECT if (prBssInfo->eNetworkType == NETWORK_TYPE_P2P) { p2pRoleFsmRunEventAAASuccess(prAdapter, prStaRec, prBssInfo); } #endif /* CFG_ENABLE_WIFI_DIRECT */ #if CFG_ENABLE_BT_OVER_WIFI if (IS_STA_BOW_TYPE(prStaRec)) bowRunEventAAAComplete(prAdapter, prStaRec); #endif /* CFG_ENABLE_BT_OVER_WIFI */ } else { prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2; /* NOTE(Kevin): Change to STATE_2 */ cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2); #if CFG_ENABLE_WIFI_DIRECT if (prBssInfo->eNetworkType == NETWORK_TYPE_P2P) { p2pRoleFsmRunEventAAATxFail(prAdapter, prStaRec, prBssInfo); } #endif /* CFG_ENABLE_WIFI_DIRECT */ #if CFG_ENABLE_BT_OVER_WIFI if (IS_STA_BOW_TYPE(prStaRec)) bowRunEventAAATxFail(prAdapter, prStaRec); #endif /* CFG_ENABLE_BT_OVER_WIFI */ } } /* NOTE(Kevin): Ignore the TX Done Event of Auth Frame with Error Status Code */ } break; case AA_STATE_IDLE: /* 2013-08-27 frog: Do nothing. * Somtimes we may send Assoc Resp twice. (Rx Assoc Req before the first Assoc TX Done) * The AssocState is changed to IDLE after first TX done. * Free station record when IDLE is seriously wrong. */ /* /cnmStaRecFree(prAdapter, prStaRec); */ default: break; /* Ignore other cases */ } return WLAN_STATUS_SUCCESS; } /* end of aaaFsmRunEventTxDone() */
/*----------------------------------------------------------------------------*/ WLAN_STATUS aaaFsmRunEventRxAssoc(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb) { P_BSS_INFO_T prBssInfo; P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL; UINT_16 u2StatusCode = STATUS_CODE_RESERVED; BOOLEAN fgReplyAssocResp = FALSE; ASSERT(prAdapter); do { /* 4 <1> Check if we have the STA_RECORD_T for incoming Assoc Req */ prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); /* We should have the corresponding Sta Record. */ if ((!prStaRec) || (!prStaRec->fgIsInUse)) { /* Not to reply association response with failure code due to lack of STA_REC */ break; } if (!IS_CLIENT_STA(prStaRec)) break; if (prStaRec->ucStaState == STA_STATE_3) { /* Do Reassocation */ } else if ((prStaRec->ucStaState == STA_STATE_2) && (prStaRec->eAuthAssocState == AAA_STATE_SEND_AUTH2)) { /* Normal case */ } else { DBGLOG(AAA, WARN, ("Previous AuthAssocState (%d) != SEND_AUTH2.\n", prStaRec->eAuthAssocState)); /* Maybe Auth Response TX fail, but actually it success. */ cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2); } /* update RCPI */ ASSERT(prSwRfb->prRxStatusGroup3); prStaRec->ucRCPI = (UINT_8) HAL_RX_STATUS_GET_RCPI(prSwRfb->prRxStatusGroup3); /* 4 <2> Check P2P network conditions */ #if CFG_ENABLE_WIFI_DIRECT if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) { prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex); if (prBssInfo->fgIsNetActive) { /* 4 <2.1> Validate Assoc Req Frame and get Status Code */ /* Check if for this BSSID */ if (WLAN_STATUS_SUCCESS == assocProcessRxAssocReqFrame(prAdapter, prSwRfb, &u2StatusCode)) { if (STATUS_CODE_SUCCESSFUL == u2StatusCode) { /* 4 <2.2> Validate Assoc Req Frame for Network Specific Conditions */ fgReplyAssocResp = p2pFuncValidateAssocReq(prAdapter, prSwRfb, (PUINT_16) & u2StatusCode); } else { fgReplyAssocResp = TRUE; } break; } } } #endif /* CFG_ENABLE_WIFI_DIRECT */ /* 4 <3> Check BOW network conditions */ #if CFG_ENABLE_BT_OVER_WIFI if (IS_STA_BOW_TYPE(prStaRec)) { prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex); if ((prBssInfo->fgIsNetActive) && (OP_MODE_BOW == prBssInfo->eCurrentOPMode)) { /* 4 <3.1> Validate Auth Frame by Auth Algorithm/Transation Seq */ /* Check if for this BSSID */ if (WLAN_STATUS_SUCCESS == assocProcessRxAssocReqFrame(prAdapter, prSwRfb, &u2StatusCode)) { if (STATUS_CODE_SUCCESSFUL == u2StatusCode) { /* 4 <3.2> Validate Auth Frame for Network Specific Conditions */ fgReplyAssocResp = bowValidateAssocReq(prAdapter, prSwRfb, &u2StatusCode); } else { fgReplyAssocResp = TRUE; } /* TODO(Kevin): Allocate a STA_RECORD_T for new client */ break; } } } #endif /* CFG_ENABLE_BT_OVER_WIFI */ return WLAN_STATUS_SUCCESS; /* To release the SW_RFB_T */ } while (FALSE); /* 4 <4> Update STA_RECORD_T and reply Assoc Resp Frame */ if (fgReplyAssocResp) { UINT_16 u2IELength; PUINT_8 pucIE; if ((((P_WLAN_ASSOC_REQ_FRAME_T) (prSwRfb->pvHeader))-> u2FrameCtrl & MASK_FRAME_TYPE) == MAC_FRAME_REASSOC_REQ) { u2IELength = prSwRfb->u2PacketLen - (UINT_16) OFFSET_OF(WLAN_REASSOC_REQ_FRAME_T, aucInfoElem[0]); pucIE = ((P_WLAN_REASSOC_REQ_FRAME_T) (prSwRfb->pvHeader))->aucInfoElem; } else { u2IELength = prSwRfb->u2PacketLen - (UINT_16) OFFSET_OF(WLAN_ASSOC_REQ_FRAME_T, aucInfoElem[0]); pucIE = ((P_WLAN_ASSOC_REQ_FRAME_T) (prSwRfb->pvHeader))->aucInfoElem; } rlmProcessAssocReq(prAdapter, prSwRfb, pucIE, u2IELength); /* 4 <4.1> Assign Association ID */ if (u2StatusCode == STATUS_CODE_SUCCESSFUL) { #if CFG_ENABLE_WIFI_DIRECT if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) { prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex); if (p2pRoleFsmRunEventAAAComplete(prAdapter, prStaRec, prBssInfo) == WLAN_STATUS_SUCCESS) { prStaRec->u2AssocId = bssAssignAssocID(prStaRec); /* prStaRec->eAuthAssocState = AA_STATE_IDLE; */ /* NOTE(Kevin): for TX done */ prStaRec->eAuthAssocState = AAA_STATE_SEND_ASSOC2; /* NOTE(Kevin): Method A: Change to STATE_3 before handle TX Done */ /* cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3); */ } else { /* Client List FULL. */ u2StatusCode = STATUS_CODE_REQ_DECLINED; prStaRec->u2AssocId = 0; /* Invalid Assocation ID */ /* If(Re)association fail,remove sta record and use class error to handle sta*/ prStaRec->eAuthAssocState = AA_STATE_IDLE; /* NOTE(Kevin): Better to change state here, not at TX Done */ cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2); } } #endif #if CFG_ENABLE_BT_OVER_WIFI if ((IS_STA_BOW_TYPE(prStaRec))) { /* if (bowRunEventAAAComplete(prAdapter, prStaRec) == WLAN_STATUS_SUCCESS) { */ prStaRec->u2AssocId = bssAssignAssocID(prStaRec); prStaRec->eAuthAssocState = AAA_STATE_SEND_ASSOC2; /* NOTE(Kevin): for TX done */ /* NOTE(Kevin): Method A: Change to STATE_3 before handle TX Done */ /* cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3); */ } #endif } else { prStaRec->u2AssocId = 0; /* Invalid Assocation ID */ /* If (Re)association fail, remove sta record and use class error to handle sta */ prStaRec->eAuthAssocState = AA_STATE_IDLE; /* NOTE(Kevin): Better to change state here, not at TX Done */ cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2); } /* Update the record join time. */ GET_CURRENT_SYSTIME(&prStaRec->rUpdateTime); /* Update Station Record - Status/Reason Code */ prStaRec->u2StatusCode = u2StatusCode; /* NOTE: Ignore the return status for AAA */ /* 4 <4.2> Reply Assoc Resp */ assocSendReAssocRespFrame(prAdapter, prStaRec); } return WLAN_STATUS_SUCCESS; } /* end of aaaFsmRunEventRxAssoc() */
/*----------------------------------------------------------------------------*/ VOID aaaFsmRunEventRxAuth(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb) { P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T) NULL; P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL; UINT_16 u2StatusCode; BOOLEAN fgReplyAuth = FALSE; P_WLAN_AUTH_FRAME_T prAuthFrame = (P_WLAN_AUTH_FRAME_T) NULL; ASSERT(prAdapter); do { prAuthFrame = (P_WLAN_AUTH_FRAME_T) prSwRfb->pvHeader; #if CFG_ENABLE_WIFI_DIRECT prBssInfo = p2pFuncBSSIDFindBssInfo(prAdapter, prAuthFrame->aucBSSID); /* 4 <1> Check P2P network conditions */ if (prBssInfo && prAdapter->fgIsP2PRegistered) { if (prBssInfo->fgIsNetActive) { /* 4 <1.1> Validate Auth Frame by Auth Algorithm/Transation Seq */ if (WLAN_STATUS_SUCCESS == authProcessRxAuth1Frame(prAdapter, prSwRfb, prBssInfo->aucBSSID, AUTH_ALGORITHM_NUM_OPEN_SYSTEM, AUTH_TRANSACTION_SEQ_1, &u2StatusCode)) { if (STATUS_CODE_SUCCESSFUL == u2StatusCode) { /* 4 <1.2> Validate Auth Frame for Network Specific Conditions */ fgReplyAuth = p2pFuncValidateAuth(prAdapter, prBssInfo, prSwRfb, &prStaRec, &u2StatusCode); } else { fgReplyAuth = TRUE; } break; } } } #endif /* CFG_ENABLE_WIFI_DIRECT */ /* 4 <2> Check BOW network conditions */ #if CFG_ENABLE_BT_OVER_WIFI { P_BOW_FSM_INFO_T prBowFsmInfo = (P_BOW_FSM_INFO_T) NULL; prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo); prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prBowFsmInfo->ucBssIndex); if ((prBssInfo->fgIsNetActive) && (OP_MODE_BOW == prBssInfo->eCurrentOPMode)) { /* 4 <2.1> Validate Auth Frame by Auth Algorithm/Transation Seq */ /* Check if for this BSSID */ if (WLAN_STATUS_SUCCESS == authProcessRxAuth1Frame(prAdapter, prSwRfb, prBssInfo->aucBSSID, AUTH_ALGORITHM_NUM_OPEN_SYSTEM, AUTH_TRANSACTION_SEQ_1, &u2StatusCode)) { if (STATUS_CODE_SUCCESSFUL == u2StatusCode) { /* 4 <2.2> Validate Auth Frame for Network Specific Conditions */ fgReplyAuth = bowValidateAuth(prAdapter, prSwRfb, &prStaRec, &u2StatusCode); } else { fgReplyAuth = TRUE; } /* TODO(Kevin): Allocate a STA_RECORD_T for new client */ break; } } } #endif /* CFG_ENABLE_BT_OVER_WIFI */ return; } while (FALSE); if (prStaRec) { /* update RCPI */ ASSERT(prSwRfb->prRxStatusGroup3); prStaRec->ucRCPI = (UINT_8) HAL_RX_STATUS_GET_RCPI(prSwRfb->prRxStatusGroup3); } /* 4 <3> Update STA_RECORD_T and reply Auth_2(Response to Auth_1) Frame */ if (fgReplyAuth) { if (prStaRec) { if (u2StatusCode == STATUS_CODE_SUCCESSFUL) { if (prStaRec->eAuthAssocState != AA_STATE_IDLE) { DBGLOG(AAA, WARN, ("Previous AuthAssocState (%d) != IDLE.\n", prStaRec->eAuthAssocState)); } prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2; } else { prStaRec->eAuthAssocState = AA_STATE_IDLE; /* NOTE(Kevin): Change to STATE_1 */ cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1); } /* Update the record join time. */ GET_CURRENT_SYSTIME(&prStaRec->rUpdateTime); /* Update Station Record - Status/Reason Code */ prStaRec->u2StatusCode = u2StatusCode; prStaRec->ucAuthAlgNum = AUTH_ALGORITHM_NUM_OPEN_SYSTEM; } else { /* NOTE(Kevin): We should have STA_RECORD_T if the status code was successful */ ASSERT(!(u2StatusCode == STATUS_CODE_SUCCESSFUL)); } /* NOTE: Ignore the return status for AAA */ /* 4 <4> Reply Auth */ authSendAuthFrame(prAdapter, prStaRec, prBssInfo->ucBssIndex, prSwRfb, AUTH_TRANSACTION_SEQ_2, u2StatusCode); } else if (prStaRec) { cnmStaRecFree(prAdapter, prStaRec); } return; } /* end of aaaFsmRunEventRxAuth() */