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

📄 sanity.c

📁 r73模块的无线网卡在Linux下的驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/*************************************************************************** * RT2x00 SourceForge Project - http://rt2x00.serialmonkey.com             * *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * *   This program is distributed in the hope that it will be useful,       * *   but WITHOUT ANY WARRANTY; without even the implied warranty of        * *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         * *   GNU General Public License for more details.                          * *                                                                         * *   You should have received a copy of the GNU General Public License     * *   along with this program; if not, write to the                         * *   Free Software Foundation, Inc.,                                       * *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             * *                                                                         * *   Licensed under the GNU GPL                                            * *   Original code supplied under license from RaLink Inc, 2004.           * ***************************************************************************//*************************************************************************** *	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};UCHAR   WSC_OUI[] = {0x00, 0x50, 0xf2, 0x04};/*    ==========================================================================    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;    memcpy(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;    memcpy(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;	*pCapabilityInfo = *(USHORT *)(&pFrame->Octet[0]);	Length += 2;	*pStatus = *(USHORT *)(&pFrame->Octet[2]);	Length += 2;    *pExtRateLen = 0;    pEdcaParm->bValid = FALSE;    if (*pStatus != MLME_SUCCESS)        return TRUE;	*pAid = *(USHORT *)(&pFrame->Octet[4]);	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   		memcpy(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)                {                    memcpy(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);	*pReason = *(USHORT *)(&pFrame->Octet[0]);    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);	*pReason = *(USHORT *)(&pFrame->Octet[0]);    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);	*pAlg = *(USHORT *)(&pFrame->Octet[0]);	*pSeq = *(USHORT *)(&pFrame->Octet[2]);	*pStatus = *(USHORT *)(&pFrame->Octet[4]);    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)        {            memcpy(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];    memcpy(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;    }	else	{

⌨️ 快捷键说明

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