⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sanity.c

📁 TP Link 321 Linux Driver
💻 C
📖 第 1 页 / 共 3 页
字号:
/* *************************************************************************** * Ralink Tech Inc. * 4F, No. 2 Technology	5th	Rd. * Science-based Industrial	Park * Hsin-chu, Taiwan, R.O.C. * * (c) Copyright 2002-2006, Ralink Technology, Inc. * * All rights reserved.	Ralink's source	code is	an unpublished work	and	the * use of a	copyright notice does not imply	otherwise. This	source code * contains	confidential trade secret material of Ralink Tech. Any attemp * or participation	in deciphering,	decoding, reverse engineering or in	any * way altering	the	source code	is stricitly prohibited, unless	the	prior * written consent of Ralink Technology, Inc. is obtained. ***************************************************************************	Module Name:	sanity.c	Abstract:	Revision History:	Who			When			What	--------	----------		----------------------------------------------	John Chang  2004-09-01      add WMM support*/#include "rt_config.h"#include <net/iw_handler.h>UCHAR	WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01};UCHAR	RSN_OUI[] = {0x00, 0x0f, 0xac};UCHAR   WME_INFO_ELEM[]  = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01};UCHAR   WME_PARM_ELEM[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};UCHAR   RALINK_OUI[]  = {0x00, 0x0c, 0x43};/*     ==========================================================================    Description:        MLME message sanity check    Return:        TRUE if all parameters are OK, FALSE otherwise    ========================================================================== */BOOLEAN MlmeScanReqSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,     OUT UCHAR *pBssType,     OUT CHAR Ssid[],     OUT UCHAR *pSsidLen,     OUT UCHAR *pScanType) {    MLME_SCAN_REQ_STRUCT *Info;    Info = (MLME_SCAN_REQ_STRUCT *)(Msg);    *pBssType = Info->BssType;    *pSsidLen = Info->SsidLen;    NdisMoveMemory(Ssid, Info->Ssid, *pSsidLen);    *pScanType = Info->ScanType;        if ((*pBssType == BSS_INFRA || *pBssType == BSS_ADHOC || *pBssType == BSS_ANY) &&       (*pScanType == SCAN_ACTIVE || *pScanType == FAST_SCAN_ACTIVE || *pScanType == SCAN_PASSIVE))         return TRUE;    else     {        DBGPRINT(RT_DEBUG_TRACE, "MlmeScanReqSanity fail - wrong BssType or ScanType\n");        return FALSE;    }}/*     ==========================================================================    Description:        MLME message sanity check    Return:        TRUE if all parameters are OK, FALSE otherwise    ========================================================================== */BOOLEAN MlmeStartReqSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,     OUT CHAR Ssid[],     OUT UCHAR *pSsidLen) {    MLME_START_REQ_STRUCT *Info;    Info = (MLME_START_REQ_STRUCT *)(Msg);        if (Info->SsidLen > MAX_LEN_OF_SSID)    {        DBGPRINT(RT_DEBUG_TRACE, "MlmeStartReqSanity fail - wrong SSID length\n");        return FALSE;    }    *pSsidLen = Info->SsidLen;    NdisMoveMemory(Ssid, Info->Ssid, *pSsidLen);    return TRUE;}/*     ==========================================================================    Description:        MLME message sanity check    Return:        TRUE if all parameters are OK, FALSE otherwise    ========================================================================== */BOOLEAN MlmeAssocReqSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,     OUT PUCHAR pApAddr,     OUT USHORT *pCapabilityInfo,     OUT ULONG *pTimeout,     OUT USHORT *pListenIntv) {    MLME_ASSOC_REQ_STRUCT *pInfo;    pInfo = (MLME_ASSOC_REQ_STRUCT *)Msg;    *pTimeout = pInfo->Timeout;                             // timeout    COPY_MAC_ADDR(pApAddr, pInfo->Addr);                   // AP address    *pCapabilityInfo = pInfo->CapabilityInfo;               // capability info    *pListenIntv = pInfo->ListenIntv;        return TRUE;}/*     ==========================================================================    Description:        MLME message sanity check    Return:        TRUE if all parameters are OK, FALSE otherwise    ========================================================================== */BOOLEAN MlmeAuthReqSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,     OUT PUCHAR pAddr,     OUT ULONG *pTimeout,     OUT USHORT *pAlg) {    MLME_AUTH_REQ_STRUCT *pInfo;    pInfo  = (MLME_AUTH_REQ_STRUCT *)Msg;    COPY_MAC_ADDR(pAddr, pInfo->Addr);    *pTimeout = pInfo->Timeout;    *pAlg = pInfo->Alg;        if (((*pAlg == Ndis802_11AuthModeShared) ||(*pAlg == Ndis802_11AuthModeOpen)) &&         ((*pAddr & 0x01) == 0))     {        return TRUE;    }     else     {        DBGPRINT(RT_DEBUG_TRACE, "MlmeAuthReqSanity fail - wrong algorithm\n");        return FALSE;    }}/*     ==========================================================================    Description:        MLME message sanity check    Return:        TRUE if all parameters are OK, FALSE otherwise    ========================================================================== */BOOLEAN PeerAssocRspSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *pMsg,     IN ULONG MsgLen,     OUT PUCHAR pAddr2,     OUT USHORT *pCapabilityInfo,     OUT USHORT *pStatus,     OUT USHORT *pAid,     OUT UCHAR SupRate[],     OUT UCHAR *pSupRateLen,    OUT UCHAR ExtRate[],     OUT UCHAR *pExtRateLen,    OUT PEDCA_PARM pEdcaParm){    CHAR          IeType, *Ptr;    PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg;    PEID_STRUCT   pEid;	ULONG		  Length = 0;        COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);    Ptr = pFrame->Octet;	Length += LENGTH_802_11;	            NdisMoveMemory(pCapabilityInfo, &pFrame->Octet[0], 2);	Length += 2;	    NdisMoveMemory(pStatus,         &pFrame->Octet[2], 2);	Length += 2;	    *pExtRateLen = 0;    pEdcaParm->bValid = FALSE;        if (*pStatus != MLME_SUCCESS)         return TRUE;        NdisMoveMemory(pAid, &pFrame->Octet[4], 2);	Length += 2;    // 	change Endian in RTMPFrameEndianChange() on big endian platform    //*pAid = le2cpu16(*pAid);        // TODO: check big endian issue &0x3fff    *pAid = (*pAid) & 0x3fff; // AID is low 14-bit            // -- get supported rates from payload and advance the pointer    IeType = pFrame->Octet[6];    *pSupRateLen = pFrame->Octet[7];    if ((IeType != IE_SUPP_RATES) || (*pSupRateLen > MAX_LEN_OF_SUPPORTED_RATES))    {        DBGPRINT(RT_DEBUG_TRACE, "PeerAssocRspSanity fail - wrong SupportedRates IE\n");        return FALSE;    }     else    		NdisMoveMemory(SupRate, &pFrame->Octet[8], *pSupRateLen);	Length = Length + 2 + *pSupRateLen;    // many AP implement proprietary IEs in non-standard order, we'd better    // tolerate mis-ordered IEs to get best compatibility    pEid = (PEID_STRUCT) &pFrame->Octet[8 + (*pSupRateLen)];                // get variable fields from payload and advance the pointer	while ((Length + 2 + pEid->Len) <= MsgLen)    {        switch (pEid->Eid)        {            case IE_EXT_SUPP_RATES:                if (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)                {                    NdisMoveMemory(ExtRate, pEid->Octet, pEid->Len);                    *pExtRateLen = pEid->Len;                }                break;							case IE_VENDOR_SPECIFIC:                // handle WME PARAMTER ELEMENT                if (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6) && (pEid->Len == 24))                {                    PUCHAR ptr;                    int i;                            // parsing EDCA parameters                    pEdcaParm->bValid          = TRUE;                    pEdcaParm->bQAck           = FALSE; // pEid->Octet[0] & 0x10;                    pEdcaParm->bQueueRequest   = FALSE; // pEid->Octet[0] & 0x20;                    pEdcaParm->bTxopRequest    = FALSE; // pEid->Octet[0] & 0x40;                    //pEdcaParm->bMoreDataAck    = FALSE; // pEid->Octet[0] & 0x80;                    pEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0x0f;                    ptr = &pEid->Octet[8];                    for (i=0; i<4; i++)                    {                        UCHAR aci = (*ptr & 0x60) >> 5; // b5~6 is AC INDEX                        pEdcaParm->bACM[aci]  = (((*ptr) & 0x10) == 0x10);   // b5 is ACM                        pEdcaParm->Aifsn[aci] = (*ptr) & 0x0f;               // b0~3 is AIFSN                        pEdcaParm->Cwmin[aci] = *(ptr+1) & 0x0f;             // b0~4 is Cwmin                        pEdcaParm->Cwmax[aci] = *(ptr+1) >> 4;               // b5~8 is Cwmax                        pEdcaParm->Txop[aci]  = *(ptr+2) + 256 * (*(ptr+3)); // in unit of 32-us                        ptr += 4; // point to next AC                    }                }                break;#if 0				            case IE_EDCA_PARAMETER:                if (pEid->Len == 18)                {                    PUCHAR ptr;                    int i;                    pEdcaParm->bValid          = TRUE;                    pEdcaParm->bQAck           = pEid->Octet[0] & 0x10;                    pEdcaParm->bQueueRequest   = pEid->Octet[0] & 0x20;                    pEdcaParm->bTxopRequest    = pEid->Octet[0] & 0x40;//                  pEdcaParm->bMoreDataAck    = pEid->Octet[0] & 0x80;                    pEdcaParm->EdcaUpdateCount = pEid->Octet[0] & 0x0f;                    ptr = &pEid->Octet[2];                    for (i=0; i<4; i++)                    {                        UCHAR aci = (*ptr & 0x60) >> 5; // b5~6 is AC INDEX                        pEdcaParm->bACM[aci]  = (((*ptr) & 0x10) == 0x10);   // b5 is ACM                        pEdcaParm->Aifsn[aci] = (*ptr) & 0x0f;               // b0~3 is AIFSN                        pEdcaParm->Cwmin[aci] = *(ptr+1) & 0x0f;             // b0~4 is Cwmin                        pEdcaParm->Cwmax[aci] = *(ptr+1) >> 4;               // b5~8 is Cwmax                        pEdcaParm->Txop[aci]  = *(ptr+2) + 256 * (*(ptr+3)); // in unit of 32-us                        ptr += 4; // point to next AC                    }                }                break;#endif            default:                DBGPRINT(RT_DEBUG_TRACE, "PeerAssocRspSanity - ignore unrecognized EID = %d\n", pEid->Eid);                break;        }                   		Length = Length + 2 + pEid->Len;        pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);            }    return TRUE;}/*     ==========================================================================    Description:        MLME message sanity check    Return:        TRUE if all parameters are OK, FALSE otherwise           ========================================================================== */BOOLEAN PeerDisassocSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,     OUT PUCHAR pAddr2,     OUT USHORT *pReason) {    PFRAME_802_11 pFrame = (PFRAME_802_11)Msg;    COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);    NdisMoveMemory(pReason, &pFrame->Octet[0], 2);    return TRUE;}/*     ==========================================================================    Description:        MLME message sanity check    Return:        TRUE if all parameters are OK, FALSE otherwise    ========================================================================== */BOOLEAN PeerDeauthSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,     OUT PUCHAR pAddr2,     OUT USHORT *pReason) {    PFRAME_802_11 pFrame = (PFRAME_802_11)Msg;    COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);    NdisMoveMemory(pReason, &pFrame->Octet[0], 2);    return TRUE;}/*     ==========================================================================    Description:        MLME message sanity check    Return:        TRUE if all parameters are OK, FALSE otherwise    ========================================================================== */BOOLEAN PeerAuthSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,     OUT PUCHAR pAddr,     OUT USHORT *pAlg,     OUT USHORT *pSeq,     OUT USHORT *pStatus,     CHAR *pChlgText) {    PFRAME_802_11 pFrame = (PFRAME_802_11)Msg;    COPY_MAC_ADDR(pAddr,   pFrame->Hdr.Addr2);    NdisMoveMemory(pAlg,    &pFrame->Octet[0], 2);    NdisMoveMemory(pSeq,    &pFrame->Octet[2], 2);    NdisMoveMemory(pStatus, &pFrame->Octet[4], 2);    if (*pAlg == Ndis802_11AuthModeOpen)    {        if (*pSeq == 1 || *pSeq == 2)         {            return TRUE;        }         else         {            DBGPRINT(RT_DEBUG_TRACE, "PeerAuthSanity fail - wrong Seg#\n");            return FALSE;        }    }     else if (*pAlg == Ndis802_11AuthModeShared)     {        if (*pSeq == 1 || *pSeq == 4)         {            return TRUE;        }         else if (*pSeq == 2 || *pSeq == 3)         {            NdisMoveMemory(pChlgText, &pFrame->Octet[8], CIPHER_TEXT_LEN);            return TRUE;        }         else         {            DBGPRINT(RT_DEBUG_TRACE, "PeerAuthSanity fail - wrong Seg#\n");            return FALSE;        }    }     else     {        DBGPRINT(RT_DEBUG_TRACE, "PeerAuthSanity fail - wrong algorithm\n");        return FALSE;    }}/*     ==========================================================================    Description:        MLME message sanity check    Return:        TRUE if all parameters are OK, FALSE otherwise    ========================================================================== */BOOLEAN PeerProbeReqSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,     OUT PUCHAR pAddr2,    OUT CHAR Ssid[],     OUT UCHAR *pSsidLen) {    UCHAR         Idx;	UCHAR	      RateLen;	CHAR          IeType;    PFRAME_802_11 pFrame = (PFRAME_802_11)Msg;    COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);    if ((pFrame->Octet[0] != IE_SSID) || (pFrame->Octet[1] > MAX_LEN_OF_SSID))     {        DBGPRINT(RT_DEBUG_TRACE, "PeerProbeReqSanity fail - wrong SSID IE(Type=%d,Len=%d)\n",pFrame->Octet[0],pFrame->Octet[1]);        return FALSE;    }         *pSsidLen = pFrame->Octet[1];    NdisMoveMemory(Ssid, &pFrame->Octet[2], *pSsidLen);    Idx = *pSsidLen + 2;	// -- get supported rates from payload and advance the pointer	IeType = pFrame->Octet[Idx];	RateLen = pFrame->Octet[Idx + 1];	if (IeType != IE_SUPP_RATES)     {        DBGPRINT(RT_DEBUG_TRACE, "PeerProbeReqSanity fail - wrong SupportRates IE(Type=%d,Len=%d)\n",pFrame->Octet[Idx],pFrame->Octet[Idx+1]);        return FALSE;    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -