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
70 static TI_HANDLE dTimer;
71 static TI_HANDLE tmp_hMlme;
72 static TI_HANDLE tmp_hTWD;
73 static TI_HANDLE tmp_hTxCtrl;
74 static TI_BOOL SendFlag = 0;
75 static TI_BOOL bSendDataPkt;
76 static volatile TI_UINT32 numOfPackets;
77 static volatile TI_UINT8 infinitLoopFl = 0;
78 static TI_UINT32 packetsNum;
79 static TI_UINT32 packetLength;
80
81 typedef TI_STATUS (*TCmdCfgFuncB) (TI_HANDLE);
82
83 extern TI_STATUS cmdBld_CmdJoinBss (TI_HANDLE hCmdBld, TJoinBss *pJoinBssParams, void *fCb, TI_HANDLE hCb);
84 void sendMgmtPacket (TI_HANDLE hOs);
85 void sendDataPacket (TI_HANDLE hOs);
86
FWDebugFunction(TI_HANDLE hDrvMain,TI_HANDLE hOs,TI_HANDLE hTWD,TI_HANDLE hMlme,TI_HANDLE hTxMgmtQ,TI_HANDLE hTxCtrl,unsigned long funcType,void * pParam)87 void 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
printFWDbgFunctions(void)139 void 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
FW_debugSendGeneralTestCmd(TI_HANDLE hTWD,void * pParam)152 void 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
FW_DebugSendJoinCommand(TI_HANDLE hTWD,TI_HANDLE hTxMgmtQ)170 void 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
sendDataPacket(TI_HANDLE hOs)220 void 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
sendMgmtPacket(TI_HANDLE hOs)264 void 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
FW_DebugSendPacket(TI_HANDLE hDrvMain,TI_HANDLE hOs,TI_HANDLE hTxMgmtQ,void * pParam)290 void 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
FW_DebugInfinitSendPacket(TI_HANDLE hDrvMain,TI_HANDLE hOs)317 void 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
FW_DebugStartLoopBack(TI_HANDLE hDrvMain,TI_HANDLE hTWD)327 void 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
FW_DebugStopLoopBack(TI_HANDLE hDrvMain,TI_HANDLE hTWD)338 void 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
FW_DebugGeneral(TI_HANDLE hTWD,void * pParam)349 void 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 /*
359 void 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