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

📄 80211mgr.c

📁 VIA VT6655 x86下的Linux Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
 * All rights reserved.
 *
 * This software is copyrighted by and is the sole property of
 * VIA Networking Technologies, Inc. This software may only be used
 * in accordance with the corresponding license agreement. Any unauthorized
 * use, duplication, transmission, distribution, or disclosure of this
 * software is expressly forbidden.
 *
 * This software is provided by VIA Networking Technologies, Inc. "as is"
 * and any express or implied warranties, including, but not limited to, the
 * implied warranties of merchantability and fitness for a particular purpose
 * are disclaimed. In no event shall VIA Networking Technologies, Inc.
 * be liable for any direct, indirect, incidental, special, exemplary, or
 * consequential damages. 
 *
 * File: 80211mgr.c
 *
 * Purpose: Handles the 802.11 managment support functions
 *
 * Author: Lyndon Chen
 *
 * Date: May 8, 2002
 *
 * Functions:
 *      vMgrEncodeBeacon - Encode the Beacon frame
 *      vMgrDecodeBeacon - Decode the Beacon frame
 *      vMgrEncodeIBSSATIM - Encode the IBSS ATIM frame
 *      vMgrDecodeIBSSATIM - Decode the IBSS ATIM frame
 *      vMgrEncodeDisassociation - Encode the Disassociation frame
 *      vMgrDecodeDisassociation - Decode the Disassociation frame
 *      vMgrEncodeAssocRequest - Encode the Association request frame
 *      vMgrDecodeAssocRequest - Decode the Association request frame
 *      vMgrEncodeAssocResponse - Encode the Association response frame
 *      vMgrDecodeAssocResponse - Decode the Association response frame
 *      vMgrEncodeReAssocRequest - Encode the ReAssociation request frame
 *      vMgrDecodeReAssocRequest - Decode the ReAssociation request frame
 *      vMgrEncodeProbeRequest - Encode the Probe request frame
 *      vMgrDecodeProbeRequest - Decode the Probe request frame
 *      vMgrEncodeProbeResponse - Encode the Probe response frame
 *      vMgrDecodeProbeResponse - Decode the Probe response frame
 *      vMgrEncodeAuthen - Encode the Authentication frame
 *      vMgrDecodeAuthen - Decode the Authentication frame
 *      vMgrEncodeDeauthen - Encode the DeAuthentication frame
 *      vMgrDecodeDeauthen - Decode the DeAuthentication frame
 *      vMgrEncodeReassocResponse - Encode the Reassociation response frame
 *      vMgrDecodeReassocResponse - Decode the Reassociation response frame
 *
 * Revision History:
 *
 */



#if !defined(__TMACRO_H__)
#include "tmacro.h"
#endif
#if !defined(__TETHER_H__)
#include "tether.h"
#endif
#if !defined(__80211MGR_H__)
#include "80211mgr.h"
#endif
#if !defined(__80211HDR_H__)
#include "80211hdr.h"
#endif
#if !defined(__DEVICE_H__)
#include "device.h"
#endif
#if !defined(__WPA_H__)
#include "wpa.h"
#endif



/*---------------------  Static Definitions -------------------------*/



/*---------------------  Static Classes  ----------------------------*/

/*---------------------  Static Variables  --------------------------*/

static int          msglevel                =MSG_LEVEL_INFO;
//static int          msglevel                =MSG_LEVEL_DEBUG;
/*---------------------  Static Functions  --------------------------*/



/*---------------------  Export Variables  --------------------------*/


/*---------------------  Export Functions  --------------------------*/


/*+
 * 
 * Routine Description:
 * Encode Beacon frame body offset
 *
 * Return Value:
 *    None.
 *
-*/        

VOID
vMgrEncodeBeacon(
    IN  PWLAN_FR_BEACON  pFrame
     )
{
    pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

    // Fixed Fields
    pFrame->pqwTimestamp = (PQWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                                    + WLAN_BEACON_OFF_TS);
    pFrame->pwBeaconInterval = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 
                                       + WLAN_BEACON_OFF_BCN_INT);
    pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 
                                + WLAN_BEACON_OFF_CAPINFO);
                                
    pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_BEACON_OFF_SSID;

    return;
}

/*+
 * 
 * Routine Description:
 * Decode Beacon frame body offset
 *
 *
 * Return Value:
 *    None.
 *
-*/        


