/*
 * MibDbg.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:   MibDbg.c                                                 */
/*    PURPOSE:  MIB debug implementation                                    */
/*                                                                         */
/***************************************************************************/

#include "MibDbg.h"
#include "TWDriver.h"
#include "report.h"
#include "osApi.h"

/*
 ***********************************************************************
 *	Internal functions definitions
 ***********************************************************************
 */

static void mibDbgGetArpIpTable(TI_HANDLE hTWD)
{
	TI_STATUS status = TI_OK;
    TMib mib;
    TI_INT32 i;

	/* init */
	mib.aMib = MIB_arpIpAddressesTable;
	mib.aData.ArpIpAddressesTable.FilteringEnable = 0;
	for ( i = 0 ; i < IP_V4_ADDR_LEN ; i++ )
	{
		mib.aData.ArpIpAddressesTable.addr[i] = 0;
	}

	status = TWD_ReadMib(hTWD,NULL,NULL,(void*)&mib);
	if (status != TI_OK)
	{
		WLAN_OS_REPORT(("Get ARP Table failed\n"));
		return;
	}

	/* print ARP Table */
    WLAN_OS_REPORT(("ARP IP Table:\n"));
    WLAN_OS_REPORT(("FilteringEnable: %s (%d)\n", 
				   (mib.aData.ArpIpAddressesTable.FilteringEnable)?"Enable":"Disable",
				   mib.aData.ArpIpAddressesTable.FilteringEnable));
    WLAN_OS_REPORT(("ArpIpAddress: %d.%d.%d.%d\n", 
					mib.aData.ArpIpAddressesTable.addr[0],
					mib.aData.ArpIpAddressesTable.addr[1],
					mib.aData.ArpIpAddressesTable.addr[2],
					mib.aData.ArpIpAddressesTable.addr[3]));
}

static void mibDbgGetGroupAddressTable(TI_HANDLE hTWD)
{
	TI_STATUS status = TI_OK;
    TMib mib;
    TI_INT32 i,j;

	/* init */
	mib.aMib 										= MIB_dot11GroupAddressesTable;
	mib.aData.GroupAddressTable.bFilteringEnable 	= 0;
	mib.aData.GroupAddressTable.nNumberOfAddresses 	= 0;
    for ( i = 0 ; i < MIB_MAX_MULTICAST_GROUP_ADDRS ; i++ )
	{
		for ( j = 0 ; j < MAC_ADDR_LEN ; j++ )
		{
			mib.aData.GroupAddressTable.aGroupTable[i][j]	= 0;
		}
	}

	status = TWD_ReadMib(hTWD,NULL,NULL,(void*)&mib);
	if (status != TI_OK)
	{
		WLAN_OS_REPORT(("Get Group Address Table failed\n"));
		return;
	}

	/* print Group Address Table */
    WLAN_OS_REPORT(("Group addresses Table:\n"));
    WLAN_OS_REPORT(("FilteringEnable: %s (%d)\n", 
				   (mib.aData.GroupAddressTable.bFilteringEnable)?"Enable":"Disable",
				   mib.aData.GroupAddressTable.bFilteringEnable));
    WLAN_OS_REPORT(("nNumberOfAddresses: %d\n", 
				   mib.aData.GroupAddressTable.nNumberOfAddresses));

    WLAN_OS_REPORT(("Group addresses: \n"));
    for ( i = 0 ; i < MIB_MAX_MULTICAST_GROUP_ADDRS ; i++ )
		WLAN_OS_REPORT(("%x:%x:%x:%x:%x:%x\n",     
						mib.aData.GroupAddressTable.aGroupTable[i][0],
						mib.aData.GroupAddressTable.aGroupTable[i][1],
						mib.aData.GroupAddressTable.aGroupTable[i][2],
						mib.aData.GroupAddressTable.aGroupTable[i][3],
						mib.aData.GroupAddressTable.aGroupTable[i][4],
						mib.aData.GroupAddressTable.aGroupTable[i][5]));
}

static void mibDbgGetCounterTable(TI_HANDLE hTWD)
{
	TI_STATUS status = TI_OK;
    TMib mib;

	/* init */
	mib.aMib 								= MIB_countersTable;
	mib.aData.CounterTable.FCSErrorCount	= 0;
	mib.aData.CounterTable.PLCPErrorCount	= 0;
	mib.aData.CounterTable.SeqNumMissCount	= 0;

	status = TWD_ReadMib(hTWD,NULL,NULL,(void*)&mib);
	if (status != TI_OK)
	{
		WLAN_OS_REPORT(("Get Counter Table failed\n"));
		return;
	}

	/* print Counter Table */
    WLAN_OS_REPORT(("FCS error count= %d \nPLCP  error count = %d \nSeq error count= %d\n",     
					mib.aData.CounterTable.FCSErrorCount,
					mib.aData.CounterTable.PLCPErrorCount,
					mib.aData.CounterTable.SeqNumMissCount));

}

