Files
Linux_Drivers/osdrv/extdrv/wireless/mediatek/mt7603/common/ft_iocl.c
forum_service 213c880673 add driver of tp、wiegand-gpio and wireless
Change-Id: Ie3c11d9d85cf1a05042f5690ac711856fe8b1ad7
2023-12-22 09:56:05 +08:00

1603 lines
40 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 IEEE802.11r IOCTL function body.
***************************************************************************/
#ifdef DOT11R_FT_SUPPORT
#include "rt_config.h"
#define TYPE_FUNC
#define FT_FUNC_SIMULATION
#ifdef FT_FUNC_SIMULATION
#ifdef WMM_ACM_SUPPORT
#include "acm_extr.h"
#include "acm_comm.h"
#include "acm_edca.h"
#endif /* WMM_ACM_SUPPORT */
#endif /* FT_FUNC_SIMULATION */
/* ----- Private Variable ----- */
#ifdef FT_FUNC_SIMULATION
static UCHAR gFT_MAC_STA[ETH_ALEN] = { 0x00, 0x0e, 0x2e, 0x82, 0xe7, 0x6d };
UCHAR gFT_MAC_OldAP[ETH_ALEN] = { 0x00, 0x0e, 0x2e, 0x12, 0x34, 0x56 };
#ifdef CONFIG_STA_SUPPORT
#define FT_RIC_SIM_AP_MAX 10
static FT_RIC_STATUS gFT_RIC_RspStatus[FT_RIC_SIM_AP_MAX];
static UINT32 gFT_RIC_RspStatusIndex;
#endif /* CONFIG_STA_SUPPORT */
#ifdef WMM_ACM_SUPPORT
static ACM_ELM_WME_TSPEC gFT_RIC_Tspec[ACM_STA_TID_MAX_NUM];
static UINT32 gFT_RIC_TspecIndex;
#endif /* WMM_ACM_SUPPORT */
#endif /* FT_FUNC_SIMULATION */
/* ----- Extern Function ----- */
#ifdef CONFIG_AP_SUPPORT
extern BOOLEAN FT_KDP_R0KH_InfoAdd(
IN PRTMP_ADAPTER pAd,
IN UCHAR *pR0KHID,
IN UCHAR *pMAC,
IN UINT32 IP);
#ifdef WMM_ACM_SUPPORT
extern UCHAR AcmCmdInfoParse(
IN PRTMP_ADAPTER pAd,
IN CHAR **ppArgv,
IN ACM_TSPEC *pTspec,
IN ACM_TS_INFO *pInfo,
IN UCHAR *pStreamType);
#endif /* WMM_ACM_SUPPORT */
#endif /* CONFIG_AP_SUPPORT */
/* ----- Private Function ----- */
#define FT_CMD_INPUT_PARAM_DECLARATION \
PRTMP_ADAPTER pAd, INT32 Argc, CHAR *pArgv
#ifdef CONFIG_AP_SUPPORT
#ifndef FT_KDP_FUNC_SOCK_COMM
static VOID FT_KDP_CMD_EventList(FT_CMD_INPUT_PARAM_DECLARATION);
#endif /* FT_KDP_FUNC_SOCK_COMM */
static VOID FT_KDP_CMD_DbgFlagCtrl(FT_CMD_INPUT_PARAM_DECLARATION);
#ifdef FT_FUNC_SIMULATION
static VOID FT_KDP_CMD_SimEvtFtAssoc(FT_CMD_INPUT_PARAM_DECLARATION);
static VOID FT_KDP_CMD_SimEvtFtReAssoc(FT_CMD_INPUT_PARAM_DECLARATION);
static VOID FT_KDP_CMD_SimKeyReq(FT_CMD_INPUT_PARAM_DECLARATION);
#ifdef FT_KDP_FUNC_R0KH_IP_RECORD
static VOID FT_KDP_CMD_SimR0KH_InfoCreate(FT_CMD_INPUT_PARAM_DECLARATION);
#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */
static VOID FT_RIC_CMD_SimRscReqHdlTspec(FT_CMD_INPUT_PARAM_DECLARATION);
static VOID FT_RIC_CMD_SimRscReqHandle(FT_CMD_INPUT_PARAM_DECLARATION);
static VOID FT_RRB_CMD_SimSend(FT_CMD_INPUT_PARAM_DECLARATION);
static VOID FT_11K_CMD_SimInfoReq(FT_CMD_INPUT_PARAM_DECLARATION);
static VOID FT_11K_CMD_SimKeyShow(FT_CMD_INPUT_PARAM_DECLARATION);
#endif /* FT_FUNC_SIMULATION */
#endif /* CONFIG_AP_SUPPORT */
#ifdef CONFIG_STA_SUPPORT
#ifdef FT_FUNC_SIMULATION
static VOID FT_RIC_CMD_StatusDisplay(FT_RIC_STATUS *pRspStatus);
static VOID FT_RIC_CMD_SimRscReqStart(FT_CMD_INPUT_PARAM_DECLARATION);
static VOID FT_RIC_CMD_SimRscReq(FT_CMD_INPUT_PARAM_DECLARATION);
static VOID FT_RIC_CMD_SimRscReqEnd(FT_CMD_INPUT_PARAM_DECLARATION);
static VOID FT_RIC_CMD_SimRscReqRspList(FT_CMD_INPUT_PARAM_DECLARATION);
#endif /* FT_FUNC_SIMULATION */
#endif /* CONFIG_STA_SUPPORT */
static UINT32 FT_CMD_UtilHexGet(CHAR **ppArgv);
static UINT32 FT_CMD_UtilNumGet(CHAR **ppArgv);
static VOID FT_CMD_UtilMacGet(CHAR **ppArgv, UCHAR *pDevMac);
#ifdef CONFIG_AP_SUPPORT
void test11r(PRTMP_ADAPTER pAd)
{
FT_KDP_CMD_SimEvtFtAssoc(pAd, 0, NULL);
}
#endif /* CONFIG_AP_SUPPORT */
/*
========================================================================
Routine Description:
Get argument number value.
Arguments:
**ppArgv - input parameters
Return Value:
decimal number
Note:
========================================================================
*/
static UINT32 TYPE_FUNC FT_CMD_UtilHexGet(
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 */
FT_ARG_ATOH(buf, &Value);
return (UINT32)Value;
} /* End of FT_CMD_UtilHexGet */
/*
========================================================================
Routine Description:
Get argument number value.
Arguments:
*pArgv - input parameters
Return Value:
decimal number
Note:
========================================================================
*/
static UINT32 TYPE_FUNC FT_CMD_UtilNumGet(
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 FT_ARG_ATOI(buf);
} /* End of FT_CMD_UtilNumGet */
/*
========================================================================
Routine Description:
Get argument MAC value.
Arguments:
**ppArgv - input parameters
*pDevMac - MAC address
Return Value:
None
Note:
========================================================================
*/
static VOID TYPE_FUNC FT_CMD_UtilMacGet(
IN CHAR **ppArgv,
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 */
memset(pDevMac, 0, ETH_ALEN);
/* 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;
FT_ARG_ATOH(Buf, pDevMac);
pMAC += 3;
pDevMac ++;
} /* End of for */
*ppArgv += 17+1; /* skip _ */
} /* End of FT_CMD_UtilMacGet */
#ifdef CONFIG_AP_SUPPORT
#ifdef FT_KDP_FUNC_R0KH_IP_RECORD
/*
========================================================================
Routine Description:
Display all R0KH information.
Arguments:
pAd - WLAN control block pointer
*pArgv - input parameters
Return Value:
TRUE
Note:
========================================================================
*/
INT TYPE_FUNC FT_KDP_CMD_R0KH_InfoShow(RTMP_ADAPTER *pAd, RTMP_STRING *pArgv)
{
FT_KDP_R0KH_INFO *pInfo;
UINT32 IdInfo, IdArray;
RTMP_SEM_LOCK(&(pAd->ApCfg.FtTab.FT_KdpLock));
pInfo = FT_KDP_CB->R0KH_InfoHead;
IdInfo = 1;
while(pInfo != NULL)
{
DBGPRINT_RAW(RT_DEBUG_OFF, ("\n%03d. R0KHID = 0x", IdInfo));
for(IdArray=0; IdArray<sizeof(pInfo->R0KHID); IdArray++)
{
if (IdArray == (sizeof(pInfo->R0KHID)>>1))
DBGPRINT_RAW(RT_DEBUG_OFF, ("\n "));
/* End of if */
DBGPRINT_RAW(RT_DEBUG_OFF, (" %02x", pInfo->R0KHID[IdArray]));
} /* End of for */
DBGPRINT_RAW(RT_DEBUG_OFF,
("\n%03d. MAC = 0x%02x:%02x:%02x:%02x:%02x:%02x\n",
IdInfo, pInfo->MAC[0], pInfo->MAC[1], pInfo->MAC[2],
pInfo->MAC[3], pInfo->MAC[4], pInfo->MAC[5]));
DBGPRINT_RAW(RT_DEBUG_OFF,
("%03d. IP = %d.%d.%d.%d\n", IdInfo,
(pInfo->IP & 0x000000FF) >> 0,
(pInfo->IP & 0x0000FF00) >> 8,
(pInfo->IP & 0x00FF0000) >> 16,
(pInfo->IP & 0xFF000000) >> 24));
pInfo = pInfo->pNext;
IdInfo ++;
} /* End of while */
RTMP_SEM_UNLOCK(&(pAd->ApCfg.FtTab.FT_KdpLock));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\n"));
return TRUE;
} /* End of FT_KDP_CMD_R0KH_InfoShow */
#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */
#ifndef FT_KDP_FUNC_SOCK_COMM
/*
========================================================================
Routine Description:
List all queued events.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
========================================================================
*/
static VOID TYPE_FUNC FT_KDP_CMD_EventList(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
FT_KDP_SIGNAL *pFtKdp;
ULONG SplFlags;
pFtKdp = (FT_KDP_SIGNAL *)FT_KDP_CB->EventList.pHead;
if (pFtKdp == NULL)
{
DBGPRINT_RAW(RT_DEBUG_OFF, ("ft_kdp> No any event!\n"));
return;
} /* End of if */
DBGPRINT_RAW(RT_DEBUG_OFF, ("\nEvent\n"));
DBGPRINT_RAW(RT_DEBUG_OFF, ("----------------------------------------------------\n"));
RTMP_SEM_LOCK(&(pAd->ApCfg.FtTab.FT_KdpLock));
while(pFtKdp != NULL)
{
switch(pFtKdp->Sig)
{
case FT_KDP_SIG_KEY_TIMEOUT:
DBGPRINT_RAW(RT_DEBUG_OFF, ("KEY TIMEOUT\n"));
break;
case FT_KDP_SIG_KEY_REQ:
DBGPRINT_RAW(RT_DEBUG_OFF, ("KEY REQUEST\n"));
break;
case FT_KDP_SIG_FT_ASSOCIATION:
DBGPRINT_RAW(RT_DEBUG_OFF, ("STATION FT ASSOCIATION\n"));
break;
case FT_KDP_SIG_TERMINATE:
DBGPRINT_RAW(RT_DEBUG_OFF, ("TERMINATE\n"));
break;
default:
DBGPRINT_RAW(RT_DEBUG_OFF, ("UNKNOWN\n"));
break;
} /* End of switch */
pFtKdp = (FT_KDP_SIGNAL *)pFtKdp->pNext;
} /* End of while */
RTMP_SEM_UNLOCK(&(pAd->ApCfg.FtTab.FT_KdpLock));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\n"));
} /* End of FT_KDP_CMD_EventList */
#endif /* FT_KDP_FUNC_SOCK_COMM */
/*
========================================================================
Routine Description:
Change the debug flag of IAPP daemon.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
========================================================================
*/
static VOID FT_KDP_CMD_DbgFlagCtrl(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
INT32 DebugLevel;
DebugLevel = FT_CMD_UtilNumGet(&pArgv);
FT_KDP_EVENT_INFORM(pAd, BSS0, FT_KSP_SIG_DEBUG_TRACE,
&DebugLevel, sizeof(DebugLevel), NULL);
} /* End of FT_KDP_CMD_DbgFlagCtrl */
#ifdef FT_FUNC_SIMULATION
/*
========================================================================
Routine Description:
List all queued events.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
========================================================================
*/
static VOID TYPE_FUNC FT_KDP_CMD_SimEvtFtAssoc(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
FT_KDP_EVT_ASSOC EvtAssoc;
/* fill the station information */
EvtAssoc.SeqNum = 0x1234;
NdisMoveMemory(EvtAssoc.MacAddr, gFT_MAC_STA, MAC_ADDR_LEN);
/* inform other APs a station associated to us */
FT_KDP_EVENT_INFORM(pAd, BSS0, FT_KDP_SIG_FT_ASSOCIATION,
&EvtAssoc, sizeof(FT_KDP_EVT_ASSOC), NULL);
} /* End of FT_KDP_CMD_SimEvtFtAssoc */
/*
========================================================================
Routine Description:
List all queued events.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
========================================================================
*/
static VOID TYPE_FUNC FT_KDP_CMD_SimEvtFtReAssoc(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
FT_KDP_EVT_REASSOC EvtReAssoc;
/* fill the station information */
EvtReAssoc.SeqNum = 0x1234;
NdisMoveMemory(EvtReAssoc.MacAddr, gFT_MAC_STA, MAC_ADDR_LEN);
NdisMoveMemory(EvtReAssoc.OldApMacAddr, gFT_MAC_OldAP, MAC_ADDR_LEN);
/* inform other APs a station associated to us */
FT_KDP_EVENT_INFORM(pAd, BSS0, FT_KDP_SIG_FT_REASSOCIATION,
&EvtReAssoc, sizeof(FT_KDP_EVT_REASSOC), NULL);
} /* End of FT_KDP_CMD_SimEvtFtReAssoc */
/*
========================================================================
Routine Description:
Request PMK-R1 Key from R0KH.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
1. Command Format:
[R0KHID 1st byte (HEX)] [R1KHID 1st byte (HEX)]
========================================================================
*/
static VOID TYPE_FUNC FT_KDP_CMD_SimKeyReq(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
FT_KDP_EVT_KEY_ELM EvtKeyReq, *pEvtKeyReq;
UCHAR R0KHID_Byte, R1KHID_Byte;
/* init */
memset(&EvtKeyReq, 0, sizeof(FT_KDP_EVT_KEY_ELM));
pEvtKeyReq = &EvtKeyReq;
/* fill request content */
pEvtKeyReq->ElmId = FT_KDP_ELM_ID_PRI;
pEvtKeyReq->ElmLen = FT_KDP_ELM_PRI_LEN;
pEvtKeyReq->OUI[0] = FT_KDP_ELM_PRI_OUI_0;
pEvtKeyReq->OUI[1] = FT_KDP_ELM_PRI_OUI_1;
pEvtKeyReq->OUI[2] = FT_KDP_ELM_PRI_OUI_2;
memcpy(pEvtKeyReq->MacAddr, gFT_MAC_STA, ETH_ALEN);
R0KHID_Byte = FT_CMD_UtilHexGet(&pArgv);
memset(pEvtKeyReq->KeyInfo.R0KHID, R0KHID_Byte, FT_KDP_R0KHID_MAX_SIZE);
R1KHID_Byte = FT_CMD_UtilHexGet(&pArgv);
memset(pEvtKeyReq->KeyInfo.R1KHID, R1KHID_Byte, FT_KDP_R1KHID_MAX_SIZE);
memcpy(pEvtKeyReq->KeyInfo.S1KHID, gFT_MAC_STA, FT_KDP_S1KHID_MAX_SIZE);
memset(pEvtKeyReq->KeyInfo.RSV, 0x00, sizeof(pEvtKeyReq->KeyInfo.RSV));
/* request PMK-R1 Key (our R1KH vs. the station) from the R0KH */
FT_KDP_EVENT_INFORM(pAd, BSS0, FT_KDP_SIG_KEY_REQ,
pEvtKeyReq, sizeof(FT_KDP_EVT_KEY_ELM), NULL);
} /* End of FT_KDP_CMD_SimKeyReq */
#ifdef FT_KDP_FUNC_R0KH_IP_RECORD
/*
========================================================================
Routine Description:
Create a R0KH information.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
1. Command Format:
[R0KHID 1st byte (HEX)] [IP1] [IP2] [IP3] [IP4]
========================================================================
*/
static VOID TYPE_FUNC FT_KDP_CMD_SimR0KH_InfoCreate(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
UCHAR R0KHID[FT_KDP_R0KHID_MAX_SIZE];
UCHAR MAC[ETH_ALEN];
UCHAR ByteFirst;
UCHAR IP[4];
ByteFirst = FT_CMD_UtilHexGet(&pArgv);
IP[0] = FT_CMD_UtilNumGet(&pArgv);
IP[1] = FT_CMD_UtilNumGet(&pArgv);
IP[2] = FT_CMD_UtilNumGet(&pArgv);
IP[3] = FT_CMD_UtilNumGet(&pArgv);
memset(R0KHID, ByteFirst, sizeof(R0KHID));
memset(MAC, ByteFirst, sizeof(MAC));
MAC[0] = 0x00;
FT_KDP_R0KH_InfoAdd(pAd, R0KHID, MAC, *(UINT32 *)IP);
} /* End of FT_KDP_CMD_SimR0KH_InfoCreate */
#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */
/*
========================================================================
Routine Description:
Simulate to make a resource request.
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] [ack:0~1]
[nom size:byte] [inact:sec] [mean data rate:bps] [min phy rate:bps]
[surp factor:>=1] [tclas processing:0~1]
2. 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 FT_RIC_CMD_SimRscReqHdlTspec(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
#ifdef WMM_ACM_SUPPORT
ACM_TSPEC Tspec, *pTspec;
ACM_TS_INFO *pInfo;
UCHAR StreamType, TclasProcessing;
/* sanity check */
if (gFT_RIC_TspecIndex >= ACM_STA_TID_MAX_NUM)
{
DBGPRINT_RAW(RT_DEBUG_OFF,
("ft_rc> reach max limit! can not add new one!\n"));
return;
} /* End of if */
/* init */
pTspec = &Tspec;
pInfo = &Tspec.TsInfo;
/* parse input command */
if (AcmCmdInfoParse(
pAd,
&pArgv,
pTspec,
pInfo,
&StreamType) != 0)
{
return;
} /* End of if */
/* transmit a WME request frame */
TclasProcessing = FT_CMD_UtilNumGet(&pArgv);
/* backup the TSPEC */
ACMP_WME_TSPEC_ElementFill(\
pAd, (UCHAR *)&gFT_RIC_Tspec[gFT_RIC_TspecIndex], pTspec);
gFT_RIC_TspecIndex ++;
#endif /* WMM_ACM_SUPPORT */
} /* End of FT_RIC_CMD_SimRscReqHdlTspec */
/*
========================================================================
Routine Description:
Simulate to handle resource requests.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
Test example:
iwpriv ra0 set acm=50
iwpriv ra0 set acm=10_0_0_1_1
1. OK case
iwpriv ra0 set ft=512_1_7_0_1_7_0_500_3000_200000_11000000_10_0
iwpriv ra0 set ft=512_1_6_1_1_6_0_500_3000_200000_11000000_10_0
iwpriv ra0 set ft=512_1_5_0_1_5_0_500_3000_200000_11000000_10_0
iwpriv ra0 set ft=512_1_4_1_1_4_0_500_3000_200000_11000000_10_0
2. Fail case
iwpriv ra0 set ft=512_1_7_0_1_7_0_500_3000_200000_11000000_10_0
iwpriv ra0 set ft=512_1_5_0_1_5_0_500_3000_200000_11000000_10_0
iwpriv ra0 set ft=512_1_6_1_1_6_0_500_3000_11000000_11000000_10_0
iwpriv ra0 set ft=512_1_4_1_1_4_0_500_3000_11000000_11000000_10_0
iwpriv ra0 set ft=510
========================================================================
*/
static VOID TYPE_FUNC FT_RIC_CMD_SimRscReqHandle(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
#ifdef WMM_ACM_SUPPORT
MAC_TABLE_ENTRY *pCdb;
FT_ELM_RIC_DATA_INFO ElmDataInfo, *pElmDataInfo;
ACM_ELM_WME_TSPEC *pWmeTspec;
UCHAR *pFrameReq, *pFrameElm;
UCHAR *pFrameRsp;
UINT32 IdRsc, ReqLen, RspLen;
pCdb = MacTableLookup(pAd, gFT_MAC_STA);
if (pCdb == NULL)
{
DBGPRINT_RAW(RT_DEBUG_OFF,
("ft_rc> can not find the station entry!\n"));
return;
}
DBGPRINT_RAW(RT_DEBUG_OFF,
("ft_rc> number of TSPEC = %d\n", gFT_RIC_TspecIndex));
os_alloc_mem(pAd, (UCHAR **)&pFrameReq, 1000);
if (pFrameReq == NULL)
return;
os_alloc_mem(pAd, (UCHAR **)&pFrameRsp, 1000);
if (pFrameRsp == NULL)
{
os_free_mem(NULL, pFrameReq);
return;
}
pFrameElm = pFrameReq;
pElmDataInfo = &ElmDataInfo;
ReqLen = 0;
RspLen = 0;
pElmDataInfo->ElmID = FT_ELM_ID_RIC_DATA_INFO;
pElmDataInfo->ElmLen = FT_ELM_LEN_RIC_DATA_INFO;
pElmDataInfo->RD_Count = 1;
pElmDataInfo->StatusCode = 0;
/* make up vitual resource request */
for(IdRsc=0; IdRsc<gFT_RIC_TspecIndex; IdRsc++)
{
pElmDataInfo->RDIE_Identifier = (UCHAR)IdRsc;
memcpy(pFrameElm, pElmDataInfo, sizeof(FT_ELM_RIC_DATA_INFO));
pFrameElm += sizeof(FT_ELM_RIC_DATA_INFO);
memcpy(pFrameElm, &gFT_RIC_Tspec[IdRsc], sizeof(ACM_ELM_WME_TSPEC));
pFrameElm += sizeof(ACM_ELM_WME_TSPEC);
ReqLen += sizeof(FT_ELM_RIC_DATA_INFO) + sizeof(ACM_ELM_WME_TSPEC);
}
/* handle the request */
if (FT_RIC_ResourceRequestHandle(\
pAd, pCdb, pFrameReq, ReqLen, pFrameRsp, &RspLen) <= 0)
{
DBGPRINT_RAW(RT_DEBUG_OFF,
("ft_rc> handle the resource request fail!\n"));
}
/* display response */
DBGPRINT_RAW(RT_DEBUG_OFF,
("ft_rc> request length = %d, response length = %d!\n\n",
ReqLen, RspLen));
pFrameElm = pFrameRsp;
for(IdRsc=0; IdRsc<gFT_RIC_TspecIndex; IdRsc++)
{
pElmDataInfo = (FT_ELM_RIC_DATA_INFO *)pFrameElm;
if ((pElmDataInfo->ElmID != FT_ELM_ID_RIC_DATA_INFO) &&
(pElmDataInfo->ElmLen != FT_ELM_LEN_RIC_DATA_INFO))
{
DBGPRINT_RAW(RT_DEBUG_OFF,
("ft_rc> Wrong resource data element ID!\n"));
break;
}
DBGPRINT_RAW(RT_DEBUG_OFF,
("\tRIC%d: Identifier(%d), Count(%d), Status(%d) ",
IdRsc,
pElmDataInfo->RDIE_Identifier,
pElmDataInfo->RD_Count,
pElmDataInfo->StatusCode));
pFrameElm += sizeof(FT_ELM_RIC_DATA_INFO);
if (pElmDataInfo->StatusCode == 0)
{
/* success */
pWmeTspec = (ACM_ELM_WME_TSPEC *)pFrameElm;
pFrameElm += sizeof(ACM_ELM_WME_TSPEC);
/* Note: for dnlink TSPEC, response medium time will always be 0 */
DBGPRINT_RAW(RT_DEBUG_OFF, ("Medium Time(%d)",
pWmeTspec->Tspec.MediumTime*32));
}
DBGPRINT_RAW(RT_DEBUG_OFF, ("\n"));
}
gFT_RIC_TspecIndex = 0;
os_free_mem(NULL, pFrameReq);
os_free_mem(NULL, pFrameRsp);
#endif /* WMM_ACM_SUPPORT */
}
/*
========================================================================
Routine Description:
Simulate to send a RRB frame.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
1. Command Format:
[0(REQ)/1(RSP)] [PeerMAC]
========================================================================
*/
static VOID TYPE_FUNC FT_RRB_CMD_SimSend(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
FT_KDP_EVT_ACTION ActionCB, *pActionCB;
UCHAR MacPeer[6];
pActionCB = &ActionCB;
pActionCB->RequestType = FT_CMD_UtilNumGet(&pArgv);
FT_CMD_UtilMacGet(&pArgv, MacPeer);
memcpy(pActionCB->MacDa, MacPeer, ETH_ALEN);
memset(pActionCB->MacSa, 0x22, ETH_ALEN);
memset(pActionCB->MacAp, 0x33, ETH_ALEN);
pActionCB->MacDa[0] = 0x00;
pActionCB->MacSa[0] = 0x00;
pActionCB->MacAp[0] = 0x00;
FT_KDP_EventInform(pAd, BSS0, FT_KDP_SIG_ACTION,
"testtesttesttesttest", 19, 0, (VOID *)pActionCB);
} /* End of FT_RRB_CMD_SimSend */
/*
========================================================================
Routine Description:
Simulate to send a 11k neighbor request.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
1. Command Format:
PeerSSID
========================================================================
*/
static VOID TYPE_FUNC FT_11K_CMD_SimInfoReq(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
if (strlen((RTMP_STRING *) pArgv) <= MAX_LEN_OF_SSID)
{
FT_KDP_EVENT_INFORM(pAd, BSS0, FT_KDP_SIG_AP_INFO_REQ,
pArgv, strlen((RTMP_STRING *) pArgv), NULL);
} /* End of if */
} /* End of FT_11K_CMD_SimInfoReq */
/*
========================================================================
Routine Description:
Show encryption/decryption key information.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
========================================================================
*/
static VOID TYPE_FUNC FT_11K_CMD_SimKeyShow(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
hex_dump("Key=", FT_KDP_CB->CryptKey, sizeof(FT_KDP_CB->CryptKey));
} /* End of FT_11K_CMD_SimInfoReq */
#endif /* FT_FUNC_SIMULATION */
/*
========================================================================
Routine Description:
Display a R0KH information.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
========================================================================
*/
static VOID TYPE_FUNC FT_R1KH_InfoShow(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
INT i;
INT HashIdx;
PFT_R1HK_ENTRY pEntry;
RTMP_SEM_LOCK(&pAd->ApCfg.FtTab.FT_R1khEntryTabLock);
for (HashIdx = 0; HashIdx < FT_R1KH_ENTRY_HASH_TABLE_SIZE; HashIdx++)
{
pEntry = (PFT_R1HK_ENTRY)\
(pAd->ApCfg.FtTab.FT_R1khEntryTab[HashIdx].pHead);
while (pEntry != NULL)
{
DBGPRINT_RAW(RT_DEBUG_OFF, ("StaMac=%02x:%02x:%02x:%02x:%02x:%02x, ",
pEntry->StaMac[0], pEntry->StaMac[1], pEntry->StaMac[2],
pEntry->StaMac[3], pEntry->StaMac[4], pEntry->StaMac[5]));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\nKeyLifeTime=%d, ", pEntry->KeyLifeTime));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\nRassocDeadline=%d\n",
pEntry->RassocDeadline));
DBGPRINT_RAW(RT_DEBUG_OFF, ("PairwisChipher="));
for (i=0; i<4; i++)
DBGPRINT_RAW(RT_DEBUG_OFF, ("%02x:", pEntry->PairwisChipher[i]));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\nAkmSuite="));
for (i=0; i<4; i++)
DBGPRINT_RAW(RT_DEBUG_OFF, ("%02x:", pEntry->AkmSuite[i]));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\nPmkR0Name="));
for (i=0; i<16; i++)
DBGPRINT_RAW(RT_DEBUG_OFF, ("%02x:", pEntry->PmkR0Name[i]));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\nPmkR1Key="));
for (i=0; i<32; i++)
DBGPRINT_RAW(RT_DEBUG_OFF, ("%02x:", pEntry->PmkR1Key[i]));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\nPmkR1Name="));
for (i=0; i<16; i++)
DBGPRINT_RAW(RT_DEBUG_OFF, ("%02x:", pEntry->PmkR1Name[i]));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\n"));
pEntry = pEntry->pNext;
}
}
RTMP_SEM_UNLOCK(&pAd->ApCfg.FtTab.FT_R1khEntryTabLock);
} /* End of FT_R1KH_InfoShow */
static PMAC_TABLE_ENTRY FtEntry = NULL;
static VOID FT_OverDs_SimReq(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
PUCHAR pOutBuffer = NULL;
ULONG FrameLen;
HEADER_802_11 Hdr;
FT_INFO FtInfoBuf;
NDIS_STATUS NStatus;
UCHAR StaAddr[MAC_ADDR_LEN] = {0x00,0x0c,0x43,0x00,0x00,0x00};
UCHAR TargetAddr[MAC_ADDR_LEN] = {0x00,0x0c,0x43,0x28,0x60,0x10};
if (FtEntry == NULL)
{
FtEntry = MacTableInsertEntry(pAd, StaAddr, wdev, ENTRY_CLIENT, OPMODE_AP, TRUE);
FtEntry->Sst = SST_ASSOC;
}
NdisZeroMemory(&FtInfoBuf, sizeof(FT_INFO));
NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);
if (NStatus != NDIS_STATUS_SUCCESS)
{
DBGPRINT(RT_DEBUG_ERROR,("%s: allocate memory failed.\n",
__FUNCTION__));
return;
}
/* Make 802.11 header. */
ActHeaderInit(pAd, &Hdr, pAd->ApCfg.MBSSID[FtEntry->apidx].Bssid,
FtEntry->Addr, pAd->ApCfg.MBSSID[FtEntry->apidx].Bssid);
FrameLen = 0;
MakeOutgoingFrame(pOutBuffer, &FrameLen,
sizeof(HEADER_802_11), &Hdr,
END_OF_ARGS);
FtInfoBuf.MdIeInfo.Len = 3;
FT_SET_MDID(FtInfoBuf.MdIeInfo.MdId, FT_DEFAULT_MDID);
FtInfoBuf.MdIeInfo.FtCapPlc.field.FtOverDs = 1;
FtInfoBuf.MdIeInfo.FtCapPlc.field.RsrReqCap = 1;
FT_MakeFtActFrame(pAd, pOutBuffer, &FrameLen,
FT_ACTION_BT_REQ, FtEntry->Addr, TargetAddr, 0,
&FtInfoBuf);
/* enqueue it into FT action state machine. */
REPORT_MGMT_FRAME_TO_MLME(pAd, FtEntry->Aid, pOutBuffer, FrameLen, 0, 0, 0, 0,0);
if (pOutBuffer)
os_free_mem(pAd, pOutBuffer);
}
static VOID FT_OverDs_SimConfirm(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
}
#endif /* CONFIG_AP_SUPPORT */
#ifdef CONFIG_STA_SUPPORT
#ifdef FT_FUNC_SIMULATION
/*
========================================================================
Routine Description:
Display the reponse status for a resource request.
Arguments:
*pRspStatus - the status
Return Value:
None
Note:
========================================================================
*/
static VOID TYPE_FUNC FT_RIC_CMD_StatusDisplay(FT_RIC_STATUS *pRspStatus)
{
DBGPRINT_RAW(RT_DEBUG_OFF,
("\nAP MAC = %02x:%02x:%02x:%02x:%02x:%02x\n",
pRspStatus->AP_MAC[0], pRspStatus->AP_MAC[1],
pRspStatus->AP_MAC[2], pRspStatus->AP_MAC[3],
pRspStatus->AP_MAC[4], pRspStatus->AP_MAC[5]));
if (pRspStatus->FlgHasBaResource == TRUE)
{
if (pRspStatus->FlgIsBaAccepted == TRUE)
{
DBGPRINT_RAW(RT_DEBUG_OFF, ("\tBA Resource is accepted.\n"));
}
else
{
DBGPRINT_RAW(RT_DEBUG_OFF, ("\tBA Resource is not accepted.\n"));
} /* End of if */
} /* End of if */
if (pRspStatus->TspecNumberOfRequested > 0)
{
DBGPRINT_RAW(RT_DEBUG_OFF, ("\tNumber of requested TSPEC: %d\n",
pRspStatus->TspecNumberOfRequested));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\tNumber of accepted TSPEC: %d\n",
pRspStatus->TspecNumberOfAccepted));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\tTotal requested Time: %d us\n",
pRspStatus->TspecMediumTimeTotalCur));
DBGPRINT_RAW(RT_DEBUG_OFF, ("\tTotal accepted Time: %d us\n",
pRspStatus->TspecMediumTimeTotalNew));
} /* End of if */
if (pRspStatus->UnknownRDIE > 0)
{
DBGPRINT_RAW(RT_DEBUG_OFF, ("\tNumber of unknown RDIE: %d\n",
pRspStatus->UnknownRDIE));
} /* End of if */
} /* End of FT_RIC_CMD_StatusDisplay */
/*
========================================================================
Routine Description:
Simulate to start our resource request to the target AP.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
Need to build any TSPEC before.
EX: Build a simulated TSPEC.
iwpriv ra0 set acm=69_0_0_1_1
iwpriv ra0 set acm=65_1_7_0_1_7_0_500_3000_200000_11000000_10_0
iwpriv ra0 set acm=65_1_6_1_1_6_0_500_3000_200000_11000000_10_0
iwpriv ra0 set acm=65_1_5_0_1_5_0_500_3000_200000_11000000_10_0
iwpriv ra0 set acm=65_1_4_1_1_4_0_500_3000_200000_11000000_10_0
iwpriv ra0 set acm=06_1_0
iwpriv ra0 set ft=506
iwpriv ra0 set ft=507_00:11:11:11:11:11_1_0_0_1
iwpriv ra0 set ft=507_00:22:22:22:22:22_0_0_1_1
iwpriv ra0 set ft=507_00:33:33:33:33:33_1_1_1_0
iwpriv ra0 set ft=508_00:22:22:22:22:22
iwpriv ra0 set ft=509
========================================================================
*/
static VOID TYPE_FUNC FT_RIC_CMD_SimRscReqStart(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
FT_RIC_ResourceRequestStart(pAd);
gFT_RIC_RspStatusIndex = 0;
} /* End of FT_RIC_CMD_SimRscReqStart */
/*
========================================================================
Routine Description:
Simulate to send our resource request to the target AP.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
Command: [AP MAC] [Status for TSPEC 1] [Status for TSPEC 2]
[Status for TSPEC 3] [Status for TSPEC 4] [Status for TSPEC 5]
[Status for TSPEC 6] [Status for TSPEC 7] [Status for TSPEC 8]
========================================================================
*/
static VOID TYPE_FUNC FT_RIC_CMD_SimRscReq(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
FT_ELM_RIC_DATA_INFO *pElmDataInfoRsp;
UCHAR *pFrame, *pFrameRDIE, *pFrameNextRDIE, *pFrameRSC;
UINT32 FilledLen, RdieLen, RscLen, RspLen = 0;
UCHAR MacPeer[6];
BOOLEAN RspStatus[8];
UINT32 IdStatus, RDIE_Index;
/* sanity check */
if (gFT_RIC_RspStatusIndex >= FT_RIC_SIM_AP_MAX)
return;
/* End of if */
/* get AP mac address */
FT_CMD_UtilMacGet(&pArgv, MacPeer);
if (*(UINT32 *)MacPeer == 0)
memcpy(MacPeer, gFT_MAC_OldAP, 6);
/* End of if */
memset(RspStatus, 0, sizeof(RspStatus));
for(IdStatus=0; IdStatus<(Argc-1); IdStatus++)
RspStatus[IdStatus] = FT_CMD_UtilNumGet(&pArgv);
/* End of for */
/* init */
os_alloc_mem(pAd, (UCHAR **)&pFrame, 1000);
if (pFrame == NULL)
return;
memset(pFrame, 0, 1000);
RspLen = 0;
/* simulate to request */
FilledLen = FT_RIC_ResourceRequest(pAd, MacPeer, pFrame, 1000);
/* modify response status */
if (Argc > 1)
{
RDIE_Index = 0;
RspLen = 0;
pFrameRDIE = pFrame;
while(FilledLen > 0)
{
/* update RDIE status */
pElmDataInfoRsp = (FT_ELM_RIC_DATA_INFO *)pFrameRDIE;
pElmDataInfoRsp->StatusCode = RspStatus[RDIE_Index];
RdieLen = FT_ELM_HDR_LEN + *(pFrameRDIE+1);
pFrameRSC = pFrameRDIE + RdieLen;
RscLen = FT_ELM_HDR_LEN + *(pFrameRSC+1);
RspLen += RdieLen;
FilledLen -= (RdieLen + RscLen);
/* update resource element */
if (pElmDataInfoRsp->StatusCode != 0)
{
/* delete the following resource TSPEC */
pElmDataInfoRsp->RD_Count = 0;
pFrameNextRDIE = pFrameRSC + RscLen;
memcpy(pFrameRSC, pFrameNextRDIE, FilledLen);
pFrameRDIE += (RdieLen);
}
else
{
RspLen += RscLen;
pFrameRDIE += (RdieLen + RscLen);
} /* End of if */
/* check next RDIE pair */
RDIE_Index ++;
} /* End of while */
} /* End of if */
/* simulate to response (Medium Time will be 0) */
FT_RIC_ResourceResponseHandle(pAd, MacPeer, pFrame, RspLen,
&gFT_RIC_RspStatus[gFT_RIC_RspStatusIndex]);
/* display status */
FT_RIC_CMD_StatusDisplay(&gFT_RIC_RspStatus[gFT_RIC_RspStatusIndex]);
os_free_mem(NULL, pFrame);
gFT_RIC_RspStatusIndex++;
} /* End of FT_RIC_CMD_SimRscReq */
/*
========================================================================
Routine Description:
Simulate to end our resource request to the target AP.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
Command: [Selected AP MAC]
========================================================================
*/
static VOID TYPE_FUNC FT_RIC_CMD_SimRscReqEnd(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
UCHAR MacPeer[6];
/* get selected AP mac address */
FT_CMD_UtilMacGet(&pArgv, MacPeer);
if (*(UINT32 *)MacPeer == 0)
memcpy(MacPeer, gFT_MAC_OldAP, 6);
/* End of if */
/* end resource request mechanism */
FT_RIC_ResourceRequestEnd(pAd, MacPeer);
} /* End of FT_RIC_CMD_SimRscReqEnd */
/*
========================================================================
Routine Description:
Simulate to list our resource request response from all APs.
Arguments:
pAd - WLAN control block pointer
Argc - the number of input parameters
*pArgv - input parameters
Return Value:
None
Note:
========================================================================
*/
static VOID TYPE_FUNC FT_RIC_CMD_SimRscReqRspList(
IN PRTMP_ADAPTER pAd,
IN INT32 Argc,
IN CHAR *pArgv)
{
UINT32 IdRsc;
for(IdRsc=0; IdRsc<gFT_RIC_RspStatusIndex; IdRsc++)
{
FT_RIC_CMD_StatusDisplay(&gFT_RIC_RspStatus[IdRsc]);
DBGPRINT_RAW(RT_DEBUG_OFF, ("\n"));
} /* End of for */
} /* End of FT_RIC_CMD_SimRscReqRspList */
#endif /* FT_FUNC_SIMULATION */
#endif /* CONFIG_STA_SUPPORT */
#define FT_KDP_CMD_DAEMON_KILL 0
#define FT_KDP_CMD_EVENT_LIST 1
#define FT_KDP_CMD_DEBUG_FLAG_CTRL 2
#define FT_KDP_CMD_SM_EVT_FT_ASSOC 500
#define FT_KDP_CMD_SM_EVT_FT_REASSOC 501
#define FT_KDP_CMD_SM_EVT_KEY_REQ 502
#define FT_KDP_CMD_SM_R0KH_INFO_SHOW 503
#define FT_KDP_CMD_SM_R0KH_INFO_CREATE 504
#define FT_R1KH_INFO_SHOW 505
#define FT_RIC_CMD_SM_REQ_START 506
#define FT_RIC_CMD_SM_REQ 507
#define FT_RIC_CMD_SM_REQ_END 508
#define FT_RIC_CMD_SM_REQ_RSP_LIST 509
#define FT_RIC_CMD_SM_REQ_HANDLE 510
#define FT_RIC_CMD_SM_RRB_SEND 511
#define FT_RIC_CMD_SM_REQ_HDL_TSPEC 512
#define FT_11K_CMD_INFO_REQ 513
#define FT_KDP_KEY_SHOW 514
#define FT_REQ_ACT 600
#define FT_CONFIRM_ACT 601
#define FT_ROAMING_ACT 602
/*
========================================================================
Routine Description:
IO control handler for IEEE802.11r.
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 ft=[cmd id]_[arg1]_[arg2]_......_[argn]
[cmd id] = xx, such as 000, 001, 002, 003, ...
========================================================================
*/
INT TYPE_FUNC FT_Ioctl(RTMP_ADAPTER *pAd, RTMP_STRING *pArgvIn)
{
CHAR BufCmd[4] = { 0, 0, 0, 0 };
CHAR *pArgv, *pParam;
UINT32 Command, CmdEndOffset, IdCmd;
INT32 Argc;
/* init */
pArgv = (CHAR *)pArgvIn;
/* get command type */
/* command format is iwpriv ra0 set acm=[cmd id]_[arg1]_......_[argn] */
for(IdCmd=0; IdCmd<=3; IdCmd++)
{
if ((pArgv[IdCmd] == 0x00) || (pArgv[IdCmd] == '_'))
{
CmdEndOffset = IdCmd;
break;
} /* End of if */
} /* End of for */
memcpy(BufCmd, pArgv, IdCmd);
Command = FT_ARG_ATOI(BufCmd);
pArgv += IdCmd; /* 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 */
/* handle the command */
switch(Command)
{
#ifdef CONFIG_AP_SUPPORT
/* normal commands */
case FT_KDP_CMD_DAEMON_KILL:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> kill daemon!\n"));
FT_KDP_EventInform(pAd, BSS0, FT_KDP_SIG_TERMINATE, NULL, 0, 0, NULL);
break;
#ifndef FT_KDP_FUNC_SOCK_COMM
case FT_KDP_CMD_EVENT_LIST:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> event list!\n"));
FT_KDP_CMD_EventList(pAd, Argc, pArgv);
break;
#endif /* FT_KDP_FUNC_SOCK_COMM */
case FT_KDP_CMD_DEBUG_FLAG_CTRL:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> IAPP daemon debug flag control!\n"));
FT_KDP_CMD_DbgFlagCtrl(pAd, Argc, pArgv);
break;
#ifdef FT_FUNC_SIMULATION
/* simulation commands */
case FT_KDP_CMD_SM_EVT_FT_ASSOC:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) ft assoc!\n"));
FT_KDP_CMD_SimEvtFtAssoc(pAd, Argc, pArgv);
break;
case FT_KDP_CMD_SM_EVT_FT_REASSOC:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) ft reassoc!\n"));
FT_KDP_CMD_SimEvtFtReAssoc(pAd, Argc, pArgv);
break;
case FT_KDP_CMD_SM_EVT_KEY_REQ:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) key req!\n"));
FT_KDP_CMD_SimKeyReq(pAd, Argc, pArgv);
break;
#ifdef FT_KDP_FUNC_R0KH_IP_RECORD
case FT_KDP_CMD_SM_R0KH_INFO_CREATE:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) R0KH INFO create!\n"));
FT_KDP_CMD_SimR0KH_InfoCreate(pAd, Argc, pArgv);
break;
#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */
case FT_RIC_CMD_SM_REQ_HANDLE:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) handle a resource request!\n"));
FT_RIC_CMD_SimRscReqHandle(pAd, Argc, pArgv);
break;
case FT_RIC_CMD_SM_REQ_HDL_TSPEC:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) make a resource request TSPEC!\n"));
FT_RIC_CMD_SimRscReqHdlTspec(pAd, Argc, pArgv);
break;
case FT_RIC_CMD_SM_RRB_SEND:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) send a RRB frame!\n"));
FT_RRB_CMD_SimSend(pAd, Argc, pArgv);
break;
case FT_11K_CMD_INFO_REQ:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) send a info request frame!\n"));
FT_11K_CMD_SimInfoReq(pAd, Argc, pArgv);
break;
case FT_KDP_KEY_SHOW:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) show key information!\n"));
FT_11K_CMD_SimKeyShow(pAd, Argc, pArgv);
break;
#endif /* FT_FUNC_SIMULATION */
#ifdef FT_KDP_FUNC_R0KH_IP_RECORD
case FT_KDP_CMD_SM_R0KH_INFO_SHOW:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) R0KH INFO show!\n"));
FT_KDP_CMD_R0KH_InfoShow(pAd, (RTMP_STRING *)pArgv);
break;
#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */
case FT_R1KH_INFO_SHOW:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) R1KH INFO show!\n"));
FT_R1KH_InfoShow(pAd, Argc, pArgv);
break;
case FT_REQ_ACT:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> FT_REQ_ACT!\n"));
FT_OverDs_SimReq(pAd, Argc, pArgv);
break;
case FT_CONFIRM_ACT:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> FT_CONFIRM_ACT!\n"));
FT_OverDs_SimConfirm(pAd, Argc, pArgv);
break;
#endif /* CONFIG_AP_SUPPORT */
#ifdef CONFIG_STA_SUPPORT
#ifdef FT_FUNC_SIMULATION
case FT_RIC_CMD_SM_REQ_START:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) Resource Request Start!\n"));
FT_RIC_CMD_SimRscReqStart(pAd, Argc, pArgv);
break;
case FT_RIC_CMD_SM_REQ:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) Resource Request!\n"));
FT_RIC_CMD_SimRscReq(pAd, Argc, pArgv);
break;
case FT_RIC_CMD_SM_REQ_END:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) Resource Request End!\n"));
FT_RIC_CMD_SimRscReqEnd(pAd, Argc, pArgv);
break;
case FT_RIC_CMD_SM_REQ_RSP_LIST:
DBGPRINT(RT_DEBUG_TRACE, ("ft_iocl> (sm) Resource Req/Rsp List!\n"));
FT_RIC_CMD_SimRscReqRspList(pAd, Argc, pArgv);
break;
case FT_ROAMING_ACT:
{
PBSS_TABLE pRoamTab = &pAd->MlmeAux.RoamTab;
UCHAR TargetAp[MAC_ADDR_LEN] = {0x00, 0x0c, 0x43, \
0x28, 0x60, 0x10};
ULONG Idx;
BssTableInit(pRoamTab);
Idx = BssTableSearch(&pAd->ScanTab, TargetAp,
pAd->CommonCfg.Channel);
if (BSS_NOT_FOUND != Idx)
{
NdisMoveMemory(&pRoamTab->BssEntry[pRoamTab->BssNr],
&pAd->ScanTab.BssEntry[Idx], sizeof(BSS_ENTRY));
pRoamTab->BssNr++;
}
else
DBGPRINT(RT_DEBUG_ERROR,
("Unkonw BssEntry (%ld):%02x:%02x:%02x:%02x:%02x:%02x\n",
Idx, TargetAp[0], TargetAp[1], TargetAp[2],
TargetAp[3], TargetAp[4], TargetAp[5]));
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_MLME_ROAMING_REQ, 0, NULL, 0);
RTMP_MLME_HANDLER(pAd);
}
break;
#endif /* FT_FUNC_SIMULATION */
#endif /* CONFIG_STA_SUPPORT */
default: /* error command type */
DBGPRINT(RT_DEBUG_TRACE,
("ft_iocl> ERROR! No such command %d!\n", Command));
return -EINVAL; /* input error */
} /* End of switch */
return TRUE;
} /* End of FT_Ioctl */
#endif /* DOT11R_FT_SUPPORT */
/* End of ft_iocl.c */