149 lines
3.5 KiB
C
149 lines
3.5 KiB
C
|
|
/*
|
|
***************************************************************************
|
|
* 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.
|
|
***************************************************************************/
|
|
|
|
/****************************************************************************
|
|
Abstract:
|
|
|
|
***************************************************************************/
|
|
|
|
#ifdef DOT11K_RRM_SUPPORT
|
|
|
|
#include "rt_config.h"
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
|
|
Parametrs:
|
|
|
|
Return : None.
|
|
==========================================================================
|
|
*/
|
|
BOOLEAN RRM_PeerNeighborReqSanity(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN VOID *pMsg,
|
|
IN ULONG MsgLen,
|
|
OUT PUINT8 pDialogToken,
|
|
OUT PCHAR *pSsid,
|
|
OUT PUINT8 pSsidLen)
|
|
{
|
|
PFRAME_802_11 Fr = (PFRAME_802_11)pMsg;
|
|
PUCHAR pFramePtr = Fr->Octet;
|
|
BOOLEAN result = FALSE;
|
|
PEID_STRUCT eid_ptr;
|
|
PMAC_TABLE_ENTRY pEntry;
|
|
|
|
MsgLen -= sizeof(HEADER_802_11);
|
|
|
|
/* skip category and action code. */
|
|
pFramePtr += 2;
|
|
MsgLen -= 2;
|
|
|
|
if (pDialogToken == NULL)
|
|
return result;
|
|
|
|
pEntry = MacTableLookup(pAd, Fr->Hdr.Addr2);
|
|
if (pEntry->func_tb_idx > pAd->ApCfg.BssidNum)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
*pSsid = pAd->ApCfg.MBSSID[pEntry->func_tb_idx].Ssid;
|
|
*pSsidLen = pAd->ApCfg.MBSSID[pEntry->func_tb_idx].SsidLen;
|
|
|
|
result = TRUE;
|
|
NdisMoveMemory(pDialogToken, pFramePtr, 1);
|
|
pFramePtr += 1;
|
|
MsgLen -= 1;
|
|
|
|
eid_ptr = (PEID_STRUCT)pFramePtr;
|
|
while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen))
|
|
{
|
|
switch(eid_ptr->Eid)
|
|
{
|
|
case RRM_NEIGHBOR_REQ_SSID_SUB_ID:
|
|
*pSsid = (PCHAR)eid_ptr->Octet;
|
|
*pSsidLen = eid_ptr->Len;
|
|
break;
|
|
|
|
case RRM_NEIGHBOR_REQ_VENDOR_SUB_ID:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
BOOLEAN RRM_PeerMeasureReportSanity(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN VOID *pMsg,
|
|
IN ULONG MsgLen,
|
|
OUT PUINT8 pDialogToken,
|
|
OUT PMEASURE_REPORT_INFO pMeasureReportInfo,
|
|
OUT PVOID *pMeasureRep)
|
|
{
|
|
PFRAME_802_11 Fr = (PFRAME_802_11)pMsg;
|
|
PUCHAR pFramePtr = Fr->Octet;
|
|
BOOLEAN result = FALSE;
|
|
PEID_STRUCT eid_ptr;
|
|
|
|
/* skip 802.11 header. */
|
|
MsgLen -= sizeof(HEADER_802_11);
|
|
|
|
/* skip category and action code. */
|
|
pFramePtr += 2;
|
|
MsgLen -= 2;
|
|
|
|
if (pMeasureReportInfo == NULL)
|
|
return result;
|
|
|
|
NdisMoveMemory(pDialogToken, pFramePtr, 1);
|
|
pFramePtr += 1;
|
|
MsgLen -= 1;
|
|
|
|
eid_ptr = (PEID_STRUCT)pFramePtr;
|
|
while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen))
|
|
{
|
|
switch(eid_ptr->Eid)
|
|
{
|
|
case IE_MEASUREMENT_REPORT:
|
|
NdisMoveMemory(&pMeasureReportInfo->Token, eid_ptr->Octet, 1);
|
|
NdisMoveMemory(&pMeasureReportInfo->ReportMode, eid_ptr->Octet + 1, 1);
|
|
NdisMoveMemory(&pMeasureReportInfo->ReportType, eid_ptr->Octet + 2, 1);
|
|
*pMeasureRep = (PVOID)(eid_ptr->Octet + 3);
|
|
result = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
#endif /* DOT11K_RRM_SUPPORT */
|
|
|