/* ========================================================================== Description: Check validity of the received RSNIE. Return: status code ========================================================================== */ UINT APValidateRSNIE( IN struct rtmp_adapter * pAd, IN PMAC_TABLE_ENTRY pEntry, IN u8 * pRsnIe, IN u8 rsnie_len) { UINT StatusCode = MLME_SUCCESS; PEID_STRUCT eid_ptr; INT apidx; PMULTISSID_STRUCT pMbss; if (rsnie_len == 0) return MLME_SUCCESS; eid_ptr = (PEID_STRUCT)pRsnIe; if ((eid_ptr->Len + 2) != rsnie_len) { DBGPRINT(RT_DEBUG_ERROR, ("[ERROR]APValidateRSNIE : the len is invalid !!!\n")); return MLME_UNSPECIFY_FAIL; } apidx = pEntry->apidx; pMbss = &pAd->ApCfg.MBSSID[apidx]; /* check group cipher */ if (!RTMPCheckMcast(pAd, eid_ptr, pEntry)) { DBGPRINT(RT_DEBUG_ERROR, ("[ERROR]APValidateRSNIE : invalid group cipher !!!\n")); StatusCode = MLME_INVALID_GROUP_CIPHER; } /* Check pairwise cipher */ else if (!RTMPCheckUcast(pAd, eid_ptr, pEntry)) { DBGPRINT(RT_DEBUG_ERROR, ("[ERROR]APValidateRSNIE : invalid pairwise cipher !!!\n")); StatusCode = MLME_INVALID_PAIRWISE_CIPHER; } /* Check AKM */ else if (!RTMPCheckAUTH(pAd, eid_ptr, pEntry)) { DBGPRINT(RT_DEBUG_ERROR, ("[ERROR]APValidateRSNIE : invalid AKM !!!\n")); StatusCode = MLME_INVALID_AKMP; } if (StatusCode != MLME_SUCCESS) { /* send wireless event - for RSN IE sanity check fail */ RTMPSendWirelessEvent(pAd, IW_RSNIE_SANITY_FAIL_EVENT_FLAG, pEntry->Addr, 0, 0); DBGPRINT(RT_DEBUG_ERROR, ("%s : invalid status code(%d) !!!\n", __FUNCTION__, StatusCode)); } else { u8 CipherAlg = CIPHER_NONE; if (pEntry->WepStatus == Ndis802_11WEPEnabled) CipherAlg = CIPHER_WEP64; else if (pEntry->WepStatus == Ndis802_11TKIPEnable) CipherAlg = CIPHER_TKIP; else if (pEntry->WepStatus == Ndis802_11AESEnable) CipherAlg = CIPHER_AES; DBGPRINT(RT_DEBUG_TRACE, ("%s : (AID#%d WepStatus=%s)\n", __FUNCTION__, pEntry->Aid, CipherName[CipherAlg])); } return StatusCode; }
/* ========================================================================== Description: Check validity of the received RSNIE. Return: status code ========================================================================== */ UINT APValidateRSNIE( IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, IN PUCHAR pRsnIe, IN UCHAR rsnie_len) { UINT StatusCode = MLME_SUCCESS; PEID_STRUCT eid_ptr; INT apidx; PMULTISSID_STRUCT pMbss; if (rsnie_len == 0) return MLME_SUCCESS; eid_ptr = (PEID_STRUCT)pRsnIe; if ((eid_ptr->Len + 2) != rsnie_len) { DBGPRINT(RT_DEBUG_ERROR, ("[ERROR]APValidateRSNIE : the len is invalid !!!\n")); return MLME_UNSPECIFY_FAIL; } apidx = pEntry->apidx; pMbss = &pAd->ApCfg.MBSSID[apidx]; #ifdef WAPI_SUPPORT if (eid_ptr->Eid == IE_WAPI) return MLME_SUCCESS; #endif /* WAPI_SUPPORT */ /* check group cipher */ if (!RTMPCheckMcast(pAd, eid_ptr, pEntry)) { DBGPRINT(RT_DEBUG_ERROR, ("[ERROR]APValidateRSNIE : invalid group cipher !!!\n")); StatusCode = MLME_INVALID_GROUP_CIPHER; } /* Check pairwise cipher */ else if (!RTMPCheckUcast(pAd, eid_ptr, pEntry)) { DBGPRINT(RT_DEBUG_ERROR, ("[ERROR]APValidateRSNIE : invalid pairwise cipher !!!\n")); StatusCode = MLME_INVALID_PAIRWISE_CIPHER; } /* Check AKM */ else if (!RTMPCheckAUTH(pAd, eid_ptr, pEntry)) { DBGPRINT(RT_DEBUG_ERROR, ("[ERROR]APValidateRSNIE : invalid AKM !!!\n")); StatusCode = MLME_INVALID_AKMP; } #ifdef DOT11W_PMF_SUPPORT else if (PMF_RsnCapableValidation(pAd, pRsnIe, rsnie_len, pMbss->PmfCfg.MFPC, pMbss->PmfCfg.MFPR, pEntry) != PMF_STATUS_SUCCESS) { DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s : Invalid PMF Capability !!!\n", __FUNCTION__)); StatusCode = MLME_ROBUST_MGMT_POLICY_VIOLATION; } #endif /* DOT11W_PMF_SUPPORT */ if (StatusCode != MLME_SUCCESS) { /* send wireless event - for RSN IE sanity check fail */ RTMPSendWirelessEvent(pAd, IW_RSNIE_SANITY_FAIL_EVENT_FLAG, pEntry->Addr, 0, 0); DBGPRINT(RT_DEBUG_ERROR, ("%s : invalid status code(%d) !!!\n", __FUNCTION__, StatusCode)); } else { UCHAR CipherAlg = CIPHER_NONE; if (pEntry->WepStatus == Ndis802_11WEPEnabled) CipherAlg = CIPHER_WEP64; else if (pEntry->WepStatus == Ndis802_11TKIPEnable) CipherAlg = CIPHER_TKIP; else if (pEntry->WepStatus == Ndis802_11AESEnable) CipherAlg = CIPHER_AES; DBGPRINT(RT_DEBUG_TRACE, ("%s : (AID#%d WepStatus=%s)\n", __FUNCTION__, pEntry->Aid, CipherName[CipherAlg])); } return StatusCode; }