| /* |
| * 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; |
| } |
| |
| } |
| */ |
| |
| |