142 lines
4.1 KiB
C
142 lines
4.1 KiB
C
/*
|
|
* Copyright (c) 1996, 2005 VIA Networking Technologies, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* 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.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
*
|
|
* File: IEEE11h.c
|
|
*
|
|
* Purpose:
|
|
*
|
|
* Functions:
|
|
*
|
|
* Revision History:
|
|
*
|
|
* Author: Yiching Chen
|
|
*
|
|
* Date: Mar. 31, 2005
|
|
*
|
|
*/
|
|
|
|
#include "ttype.h"
|
|
#include "tmacro.h"
|
|
#include "tether.h"
|
|
#include "IEEE11h.h"
|
|
#include "device.h"
|
|
#include "wmgr.h"
|
|
#include "rxtx.h"
|
|
#include "channel.h"
|
|
|
|
/*--------------------- Static Definitions -------------------------*/
|
|
|
|
#pragma pack(1)
|
|
|
|
typedef struct _WLAN_FRAME_ACTION {
|
|
WLAN_80211HDR_A3 Header;
|
|
unsigned char byCategory;
|
|
unsigned char byAction;
|
|
unsigned char abyVars[1];
|
|
} WLAN_FRAME_ACTION, *PWLAN_FRAME_ACTION;
|
|
|
|
typedef struct _WLAN_FRAME_MSRREQ {
|
|
WLAN_80211HDR_A3 Header;
|
|
unsigned char byCategory;
|
|
unsigned char byAction;
|
|
unsigned char byDialogToken;
|
|
WLAN_IE_MEASURE_REQ sMSRReqEIDs[1];
|
|
} WLAN_FRAME_MSRREQ, *PWLAN_FRAME_MSRREQ;
|
|
|
|
typedef struct _WLAN_FRAME_MSRREP {
|
|
WLAN_80211HDR_A3 Header;
|
|
unsigned char byCategory;
|
|
unsigned char byAction;
|
|
unsigned char byDialogToken;
|
|
WLAN_IE_MEASURE_REP sMSRRepEIDs[1];
|
|
} WLAN_FRAME_MSRREP, *PWLAN_FRAME_MSRREP;
|
|
|
|
typedef struct _WLAN_FRAME_TPCREQ {
|
|
WLAN_80211HDR_A3 Header;
|
|
unsigned char byCategory;
|
|
unsigned char byAction;
|
|
unsigned char byDialogToken;
|
|
WLAN_IE_TPC_REQ sTPCReqEIDs;
|
|
} WLAN_FRAME_TPCREQ, *PWLAN_FRAME_TPCREQ;
|
|
|
|
typedef struct _WLAN_FRAME_TPCREP {
|
|
WLAN_80211HDR_A3 Header;
|
|
unsigned char byCategory;
|
|
unsigned char byAction;
|
|
unsigned char byDialogToken;
|
|
WLAN_IE_TPC_REP sTPCRepEIDs;
|
|
} WLAN_FRAME_TPCREP, *PWLAN_FRAME_TPCREP;
|
|
|
|
#pragma pack()
|
|
|
|
/* action field reference ieee 802.11h Table 20e */
|
|
#define ACTION_MSRREQ 0
|
|
#define ACTION_MSRREP 1
|
|
#define ACTION_TPCREQ 2
|
|
#define ACTION_TPCREP 3
|
|
#define ACTION_CHSW 4
|
|
|
|
/*--------------------- Static Classes ----------------------------*/
|
|
|
|
/*--------------------- Static Variables --------------------------*/
|
|
|
|
/*--------------------- Static Functions --------------------------*/
|
|
|
|
/*--------------------- Export Variables --------------------------*/
|
|
|
|
/*--------------------- Export Functions --------------------------*/
|
|
|
|
bool IEEE11hbMSRRepTx(void *pMgmtHandle)
|
|
{
|
|
PSMgmtObject pMgmt = (PSMgmtObject) pMgmtHandle;
|
|
PWLAN_FRAME_MSRREP pMSRRep = (PWLAN_FRAME_MSRREP)
|
|
(pMgmt->abyCurrentMSRRep + sizeof(STxMgmtPacket));
|
|
size_t uLength = 0;
|
|
PSTxMgmtPacket pTxPacket = NULL;
|
|
|
|
pTxPacket = (PSTxMgmtPacket)pMgmt->abyCurrentMSRRep;
|
|
memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_A3FR_MAXLEN);
|
|
pTxPacket->p80211Header = (PUWLAN_80211HDR)((unsigned char *)pTxPacket +
|
|
sizeof(STxMgmtPacket));
|
|
|
|
pMSRRep->Header.wFrameCtl = (WLAN_SET_FC_FTYPE(WLAN_FTYPE_MGMT) |
|
|
WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_ACTION)
|
|
);
|
|
|
|
memcpy(pMSRRep->Header.abyAddr1, ((PWLAN_FRAME_MSRREQ)
|
|
(pMgmt->abyCurrentMSRReq))->Header.abyAddr2, WLAN_ADDR_LEN);
|
|
memcpy(pMSRRep->Header.abyAddr2,
|
|
CARDpGetCurrentAddress(pMgmt->pAdapter), WLAN_ADDR_LEN);
|
|
memcpy(pMSRRep->Header.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
|
|
|
|
pMSRRep->byCategory = 0;
|
|
pMSRRep->byAction = 1;
|
|
pMSRRep->byDialogToken = ((PWLAN_FRAME_MSRREQ)
|
|
(pMgmt->abyCurrentMSRReq))->byDialogToken;
|
|
|
|
uLength = pMgmt->uLengthOfRepEIDs + offsetof(WLAN_FRAME_MSRREP,
|
|
sMSRRepEIDs);
|
|
|
|
pTxPacket->cbMPDULen = uLength;
|
|
pTxPacket->cbPayloadLen = uLength - WLAN_HDR_ADDR3_LEN;
|
|
if (csMgmt_xmit(pMgmt->pAdapter, pTxPacket) != CMD_STATUS_PENDING)
|
|
return false;
|
|
return true;
|
|
}
|