|
|
板凳

楼主 |
发表于 2016-5-13 06:26:00
|
只看该作者
/*----------------------------------------------------------------------------*/
/*!
* @brief This function will validate the Rx Auth Frame and then return
* the status code to AAA to indicate if need to perform following actions
* when the specified conditions were matched.
*
* @param[in] prAdapter Pointer to the Adapter structure.
* @param[in] prSwRfb Pointer to SW RFB data structure.
* @param[in] pprStaRec Pointer to pointer of STA_RECORD_T structure.
* @param[out] pu2StatusCode The Status Code of Validation Result
*
* @retval TRUE Reply the Auth
* @retval FALSE Don't reply the Auth
*/
/*----------------------------------------------------------------------------*/
BOOLEAN
p2pFuncValidateAuth (
IN P_ADAPTER_T prAdapter,
IN P_SW_RFB_T prSwRfb,
IN PP_STA_RECORD_T pprStaRec,
OUT PUINT_16 pu2StatusCode
)
{
BOOLEAN fgReplyAuth = TRUE;
P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T)NULL;
P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
P_WLAN_AUTH_FRAME_T prAuthFrame = (P_WLAN_AUTH_FRAME_T)NULL;
DBGLOG(P2P, TRACE, ("p2pValidate Authentication Frame\n"))
do {
ASSERT_BREAK((prAdapter != NULL) &&
(prSwRfb != NULL) &&
(pprStaRec != NULL) &&
(pu2StatusCode != NULL));
/* P2P 3.2.8 */
*pu2StatusCode = STATUS_CODE_REQ_DECLINED;
prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
prAuthFrame = (P_WLAN_AUTH_FRAME_T)prSwRfb->pvHeader;
if ((prP2pBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT) || (prP2pBssInfo->eIntendOPMode != OP_MODE_NUM)) {
/* We are not under AP Mode yet. */
fgReplyAuth = FALSE;
DBGLOG(P2P, WARN, ("Current OP mode is not under AP mode. (%d)\n", prP2pBssInfo->eCurrentOPMode));
break;
}
prStaRec = cnmGetStaRecByAddress(prAdapter,
(UINT_8) NETWORK_TYPE_P2P_INDEX,
prAuthFrame->aucSrcAddr);
if (!prStaRec) {
prStaRec = cnmStaRecAlloc(prAdapter,
(UINT_8) NETWORK_TYPE_P2P_INDEX);
/* TODO(Kevin): Error handling of allocation of STA_RECORD_T for
* exhausted case and do removal of unused STA_RECORD_T.
*/
/* Sent a message event to clean un-used STA_RECORD_T. */
ASSERT(prStaRec);
if (!prStaRec) {
DBGLOG(AAA, INFO, ("Station Limit Full. Decline a new Authentication.\n"));
break;
}
COPY_MAC_ADDR(prStaRec->aucMacAddr, prAuthFrame->aucSrcAddr);
prSwRfb->ucStaRecIdx = prStaRec->ucIndex;
prStaRec->u2BSSBasicRateSet = prP2pBssInfo->u2BSSBasicRateSet;
prStaRec->u2DesiredNonHTRateSet = RATE_SET_ERP_P2P;
prStaRec->u2OperationalRateSet = RATE_SET_ERP_P2P;
prStaRec->ucPhyTypeSet = PHY_TYPE_SET_802_11GN;
prStaRec->eStaType = STA_TYPE_P2P_GC;
/* NOTE(Kevin): Better to change state here, not at TX Done */
cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
}
else {
prSwRfb->ucStaRecIdx = prStaRec->ucIndex;
if ((prStaRec->ucStaState > STA_STATE_1) && (IS_STA_IN_P2P(prStaRec))) {
cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
p2pFuncResetStaRecStatus(prAdapter, prStaRec);
bssRemoveStaRecFromClientList(prAdapter, prP2pBssInfo, prStaRec);
}
}
if (prP2pBssInfo->rStaRecOfClientList.u4NumElem >= P2P_MAXIMUM_CLIENT_COUNT ||
kalP2PMaxClients(prAdapter->prGlueInfo, prP2pBssInfo->rStaRecOfClientList.u4NumElem)) {
/* GROUP limit full. */
/* P2P 3.2.8 */
DBGLOG(P2P, WARN, ("Group Limit Full. (%d)\n", (INT_16)prP2pBssInfo->rStaRecOfClientList.u4NumElem));
bssRemoveStaRecFromClientList(prAdapter, prP2pBssInfo, prStaRec);
cnmStaRecFree(prAdapter, prStaRec, FALSE);
fgReplyAuth = FALSE;
break;
}
else {
/* Hotspot Blacklist */
if(prAuthFrame->aucSrcAddr) {
if(kalP2PCmpBlackList(prAdapter->prGlueInfo, prAuthFrame->aucSrcAddr)) {
fgReplyAuth = FALSE;
return fgReplyAuth;
}
}
}
//prStaRec->eStaType = STA_TYPE_INFRA_CLIENT;
prStaRec->eStaType = STA_TYPE_P2P_GC;
prStaRec->ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
/* Update Station Record - Status/Reason Code */
prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
prStaRec->ucJoinFailureCount = 0;
*pprStaRec = prStaRec;
*pu2StatusCode = STATUS_CODE_SUCCESSFUL;
} while (FALSE);
return fgReplyAuth;
} /* p2pFuncValidateAuth */
|
|