6532 lines
168 KiB
C
6532 lines
168 KiB
C
/****************************************************************************
|
|
* Ralink Tech Inc.
|
|
* Taiwan, R.O.C.
|
|
*
|
|
* (c) Copyright 2002, 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:
|
|
|
|
All related WMM ACM IOCTL function body.
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
/* ----- Compile Option ------ */
|
|
/* #ifdef RELEASE_EXCLUDE */
|
|
#define IEEE80211E_SIMULATION
|
|
/* #endif */
|
|
|
|
#include "rt_config.h"
|
|
|
|
#ifdef WMM_ACM_SUPPORT
|
|
|
|
/* IEEE802.11E related include files */
|
|
#include "acm_extr.h" /* used for other modules */
|
|
#include "acm_comm.h" /* used for edca/wmm */
|
|
#include "acm_edca.h" /* used for edca/wmm */
|
|
|
|
|
|
|
|
/* ----- Local Definition ------ */
|
|
#define ACM_QOS_SANITY_CHECK(__pAd) \
|
|
if (__pAd == NULL) \
|
|
{ \
|
|
ACMR_DEBUG(ACMR_DEBUG_ERR, ("err> __pAd == NULL!\n")); \
|
|
return; \
|
|
}
|
|
|
|
#define ACM_ARGC_SANITY_CHECK(__Min, __Max) \
|
|
if ((Argc != __Min) && (Argc != __Max)) \
|
|
{ \
|
|
ACMR_DEBUG(ACMR_DEBUG_ERR, ("acm_err> parameters number error!\n"));\
|
|
return; \
|
|
}
|
|
|
|
#define ACM_IN_SANITY_CHECK(__Condition, __Msg) \
|
|
if (__Condition) \
|
|
{ \
|
|
ACMR_DEBUG(ACMR_DEBUG_ERR, __Msg); \
|
|
goto LabelErr; \
|
|
}
|
|
|
|
#define ACM_NIN_DEC_GET(__Src, __Max, __MsgErr) \
|
|
{ \
|
|
__Src = AcmCmdUtilNumGet(&pArgv); \
|
|
ACM_IN_SANITY_CHECK((__Src > __Max), __MsgErr); \
|
|
}
|
|
|
|
#define ACM_NIN_DEC_MGET(__Src, __Min, __Max, __MsgErr) \
|
|
{ \
|
|
__Src = AcmCmdUtilNumGet(&pArgv); \
|
|
ACM_IN_SANITY_CHECK((__Src < __Min) || (__Src > __Max), __MsgErr); \
|
|
}
|
|
|
|
#define ACM_RANGE_SANITY_CHECK(__Range, __Min, __Max, __MsgErr) \
|
|
{ \
|
|
ACM_IN_SANITY_CHECK((__Range < __Min) || (__Range > __Max), __MsgErr);\
|
|
}
|
|
|
|
#define ACM_RATE_MAX ((UINT32)300000000) /* 300Mbps */
|
|
|
|
#ifdef IEEE80211E_SIMULATION
|
|
typedef struct _ACM_DATA_SIM {
|
|
|
|
UCHAR MacSrc[6];
|
|
UCHAR MacDst[6];
|
|
|
|
UCHAR Direction; /* 0: receive; 1:transmit */
|
|
UCHAR Type; /* 0: 11e; 1: WME */
|
|
UCHAR TID; /* 0 ~ 7 */
|
|
UCHAR AckPolicy; /* 0: normal ACK; 1: no ACK */
|
|
|
|
UINT32 FrameSize; /* data size */
|
|
UINT32 FlgIsValidEntry; /* 1: valid; 0: invalid */
|
|
|
|
UINT16 NumSeq:12;
|
|
UINT16 NumFrag:4;
|
|
} ACM_DATA_SIM;
|
|
|
|
static UINT32 gSimDelay = 0;
|
|
static UINT32 gSimDelayCount;
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
|
|
|
|
/* ----- Extern Variable ----- */
|
|
#ifdef ACM_MEMORY_TEST
|
|
extern UINT32 gAcmMemAllocNum;
|
|
extern UINT32 gAcmMemFreeNum;
|
|
#endif /* ACM_MEMORY_TEST */
|
|
|
|
extern UCHAR gAcmTestFlag;
|
|
|
|
extern VOID ap_cmm_peer_assoc_req_action(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN MLME_QUEUE_ELEM *Elem,
|
|
IN BOOLEAN isReassoc);
|
|
|
|
|
|
/* ----- Private Variable ----- */
|
|
#ifdef ACM_CC_FUNC_TCLAS
|
|
static ACM_TCLAS gCMD_TCLAS_Group[ACM_TSPEC_TCLAS_MAX_NUM];
|
|
#else
|
|
static ACM_TCLAS *gCMD_TCLAS_Group; /* no TCLAS function */
|
|
#endif /* ACM_CC_FUNC_TCLAS */
|
|
|
|
static UINT32 gTLS_Grp_ID;
|
|
|
|
#define SIM_AP_NAME "SampleACMAP"
|
|
|
|
#ifdef IEEE80211E_SIMULATION
|
|
static UCHAR gMAC_STA[6] = { 0x00, 0x0e, 0x2e, 0x82, 0xe7, 0x6d };
|
|
static UCHAR gMAC_AP[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x01 };
|
|
|
|
static UCHAR gSimTCPFlag;
|
|
static UCHAR gSimTCPDSCP;
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
static UCHAR gDialogToken;
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
ACMR_OS_TASK_STRUCT gTaskletSim;
|
|
ACMR_OS_TIMER_STRUCT gTimerSim;
|
|
|
|
static UINT32 gTaskDataSleep;
|
|
static ACMR_OS_SPIN_LOCK gSpinLockSim;
|
|
|
|
static BOOLEAN gCmdFlgIsInit;
|
|
|
|
#define ACM_DATA_SEM_LOCK(LabelSemErr) \
|
|
do { ACMR_OS_SPIN_LOCK_BH(&gSpinLockSim); \
|
|
if (0) goto LabelSemErr; } while(0);
|
|
|
|
#define ACM_DATA_SEM_UNLOCK() \
|
|
do { ACMR_OS_SPIN_UNLOCK_BH(&gSpinLockSim); } while(0);
|
|
|
|
#define ACM_MAX_NUM_OF_SIM_DATA_FLOW 5
|
|
static ACM_DATA_SIM gDATA_Sim[ACM_MAX_NUM_OF_SIM_DATA_FLOW];
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
|
|
/* ----- Private Function ----- */
|
|
#define ACM_CMD_INPUT_PARAM_DECLARATION \
|
|
PRTMP_ADAPTER pAd, INT32 Argc, CHAR *pArgv
|
|
|
|
VOID AcmCmdTclasReset(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
VOID AcmCmdTclasCreate(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
VOID AcmCmdStreamTSRequest(ACM_CMD_INPUT_PARAM_DECLARATION, UINT16 DialogToken);
|
|
VOID AcmCmdStreamTSRequestAdvance(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
static VOID AcmCmdBandwidthDisplay(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdStreamDisplay(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdStreamFailDisplay(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdEDCAParamDisplay(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
static VOID AcmCmdDATLEnable(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
static VOID AcmCmdAcmFlagCtrl(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
VOID AcmCmdDeltsSend(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdStreamFailClear(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
static VOID AcmCmdStreamTSNegotiate(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
static VOID AcmCmdUapsdDisplay(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
static VOID AcmCmdTspecReject(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
static VOID AcmCmdStatistics(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
static VOID AcmCmdReAssociate(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
static VOID AcmCmdTspecTimeoutCtrl(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
static VOID AcmCmdTspecUapsdCtrl(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdAssociate(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
#ifdef ACM_CC_FUNC_ACL
|
|
static VOID AcmCmdAclAdd(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdAclDel(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdAclCtrl(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#endif /* ACM_CC_FUNC_ACL */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
|
|
/* ----- Simulation Function ----- */
|
|
#ifdef IEEE80211E_SIMULATION
|
|
static VOID AcmCmdSimAssocBuild(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimReqRcv(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimDel(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimDataRv(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimDataTx(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimDataStop(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimDataSuspend(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimDataResume(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimReAssocBuild(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimNonQoSAssocBuild(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimNonQoSDataRv(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimRateSet(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimTcpTxEnable(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimStaMacSet(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
static VOID AcmCmdSimRcvTriFrame(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimUapsdQueCtrl(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimReqAdvanceRcv(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
static VOID AcmCmdSimStaAssoc(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimWmeReqTx(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimWmeNeqTx(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimWmeReqFail(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimWmeNegFail(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimWmeAcmReset(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
static VOID AcmCmdSimWmePSEnter(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
static VOID AcmCmdSimReqPsPollRcv(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
|
|
static VOID AcmCmdTestFlagCtrl(ACM_CMD_INPUT_PARAM_DECLARATION);
|
|
|
|
|
|
/* ----- Utility Function ----- */
|
|
static UINT32 AcmCmdUtilHexGet(CHAR **ppArgv);
|
|
static UINT32 AcmCmdUtilNumGet(CHAR **ppArgv);
|
|
static VOID AcmCmdUtilMacGet(CHAR **ppArgv, UCHAR *pDevMac);
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
#ifdef ACM_CC_FUNC_TCLAS
|
|
static UINT32 AcmCmdUtilIpGet(CHAR **ppArgv);
|
|
static VOID AcmCmdUtilNumHexGet(CHAR **ppArgv, UCHAR *pHex, UINT32 Size);
|
|
#endif /* ACM_CC_FUNC_TCLAS */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
static VOID AcmCmdStreamDisplayOne(PRTMP_ADAPTER pAd,
|
|
ACM_STREAM_INFO *pStream);
|
|
|
|
UCHAR AcmCmdInfoParse(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN CHAR **ppArgv,
|
|
ACM_PARAM_IN ACM_TSPEC *pTspec,
|
|
ACM_PARAM_IN ACM_TS_INFO *pInfo,
|
|
ACM_PARAM_IN UCHAR *pStreamType);
|
|
|
|
UCHAR AcmCmdInfoParseAdvance(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN CHAR **ppArgv,
|
|
ACM_PARAM_IN ACM_TSPEC *pTspec,
|
|
ACM_PARAM_IN ACM_TS_INFO *pInfo,
|
|
ACM_PARAM_IN UCHAR *pStreamType);
|
|
|
|
#ifdef IEEE80211E_SIMULATION
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
static VOID AcmApMgtMacHeaderInit(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN ACMR_WLAN_HEADER *pHdr,
|
|
ACM_PARAM_IN UCHAR SubType,
|
|
ACM_PARAM_IN UCHAR BitToDs,
|
|
ACM_PARAM_IN UCHAR *pMacDa,
|
|
ACM_PARAM_IN UCHAR *pBssid);
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
static UINT32 ACM_CMD_WME_Action_Make(PRTMP_ADAPTER pAd,
|
|
ACM_STREAM_INFO *pStream,
|
|
UCHAR *pPkt,
|
|
UCHAR Action,
|
|
UCHAR StatusCode,
|
|
UCHAR TclasProcessing);
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
static VOID ACM_CMD_Task_Data_Simulation(ULONG Data);
|
|
static VOID ACM_CMD_Sim_Data_Rv(PRTMP_ADAPTER pAd, ACM_DATA_SIM *pInfo);
|
|
static VOID ACM_CMD_Sim_nonQoS_Data_Rv(PRTMP_ADAPTER pAd, ACM_DATA_SIM *pInfo);
|
|
static VOID ACM_CMD_Sim_Data_Tx(PRTMP_ADAPTER pAd, ACM_DATA_SIM *pInfo);
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
|
|
|
|
|
|
|
|
/* =========================== Public Function =========================== */
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Init command related global parameters.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
VOID ACM_CMD_Init(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd)
|
|
{
|
|
#ifdef IEEE80211E_SIMULATION
|
|
ACMR_LOCK_INIT(pAd, &gSpinLockSim);
|
|
ACMR_TIMER_INIT(pAd, gTimerSim, ACMP_CMD_Timer_Data_Simulation, pAd);
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
} /* End of ACM_CMD_Init */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Release command related global parameters.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
VOID ACM_CMD_Release(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd)
|
|
{
|
|
#ifdef IEEE80211E_SIMULATION
|
|
AcmCmdSimDataStop(pAd, 0, NULL);
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
|
|
ACMR_LOCK_FREE(&gSpinLockSim);
|
|
} /* End of ACM_CMD_Release */
|
|
|
|
|
|
|
|
|
|
/* =========================== Private Function =========================== */
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Reset all TCLAS settings.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QSTA.
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdTclasReset(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
gTLS_Grp_ID = 0;
|
|
} /* End of AcmCmdTclasReset */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Create a TCLAS for the future stream.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QSTA.
|
|
2. Max 5 TCLAS for a stream.
|
|
3. Users need to create TCLAS first. Then create a stream later.
|
|
If users want to create another stream, users
|
|
shall reset all TCLAS and re-create TCLAS for another stream use.
|
|
4. Command Format:
|
|
wstclasadd [up:0~7] [type:0~2] [mask:hex]
|
|
|
|
wstclasadd [8] [up:0~7] [mask] [DST MAC] [SRC MAC] [Type/Length]
|
|
wstclasadd [9] [up:0~7] [mask] [Version] [SRC IP] [DST IP]
|
|
[SRC PORT] [DST PORT] [DSCP] [Protocol]
|
|
wstclasadd [10] [up:0~7] [mask] [VLAN TAG/Type]
|
|
|
|
08_04_07_00:11:22:33:44:55_00:22:33:44:55:66_0800
|
|
09_06_7F_4_192.168.0.1_192.168.0.2_100_200_E0_17
|
|
10_01_01_23
|
|
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdTclasCreate(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
#ifdef ACM_CC_FUNC_TCLAS
|
|
ACM_TCLAS *pTclas;
|
|
UINT32 TclasLen[ACM_TSPEC_TCLAS_MAX_NUM+1] = { ACM_TCLAS_TYPE_ETHERNET_LEN,
|
|
ACM_TCLAS_TYPE_IP_V4_LEN,
|
|
ACM_TCLAS_TYPE_8021DQ_LEN };
|
|
UCHAR *pClassifier;
|
|
UINT32 IdByteNum;
|
|
UINT32 UpOrClas;
|
|
|
|
|
|
if (gTLS_Grp_ID >= ACM_TSPEC_TCLAS_MAX_NUM)
|
|
{
|
|
ACMR_DEBUG(ACMR_DEBUG_ERR,
|
|
("\nErr> max TCLAS number is reached! "
|
|
"Pls. reset the number first!\n"));
|
|
return;
|
|
} /* End of if */
|
|
|
|
UpOrClas = AcmCmdUtilNumGet(&pArgv);
|
|
pTclas = &gCMD_TCLAS_Group[gTLS_Grp_ID];
|
|
|
|
if (UpOrClas < ACM_UP_MAX)
|
|
{
|
|
pTclas->UserPriority = UpOrClas;
|
|
pTclas->ClassifierType = AcmCmdUtilNumGet(&pArgv);
|
|
pTclas->ClassifierMask = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
pClassifier = (UCHAR *)&pTclas->Clasifier;
|
|
for(IdByteNum=0; IdByteNum<(TclasLen[pTclas->ClassifierType]-3); IdByteNum++)
|
|
*pClassifier ++ = AcmCmdUtilHexGet(&pArgv);
|
|
/* End of for */
|
|
}
|
|
else
|
|
{
|
|
pTclas->UserPriority = AcmCmdUtilNumGet(&pArgv);
|
|
pTclas->ClassifierType = UpOrClas - ACM_UP_MAX; /* 0 ~ 2 */
|
|
pTclas->ClassifierMask = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
switch(pTclas->ClassifierType)
|
|
{
|
|
case ACM_TCLAS_TYPE_ETHERNET:
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\nAdd a ethernet TCLAS: UP (%d), Mask (0x%02x)\n",
|
|
pTclas->UserPriority, pTclas->ClassifierMask));
|
|
|
|
AcmCmdUtilMacGet(&pArgv, pTclas->Clasifier.Ethernet.AddrDst);
|
|
AcmCmdUtilMacGet(&pArgv, pTclas->Clasifier.Ethernet.AddrSrc);
|
|
AcmCmdUtilNumHexGet(&pArgv,
|
|
(UCHAR *)&pTclas->Clasifier.Ethernet.Type, 2);
|
|
|
|
#ifndef RT_BIG_ENDIAN
|
|
pTclas->Clasifier.Ethernet.Type = \
|
|
SWAP16(pTclas->Clasifier.Ethernet.Type);
|
|
#endif /* RT_BIG_ENDIAN */
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\tDestination MAC:\t%02x:%02x:%02x:%02x:%02x:%02x\n",
|
|
pTclas->Clasifier.Ethernet.AddrDst[0],
|
|
pTclas->Clasifier.Ethernet.AddrDst[1],
|
|
pTclas->Clasifier.Ethernet.AddrDst[2],
|
|
pTclas->Clasifier.Ethernet.AddrDst[3],
|
|
pTclas->Clasifier.Ethernet.AddrDst[4],
|
|
pTclas->Clasifier.Ethernet.AddrDst[5]));
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\tSource MAC:\t\t%02x:%02x:%02x:%02x:%02x:%02x\n",
|
|
pTclas->Clasifier.Ethernet.AddrSrc[0],
|
|
pTclas->Clasifier.Ethernet.AddrSrc[1],
|
|
pTclas->Clasifier.Ethernet.AddrSrc[2],
|
|
pTclas->Clasifier.Ethernet.AddrSrc[3],
|
|
pTclas->Clasifier.Ethernet.AddrSrc[4],
|
|
pTclas->Clasifier.Ethernet.AddrSrc[5]));
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\tType/Length:\t\t%x\n",
|
|
pTclas->Clasifier.Ethernet.Type));
|
|
break;
|
|
|
|
case ACM_TCLAS_TYPE_IP_V4:
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\nAdd a IPv4 TCLAS: UP (%d), Mask (0x%02x)\n",
|
|
pTclas->UserPriority, pTclas->ClassifierMask));
|
|
|
|
pTclas->Clasifier.IPv4.Version = AcmCmdUtilNumGet(&pArgv);
|
|
pTclas->Clasifier.IPv4.IpSource = AcmCmdUtilIpGet(&pArgv);
|
|
pTclas->Clasifier.IPv4.IpDest = AcmCmdUtilIpGet(&pArgv);
|
|
pTclas->Clasifier.IPv4.PortSource = AcmCmdUtilNumGet(&pArgv);
|
|
pTclas->Clasifier.IPv4.PortDest = AcmCmdUtilNumGet(&pArgv);
|
|
pTclas->Clasifier.IPv4.DSCP = AcmCmdUtilHexGet(&pArgv);
|
|
pTclas->Clasifier.IPv4.Protocol = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\tVersion:\t\t\t%d\n",
|
|
pTclas->Clasifier.IPv4.Version));
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\tSource IP:\t\t\t%d.%d.%d.%d\n",
|
|
*(UCHAR *)&pTclas->Clasifier.IPv4.IpSource,
|
|
*(((UCHAR *)&pTclas->Clasifier.IPv4.IpSource)+1),
|
|
*(((UCHAR *)&pTclas->Clasifier.IPv4.IpSource)+2),
|
|
*(((UCHAR *)&pTclas->Clasifier.IPv4.IpSource)+3)));
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\tDestination IP:\t\t\t%d.%d.%d.%d\n",
|
|
*(UCHAR *)&pTclas->Clasifier.IPv4.IpDest,
|
|
*(((UCHAR *)&pTclas->Clasifier.IPv4.IpDest)+1),
|
|
*(((UCHAR *)&pTclas->Clasifier.IPv4.IpDest)+2),
|
|
*(((UCHAR *)&pTclas->Clasifier.IPv4.IpDest)+3)));
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\tSource Port Number:\t\t%d\n",
|
|
pTclas->Clasifier.IPv4.PortSource));
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\tDestination Port Number:\t%d\n",
|
|
pTclas->Clasifier.IPv4.PortDest));
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\tDSCP:\t\t\t\t0x%02x\n",
|
|
pTclas->Clasifier.IPv4.DSCP));
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\tProtocol:\t\t\t%d\n",
|
|
pTclas->Clasifier.IPv4.Protocol));
|
|
break;
|
|
|
|
case ACM_TCLAS_TYPE_8021DQ:
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\nAdd a IEEE802.1Q TCLAS: UP (%d), Mask (0x%02x)\n",
|
|
pTclas->UserPriority, pTclas->ClassifierMask));
|
|
|
|
pTclas->Clasifier.IEEE8021Q.TagType = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\tTagType: \t\t0x%x\n",
|
|
pTclas->Clasifier.IEEE8021Q.TagType));
|
|
break;
|
|
|
|
default:
|
|
ACMR_DEBUG(ACMR_DEBUG_ERR, ("\nacm_err> TCLAS Type fail!\n"));
|
|
break;
|
|
}
|
|
} /* End of if */
|
|
|
|
gTLS_Grp_ID++;
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("\n"));
|
|
#else
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_ERR, ("\nacm_err> TCLAS function is included!\n"));
|
|
#endif /* ACM_CC_FUNC_TCLAS */
|
|
} /* End of AcmCmdTclasCreate */
|
|
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Request a traffic stream with current TCLAS settings.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. Command Format:
|
|
[1-WME] [TID:0~7] [dir:0~3]
|
|
[access:1~3] [UP:0~7] [APSD:0~1] [nom size:byte]
|
|
[inact:sec] [mean data rate:bps] [min phy rate:bps]
|
|
[surp factor:>=1] [tclas processing:0~1] (ack policy:0~3)
|
|
|
|
2. dir: 0 - uplink, 1 - dnlink, 3 - bidirectional link
|
|
APSD: 0 - legacy PS, 1 - APSD
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdStreamTSRequest(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv,
|
|
ACM_PARAM_IN UINT16 DialogToken)
|
|
{
|
|
ACMR_STA_DB *pCdb;
|
|
ACM_FUNC_STATUS Status;
|
|
ACM_TSPEC Tspec, *pTspec;
|
|
ACM_TS_INFO *pInfo;
|
|
UCHAR StreamType, TclasProcessing;
|
|
UCHAR MAC[6];
|
|
ULONG SplFlags;
|
|
|
|
|
|
/* init */
|
|
pCdb = NULL;
|
|
pTspec = &Tspec;
|
|
pInfo = &Tspec.TsInfo;
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
if (ACMR_WMM_CAPABLE_GET(pAd) == FALSE)
|
|
{
|
|
ACMR_DEBUG(ACMR_DEBUG_ERR, ("\nacm_err> WMM is disabled!\n"));
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* use AP MAC address automatically */
|
|
ACMR_MEM_COPY(MAC, ACMR_AP_ADDR_GET(pAd), 6);
|
|
|
|
/* get sta entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, MAC);
|
|
if (pCdb == NULL)
|
|
return;
|
|
/* End of if */
|
|
|
|
/* parse input command */
|
|
if (AcmCmdInfoParse(
|
|
pAd,
|
|
&pArgv,
|
|
pTspec,
|
|
pInfo,
|
|
&StreamType) != 0)
|
|
{
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* request the stream */
|
|
TclasProcessing = AcmCmdUtilNumGet(&pArgv);
|
|
pInfo->AckPolicy = AcmCmdUtilNumGet(&pArgv); /* default 0 */
|
|
|
|
/* get management semaphore */
|
|
ACM_TSPEC_SEM_LOCK_CHK(pAd, SplFlags, LabelSemErr);
|
|
|
|
/* try to find if the stream have already existed in our list */
|
|
Status = ACM_TC_RenegotiationCheck(pAd, MAC, pInfo->UP, pInfo,
|
|
NULL, NULL, NULL);
|
|
|
|
/* release semaphore */
|
|
ACM_TSPEC_SEM_UNLOCK(pAd, LabelSemErr);
|
|
|
|
if (Status == ACM_RTN_FAIL)
|
|
{
|
|
/* this is a new request */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\n11e_msg> Send a new TS request!\n"));
|
|
|
|
if (ACMP_WME_TC_Request(pAd, pCdb, pTspec,
|
|
gTLS_Grp_ID, gCMD_TCLAS_Group,
|
|
TclasProcessing, StreamType,
|
|
DialogToken) != ACM_RTN_OK)
|
|
{
|
|
printk("err> request the stream fail in AcmCmdStreamTSRequest()!\n");
|
|
} /* End of if */
|
|
}
|
|
else if (Status == ACM_RTN_OK)
|
|
{
|
|
/* this is a negotiate request */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\n11e_msg> Send a TS negotiated request!\n"));
|
|
|
|
if (ACMP_TC_Renegotiate(pAd, pCdb, pTspec,
|
|
gTLS_Grp_ID, gCMD_TCLAS_Group,
|
|
TclasProcessing, StreamType) != ACM_RTN_OK)
|
|
{
|
|
printk("err> negotiate the stream fail in AcmCmdStreamTSRequest()!\n");
|
|
} /* End of if */
|
|
} /* End of if */
|
|
|
|
return;
|
|
|
|
LabelSemErr:
|
|
/* management semaphore get fail */
|
|
ACMR_DEBUG(ACMR_DEBUG_ERR,
|
|
("acm_err> Semaphore Lock! AcmCmdStreamTSRequest()\n"));
|
|
return;
|
|
} /* End of AcmCmdStreamTSRequest */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Display current bandwidth status.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdBandwidthDisplay(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACM_BANDWIDTH_INFO BwInfo, *pInfo;
|
|
UINT32 TimePerc;
|
|
|
|
|
|
/* init */
|
|
pInfo = &BwInfo;
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* display */
|
|
if (ACMP_BandwidthInfoGet(pAd, pInfo) != ACM_RTN_OK)
|
|
return;
|
|
/* End of if */
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
{
|
|
TimePerc = pInfo->AcmUsedTime * 100;
|
|
#ifdef ACM_CC_FUNC_MBSS
|
|
TimePerc += pInfo->MbssTotalUsedTime * 100;
|
|
#endif /* ACM_CC_FUNC_MBSS */
|
|
TimePerc /= ACM_TIME_BASE;
|
|
printk("\n\t(BSS) Current available bandwidth = %d %%\n", (100-TimePerc));
|
|
} /* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
if (ACMR_IS_STA_MODE(pAd))
|
|
{
|
|
printk("\n\t(BSS) Current available bandwidth = %d %%\n",
|
|
(((pInfo->AvalAdmCap<<5)*100)/ACM_TIME_BASE));
|
|
} /* End of if */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
#ifdef ACM_CC_FUNC_MBSS
|
|
printk("\tCurrent ACM time for other BSS = %d us\n", pInfo->MbssTotalUsedTime);
|
|
#endif /* ACM_CC_FUNC_MBSS */
|
|
|
|
printk("\t(BSS) Station Count of the BSS: %d\n", pInfo->StationCount);
|
|
printk("\t(BSS) Channel Utilization of the BSS: %d %%\n", (pInfo->ChanUtil*100/255));
|
|
printk("\t(BSS) Available Adimission Capability of the BSS: %d us\n", (pInfo->AvalAdmCap<<5));
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
printk("\t(BSS) Channel busy time: %uus\n\n", pInfo->ChanBusyTime);
|
|
/* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
TimePerc = pInfo->AcUsedTime * 100;
|
|
TimePerc /= ACM_TIME_BASE;
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
{
|
|
printk("\t(BSS) Current ACM time for EDCA = %d us\n", pInfo->AcUsedTime);
|
|
printk("\t(BSS) Current ACM bandwidth for EDCA = %d %%\n", TimePerc);
|
|
|
|
printk("\t(BSS) Current number of requested TSPECs (not yet response) = %d\n",
|
|
pInfo->NumReqLink);
|
|
|
|
if ((pInfo->NumAcLinkUp != 0) || (pInfo->NumAcLinkDn != 0) ||
|
|
(pInfo->NumAcLinkDi != 0) || (pInfo->NumAcLinkBi != 0))
|
|
{
|
|
printk("\n\t(BSS) EDCA uplinks = %02d\n", pInfo->NumAcLinkUp);
|
|
printk("\t(BSS) EDCA dnlinks = %02d\n", pInfo->NumAcLinkDn);
|
|
printk("\t(BSS) EDCA bilinks = %02d\n", pInfo->NumAcLinkBi);
|
|
} /* End of if */
|
|
} /* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
if (ACMR_IS_STA_MODE(pAd))
|
|
{
|
|
printk("\t(STA) Current ACM time for EDCA = %d us\n", pInfo->AcUsedTime);
|
|
|
|
/*
|
|
Only time of all uplinks.
|
|
In station, it can not know medium time of all dnlinks.
|
|
*/
|
|
printk("\t(STA) Current ACM bandwidth for EDCA = %d %%\n", TimePerc);
|
|
|
|
printk("\t(STA) Current number of requested TSPECs (not yet response) = %d\n",
|
|
pInfo->NumReqLink);
|
|
|
|
if ((pInfo->NumAcLinkUp != 0) || (pInfo->NumAcLinkDn != 0) ||
|
|
(pInfo->NumAcLinkDi != 0) || (pInfo->NumAcLinkBi != 0))
|
|
{
|
|
printk("\n\t(STA) EDCA uplinks = %02d", pInfo->NumAcLinkUp);
|
|
printk("\t(STA)EDCA dnlinks = %02d\n", pInfo->NumAcLinkDn);
|
|
printk("\t(STA)EDCA bilinks = %02d\n", pInfo->NumAcLinkBi);
|
|
} /* End of if */
|
|
} /* End of if */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
} /* End of AcmCmdBandwidthDisplay */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Display current stream status.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP & QSTA.
|
|
2. Command Format:
|
|
wsshow [1:EDCA, 2:HCCA, 3:ALL] (Client MAC, EX: 00:0c:43:10:12:50)
|
|
3. If Client MAC doesnt exist, only requested TSPEC & dnlink
|
|
(bidirectional link) are displayed for QAP; only requested
|
|
TSPEC & uplink (bidirectional link) are displayed for QSTA.
|
|
If you want to display uplinks, you should assign client MAC address.
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdStreamDisplay(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACM_STREAM_INFO *pStream, *pStreamNext;
|
|
UINT32 Type;
|
|
UCHAR MacPeer[6];
|
|
UINT32 NumStream, SizeBuf;
|
|
UINT32 Category[2] = { ACM_SM_CATEGORY_REQ, ACM_SM_CATEGORY_ACT };
|
|
UINT32 NumCategory;
|
|
UINT32 IdCateNum, IdStmNum;
|
|
|
|
|
|
/* init */
|
|
NumCategory = 2;
|
|
pStream = NULL;
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* init */
|
|
ACMR_MEM_ZERO(MacPeer, sizeof(MacPeer));
|
|
|
|
Type = AcmCmdUtilNumGet(&pArgv);
|
|
if (Type == 0)
|
|
Type = 1; /* default: EDCA streams */
|
|
/* End of if */
|
|
|
|
if (Argc >= 2)
|
|
{
|
|
/* get Client MAC */
|
|
AcmCmdUtilMacGet(&pArgv, MacPeer);
|
|
|
|
#ifdef IEEE80211E_SIMULATION
|
|
if (*(UINT32 *)MacPeer == 0x00)
|
|
{
|
|
if (MacPeer[5] == 0x00)
|
|
ACMR_MEM_COPY(MacPeer, gMAC_STA, 6);
|
|
else
|
|
ACMR_MEM_COPY(MacPeer, gMAC_STA, 5);
|
|
/* End of if */
|
|
} /* End of if */
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
|
|
NumCategory = 1; /* input & output TS streams */
|
|
Category[0] = ACM_SM_CATEGORY_PEER;
|
|
} /* End of if */
|
|
|
|
for(IdCateNum=0; IdCateNum<NumCategory; IdCateNum++)
|
|
{
|
|
NumStream = ACMP_StreamNumGet(pAd, Category[IdCateNum], Type, MacPeer);
|
|
|
|
if (NumStream == 0)
|
|
{
|
|
if (Category[IdCateNum] == ACM_SM_CATEGORY_REQ)
|
|
printk("\n No any requested TSPEC exists!\n");
|
|
else if (Category[IdCateNum] == ACM_SM_CATEGORY_PEER)
|
|
printk("\n No any TSPEC exists!\n");
|
|
else
|
|
printk("\n No any output TSPEC exists!\n");
|
|
/* End of if */
|
|
continue;
|
|
} /* End of if */
|
|
|
|
SizeBuf = sizeof(ACM_STREAM_INFO) * NumStream;
|
|
ACMR_MEM_ALLOC(pStream, SizeBuf, (ACM_STREAM_INFO *));
|
|
|
|
if (pStream == NULL)
|
|
{
|
|
printk("acm_err> Allocate stream memory fail! "
|
|
"AcmCmdStreamDisplay()\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
if (ACMP_StreamsGet(pAd, Category[IdCateNum], Type,
|
|
&NumStream, MacPeer, pStream) != ACM_RTN_OK)
|
|
{
|
|
printk("acm_err> Get stream information fail! "
|
|
"AcmCmdStreamDisplay()\n");
|
|
ACMR_MEM_FREE(pStream);
|
|
return;
|
|
} /* End of if */
|
|
|
|
if (Category[IdCateNum] == ACM_SM_CATEGORY_REQ)
|
|
{
|
|
printk("\n\n ------------------- All Requested List "
|
|
"-------------------");
|
|
}
|
|
else
|
|
{
|
|
if (Category[IdCateNum] == ACM_SM_CATEGORY_ACT)
|
|
{
|
|
printk("\n\n ------------------- All OUT stream List "
|
|
"-------------------");
|
|
}
|
|
else
|
|
{
|
|
printk("\n\n ------------------- The Device stream List "
|
|
"-------------------");
|
|
} /* End of if */
|
|
} /* End of if */
|
|
|
|
for(IdStmNum=0, pStreamNext=pStream; IdStmNum<NumStream; IdStmNum++)
|
|
{
|
|
/* display the stream information */
|
|
AcmCmdStreamDisplayOne(pAd, pStreamNext);
|
|
pStreamNext ++;
|
|
} /* End of for */
|
|
|
|
ACMR_MEM_FREE(pStream);
|
|
pStream = NULL;
|
|
} /* End of while */
|
|
} /* End of AcmCmdStreamDisplay */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Display fail stream status.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdStreamFailDisplay(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACM_STREAM_INFO *pStream, *pStreamNext;
|
|
UINT32 Category, Type;
|
|
UINT32 NumStream, SizeBuf;
|
|
UINT32 IdStmNum;
|
|
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* init */
|
|
Category = ACM_SM_CATEGORY_ERR;
|
|
Type = ACM_ACCESS_POLICY_MIX;
|
|
|
|
/* get fail streams */
|
|
NumStream = ACMP_StreamNumGet(pAd, Category, Type, NULL);
|
|
|
|
if (NumStream == 0)
|
|
{
|
|
printk(" No any fail TSPEC exists!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
SizeBuf = sizeof(ACM_STREAM_INFO) * NumStream;
|
|
ACMR_MEM_ALLOC(pStream, SizeBuf, (ACM_STREAM_INFO *));
|
|
|
|
if (pStream == NULL)
|
|
{
|
|
printk("acm_err> Allocate stream memory fail! "
|
|
"AcmCmdStreamFailDisplay()\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
if (ACMP_StreamsGet(pAd, Category, Type, &NumStream, NULL, pStream) != \
|
|
ACM_RTN_OK)
|
|
{
|
|
printk("acm_err> Get stream information fail! "
|
|
"AcmCmdStreamFailDisplay()\n");
|
|
ACMR_MEM_FREE(pStream);
|
|
return;
|
|
} /* End of if */
|
|
|
|
for(IdStmNum=0, pStreamNext=pStream; IdStmNum<NumStream; IdStmNum++)
|
|
{
|
|
/* display the stream information */
|
|
AcmCmdStreamDisplayOne(pAd, pStreamNext);
|
|
pStreamNext ++;
|
|
} /* End of for */
|
|
|
|
ACMR_MEM_FREE(pStream);
|
|
} /* End of AcmCmdStreamFailDisplay */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Display current EDCA parameters.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdEDCAParamDisplay(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACM_CTRL_INFO CtrlInfo, *pInfo = &CtrlInfo;
|
|
UINT32 TimePerc, TimeAcm, TimeAcmMax;
|
|
UINT32 IdAcNum, IdAcOther;
|
|
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* get EDCA information */
|
|
ACMP_ControlInfomationGet(pAd, pInfo);
|
|
|
|
/* display information */
|
|
printk("\n Downgrade information:\n");
|
|
|
|
for(IdAcNum=0; IdAcNum<ACM_DEV_NUM_OF_AC; IdAcNum++)
|
|
{
|
|
if (pInfo->FlgIsAcmEnable[IdAcNum])
|
|
{
|
|
if (pInfo->DowngradeAcNum[IdAcNum] < ACM_DEV_NUM_OF_AC)
|
|
{
|
|
printk(" AC%d ACM is enabled and Downgrade AC = %d\n",
|
|
IdAcNum, pInfo->DowngradeAcNum[IdAcNum]);
|
|
}
|
|
else
|
|
printk(" AC%d ACM is enabled and Downgrade AC = NONE\n", IdAcNum);
|
|
/* End of if */
|
|
}
|
|
else
|
|
printk(" AC%d ACM is disabled!\n", IdAcNum);
|
|
/* End of if */
|
|
} /* End of for */
|
|
|
|
printk("\n Channel Utilization Quota information:\n");
|
|
printk(" Minimum Contention Period = %d/%d service interval\n",
|
|
pInfo->CP_MinNu, pInfo->CP_MinDe);
|
|
printk(" Minimum Best Effort Period = %d/%d service interval\n",
|
|
pInfo->BEK_MinNu, pInfo->BEK_MinDe);
|
|
|
|
if (pInfo->FlgIsTspecUpasdEnable)
|
|
printk(" UAPSD over TSPEC is enabled\n");
|
|
else
|
|
printk(" UAPSD over TSPEC is disabled\n");
|
|
/* End of if */
|
|
|
|
if (pInfo->FlgIsTspecTimeoutEnable)
|
|
printk(" TSPEC life time check is enabled\n");
|
|
else
|
|
printk(" TSPEC life time check is disabled\n");
|
|
/* End of if */
|
|
|
|
printk("\n EDCA AC ACM information:\n");
|
|
printk(" BW/AC\tAC0\t\tAC1\t\tAC2\t\tAC3");
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
{
|
|
if (pInfo->FlgDatl)
|
|
{
|
|
printk("\n MIN BW\t");
|
|
for(IdAcNum=0; IdAcNum<ACM_DEV_NUM_OF_AC; IdAcNum++)
|
|
printk("%02d%%\t\t", pInfo->DatlBwMin[IdAcNum]);
|
|
/* End of for */
|
|
|
|
printk("\n MAX BW\t");
|
|
for(IdAcNum=0; IdAcNum<ACM_DEV_NUM_OF_AC; IdAcNum++)
|
|
printk("%02d%%\t\t", pInfo->DatlBwMax[IdAcNum]);
|
|
/* End of for */
|
|
} /* End of if */
|
|
} /* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
TimeAcmMax = ACM_TIME_BASE;
|
|
|
|
printk("\n USE BW\t");
|
|
for(IdAcNum=0; IdAcNum<ACM_DEV_NUM_OF_AC; IdAcNum++)
|
|
{
|
|
TimeAcm = pInfo->AcmAcTime[IdAcNum];
|
|
TimePerc = 0;
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
for(IdAcOther=0; IdAcOther<ACM_DEV_NUM_OF_AC; IdAcOther++)
|
|
{
|
|
if (IdAcOther == IdAcNum)
|
|
continue;
|
|
/* End of if */
|
|
|
|
TimePerc += pInfo->DatlBorAcBw[IdAcNum][IdAcOther];
|
|
} /* End of for */
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
TimePerc += TimeAcm;
|
|
TimePerc *= 100;
|
|
TimePerc /= TimeAcmMax;
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
{
|
|
if ((pInfo->FlgDatl) && (TimePerc > pInfo->DatlBwMax[IdAcNum]))
|
|
printk("%02d%%\t\t", pInfo->DatlBwMax[IdAcNum]);
|
|
/* End of if */
|
|
}
|
|
else
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
#endif /* RELEASE_EXCLUDE */
|
|
printk("%02d%%\t\t", TimePerc);
|
|
/* End of if */
|
|
} /* End of for */
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
{
|
|
if (pInfo->FlgDatl)
|
|
{
|
|
printk("\n AVL BW\t");
|
|
for(IdAcNum=0; IdAcNum<ACM_DEV_NUM_OF_AC; IdAcNum++)
|
|
printk("%02dus\t", (pInfo->AvalAdmCapAc[IdAcNum]<<5));
|
|
/* End of for */
|
|
} /* End of if */
|
|
} /* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
printk("\n\n");
|
|
} /* End of AcmCmdEDCAParamDisplay */
|
|
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Enable or disable Dynamic ATL.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Command Format: 25
|
|
[enable/disable 1/0] (minimum bw threshold for AC0~AC3)
|
|
(maximum bw threshold for AC0~AC3)
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdDATLEnable(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
UCHAR FlgIsEnable;
|
|
UCHAR DatlBwMin[ACM_DEV_NUM_OF_AC];
|
|
UCHAR DatlBwMax[ACM_DEV_NUM_OF_AC];
|
|
UINT32 IdAcNum, SumBw;
|
|
|
|
|
|
FlgIsEnable = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
if (Argc >= 2)
|
|
{
|
|
/* input parameters include minimum & maximum bandwidth threshold */
|
|
for(IdAcNum=0; IdAcNum<ACM_DEV_NUM_OF_AC; IdAcNum++)
|
|
DatlBwMin[IdAcNum] = AcmCmdUtilNumGet(&pArgv);
|
|
/* End of for */
|
|
|
|
for(IdAcNum=0, SumBw=0; IdAcNum<ACM_DEV_NUM_OF_AC; IdAcNum++)
|
|
{
|
|
DatlBwMax[IdAcNum] = AcmCmdUtilNumGet(&pArgv);
|
|
SumBw += DatlBwMax[IdAcNum];
|
|
} /* End of for */
|
|
|
|
if (SumBw != ACM_DATL_BW_MAX_SUM)
|
|
return;
|
|
/* End of if */
|
|
|
|
for(IdAcNum=0; IdAcNum<ACM_DEV_NUM_OF_AC; IdAcNum++)
|
|
{
|
|
if (DatlBwMin[IdAcNum] > DatlBwMax[IdAcNum])
|
|
return; /* min should be <= max */
|
|
/* End of if */
|
|
} /* End of for */
|
|
|
|
ACMP_DatlCtrl(pAd, FlgIsEnable, DatlBwMin, DatlBwMax);
|
|
}
|
|
else
|
|
ACMP_DatlCtrl(pAd, FlgIsEnable, NULL, NULL);
|
|
/* End of if */
|
|
} /* End of AcmCmdDATLEnable */
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Enable or disable ACM Flag for each AC.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Command Format: 10
|
|
[AC0] [AC1] [AC2] [AC3]
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdAcmFlagCtrl(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
UCHAR FlgIsAcmEnabled[ACM_DEV_NUM_OF_AC];
|
|
|
|
|
|
FlgIsAcmEnabled[0] = AcmCmdUtilNumGet(&pArgv);
|
|
FlgIsAcmEnabled[1] = AcmCmdUtilNumGet(&pArgv);
|
|
FlgIsAcmEnabled[2] = AcmCmdUtilNumGet(&pArgv);
|
|
FlgIsAcmEnabled[3] = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
ACMP_EnableFlagReset(pAd, FlgIsAcmEnabled[0], FlgIsAcmEnabled[1],
|
|
FlgIsAcmEnabled[2], FlgIsAcmEnabled[3]);
|
|
} /* End of AcmCmdAcmFlagCtrl */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Send a delts to a peer.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
[Peer MAC] [TID:0~7]
|
|
|
|
We deleted a TS based on the TSID, not Direction or AC ID.
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdDeltsSend(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMR_STA_DB *pCdb;
|
|
ACM_STREAM *pStream;
|
|
ACM_TS_INFO TsInfo;
|
|
UINT32 TID;
|
|
UCHAR MacPeer[6];
|
|
ULONG SplFlags;
|
|
|
|
|
|
/* init */
|
|
pCdb = NULL;
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* get peer mac address */
|
|
AcmCmdUtilMacGet(&pArgv, MacPeer);
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
if (ACMR_IS_STA_MODE(pAd))
|
|
{
|
|
if (*(UINT32 *)MacPeer == 0)
|
|
ACMR_MEM_COPY(MacPeer, ACMR_AP_ADDR_GET(pAd), 6);
|
|
/* End of if */
|
|
} /* End of if */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
#ifdef IEEE80211E_SIMULATION
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
{
|
|
if (*(UINT32 *)MacPeer == 0)
|
|
ACMR_MEM_COPY(MacPeer, gMAC_STA, 6);
|
|
/* End of if */
|
|
} /* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
|
|
/* get input arguments */
|
|
ACM_NIN_DEC_MGET(TID, 0, 7, ("err> TID fail!\n"));
|
|
|
|
/* get sta entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, MacPeer);
|
|
if (pCdb == NULL)
|
|
{
|
|
printk("acm_err> the peer does NOT exist "
|
|
"0x%02x:%02x:%02x:%02x:%02x:%02x:!\n",
|
|
MacPeer[0], MacPeer[1], MacPeer[2],
|
|
MacPeer[3], MacPeer[4], MacPeer[5]);
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* #ifdef CONFIG_AP_SUPPORT */
|
|
#if 0
|
|
if ((pCdb->PsMode == PWR_SAVE) && (pCdb->bAPSDAllAC == 1))
|
|
{
|
|
printk("11e_msg> All AC are UAPSD, we can not send DELTS frame!\n");
|
|
return;
|
|
} /* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
TsInfo.TSID = TID;
|
|
|
|
/* get management semaphore */
|
|
ACM_TSPEC_IRQ_LOCK_CHK(pAd, SplFlags, LabelSemErr);
|
|
|
|
/* find the request */
|
|
pStream = ACM_TC_Find(pAd, MacPeer, &TsInfo);
|
|
if (pStream == NULL)
|
|
{
|
|
ACM_TSPEC_IRQ_UNLOCK(pAd, SplFlags, LabelSemErr);
|
|
printk("acm_msg> can not find the stream (TID=%d)!\n", TID);
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* delete the stream */
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
pStream->Cause = TSPEC_CAUSE_DELETED_BY_QAP;
|
|
/* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
if (ACMR_IS_STA_MODE(pAd))
|
|
pStream->Cause = TSPEC_CAUSE_DELETED_BY_QSTA;
|
|
/* End of if */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
if (ACM_TC_Delete(pAd, pStream) == TRUE)
|
|
{
|
|
ACM_DELTS_SEND(pAd, pStream->pCdb, pStream, LabelSemErr);
|
|
} /* End of if */
|
|
|
|
/* release semaphore */
|
|
ACM_TSPEC_IRQ_UNLOCK(pAd, SplFlags, LabelSemErr);
|
|
|
|
LabelErr:
|
|
return;
|
|
|
|
LabelSemErr:
|
|
/* management semaphore get fail */
|
|
ACMR_DEBUG(ACMR_DEBUG_ERR,
|
|
("acm_err> Semaphore Lock! AcmCmdDeltsSend()\n"));
|
|
return;
|
|
} /* End of AcmCmdDeltsSend */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Clear fail stream status.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdStreamFailClear(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* clear */
|
|
ACMP_StreamFailClear(pAd);
|
|
} /* End of AcmCmdStreamFailClear */
|
|
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Negotiate a traffic stream with current TCLAS settings.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. Command Format:
|
|
[1-WME] [TID:0~7] [dir:0~3]
|
|
[access:1~3] [UP:0~7] [APSD:0~1] [nom size:byte]
|
|
[inact:sec] [mean data rate:bps] [min phy rate:bps]
|
|
[surp factor:>=1] [tclas processing:0~1]
|
|
(ack policy:0~3)
|
|
2. dir: 0 - uplink, 1 - dnlink, 2 - bidirectional link, 3 - direct link
|
|
access: 1 - EDCA, 2 - HCCA, 3 - EDCA + HCCA
|
|
APSD: 0 - legacy PS, 1 - APSD
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdStreamTSNegotiate(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMR_STA_DB *pCdb;
|
|
ACM_TSPEC Tspec, *pTspec;
|
|
ACM_TS_INFO *pInfo;
|
|
UCHAR StreamType, TclasProcessing;
|
|
UCHAR MAC[6];
|
|
|
|
|
|
/* init */
|
|
pCdb = NULL;
|
|
pTspec = &Tspec;
|
|
pInfo = &Tspec.TsInfo;
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* use AP MAC address automatically */
|
|
ACMR_MEM_COPY(MAC, ACMR_AP_ADDR_GET(pAd), 6);
|
|
|
|
/* get sta entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, MAC);
|
|
if (pCdb == NULL)
|
|
return;
|
|
/* End of if */
|
|
|
|
/* parse input command */
|
|
if (AcmCmdInfoParse(
|
|
pAd,
|
|
&pArgv,
|
|
pTspec,
|
|
pInfo,
|
|
&StreamType) != 0)
|
|
{
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* request the stream */
|
|
TclasProcessing = AcmCmdUtilNumGet(&pArgv);
|
|
pInfo->AckPolicy = AcmCmdUtilNumGet(&pArgv); /* default 0 */
|
|
|
|
if (ACMP_TC_Renegotiate(pAd, pCdb, pTspec,
|
|
gTLS_Grp_ID, gCMD_TCLAS_Group,
|
|
TclasProcessing, StreamType) != ACM_RTN_OK)
|
|
{
|
|
printk("err> negotiate the stream fail in AcmCmdStreamTSNegotiate()!\n");
|
|
} /* End of if */
|
|
} /* End of AcmCmdStreamTSNegotiate */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Display UAPSD information for a device.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
[Peer MAC]
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdUapsdDisplay(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
UCHAR MacPeer[6];
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
ACMR_STA_DB *pCdb;
|
|
UINT32 IdAcNum;
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* init */
|
|
ACMR_MEM_ZERO(MacPeer, sizeof(MacPeer));
|
|
|
|
if (Argc >= 1)
|
|
{
|
|
/* get Client MAC */
|
|
AcmCmdUtilMacGet(&pArgv, MacPeer);
|
|
|
|
#ifdef IEEE80211E_SIMULATION
|
|
if (*(UINT32 *)MacPeer == 0x00)
|
|
{
|
|
if (MacPeer[5] == 0x00)
|
|
ACMR_MEM_COPY(MacPeer, gMAC_STA, 6);
|
|
else
|
|
ACMR_MEM_COPY(MacPeer, gMAC_STA, 5);
|
|
/* End of if */
|
|
} /* End of if */
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
} /* End of if */
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
{
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, MacPeer);
|
|
if (pCdb != NULL)
|
|
{
|
|
if (ACMR_STA_IS_IN_ACTIVE_MODE(pCdb))
|
|
printk("\n EDCA AC UAPSD information: (ACTIVE)\n");
|
|
else
|
|
printk("\n EDCA AC UAPSD information: (POWER SAVE)\n");
|
|
/* End of if */
|
|
|
|
if (pCdb->MaxSPLength != 0)
|
|
{
|
|
printk(" Max SP Length: %d (%d frames)\n",
|
|
pCdb->MaxSPLength, pCdb->MaxSPLength<<1);
|
|
}
|
|
else
|
|
printk(" Max SP Length: 0 (all frames)\n");
|
|
/* End of if */
|
|
|
|
printk(" UAPSD/AC AC0 AC1 AC2 AC3");
|
|
|
|
printk("\n Tr/De ");
|
|
|
|
for(IdAcNum=0; IdAcNum<ACM_DEV_NUM_OF_AC; IdAcNum++)
|
|
{
|
|
printk("%d/%d ",
|
|
pCdb->bAPSDCapablePerAC[IdAcNum],
|
|
pCdb->bAPSDDeliverEnabledPerAC[IdAcNum]);
|
|
} /* End of for */
|
|
} /* End of if */
|
|
} /* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
if (ACMR_IS_STA_MODE(pAd))
|
|
{
|
|
if (ACMR_IS_IN_ACTIVE_MODE(pAd))
|
|
printk("\n EDCA AC UAPSD information: (ACTIVE)\n");
|
|
else
|
|
printk("\n EDCA AC UAPSD information: (POWER SAVE)\n");
|
|
/* End of if */
|
|
|
|
if (pAd->CommonCfg.MaxSPLength != 0)
|
|
{
|
|
printk(" Max SP Length: %d (%d frames)\n",
|
|
pAd->CommonCfg.MaxSPLength, pAd->CommonCfg.MaxSPLength<<1);
|
|
}
|
|
else
|
|
printk(" Max SP Length: 0 (all frames)\n");
|
|
/* End of if */
|
|
|
|
printk(" UAPSD/AC AC0 AC1 AC2 AC3");
|
|
|
|
printk("\n Tr/De %d/%d %d/%d %d/%d %d/%d",
|
|
pAd->CommonCfg.bACMAPSDTr[0],
|
|
pAd->CommonCfg.bAPSDAC_BE,
|
|
pAd->CommonCfg.bACMAPSDTr[1],
|
|
pAd->CommonCfg.bAPSDAC_BK,
|
|
pAd->CommonCfg.bACMAPSDTr[2],
|
|
pAd->CommonCfg.bAPSDAC_VI,
|
|
pAd->CommonCfg.bACMAPSDTr[3],
|
|
pAd->CommonCfg.bAPSDAC_VO);
|
|
} /* End of if */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
printk("\n");
|
|
} /* End of AcmCmdUapsdDisplay */
|
|
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Enable or disable all TSPEC rejection function.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Only for QAP.
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdTspecReject(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
BOOLEAN FlgIsEnabled;
|
|
|
|
|
|
FlgIsEnabled = AcmCmdUtilNumGet(&pArgv);
|
|
ACMP_TC_RejectCtrl(pAd, FlgIsEnabled);
|
|
} /* End of AcmCmdTspecReject */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Request a advanced traffic stream with current TCLAS settings.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. Command Format:
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[Ack Policy: 0~3] [APSD:0~1] [max size:byte] [nom size:byte]
|
|
[burst size:byte] [inact:sec]
|
|
[peak data rate:bps] [mean data rate:bps] [min data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1] [tclas processing:0~1]
|
|
(AMSDU aggregation number)
|
|
2. dir: 0 - uplink, 1 - dnlink, 3 - bidirectional link
|
|
APSD: 0 - legacy PS, 1 - APSD
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdStreamTSRequestAdvance(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMR_STA_DB *pCdb;
|
|
ACM_FUNC_STATUS Status;
|
|
ACM_TSPEC Tspec, *pTspec;
|
|
ACM_TS_INFO *pInfo;
|
|
UCHAR StreamType, TclasProcessing, NumOfMsdu;
|
|
UCHAR MAC[6];
|
|
ULONG SplFlags;
|
|
|
|
|
|
/* init */
|
|
pCdb = NULL;
|
|
pTspec = &Tspec;
|
|
pInfo = &Tspec.TsInfo;
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
if (ACMR_WMM_CAPABLE_GET(pAd) == FALSE)
|
|
{
|
|
ACMR_DEBUG(ACMR_DEBUG_ERR, ("\nacm_err> WMM is disabled!\n"));
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* use AP MAC address automatically */
|
|
ACMR_MEM_COPY(MAC, ACMR_AP_ADDR_GET(pAd), 6);
|
|
|
|
/* get sta entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, MAC);
|
|
if (pCdb == NULL)
|
|
return;
|
|
/* End of if */
|
|
|
|
/* parse input command */
|
|
if (AcmCmdInfoParseAdvance(
|
|
pAd,
|
|
&pArgv,
|
|
pTspec,
|
|
pInfo,
|
|
&StreamType) != 0)
|
|
{
|
|
return;
|
|
} /* End of if */
|
|
|
|
#if 0
|
|
/*
|
|
Correct Ack Policy to NORMAL ACK;
|
|
Or the peer AP maybe use AMPDU to calculate our medium time;
|
|
|
|
We do not use AMPDU to calculate our transmission time so we can
|
|
not let the peer AP use AMPDU to calculate our medium time.
|
|
*/
|
|
if (pInfo->AckPolicy == ACM_ACK_POLICY_BLOCK)
|
|
pInfo->AckPolicy = ACM_ACK_POLICY_NORMAL;
|
|
/* End of if */
|
|
#endif /* 0 */
|
|
|
|
/* request the stream */
|
|
TclasProcessing = AcmCmdUtilNumGet(&pArgv);
|
|
NumOfMsdu = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
#ifdef ACM_CC_FUNC_11N_AGG
|
|
/* check if AMSDU is enabled */
|
|
if ((ACMR_11N_IS_AMSDU_ENABLED(pCdb)) && (NumOfMsdu > 1))
|
|
{
|
|
/*
|
|
<AMSDU> is used only in station.
|
|
|
|
Nominal A-MSDU Size =
|
|
MAC Header Size
|
|
+ Nominal MSDU Aggregation * Nominal A-MSDU Subframe Size
|
|
- Pad Size
|
|
+ Security Encapsulation Size
|
|
+ FCS Size
|
|
|
|
Nominal A-MSDU Subframe Size =
|
|
A-MSDU Subframe Header Size
|
|
+ Nominal MSDU Size
|
|
+ Pad Size
|
|
|
|
A-MSDU Subframe is as below:
|
|
DA(6) + SA(6) + Length(2) + MSDU + Padding (0~3)
|
|
*/
|
|
/*
|
|
For AMSDU, we need to pre-calculate the Nominal MSDU size and
|
|
updated Mean Data Rate.
|
|
|
|
Example Video 10Mbps, 1316B, so PPS = 10^7/(1316 x 8) = 949.848
|
|
|
|
Assume A-MSDU with aggregation of 5 MSDUs per A-MSDU
|
|
Nom MSDU = MSDUAgg x (Papp + Subframe Header + Pad) - Pad + MSDU O/H
|
|
= 5 x (1316 + 14 + 2) - 2 + 47 = 6946B
|
|
Mean Data Rate = (6946 x 8)/5 x 948.85 = 10.55623Mbps
|
|
*/
|
|
UINT32 NominalMsduSize, PPS;
|
|
|
|
PPS = pTspec->MeanDataRate / (pTspec->NominalMsduSize << 3) + 1;
|
|
|
|
NominalMsduSize = FRM_LENGTH_AGG_AMSDU_HDR;
|
|
NominalMsduSize += (FRM_LENGTH_AGG_AMSDU_HDR +\
|
|
pTspec->NominalMsduSize) * NumOfMsdu;
|
|
|
|
/* total AMSDU size needs smaller than the maximum allowance size */
|
|
if (NominalMsduSize <= ACMR_11N_AMSDU_MAX_SIZE(pAd))
|
|
{
|
|
pTspec->NominalMsduSize = NominalMsduSize;
|
|
pTspec->MeanDataRate = ((NominalMsduSize << 3)*PPS) / NumOfMsdu;
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\nacm_msg> New NormSize %d and MeanRate = %d\n",
|
|
pTspec->NominalMsduSize, pTspec->MeanDataRate));
|
|
} /* End of if */
|
|
}
|
|
#endif /* ACM_CC_FUNC_11N_AGG */
|
|
|
|
/* get management semaphore */
|
|
ACM_TSPEC_SEM_LOCK_CHK(pAd, SplFlags, LabelSemErr);
|
|
|
|
/* try to find if the stream have already existed in our list */
|
|
Status = ACM_TC_RenegotiationCheck(pAd, MAC, pInfo->UP, pInfo,
|
|
NULL, NULL, NULL);
|
|
|
|
/* release semaphore */
|
|
ACM_TSPEC_SEM_UNLOCK(pAd, LabelSemErr);
|
|
|
|
if (Status == ACM_RTN_FAIL)
|
|
{
|
|
/* this is a new request */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\n11e_msg> Send a new TS request!\n"));
|
|
|
|
if (ACMP_WME_TC_Request(pAd, pCdb, pTspec,
|
|
gTLS_Grp_ID, gCMD_TCLAS_Group,
|
|
TclasProcessing, StreamType, 0) != ACM_RTN_OK)
|
|
{
|
|
printk("err> request the stream fail in AcmCmdStreamTSRequest()!\n");
|
|
} /* End of if */
|
|
}
|
|
else if (Status == ACM_RTN_OK)
|
|
{
|
|
/* this is a negotiate request */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\n11e_msg> Send a TS negotiated request!\n"));
|
|
|
|
if (ACMP_TC_Renegotiate(pAd, pCdb, pTspec,
|
|
gTLS_Grp_ID, gCMD_TCLAS_Group,
|
|
TclasProcessing, StreamType) != ACM_RTN_OK)
|
|
{
|
|
printk("err> negotiate the stream fail in AcmCmdStreamTSRequest()!\n");
|
|
} /* End of if */
|
|
} /* End of if */
|
|
|
|
return;
|
|
|
|
LabelSemErr:
|
|
/* management semaphore get fail */
|
|
ACMR_DEBUG(ACMR_DEBUG_ERR,
|
|
("acm_err> Semaphore Lock! AcmCmdStreamTSRequest()\n"));
|
|
return;
|
|
} /* End of AcmCmdStreamTSRequestAdvance */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Display ACM related statistics count.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdStatistics(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
#ifdef WMM_ACM_PKT_NUM_DEBUG
|
|
extern UINT32 WMM_ACM_NumOfPkt[WMM_ACM_DEBUG_TIME_MAX_NUM_REC][4];
|
|
extern UINT32 WMM_ACM_NumOfPktId, WMM_ACM_TimeId;
|
|
extern UINT32 WMM_ACM_Time[WMM_ACM_DEBUG_TIME_MAX_NUM_REC][4];
|
|
extern UINT32 WMM_ACM_TimeOffsetHTId;
|
|
extern UINT32 WMM_ACM_TimeOffsetHT[WMM_ACM_DEBUG_TIME_MAX_NUM_REC][4];
|
|
extern UINT32 WMM_ACM_TimeAmsdu[WMM_ACM_DEBUG_TIME_MAX_NUM_REC][2];
|
|
extern UINT32 WMM_ACM_TimeAmsduId;
|
|
UINT32 PktId;
|
|
|
|
|
|
for(PktId=WMM_ACM_NumOfPktId+1;
|
|
PktId<WMM_ACM_DEBUG_TIME_MAX_NUM_REC;
|
|
PktId++)
|
|
{
|
|
printk("Number of packet per second: %d %d %d %d\n",
|
|
WMM_ACM_NumOfPkt[PktId][0], WMM_ACM_NumOfPkt[PktId][1],
|
|
WMM_ACM_NumOfPkt[PktId][2], WMM_ACM_NumOfPkt[PktId][3]);
|
|
} /* End of for */
|
|
|
|
for(PktId=0; PktId<WMM_ACM_NumOfPktId; PktId++)
|
|
{
|
|
printk("Number of packet per second: %d %d %d %d\n",
|
|
WMM_ACM_NumOfPkt[PktId][0], WMM_ACM_NumOfPkt[PktId][1],
|
|
WMM_ACM_NumOfPkt[PktId][2], WMM_ACM_NumOfPkt[PktId][3]);
|
|
} /* End of for */
|
|
|
|
printk("\nTX Time: AC0\tAC1\tAC2\tAC3\n");
|
|
for(PktId=WMM_ACM_TimeId+1;
|
|
PktId<WMM_ACM_DEBUG_TIME_MAX_NUM_REC;
|
|
PktId++)
|
|
{
|
|
printk("TX Time %d: %d %d %d %d\n", PktId,
|
|
WMM_ACM_Time[PktId][0], WMM_ACM_Time[PktId][1],
|
|
WMM_ACM_Time[PktId][2], WMM_ACM_Time[PktId][3]);
|
|
} /* End of for */
|
|
|
|
for(PktId=0; PktId<WMM_ACM_TimeId; PktId++)
|
|
{
|
|
printk("TX Time %d: %d %d %d %d\n", PktId,
|
|
WMM_ACM_Time[PktId][0], WMM_ACM_Time[PktId][1],
|
|
WMM_ACM_Time[PktId][2], WMM_ACM_Time[PktId][3]);
|
|
} /* End of for */
|
|
|
|
printk("\nAMPDU: Time Offset, Tx time for 1st packet, NumOfMPDU, TxTime\n");
|
|
for(PktId=WMM_ACM_TimeOffsetHTId+1;
|
|
PktId<WMM_ACM_DEBUG_TIME_MAX_NUM_REC;
|
|
PktId++)
|
|
{
|
|
printk("AMPDU %d: %d %d %d %d\n", PktId,
|
|
WMM_ACM_TimeOffsetHT[PktId][0], WMM_ACM_TimeOffsetHT[PktId][1],
|
|
WMM_ACM_TimeOffsetHT[PktId][2], WMM_ACM_TimeOffsetHT[PktId][3]);
|
|
} /* End of for */
|
|
|
|
for(PktId=0; PktId<WMM_ACM_TimeOffsetHTId; PktId++)
|
|
{
|
|
printk("AMPDU %d: %d %d %d %d\n", PktId,
|
|
WMM_ACM_TimeOffsetHT[PktId][0], WMM_ACM_TimeOffsetHT[PktId][1],
|
|
WMM_ACM_TimeOffsetHT[PktId][2], WMM_ACM_TimeOffsetHT[PktId][3]);
|
|
} /* End of for */
|
|
|
|
printk("\n");
|
|
for(PktId=WMM_ACM_TimeAmsduId+1;
|
|
PktId<WMM_ACM_DEBUG_TIME_MAX_NUM_REC;
|
|
PktId++)
|
|
{
|
|
printk("AMSDU %d: %d %d\n", PktId,
|
|
WMM_ACM_TimeAmsdu[PktId][0], WMM_ACM_TimeAmsdu[PktId][1]);
|
|
} /* End of for */
|
|
|
|
for(PktId=0; PktId<WMM_ACM_TimeAmsduId; PktId++)
|
|
{
|
|
printk("AMSDU %d: %d %d\n", PktId,
|
|
WMM_ACM_TimeAmsdu[PktId][0], WMM_ACM_TimeAmsdu[PktId][1]);
|
|
} /* End of for */
|
|
|
|
#else /* WMM_ACM_PKT_NUM_DEBUG */
|
|
|
|
ACM_STATISTICS Stats, *pStats;
|
|
|
|
|
|
pStats = &Stats;
|
|
|
|
if (ACMP_StatisticsGet(pAd, pStats) == FALSE)
|
|
return;
|
|
/* End of if */
|
|
|
|
printk("ACM Related Statistics Count:\n\n");
|
|
printk("*Drop by ACM:\t\t%d\n", pStats->DropByACM);
|
|
printk("*Drop by Time:\t\t%d\n", pStats->DropByAdmittedTime);
|
|
printk("*Priority Change VO:\t%d\n", pStats->PriorityChange[ACM_VO_ID]);
|
|
printk("*Priority Change VI:\t%d\n", pStats->PriorityChange[ACM_VI_ID]);
|
|
printk("*Priority Change BK:\t%d\n", pStats->PriorityChange[ACM_BK_ID]);
|
|
printk("*Priority Change BE:\t%d\n", pStats->PriorityChange[ACM_BE_ID]);
|
|
printk("*Downgrade VO:\t\t%d\n", pStats->Downgrade[ACM_VO_ID]);
|
|
printk("*Downgrade VI:\t\t%d\n", pStats->Downgrade[ACM_VI_ID]);
|
|
printk("*Downgrade BK:\t\t%d\n", pStats->Downgrade[ACM_BK_ID]);
|
|
printk("*Downgrade BE:\t\t%d\n\n", pStats->Downgrade[ACM_BE_ID]);
|
|
|
|
#ifdef ACM_CC_FUNC_11N
|
|
{
|
|
UINT32 IdBa;
|
|
|
|
printk("*Predict AMPDU:\t\t");
|
|
for(IdBa=0; IdBa<sizeof(pStats->AMPDU)/sizeof(pStats->AMPDU[0]); IdBa++)
|
|
{
|
|
if ((IdBa != 0) && ((IdBa & 0x07) == 0))
|
|
printk("\n\t\t\t");
|
|
/* End of if */
|
|
|
|
printk("%d\t", pStats->AMPDU[IdBa]);
|
|
} /* End of for */
|
|
}
|
|
#endif /* ACM_CC_FUNC_11N */
|
|
#endif /* WMM_ACM_PKT_NUM_DEBUG */
|
|
|
|
printk("\n");
|
|
} /* End of AcmCmdStatistics */
|
|
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Send a re-associate frame to the associated AP.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Used in WMM ACM AP Test Cases in WiFi WMM ACM Test Plan.
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdReAssociate(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
MLME_QUEUE_ELEM *pMlmeQueue;
|
|
MLME_ASSOC_REQ_STRUCT *pInfoAssocReq;
|
|
NDIS_STATUS Status;
|
|
PUCHAR pBufOut;
|
|
UCHAR ApMac[6], UAPSD[ACM_DEV_NUM_OF_AC];
|
|
|
|
|
|
/* init */
|
|
pBufOut = NULL;
|
|
|
|
/* get input arguments */
|
|
#ifdef IEEE80211E_SIMULATION
|
|
memcpy(ApMac, gMAC_AP, 6);
|
|
ApMac[5] = AcmCmdUtilHexGet(&pArgv);
|
|
|
|
if (ApMac[5] == 0x00)
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
memcpy(ApMac, ACMR_AP_ADDR_GET(pAd), 6);
|
|
/* End of if */
|
|
|
|
/* allocate probe re-assoc frame buffer */
|
|
Status = MlmeAllocateMemory(pAd, &pBufOut);
|
|
if (Status != NDIS_STATUS_SUCCESS)
|
|
{
|
|
printk("acm_err> allocate auth buffer fail!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* allocate mlme msg queue, dont use local array, the structure size
|
|
is too large */
|
|
ACMR_MEM_ALLOC(pMlmeQueue, sizeof(MLME_QUEUE_ELEM), (MLME_QUEUE_ELEM *));
|
|
if (pMlmeQueue == NULL)
|
|
{
|
|
printk("acm_err> allocate mlme msg queue fail!\n");
|
|
goto LabelErr;
|
|
} /* End of if */
|
|
|
|
/* assign old UAPSD state temporarily */
|
|
UAPSD[0] = pAd->CommonCfg.bAPSDAC_BE;
|
|
UAPSD[1] = pAd->CommonCfg.bAPSDAC_BK;
|
|
UAPSD[2] = pAd->CommonCfg.bAPSDAC_VI;
|
|
UAPSD[3] = pAd->CommonCfg.bAPSDAC_VO;
|
|
|
|
pAd->CommonCfg.bAPSDAC_BE = \
|
|
pAd->CommonCfg.bACMAPSDBackup[ACM_EDCA_BE_AC_QUE_ID];
|
|
pAd->CommonCfg.bAPSDAC_BK = \
|
|
pAd->CommonCfg.bACMAPSDBackup[ACM_EDCA_BK_AC_QUE_ID];
|
|
pAd->CommonCfg.bAPSDAC_VI = \
|
|
pAd->CommonCfg.bACMAPSDBackup[ACM_EDCA_VI_AC_QUE_ID];
|
|
pAd->CommonCfg.bAPSDAC_VO = \
|
|
pAd->CommonCfg.bACMAPSDBackup[ACM_EDCA_VO_AC_QUE_ID];
|
|
|
|
/* init/tx association request frame body */
|
|
pInfoAssocReq = (MLME_ASSOC_REQ_STRUCT *)pMlmeQueue->Msg;
|
|
ACMR_MEM_MAC_COPY(pInfoAssocReq->Addr, ApMac);
|
|
pInfoAssocReq->CapabilityInfo = 0x0001;
|
|
pInfoAssocReq->Timeout = ASSOC_TIMEOUT;
|
|
|
|
MlmeReassocReqAction(pAd, pMlmeQueue);
|
|
|
|
/* recover UAPSD state due to TSPEC maybe */
|
|
pAd->CommonCfg.bAPSDAC_BE = UAPSD[0];
|
|
pAd->CommonCfg.bAPSDAC_BK = UAPSD[1];
|
|
pAd->CommonCfg.bAPSDAC_VI = UAPSD[2];
|
|
pAd->CommonCfg.bAPSDAC_VO = UAPSD[3];
|
|
|
|
ACMR_MEM_FREE(pMlmeQueue);
|
|
|
|
LabelErr:
|
|
/* free the frame buffer */
|
|
MlmeFreeMemory(pAd, pBufOut);
|
|
return;
|
|
} /* End of AcmCmdReAssociate */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Enable or disable TSPEC timeout mechanism.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Used in WMM ACM UAPSD Test Cases in WiFi WMM ACM Test Plan.
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdTspecTimeoutCtrl(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMP_TC_TimeoutCtrl(pAd, AcmCmdUtilNumGet(&pArgv));
|
|
} /* End of AcmCmdTspecTimeoutCtrl */
|
|
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Enable or disable TSPEC UAPSD function.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Used in WMM ACM UAPSD Test Cases in WiFi WMM ACM Test Plan.
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdTspecUapsdCtrl(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMP_TC_UapsdCtrl(pAd, AcmCmdUtilNumGet(&pArgv));
|
|
} /* End of AcmCmdTspecUapsdCtrl */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Send a associate frame to the associated AP.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Used in WMM ACM AP Test Cases in WiFi WMM ACM Test Plan.
|
|
|
|
1. Command Format: 21
|
|
[AP MAC]
|
|
[AC0 UAPSD Flag] [AC1 UAPSD Flag] [AC2 UAPSD Flag] [AC3 UAPSD Flag]
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdAssociate(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
MLME_QUEUE_ELEM *pMlmeQueue;
|
|
MLME_ASSOC_REQ_STRUCT *pInfoAssocReq;
|
|
NDIS_STATUS Status;
|
|
PUCHAR pBufOut;
|
|
UCHAR ApMac[6];
|
|
|
|
|
|
/* init */
|
|
pBufOut = NULL;
|
|
|
|
/* get input arguments */
|
|
#ifdef IEEE80211E_SIMULATION
|
|
memcpy(ApMac, gMAC_AP, 6);
|
|
ApMac[5] = AcmCmdUtilHexGet(&pArgv);
|
|
|
|
if (ApMac[5] == 0x00)
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
memcpy(ApMac, ACMR_AP_ADDR_GET(pAd), 6);
|
|
/* End of if */
|
|
|
|
/* allocate assoc frame buffer */
|
|
Status = MlmeAllocateMemory(pAd, &pBufOut);
|
|
if (Status != NDIS_STATUS_SUCCESS)
|
|
{
|
|
printk("acm_err> allocate auth buffer fail!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* allocate mlme msg queue, dont use local array, the structure size
|
|
is too large */
|
|
ACMR_MEM_ALLOC(pMlmeQueue, sizeof(MLME_QUEUE_ELEM), (MLME_QUEUE_ELEM *));
|
|
if (pMlmeQueue == NULL)
|
|
{
|
|
printk("acm_err> allocate mlme msg queue fail!\n");
|
|
goto LabelErr;
|
|
} /* End of if */
|
|
|
|
/* free all TSPECs silently without sending DELTS frames */
|
|
ACMP_StationDelete(pAd, ACMR_STA_ENTRY_GET(pAd, pAd->CommonCfg.Bssid));
|
|
|
|
/* assign new UAPSD state */
|
|
pAd->CommonCfg.bAPSDAC_BE = AcmCmdUtilNumGet(&pArgv);
|
|
pAd->CommonCfg.bAPSDAC_BK = AcmCmdUtilNumGet(&pArgv);
|
|
pAd->CommonCfg.bAPSDAC_VI = AcmCmdUtilNumGet(&pArgv);
|
|
pAd->CommonCfg.bAPSDAC_VO = AcmCmdUtilNumGet(&pArgv);
|
|
pAd->CommonCfg.bACMAPSDTr[0] = pAd->CommonCfg.bAPSDAC_BE;
|
|
pAd->CommonCfg.bACMAPSDTr[1] = pAd->CommonCfg.bAPSDAC_BK;
|
|
pAd->CommonCfg.bACMAPSDTr[2] = pAd->CommonCfg.bAPSDAC_VI;
|
|
pAd->CommonCfg.bACMAPSDTr[3] = pAd->CommonCfg.bAPSDAC_VO;
|
|
|
|
/* init/tx association request frame body */
|
|
pInfoAssocReq = (MLME_ASSOC_REQ_STRUCT *)pMlmeQueue->Msg;
|
|
ACMR_MEM_MAC_COPY(pInfoAssocReq->Addr, ApMac);
|
|
pInfoAssocReq->CapabilityInfo = 0x0001;
|
|
pInfoAssocReq->Timeout = ASSOC_TIMEOUT;
|
|
|
|
MlmeAssocReqAction(pAd, pMlmeQueue);
|
|
|
|
/* so if association response fails, these UAPSD states are still changed */
|
|
|
|
ACMR_MEM_FREE(pMlmeQueue);
|
|
|
|
LabelErr:
|
|
/* free the frame buffer */
|
|
MlmeFreeMemory(pAd, pBufOut);
|
|
return;
|
|
} /* End of AcmCmdAssociate */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
#ifdef ACM_CC_FUNC_ACL
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Add a ACL station entry.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. Command Format: 22
|
|
[STA MAC]
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdAclAdd(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACM_ACL_ENTRY *pAclEntry;
|
|
UCHAR MacPeer[6];
|
|
ULONG SplFlags;
|
|
|
|
|
|
/* init */
|
|
ACMR_MEM_ALLOC(pAclEntry, sizeof(ACM_ACL_ENTRY), (ACM_ACL_ENTRY *));
|
|
ACMR_MEM_ZERO(pAclEntry, sizeof(ACM_ACL_ENTRY));
|
|
ACMR_MEM_ZERO(MacPeer, sizeof(MacPeer));
|
|
|
|
/* parse MAC */
|
|
AcmCmdUtilMacGet(&pArgv, MacPeer);
|
|
ACMR_MEM_MAC_COPY(pAclEntry->STA_MAC, MacPeer);
|
|
|
|
/* add MAC */
|
|
ACM_TSPEC_SEM_LOCK_CHK(pAd, SplFlags, LabelSemErr);
|
|
ACMR_ACL_INSERT_TAIL(pAd, pAclEntry);
|
|
ACM_TSPEC_SEM_UNLOCK(pAd, LabelSemErr);
|
|
return;
|
|
|
|
LabelSemErr:
|
|
ACMR_MEM_FREE(pAclEntry);
|
|
} /* End of AcmCmdAclAdd */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Del a ACL station entry.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. Command Format: 23
|
|
[STA MAC]
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdAclDel(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
UCHAR MacPeer[6];
|
|
ULONG SplFlags;
|
|
|
|
|
|
/* init */
|
|
ACMR_MEM_ZERO(MacPeer, sizeof(MacPeer));
|
|
|
|
/* parse MAC */
|
|
AcmCmdUtilMacGet(&pArgv, MacPeer);
|
|
|
|
/* add MAC */
|
|
ACM_TSPEC_SEM_LOCK_CHK(pAd, SplFlags, LabelSemErr);
|
|
ACM_ACL_ENTRY_DEL(pAd, MacPeer);
|
|
ACM_TSPEC_SEM_UNLOCK(pAd, LabelSemErr);
|
|
|
|
LabelSemErr:
|
|
return;
|
|
} /* End of AcmCmdAclDel */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Control ACL function.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. Command Format: 24
|
|
[Enable/Disable]
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdAclCtrl(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ULONG SplFlags;
|
|
BOOLEAN FlgIsEnabled;
|
|
|
|
|
|
FlgIsEnabled = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
ACM_TSPEC_SEM_LOCK_CHK(pAd, SplFlags, LabelSemErr);
|
|
ACMR_ACL_ENABLE(pAd, FlgIsEnabled);
|
|
ACM_TSPEC_SEM_UNLOCK(pAd, LabelSemErr);
|
|
|
|
LabelSemErr:
|
|
return;
|
|
} /* End of AcmCmdAclCtrl */
|
|
#endif /* ACM_CC_FUNC_ACL */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
|
|
|
|
|
|
#ifdef IEEE80211E_SIMULATION
|
|
/* =========================== Simulation Function ========================== */
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Simulate a QoS authentication req & association req event.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Command Format:
|
|
wssm_assoc (Client MAC) (UAPSD AC0) (UAPSD AC1) (UAPSD AC2) (UAPSD AC3)
|
|
(Is 11n) (HT Capability Info byte1) (HT Capability Info byte2)
|
|
(MCS Set 0~7) (MCS Set 8~15) (MCS Set 16~23)
|
|
3. For HT Capability Info
|
|
bit1: Supported channel width set
|
|
bit5: Short GI for 20 MHz
|
|
bit6: Short GI for 40 MHz
|
|
4. 11n association command example: (40MHz)
|
|
Default: Minimum MPDU Start Spacing = 2us, Maximum Rx A-MPDU is 64K
|
|
iwpriv ra0 set acm=50_00_1_1_1_1_1_1a_00_ff_ff_00
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimAssocBuild(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
NDIS_STATUS Status;
|
|
HEADER_802_11 HdrAuthAssoc;
|
|
|
|
PUCHAR pBufOut;
|
|
ULONG LenFrame;
|
|
USHORT AuthAlg, AuthSeq, AuthStatus;
|
|
USHORT AssocCap, AssocLsn;
|
|
UCHAR SSID_EID, SSID_Len, SSID[MAX_LEN_OF_SSID];
|
|
UCHAR SUPR_EID, SUPR_Len, SupRate[4] = { 0x82, 0x84, 0x8B, 0x96 };
|
|
UCHAR EXTR_EID, EXTR_Len, ExtRate[4] = { 0xB0, 0xC8, 0xE0, 0xEC };
|
|
UCHAR IE_WME[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2,
|
|
0x02, 0x00, 0x01, 0x0F};
|
|
UCHAR DevMac[6], *pStaMac;
|
|
UCHAR UapsdAc0, UapsdAc1, UapsdAc2, UapsdAc3;
|
|
|
|
/* for 11n */
|
|
UCHAR IdMcsByte;
|
|
UCHAR Flg11N; /* is this a 11n station */
|
|
UCHAR HTCapInfoEID, HTCapInfoLen, HTCapInfo[26] = {
|
|
0x6E, 0x00, 0x13, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
|
|
|
|
|
/* init */
|
|
pBufOut = NULL;
|
|
SSID_Len = pAd->ApCfg.MBSSID[0].SsidLen;
|
|
ACMR_MEM_COPY(SSID, pAd->ApCfg.MBSSID[0].Ssid, SSID_Len);
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* get client MAC */
|
|
if (Argc >= 1)
|
|
{
|
|
DevMac[0] = gMAC_STA[0];
|
|
DevMac[1] = gMAC_STA[1];
|
|
DevMac[2] = gMAC_STA[2];
|
|
DevMac[3] = gMAC_STA[3];
|
|
DevMac[4] = gMAC_STA[4];
|
|
DevMac[5] = AcmCmdUtilHexGet(&pArgv);
|
|
pStaMac = DevMac;
|
|
|
|
if (DevMac[5] == 0x00)
|
|
DevMac[5] = gMAC_STA[5];
|
|
/* End of if */
|
|
|
|
UapsdAc0 = AcmCmdUtilHexGet(&pArgv) & 0x01;
|
|
UapsdAc1 = AcmCmdUtilHexGet(&pArgv) & 0x01;
|
|
UapsdAc2 = AcmCmdUtilHexGet(&pArgv) & 0x01;
|
|
UapsdAc3 = AcmCmdUtilHexGet(&pArgv) & 0x01;
|
|
|
|
IE_WME[8] = (UapsdAc0 << 3) |
|
|
(UapsdAc1 << 2) |
|
|
(UapsdAc2 << 1) |
|
|
(UapsdAc3);
|
|
|
|
/* for 11n */
|
|
Flg11N = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
if (Flg11N != 0)
|
|
{
|
|
HTCapInfoEID = 0x2D;
|
|
HTCapInfoLen = 26;
|
|
|
|
HTCapInfo[0] = AcmCmdUtilHexGet(&pArgv);
|
|
HTCapInfo[1] = AcmCmdUtilHexGet(&pArgv);
|
|
|
|
/* only support MCS0 ~ MCS23 */
|
|
for(IdMcsByte=0; IdMcsByte<3; IdMcsByte++)
|
|
HTCapInfo[3+IdMcsByte] = AcmCmdUtilHexGet(&pArgv);
|
|
/* End of for */
|
|
} /* End of if */
|
|
}
|
|
else
|
|
{
|
|
pStaMac = gMAC_STA;
|
|
|
|
/* for 11n */
|
|
Flg11N = 0;
|
|
} /* End of if */
|
|
|
|
/* allocate authentication request frame buffer */
|
|
Status = MlmeAllocateMemory(pAd, &pBufOut);
|
|
if (Status != NDIS_STATUS_SUCCESS)
|
|
{
|
|
printk("acm_err> allocate auth buffer fail!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* init authentication frame body */
|
|
AuthAlg = Ndis802_11AuthModeOpen;
|
|
AuthSeq = 1;
|
|
AuthStatus = MLME_SUCCESS;
|
|
|
|
MgtMacHeaderInit(pAd, &HdrAuthAssoc, SUBTYPE_AUTH, 0,
|
|
pAd->ApCfg.MBSSID[BSS0].Bssid, pStaMac);
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAuthAssoc,
|
|
2, &AuthAlg,
|
|
2, &AuthSeq,
|
|
2, &AuthStatus,
|
|
END_OF_ARGS);
|
|
|
|
/* send the virtual auth frame to MLME handler */
|
|
printk("11e_msg> simulate a authen request...\n");
|
|
|
|
REPORT_MGMT_FRAME_TO_MLME(pAd, 0, pBufOut, LenFrame, 0, 0, 0, 0, pAd->OpMode);
|
|
|
|
/* init association frame body */
|
|
MgtMacHeaderInit(pAd, &HdrAuthAssoc, SUBTYPE_ASSOC_REQ, 0,
|
|
pAd->ApCfg.MBSSID[BSS0].Bssid, pStaMac);
|
|
|
|
AssocCap = 0x0001;
|
|
AssocLsn = 1;
|
|
SSID_EID = IE_SSID;
|
|
SUPR_EID = IE_SUPP_RATES;
|
|
SUPR_Len = 4;
|
|
EXTR_EID = IE_EXT_SUPP_RATES;
|
|
EXTR_Len = 4;
|
|
|
|
if (Flg11N != 0)
|
|
{
|
|
/* for 11n */
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAuthAssoc,
|
|
2, &AssocCap,
|
|
2, &AssocLsn,
|
|
1, &SSID_EID,
|
|
1, &SSID_Len,
|
|
SSID_Len, SSID,
|
|
1, &SUPR_EID,
|
|
1, &SUPR_Len,
|
|
SUPR_Len, SupRate,
|
|
1, &EXTR_EID,
|
|
1, &EXTR_Len,
|
|
EXTR_Len, ExtRate,
|
|
9, &IE_WME[0],
|
|
1, &HTCapInfoEID,
|
|
1, &HTCapInfoLen,
|
|
HTCapInfoLen, HTCapInfo,
|
|
END_OF_ARGS);
|
|
}
|
|
else
|
|
{
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAuthAssoc,
|
|
2, &AssocCap,
|
|
2, &AssocLsn,
|
|
1, &SSID_EID,
|
|
1, &SSID_Len,
|
|
SSID_Len, SSID,
|
|
1, &SUPR_EID,
|
|
1, &SUPR_Len,
|
|
SUPR_Len, SupRate,
|
|
1, &EXTR_EID,
|
|
1, &EXTR_Len,
|
|
EXTR_Len, ExtRate,
|
|
9, &IE_WME[0],
|
|
END_OF_ARGS);
|
|
} /* End of if */
|
|
|
|
/* send the virtual assoc frame to MLME handler */
|
|
printk("11e_msg> simulate a assoc request...\n");
|
|
|
|
REPORT_MGMT_FRAME_TO_MLME(pAd, 0, pBufOut, LenFrame, 0, 0, 0, 0, pAd->OpMode);
|
|
|
|
/* free the frame buffer */
|
|
MlmeFreeMemory(pAd, pBufOut);
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
} /* End of AcmCmdSimAssocBuild */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Simulate a ADDTS Request frame receive event.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP.
|
|
|
|
[sta mac:xx:xx:xx:xx:xx:xx]
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[APSD:0~1] [nom size:byte] [inact:sec] [mean data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1] [tclas processing:0~1]
|
|
[ack policy:0~3] (AMSDU aggregation number)
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimReqRcv(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
ACM_STREAM_INFO StreamInfo;
|
|
ACMR_STA_DB *pCdb;
|
|
ACM_TSPEC *pTspec;
|
|
ACM_TS_INFO *pInfo;
|
|
UCHAR StreamType;
|
|
UCHAR MAC[6], *pStaMac;
|
|
UCHAR TclasProcessing, NumOfMsdu;
|
|
|
|
NDIS_STATUS Status;
|
|
HEADER_802_11 HdrAction;
|
|
PUCHAR pBufOut;
|
|
ULONG LenFrame;
|
|
|
|
|
|
/* init */
|
|
pCdb = NULL;
|
|
pTspec = &StreamInfo.Tspec;
|
|
pInfo = &pTspec->TsInfo;
|
|
pStaMac = MAC;
|
|
pBufOut = NULL;
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* get sta mac address */
|
|
ACMR_MEM_COPY(MAC, gMAC_STA, 6);
|
|
|
|
MAC[5] = AcmCmdUtilHexGet(&pArgv);
|
|
if (MAC[5] == 0x00)
|
|
ACMR_MEM_COPY(MAC, gMAC_STA, 6);
|
|
/* End of if */
|
|
|
|
/* get sta entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, MAC);
|
|
if (pCdb == NULL)
|
|
{
|
|
printk("acm_err> the station %02x:%02x:%02x:%02x:%02x:%02x "
|
|
"does NOT exist!\n",
|
|
MAC[0], MAC[1], MAC[2], MAC[3], MAC[4], MAC[5]);
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* parse input command */
|
|
if (AcmCmdInfoParse(
|
|
pAd,
|
|
&pArgv,
|
|
pTspec,
|
|
pInfo,
|
|
&StreamType) != 0)
|
|
{
|
|
return;
|
|
} /* End of if */
|
|
|
|
TclasProcessing = AcmCmdUtilNumGet(&pArgv);
|
|
pInfo->AckPolicy = AcmCmdUtilNumGet(&pArgv); /* default 0 */
|
|
NumOfMsdu = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
#ifdef ACM_CC_FUNC_11N_AGG
|
|
/* do not care if AMSDU is enabled, just for test */
|
|
if (NumOfMsdu > 1)
|
|
{
|
|
/*
|
|
<AMSDU> is used only in station.
|
|
|
|
Nominal A-MSDU Size =
|
|
MAC Header Size
|
|
+ Nominal MSDU Aggregation * Nominal A-MSDU Subframe Size
|
|
- Pad Size
|
|
+ Security Encapsulation Size
|
|
+ FCS Size
|
|
|
|
Nominal A-MSDU Subframe Size =
|
|
A-MSDU Subframe Header Size
|
|
+ Nominal MSDU Size
|
|
+ Pad Size
|
|
|
|
A-MSDU Subframe is as below:
|
|
DA(6) + SA(6) + Length(2) + MSDU + Padding (0~3)
|
|
*/
|
|
/*
|
|
For AMSDU, we need to pre-calculate the Nominal MSDU size and
|
|
updated Mean Data Rate.
|
|
|
|
Example Video 10Mbps, 1316B, so PPS = 10^7/(1316 x 8) = 949.848
|
|
|
|
Assume A-MSDU with aggregation of 5 MSDUs per A-MSDU
|
|
Nom MSDU = MSDUAgg x (Papp + Subframe Header + Pad) - Pad + MSDU O/H
|
|
= 5 x (1316 + 14 + 2) - 2 + 47 = 6946B
|
|
Mean Data Rate = (6946 x 8)/5 x 948.85 = 10.55623Mbps
|
|
*/
|
|
UINT32 NominalMsduSize, PPS;
|
|
|
|
PPS = pTspec->MeanDataRate / (pTspec->NominalMsduSize << 3) + 1;
|
|
|
|
NominalMsduSize = FRM_LENGTH_AGG_AMSDU_HDR;
|
|
NominalMsduSize += (FRM_LENGTH_AGG_AMSDU_HDR +\
|
|
pTspec->NominalMsduSize) * NumOfMsdu;
|
|
|
|
pTspec->NominalMsduSize = NominalMsduSize;
|
|
pTspec->MeanDataRate = ((NominalMsduSize << 3)*PPS) / NumOfMsdu;
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("\nacm_msg> New NormSize %d and MeanRate = %d\n",
|
|
pTspec->NominalMsduSize, pTspec->MeanDataRate));
|
|
}
|
|
#endif /* ACM_CC_FUNC_11N_AGG */
|
|
|
|
/* vitual send a ADDTS request frame to our AP */
|
|
Status = MlmeAllocateMemory(pAd, &pBufOut);
|
|
if (Status != NDIS_STATUS_SUCCESS)
|
|
{
|
|
printk("acm_err> allocate action buffer fail!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* init ADDTS request frame body */
|
|
MgtMacHeaderInit(pAd, &HdrAction, SUBTYPE_ACTION, 0,
|
|
pAd->ApCfg.MBSSID[BSS0].Bssid, pStaMac);
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAction,
|
|
END_OF_ARGS);
|
|
|
|
LenFrame += ACM_CMD_WME_Action_Make(pAd, &StreamInfo,
|
|
&pBufOut[LenFrame],
|
|
ACM_ACTION_WME_SETUP_REQ,
|
|
0,
|
|
TclasProcessing);
|
|
|
|
/* send the ADDTS request frame to ACM module */
|
|
ACMP_ManagementHandle(pAd, pCdb, ACMR_SUBTYPE_ACTION,
|
|
pBufOut, LenFrame, 11000000);
|
|
|
|
/* free the frame buffer */
|
|
MlmeFreeMemory(pAd, pBufOut);
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
} /* End of AcmCmdSimReqRcv */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Delete a actived stream.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP & QSTA.
|
|
2. Command Format: 52
|
|
wssm_del [Client MAC] [type:1-WME] [TID:0~7] [dir:0~3]
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimDel(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMR_WLAN_HEADER HdrAction;
|
|
ACMR_STA_DB *pCdb;
|
|
ULONG LenFrame;
|
|
UCHAR *pBufFrame;
|
|
NDIS_STATUS Status;
|
|
|
|
/* WME tear down packet */
|
|
ACM_WME_NOT_FRAME *pNotFrame;
|
|
ACM_ELM_WME_TSPEC *pElmTspec;
|
|
ACM_WME_TSPEC *pTspec;
|
|
ACM_WME_TS_INFO *pInfo;
|
|
UINT32 Type, TID, Dir;
|
|
UCHAR DevMac[6];
|
|
|
|
|
|
/* init */
|
|
pCdb = NULL;
|
|
LenFrame = 0;
|
|
pBufFrame = NULL;
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* get input arguments */
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
{
|
|
memcpy(DevMac, gMAC_STA, 6);
|
|
DevMac[5] = AcmCmdUtilHexGet(&pArgv);
|
|
if (DevMac[5] == 0x00)
|
|
DevMac[5] = gMAC_STA[5];
|
|
/* End of if */
|
|
} /* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
if (ACMR_IS_STA_MODE(pAd))
|
|
{
|
|
AcmCmdUtilHexGet(&pArgv);
|
|
memcpy(DevMac, gMAC_AP, 6);
|
|
} /* End of if */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
ACM_NIN_DEC_MGET(Type, 0, 1, ("err> type fail!\n"));
|
|
ACM_NIN_DEC_MGET(TID, 0, 7, ("err> TID fail!\n"));
|
|
ACM_NIN_DEC_MGET(Dir, 0, 3, ("err> direction fail!\n"));
|
|
|
|
/* get sta entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, DevMac);
|
|
if (pCdb == NULL)
|
|
{
|
|
printk("acm_err> the station does NOT exist!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* get an unused nonpaged memory */
|
|
Status = MlmeAllocateMemory(pAd, &pBufFrame);
|
|
if (Status != NDIS_STATUS_SUCCESS)
|
|
return;
|
|
/* End of if */
|
|
|
|
/* make the frame header */
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
{
|
|
MgtMacHeaderInit(pAd, &HdrAction, SUBTYPE_ACTION, 0,
|
|
pAd->ApCfg.MBSSID[BSS0].Bssid,
|
|
DevMac);
|
|
} /* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
if (ACMR_IS_STA_MODE(pAd))
|
|
{
|
|
MgtMacHeaderInit(pAd, &HdrAction, SUBTYPE_ACTION, 0,
|
|
ACMR_SELF_MAC_GET(pAd),
|
|
DevMac);
|
|
} /* End of if */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
MakeOutgoingFrame(pBufFrame, &LenFrame,
|
|
sizeof(ACMR_WLAN_HEADER), &HdrAction,
|
|
END_OF_ARGS);
|
|
|
|
if (Type == 1)
|
|
{
|
|
/* init WME Tear down frame body */
|
|
pNotFrame = (ACM_WME_NOT_FRAME *)&pBufFrame[LenFrame];
|
|
pNotFrame->Category = ACM_CATEGORY_WME;
|
|
pNotFrame->Action = ACM_ACTION_WME_TEAR_DOWN;
|
|
pNotFrame->DialogToken = 0;
|
|
pNotFrame->StatusCode = 0;
|
|
|
|
pElmTspec = &pNotFrame->ElmTspec;
|
|
pElmTspec->ElementId = ACM_ELM_WME_ID;
|
|
pElmTspec->Length = ACM_ELM_WME_TSPEC_LEN;
|
|
pElmTspec->OUI[0] = ACM_WME_OUI_0;
|
|
pElmTspec->OUI[1] = ACM_WME_OUI_1;
|
|
pElmTspec->OUI[2] = ACM_WME_OUI_2;
|
|
pElmTspec->OUI_Type = ACM_WME_OUI_TYPE;
|
|
pElmTspec->OUI_SubType = ACM_WME_OUI_SUBTYPE_TSPEC;
|
|
pElmTspec->Version = ACM_WME_OUI_VERSION;
|
|
|
|
pTspec = &pElmTspec->Tspec;
|
|
memset((UCHAR *)pTspec, 0, sizeof(ACM_WME_TSPEC));
|
|
|
|
pInfo = &pTspec->TsInfo;
|
|
pInfo->Direction = Dir;
|
|
pInfo->TID = TID;
|
|
|
|
LenFrame += ACM_NOT_FRAME_BODY_LEN;
|
|
} /* End of if */
|
|
|
|
/* dont care other parameters in TSPEC, such as NominalMsduSize, etc. */
|
|
|
|
/* send the DELTS frame to ACM module */
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
if (ACMR_IS_AP_MODE(pAd))
|
|
ACM_ActionHandleByQAP(pAd, pCdb, pBufFrame, LenFrame, 11000000);
|
|
/* End of if */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
if (ACMR_IS_STA_MODE(pAd))
|
|
ACM_ActionHandleByQSTA(pAd, pCdb, pBufFrame, LenFrame);
|
|
/* End of if */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
LabelErr:
|
|
/* free the frame buffer */
|
|
if (pBufFrame != NULL)
|
|
MlmeFreeMemory(pAd, pBufFrame);
|
|
/* End of if */
|
|
} /* End of AcmCmdSimDel */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Continue to receive QoS packets from a QSTA.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Command Format:
|
|
wssm_datrv [Src Client MAC] [Dst Client MAC]
|
|
[type:0-11e, 1-WME] [TID:0~7] [size] (ack: 0~1)
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimDataRv(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
UCHAR MacSrc[6], MacDst[6];
|
|
UINT32 Type, SizeData;
|
|
UINT32 AckPolicy;
|
|
UINT32 SizeFrag;
|
|
UCHAR FlgIsRtsEnabled, FlgIsTimerEnabled;
|
|
UCHAR TSID;
|
|
UINT32 IdFlowNum;
|
|
/* ULONG SplFlags; */
|
|
|
|
|
|
/* init */
|
|
AckPolicy = 0;
|
|
SizeFrag = 0;
|
|
FlgIsRtsEnabled = 0;
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* sanity check for parameter number */
|
|
ACM_ARGC_SANITY_CHECK(6, 9);
|
|
|
|
/* active data task */
|
|
if (gCmdFlgIsInit == 0)
|
|
{
|
|
/* invalid all flows */
|
|
for(IdFlowNum=0; IdFlowNum<ACM_MAX_NUM_OF_SIM_DATA_FLOW; IdFlowNum++)
|
|
gDATA_Sim[IdFlowNum].FlgIsValidEntry = 0;
|
|
/* End of for */
|
|
|
|
/* init */
|
|
gTaskDataSleep = 1;
|
|
|
|
ACMR_TASK_INIT(pAd, gTaskletSim, ACM_CMD_Task_Data_Simulation, pAd, "ACM_SIM");
|
|
|
|
gCmdFlgIsInit = 1;
|
|
} /* End of if */
|
|
|
|
/* get source Client MAC */
|
|
MacSrc[0] = gMAC_STA[0];
|
|
MacSrc[1] = gMAC_STA[1];
|
|
MacSrc[2] = gMAC_STA[2];
|
|
MacSrc[3] = gMAC_STA[3];
|
|
MacSrc[4] = gMAC_STA[4];
|
|
MacSrc[5] = AcmCmdUtilHexGet(&pArgv);
|
|
|
|
/* get destination Client MAC */
|
|
MacDst[0] = gMAC_STA[0];
|
|
MacDst[1] = gMAC_STA[1];
|
|
MacDst[2] = gMAC_STA[2];
|
|
MacDst[3] = gMAC_STA[3];
|
|
MacDst[4] = gMAC_STA[4];
|
|
MacDst[5] = AcmCmdUtilHexGet(&pArgv);
|
|
|
|
/* get type, TID, & SizeData */
|
|
Type = AcmCmdUtilNumGet(&pArgv);
|
|
TSID = AcmCmdUtilNumGet(&pArgv);
|
|
SizeData = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
if (SizeData < 5)
|
|
SizeData = 5;
|
|
/* End of if */
|
|
|
|
/* get ACK policy */
|
|
if (Argc != 6)
|
|
{
|
|
AckPolicy = AcmCmdUtilNumGet(&pArgv);
|
|
SizeFrag = AcmCmdUtilNumGet(&pArgv);
|
|
FlgIsRtsEnabled = AcmCmdUtilNumGet(&pArgv);
|
|
} /* End of if */
|
|
|
|
/* semaphore lock */
|
|
ACM_DATA_SEM_LOCK(LabelSemErr);
|
|
|
|
for(IdFlowNum=0; IdFlowNum<ACM_MAX_NUM_OF_SIM_DATA_FLOW; IdFlowNum++)
|
|
{
|
|
if (gDATA_Sim[IdFlowNum].FlgIsValidEntry == 0)
|
|
{
|
|
memcpy(gDATA_Sim[IdFlowNum].MacSrc, MacSrc, 6);
|
|
memcpy(gDATA_Sim[IdFlowNum].MacDst, MacDst, 6);
|
|
|
|
gDATA_Sim[IdFlowNum].Direction = 0; /* receive */
|
|
gDATA_Sim[IdFlowNum].Type = Type;
|
|
gDATA_Sim[IdFlowNum].TID = TSID;
|
|
gDATA_Sim[IdFlowNum].AckPolicy = AckPolicy;
|
|
|
|
gDATA_Sim[IdFlowNum].FrameSize = SizeData;
|
|
gDATA_Sim[IdFlowNum].NumSeq = 0;
|
|
gDATA_Sim[IdFlowNum].NumFrag = 0;
|
|
|
|
gDATA_Sim[IdFlowNum].FlgIsValidEntry = 1;
|
|
break;
|
|
} /* End of if */
|
|
} /* End of for */
|
|
|
|
if (IdFlowNum == ACM_MAX_NUM_OF_SIM_DATA_FLOW)
|
|
printk("err> No any free entry can be added!\n");
|
|
else
|
|
gTaskDataSleep = 0;
|
|
/* End of if */
|
|
|
|
ACM_DATA_SEM_UNLOCK();
|
|
|
|
/* start simulation timer */
|
|
FlgIsTimerEnabled = 0;
|
|
ACMR_TIMER_ENABLE(FlgIsTimerEnabled, gTimerSim, ACM_STREAM_CHECK_OFFSET);
|
|
|
|
#if 0
|
|
del_timer(&gTimerSim);
|
|
gTimerSim.expires = jiffies + 10; /* 100 ms */
|
|
add_timer(&gTimerSim);
|
|
#endif
|
|
|
|
LabelSemErr:
|
|
return;
|
|
} /* End of AcmCmdSimDataRv */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Continue to transmit packets from upper layer.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Command Format: 54
|
|
wssm_dattx [Dst Client MAC]
|
|
[type:0-11e, 1-WME] [UP:0~7] [size] [ack: 0~1]
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimDataTx(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
UCHAR MacDst[6];
|
|
UINT32 Type, TID, SizeData;
|
|
UINT32 AckPolicy;
|
|
UINT32 IdFlowNum;
|
|
UCHAR FlgIsTimerEnabled;
|
|
/* ULONG SplFlags; */
|
|
|
|
|
|
/* init */
|
|
AckPolicy = 0;
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* active data task */
|
|
if (gCmdFlgIsInit == 0)
|
|
{
|
|
/* invalid all flows */
|
|
for(IdFlowNum=0; IdFlowNum<ACM_MAX_NUM_OF_SIM_DATA_FLOW; IdFlowNum++)
|
|
gDATA_Sim[IdFlowNum].FlgIsValidEntry = 0;
|
|
/* End of for */
|
|
|
|
/* init */
|
|
gTaskDataSleep = 1;
|
|
|
|
ACMR_TASK_INIT(pAd, gTaskletSim, ACM_CMD_Task_Data_Simulation, pAd, "ACM_SIM");
|
|
|
|
gCmdFlgIsInit = 1;
|
|
} /* End of if */
|
|
|
|
/* get destination Client MAC */
|
|
ACMR_MEM_ZERO(MacDst, sizeof(MacDst));
|
|
AcmCmdUtilMacGet(&pArgv, MacDst);
|
|
|
|
if (*(UINT32 *)MacDst == 0x00)
|
|
{
|
|
pArgv -= 3;
|
|
MacDst[0] = gMAC_STA[0];
|
|
MacDst[1] = gMAC_STA[1];
|
|
MacDst[2] = gMAC_STA[2];
|
|
MacDst[3] = gMAC_STA[3];
|
|
MacDst[4] = gMAC_STA[4];
|
|
MacDst[5] = AcmCmdUtilHexGet(&pArgv);
|
|
|
|
if (MacDst[5] == 0x00)
|
|
MacDst[5] = gMAC_STA[5];
|
|
/* End of if */
|
|
} /* End of if */
|
|
|
|
/* get type, TID, & SizeData */
|
|
ACM_NIN_DEC_MGET(Type, 0, 1, ("err> type fail!\n"));
|
|
ACM_NIN_DEC_MGET(TID, 0, 7, ("err> TID fail!\n"));
|
|
ACM_NIN_DEC_MGET(SizeData, 5, 1500, ("err> size fail!\n"));
|
|
ACM_NIN_DEC_MGET(AckPolicy, 0, 1, ("err> ack policy fail!\n"));
|
|
|
|
/* semaphore lock */
|
|
ACM_DATA_SEM_LOCK(LabelErr);
|
|
|
|
for(IdFlowNum=0; IdFlowNum<ACM_MAX_NUM_OF_SIM_DATA_FLOW; IdFlowNum++)
|
|
{
|
|
if (gDATA_Sim[IdFlowNum].FlgIsValidEntry == 0)
|
|
{
|
|
memcpy(gDATA_Sim[IdFlowNum].MacSrc, gMAC_AP, 6);
|
|
memcpy(gDATA_Sim[IdFlowNum].MacDst, MacDst, 6);
|
|
|
|
gDATA_Sim[IdFlowNum].Direction = 1; /* transmission */
|
|
gDATA_Sim[IdFlowNum].Type = Type; /* 11e or WME */
|
|
gDATA_Sim[IdFlowNum].TID = TID; /* 0 ~ 7 */
|
|
gDATA_Sim[IdFlowNum].AckPolicy = AckPolicy; /* Normal or No */
|
|
|
|
gDATA_Sim[IdFlowNum].FrameSize = SizeData;
|
|
gDATA_Sim[IdFlowNum].NumSeq = 0; /* no use */
|
|
gDATA_Sim[IdFlowNum].NumFrag = 0; /* no use */
|
|
|
|
#if 0
|
|
/* when receive & fragment, size = fragement size */
|
|
if ((gDATA_Sim[i].Direction == 0) && (SizeFrag > 0))
|
|
gDATA_Sim[i].size = SizeFrag;
|
|
/* End of if */
|
|
#endif /* 0 */
|
|
|
|
gDATA_Sim[IdFlowNum].FlgIsValidEntry = 1;
|
|
break;
|
|
} /* End of if */
|
|
} /* End of for */
|
|
|
|
if (IdFlowNum == ACM_MAX_NUM_OF_SIM_DATA_FLOW)
|
|
printk("err> No any free entry can be added!\n");
|
|
else
|
|
gTaskDataSleep = 0; /* wake up traffic simulation task */
|
|
/* End of if */
|
|
|
|
ACM_DATA_SEM_UNLOCK();
|
|
|
|
/* start simulation timer */
|
|
FlgIsTimerEnabled = 0;
|
|
ACMR_TIMER_ENABLE(FlgIsTimerEnabled, gTimerSim, ACM_STREAM_CHECK_OFFSET);
|
|
|
|
#if 0
|
|
del_timer(&gTimerSim);
|
|
gTimerSim.expires = jiffies + ACM_STREAM_CHECK_OFFSET; /* 100 ms */
|
|
add_timer(&gTimerSim);
|
|
#endif
|
|
|
|
LabelErr:
|
|
return;
|
|
} /* End of AcmCmdSimDataTx */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Stop to continue to send packets to a QSTA.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Command Format:
|
|
wssm_stp (Client MAC)
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimDataStop(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
UINT32 IdFlowNum;
|
|
UCHAR FlgIsEnable;
|
|
/* ULONG SplFlags; */
|
|
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* semaphore lock */
|
|
ACM_DATA_SEM_LOCK(LabelSemErr);
|
|
|
|
/* stop simulation timer */
|
|
ACMR_TIMER_DISABLE(FlgIsEnable, gTimerSim);
|
|
|
|
/* invalid all flows */
|
|
for(IdFlowNum=0; IdFlowNum<ACM_MAX_NUM_OF_SIM_DATA_FLOW; IdFlowNum++)
|
|
gDATA_Sim[IdFlowNum].FlgIsValidEntry = 0;
|
|
/* End of for */
|
|
|
|
ACM_DATA_SEM_UNLOCK();
|
|
|
|
LabelSemErr:
|
|
gTaskDataSleep = 1;
|
|
} /* End of AcmCmdSimDataStop */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Suspend to send packets.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimDataSuspend(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
gTaskDataSleep = 1;
|
|
} /* End of AcmCmdSimDataSuspend */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Resume to send packets.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimDataResume(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
if (Argc == 2)
|
|
{
|
|
/* get delay from the extra field */
|
|
gSimDelay = AcmCmdUtilNumGet(&pArgv);
|
|
} /* End of if */
|
|
|
|
gTaskDataSleep = 0;
|
|
} /* End of AcmCmdSimDataResume */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Simulate a QoS re-association req event.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Command Format:
|
|
wssm_reassoc (Client MAC) (UAPSD AC0) (UAPSD AC1) (UAPSD AC2)
|
|
(UAPSD AC3)
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimReAssocBuild(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
NDIS_STATUS Status;
|
|
HEADER_802_11 HdrAuthAssoc;
|
|
|
|
PUCHAR pBufOut;
|
|
ULONG LenFrame;
|
|
USHORT AssocCap, AssocLsn;
|
|
UCHAR SSID_EID, SSID_Len, SSID[MAX_LEN_OF_SSID];
|
|
UCHAR SUPR_EID, SUPR_Len, SupRate[4] = { 0x82, 0x84, 0x8B, 0x96 };
|
|
UCHAR EXTR_EID, EXTR_Len, ExtRate[4] = { 0xB0, 0xC8, 0xE0, 0xEC };
|
|
UCHAR IE_WME[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2,
|
|
0x02, 0x00, 0x01, 0x0F};
|
|
UCHAR DevMac[6], *pStaMac;
|
|
UCHAR UapsdAc[4];
|
|
|
|
|
|
/* init */
|
|
pBufOut = NULL;
|
|
SSID_Len = pAd->ApCfg.MBSSID[0].SsidLen;
|
|
ACMR_MEM_COPY(SSID, pAd->ApCfg.MBSSID[0].Ssid, SSID_Len+1);
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* get client MAC */
|
|
if (Argc >= 1)
|
|
{
|
|
DevMac[0] = gMAC_STA[0];
|
|
DevMac[1] = gMAC_STA[1];
|
|
DevMac[2] = gMAC_STA[2];
|
|
DevMac[3] = gMAC_STA[3];
|
|
DevMac[4] = gMAC_STA[4];
|
|
DevMac[5] = AcmCmdUtilHexGet(&pArgv);
|
|
pStaMac = DevMac;
|
|
|
|
UapsdAc[0] = AcmCmdUtilNumGet(&pArgv);
|
|
UapsdAc[1] = AcmCmdUtilNumGet(&pArgv);
|
|
UapsdAc[2] = AcmCmdUtilNumGet(&pArgv);
|
|
UapsdAc[3] = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
IE_WME[8] = (UapsdAc[0] << 3) |
|
|
(UapsdAc[1] << 2) |
|
|
(UapsdAc[2] << 1) |
|
|
(UapsdAc[3]);
|
|
}
|
|
else
|
|
pStaMac = gMAC_STA;
|
|
/* End of if */
|
|
|
|
/* allocate authentication request frame buffer */
|
|
Status = MlmeAllocateMemory(pAd, &pBufOut);
|
|
if (Status != NDIS_STATUS_SUCCESS)
|
|
{
|
|
printk("acm_err> allocate auth buffer fail!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* init association frame body */
|
|
MgtMacHeaderInit(pAd, &HdrAuthAssoc, SUBTYPE_REASSOC_REQ, 0,
|
|
pAd->ApCfg.MBSSID[BSS0].Bssid, pStaMac);
|
|
|
|
AssocCap = 0x0001;
|
|
AssocLsn = 1;
|
|
SSID_EID = IE_SSID;
|
|
SUPR_EID = IE_SUPP_RATES;
|
|
SUPR_Len = 4;
|
|
EXTR_EID = IE_EXT_SUPP_RATES;
|
|
EXTR_Len = 4;
|
|
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAuthAssoc,
|
|
2, &AssocCap,
|
|
2, &AssocLsn,
|
|
6, pAd->ApCfg.MBSSID[BSS0].Bssid,
|
|
1, &SSID_EID,
|
|
1, &SSID_Len,
|
|
SSID_Len, SSID,
|
|
1, &SUPR_EID,
|
|
1, &SUPR_Len,
|
|
SUPR_Len, SupRate,
|
|
1, &EXTR_EID,
|
|
1, &EXTR_Len,
|
|
EXTR_Len, ExtRate,
|
|
9, &IE_WME[0],
|
|
END_OF_ARGS);
|
|
|
|
/* send the virtual assoc frame to MLME handler */
|
|
printk("11e_msg> simulate a re-assoc request...\n");
|
|
|
|
REPORT_MGMT_FRAME_TO_MLME(pAd, 0, pBufOut, LenFrame, 0, 0, 0, 0, pAd->OpMode);
|
|
|
|
/* free the frame buffer */
|
|
MlmeFreeMemory(pAd, pBufOut);
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
} /* End of AcmCmdSimReAssocBuild */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Simulate a non-QoS authentication req & association req event.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Command Format:
|
|
wssm_assoc (Client MAC)
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimNonQoSAssocBuild(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
NDIS_STATUS Status;
|
|
HEADER_802_11 HdrAuthAssoc;
|
|
|
|
PUCHAR pBufOut;
|
|
ULONG LenFrame;
|
|
USHORT AuthAlg, AuthSeq, AuthStatus;
|
|
USHORT AssocCap, AssocLsn;
|
|
UCHAR SSID_EID, SSID_Len, SSID[MAX_LEN_OF_SSID];
|
|
UCHAR SUPR_EID, SUPR_Len, SupRate[4] = { 0x82, 0x84, 0x8B, 0x96 };
|
|
UCHAR EXTR_EID, EXTR_Len, ExtRate[4] = { 0xB0, 0xC8, 0xE0, 0xEC };
|
|
UCHAR DevMac[6], *pStaMac;
|
|
|
|
|
|
/* init */
|
|
pBufOut = NULL;
|
|
SSID_Len = pAd->ApCfg.MBSSID[0].SsidLen;
|
|
ACMR_MEM_COPY(SSID, pAd->ApCfg.MBSSID[0].Ssid, SSID_Len+1);
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* get client MAC */
|
|
if (Argc > 1)
|
|
{
|
|
DevMac[0] = gMAC_STA[0];
|
|
DevMac[1] = gMAC_STA[1];
|
|
DevMac[2] = gMAC_STA[2];
|
|
DevMac[3] = gMAC_STA[3];
|
|
DevMac[4] = gMAC_STA[4];
|
|
DevMac[5] = AcmCmdUtilNumGet(&pArgv);
|
|
pStaMac = DevMac;
|
|
}
|
|
else
|
|
pStaMac = gMAC_STA;
|
|
/* End of if */
|
|
|
|
/* allocate authentication request frame buffer */
|
|
Status = MlmeAllocateMemory(pAd, &pBufOut);
|
|
if (Status != NDIS_STATUS_SUCCESS)
|
|
{
|
|
printk("acm_err> allocate auth buffer fail!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* init authentication frame body */
|
|
AuthAlg = Ndis802_11AuthModeOpen;
|
|
AuthSeq = 1;
|
|
AuthStatus = MLME_SUCCESS;
|
|
|
|
MgtMacHeaderInit(pAd, &HdrAuthAssoc, SUBTYPE_AUTH, 0,
|
|
pAd->ApCfg.MBSSID[BSS0].Bssid, pStaMac);
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAuthAssoc,
|
|
2, &AuthAlg,
|
|
2, &AuthSeq,
|
|
2, &AuthStatus,
|
|
END_OF_ARGS);
|
|
|
|
/* send the virtual auth frame to MLME handler */
|
|
REPORT_MGMT_FRAME_TO_MLME(pAd, 0, pBufOut, LenFrame, 0, 0, 0, 0, pAd->OpMode);
|
|
|
|
/* init association frame body */
|
|
MgtMacHeaderInit(pAd, &HdrAuthAssoc, SUBTYPE_ASSOC_REQ, 0,
|
|
pAd->ApCfg.MBSSID[BSS0].Bssid, pStaMac);
|
|
|
|
AssocCap = 0x0001;
|
|
AssocLsn = 1;
|
|
SSID_EID = IE_SSID;
|
|
SUPR_EID = IE_SUPP_RATES;
|
|
SUPR_Len = 4;
|
|
EXTR_EID = IE_EXT_SUPP_RATES;
|
|
EXTR_Len = 4;
|
|
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAuthAssoc,
|
|
2, &AssocCap,
|
|
2, &AssocLsn,
|
|
1, &SSID_EID,
|
|
1, &SSID_Len,
|
|
SSID_Len, SSID,
|
|
1, &SUPR_EID,
|
|
1, &SUPR_Len,
|
|
SUPR_Len, SupRate,
|
|
1, &EXTR_EID,
|
|
1, &EXTR_Len,
|
|
EXTR_Len, ExtRate,
|
|
END_OF_ARGS);
|
|
|
|
/* send the virtual assoc frame to MLME handler */
|
|
REPORT_MGMT_FRAME_TO_MLME(pAd, 0, pBufOut, LenFrame, 0, 0, 0, 0, pAd->OpMode);
|
|
|
|
/* free the frame buffer */
|
|
MlmeFreeMemory(pAd, pBufOut);
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
} /* End of AcmCmdSimNonQoSAssocBuild */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Continue to receive non-QoS packets from a QSTA.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Command Format:
|
|
wssm_ndatrv [Src Client MAC] [Dst Client MAC] [size]
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimNonQoSDataRv(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
UCHAR MacSrc[6], MacDst[6];
|
|
UINT32 SizeData;
|
|
UINT32 IdFlowNum;
|
|
UCHAR FlgIsTimerEnabled;
|
|
/* ULONG SplFlags; */
|
|
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* active data task */
|
|
if (gCmdFlgIsInit == 0)
|
|
{
|
|
/* invalid all flows */
|
|
for(IdFlowNum=0; IdFlowNum<ACM_MAX_NUM_OF_SIM_DATA_FLOW; IdFlowNum++)
|
|
gDATA_Sim[IdFlowNum].FlgIsValidEntry = 0;
|
|
/* End of for */
|
|
|
|
/* init */
|
|
gTaskDataSleep = 1;
|
|
|
|
ACMR_TASK_INIT(pAd, gTaskletSim, ACM_CMD_Task_Data_Simulation, pAd, "ACM_SIM");
|
|
|
|
gCmdFlgIsInit = 1;
|
|
} /* End of if */
|
|
|
|
/* get source Client MAC */
|
|
MacSrc[0] = gMAC_STA[0];
|
|
MacSrc[1] = gMAC_STA[1];
|
|
MacSrc[2] = gMAC_STA[2];
|
|
MacSrc[3] = gMAC_STA[3];
|
|
MacSrc[4] = gMAC_STA[4];
|
|
MacSrc[5] = AcmCmdUtilHexGet(&pArgv);
|
|
|
|
/* get destination Client MAC */
|
|
MacDst[0] = gMAC_STA[0];
|
|
MacDst[1] = gMAC_STA[1];
|
|
MacDst[2] = gMAC_STA[2];
|
|
MacDst[3] = gMAC_STA[3];
|
|
MacDst[4] = gMAC_STA[4];
|
|
MacDst[5] = AcmCmdUtilHexGet(&pArgv);
|
|
|
|
/* get size */
|
|
SizeData = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
if (SizeData < 5)
|
|
SizeData = 5;
|
|
/* End of if */
|
|
|
|
/* semaphore lock */
|
|
ACM_DATA_SEM_LOCK(LabelSemErr);
|
|
|
|
for(IdFlowNum=0; IdFlowNum<ACM_MAX_NUM_OF_SIM_DATA_FLOW; IdFlowNum++)
|
|
{
|
|
if (gDATA_Sim[IdFlowNum].FlgIsValidEntry == 0)
|
|
{
|
|
memcpy(gDATA_Sim[IdFlowNum].MacSrc, MacSrc, 6);
|
|
memcpy(gDATA_Sim[IdFlowNum].MacDst, MacDst, 6);
|
|
|
|
gDATA_Sim[IdFlowNum].Direction = 2; /* non-QoS receive */
|
|
gDATA_Sim[IdFlowNum].Type = 0;
|
|
gDATA_Sim[IdFlowNum].TID = 0;
|
|
gDATA_Sim[IdFlowNum].AckPolicy = 0;
|
|
|
|
gDATA_Sim[IdFlowNum].FrameSize = SizeData;
|
|
gDATA_Sim[IdFlowNum].NumSeq = 0;
|
|
gDATA_Sim[IdFlowNum].NumFrag = 0;
|
|
|
|
gDATA_Sim[IdFlowNum].FlgIsValidEntry = 1;
|
|
break;
|
|
} /* End of if */
|
|
} /* End of for */
|
|
|
|
if (IdFlowNum == ACM_MAX_NUM_OF_SIM_DATA_FLOW)
|
|
printk("err> No any free entry can be added!\n");
|
|
else
|
|
gTaskDataSleep = 0;
|
|
/* End of if */
|
|
|
|
ACM_DATA_SEM_UNLOCK();
|
|
|
|
/* start simulation timer */
|
|
FlgIsTimerEnabled = 0;
|
|
ACMR_TIMER_ENABLE(FlgIsTimerEnabled, gTimerSim, ACM_STREAM_CHECK_OFFSET);
|
|
|
|
#if 0
|
|
del_timer(&gTimerSim);
|
|
gTimerSim.expires = jiffies + 10; /* 100 ms */
|
|
add_timer(&gTimerSim);
|
|
#endif
|
|
|
|
LabelSemErr:
|
|
return;
|
|
} /* End of AcmCmdSimNonQoSDataRv */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Fix the transmission rate for a client.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Command Format:
|
|
wssm_rate [Dst Client MAC] [rate]
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimRateSet(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMR_STA_DB *pCdb;
|
|
UCHAR DevMac[6], *pStaMac;
|
|
UINT32 Rate;
|
|
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* set */
|
|
DevMac[0] = AcmCmdUtilHexGet(&pArgv);
|
|
DevMac[1] = AcmCmdUtilHexGet(&pArgv);
|
|
DevMac[2] = AcmCmdUtilHexGet(&pArgv);
|
|
DevMac[3] = AcmCmdUtilHexGet(&pArgv);
|
|
DevMac[4] = AcmCmdUtilHexGet(&pArgv);
|
|
DevMac[5] = AcmCmdUtilHexGet(&pArgv);
|
|
pStaMac = DevMac;
|
|
|
|
Rate = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, pStaMac);
|
|
|
|
/* not support */
|
|
} /* End of AcmCmdSimRateSet */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Enable or disable TCP packet transmitting.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
========================================================================
|
|
*/
|
|
VOID AcmCmdSimTcpTxEnable(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
gSimTCPFlag = AcmCmdUtilNumGet(&pArgv);
|
|
gSimTCPDSCP = AcmCmdUtilNumGet(&pArgv);
|
|
} /* End of AcmCmdSimTcpTxEnable */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Reset the STATION MAC address.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Command Format: 63
|
|
[Dst Client MAC]
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimStaMacSet(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
gMAC_STA[0] = AcmCmdUtilHexGet(&pArgv);
|
|
gMAC_STA[1] = AcmCmdUtilHexGet(&pArgv);
|
|
gMAC_STA[2] = AcmCmdUtilHexGet(&pArgv);
|
|
gMAC_STA[3] = AcmCmdUtilHexGet(&pArgv);
|
|
gMAC_STA[4] = AcmCmdUtilHexGet(&pArgv);
|
|
gMAC_STA[5] = AcmCmdUtilHexGet(&pArgv);
|
|
|
|
printk("11e_msg> station mac = 0x%02x%02x%02x%02x%02x%02x\n",
|
|
gMAC_STA[0], gMAC_STA[1], gMAC_STA[2],
|
|
gMAC_STA[3], gMAC_STA[4], gMAC_STA[5]);
|
|
} /* End of AcmCmdSimStaMacSet */
|
|
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Receive a trigger frame from a QSTA.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Used to test Power Save management frame handle.
|
|
3. Command Format:
|
|
[Client MAC]
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimRcvTriFrame(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
#ifdef UAPSD_SUPPORT
|
|
ACMR_STA_DB *pCdb;
|
|
UCHAR MacPeer[6];
|
|
|
|
|
|
AcmCmdUtilMacGet(&pArgv, MacPeer);
|
|
|
|
if (*(UINT32 *)MacPeer == 0x00)
|
|
{
|
|
if (MacPeer[5] == 0x00)
|
|
ACMR_MEM_COPY(MacPeer, gMAC_STA, 6);
|
|
else
|
|
ACMR_MEM_COPY(MacPeer, gMAC_STA, 5);
|
|
/* End of if */
|
|
} /* End of if */
|
|
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, MacPeer);
|
|
if (pCdb == NULL)
|
|
{
|
|
printk("acm_err> the station does NOT exist!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
UAPSD_TriggerFrameHandle(pAd, pCdb, 7);
|
|
#endif /* UAPSD_SUPPORT */
|
|
} /* End of AcmCmdSimRcvTriFrame */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Simulate to enable/disable UAPSD queue maintain mechanism.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QAP.
|
|
2. Used to test Power Save management frame handle.
|
|
3. Command Format:
|
|
[enable: 0~1]
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimUapsdQueCtrl(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
#ifdef UAPSD_SUPPORT
|
|
extern UCHAR gUAPSD_FlgNotQueueMaintain;
|
|
|
|
|
|
gUAPSD_FlgNotQueueMaintain = AcmCmdUtilNumGet(&pArgv);
|
|
#endif /* UAPSD_SUPPORT */
|
|
} /* End of AcmCmdSimUapsdQueCtrlpAd */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Simulate a ADDTS Request frame receive event.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP.
|
|
|
|
[sta mac:xx:xx:xx:xx:xx:xx]
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[Ack Policy: 0~3] [APSD:0~1] [max size:byte] [nom size:byte]
|
|
[burst size:byte] [inact:sec]
|
|
[peak data rate:bps] [mean data rate:bps] [min data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1] [tclas processing:0~1]
|
|
[burst size defn:0~1]
|
|
|
|
EX: iwpriv ra0 set acm=75_00_1_7_3_1_7_0_0_0_208_0_0_0_83200_0_6000000_150_0_1
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimReqAdvanceRcv(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACM_STREAM_INFO StreamInfo;
|
|
ACMR_STA_DB *pCdb;
|
|
ACM_TSPEC *pTspec;
|
|
ACM_TS_INFO *pInfo;
|
|
UCHAR StreamType;
|
|
UCHAR MAC[6], *pStaMac;
|
|
UCHAR TclasProcessing;
|
|
|
|
NDIS_STATUS Status;
|
|
HEADER_802_11 HdrAction;
|
|
PUCHAR pBufOut;
|
|
ULONG LenFrame;
|
|
|
|
|
|
/* init */
|
|
pCdb = NULL;
|
|
pTspec = &StreamInfo.Tspec;
|
|
pInfo = &pTspec->TsInfo;
|
|
pStaMac = MAC;
|
|
pBufOut = NULL;
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* get sta mac address */
|
|
ACMR_MEM_COPY(MAC, gMAC_STA, 6);
|
|
|
|
MAC[5] = AcmCmdUtilHexGet(&pArgv);
|
|
if (MAC[5] == 0x00)
|
|
ACMR_MEM_COPY(MAC, gMAC_STA, 6);
|
|
/* End of if */
|
|
|
|
/* get sta entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, MAC);
|
|
if (pCdb == NULL)
|
|
{
|
|
printk("acm_err> the station %02x:%02x:%02x:%02x:%02x:%02x "
|
|
"does NOT exist!\n",
|
|
MAC[0], MAC[1], MAC[2], MAC[3], MAC[4], MAC[5]);
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* parse input command */
|
|
if (AcmCmdInfoParseAdvance(
|
|
pAd,
|
|
&pArgv,
|
|
pTspec,
|
|
pInfo,
|
|
&StreamType) != 0)
|
|
{
|
|
return;
|
|
} /* End of if */
|
|
|
|
TclasProcessing = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
/* vitual send a ADDTS request frame to our AP */
|
|
Status = MlmeAllocateMemory(pAd, &pBufOut);
|
|
if (Status != NDIS_STATUS_SUCCESS)
|
|
{
|
|
printk("acm_err> allocate action buffer fail!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* init ADDTS request frame body */
|
|
MgtMacHeaderInit(pAd, &HdrAction, SUBTYPE_ACTION, 0,
|
|
pAd->ApCfg.MBSSID[BSS0].Bssid, pStaMac);
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAction,
|
|
END_OF_ARGS);
|
|
|
|
LenFrame += ACM_CMD_WME_Action_Make(pAd, &StreamInfo,
|
|
&pBufOut[LenFrame],
|
|
ACM_ACTION_WME_SETUP_REQ,
|
|
0,
|
|
TclasProcessing);
|
|
|
|
/* send the ADDTS request frame to ACM module */
|
|
ACMP_ManagementHandle(pAd, pCdb, ACMR_SUBTYPE_ACTION,
|
|
pBufOut, LenFrame, 11000000);
|
|
|
|
/* free the frame buffer */
|
|
MlmeFreeMemory(pAd, pBufOut);
|
|
} /* End of AcmCmdSimReqAdvanceRcv */
|
|
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Transmit a auth/assoc req frame and simulate we receive auth/assoc rsp.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QSTA test.
|
|
2. Command Format: 23
|
|
[AP MAC]
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimStaAssoc(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
MLME_QUEUE_ELEM *pMlmeQueue;
|
|
MLME_AUTH_REQ_STRUCT *pInfoAuthReq;
|
|
MLME_ASSOC_REQ_STRUCT *pInfoAssocReq;
|
|
|
|
NDIS_STATUS Status;
|
|
HEADER_802_11 HdrAuthAssoc;
|
|
|
|
PUCHAR pBufOut;
|
|
ULONG LenFrame;
|
|
USHORT pBspTbtt, pBspTimestamp[4] = { 0, 0, 0, 0 };
|
|
USHORT AuthAlg, AuthSeq, AuthStatus;
|
|
USHORT AssocCap, assoc_status, assoc_aid;
|
|
UCHAR CHAN_EID, CHAN_Len, ChanNum;
|
|
UCHAR SSID_EID, SSID_Len, SSID[9] = "SampleAP";
|
|
UCHAR SUPR_EID, SUPR_Len, SupRate[4] = { 0x82, 0x84, 0x8B, 0x96 };
|
|
UCHAR EXTR_EID, EXTR_Len, ExtRate[4] = { 0xB0, 0xC8, 0xE0, 0xEC };
|
|
UCHAR IE_WME[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2,
|
|
0x02, 0x00, 0x01, 0x00};
|
|
UCHAR IE_WME_RSP[26] = {IE_VENDOR_SPECIFIC, 0x18, 0x00, 0x50, 0xf2,
|
|
0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0xa4, 0x00, 0x00,
|
|
0x27, 0xa4, 0x00, 0x00, 0x42, 0x43, 0x60, 0x00, 0x62,
|
|
0x32, 0x30, 0x00 };
|
|
UCHAR ApMac[6];
|
|
|
|
|
|
/* init */
|
|
pBufOut = NULL;
|
|
|
|
/* get input arguments */
|
|
memcpy(ApMac, gMAC_AP, 6);
|
|
ApMac[5] = AcmCmdUtilHexGet(&pArgv);
|
|
|
|
if (ApMac[5] == 0x00)
|
|
memcpy(ApMac, gMAC_AP, 6);
|
|
/* End of if */
|
|
|
|
/* allocate probe rsp/auth/assoc frame buffer */
|
|
Status = MlmeAllocateMemory(pAd, &pBufOut);
|
|
if (Status != NDIS_STATUS_SUCCESS)
|
|
{
|
|
printk("acm_err> allocate auth buffer fail!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* allocate mlme msg queue, dont use local array, the structure size
|
|
is too large */
|
|
ACMR_MEM_ALLOC(pMlmeQueue, sizeof(MLME_QUEUE_ELEM), (MLME_QUEUE_ELEM *));
|
|
if (pMlmeQueue == NULL)
|
|
{
|
|
printk("acm_err> allocate mlme msg queue fail!\n");
|
|
goto LabelErr;
|
|
} /* End of if */
|
|
|
|
/* init/tx probe response frame body */
|
|
pBspTbtt = 100;
|
|
AssocCap = 0x0001;
|
|
CHAN_EID = IE_DS_PARM;
|
|
CHAN_Len = 1;
|
|
ChanNum = 1;
|
|
SSID_EID = IE_SSID;
|
|
SSID_Len = 8;
|
|
SUPR_EID = IE_SUPP_RATES;
|
|
SUPR_Len = 4;
|
|
EXTR_EID = IE_EXT_SUPP_RATES;
|
|
EXTR_Len = 4;
|
|
|
|
AcmApMgtMacHeaderInit(pAd, &HdrAuthAssoc, SUBTYPE_PROBE_RSP, 0,
|
|
ACMR_SELF_MAC_GET(pAd), ApMac);
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAuthAssoc,
|
|
8, &pBspTimestamp,
|
|
2, &pBspTbtt,
|
|
2, &AssocCap,
|
|
1, &CHAN_EID,
|
|
1, &CHAN_Len,
|
|
1, &ChanNum,
|
|
1, &SSID_EID,
|
|
1, &SSID_Len,
|
|
SSID_Len, SSID,
|
|
1, &SUPR_EID,
|
|
1, &SUPR_Len,
|
|
SUPR_Len, SupRate,
|
|
1, &EXTR_EID,
|
|
1, &EXTR_Len,
|
|
EXTR_Len, ExtRate,
|
|
9, &IE_WME[0],
|
|
END_OF_ARGS);
|
|
|
|
/* send the virtual probe response frame to MLME handler */
|
|
memset(pMlmeQueue, 0, sizeof(MLME_QUEUE_ELEM));
|
|
memcpy(pMlmeQueue->Msg, pBufOut, LenFrame);
|
|
pMlmeQueue->MsgLen = LenFrame;
|
|
|
|
PeerBeaconAtScanAction(pAd, pMlmeQueue);
|
|
|
|
/* init/tx authentication request frame body */
|
|
pInfoAuthReq = (MLME_AUTH_REQ_STRUCT *)pMlmeQueue->Msg;
|
|
ACMR_MEM_MAC_COPY(pInfoAuthReq->Addr, ApMac);
|
|
pInfoAuthReq->Alg = Ndis802_11AuthModeOpen;
|
|
pInfoAuthReq->Timeout = AUTH_TIMEOUT;
|
|
|
|
MlmeAuthReqAction(pAd, pMlmeQueue);
|
|
|
|
/* init/rv authentication response frame body */
|
|
AuthAlg = Ndis802_11AuthModeOpen;
|
|
AuthSeq = 2;
|
|
AuthStatus = MLME_SUCCESS;
|
|
|
|
AcmApMgtMacHeaderInit(pAd, &HdrAuthAssoc, SUBTYPE_AUTH, 0,
|
|
ACMR_SELF_MAC_GET(pAd), ACMR_AP_ADDR_GET(pAd));
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAuthAssoc,
|
|
2, &AuthAlg,
|
|
2, &AuthSeq,
|
|
2, &AuthStatus,
|
|
END_OF_ARGS);
|
|
|
|
/* send the virtual auth frame to MLME handler */
|
|
memset(pMlmeQueue, 0, sizeof(MLME_QUEUE_ELEM));
|
|
memcpy(pMlmeQueue->Msg, pBufOut, LenFrame);
|
|
pMlmeQueue->MsgLen = LenFrame;
|
|
|
|
PeerAuthRspAtSeq2Action(pAd, pMlmeQueue);
|
|
|
|
/* init/tx association request frame body */
|
|
pInfoAssocReq = (MLME_ASSOC_REQ_STRUCT *)pMlmeQueue->Msg;
|
|
ACMR_MEM_MAC_COPY(pInfoAssocReq->Addr, ApMac);
|
|
pInfoAssocReq->CapabilityInfo = 0x0001;
|
|
pInfoAssocReq->Timeout = ASSOC_TIMEOUT;
|
|
|
|
MlmeAssocReqAction(pAd, pMlmeQueue);
|
|
|
|
/* init/rv association response frame body */
|
|
AcmApMgtMacHeaderInit(pAd, &HdrAuthAssoc, SUBTYPE_ASSOC_RSP, 0,
|
|
ACMR_SELF_MAC_GET(pAd), ACMR_AP_ADDR_GET(pAd));
|
|
|
|
assoc_status = 0;
|
|
assoc_aid = 0xc001;
|
|
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAuthAssoc,
|
|
2, &AssocCap,
|
|
2, &assoc_status,
|
|
2, &assoc_aid,
|
|
1, &SUPR_EID,
|
|
1, &SUPR_Len,
|
|
SUPR_Len, SupRate,
|
|
1, &EXTR_EID,
|
|
1, &EXTR_Len,
|
|
EXTR_Len, ExtRate,
|
|
26, &IE_WME_RSP[0],
|
|
END_OF_ARGS);
|
|
|
|
/* send the virtual assoc frame to MLME handler */
|
|
memset(pMlmeQueue, 0, sizeof(MLME_QUEUE_ELEM));
|
|
memcpy(pMlmeQueue->Msg, pBufOut, LenFrame);
|
|
pMlmeQueue->MsgLen = LenFrame;
|
|
|
|
PeerAssocRspAction(pAd, pMlmeQueue);
|
|
|
|
/* up our QSTA */
|
|
LinkUp(pAd, BSS_INFRA);
|
|
|
|
/* reset ACM flag to do test */
|
|
ACMP_EnableFlagReset(pAd, 0, 0, 1, 1);
|
|
|
|
ACMR_MEM_FREE(pMlmeQueue);
|
|
|
|
LabelErr:
|
|
/* free the frame buffer */
|
|
MlmeFreeMemory(pAd, pBufOut);
|
|
return;
|
|
} /* End of AcmCmdSimStaAssoc */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Transmit a WME Requset frame to the QAP.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QSTA test.
|
|
2. Command Format:
|
|
[1-WME] [TID:0~7] [dir:0~3] [access:1~3] [UP:0~7] [uapsd:0~1]
|
|
[nom size:byte] [inact:sec] [mean data rate:bps] [min phy rate:bps]
|
|
[surp factor:>=1] [tclas processing:0~1] (ack policy:0~3)
|
|
(burst size:byte)
|
|
3. dir: 0 - uplink, 1 - dnlink, 2 - bidirectional link, 3 - direct link
|
|
access: 1 - EDCA, 2 - HCCA, 3 - EDCA + HCCA
|
|
ack: 0 - normal ACK, 1 - no ACK
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimWmeReqTx(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMR_STA_DB *pCdb;
|
|
ACM_TSPEC Tspec, *pTspec;
|
|
ACM_TS_INFO *pInfo;
|
|
UCHAR StreamType, TclasProcessing;
|
|
ACM_FUNC_STATUS Status;
|
|
UINT16 DialogToken;
|
|
UCHAR StatusCode;
|
|
|
|
|
|
/* init */
|
|
pCdb = NULL;
|
|
pTspec = &Tspec;
|
|
pInfo = &Tspec.TsInfo;
|
|
|
|
/* get AP entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, NULL);
|
|
if (pCdb == NULL)
|
|
return;
|
|
/* End of if */
|
|
|
|
/* parse input command */
|
|
if (AcmCmdInfoParse(
|
|
pAd,
|
|
&pArgv,
|
|
pTspec,
|
|
pInfo,
|
|
&StreamType) != 0)
|
|
{
|
|
return;
|
|
} /* End of if */
|
|
|
|
pInfo->AckPolicy = AcmCmdUtilNumGet(&pArgv); /* default 0 */
|
|
pTspec->MaxBurstSize = AcmCmdUtilNumGet(&pArgv); /* default 0 */
|
|
|
|
/* transmit a WME request frame */
|
|
DialogToken = ACMR_CB->DialogToken;
|
|
if (DialogToken == 0)
|
|
DialogToken ++;
|
|
/* End of if */
|
|
TclasProcessing = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
Status = ACMP_WME_TC_Request(pAd, pCdb, pTspec, gTLS_Grp_ID,
|
|
gCMD_TCLAS_Group, TclasProcessing, 1, 0);
|
|
|
|
if (Status == ACM_RTN_OK)
|
|
{
|
|
/* transmit a WME response frame */
|
|
if (pTspec->TsInfo.Direction != ACM_DIRECTION_DOWN_LINK)
|
|
pTspec->MediumTime = (30000>>5); /* test time: 10ms */
|
|
/* End of if */
|
|
|
|
ACM_TC_RspHandle(pAd, pCdb, DialogToken, 0, pTspec, NULL, &StatusCode);
|
|
} /* End of if */
|
|
} /* End of AcmCmdSimWmeReqTx */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Transmit a WME Re-negotiate Requset frame to the QAP.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QSTA test.
|
|
2. Command Format: 26
|
|
[1-WME] [TID:0~7] [dir:0~3] [access:1~3] [UP:0~7] [ack:0~1]
|
|
[nom size:byte] [inact:sec] [mean data rate:bps] [min phy rate:bps]
|
|
[surp factor:>=1] [tclas processing:0~1] (ack policy:0~3)
|
|
3. dir: 0 - uplink, 1 - dnlink, 2 - bidirectional link, 3 - direct link
|
|
access: 1 - EDCA, 2 - HCCA, 3 - EDCA + HCCA
|
|
ack: 0 - normal ACK, 1 - no ACK
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimWmeNeqTx(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMR_STA_DB *pCdb;
|
|
ACM_TSPEC Tspec, *pTspec;
|
|
ACM_TS_INFO *pInfo;
|
|
UCHAR StreamType;
|
|
ACM_FUNC_STATUS Status;
|
|
UINT16 DialogToken;
|
|
UCHAR StatusCode;
|
|
|
|
|
|
/* init */
|
|
pCdb = NULL;
|
|
pTspec = &Tspec;
|
|
pInfo = &Tspec.TsInfo;
|
|
|
|
/* get AP entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, NULL);
|
|
if (pCdb == NULL)
|
|
return;
|
|
/* End of if */
|
|
|
|
/* parse input command */
|
|
if (AcmCmdInfoParse(
|
|
pAd,
|
|
&pArgv,
|
|
pTspec,
|
|
pInfo,
|
|
&StreamType) != 0)
|
|
{
|
|
return;
|
|
} /* End of if */
|
|
|
|
pInfo->AckPolicy = AcmCmdUtilNumGet(&pArgv); /* default 0 */
|
|
|
|
/* transmit a WME request frame */
|
|
DialogToken = ACMR_CB->DialogToken;
|
|
if (DialogToken == 0)
|
|
DialogToken ++;
|
|
/* End of if */
|
|
Status = ACMP_TC_Renegotiate(pAd, pCdb, pTspec, gTLS_Grp_ID,
|
|
gCMD_TCLAS_Group, 0, 1);
|
|
|
|
if (Status == ACM_RTN_OK)
|
|
{
|
|
/* transmit a WME response frame */
|
|
if (pTspec->TsInfo.Direction != ACM_DIRECTION_DOWN_LINK)
|
|
pTspec->MediumTime = (20000>>5); /* test time: 10ms */
|
|
/* End of if */
|
|
|
|
ACM_TC_RspHandle(pAd, pCdb, DialogToken, 0, pTspec, NULL, &StatusCode);
|
|
} /* End of if */
|
|
} /* End of AcmCmdSimWmeNeqTx */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Transmit a WME Re-negotiate Requset frame to the QAP.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QSTA test.
|
|
2. Command Format: 26
|
|
[1-WME] [TID:0~7] [dir:0~3] [access:1~3] [UP:0~7] [ack:0~1]
|
|
[nom size:byte] [inact:sec] [mean data rate:bps] [min phy rate:bps]
|
|
[surp factor:>=1] [tclas processing:0~1] (ack policy:0~3)
|
|
3. dir: 0 - uplink, 1 - dnlink, 2 - bidirectional link, 3 - direct link
|
|
access: 1 - EDCA, 2 - HCCA, 3 - EDCA + HCCA
|
|
ack: 0 - normal ACK, 1 - no ACK
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimWmeReqFail(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMR_STA_DB *pCdb;
|
|
ACM_TSPEC Tspec, *pTspec;
|
|
ACM_TS_INFO *pInfo;
|
|
UCHAR StreamType, TclasProcessing;
|
|
ACM_FUNC_STATUS Status;
|
|
UINT16 DialogToken;
|
|
UCHAR StatusCode;
|
|
|
|
|
|
/* init */
|
|
pCdb = NULL;
|
|
pTspec = &Tspec;
|
|
pInfo = &Tspec.TsInfo;
|
|
|
|
/* get AP entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, NULL);
|
|
if (pCdb == NULL)
|
|
return;
|
|
/* End of if */
|
|
|
|
/* parse input command */
|
|
if (AcmCmdInfoParse(
|
|
pAd,
|
|
&pArgv,
|
|
pTspec,
|
|
pInfo,
|
|
&StreamType) != 0)
|
|
{
|
|
return;
|
|
} /* End of if */
|
|
|
|
pInfo->AckPolicy = AcmCmdUtilNumGet(&pArgv); /* default 0 */
|
|
|
|
/* transmit a WME request frame */
|
|
DialogToken = ACMR_CB->DialogToken;
|
|
if (DialogToken == 0)
|
|
DialogToken ++;
|
|
/* End of if */
|
|
TclasProcessing = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
Status = ACMP_WME_TC_Request(pAd, pCdb, pTspec, gTLS_Grp_ID,
|
|
gCMD_TCLAS_Group, TclasProcessing, 1, 0);
|
|
|
|
if (Status == ACM_RTN_OK)
|
|
{
|
|
/* transmit a WME response fail frame */
|
|
ACM_TC_RspHandle(pAd, pCdb, DialogToken,
|
|
ACM_STATUS_CODE_WMM_REFUSED, pTspec,
|
|
NULL, &StatusCode);
|
|
} /* End of if */
|
|
} /* End of AcmCmdSimWmeReqFail */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Transmit a WME Re-negotiate Requset frame to the QAP.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QSTA test.
|
|
2. Command Format: 68
|
|
[1-WME] [TID:0~7] [dir:0~3] [access:1~3] [UP:0~7] [ack:0~1]
|
|
[nom size:byte] [inact:sec] [mean data rate:bps] [min phy rate:bps]
|
|
[surp factor:>=1] [tclas processing:0~1]
|
|
3. dir: 0 - uplink, 1 - dnlink, 2 - bidirectional link, 3 - direct link
|
|
access: 1 - EDCA, 2 - HCCA, 3 - EDCA + HCCA
|
|
ack: 0 - normal ACK, 1 - no ACK
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimWmeNegFail(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMR_STA_DB *pCdb;
|
|
ACM_TSPEC Tspec, *pTspec;
|
|
ACM_TS_INFO *pInfo;
|
|
UCHAR StreamType;
|
|
ACM_FUNC_STATUS Status;
|
|
UINT16 DialogToken;
|
|
UCHAR StatusCode;
|
|
|
|
|
|
/* init */
|
|
pCdb = NULL;
|
|
pTspec = &Tspec;
|
|
pInfo = &Tspec.TsInfo;
|
|
|
|
/* get AP entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, NULL);
|
|
if (pCdb == NULL)
|
|
return;
|
|
/* End of if */
|
|
|
|
/* parse input command */
|
|
if (AcmCmdInfoParse(
|
|
pAd,
|
|
&pArgv,
|
|
pTspec,
|
|
pInfo,
|
|
&StreamType) != 0)
|
|
{
|
|
return;
|
|
} /* End of if */
|
|
|
|
pInfo->AckPolicy = AcmCmdUtilNumGet(&pArgv); /* default 0 */
|
|
|
|
/* transmit a WME request frame */
|
|
DialogToken = ACMR_CB->DialogToken;
|
|
if (DialogToken == 0)
|
|
DialogToken ++;
|
|
/* End of if */
|
|
Status = ACMP_TC_Renegotiate(pAd, pCdb, pTspec, gTLS_Grp_ID,
|
|
gCMD_TCLAS_Group, 0, 1);
|
|
|
|
if (Status == ACM_RTN_OK)
|
|
{
|
|
/* transmit a WME response fail frame */
|
|
ACM_TC_RspHandle(pAd, pCdb, DialogToken,
|
|
ACM_STATUS_CODE_WMM_REFUSED, pTspec,
|
|
NULL, &StatusCode);
|
|
} /* End of if */
|
|
} /* End of AcmCmdSimWmeNegFail */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Reset the ACM flag in QSTA.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QSTA test.
|
|
2. Command Format: 69
|
|
[ACM0] [ACM1] [ACM2] [ACM3]
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimWmeAcmReset(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
UINT32 FlgIsAcm0Enabled, FlgIsAcm1Enabled;
|
|
UINT32 FlgIsAcm2Enabled, FlgIsAcm3Enabled;
|
|
|
|
|
|
FlgIsAcm0Enabled = AcmCmdUtilNumGet(&pArgv);
|
|
FlgIsAcm1Enabled = AcmCmdUtilNumGet(&pArgv);
|
|
FlgIsAcm2Enabled = AcmCmdUtilNumGet(&pArgv);
|
|
FlgIsAcm3Enabled = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
ACMP_EnableFlagReset(pAd, FlgIsAcm0Enabled, FlgIsAcm1Enabled,
|
|
FlgIsAcm2Enabled, FlgIsAcm3Enabled);
|
|
} /* End of AcmCmdSimWmeAcmReset */
|
|
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Receive a packet with PM=1 from a station.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. Command Format: 70
|
|
[mode:0(active)1(ps)] [MAC]
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimWmePSEnter(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
ACMR_STA_DB *pCdb;
|
|
UCHAR MacPeer[6];
|
|
UINT32 PsMode;
|
|
|
|
// TODO: shiang-usw, fix me for PsMode setting, now move to tr_entry->PsMode instead of MacEntry->PsMode!
|
|
PsMode = AcmCmdUtilNumGet(&pArgv);
|
|
AcmCmdUtilMacGet(&pArgv, MacPeer);
|
|
|
|
if (*(UINT32 *)MacPeer == 0x00)
|
|
{
|
|
if (MacPeer[5] == 0x00)
|
|
ACMR_MEM_COPY(MacPeer, gMAC_STA, 6);
|
|
else
|
|
ACMR_MEM_COPY(MacPeer, gMAC_STA, 5);
|
|
/* End of if */
|
|
} /* End of if */
|
|
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, MacPeer);
|
|
if (pCdb == NULL)
|
|
return;
|
|
/* End of if */
|
|
|
|
if (PsMode == 1)
|
|
{
|
|
pCdb->PsMode = PWR_SAVE;
|
|
|
|
printk("acm_msg> %02x:%02x:%02x:%02x:%02x:%02x enters PS mode!\n",
|
|
MacPeer[0], MacPeer[1], MacPeer[2],
|
|
MacPeer[3], MacPeer[4], MacPeer[5]);
|
|
}
|
|
else
|
|
{
|
|
pCdb->PsMode = PWR_ACTIVE;
|
|
|
|
printk("acm_msg> %02x:%02x:%02x:%02x:%02x:%02x enters ACTIVE mode!\n",
|
|
MacPeer[0], MacPeer[1], MacPeer[2],
|
|
MacPeer[3], MacPeer[4], MacPeer[5]);
|
|
} /* End of if */
|
|
} /* End of AcmCmdSimWmePSEnter */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Simulate a ADDTS Request frame & PS Poll frame receive event.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP.
|
|
|
|
[sta mac:xx:xx:xx:xx:xx:xx]
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[APSD:0~1] [nom size:byte] [inact:sec] [mean data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1] [tclas processing:0~1]
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdSimReqPsPollRcv(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
ACM_STREAM_INFO StreamInfo;
|
|
ACMR_STA_DB *pCdb = NULL;
|
|
ACM_TSPEC *pTspec = &StreamInfo.Tspec;
|
|
ACM_TS_INFO *pInfo = &pTspec->TsInfo;
|
|
UCHAR StreamType;
|
|
UCHAR MAC[6], *pStaMac = MAC;
|
|
UCHAR TclasProcessing;
|
|
|
|
NDIS_STATUS Status;
|
|
HEADER_802_11 HdrAction;
|
|
UCHAR *pBufOut = NULL;
|
|
ULONG LenFrame;
|
|
|
|
|
|
/* precondition */
|
|
ACM_QOS_SANITY_CHECK(pAd);
|
|
|
|
/* get sta mac address */
|
|
ACMR_MEM_COPY(MAC, gMAC_STA, 6);
|
|
|
|
MAC[5] = AcmCmdUtilHexGet(&pArgv);
|
|
if (MAC[5] == 0x00)
|
|
ACMR_MEM_COPY(MAC, gMAC_STA, 6);
|
|
/* End of if */
|
|
|
|
/* get sta entry */
|
|
pCdb = ACMR_STA_ENTRY_GET(pAd, MAC);
|
|
if (pCdb == NULL)
|
|
{
|
|
printk("acm_err> the station does NOT exist!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* parse input command */
|
|
if (AcmCmdInfoParse(
|
|
pAd,
|
|
&pArgv,
|
|
pTspec,
|
|
pInfo,
|
|
&StreamType) != 0)
|
|
{
|
|
return;
|
|
} /* End of if */
|
|
|
|
TclasProcessing = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
/* vitual send a ADDTS request frame to our AP */
|
|
Status = MlmeAllocateMemory(pAd, &pBufOut);
|
|
if (Status != NDIS_STATUS_SUCCESS)
|
|
{
|
|
printk("acm_err> allocate action buffer fail!\n");
|
|
return;
|
|
} /* End of if */
|
|
|
|
/* init ADDTS request frame body */
|
|
MgtMacHeaderInit(pAd, &HdrAction, SUBTYPE_ACTION, 0,
|
|
pAd->ApCfg.MBSSID[BSS0].Bssid, pStaMac);
|
|
MakeOutgoingFrame(pBufOut, &LenFrame,
|
|
sizeof(HEADER_802_11), &HdrAction,
|
|
END_OF_ARGS);
|
|
|
|
LenFrame += ACM_CMD_WME_Action_Make(pAd, &StreamInfo,
|
|
&pBufOut[LenFrame],
|
|
ACM_ACTION_WME_SETUP_REQ,
|
|
0,
|
|
TclasProcessing);
|
|
|
|
/* send the ADDTS request frame to ACM module */
|
|
ACMP_ManagementHandle(pAd, pCdb, ACMR_SUBTYPE_ACTION,
|
|
pBufOut, LenFrame, 11000000);
|
|
|
|
/* free the frame buffer */
|
|
MlmeFreeMemory(pAd, pBufOut);
|
|
|
|
/* simulate a PS Poll frame is received */
|
|
RtmpOsMsDelay(500);
|
|
RtmpHandleRxPsPoll(pAd, MAC, pCdb->wcid, FALSE);
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
} /* End of AcmCmdSimReqPsPollRcv */
|
|
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
|
|
|
|
|
|
|
|
/* =========================== Utility Function ========================== */
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Get argument number value.
|
|
|
|
Arguments:
|
|
**ppArgv - input parameters
|
|
|
|
Return Value:
|
|
decimal number
|
|
|
|
Note:
|
|
Only for one hex byte.
|
|
========================================================================
|
|
*/
|
|
static UINT32 AcmCmdUtilHexGet(
|
|
ACM_PARAM_IN CHAR **ppArgv)
|
|
{
|
|
CHAR buf[3], *pNum;
|
|
UINT32 ID;
|
|
UCHAR Value;
|
|
|
|
|
|
pNum = (*ppArgv);
|
|
|
|
buf[0] = 0x30;
|
|
buf[1] = 0x30;
|
|
buf[2] = 0;
|
|
|
|
for(ID=0; ID<sizeof(buf)-1; ID++)
|
|
{
|
|
if ((*pNum == '_') || (*pNum == 0x00))
|
|
break;
|
|
/* End of if */
|
|
|
|
pNum ++;
|
|
} /* End of for */
|
|
|
|
if (ID == 0)
|
|
return 0; /* argument length is too small */
|
|
/* End of if */
|
|
|
|
if (ID >= 2)
|
|
memcpy(buf, (*ppArgv), 2);
|
|
else
|
|
buf[1] = (**ppArgv);
|
|
/* End of if */
|
|
|
|
(*ppArgv) += ID;
|
|
if ((**ppArgv) == '_')
|
|
(*ppArgv) ++; /* skip _ */
|
|
/* End of if */
|
|
|
|
ACMR_ARG_ATOH(buf, &Value);
|
|
return (UINT32)Value;
|
|
} /* End of AcmCmdUtilHexGet */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Get argument number value.
|
|
|
|
Arguments:
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
decimal number
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
static UINT32 AcmCmdUtilNumGet(
|
|
ACM_PARAM_IN CHAR **ppArgv)
|
|
{
|
|
CHAR buf[20], *pNum;
|
|
UINT32 ID;
|
|
|
|
|
|
pNum = (*ppArgv);
|
|
|
|
for(ID=0; ID<sizeof(buf)-1; ID++)
|
|
{
|
|
if ((*pNum == '_') || (*pNum == 0x00))
|
|
break;
|
|
/* End of if */
|
|
|
|
pNum ++;
|
|
} /* End of for */
|
|
|
|
if (ID == sizeof(buf)-1)
|
|
return 0; /* argument length is too large */
|
|
/* End of if */
|
|
|
|
memcpy(buf, (*ppArgv), ID);
|
|
buf[ID] = 0x00;
|
|
|
|
*ppArgv += ID+1; /* skip _ */
|
|
|
|
return ACMR_ARG_ATOI(buf);
|
|
} /* End of AcmCmdUtilNumGet */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Get argument MAC value.
|
|
|
|
Arguments:
|
|
**ppArgv - input parameters
|
|
*pDevMac - MAC address
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdUtilMacGet(
|
|
ACM_PARAM_IN CHAR **ppArgv,
|
|
ACM_PARAM_IN UCHAR *pDevMac)
|
|
{
|
|
CHAR Buf[3];
|
|
CHAR *pMAC = (CHAR *)(*ppArgv);
|
|
UINT32 ID;
|
|
|
|
|
|
if ((pMAC[0] == '0') && (pMAC[1] == '_'))
|
|
{
|
|
*ppArgv = (&pMAC[2]);
|
|
return;
|
|
} /* End of if */
|
|
|
|
ACMR_MEM_ZERO(pDevMac, 6);
|
|
|
|
/* must exist 18 octets */
|
|
for(ID=0; ID<18; ID+=2)
|
|
{
|
|
if ((pMAC[ID] == '_') || (pMAC[ID] == 0x00))
|
|
{
|
|
*ppArgv = (&pMAC[ID]+1);
|
|
return;
|
|
} /* End of if */
|
|
} /* End of for */
|
|
|
|
/* get mac */
|
|
for(ID=0; ID<18; ID+=3)
|
|
{
|
|
Buf[0] = pMAC[0];
|
|
Buf[1] = pMAC[1];
|
|
Buf[2] = 0x00;
|
|
|
|
ACMR_ARG_ATOH(Buf, pDevMac);
|
|
pMAC += 3;
|
|
pDevMac ++;
|
|
} /* End of for */
|
|
|
|
*ppArgv += 17+1; /* skip _ */
|
|
} /* End of AcmCmdUtilMacGet */
|
|
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
#ifdef ACM_CC_FUNC_TCLAS
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Get argument IP value.
|
|
|
|
Arguments:
|
|
**ppArgv - input parameters
|
|
*pDevMac - MAC address
|
|
|
|
Return Value:
|
|
4B IP address
|
|
|
|
Note:
|
|
192.168.100.1 ==> 0x C0A86401
|
|
========================================================================
|
|
*/
|
|
static UINT32 AcmCmdUtilIpGet(
|
|
ACM_PARAM_IN CHAR **ppArgv)
|
|
{
|
|
CHAR Buf[4], IP[4];
|
|
CHAR *pIP = (CHAR *)(*ppArgv);
|
|
UINT32 ID, BufId, IpId;
|
|
|
|
|
|
for(ID=0, BufId=0, IpId=0; ID<15; ID++)
|
|
{
|
|
if ((pIP[ID] == '.') || (pIP[ID] == '_') || (pIP[ID] == 0x00))
|
|
{
|
|
/* maximum 4 IP sub-fields */
|
|
if (IpId < 4)
|
|
{
|
|
Buf[BufId] = 0x00;
|
|
BufId = 0;
|
|
|
|
IP[IpId++] = ACMR_ARG_ATOI(Buf);
|
|
} /* End of if */
|
|
|
|
if (pIP[ID] != '.')
|
|
break; /* '_' or 0x00 */
|
|
/* End of if */
|
|
|
|
continue; /* check next one */
|
|
} /* End of if */
|
|
|
|
/* maximum 3 ASCII characters */
|
|
if (BufId < 3)
|
|
Buf[BufId++] = pIP[ID];
|
|
/* End of if */
|
|
} /* End of for */
|
|
|
|
*ppArgv += ID+1;
|
|
|
|
return (*(UINT32 *)IP);
|
|
} /* End of AcmCmdUtilIpGet */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Get argument number value.
|
|
|
|
Arguments:
|
|
*pArgv - input parameters
|
|
*pHex - output value
|
|
Size - number of bytes
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdUtilNumHexGet(
|
|
ACM_PARAM_IN CHAR **ppArgv,
|
|
ACM_PARAM_OUT UCHAR *pHex,
|
|
ACM_PARAM_IN UINT32 Size)
|
|
{
|
|
UINT32 IdSize;
|
|
|
|
|
|
for(IdSize=0; IdSize<Size; IdSize++)
|
|
*pHex++ = (UCHAR)AcmCmdUtilHexGet(ppArgv);
|
|
/* End of for */
|
|
} /* End of AcmCmdUtilNumHexGet */
|
|
|
|
#endif /* ACM_CC_FUNC_TCLAS */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Display the stream status.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
*pStream - the stream
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdStreamDisplayOne(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN ACM_STREAM_INFO *pStream)
|
|
{
|
|
ACM_TSPEC *pTspec;
|
|
UINT16 SBA_Temp;
|
|
|
|
|
|
pTspec = &pStream->Tspec;
|
|
|
|
printk("\n=== QSTA MAC = %02x:%02x:%02x:%02x:%02x:%02x",
|
|
pStream->DevMac[0],
|
|
pStream->DevMac[1],
|
|
pStream->DevMac[2],
|
|
pStream->DevMac[3],
|
|
pStream->DevMac[4],
|
|
pStream->DevMac[5]);
|
|
|
|
if (ACMR_CB->EdcaCtrlParam.FlgAcmStatus[pStream->AcmAcId])
|
|
printk(" (NORMAL TSPEC)\n");
|
|
else
|
|
printk(" (NULL TSPEC)\n");
|
|
/* End of if */
|
|
|
|
if (pTspec->TsInfo.AccessPolicy == ACM_ACCESS_POLICY_EDCA)
|
|
{
|
|
if (pStream->StreamType == ACM_STREAM_TYPE_11E)
|
|
printk(" Stream Type: EDCA");
|
|
else
|
|
printk(" Stream Type: WME");
|
|
/* End of if */
|
|
} /* End of if */
|
|
|
|
switch(pStream->Status)
|
|
{
|
|
case TSPEC_STATUS_REQUEST:
|
|
printk("\tStatus: Requesting...\n");
|
|
break;
|
|
|
|
case TSPEC_STATUS_ACTIVE:
|
|
printk("\tStatus: Active\n");
|
|
break;
|
|
|
|
case TSPEC_STATUS_ACTIVE_SUSPENSION:
|
|
printk("\tStatus: Active but suspended\n");
|
|
break;
|
|
|
|
case TSPEC_STATUS_REQ_DELETING:
|
|
printk("\tStatus: Requesting & deleting...\n");
|
|
break;
|
|
|
|
case TSPEC_STATUS_ACT_DELETING:
|
|
printk("\tStatus: Active & deleting...\n");
|
|
break;
|
|
|
|
case TSPEC_STATUS_RENEGOTIATING:
|
|
printk("\tStatus: Renegotiation...\n");
|
|
break;
|
|
|
|
case TSPEC_STATUS_HANDLING:
|
|
printk("\tStatus: Request Handling...\n");
|
|
break;
|
|
|
|
case TSPEC_STATUS_FAIL:
|
|
switch(pStream->Cause)
|
|
{
|
|
case TSPEC_CAUSE_UNKNOWN:
|
|
printk("\tStatus: (ERR) Internal Error!\n");
|
|
break;
|
|
|
|
case TSPEC_CAUSE_REQ_TIMEOUT:
|
|
printk("\tStatus: (ERR) Request (ADDTS) timeout!\n");
|
|
break;
|
|
|
|
case TSPEC_CAUSE_SUGGESTED_TSPEC:
|
|
printk("\tStatus: (ERR) Suggested TSPEC is provided!\n");
|
|
break;
|
|
|
|
case TSPEC_CAUSE_REJECTED:
|
|
printk("\tStatus: (ERR) Rejected by QAP!\n");
|
|
break;
|
|
|
|
case TSPEC_CAUSE_UNKNOWN_STATUS:
|
|
printk("\tStatus: (ERR) Unknown response status code!\n");
|
|
break;
|
|
|
|
case TSPEC_CAUSE_INACTIVITY_TIMEOUT:
|
|
printk("\tStatus: (ERR) Inactivity timeout!\n");
|
|
break;
|
|
|
|
case TSPEC_CAUSE_DELETED_BY_QAP:
|
|
printk("\tStatus: (ERR) Deleted by QAP!\n");
|
|
break;
|
|
|
|
case TSPEC_CAUSE_DELETED_BY_QSTA:
|
|
printk("\tStatus: (ERR) Deleted by QSTA!\n");
|
|
break;
|
|
|
|
case TSPEC_CAUSE_BANDWIDTH:
|
|
printk("\tStatus: (ERR) In order to increase bandwidth!\n");
|
|
break;
|
|
|
|
case TSPEC_CAUSE_REJ_MANY_TS:
|
|
printk("\tStatus: (ERR) Reject due to too many TS in a AC!\n");
|
|
break;
|
|
|
|
case TSPEC_CASUE_REJ_INVALID_PARAM:
|
|
printk("\tStatus: (ERR) Reject due to invalid parameters!\n");
|
|
break;
|
|
|
|
case TSPEC_CAUSE_REJ_INVALID_TOKEN:
|
|
printk("\tStatus: (ERR) Reject due to invalid Dialog Token!\n");
|
|
break;
|
|
|
|
default:
|
|
printk("\tStatus: Fatal error, unknown cause!\n");
|
|
break;
|
|
} /* End of switch */
|
|
break;
|
|
|
|
default:
|
|
printk("\tStatus: Fatal error, unknown status!\n");
|
|
break;
|
|
} /* End of switch */
|
|
|
|
printk(" TSID = %d", pTspec->TsInfo.TSID);
|
|
|
|
printk("\tUP = %d", pTspec->TsInfo.UP);
|
|
printk("\tAC ID = %d", pStream->AcmAcId);
|
|
printk("\tUAPSD = %d", pTspec->TsInfo.APSD);
|
|
|
|
switch(pTspec->TsInfo.Direction)
|
|
{
|
|
case ACM_DIRECTION_UP_LINK:
|
|
printk("\tDirection = UP LINK\n");
|
|
break;
|
|
|
|
case ACM_DIRECTION_DOWN_LINK:
|
|
printk("\tDirection = DOWN LINK\n");
|
|
break;
|
|
|
|
case ACM_DIRECTION_DIRECT_LINK:
|
|
printk("\tDirection = DIRECT LINK\n");
|
|
break;
|
|
|
|
case ACM_DIRECTION_BIDIREC_LINK:
|
|
printk("\tDirection = BIDIRECTIONAL LINK\n");
|
|
break;
|
|
} /* End of switch */
|
|
|
|
if (ACMR_CB->EdcaCtrlParam.FlgAcmStatus[pStream->AcmAcId])
|
|
printk(" Current Inactivity timeout = %u us\n", pStream->InactivityCur);
|
|
else
|
|
printk(" No Inactivity timeout!\n");
|
|
/* End of if */
|
|
|
|
#ifdef ACM_CC_FUNC_11N_AGG
|
|
if (pTspec->TsInfo.AckPolicy == ACM_ACK_POLICY_NORMAL)
|
|
printk(" Ack Policy = Normal acknowledgement\n");
|
|
else if (pTspec->TsInfo.AckPolicy == ACM_ACK_POLICY_NO)
|
|
printk(" Ack Policy = No acknowledgement\n");
|
|
else if (pTspec->TsInfo.AckPolicy == ACM_ACK_POLICY_BLOCK)
|
|
printk(" Ack Policy = HT-immediate block acknowledgement\n");
|
|
/* End of if */
|
|
#endif /* ACM_CC_FUNC_11N_AGG */
|
|
|
|
if (pTspec->NominalMsduSize & ACM_NOM_MSDU_SIZE_CHECK_BIT)
|
|
{
|
|
printk(" Norminal MSDU Size (Fixed) = %d B\n",
|
|
(pTspec->NominalMsduSize & (~ACM_NOM_MSDU_SIZE_CHECK_BIT)));
|
|
}
|
|
else
|
|
{
|
|
printk(" Norminal MSDU Size (Variable) = %d B\n",
|
|
(pTspec->NominalMsduSize & (~ACM_NOM_MSDU_SIZE_CHECK_BIT)));
|
|
} /* End of if */
|
|
|
|
printk(" Inactivity Interval = %u us\n", pTspec->InactivityInt);
|
|
|
|
#if 0 /* not support */
|
|
if (pTspec->SuspensionInt != ACM_TSPEC_SUSPENSION_DISABLE)
|
|
printk("\tSuspension Interval = %u us\n", pTspec->SuspensionInt);
|
|
else
|
|
printk("\tSuspension Interval is disabled!\n");
|
|
/* End of if */
|
|
#endif
|
|
|
|
printk(" Mean Data Rate = %d bps\n", pTspec->MeanDataRate);
|
|
printk(" Min Physical Rate = %d bps (%d %d)\n",
|
|
pTspec->MinPhyRate, pStream->PhyModeMin, pStream->McsMin);
|
|
|
|
if (pTspec->TsInfo.AccessPolicy != ACM_ACCESS_POLICY_HCCA)
|
|
{
|
|
/* only for EDCA or HCCA + EDCA */
|
|
SBA_Temp = pTspec->SurplusBandwidthAllowance;
|
|
SBA_Temp = (UINT16)(SBA_Temp << ACM_SURPLUS_INT_BIT_NUM);
|
|
SBA_Temp = (UINT16)(SBA_Temp >> ACM_SURPLUS_INT_BIT_NUM);
|
|
SBA_Temp = ACM_SurplusFactorDecimalBin2Dec(SBA_Temp);
|
|
|
|
printk(" Surplus factor = %d.%02d",
|
|
(pTspec->SurplusBandwidthAllowance >> ACM_SURPLUS_DEC_BIT_NUM),
|
|
SBA_Temp);
|
|
|
|
printk("\t\tMedium Time = %d us\n", (pTspec->MediumTime << 5));
|
|
} /* End of if */
|
|
} /* End of AcmCmdStreamDisplayOne */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Parse WME input parameters.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
**ppArgv - input parameters
|
|
*pTspec - the output TSPEC
|
|
*pInfo - the output TS Info
|
|
*pStreamType - the stream type
|
|
|
|
Return Value:
|
|
0 - parse successfully
|
|
non 0 - parse fail
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[APSD:0~1] [nom size:byte] [inact:sec] [mean data rate:bps]
|
|
[min phy rate:Mbps] [surp factor:>=1]
|
|
|
|
where SBA is in 10 ~ 80, i.e. 1.0 ~ 8.0
|
|
========================================================================
|
|
*/
|
|
UCHAR AcmCmdInfoParse(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN CHAR **ppArgv,
|
|
ACM_PARAM_IN ACM_TSPEC *pTspec,
|
|
ACM_PARAM_IN ACM_TS_INFO *pInfo,
|
|
ACM_PARAM_IN UCHAR *pStreamType)
|
|
{
|
|
UINT32 SBA_Integer, SBA_Decimal;
|
|
CHAR *pArgv;
|
|
|
|
|
|
/* init */
|
|
pArgv = *ppArgv;
|
|
|
|
/* get stream type: 11e or WME/WSM */
|
|
ACM_NIN_DEC_GET((*pStreamType), 1, ("err> error type!\n"));
|
|
|
|
/* init TS Info */
|
|
pInfo->TrafficType = ACM_TRAFFIC_TYPE_APERIODIC;
|
|
|
|
ACM_NIN_DEC_GET(pInfo->TSID, 7, ("err> error TID!\n"));
|
|
ACM_NIN_DEC_GET(pInfo->Direction, 3, ("err> error dir!\n"));
|
|
ACM_NIN_DEC_MGET(pInfo->AccessPolicy, 1, 3, ("err> error access!\n"));
|
|
|
|
pInfo->Aggregation = ACM_AGGREGATION_DISABLE;
|
|
|
|
ACM_NIN_DEC_GET(pInfo->UP, 7, ("err> error UP!\n"));
|
|
pInfo->AckPolicy = ACM_ACK_POLICY_NORMAL;
|
|
ACM_NIN_DEC_GET(pInfo->APSD, 1, ("err> error APSD!\n"));
|
|
pInfo->Schedule = ACM_SCHEDULE_NO;
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_msg> TSInfo : "
|
|
"TID=%d, DIR=%d, ACCESS=%d, UP=%d, APSD=%d\n",
|
|
pInfo->TSID,
|
|
pInfo->Direction,
|
|
pInfo->AccessPolicy,
|
|
pInfo->UP,
|
|
pInfo->APSD));
|
|
|
|
/* init TSPEC */
|
|
pTspec->NominalMsduSize = AcmCmdUtilNumGet(&pArgv);
|
|
pTspec->MaxMsduSize = 0;
|
|
pTspec->MinServInt = 0;
|
|
pTspec->MaxServInt = 0;
|
|
ACM_NIN_DEC_GET(pTspec->InactivityInt, 3600, ("err> error inact!\n"));
|
|
pTspec->InactivityInt *= 1000000; /* unit: microseconds */
|
|
pTspec->SuspensionInt = 0; /* use 0 in EDCA mode, not 0xFFFFFFFF */
|
|
pTspec->ServiceStartTime = 0;
|
|
ACM_NIN_DEC_GET(pTspec->MeanDataRate, ACM_RATE_MAX, ("err> error mean rate!\n"));
|
|
pTspec->MinDataRate = pTspec->MeanDataRate;
|
|
pTspec->PeakDataRate = pTspec->MeanDataRate;
|
|
pTspec->MaxBurstSize = 0;
|
|
pTspec->DelayBound = 0;
|
|
ACM_NIN_DEC_GET(pTspec->MinPhyRate, ACM_RATE_MAX, ("err> error phy rate!\n"));
|
|
ACM_NIN_DEC_MGET(pTspec->SurplusBandwidthAllowance, 10, 80,
|
|
("err> error surp factor!\n"));
|
|
if (pTspec->SurplusBandwidthAllowance < 80)
|
|
{
|
|
SBA_Integer = pTspec->SurplusBandwidthAllowance / 10;
|
|
SBA_Decimal = pTspec->SurplusBandwidthAllowance - SBA_Integer*10;
|
|
SBA_Decimal = ACM_SurplusFactorDecimalDec2Bin(SBA_Decimal*10);
|
|
pTspec->SurplusBandwidthAllowance = \
|
|
(SBA_Integer << ACM_SURPLUS_DEC_BIT_NUM) | SBA_Decimal;
|
|
}
|
|
else
|
|
pTspec->SurplusBandwidthAllowance = 0xffff;
|
|
/* End of if */
|
|
pTspec->MediumTime = 0;
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_msg> TSPEC : "
|
|
"NOM SIZE=%d, INACT=%d, MEAN(MIN/MAX) RATE=%d, MIN PHY=%d, "
|
|
"SBA=0x%x\n",
|
|
pTspec->NominalMsduSize,
|
|
pTspec->InactivityInt,
|
|
pTspec->MeanDataRate,
|
|
pTspec->MinPhyRate,
|
|
pTspec->SurplusBandwidthAllowance));
|
|
|
|
*ppArgv = pArgv;
|
|
return 0;
|
|
|
|
LabelErr:
|
|
return 1;
|
|
} /* End of AcmCmdInfoParse */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Parse WME input parameters.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
**ppArgv - input parameters
|
|
*pTspec - the output TSPEC
|
|
*pInfo - the output TS Info
|
|
*pStreamType - the stream type
|
|
|
|
Return Value:
|
|
0 - parse successfully
|
|
non 0 - parse fail
|
|
|
|
Note:
|
|
For QAP & QSTA.
|
|
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[Ack Policy: 0~3] [APSD:0~1] [max size:byte] [nom size:byte]
|
|
[burst size:byte] [inact:sec]
|
|
[peak data rate:bps] [mean data rate:bps] [min data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1] [tclas processing:0~1]
|
|
[aggregation flag:0~1]
|
|
|
|
where SBA is in 100 ~ 800, i.e. 1.00 ~ 8.00
|
|
========================================================================
|
|
*/
|
|
UCHAR AcmCmdInfoParseAdvance(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN CHAR **ppArgv,
|
|
ACM_PARAM_IN ACM_TSPEC *pTspec,
|
|
ACM_PARAM_IN ACM_TS_INFO *pInfo,
|
|
ACM_PARAM_IN UCHAR *pStreamType)
|
|
{
|
|
UINT32 SBA_Integer, SBA_Decimal;
|
|
CHAR *pArgv;
|
|
|
|
|
|
/* init */
|
|
pArgv = *ppArgv;
|
|
|
|
/* get stream type: 11e or WME/WSM */
|
|
ACM_NIN_DEC_GET((*pStreamType), 1, ("err> error type!\n"));
|
|
|
|
/* init TS Info */
|
|
pInfo->TrafficType = ACM_TRAFFIC_TYPE_APERIODIC;
|
|
|
|
ACM_NIN_DEC_GET(pInfo->TSID, 7, ("err> error TID!\n"));
|
|
ACM_NIN_DEC_GET(pInfo->Direction, 3, ("err> error dir!\n"));
|
|
ACM_NIN_DEC_MGET(pInfo->AccessPolicy, 1, 3, ("err> error access!\n"));
|
|
|
|
pInfo->Aggregation = ACM_AGGREGATION_DISABLE;
|
|
|
|
ACM_NIN_DEC_GET(pInfo->UP, 7, ("err> error UP!\n"));
|
|
ACM_NIN_DEC_GET(pInfo->AckPolicy, 3, ("err> error Ack Policy!\n"));
|
|
ACM_NIN_DEC_GET(pInfo->APSD, 1, ("err> error APSD!\n"));
|
|
pInfo->Schedule = ACM_SCHEDULE_NO;
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_msg> TSInfo : "
|
|
"TID=%d, DIR=%d, ACCESS=%d, UP=%d, APSD=%d, AckPolicy=%d\n",
|
|
pInfo->TSID,
|
|
pInfo->Direction,
|
|
pInfo->AccessPolicy,
|
|
pInfo->UP,
|
|
pInfo->APSD,
|
|
pInfo->AckPolicy));
|
|
|
|
/* init TSPEC */
|
|
pTspec->MaxMsduSize = AcmCmdUtilNumGet(&pArgv);
|
|
pTspec->NominalMsduSize = AcmCmdUtilNumGet(&pArgv);
|
|
pTspec->MaxBurstSize = AcmCmdUtilNumGet(&pArgv);
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_msg> TSInfo : "
|
|
"MaxMsduSize=%d, NominalMsduSize=%d, MaxBurstSize=%d\n",
|
|
pTspec->MaxMsduSize,
|
|
pTspec->NominalMsduSize,
|
|
pTspec->MaxBurstSize));
|
|
|
|
pTspec->MinServInt = 0;
|
|
pTspec->MaxServInt = 0;
|
|
ACM_NIN_DEC_GET(pTspec->InactivityInt, 3600, ("err> error inact!\n"));
|
|
pTspec->InactivityInt *= 1000000; /* unit: microseconds */
|
|
pTspec->SuspensionInt = 0; /* use 0 in EDCA mode, not 0xFFFFFFFF */
|
|
pTspec->ServiceStartTime = 0;
|
|
ACM_NIN_DEC_GET(pTspec->PeakDataRate, ACM_RATE_MAX, ("err> error peak rate!\n"));
|
|
ACM_NIN_DEC_GET(pTspec->MeanDataRate, ACM_RATE_MAX, ("err> error mean rate!\n"));
|
|
ACM_NIN_DEC_GET(pTspec->MinDataRate, ACM_RATE_MAX, ("err> error min rate!\n"));
|
|
pTspec->DelayBound = 0;
|
|
ACM_NIN_DEC_GET(pTspec->MinPhyRate, ACM_RATE_MAX, ("err> error phy rate!\n"));
|
|
ACM_NIN_DEC_MGET(pTspec->SurplusBandwidthAllowance, 100, 800,
|
|
("err> error surp factor!\n"));
|
|
if (pTspec->SurplusBandwidthAllowance < 800)
|
|
{
|
|
SBA_Integer = pTspec->SurplusBandwidthAllowance / 100;
|
|
SBA_Decimal = pTspec->SurplusBandwidthAllowance - SBA_Integer*100;
|
|
SBA_Decimal = ACM_SurplusFactorDecimalDec2Bin(SBA_Decimal);
|
|
pTspec->SurplusBandwidthAllowance = \
|
|
(SBA_Integer << ACM_SURPLUS_DEC_BIT_NUM) | SBA_Decimal;
|
|
}
|
|
else
|
|
pTspec->SurplusBandwidthAllowance = 0xffff;
|
|
/* End of if */
|
|
pTspec->MediumTime = 0;
|
|
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_msg> TSPEC : "
|
|
"MAX/NOM SIZE=%d %d, INACT=%d, PEAK/MEAN/MIN RATE=%d %d %d, MIN PHY=%d, "
|
|
"SBA=0x%x\n",
|
|
pTspec->MaxMsduSize,
|
|
pTspec->NominalMsduSize,
|
|
pTspec->InactivityInt,
|
|
pTspec->PeakDataRate,
|
|
pTspec->MeanDataRate,
|
|
pTspec->MinDataRate,
|
|
pTspec->MinPhyRate,
|
|
pTspec->SurplusBandwidthAllowance));
|
|
|
|
*ppArgv = pArgv;
|
|
return 0;
|
|
|
|
LabelErr:
|
|
return 1;
|
|
} /* End of AcmCmdInfoParseAdvance */
|
|
|
|
|
|
#ifdef IEEE80211E_SIMULATION
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Simulate the WLAN header from AP.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
1. For QSTA test.
|
|
========================================================================
|
|
*/
|
|
static VOID AcmApMgtMacHeaderInit(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN ACMR_WLAN_HEADER *pHdr,
|
|
ACM_PARAM_IN UCHAR SubType,
|
|
ACM_PARAM_IN UCHAR BitToDs,
|
|
ACM_PARAM_IN UCHAR *pMacDa,
|
|
ACM_PARAM_IN UCHAR *pBssid)
|
|
{
|
|
NdisZeroMemory(pHdr, sizeof(ACMR_WLAN_HEADER));
|
|
|
|
pHdr->FC.Type = FC_TYPE_MGMT;
|
|
pHdr->FC.SubType = SubType;
|
|
pHdr->FC.ToDs = BitToDs;
|
|
COPY_MAC_ADDR(pHdr->Addr1, pMacDa);
|
|
COPY_MAC_ADDR(pHdr->Addr2, pBssid);
|
|
COPY_MAC_ADDR(pHdr->Addr3, pBssid);
|
|
} /* End of AcmApMgtMacHeaderInit */
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Make a WME action frame body.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
*pStream - the stream
|
|
*pPkt - the frame body pointer
|
|
Action - action
|
|
StatusCode - status code, used when action = response
|
|
TclasProcessing - the TCLAS PROCESSING value
|
|
|
|
Return Value:
|
|
ACM_RTN_OK - insert ok
|
|
ACM_RTN_FAIL - insert fail
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
static UINT32 ACM_CMD_WME_Action_Make(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN ACM_STREAM_INFO *pStream,
|
|
ACM_PARAM_IN UCHAR *pPkt,
|
|
ACM_PARAM_IN UCHAR Action,
|
|
ACM_PARAM_IN UCHAR StatusCode,
|
|
ACM_PARAM_IN UCHAR TclasProcessing)
|
|
{
|
|
ACM_WME_NOT_FRAME *pFrameBody;
|
|
ACM_ELM_WME_TSPEC *pElmTspec;
|
|
ACM_WME_TS_INFO *pInfo;
|
|
ACM_WME_TSPEC *pTspec;
|
|
ACM_ELM_WME_TCLAS *pElmTclas;
|
|
ACM_ELM_WME_TCLAS_PROCESSING *pElmTclasProcessing;
|
|
UINT32 BodyLen, IdTclasNum;
|
|
|
|
|
|
/* init */
|
|
pFrameBody = (ACM_WME_NOT_FRAME *)pPkt;
|
|
|
|
/* sanity check for type */
|
|
if (Action > ACM_ACTION_WME_TEAR_DOWN)
|
|
return 0;
|
|
/* End of if */
|
|
|
|
/* init frame body */
|
|
pFrameBody->Category = ACM_CATEGORY_WME;
|
|
pFrameBody->Action = Action;
|
|
|
|
if (gDialogToken == 0)
|
|
gDialogToken ++; /* can not be 0 */
|
|
/* End of if */
|
|
|
|
if (Action != ACM_ACTION_WME_TEAR_DOWN)
|
|
pFrameBody->DialogToken = gDialogToken++;
|
|
else
|
|
pFrameBody->DialogToken = 0;
|
|
/* End of if */
|
|
|
|
pFrameBody->StatusCode = StatusCode;
|
|
BodyLen = 4;
|
|
|
|
/* TSPEC element */
|
|
pElmTspec = &pFrameBody->ElmTspec;
|
|
pElmTspec->ElementId = ACM_ELM_WME_ID;
|
|
pElmTspec->Length = ACM_ELM_WME_TSPEC_LEN;
|
|
|
|
/* init OUI field */
|
|
pElmTspec->OUI[0] = ACM_WME_OUI_0;
|
|
pElmTspec->OUI[1] = ACM_WME_OUI_1;
|
|
pElmTspec->OUI[2] = ACM_WME_OUI_2;
|
|
pElmTspec->OUI_Type = ACM_WME_OUI_TYPE;
|
|
pElmTspec->OUI_SubType = ACM_WME_OUI_SUBTYPE_TSPEC;
|
|
pElmTspec->Version = ACM_WME_OUI_VERSION;
|
|
|
|
/* init TS Info field */
|
|
pTspec = &pFrameBody->ElmTspec.Tspec;
|
|
ACMR_MEM_ZERO(pTspec, sizeof(ACM_WME_TSPEC));
|
|
pInfo = &pFrameBody->ElmTspec.Tspec.TsInfo;
|
|
|
|
pInfo->UP = pStream->Tspec.TsInfo.UP;
|
|
pInfo->Direction = pStream->Tspec.TsInfo.Direction;
|
|
pInfo->TID = pStream->Tspec.TsInfo.TSID;
|
|
pInfo->PSB = pStream->Tspec.TsInfo.APSD;
|
|
pInfo->One = 1;
|
|
|
|
#ifdef ACM_CC_FUNC_11N_AGG
|
|
pInfo->AckPolicy = pStream->Tspec.TsInfo.AckPolicy;
|
|
#endif /* ACM_CC_FUNC_11N_AGG */
|
|
|
|
/* init TSPEC parameters */
|
|
pTspec->NominalMsduSize = pStream->Tspec.NominalMsduSize;
|
|
pTspec->MaxBurstSize = pStream->Tspec.MaxBurstSize;
|
|
pTspec->InactivityInt = pStream->Tspec.InactivityInt;
|
|
pTspec->SuspensionInt = pStream->Tspec.SuspensionInt;
|
|
pTspec->MeanDataRate = pStream->Tspec.MeanDataRate;
|
|
pTspec->MinPhyRate = pStream->Tspec.MinPhyRate;
|
|
pTspec->SurplusBandwidthAllowance = \
|
|
pStream->Tspec.SurplusBandwidthAllowance;
|
|
|
|
BodyLen += (2+pElmTspec->Length);
|
|
|
|
/* TCLAS element */
|
|
pElmTclas = (ACM_ELM_WME_TCLAS *)pFrameBody->Tclas;
|
|
|
|
/* init OUI field */
|
|
pElmTclas->OUI[0] = ACM_WME_OUI_0;
|
|
pElmTclas->OUI[1] = ACM_WME_OUI_1;
|
|
pElmTclas->OUI[2] = ACM_WME_OUI_2;
|
|
pElmTclas->OUI_Type = ACM_WME_OUI_TYPE;
|
|
pElmTclas->OUI_SubType = ACM_WSM_OUI_SUBTYPE_TCLAS;
|
|
pElmTclas->Version = ACM_WME_OUI_VERSION;
|
|
|
|
/* init TCLAS parameters */
|
|
for(IdTclasNum=0; IdTclasNum<gTLS_Grp_ID; IdTclasNum++)
|
|
{
|
|
pElmTclas->ElementId = ACM_ELM_WME_ID;
|
|
|
|
switch(gCMD_TCLAS_Group[IdTclasNum].ClassifierType)
|
|
{
|
|
case ACM_TCLAS_TYPE_ETHERNET:
|
|
pElmTclas->Length = ACM_TCLAS_TYPE_WME_ETHERNET_LEN;
|
|
break;
|
|
|
|
case ACM_TCLAS_TYPE_IP_V4:
|
|
pElmTclas->Length = ACM_TCLAS_TYPE_WME_IP_V4_LEN;
|
|
break;
|
|
|
|
case ACM_TCLAS_TYPE_8021DQ:
|
|
pElmTclas->Length = ACM_TCLAS_TYPE_WME_8021DQ_LEN;
|
|
break;
|
|
} /* End of switch */
|
|
|
|
memcpy(&pElmTclas->Tclas,
|
|
&gCMD_TCLAS_Group[IdTclasNum],
|
|
pElmTclas->Length);
|
|
|
|
BodyLen += (2+pElmTclas->Length);
|
|
|
|
pElmTclas = (ACM_ELM_WME_TCLAS *)\
|
|
((UCHAR *)pElmTclas + (2 + pElmTclas->Length));
|
|
} /* End of for */
|
|
|
|
/* TCLAS Processing element */
|
|
if (gTLS_Grp_ID > 0)
|
|
{
|
|
pElmTclasProcessing = (ACM_ELM_WME_TCLAS_PROCESSING *)pElmTclas;
|
|
|
|
/* init OUI field */
|
|
pElmTclasProcessing->OUI[0] = ACM_WME_OUI_0;
|
|
pElmTclasProcessing->OUI[1] = ACM_WME_OUI_1;
|
|
pElmTclasProcessing->OUI[2] = ACM_WME_OUI_2;
|
|
pElmTclasProcessing->OUI_Type = ACM_WME_OUI_TYPE;
|
|
pElmTclasProcessing->OUI_SubType = ACM_WSM_OUI_SUBTYPE_TCLAS_PROCESSING;
|
|
pElmTclasProcessing->Version = ACM_WME_OUI_VERSION;
|
|
|
|
/* init TCLAS Processing parameters */
|
|
pElmTclasProcessing->ElementId = ACM_ELM_WME_ID;
|
|
pElmTclasProcessing->Length = ACM_ELM_WME_TCLAS_PROCESSING_LEN;
|
|
pElmTclasProcessing->Processing = TclasProcessing;
|
|
BodyLen += (2+pElmTclasProcessing->Length);
|
|
} /* End of if */
|
|
|
|
return BodyLen;
|
|
} /* End of ACM_CMD_WME_Action_Make */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
QoS Data simulation task.
|
|
|
|
Arguments:
|
|
Data - WLAN control block pointer
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP.
|
|
========================================================================
|
|
*/
|
|
static VOID ACM_CMD_Task_Data_Simulation(ULONG Data)
|
|
{
|
|
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)Data;
|
|
UINT32 IdFlowNum;
|
|
|
|
|
|
if (gTaskDataSleep == 1)
|
|
goto LabelExit; /* sleeping, nothing to do */
|
|
/* End of while */
|
|
|
|
if (gSimDelayCount == 0)
|
|
{
|
|
for(IdFlowNum=0; IdFlowNum<ACM_MAX_NUM_OF_SIM_DATA_FLOW; IdFlowNum++)
|
|
{
|
|
if (gDATA_Sim[IdFlowNum].FlgIsValidEntry == 1)
|
|
{
|
|
switch(gDATA_Sim[IdFlowNum].Direction)
|
|
{
|
|
case 0: /* QoS receive */
|
|
ACM_CMD_Sim_Data_Rv(pAd, &gDATA_Sim[IdFlowNum]);
|
|
break;
|
|
|
|
case 1: /* QoS transmission */
|
|
ACM_CMD_Sim_Data_Tx(pAd, &gDATA_Sim[IdFlowNum]);
|
|
break;
|
|
|
|
case 2: /* non-QoS receive */
|
|
ACM_CMD_Sim_nonQoS_Data_Rv(pAd, &gDATA_Sim[IdFlowNum]);
|
|
break;
|
|
} /* End of switch */
|
|
} /* End of if */
|
|
} /* End of for */
|
|
|
|
gSimDelayCount = gSimDelay;
|
|
}
|
|
else
|
|
gSimDelayCount --;
|
|
/* End of if */
|
|
|
|
LabelExit:
|
|
#ifdef ACMR_HANDLE_IN_TIMER
|
|
ACMR_TIMER_ENABLE(FlgIsTimerEnabled, gTimerSim, ACM_STREAM_CHECK_OFFSET);
|
|
#endif /* ACMR_HANDLE_IN_TIMER */
|
|
} /* End of ACM_CMD_Task_Data_Simulation */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Simulation periodical timer.
|
|
|
|
Arguments:
|
|
Data - WLAN control block pointer
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
VOID ACM_CMD_Timer_Data_Simulation(ULONG Data)
|
|
{
|
|
#ifndef ACMR_HANDLE_IN_TIMER
|
|
ACMR_TASK_ACTIVATE(gTaskletSim, gTimerSim, 10); /* 100ms */
|
|
|
|
#else
|
|
|
|
ACM_CMD_Task_Data_Simulation(Data);
|
|
#endif /* ACMR_HANDLE_IN_TIMER */
|
|
} /* End of ACM_CMD_Timer_Data_Simulation */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Send a QoS data frame to the QAP.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
*pInfo - the data flow information
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP.
|
|
========================================================================
|
|
*/
|
|
static VOID ACM_CMD_Sim_Data_Rv(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN ACM_DATA_SIM *pInfo)
|
|
{
|
|
/* not support */
|
|
} /* End of ACM_CMD_Sim_Data_Rv */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Send a non-QoS data frame to the QAP.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
*pInfo - the data flow information
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP.
|
|
========================================================================
|
|
*/
|
|
static VOID ACM_CMD_Sim_nonQoS_Data_Rv(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN ACM_DATA_SIM *pInfo)
|
|
{
|
|
/* not support */
|
|
} /* End of ACM_CMD_Sim_nonQoS_Data_Rv */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Transmit a QoS data frame from the upper layer.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
*pInfo - the data flow information
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
For QAP.
|
|
========================================================================
|
|
*/
|
|
static VOID ACM_CMD_Sim_Data_Tx(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN ACM_DATA_SIM *pInfo)
|
|
{
|
|
#ifndef OS_ABL_FUNC_SUPPORT
|
|
UCHAR *pBufFrame;
|
|
NDIS_STATUS Status;
|
|
ACMR_MBUF *pMblk;
|
|
UCHAR *pFrameBody;
|
|
UINT32 DataIndex;
|
|
|
|
|
|
/* init */
|
|
pBufFrame = NULL;
|
|
DataIndex = 0;
|
|
|
|
/* get an unused nonpaged memory */
|
|
Status = MlmeAllocateMemory(pAd, &pBufFrame);
|
|
if (Status != NDIS_STATUS_SUCCESS)
|
|
return;
|
|
/* End of if */
|
|
|
|
/* allocate action request frame */
|
|
ACMR_PKT_ALLOCATE(pAd, pMblk);
|
|
if (pMblk == NULL)
|
|
{
|
|
printk("acm_err> allocate action frame fail!\n");
|
|
goto LabelErr;
|
|
} /* End of if */
|
|
|
|
/* init frame body */
|
|
ACMR_MEM_COPY(pBufFrame, pInfo->MacDst, 6);
|
|
ACMR_MEM_COPY(pBufFrame+6, pInfo->MacSrc, 6);
|
|
*(UINT16 *)(pBufFrame+12) = 0x0800;
|
|
|
|
pFrameBody = (UCHAR *)(pBufFrame+14);
|
|
ACMR_MEM_SET(pFrameBody, 'c', pInfo->FrameSize); /* data */
|
|
|
|
/* check whether the packet is TCP test packet */
|
|
if (gSimTCPFlag != 0)
|
|
{
|
|
#define DATA_SET(value) pFrameBody[DataIndex++] = value;
|
|
|
|
/* prepare TCP packet */
|
|
DATA_SET(0x08); DATA_SET(0x00); /* type/len */
|
|
DATA_SET(0x45); DATA_SET(gSimTCPDSCP); /* version, len, DSCP */
|
|
DATA_SET(0x00); DATA_SET(0x28); /* total length */
|
|
DATA_SET(0x4d); DATA_SET(0x78); /* identifier */
|
|
DATA_SET(0x00); DATA_SET(0x00); DATA_SET(0x38); DATA_SET(0x06);
|
|
DATA_SET(0x97); DATA_SET(0xd9);
|
|
DATA_SET(0xac); DATA_SET(0x14); DATA_SET(0x40); DATA_SET(0xf9);
|
|
DATA_SET(0xac); DATA_SET(0x14); DATA_SET(0x04); DATA_SET(0x5d);
|
|
|
|
DATA_SET(0x00); DATA_SET(0x51); DATA_SET(0x06); DATA_SET(0x81);
|
|
DATA_SET(0xdd); DATA_SET(0x56); DATA_SET(0x9d); DATA_SET(0xeb);
|
|
DATA_SET(0xa5); DATA_SET(0xa9); DATA_SET(0xa0); DATA_SET(0x9b);
|
|
DATA_SET(0x50); DATA_SET(0x10); DATA_SET(0x3d); DATA_SET(0x57);
|
|
DATA_SET(0x0c); DATA_SET(0xa5); DATA_SET(0x00); DATA_SET(0x00);
|
|
}
|
|
else
|
|
{
|
|
/* use VLAN */
|
|
pFrameBody = (UCHAR *)(pBufFrame+12);
|
|
DATA_SET(0x81); DATA_SET(0x00); /* type/len */
|
|
DATA_SET(pInfo->TID<<5); DATA_SET(0x00);
|
|
} /* End of if */
|
|
|
|
/* send the packet */
|
|
ACMR_PKT_COPY(pMblk, pBufFrame, pInfo->FrameSize);
|
|
|
|
rt28xx_packet_xmit(RTPKT_TO_OSPKT(pMblk));
|
|
|
|
LabelErr:
|
|
/* free the frame buffer */
|
|
MlmeFreeMemory(pAd, pBufFrame);
|
|
#endif /* OS_ABL_SUPPORT */
|
|
} /* End of ACM_CMD_Sim_Data_Tx */
|
|
|
|
#else
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Simulation periodical timer.
|
|
|
|
Arguments:
|
|
Data - WLAN control block pointer
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
VOID ACM_CMD_Timer_Data_Simulation(ULONG Data)
|
|
{
|
|
} /* End of ACM_CMD_Timer_Data_Simulation */
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Enable or disable test flag.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Argc - the number of input parameters
|
|
*pArgv - input parameters
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Test flag is used in various test situation.
|
|
========================================================================
|
|
*/
|
|
static VOID AcmCmdTestFlagCtrl(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN INT32 Argc,
|
|
ACM_PARAM_IN CHAR *pArgv)
|
|
{
|
|
gAcmTestFlag = AcmCmdUtilNumGet(&pArgv);
|
|
} /* End of AcmCmdTestFlagCtrl */
|
|
|
|
|
|
|
|
|
|
#define ACM_CMD_TCLAS_RESET 1 /* wmm tclas reset */
|
|
#define ACM_CMD_TCLAS_ADD 2 /* wmm tclas add */
|
|
#define ACM_CMD_EDCA_TS_ADD 3 /* wmm edca ts add */
|
|
#define ACM_CMD_EDCA_CHG 4 /* wmm edca change */
|
|
#define ACM_CMD_AVAL_SHOW 5 /* wmm available bw show */
|
|
#define ACM_CMD_SHOW 6 /* wmm ts show */
|
|
#define ACM_CMD_FSHOW 7 /* wmm fail show */
|
|
#define ACM_CMD_EDCA_SHOW 8 /* wmm edca info show */
|
|
#ifdef RELEASE_EXCLUDE
|
|
#define ACM_CMD_WME_DATL 9 /* wmm datl */
|
|
#endif /* RELEASE_EXCLUDE */
|
|
#define ACM_CMD_WME_ACM_CTRL 10 /* wmm acm ctrl */
|
|
#define ACM_CMD_DELTS 11 /* wmm delts */
|
|
#define ACM_CMD_FCLEAR 12 /* wmm fclr */
|
|
#define ACM_CMD_EDCA_TS_NEG 13 /* wmm edca ts negotiate */
|
|
#define ACM_CMD_UAPSD_SHOW 14 /* wmm uapsd show */
|
|
#define ACM_CMD_TSPEC_REJECT 15 /* wmm tspec reject */
|
|
#define ACM_CMD_EDCA_TS_ADD_ADV 16 /* wmm edca ts add advcance */
|
|
#define ACM_CMD_STATS 17 /* wmm statistics */
|
|
#define ACM_CMD_REASSOCIATE 18 /* wmm reassociate */
|
|
#define ACM_CMD_TSPEC_TIMEOUT_CTRL 19 /* wmm tspec timeout */
|
|
#define ACM_CMD_NO_TSPEC_UAPSD 20 /* wmm tspec no uapsd */
|
|
#define ACM_CMD_ASSOCIATE 21 /* wmm associate */
|
|
#define ACM_CMD_ACL_ADD 22 /* wmm acl add */
|
|
#define ACM_CMD_ACL_DEL 23 /* wmm acl del */
|
|
#define ACM_CMD_ACL_CTRL 24 /* wmm acl control */
|
|
|
|
#define ACM_CMD_SM_ASSOC 50 /* wmm sim assoc */
|
|
#define ACM_CMD_SM_REQ 51 /* wmm sim req */
|
|
#define ACM_CMD_SM_DEL_FRM_QSTA 52 /* wmm sim del */
|
|
#define ACM_CMD_SM_DATRV 53 /* wmm sim datrv */
|
|
#define ACM_CMD_SM_DATTX 54 /* wmm sim dattx */
|
|
#define ACM_CMD_SM_STP 55 /* wmm sim stp */
|
|
#define ACM_CMD_SM_SUS 56 /* wmm sim sus */
|
|
#define ACM_CMD_SM_RES 57 /* wmm sim res */
|
|
#define ACM_CMD_SM_REASSOC 58 /* wmm sim reassoc */
|
|
#define ACM_CMD_SM_NASSOC 59 /* wmm sim nassoc */
|
|
#define ACM_CMD_SM_NDATRV 60 /* wmm sim ndatarv */
|
|
#define ACM_CMD_SM_RATE 61 /* wmm sim rate */
|
|
#define ACM_CMD_SM_TCP 62 /* wmm sim tcp */
|
|
#define ACM_CMD_SM_STA_MAC_SET 63 /* wmm sim staset */
|
|
#define ACM_CMD_SM_STA_ASSOC 64 /* wmm sim sta auth/assoc */
|
|
#define ACM_CMD_SM_WME_REQTX 65 /* wmm sim req tx */
|
|
#define ACM_CMD_SM_WME_NEQTX 66 /* wmm sim neq tx */
|
|
#define ACM_CMD_SM_WME_REQ_FAIL 67 /* wmm sim req fail */
|
|
#define ACM_CMD_SM_WME_NEG_FAIL 68 /* wmm sim neg fail */
|
|
#define ACM_CMD_SM_ACM_RESET 69 /* wmm sim acm reset */
|
|
#define ACM_CMD_SM_STA_PS 70 /* wmm sim station enters PS or ACT */
|
|
#define ACM_CMD_SM_REQ_PS_POLL 71 /* wmm sim req & ps poll */
|
|
#define ACM_CMD_SM_DEL_FRM_QAP 72 /* wmm sim del */
|
|
#define ACM_CMD_SM_TRI_FRM_RCV 73 /* wmm sim trigger frame receive */
|
|
#define ACM_CMD_SM_UAPSD_QUE_MAIN 74 /* wmm sim uapsd queue maintain ctrl */
|
|
#define ACM_CMD_SM_REQ_ADVANCE 75 /* wmm sim req advance */
|
|
#define ACM_TEST_FLAG 90 /* wmm test flag */
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Test command.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
*pArgvIn - the data flow information
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
All test commands are listed as follows:
|
|
iwpriv ra0 set acm=[cmd id]_[arg1]_[arg2]_......_[argn]
|
|
[cmd id] = xx, such as 00, 01, 02, 03, ...
|
|
|
|
1. Reset all TCLAS elements
|
|
2. Create a TCLAS element
|
|
[up:0~7] [type:0~2] [mask:hex] [classifier:max 16B]
|
|
3. Create a QoS EDCA stream
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[APSD:0~1] [nom size:byte] [inact:sec] [mean data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1] [tclas processing:0~1]
|
|
(ack policy:0~3)
|
|
4. Change EDCA parameters
|
|
[CPnu] [CPde] [BEnu] [BEde]
|
|
5. Show current bandwidth status
|
|
6. Show current streams status
|
|
[1:EDCA] (Client MAC: xx:xx:xx:xx:xx:xx)
|
|
7. Show fail streams status
|
|
8. Show current EDCA parameters
|
|
9. Set VB parameters
|
|
[enable: 0~1] [minimum bw threshold for AC0~AC3]
|
|
[maximum bw threshold for AC0~AC3]
|
|
10. Enable/disable ACM flag for 4 AC
|
|
[AC0] [AC1] [AC2] [AC3]
|
|
11. Send out a DELTS request frame
|
|
[Peer MAC] [TID:0~7]
|
|
12. Clear the failed list
|
|
13. Negotiate a QoS EDCA stream
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[APSD:0~1] [nom size:byte] [inact:sec] [mean data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1] [tclas processing:0~1]
|
|
14. Show UAPSD information
|
|
[Device MAC]
|
|
15. Reject all new TSPEC requests
|
|
[Enable/Disable 1/0]
|
|
16. Create a advanced QoS EDCA stream
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[APSD:0~1] [max size:byte] [nom size:byte] [burst size:byte]
|
|
[inact:sec]
|
|
[peak data rate:bps] [mean data rate:bps] [min data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1] [tclas processing:0~1]
|
|
17. Show statistics count
|
|
18. Send a reassociate frame to the associated AP
|
|
19. Enable/disable TSPEC timeout mechanism
|
|
20. Enable/disable TSPEC UAPSD function
|
|
21. Send a associate frame to the associated AP
|
|
22. Add a ACL station entry
|
|
23. Del a ACL station entry
|
|
|
|
|
|
50. Simulate authentication & assocaition req event
|
|
(Source Client MAC)
|
|
51. Simulate a request frame receive event
|
|
[sta mac:xx:xx:xx:xx:xx:xx]
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[UAPSD:0/1] [nom size:byte] [inact:sec] [mean data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1] [tclas processing:0~1]
|
|
52. Simulate to delete a actived stream from QSTA
|
|
[Client MAC] [type:0-11e, 1-WME] [TID:0~7] [dir:0~3]
|
|
53. Simulate to continue to receive packets from a QSTA
|
|
[Src Client MAC] [Dst Client MAC] [type:0-11e, 1-WME] [TID:0~7]
|
|
[size] (ack: 0~1) (fragment: 0~1) (rts/cts: 0~1)
|
|
54. Simulate to continue to transmit packets from upper layer
|
|
[Dst Client MAC] [type:0-11e, 1-WME] [TID:0~7] [size] [ack:0~1]
|
|
55. Simulate to stop to continue to send packets to a QSTA
|
|
(Client MAC)
|
|
56. Simulate to suspend to send packets
|
|
57. Simulate to resume to send packets
|
|
(delay)
|
|
58. Clear all failed records
|
|
59. Simulate authentication & assocaition req event (non-QoS)
|
|
[Source Client MAC]
|
|
60. Simulate to continue to receive non-QoS packets from a QSTA
|
|
[Src Client MAC] [Dst Client MAC] [TID:0~7]
|
|
61. Simulate to force AP to transmit packets using the rate
|
|
[Dst Client MAC] [rate]
|
|
62. Simulate to enable or disable TCP tx packet
|
|
[enable: 0~1] [DSCP]
|
|
63. Simulate to reset station MAC address
|
|
[MAC]
|
|
64. Simulate to authenticate and associate a AP
|
|
[AP MAC]
|
|
65. Simulate to send a ADDTS request and receive a ADDTS response
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[ack:0] [nom size:byte] [inact:sec] [mean data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1] [tclas processing:0~1]
|
|
66. Simulate to send a negotiated ADDTS request and receive a ADDTS response
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[ack:0] [nom size:byte] [inact:sec] [mean data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1]
|
|
67. Simulate to send a ADDTS request and receive a ADDTS fail response
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[ack:0] [nom size:byte] [inact:sec] [mean data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1]
|
|
68. Simulate to send a negotiated ADDTS req and receive a failed ADDTS rsp
|
|
[type:1-WME] [TID:0~7] [dir:0~3] [access:1] [UP:0~7]
|
|
[ack:0] [nom size:byte] [inact:sec] [mean data rate:bps]
|
|
[min phy rate:bps] [surp factor:>=1]
|
|
69. Simulate the ACM flag set
|
|
[ACM0] [ACM1] [ACM2] [ACM3]
|
|
70. Simulate the station enters PS mode or ACTIVE mode
|
|
[mode:0~1] [MAC]
|
|
71. Simulate to receive a PS Poll frame
|
|
[MAC]
|
|
72. Simulate to delete a actived stream from QAP
|
|
[type:1-WME] [TID:0~7] [dir:0~3]
|
|
73. Simulate to receive a trigger frame from QSTA
|
|
[MAC]
|
|
74. Simulate to enable/disable UAPSD queue maintain
|
|
[enable: 0~1]
|
|
75. Simulate a advanced request frame receive event
|
|
|
|
90. Test Flag
|
|
[ON/OFF]
|
|
========================================================================
|
|
*/
|
|
INT ACM_Ioctl(
|
|
ACM_PARAM_IN PRTMP_ADAPTER pAd,
|
|
ACM_PARAM_IN RTMP_STRING *pArgvIn)
|
|
{
|
|
CHAR BufCmd[3] = { 0, 0, 0 };
|
|
CHAR *pArgv, *pParam;
|
|
UINT32 Command;
|
|
INT32 Argc;
|
|
|
|
|
|
/* init */
|
|
pArgv = (CHAR *)pArgvIn;
|
|
|
|
/* get command type */
|
|
/* command format is iwpriv ra0 set acm=[cmd id]_[arg1]_......_[argn] */
|
|
ACMR_MEM_COPY(BufCmd, pArgv, 2);
|
|
Command = ACMR_ARG_ATOI(BufCmd);
|
|
pArgv += 2; /* skip command field */
|
|
|
|
/* get Argc number */
|
|
Argc = 0;
|
|
pParam = pArgv;
|
|
|
|
while(1)
|
|
{
|
|
if (*pParam == '_')
|
|
Argc ++;
|
|
/* End of if */
|
|
|
|
if ((*pParam == 0x00) || (Argc > 20))
|
|
break;
|
|
/* End of if */
|
|
|
|
pParam++;
|
|
} /* End of while */
|
|
|
|
pArgv++; /* skip _ points to arg1 */
|
|
|
|
#if 0 /* support all commands when all ACM are disabled */
|
|
/* sanity check */
|
|
if (ACMR_IS_ASSOCIATED(pAd))
|
|
{
|
|
if (
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
(Command != ACM_CMD_EDCA_TS_ADD) &&
|
|
(Command != ACM_CMD_EDCA_TS_ADD_ADV) &&
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
(Command != ACM_CMD_WME_ACM_CTRL) &&
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
(Command != ACM_CMD_UAPSD_SHOW) &&
|
|
(Command != ACM_CMD_DELTS) &&
|
|
(Command != ACM_CMD_SHOW) &&
|
|
#ifdef IEEE80211E_SIMULATION
|
|
(Command != ACM_CMD_SM_ACM_RESET) &&
|
|
(Command != ACM_CMD_SM_ASSOC) &&
|
|
(Command != ACM_CMD_SM_REQ) &&
|
|
(Command != ACM_CMD_SM_STA_PS) &&
|
|
(Command != ACM_CMD_SM_TRI_FRM_RCV) &&
|
|
(Command != ACM_CMD_SM_UAPSD_QUE_MAIN) &&
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
(!ACMR_IS_ENABLED(pAd)))
|
|
{
|
|
/* We accept TSPEC request when no any ACM of AC is enabled.
|
|
Because maybe he or she want to change PS mode only */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_err> ACM is disabled! ACM_Ioctl()\n"));
|
|
return -EINVAL;
|
|
} /* End of if */
|
|
} /* End of if */
|
|
#endif
|
|
|
|
/* handle the command */
|
|
switch(Command)
|
|
{
|
|
case ACM_CMD_TCLAS_RESET: /* 1 wmm tclas reset */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> reset TCLAS\n"));
|
|
AcmCmdTclasReset(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_TCLAS_ADD: /* 2 wmm tclas add */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> add a TCLAS\n"));
|
|
AcmCmdTclasCreate(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
case ACM_CMD_EDCA_TS_ADD: /* 3 wmm edca ts add */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> request a TSPEC\n"));
|
|
AcmCmdStreamTSRequest(pAd, Argc, pArgv, 0);
|
|
break;
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
case ACM_CMD_EDCA_CHG: /* 4 wmm edca change */
|
|
break;
|
|
|
|
case ACM_CMD_AVAL_SHOW: /* 5 wmm available bw show */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> show available bw\n"));
|
|
AcmCmdBandwidthDisplay(pAd, 0, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SHOW: /* 6 wmm ts show */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> show ACM status\n"));
|
|
AcmCmdStreamDisplay(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_FSHOW: /* 7 wmm fail show */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> show failed TS info\n"));
|
|
AcmCmdStreamFailDisplay(pAd, 0, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_EDCA_SHOW: /* 8 wmm edca info show */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> show WMM TS info\n"));
|
|
AcmCmdEDCAParamDisplay(pAd, 0, pArgv);
|
|
break;
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
case ACM_CMD_WME_DATL: /* 9 wmm datl */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> enable/disable Dynamic ATL\n"));
|
|
AcmCmdDATLEnable(pAd, Argc, pArgv);
|
|
break;
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
case ACM_CMD_WME_ACM_CTRL: /* 10 wmm acm ctrl */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> enable/disable ACM Flag for each AC\n"));
|
|
AcmCmdAcmFlagCtrl(pAd, Argc, pArgv);
|
|
break;
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
case ACM_CMD_DELTS: /* 11 wmm delts */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> send a DELTS request frame\n"));
|
|
AcmCmdDeltsSend(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_FCLEAR: /* 12 wmm fclr */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> clear failed TS info\n"));
|
|
AcmCmdStreamFailClear(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
case ACM_CMD_EDCA_TS_NEG: /* 13 wmm edca ts negotiate */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> negotiate a TSPEC\n"));
|
|
AcmCmdStreamTSNegotiate(pAd, Argc, pArgv);
|
|
break;
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
case ACM_CMD_UAPSD_SHOW: /* 14 wmm uapsd show */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> show UAPSD info\n"));
|
|
AcmCmdUapsdDisplay(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
case ACM_CMD_TSPEC_REJECT: /* 15 wmm tspec reject */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> reject all TSPEC\n"));
|
|
AcmCmdTspecReject(pAd, Argc, pArgv);
|
|
break;
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
case ACM_CMD_EDCA_TS_ADD_ADV: /* 16 wmm edca ts add advance */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> request a advanced TSPEC\n"));
|
|
AcmCmdStreamTSRequestAdvance(pAd, Argc, pArgv);
|
|
break;
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
case ACM_CMD_STATS: /* 17 wmm statistics */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> show statistics\n"));
|
|
AcmCmdStatistics(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
case ACM_CMD_REASSOCIATE: /* 18 wmm reassociate */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> send a reassociate frame\n"));
|
|
AcmCmdReAssociate(pAd, Argc, pArgv);
|
|
break;
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
case ACM_CMD_TSPEC_TIMEOUT_CTRL: /* 19 wmm tspec timeout */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> enable or disable TSPEC timeout\n"));
|
|
AcmCmdTspecTimeoutCtrl(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
case ACM_CMD_NO_TSPEC_UAPSD: /* 20 wmm tspec uapsd function */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> enable or disable TSPEC UAPSD\n"));
|
|
AcmCmdTspecUapsdCtrl(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_ASSOCIATE: /* 21 wmm associate */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> send a associate frame\n"));
|
|
AcmCmdAssociate(pAd, Argc, pArgv);
|
|
break;
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
#ifdef ACM_CC_FUNC_ACL
|
|
case ACM_CMD_ACL_ADD: /* 22 wmm acl add */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> add a ACL station entry\n"));
|
|
AcmCmdAclAdd(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_ACL_DEL: /* 23 wmm acl del */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> del a ACL station entry\n"));
|
|
AcmCmdAclDel(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_ACL_CTRL: /* 24 wmm acl control */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> control ACL function\n"));
|
|
AcmCmdAclCtrl(pAd, Argc, pArgv);
|
|
break;
|
|
#endif /* ACM_CC_FUNC_ACL */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
|
|
#ifdef IEEE80211E_SIMULATION
|
|
case ACM_CMD_SM_ASSOC: /* 50 wmm sim assoc */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> simulate STA auth/assoc\n"));
|
|
AcmCmdSimAssocBuild(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_REQ: /* 51 wmm sim req */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> simulate STA ADDTS req\n"));
|
|
AcmCmdSimReqRcv(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_DEL_FRM_QSTA: /* 52 wmm sim del */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> simulate STA DELTS\n"));
|
|
AcmCmdSimDel(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_DATRV: /* 53 wmm sim datrv */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> simulate DATA RCV\n"));
|
|
AcmCmdSimDataRv(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_DATTX: /* 54 wmm sim dattx */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> simulate DATA TX\n"));
|
|
AcmCmdSimDataTx(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_STP: /* 55 wmm sim stp */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> simulate DATA STOP\n"));
|
|
AcmCmdSimDataStop(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_SUS: /* 56 wmm sim sus */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> simulate DATA SUSPEND\n"));
|
|
AcmCmdSimDataSuspend(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_RES: /* 57 wmm sim res */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> simulate DATA RESUME\n"));
|
|
AcmCmdSimDataResume(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_REASSOC: /* 58 wmm sim reassoc */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> simulate STA reassoc\n"));
|
|
AcmCmdSimReAssocBuild(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_NASSOC: /* 59 wmm sim nassoc */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate STA non-WMM auth/assoc\n"));
|
|
AcmCmdSimNonQoSAssocBuild(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_NDATRV: /* 60 wmm sim ndatrv */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate non-WMM DATA RV\n"));
|
|
AcmCmdSimNonQoSDataRv(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_RATE: /* 61 wmm sim rate */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> reset TX rate for a STA\n"));
|
|
AcmCmdSimRateSet(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_TCP: /* 62 wmm sim tcp */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> enable/disable to tx simulated TCP PKT\n"));
|
|
AcmCmdSimTcpTxEnable(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_STA_MAC_SET: /* 63 wmm sim staset */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> reset simulated STA MAC\n"));
|
|
AcmCmdSimStaMacSet(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
#ifdef CONFIG_STA_SUPPORT
|
|
case ACM_CMD_SM_STA_ASSOC: /* 64 wmm sim sta auth/assoc */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate to send auth/assoc\n"));
|
|
AcmCmdSimStaAssoc(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_WME_REQTX: /* 65 wmm sim req */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate to send a ADDTS req/rsp\n"));
|
|
AcmCmdSimWmeReqTx(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_WME_NEQTX: /* 66 wmm sim neg */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate to re-send a ADDTS req/rsp\n"));
|
|
AcmCmdSimWmeNeqTx(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_WME_REQ_FAIL: /* 67 wmm sim req fail */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate to receive a failed ADDTS rsp\n"));
|
|
AcmCmdSimWmeReqFail(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_WME_NEG_FAIL: /* 68 wmm sim neg fail */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate to receive a failed neg ADDTS rsp\n"));
|
|
AcmCmdSimWmeNegFail(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_ACM_RESET: /* 69 wmm sim acm reset */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate to reset ACM flags\n"));
|
|
AcmCmdSimWmeAcmReset(pAd, Argc, pArgv);
|
|
break;
|
|
#endif /* CONFIG_STA_SUPPORT */
|
|
|
|
case ACM_CMD_SM_STA_PS: /* 70 wmm sim station enters PS */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate to receive a packet with PM=0/1\n"));
|
|
AcmCmdSimWmePSEnter(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_REQ_PS_POLL: /* 71 wmm ps poll rv */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate STA ADDTS req & Ps Poll\n"));
|
|
AcmCmdSimReqPsPollRcv(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_DEL_FRM_QAP: /* 72 wmm sim del */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> simulate AP DELTS\n"));
|
|
AcmCmdSimDel(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
case ACM_CMD_SM_TRI_FRM_RCV: /* 73 wmm sim trigger frame receive */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate AP RCV a trigger frame\n"));
|
|
AcmCmdSimRcvTriFrame(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_UAPSD_QUE_MAIN: /* 74 wmm sim uapsd queue maintain */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> simulate to enable/disable UAPSD queue maintain\n"));
|
|
AcmCmdSimUapsdQueCtrl(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
case ACM_CMD_SM_REQ_ADVANCE: /* 75 wmm sim req advance */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> simulate STA ADDTS req\n"));
|
|
AcmCmdSimReqAdvanceRcv(pAd, Argc, pArgv);
|
|
break;
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
#endif /* IEEE80211E_SIMULATION */
|
|
|
|
case ACM_TEST_FLAG: /* 90 wmm test flag */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE,
|
|
("acm_cmd> ON/OFF test flag\n"));
|
|
AcmCmdTestFlagCtrl(pAd, Argc, pArgv);
|
|
break;
|
|
|
|
default: /* error command type */
|
|
ACMR_DEBUG(ACMR_DEBUG_TRACE, ("acm_cmd> ERROR! No such command!\n"));
|
|
return -EINVAL; /* input error */
|
|
} /* End of switch */
|
|
|
|
return TRUE;
|
|
} /* End of ACM_Ioctl */
|
|
|
|
#endif /* WMM_ACM_SUPPORT */
|
|
|
|
/* End of acm_iocl.c */
|
|
|