VOID
vMgrDecodeBeacon(
    IN  PWLAN_FR_BEACON  pFrame 
    )
{
    PWLAN_IE        pItem;

    pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

    // Fixed Fields
    pFrame->pqwTimestamp = (PQWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                                    + WLAN_BEACON_OFF_TS);
    pFrame->pwBeaconInterval = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 
                                       + WLAN_BEACON_OFF_BCN_INT);
    pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                                + WLAN_BEACON_OFF_CAPINFO);

    // Information elements
    pItem = (PWLAN_IE)((PBYTE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))) 
                       + WLAN_BEACON_OFF_SSID);
    while( ((PBYTE)pItem) < (pFrame->pBuf + pFrame->len) ){
        
        switch (pItem->byElementID) {
            case WLAN_EID_SSID:
                if (pFrame->pSSID == NULL) 
                    pFrame->pSSID = (PWLAN_IE_SSID)pItem;
                break;
            case WLAN_EID_SUPP_RATES:
                if (pFrame->pSuppRates == NULL)
                    pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
                break;
            case WLAN_EID_FH_PARMS:
                //pFrame->pFHParms = (PWLAN_IE_FH_PARMS)pItem;
                break;
            case WLAN_EID_DS_PARMS:
                if (pFrame->pDSParms == NULL)            
                    pFrame->pDSParms = (PWLAN_IE_DS_PARMS)pItem;
                break;
            case WLAN_EID_CF_PARMS:
                if (pFrame->pCFParms == NULL)
                    pFrame->pCFParms = (PWLAN_IE_CF_PARMS)pItem;
                break;
            case WLAN_EID_IBSS_PARMS:
                if (pFrame->pIBSSParms == NULL)
                    pFrame->pIBSSParms = (PWLAN_IE_IBSS_PARMS)pItem;
                break;
            case WLAN_EID_TIM:
                if (pFrame->pTIM == NULL) 
                    pFrame->pTIM = (PWLAN_IE_TIM)pItem;
                break;
                
            case WLAN_EID_RSN:
                if (pFrame->pRSN == NULL) {
                    pFrame->pRSN = (PWLAN_IE_RSN)pItem;
                }
                break;
            case WLAN_EID_RSN_WPA:
                if (pFrame->pRSNWPA == NULL) {
                    if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == TRUE)
                        pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem;
                }
                break;                
                
            case WLAN_EID_ERP:
                if (pFrame->pERP == NULL)
                    pFrame->pERP = (PWLAN_IE_ERP)pItem;
                break;
            case WLAN_EID_EXTSUPP_RATES:
                if (pFrame->pExtSuppRates == NULL)
                    pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
                break;
                
            case WLAN_EID_COUNTRY:      //7
                if (pFrame->pIE_Country == NULL)
                    pFrame->pIE_Country = (PWLAN_IE_COUNTRY)pItem;
                break;
                
            case WLAN_EID_PWR_CONSTRAINT:   //32
                if (pFrame->pIE_PowerConstraint == NULL)
                    pFrame->pIE_PowerConstraint = (PWLAN_IE_PW_CONST)pItem;
                break;
                
            case WLAN_EID_CH_SWITCH:    //37
                if (pFrame->pIE_CHSW == NULL)
                    pFrame->pIE_CHSW = (PWLAN_IE_CH_SW)pItem;
                break;
                
            case WLAN_EID_QUIET:        //40 
                if (pFrame->pIE_Quiet == NULL)
                    pFrame->pIE_Quiet = (PWLAN_IE_QUIET)pItem;
                break;                           
            
            case WLAN_EID_IBSS_DFS:
                if (pFrame->pIE_IBSSDFS == NULL)
                    pFrame->pIE_IBSSDFS = (PWLAN_IE_IBSS_DFS)pItem;
                break;                

            default:
                DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in beacon decode.\n", pItem->byElementID);
                break;
                
        }
        pItem = (PWLAN_IE)(((PBYTE)pItem) + 2 + pItem->len);
    }
    
    return;
}


/*+
 * 
 * Routine Description:
 *  Encode IBSS ATIM
 *
 *
 * Return Value:
 *    None.
 *
-*/        


VOID
vMgrEncodeIBSSATIM(
    IN  PWLAN_FR_IBSSATIM   pFrame
    )
{
    pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
    pFrame->len = WLAN_HDR_ADDR3_LEN;

    return;
}


/*+
 * 
 * Routine Description:
 *  Decode IBSS ATIM
 *
 *
 * Return Value:
 *    None.
 *
-*/

VOID
vMgrDecodeIBSSATIM(
    IN  PWLAN_FR_IBSSATIM   pFrame
    )
{
    pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

    return;
}


/*+
 * 
 * Routine Description:
 *  Encode Disassociation
 *
 *
 * Return Value:
 *    None.
 *
-*/

VOID
vMgrEncodeDisassociation(
    IN  PWLAN_FR_DISASSOC  pFrame
    )
{
    pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;


    // Fixed Fields 
    pFrame->pwReason = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) 
                               + WLAN_DISASSOC_OFF_REASON);
    pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_DISASSOC_OFF_REASON + sizeof(*(pFrame->pwReason));

    return;
}


/*+
 * 
 * Routine Description:
 *  Decode Disassociation
 *
 *
 * Return Value:
 *    None.
 *
-*/

