/* * fwdriverdebug.c * * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name Texas Instruments nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /***************************************************************************/ /* */ /* MODULE: FW_debug.c */ /* PURPOSE: FW debug implementation */ /* */ /***************************************************************************/ #include "tidef.h" #include "DrvMain.h" #include "CmdQueue_api.h" #include "debug.h" #include "connDebug.h" #include "siteMgrDebug.h" #include "dataCtrlDbg.h" #include "rsnDbg.h" #include "osApi.h" #include "report.h" #include "qosMngrDbg.h" #include "PowerMgrDebug.h" #include "roamingMgrDebug.h" #include "scanCncnDbg.h" #include "ScanMngrDbg.h" #include "scrDbg.h" #include "SoftGeminiDbg.h" #include "HealthMonitorDbg.h" #include "smeDebug.h" #include "TWDriver.h" #include "CmdBld.h" #include "commonTypes.h" #include "siteHash.h" #include "txCtrl.h" #include "802_11Defs.h" #include "fwdriverdebug.h" #include "mlmeBuilder.h" #include "Ethernet.h" static TI_HANDLE dTimer; static TI_HANDLE tmp_hMlme; static TI_HANDLE tmp_hTWD; static TI_HANDLE tmp_hTxCtrl; static TI_BOOL SendFlag = 0; static TI_BOOL bSendDataPkt; static volatile TI_UINT32 numOfPackets; static volatile TI_UINT8 infinitLoopFl = 0; static TI_UINT32 packetsNum; static TI_UINT32 packetLength; typedef TI_STATUS (*TCmdCfgFuncB) (TI_HANDLE); extern TI_STATUS cmdBld_CmdJoinBss (TI_HANDLE hCmdBld, TJoinBss *pJoinBssParams, void *fCb, TI_HANDLE hCb); void sendMgmtPacket (TI_HANDLE hOs); void sendDataPacket (TI_HANDLE hOs); void FWDebugFunction(TI_HANDLE hDrvMain, TI_HANDLE hOs, TI_HANDLE hTWD, TI_HANDLE hMlme, TI_HANDLE hTxMgmtQ, TI_HANDLE hTxCtrl, unsigned long funcType, void *pParam) { tmp_hMlme = hMlme; tmp_hTWD = hTWD; tmp_hTxCtrl = hTxCtrl; switch (funcType) { case DBG_FW_PRINT_HELP: printFWDbgFunctions(); break; case DBG_FW_SEND_GENERAL_TEST_CMD: FW_debugSendGeneralTestCmd(hTWD, pParam); break; case DBG_FW_IBSS_CONNECTION: FW_DebugSendJoinCommand(hTWD, hTxMgmtQ); break; case DBG_FW_SEND_MGMT_PACKET: bSendDataPkt = TI_FALSE; FW_DebugSendPacket(hDrvMain, hOs, hTxMgmtQ, pParam); break; case DBG_FW_SEND_DATA_PACKET: bSendDataPkt = TI_TRUE; FW_DebugSendPacket(hDrvMain, hOs, hTxMgmtQ, pParam); break; case DBG_FW_START_LOOPBACK: FW_DebugStartLoopBack (hDrvMain, hTWD); break; case DBG_FW_STOP_LOOPBACK: FW_DebugStopLoopBack (hDrvMain, hTWD); break; case DBG_FW_INFINIT_SEND: FW_DebugInfinitSendPacket (hDrvMain, hTWD); break; case DBG_FW_GENERAL: FW_DebugGeneral (hTWD, pParam); break; default: break; } } void printFWDbgFunctions(void) { WLAN_OS_REPORT((" FW Debug Functions \n")); WLAN_OS_REPORT(("---------------------------------------------------\n")); WLAN_OS_REPORT(("2200 - Print the FW Debug Help \n")); WLAN_OS_REPORT(("2201 - Send General Test Command \n")); WLAN_OS_REPORT(("2202 - create IBSS connection \n")); WLAN_OS_REPORT(("2203[n] - Send n<=999 Packets \n")); WLAN_OS_REPORT(("2205 - Start LoopBack \n")); WLAN_OS_REPORT(("2206 - Stop LoopBack \n")); } void FW_debugSendGeneralTestCmd(TI_HANDLE hTWD, void *pParam) { TTwd *pTWD = (TTwd *)hTWD; FWDebugTestCmdParamter_t Cfg; unsigned char Len; Len = *(unsigned char *)pParam; os_memoryCopy(pTWD->hOs, Cfg.buf,(unsigned long*)pParam + sizeof(TI_UINT8),Len * 4 ); Cfg.len = Len; /* Set information element header */ Cfg.EleHdr.id = CMD_TEST; Cfg.EleHdr.len = sizeof(Cfg) - sizeof(EleHdrStruct); cmdQueue_SendCommand (pTWD->hCmdQueue, CMD_CONFIGURE, (void*)&Cfg, sizeof(Cfg), NULL, NULL, NULL); } void FW_DebugSendJoinCommand(TI_HANDLE hTWD, TI_HANDLE hTxMgmtQ) { TTwd *pTWD = (TTwd *)hTWD; TCmdBld *pCmdBld = (TCmdBld *)(pTWD->hCmdBld); TI_STATUS res; TJoinBss JoinBss; char ssid[10]; unsigned char Bssid[6] = {0x0,0x12,0x43,0xad,0xe5,0x10}; os_memoryCopy(pTWD->hOs,ssid,"ronit",5); JoinBss.basicRateSet = DRV_RATE_2M; JoinBss.radioBand = RADIO_BAND_2_4_GHZ; JoinBss.pBSSID = Bssid; JoinBss.bssType = BSS_INDEPENDENT; JoinBss.pSSID =ssid; JoinBss.ssidLength = 5; JoinBss.channel = 1; JoinBss.beaconInterval = 100; JoinBss.dtimInterval = 2; pCmdBld->hReport = pTWD->hReport; pCmdBld->tDb.bss.BssId[0] = 0x0; pCmdBld->tDb.bss.BssId[1] = 0x12; pCmdBld->tDb.bss.BssId[2] = 0x43; pCmdBld->tDb.bss.BssId[3] = 0xad; pCmdBld->tDb.bss.BssId[4] = 0xe5; pCmdBld->tDb.bss.BssId[5] = 0x10; pCmdBld->tDb.bss.RadioChannel = 1; txMgmtQ_SetConnState(hTxMgmtQ,TX_CONN_STATE_MGMT); res = cmdBld_CmdJoinBss (pCmdBld, &JoinBss, NULL,//cmdBld_ConfigSeq, NULL);//pTWD->hCmdBld if (res) { os_printf("\n failed to make IBSS connection\n"); } os_printf("\n res = %d\n", res); txMgmtQ_SetConnState(hTxMgmtQ, TX_CONN_STATE_MGMT); } void sendDataPacket (TI_HANDLE hOs) { TI_UINT32 i; TTxCtrlBlk * pPktCtrlBlk; TI_UINT8 * pPktBuf; TEthernetHeader tEthHeader; char SrcBssid[6] = {0x88,0x88,0x88,0x88,0x88,0x88}; char DesBssid[6] = {0x22,0x22,0x22,0x22,0x22,0x22}; /* Allocate a TxCtrlBlk for the Tx packet and save timestamp, length and packet handle */ pPktCtrlBlk = TWD_txCtrlBlk_Alloc (tmp_hTWD); pPktCtrlBlk->tTxDescriptor.startTime = os_timeStampMs (hOs); pPktCtrlBlk->tTxDescriptor.length = (TI_UINT16)packetLength + ETHERNET_HDR_LEN; pPktCtrlBlk->tTxDescriptor.tid = 0; pPktCtrlBlk->tTxPktParams.uPktType = TX_PKT_TYPE_ETHER; /* Allocate buffer with headroom for getting the IP header in a 4-byte aligned address */ pPktBuf = txCtrl_AllocPacketBuffer (tmp_hTxCtrl, pPktCtrlBlk, packetLength + ETHERNET_HDR_LEN + 2); /* Prepare Ethernet header */ tEthHeader.type = HTOWLANS(ETHERTYPE_IP); MAC_COPY (tEthHeader.src, SrcBssid); MAC_COPY (tEthHeader.dst, DesBssid); os_memoryCopy (hOs, pPktBuf + 2, &tEthHeader, ETHERNET_HDR_LEN); /* Build BDL */ BUILD_TX_TWO_BUF_PKT_BDL (pPktCtrlBlk, pPktBuf + 2, ETHERNET_HDR_LEN, pPktBuf + 2 + ETHERNET_HDR_LEN, packetLength) /* Fill data buffer with incremented numbers */ for (i = 0; i < packetLength; i++) { *(pPktBuf + 2 + ETHERNET_HDR_LEN + i) = i; } /* Send Ether packet to TxCtrl */ txCtrl_XmitData (tmp_hTxCtrl, pPktCtrlBlk); } void sendMgmtPacket(TI_HANDLE hOs) { static TI_UINT8 aMsg[2000]; TI_UINT32 i; dot11MgmtSubType_e eMsgType = DE_AUTH; for (i = 0; i < packetLength; i++) { aMsg[i] = i; } mlmeBuilder_sendFrame(tmp_hMlme, eMsgType, aMsg, packetLength, 0); numOfPackets++; if ((infinitLoopFl == 0) && (numOfPackets > packetsNum)) { os_timerStop(hOs, dTimer); os_printf("\n *********** Last Packet was sent **********"); os_timerDestroy(hOs, dTimer); } else { os_timerStart(hOs, dTimer, 1000); } } void FW_DebugSendPacket(TI_HANDLE hDrvMain ,TI_HANDLE hOs, TI_HANDLE hTxMgmtQ, void *pParam) { void *fSendPkt; if ( pParam == NULL ) { os_printf("\nFW_DebugSendPacket Error: received NULL parameter\n"); return; } /* Open Tx path for all packet types */ txMgmtQ_SetConnState (hTxMgmtQ, TX_CONN_STATE_MGMT); txMgmtQ_SetConnState (hTxMgmtQ, TX_CONN_STATE_EAPOL); txMgmtQ_SetConnState (hTxMgmtQ, TX_CONN_STATE_OPEN); infinitLoopFl = 0; numOfPackets = 1; packetsNum = 1; packetLength = *(TI_UINT32*)pParam; os_printf("\nFW_DebugSendPacket: packetsNum = %d, packetLength = %d\n",packetsNum, packetLength); fSendPkt = bSendDataPkt ? sendDataPacket : sendMgmtPacket; dTimer = os_timerCreate(hOs, fSendPkt, hDrvMain); os_timerStart(hOs, dTimer, 1000); SendFlag = TI_TRUE; } void FW_DebugInfinitSendPacket(TI_HANDLE hDrvMain ,TI_HANDLE hOs) { infinitLoopFl = 1; numOfPackets = 1; dTimer = os_timerCreate(hOs, sendMgmtPacket, hDrvMain); os_timerStart(hOs, dTimer, 1000); SendFlag = TI_TRUE; } void FW_DebugStartLoopBack (TI_HANDLE hDrvMain, TI_HANDLE hTWD) { TTwd *pTWD = (TTwd *)hTWD; TTestCmd Plt; Plt.testCmdId = TEST_CMD_LOOPBACK_START; os_printf("\n send loopback start command"); cmdQueue_SendCommand (pTWD->hCmdQueue, CMD_TEST, (char*)&Plt, sizeof(Plt), NULL, NULL, NULL); } void FW_DebugStopLoopBack (TI_HANDLE hDrvMain, TI_HANDLE hTWD) { TTwd *pTWD = (TTwd *)hTWD; TTestCmd Plt; Plt.testCmdId = TEST_CMD_LOOPBACK_STOP; os_printf("\n send loopback stop command"); cmdQueue_SendCommand (pTWD->hCmdQueue, CMD_TEST, (char*)&Plt, sizeof(Plt), NULL, NULL, NULL); } void FW_DebugGeneral(TI_HANDLE hTWD, void *pParam) { TTwd *pTWD = (TTwd *)hTWD; TI_UINT32 size = *((TI_UINT32*) pParam) + sizeof(TI_UINT32); cmdQueue_SendCommand (pTWD->hCmdQueue, CMD_DEBUG, (char*)pParam, size, NULL, NULL, NULL); } /* void FW_ComparePacket (char *buf) { char *ptemp; int i; if (SendFlag) { ptemp = CompBuf; os_printf("\n print before compare save buf"); os_printf("\n"); for (i=0;i<Len;i++) { os_printf(" 0x%02x ",*ptemp++); if (i %5 == 0) { os_printf("\n"); } } os_printf("\n print before compare recived packet"); ptemp = buf; os_printf("\n"); for (i=0;i<Len;i++) { os_printf(" 0x%02x ",*ptemp++); if (i %5 == 0) { } } if(memcmp(CompBuf,buf,Len)) os_printf("\n LoopBack Packet failed"); else os_printf("\n LoopBack Packet success"); SendFlag = TI_FALSE; } } */