/*----------------------------------------------------------------------------*/ static WLAN_STATUS wnmRunEventTimgingMeasTxDone(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus) { P_STA_RECORD_T prStaRec; ASSERT(prAdapter); ASSERT(prMsduInfo); DBGLOG(WNM, 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 */ DBGLOG(WNM, TRACE, "wnmRunEventTimgingMeasTxDone: ucDialog %d ucFollowUp %d u4ToD %x u4ToA %x", prStaRec->rWNMTimingMsmt.ucDialogToken, prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken, prStaRec->rWNMTimingMsmt.u4ToD, prStaRec->rWNMTimingMsmt.u4ToA); prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken; prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken; wnmComposeTimingMeasFrame(prAdapter, prStaRec, NULL); return WLAN_STATUS_SUCCESS; } /* end of wnmRunEventTimgingMeasTxDone() */
/*----------------------------------------------------------------------------*/ static VOID wnmTimingMeasRequest(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb) { P_ACTION_WNM_TIMING_MEAS_REQ_FRAME prRxFrame = NULL; P_STA_RECORD_T prStaRec; prRxFrame = (P_ACTION_WNM_TIMING_MEAS_REQ_FRAME) prSwRfb->pvHeader; if (!prRxFrame) return; prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); if ((!prStaRec) || (!prStaRec->fgIsInUse)) return; DBGLOG(WNM, TRACE, "IEEE 802.11: Received Timing Measuremen Request from " MACSTR "\n", MAC2STR(prStaRec->aucMacAddr); /* reset timing msmt */ prStaRec->rWNMTimingMsmt.fgInitiator = TRUE; prStaRec->rWNMTimingMsmt.ucTrigger = prRxFrame->ucTrigger; if (!prRxFrame->ucTrigger) return; prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken; prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0; wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone); }
/*----------------------------------------------------------------------------*/ VOID rlmProcessHtAction(P_ADAPTER_T prAdapter, P_SW_RFB_T prSwRfb) { P_ACTION_NOTIFY_CHNL_WIDTH_FRAME prRxFrame; P_STA_RECORD_T prStaRec; ASSERT(prAdapter); ASSERT(prSwRfb); prRxFrame = (P_ACTION_NOTIFY_CHNL_WIDTH_FRAME) prSwRfb->pvHeader; prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); if (prRxFrame->ucAction != ACTION_HT_NOTIFY_CHANNEL_WIDTH || !prStaRec || prStaRec->ucStaState != STA_STATE_3 || prSwRfb->u2PacketLen < sizeof(ACTION_NOTIFY_CHNL_WIDTH_FRAME)) { return; } /* To do: depending regulation class 13 and 14 based on spec * Note: (ucChannelWidth==1) shall restored back to original capability, * not current setting to 40MHz BW here */ if (prRxFrame->ucChannelWidth == 0) { prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_SUP_CHNL_WIDTH; } else if (prRxFrame->ucChannelWidth == 1) { prStaRec->u2HtCapInfo |= HT_CAP_INFO_SUP_CHNL_WIDTH; } cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3); }
/*----------------------------------------------------------------------------*/ VOID authAddIEChallengeText(IN P_ADAPTER_T prAdapter, IN OUT P_MSDU_INFO_T prMsduInfo) { P_WLAN_AUTH_FRAME_T prAuthFrame; P_STA_RECORD_T prStaRec; UINT_16 u2TransactionSeqNum; ASSERT(prMsduInfo); prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex); if (!prStaRec) return; ASSERT(prStaRec); /* For Management, frame header and payload are in a continuous buffer */ prAuthFrame = (P_WLAN_AUTH_FRAME_T) prMsduInfo->prPacket; WLAN_GET_FIELD_16(&prAuthFrame->u2AuthTransSeqNo, &u2TransactionSeqNum) /* Only consider SEQ_3 for Challenge Text */ if ((u2TransactionSeqNum == AUTH_TRANSACTION_SEQ_3) && (prStaRec->ucAuthAlgNum == AUTH_ALGORITHM_NUM_SHARED_KEY) && (prStaRec->prChallengeText != NULL)) { COPY_IE(((ULONG) (prMsduInfo->prPacket) + prMsduInfo->u2FrameLength), (prStaRec->prChallengeText)); prMsduInfo->u2FrameLength += IE_SIZE(prStaRec->prChallengeText); } return; } /* end of authAddIEChallengeText() */
/*----------------------------------------------------------------------------*/ WLAN_STATUS authCheckTxAuthFrame(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo, IN UINT_16 u2TransactionSeqNum) { P_WLAN_AUTH_FRAME_T prAuthFrame; P_STA_RECORD_T prStaRec; UINT_16 u2TxFrameCtrl; UINT_16 u2TxAuthAlgNum; UINT_16 u2TxTransactionSeqNum; ASSERT(prMsduInfo); prAuthFrame = (P_WLAN_AUTH_FRAME_T) (prMsduInfo->prPacket); ASSERT(prAuthFrame); prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex); ASSERT(prStaRec); if (!prStaRec) return WLAN_STATUS_INVALID_PACKET; /* WLAN_GET_FIELD_16(&prAuthFrame->u2FrameCtrl, &u2TxFrameCtrl) */ u2TxFrameCtrl = prAuthFrame->u2FrameCtrl; /* NOTE(Kevin): Optimized for ARM */ u2TxFrameCtrl &= MASK_FRAME_TYPE; if (u2TxFrameCtrl != MAC_FRAME_AUTH) return WLAN_STATUS_FAILURE; /* WLAN_GET_FIELD_16(&prAuthFrame->u2AuthAlgNum, &u2TxAuthAlgNum) */ u2TxAuthAlgNum = prAuthFrame->u2AuthAlgNum; /* NOTE(Kevin): Optimized for ARM */ if (u2TxAuthAlgNum != (UINT_16) (prStaRec->ucAuthAlgNum)) return WLAN_STATUS_FAILURE; /* WLAN_GET_FIELD_16(&prAuthFrame->u2AuthTransSeqNo, &u2TxTransactionSeqNum) */ u2TxTransactionSeqNum = prAuthFrame->u2AuthTransSeqNo; /* NOTE(Kevin): Optimized for ARM */ if (u2TxTransactionSeqNum != u2TransactionSeqNum) return WLAN_STATUS_FAILURE; return WLAN_STATUS_SUCCESS; } /* end of authCheckTxAuthFrame() */
/*----------------------------------------------------------------------------*/ 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 */
/*----------------------------------------------------------------------------*/ WLAN_STATUS authCheckRxAuthFrameStatus ( IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb, IN UINT_16 u2TransactionSeqNum, OUT PUINT_16 pu2StatusCode ) { P_STA_RECORD_T prStaRec; P_WLAN_AUTH_FRAME_T prAuthFrame; UINT_16 u2RxAuthAlgNum; UINT_16 u2RxTransactionSeqNum; //UINT_16 u2RxStatusCode; // NOTE(Kevin): Optimized for ARM ASSERT(prSwRfb); ASSERT(pu2StatusCode); prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); ASSERT(prStaRec); if(!prStaRec) { return WLAN_STATUS_INVALID_PACKET; } //4 <1> locate the Authentication Frame. prAuthFrame = (P_WLAN_AUTH_FRAME_T) prSwRfb->pvHeader; //4 <2> Parse the Fixed Fields of Authentication Frame Body. //WLAN_GET_FIELD_16(&prAuthFrame->u2AuthAlgNum, &u2RxAuthAlgNum); u2RxAuthAlgNum = prAuthFrame->u2AuthAlgNum; // NOTE(Kevin): Optimized for ARM if (u2RxAuthAlgNum != (UINT_16)prStaRec->ucAuthAlgNum) { DBGLOG(SAA, LOUD, ("Discard Auth frame with auth type = %d, current = %d\n", u2RxAuthAlgNum, prStaRec->ucAuthAlgNum)); return WLAN_STATUS_FAILURE; } //WLAN_GET_FIELD_16(&prAuthFrame->u2AuthTransSeqNo, &u2RxTransactionSeqNum); u2RxTransactionSeqNum = prAuthFrame->u2AuthTransSeqNo; // NOTE(Kevin): Optimized for ARM if (u2RxTransactionSeqNum != u2TransactionSeqNum) { DBGLOG(SAA, LOUD, ("Discard Auth frame with Transaction Seq No = %d\n", u2RxTransactionSeqNum)); return WLAN_STATUS_FAILURE; } //4 <3> Get the Status code //WLAN_GET_FIELD_16(&prAuthFrame->u2StatusCode, &u2RxStatusCode); //*pu2StatusCode = u2RxStatusCode; *pu2StatusCode = prAuthFrame->u2StatusCode; // NOTE(Kevin): Optimized for ARM return WLAN_STATUS_SUCCESS; } /* end of authCheckRxAuthFrameStatus() */
/*----------------------------------------------------------------------------*/ 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); ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType)); prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex); prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType]; ASSERT(prBssInfo); if (RLM_NET_IS_11N(prBssInfo) && !RLM_NET_IS_BOW(prBssInfo) && 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); } }
/*----------------------------------------------------------------------------*/ VOID authHandleIEChallengeText ( P_ADAPTER_T prAdapter, P_SW_RFB_T prSwRfb, P_IE_HDR_T prIEHdr ) { P_WLAN_AUTH_FRAME_T prAuthFrame; P_STA_RECORD_T prStaRec; UINT_16 u2TransactionSeqNum; ASSERT(prSwRfb); ASSERT(prIEHdr); prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); ASSERT(prStaRec); if(!prStaRec) { return; } /* For Management, frame header and payload are in a continuous buffer */ prAuthFrame = (P_WLAN_AUTH_FRAME_T)prSwRfb->pvHeader; //WLAN_GET_FIELD_16(&prAuthFrame->u2AuthTransSeqNo, &u2TransactionSeqNum) u2TransactionSeqNum = prAuthFrame->u2AuthTransSeqNo; // NOTE(Kevin): Optimized for ARM /* Only consider SEQ_2 for Challenge Text */ if ((u2TransactionSeqNum == AUTH_TRANSACTION_SEQ_2) && (prStaRec->ucAuthAlgNum == AUTH_ALGORITHM_NUM_SHARED_KEY)) { /* Free previous allocated TCM memory */ if (prStaRec->prChallengeText) { ASSERT(0); cnmMemFree(prAdapter, prStaRec->prChallengeText); prStaRec->prChallengeText = (P_IE_CHALLENGE_TEXT_T)NULL; } if ( ( prStaRec->prChallengeText = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, IE_SIZE(prIEHdr)) ) == NULL) { return; } /* Save the Challenge Text from Auth Seq 2 Frame, before sending Auth Seq 3 Frame */ COPY_IE(prStaRec->prChallengeText, prIEHdr); } return; } /* end of authAddIEChallengeText() */
/*----------------------------------------------------------------------------*/ VOID wnmReportTimingMeas(IN P_ADAPTER_T prAdapter, IN UINT_8 ucStaRecIndex, IN UINT_32 u4ToD, IN UINT_32 u4ToA) { P_STA_RECORD_T prStaRec; prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex); if ((!prStaRec) || (!prStaRec->fgIsInUse)) return; DBGLOG(WNM, TRACE, "wnmReportTimingMeas: u4ToD %x u4ToA %x", u4ToD, u4ToA); if (!prStaRec->rWNMTimingMsmt.ucTrigger) return; prStaRec->rWNMTimingMsmt.u4ToD = MICRO_TO_10NANO(u4ToD); prStaRec->rWNMTimingMsmt.u4ToA = MICRO_TO_10NANO(u4ToA); }
/*----------------------------------------------------------------------------*/ WLAN_STATUS authCheckRxAuthFrameStatus(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb, IN UINT_16 u2TransactionSeqNum, OUT PUINT_16 pu2StatusCode) { P_STA_RECORD_T prStaRec; P_WLAN_AUTH_FRAME_T prAuthFrame; UINT_16 u2RxAuthAlgNum; UINT_16 u2RxTransactionSeqNum; /* UINT_16 u2RxStatusCode; // NOTE(Kevin): Optimized for ARM */ ASSERT(prSwRfb); ASSERT(pu2StatusCode); prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); ASSERT(prStaRec); if (!prStaRec) return WLAN_STATUS_INVALID_PACKET; /* 4 <1> locate the Authentication Frame. */ prAuthFrame = (P_WLAN_AUTH_FRAME_T) prSwRfb->pvHeader; /* 4 <2> Parse the Fixed Fields of Authentication Frame Body. */ /* WLAN_GET_FIELD_16(&prAuthFrame->u2AuthAlgNum, &u2RxAuthAlgNum); */ u2RxAuthAlgNum = prAuthFrame->u2AuthAlgNum; /* NOTE(Kevin): Optimized for ARM */ if (u2RxAuthAlgNum != (UINT_16) prStaRec->ucAuthAlgNum) { DBGLOG(SAA, WARN, "Discard Auth frame with auth type = %d, current = %d\n", u2RxAuthAlgNum, prStaRec->ucAuthAlgNum); *pu2StatusCode = STATUS_CODE_AUTH_ALGORITHM_NOT_SUPPORTED; return WLAN_STATUS_SUCCESS; } /* WLAN_GET_FIELD_16(&prAuthFrame->u2AuthTransSeqNo, &u2RxTransactionSeqNum); */ u2RxTransactionSeqNum = prAuthFrame->u2AuthTransSeqNo; /* NOTE(Kevin): Optimized for ARM */ if (u2RxTransactionSeqNum != u2TransactionSeqNum) { DBGLOG(SAA, WARN, "Discard Auth frame with Transaction Seq No = %d\n", u2RxTransactionSeqNum); *pu2StatusCode = STATUS_CODE_AUTH_OUT_OF_SEQ; return WLAN_STATUS_SUCCESS; } /* 4 <3> Get the Status code */ /* WLAN_GET_FIELD_16(&prAuthFrame->u2StatusCode, &u2RxStatusCode); */ /* *pu2StatusCode = u2RxStatusCode; */ *pu2StatusCode = prAuthFrame->u2StatusCode; /* NOTE(Kevin): Optimized for ARM */ return WLAN_STATUS_SUCCESS; } /* end of authCheckRxAuthFrameStatus() */
VOID wfdFuncGenerateWfdIEForAssocRsp(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo) { #if CFG_SUPPORT_WFD_COMPOSE_IE P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL; P_STA_RECORD_T prStaRec; do { ASSERT_BREAK((prMsduInfo != NULL) && (prAdapter != NULL)); prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings); prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex); if (IS_STA_P2P_TYPE(prStaRec)) { if (prWfdCfgSettings->ucWfdEnable == 0) { break; } if ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_DEV_INFO_VALID) == 0) { break; } wfdFuncGenerateWfd_IE(prAdapter, FALSE, &prMsduInfo->u2FrameLength, prMsduInfo->prPacket, 1500, txAssocRspWFDAttributesTable, sizeof (txAssocRspWFDAttributesTable) / sizeof(APPEND_VAR_ATTRI_ENTRY_T)); } } while (FALSE); return; #else return; #endif } /* wfdFuncGenerateWfdIEForAssocRsp */
VOID wnmTimingMeasUnitTest1(P_ADAPTER_T prAdapter, UINT_8 ucStaRecIndex) { P_STA_RECORD_T prStaRec; prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex); if ((!prStaRec) || (!prStaRec->fgIsInUse)) return; DBGLOG(WNM, INFO, "IEEE 802.11v: Test Timing Measuremen Request from " MACSTR "\n", MAC2STR(prStaRec->aucMacAddr); prStaRec->rWNMTimingMsmt.fgInitiator = TRUE; prStaRec->rWNMTimingMsmt.ucTrigger = 1; prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken; prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0; wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone); }
/*----------------------------------------------------------------------------*/ 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); } }
/*----------------------------------------------------------------------------*/ 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)) { ASSERT(0); /* Only for debug phase */ 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, INFO, "Previous AuthAssocState (%d) != SEND_AUTH2, ucStaState:%d.\n", prStaRec->eAuthAssocState, prStaRec->ucStaState); /* TODO: Why assoc req event is faster than tx done of auth */ if (prStaRec->eAuthAssocState != AAA_STATE_SEND_AUTH2) break; } /* update RCPI */ prStaRec->ucRCPI = prSwRfb->prHifRxHdr->ucRcpi; /* 4 <2> Check P2P network conditions */ #if CFG_ENABLE_WIFI_DIRECT if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) { prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]); 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_IN_BOW(prStaRec)) { prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]); 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))) { if (p2pRunEventAAAComplete(prAdapter, prStaRec) == WLAN_STATUS_SUCCESS) { prStaRec->u2AssocId = bssAssignAssocID(prStaRec); /* prStaRec->eAuthAssocState = AA_STATE_IDLE; */ 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); */ } else { /* Client List FULL. */ u2StatusCode = STATUS_CODE_REQ_DECLINED; prStaRec->u2AssocId = 0; /* Invalid Assocation ID */ /* If (Re)association fail, the peer can try Assocation w/o Auth immediately */ prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2; /* 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_IN_BOW(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); */ } #if 0 else { /* Client List FULL. */ u2StatusCode = STATUS_CODE_REQ_DECLINED; prStaRec->u2AssocId = 0; /* Invalid Assocation ID */ /* If (Re)association fail, the peer can try Assocation w/o Auth immediately */ prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2; /* NOTE(Kevin): Better to change state here, not at TX Done */ cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2); } } #endif #endif } else { prStaRec->u2AssocId = 0; /* Invalid Assocation ID */ /* If (Re)association fail, the peer can try Assocation w/o Auth immediately */ prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2; /* 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); }
/*----------------------------------------------------------------------------*/ 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() */