VOID
vMgrDecodeDisassociation(
    IN  PWLAN_FR_DISASSOC  pFrame
    )
{
    pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
    
    // Fixed Fields 
    pFrame->pwReason = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                               + WLAN_DISASSOC_OFF_REASON);

    return;
}

/*+
 * 
 * Routine Description:
 *  Encode Association Request
 *
 *
 * Return Value:
 *    None.
 *
-*/


VOID
vMgrEncodeAssocRequest(
    IN  PWLAN_FR_ASSOCREQ  pFrame
    )
{
    pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
    // Fixed Fields 
    pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                                + WLAN_ASSOCREQ_OFF_CAP_INFO);
    pFrame->pwListenInterval = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                                       + WLAN_ASSOCREQ_OFF_LISTEN_INT);
    pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_ASSOCREQ_OFF_LISTEN_INT + sizeof(*(pFrame->pwListenInterval));
    return;
}


/*+
 * 
 * Routine Description: (AP)
 *  Decode Association Request
 *
 *
 * Return Value:
 *    None.
 *
-*/

VOID 
vMgrDecodeAssocRequest(
    IN  PWLAN_FR_ASSOCREQ  pFrame
    )
{
    PWLAN_IE   pItem; 

    pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
    // Fixed Fields 
    pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                                + WLAN_ASSOCREQ_OFF_CAP_INFO);
    pFrame->pwListenInterval = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                                + WLAN_ASSOCREQ_OFF_LISTEN_INT);

    // Information elements
    pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                            + WLAN_ASSOCREQ_OFF_SSID);
                            
    while (((PBYTE)pItem) < (pFrame->pBuf + pFrame->len)) {
        switch (pItem->byElementID){
            case WLAN_EID_SSID:
                if (pFrame->pSSID == NULL)
                    pFrame->pSSID = (PWLAN_IE_SSID)pItem;
                break;
            case WLAN_EID_SUPP_RATES:
                if (pFrame->pSuppRates == NULL)
                    pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
                break;
                
            case WLAN_EID_RSN:
                if (pFrame->pRSN == NULL) {
                    pFrame->pRSN = (PWLAN_IE_RSN)pItem;
                }
                break;
            case WLAN_EID_RSN_WPA:
                if (pFrame->pRSNWPA == NULL) {
                    if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == TRUE)
                        pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem;
                }
                break;                
            case WLAN_EID_EXTSUPP_RATES:
                if (pFrame->pExtSuppRates == NULL)            
                    pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
                break;                
                
            default:
                DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in assocreq decode.\n",
                        pItem->byElementID);
                break;
        }
        pItem = (PWLAN_IE)(((PBYTE)pItem) + 2 + pItem->len);
    }
    return;
}

/*+
 * 
 * Routine Description: (AP)
 *  Encode Association Response 
 *
 *
 * Return Value:
 *    None.
 *
-*/

VOID
vMgrEncodeAssocResponse(
    IN  PWLAN_FR_ASSOCRESP  pFrame
     )
{
    pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
    
    // Fixed Fields 
    pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                                + WLAN_ASSOCRESP_OFF_CAP_INFO);
    pFrame->pwStatus = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                               + WLAN_ASSOCRESP_OFF_STATUS);
    pFrame->pwAid = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                            + WLAN_ASSOCRESP_OFF_AID);
    pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_ASSOCRESP_OFF_AID
                  + sizeof(*(pFrame->pwAid));

    return;
}


/*+
 * 
 * Routine Description: 
 *  Decode Association Response 
 *
 *
 * Return Value:
 *    None.
 *
-*/

VOID
vMgrDecodeAssocResponse(
    IN PWLAN_FR_ASSOCRESP  pFrame
     )
{
    PWLAN_IE   pItem;    

    pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;

    // Fixed Fields 
    pFrame->pwCapInfo = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                                + WLAN_ASSOCRESP_OFF_CAP_INFO);
    pFrame->pwStatus = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                               + WLAN_ASSOCRESP_OFF_STATUS);
    pFrame->pwAid = (PWORD)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                            + WLAN_ASSOCRESP_OFF_AID);

    // Information elements 
    pFrame->pSuppRates  = (PWLAN_IE_SUPP_RATES)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
                           + WLAN_ASSOCRESP_OFF_SUPP_RATES);
                           
    pItem = (PWLAN_IE)(pFrame->pSuppRates);
    pItem = (PWLAN_IE)(((PBYTE)pItem) + 2 + pItem->len);

    if ((((PBYTE)pItem) < (pFrame->pBuf + pFrame->len)) && (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) {
        pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pFrame->pExtSuppRates=[%p].\n", pItem);
    }
    else {
        pFrame->pExtSuppRates = NULL;
    }        
    return;
}


/*+
 * 
 * Routine Description: 
 *  Encode Reassociation Request
 *
 *

⌨️ 快捷键说明

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