1/*
2 * fwdriverdebug.c
3 *
4 * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 *  * Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 *  * Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in
15 *    the documentation and/or other materials provided with the
16 *    distribution.
17 *  * Neither the name Texas Instruments nor the names of its
18 *    contributors may be used to endorse or promote products derived
19 *    from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34
35/***************************************************************************/
36/*                                                                         */
37/*    MODULE:   FW_debug.c                                                 */
38/*    PURPOSE:  FW debug implementation                                    */
39/*                                                                         */
40/***************************************************************************/
41#include "tidef.h"
42#include "DrvMain.h"
43#include "CmdQueue_api.h"
44#include "debug.h"
45#include "connDebug.h"
46#include "siteMgrDebug.h"
47#include "dataCtrlDbg.h"
48#include "rsnDbg.h"
49#include "osApi.h"
50#include "report.h"
51#include "qosMngrDbg.h"
52#include "PowerMgrDebug.h"
53#include "roamingMgrDebug.h"
54#include "scanCncnDbg.h"
55#include "ScanMngrDbg.h"
56#include "scrDbg.h"
57#include "SoftGeminiDbg.h"
58#include "HealthMonitorDbg.h"
59#include "smeDebug.h"
60#include "TWDriver.h"
61#include "CmdBld.h"
62#include "commonTypes.h"
63#include "siteHash.h"
64#include "txCtrl.h"
65#include "802_11Defs.h"
66#include "fwdriverdebug.h"
67#include "mlmeBuilder.h"
68#include "Ethernet.h"
69
70static TI_HANDLE dTimer;
71static TI_HANDLE tmp_hMlme;
72static TI_HANDLE tmp_hTWD;
73static TI_HANDLE tmp_hTxCtrl;
74static TI_BOOL SendFlag = 0;
75static TI_BOOL bSendDataPkt;
76static volatile TI_UINT32 numOfPackets;
77static volatile TI_UINT8 infinitLoopFl = 0;
78static TI_UINT32 packetsNum;
79static TI_UINT32 packetLength;
80
81typedef TI_STATUS (*TCmdCfgFuncB) (TI_HANDLE);
82
83extern TI_STATUS cmdBld_CmdJoinBss (TI_HANDLE hCmdBld, TJoinBss *pJoinBssParams, void *fCb, TI_HANDLE hCb);
84void sendMgmtPacket (TI_HANDLE hOs);
85void sendDataPacket (TI_HANDLE hOs);
86
87void FWDebugFunction(TI_HANDLE hDrvMain,
88					 TI_HANDLE hOs,
89					 TI_HANDLE hTWD,
90					 TI_HANDLE hMlme,
91					 TI_HANDLE hTxMgmtQ,
92					 TI_HANDLE hTxCtrl,
93					 unsigned long funcType,
94					 void *pParam)
95{
96	tmp_hMlme   = hMlme;
97    tmp_hTWD    = hTWD;
98    tmp_hTxCtrl = hTxCtrl;
99
100	switch (funcType)
101	{
102	case DBG_FW_PRINT_HELP:
103		 printFWDbgFunctions();
104		 break;
105	case DBG_FW_SEND_GENERAL_TEST_CMD:
106		 FW_debugSendGeneralTestCmd(hTWD, pParam);
107		 break;
108	case DBG_FW_IBSS_CONNECTION:
109		 FW_DebugSendJoinCommand(hTWD, hTxMgmtQ);
110		 break;
111	case DBG_FW_SEND_MGMT_PACKET:
112         bSendDataPkt = TI_FALSE;
113		 FW_DebugSendPacket(hDrvMain, hOs, hTxMgmtQ, pParam);
114		 break;
115    case DBG_FW_SEND_DATA_PACKET:
116         bSendDataPkt = TI_TRUE;
117		 FW_DebugSendPacket(hDrvMain, hOs, hTxMgmtQ, pParam);
118		 break;
119	case DBG_FW_START_LOOPBACK:
120		 FW_DebugStartLoopBack (hDrvMain, hTWD);
121		 break;
122	case DBG_FW_STOP_LOOPBACK:
123		 FW_DebugStopLoopBack (hDrvMain, hTWD);
124		 break;
125	case DBG_FW_INFINIT_SEND:
126		 FW_DebugInfinitSendPacket (hDrvMain, hTWD);
127		 break;
128
129	case DBG_FW_GENERAL:
130		 FW_DebugGeneral (hTWD, pParam);
131		 break;
132	default:
133		break;
134
135
136 }
137}
138
139void printFWDbgFunctions(void)
140{
141    WLAN_OS_REPORT(("    FW Debug Functions     	          	\n"));
142    WLAN_OS_REPORT(("---------------------------------------------------\n"));
143    WLAN_OS_REPORT(("2200 		- Print the FW Debug Help		\n"));
144    WLAN_OS_REPORT(("2201 		- Send General Test Command 	\n"));
145    WLAN_OS_REPORT(("2202 		- create IBSS connection   	 	\n"));
146    WLAN_OS_REPORT(("2203[n] 	- Send n<=999 Packets           \n"));
147    WLAN_OS_REPORT(("2205 		- Start LoopBack            	\n"));
148    WLAN_OS_REPORT(("2206 		- Stop LoopBack             	\n"));
149}
150
151
152void FW_debugSendGeneralTestCmd(TI_HANDLE hTWD, void *pParam)
153{
154	TTwd     *pTWD = (TTwd *)hTWD;
155	FWDebugTestCmdParamter_t Cfg;
156	unsigned char Len;
157	Len = *(unsigned char *)pParam;
158
159	os_memoryCopy(pTWD->hOs, Cfg.buf,(unsigned long*)pParam + sizeof(TI_UINT8),Len * 4 );
160
161	Cfg.len = Len;
162
163	/* Set information element header */
164	Cfg.EleHdr.id = CMD_TEST;
165	Cfg.EleHdr.len = sizeof(Cfg) - sizeof(EleHdrStruct);
166
167    cmdQueue_SendCommand (pTWD->hCmdQueue, CMD_CONFIGURE, (void*)&Cfg, sizeof(Cfg), NULL, NULL, NULL);
168}
169
170void FW_DebugSendJoinCommand(TI_HANDLE hTWD, TI_HANDLE hTxMgmtQ)
171{
172	TTwd     *pTWD = (TTwd *)hTWD;
173	TCmdBld  *pCmdBld = (TCmdBld *)(pTWD->hCmdBld);
174	TI_STATUS res;
175	TJoinBss  JoinBss;
176	char ssid[10];
177	unsigned char Bssid[6] = {0x0,0x12,0x43,0xad,0xe5,0x10};
178
179	os_memoryCopy(pTWD->hOs,ssid,"ronit",5);
180
181	JoinBss.basicRateSet = DRV_RATE_2M;
182	JoinBss.radioBand = RADIO_BAND_2_4_GHZ;
183	JoinBss.pBSSID = Bssid;
184
185	JoinBss.bssType = BSS_INDEPENDENT;
186	JoinBss.pSSID =ssid;
187	JoinBss.ssidLength = 5;
188	JoinBss.channel = 1;
189	JoinBss.beaconInterval = 100;
190	JoinBss.dtimInterval = 2;
191
192	pCmdBld->hReport = pTWD->hReport;
193	pCmdBld->tDb.bss.BssId[0] = 0x0;
194	pCmdBld->tDb.bss.BssId[1] = 0x12;
195	pCmdBld->tDb.bss.BssId[2] = 0x43;
196	pCmdBld->tDb.bss.BssId[3] = 0xad;
197	pCmdBld->tDb.bss.BssId[4] = 0xe5;
198	pCmdBld->tDb.bss.BssId[5] = 0x10;
199	pCmdBld->tDb.bss.RadioChannel = 1;
200
201	txMgmtQ_SetConnState(hTxMgmtQ,TX_CONN_STATE_MGMT);
202
203	res = cmdBld_CmdJoinBss  (pCmdBld,
204							  &JoinBss,
205							  NULL,//cmdBld_ConfigSeq,
206							  NULL);//pTWD->hCmdBld
207
208	if (res)
209	{
210		os_printf("\n failed to make IBSS connection\n");
211	}
212
213	os_printf("\n res = %d\n", res);
214
215	txMgmtQ_SetConnState(hTxMgmtQ, TX_CONN_STATE_MGMT);
216
217}
218
219
220void sendDataPacket (TI_HANDLE hOs)
221{
222    TI_UINT32       i;
223	TTxCtrlBlk *    pPktCtrlBlk;
224    TI_UINT8 *      pPktBuf;
225    TEthernetHeader tEthHeader;
226	char SrcBssid[6] = {0x88,0x88,0x88,0x88,0x88,0x88};
227	char DesBssid[6] = {0x22,0x22,0x22,0x22,0x22,0x22};
228
229	/* Allocate a TxCtrlBlk for the Tx packet and save timestamp, length and packet handle */
230    pPktCtrlBlk = TWD_txCtrlBlk_Alloc (tmp_hTWD);
231    pPktCtrlBlk->tTxDescriptor.startTime = os_timeStampMs (hOs);
232    pPktCtrlBlk->tTxDescriptor.length    = (TI_UINT16)packetLength + ETHERNET_HDR_LEN;
233    pPktCtrlBlk->tTxDescriptor.tid       = 0;
234    pPktCtrlBlk->tTxPktParams.uPktType   = TX_PKT_TYPE_ETHER;
235
236    /* Allocate buffer with headroom for getting the IP header in a 4-byte aligned address */
237    pPktBuf = txCtrl_AllocPacketBuffer (tmp_hTxCtrl, pPktCtrlBlk, packetLength + ETHERNET_HDR_LEN + 2);
238
239    /* Prepare Ethernet header */
240    tEthHeader.type = HTOWLANS(ETHERTYPE_IP);
241    MAC_COPY (tEthHeader.src, SrcBssid);
242    MAC_COPY (tEthHeader.dst, DesBssid);
243    os_memoryCopy (hOs, pPktBuf + 2, &tEthHeader, ETHERNET_HDR_LEN);
244
245    /* Build BDL */
246    BUILD_TX_TWO_BUF_PKT_BDL (pPktCtrlBlk,
247                              pPktBuf + 2,
248                              ETHERNET_HDR_LEN,
249                              pPktBuf + 2 + ETHERNET_HDR_LEN,
250                              packetLength)
251
252    /* Fill data buffer with incremented numbers */
253    for (i = 0; i < packetLength; i++)
254    {
255        *(pPktBuf + 2 + ETHERNET_HDR_LEN + i) = i;
256    }
257
258    /* Send Ether packet to TxCtrl */
259    txCtrl_XmitData (tmp_hTxCtrl, pPktCtrlBlk);
260}
261
262
263
264void sendMgmtPacket(TI_HANDLE hOs)
265{
266    static TI_UINT8     aMsg[2000];
267    TI_UINT32           i;
268    dot11MgmtSubType_e  eMsgType = DE_AUTH;
269
270    for (i = 0; i < packetLength; i++)
271    {
272        aMsg[i] = i;
273    }
274
275    mlmeBuilder_sendFrame(tmp_hMlme, eMsgType, aMsg, packetLength, 0);
276
277    numOfPackets++;
278    if ((infinitLoopFl == 0) && (numOfPackets > packetsNum))
279    {
280        os_timerStop(hOs, dTimer);
281        os_printf("\n *********** Last Packet was sent **********");
282        os_timerDestroy(hOs, dTimer);
283    }
284    else
285    {
286        os_timerStart(hOs, dTimer, 1000);
287    }
288}
289
290void FW_DebugSendPacket(TI_HANDLE hDrvMain ,TI_HANDLE hOs, TI_HANDLE hTxMgmtQ, void *pParam)
291{
292    void *fSendPkt;
293
294	if ( pParam == NULL )
295	{
296        os_printf("\nFW_DebugSendPacket Error: received NULL parameter\n");
297		return;
298	}
299
300    /* Open Tx path for all packet types */
301    txMgmtQ_SetConnState (hTxMgmtQ, TX_CONN_STATE_MGMT);
302    txMgmtQ_SetConnState (hTxMgmtQ, TX_CONN_STATE_EAPOL);
303    txMgmtQ_SetConnState (hTxMgmtQ, TX_CONN_STATE_OPEN);
304
305	infinitLoopFl	= 0;
306	numOfPackets 	= 1;
307	packetsNum 		= 1;
308	packetLength    = *(TI_UINT32*)pParam;
309    os_printf("\nFW_DebugSendPacket: packetsNum = %d, packetLength = %d\n",packetsNum, packetLength);
310    fSendPkt = bSendDataPkt ? sendDataPacket : sendMgmtPacket;
311    dTimer = os_timerCreate(hOs, fSendPkt, hDrvMain);
312    os_timerStart(hOs, dTimer, 1000);
313
314    SendFlag = TI_TRUE;
315}
316
317void FW_DebugInfinitSendPacket(TI_HANDLE hDrvMain ,TI_HANDLE hOs)
318{
319	infinitLoopFl = 1;
320	numOfPackets = 1;
321
322    dTimer = os_timerCreate(hOs, sendMgmtPacket, hDrvMain);
323    os_timerStart(hOs, dTimer, 1000);
324    SendFlag = TI_TRUE;
325}
326
327void FW_DebugStartLoopBack (TI_HANDLE hDrvMain, TI_HANDLE hTWD)
328{
329	TTwd     *pTWD = (TTwd *)hTWD;
330	TTestCmd     Plt;
331
332	Plt.testCmdId = TEST_CMD_LOOPBACK_START;
333	os_printf("\n send loopback start command");
334	cmdQueue_SendCommand (pTWD->hCmdQueue, CMD_TEST, (char*)&Plt, sizeof(Plt), NULL, NULL, NULL);
335}
336
337
338void FW_DebugStopLoopBack (TI_HANDLE hDrvMain, TI_HANDLE hTWD)
339{
340	TTwd     *pTWD = (TTwd *)hTWD;
341	TTestCmd     Plt;
342
343	Plt.testCmdId = TEST_CMD_LOOPBACK_STOP;
344	os_printf("\n send loopback stop command");
345	cmdQueue_SendCommand (pTWD->hCmdQueue, CMD_TEST, (char*)&Plt, sizeof(Plt), NULL, NULL, NULL);
346}
347
348
349void FW_DebugGeneral(TI_HANDLE hTWD, void *pParam)
350{
351	TTwd     *pTWD = (TTwd *)hTWD;
352	TI_UINT32 size = *((TI_UINT32*) pParam) + sizeof(TI_UINT32);
353
354	cmdQueue_SendCommand (pTWD->hCmdQueue, CMD_DEBUG, (char*)pParam, size, NULL, NULL, NULL);
355}
356
357
358/*
359void FW_ComparePacket (char *buf)
360 {
361 char *ptemp;
362 int i;
363
364   if (SendFlag)
365   {
366       ptemp = CompBuf;
367       os_printf("\n print before compare save buf");
368       os_printf("\n");
369       for (i=0;i<Len;i++) {
370           os_printf(" 0x%02x  ",*ptemp++);
371           if (i %5 == 0) { os_printf("\n");
372           }
373
374       }
375
376       os_printf("\n print before compare recived packet");
377       ptemp = buf;
378       os_printf("\n");
379       for (i=0;i<Len;i++) {
380           os_printf(" 0x%02x  ",*ptemp++);
381           if (i %5 == 0) {
382           }
383
384       }
385
386
387     if(memcmp(CompBuf,buf,Len))
388       os_printf("\n LoopBack Packet failed");
389      else
390      os_printf("\n LoopBack Packet success");
391
392      SendFlag = TI_FALSE;
393   }
394
395 }
396*/
397
398
399