static void mibDbgModifyCtsToSelf(TI_HANDLE hTWD, void* pParam)
{
	TI_STATUS status = TI_OK;
    TMib mib;

	if (pParam == NULL) 
	{
		WLAN_OS_REPORT(("Modify CTS To Self failed: No Parameter received\n"));
		return;
	}

	/* init */
	mib.aMib					= MIB_ctsToSelf;
	mib.aData.CTSToSelfEnable 	= 0;
	mib.aData.CTSToSelfEnable 	= *(TI_UINT32*)pParam;

	status = TWD_WriteMib(hTWD, &mib);
	if (status != TI_OK)
	{
		WLAN_OS_REPORT(("Modify CTS To Self failed\n"));
		return;
	}
	WLAN_OS_REPORT(("Modify CTS To Self OK\n"));

	WLAN_OS_REPORT(("CtsToSelf = %s (%d)\n",
				   mib.aData.CTSToSelfEnable?"Enable":"Disable",
				   mib.aData.CTSToSelfEnable));
	WLAN_OS_REPORT(("CTS to self: [0 - Disable, 1 - Enable]\n"));
}

static void mibDbgGetCtsToSelf(TI_HANDLE hTWD)
{
	TI_STATUS status = TI_OK;
    TMib mib;

	/* init */
	mib.aMib					= MIB_ctsToSelf;
	mib.aData.CTSToSelfEnable 	= 0;

	status = TWD_ReadMib(hTWD,NULL,NULL,(void*)&mib);
	if (status != TI_OK)
	{
		WLAN_OS_REPORT(("Get CTS To Self failed\n"));
		return;
	}

	WLAN_OS_REPORT(("CtsToSelf = %s (%d)\n",
				   mib.aData.CTSToSelfEnable?"Enable":"Disable",
				   mib.aData.CTSToSelfEnable));
	WLAN_OS_REPORT(("CTS to self: [0 - Disable, 1 - Enable]\n"));
}

static void mibDbgSetMaxRxLifetime(TI_HANDLE hTWD, void* pParam)
{
	TI_STATUS status = TI_OK;
    TMib mib;

	if (pParam == NULL) 
	{
		WLAN_OS_REPORT(("Set Maximum Rx Life Time failed: No Parameter received\n"));
		return;
	}

	/* init */
	mib.aMib 						= MIB_dot11MaxReceiveLifetime;
	mib.aData.MaxReceiveLifeTime 	= *(TI_UINT32*)pParam;

	status = TWD_WriteMib(hTWD, &mib);
	if (status != TI_OK)
	{
		WLAN_OS_REPORT(("Set Maximum Rx Life Time failed\n"));
		return;
	}
}

/*
 ***********************************************************************
 *	External functions definitions
 ***********************************************************************
 */
void mibDbgPrintFunctions(void)
{
	WLAN_OS_REPORT(("\n          MIB Dbg Functions   \n"));
	WLAN_OS_REPORT(("--------------------------------------\n"));

	WLAN_OS_REPORT(("2101 - Print ARP Table\n"));
	WLAN_OS_REPORT(("2102 - Print Group Address Table\n"));
	WLAN_OS_REPORT(("2103 - Print Counter Table\n"));
	WLAN_OS_REPORT(("2104 - Print Modify CTS to Self\n"));
	WLAN_OS_REPORT(("2105 - Print Max RX Life Time\n"));
}

void MibDebugFunction(TI_HANDLE hTWD ,TI_UINT32 funcType, void* pParam)
{
	if (hTWD == NULL) 
	{
		return;
	}

	switch (funcType)
	{
	case DBG_MIB_PRINT_HELP:
		mibDbgPrintFunctions();
		break;
	case DBG_MIB_GET_ARP_TABLE:
		mibDbgGetArpIpTable(hTWD);
		break;
	case DBG_MIB_GET_GROUP_ADDRESS_TABLE:
		mibDbgGetGroupAddressTable(hTWD);
		break;
	case DBG_MIB_GET_COUNTER_TABLE:
		mibDbgGetCounterTable(hTWD);
		break;
	case DBG_MIB_MODIFY_CTS_TO_SELF:
		mibDbgModifyCtsToSelf(hTWD, pParam);
		break;
	case DBG_MIB_GET_CTS_TO_SELF:
		mibDbgGetCtsToSelf(hTWD);
		break;
	case DBG_MIB_SET_MAX_RX_LIFE_TIME:
		mibDbgSetMaxRxLifetime(hTWD, pParam);
		break;
	default:
        WLAN_OS_REPORT(("MIB Debug: Invalid function type in MIB Debug function: %d\n", funcType));
		break;
	}
}