/*
* smeDebug.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.
*/
/** \file smeDbg.c
* \brief This file include the SME debug module implementation
* \
* \date 13-February-2006
*/
#include "smePrivate.h"
#include "smeDebug.h"
#include "report.h"
void printSmeDbgFunctions (void);
void sme_dbgPrintObject (TI_HANDLE hSme);
void sme_printStats (TI_HANDLE hSme);
void sme_resetStats(TI_HANDLE hSme);
void sme_printBssidList(TI_HANDLE hSme);
#define CHAN_FREQ_TABLE_SIZE (sizeof(ChanFreq) / sizeof(struct CHAN_FREQ))
struct CHAN_FREQ {
unsigned char chan;
unsigned long freq;
} ChanFreq[] = {
{1,2412000}, {2,2417000}, {3,2422000}, {4,2427000},
{5,2432000}, {6,2437000}, {7,2442000}, {8,2447000},
{9,2452000},
{10,2457000}, {11,2462000}, {12,2467000}, {13,2472000},
{14,2484000}, {36,5180000}, {40,5200000}, {44,5220000},
{48,5240000}, {52,5260000}, {56,5280000}, {60,5300000},
{64,5320000},
{100,5500000}, {104,5520000}, {108,5540000}, {112,5560000},
{116,5580000}, {120,5600000}, {124,5620000}, {128,5640000},
{132,5660000}, {136,5680000}, {140,5700000}, {149,5745000},
{153,5765000}, {157,5785000}, {161,5805000} };
TI_UINT32 scanResultTable_CalculateBssidListSize (TI_HANDLE hScanResultTable, TI_BOOL bAllVarIes);
TI_STATUS scanResultTable_GetBssidList (TI_HANDLE hScanResultTable,
OS_802_11_BSSID_LIST_EX *pBssidList,
TI_UINT32 *pLength,
TI_BOOL bAllVarIes);
/**
* \fn smeDebugFunction
* \brief Main SME debug function
*
* Main SME debug function
*
* \param hSme - handle to the SME object
* \param funcType - the specific debug function
* \param pParam - parameters for the debug function
* \return None
*/
void smeDebugFunction (TI_HANDLE hSme, TI_UINT32 funcType, void *pParam)
{
switch (funcType)
{
case DBG_SME_PRINT_HELP:
printSmeDbgFunctions();
break;
case DBG_SME_PRINT_OBJECT:
sme_dbgPrintObject( hSme );
break;
case DBG_SME_PRINT_STATS:
sme_printStats( hSme );
break;
case DBG_SME_CLEAR_STATS:
sme_resetStats( hSme );
break;
case DBG_SME_BSSID_LIST:
sme_printBssidList( hSme );
break;
default:
WLAN_OS_REPORT(("Invalid function type in SME debug function: %d\n", funcType));
break;
}
}
int sme_strlen(char *s)
{
int x=0;
while (*s++)
x++;
return(x);
}
char* sme_strcpy(char *s1,char *s2)
{
while (*s2)
{
*s1++ = *s2++;
}
*s1 = '\0';
return s1;
}
int sme_memcmp(char* s1, char* s2, int n)
{
while(n-- > 0 && *s1 == *s2)
s1++, s2++;
return( n < 0 ? 0 : *s1 - *s2 );
}
/**
* \fn printSmeDbgFunctions
* \brief Print the SME debug menu
*
* Print the SME debug menu
*
* \param hSme - handle to the SME object
* \return None
*/
void printSmeDbgFunctions(void)
{
WLAN_OS_REPORT((" SME Debug Functions \n"));
WLAN_OS_REPORT(("-------------------------\n"));
WLAN_OS_REPORT(("1900 - Print the SME Debug Help\n"));
WLAN_OS_REPORT(("1901 - Print the SME object\n"));
WLAN_OS_REPORT(("1902 - Print the SME statistics\n"));
WLAN_OS_REPORT(("1903 - Reset the SME statistics\n"));
WLAN_OS_REPORT(("1904 - Print BSSID list\n"));
}
#ifdef REPORT_LOG
static TI_UINT8 Freq2Chan(TI_UINT32 freq)
{
TI_UINT32 i;
for(i=0; i<CHAN_FREQ_TABLE_SIZE; i++)
if(ChanFreq[i].freq == freq)
return ChanFreq[i].chan;
return 0;
}
#endif
static void PrintBssidList(OS_802_11_BSSID_LIST_EX* bssidList, TI_UINT32 IsFullPrint, TMacAddr CurrentBssid)
{
TI_UINT32 i;
TI_INT8 connectionTypeStr[50];
POS_802_11_BSSID_EX pBssid = &bssidList->Bssid[0];
WLAN_OS_REPORT(("BssId List: Num=%u\n", bssidList->NumberOfItems));
WLAN_OS_REPORT((" MAC Privacy Rssi Mode Channel SSID\n"));
for(i=0; i<bssidList->NumberOfItems; i++)
{
switch (pBssid->InfrastructureMode)
{
case os802_11IBSS:
sme_strcpy (connectionTypeStr, "Adhoc");
break;
case os802_11Infrastructure:
sme_strcpy (connectionTypeStr, "Infra");
break;
case os802_11AutoUnknown:
sme_strcpy (connectionTypeStr, "Auto");
break;
default:
sme_strcpy (connectionTypeStr, " --- ");
break;
}
WLAN_OS_REPORT(("%s%02x.%02x.%02x.%02x.%02x.%02x %3u %4d %s %6d %s\n",
(!sme_memcmp(CurrentBssid, pBssid->MacAddress, MAC_ADDR_LEN))?"*":" ",
pBssid->MacAddress[0],
pBssid->MacAddress[1],
pBssid->MacAddress[2],
pBssid->MacAddress[3],
pBssid->MacAddress[4],
pBssid->MacAddress[5],
pBssid->Privacy,
pBssid->Rssi,
connectionTypeStr,
Freq2Chan(pBssid->Configuration.Union.channel),
(pBssid->Ssid.Ssid[0] == '\0')?(TI_INT8*)"****":((TI_INT8*)pBssid->Ssid.Ssid) ));
if (IsFullPrint)
{
WLAN_OS_REPORT((" BeaconInterval %d\n", pBssid->Configuration.BeaconPeriod));
WLAN_OS_REPORT((" Capabilities 0x%x\n", pBssid->Capabilities));
}
#ifdef _WINDOWS /*temp fix until bringing the dual OS fix*/
pBssid = (POS_802_11_BSSID_EX)((TI_INT8*)pBssid + (pBssid->Length ? pBssid->Length : sizeof(OS_802_11_BSSID_EX)));
#else /*for Linux*/
pBssid = &bssidList->Bssid[i+1];
#endif
}
}
void sme_printBssidList(TI_HANDLE hSme)
{
TSme* sme = (TSme*) hSme;
TI_UINT32 length;
TI_UINT8* blist;
TMacAddr temp_bssid = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
length = scanResultTable_CalculateBssidListSize (sme->hScanResultTable, TI_FALSE);
blist = os_memoryAlloc(NULL, length);
if(!blist)
{
WLAN_OS_REPORT(("ERROR. sme_printBssidList(): Cannot allocate memory!! length = %d\n", length));
return;
}
scanResultTable_GetBssidList (sme->hScanResultTable, (POS_802_11_BSSID_LIST_EX)blist, &length, TI_FALSE);
PrintBssidList((OS_802_11_BSSID_LIST_EX*)blist, 0, temp_bssid);
os_memoryFree(NULL, blist, length);
}
/**
* \fn sme_dbgPrintObject
* \brief Print the SME object
*
* Print the SME object
*
* \param hSme - handle to the SME object
* \return None
*/
void sme_dbgPrintObject (TI_HANDLE hSme)
{
WLAN_OS_REPORT(("Not yet implemented!\n"));
}
/**
* \fn sme_printStats
* \brief Print the SME statistics
*
* Print the SME statistics
*
* \param hSme - handle to the SME object
* \return None
*/
void sme_printStats (TI_HANDLE hSme)
{
WLAN_OS_REPORT(("Not yet implemented!\n"));
}
/**
* \fn sme_resetStats
* \brief Reset the SME statistics
*
* Reset the SME statistics
*
* \param hSme - handle to the SME object
* \return None
*/
void sme_resetStats(TI_HANDLE hSme)
{
WLAN_OS_REPORT(("Not yet implemented!\n"));
}