|
|
/***************************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
DEBUG.C
Abstract:
Debug routines
Environment:
kernel mode only
Notes:
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
Copyright (c) 1999 Microsoft Corporation. All Rights Reserved.
Revision History:
6/6/99 : created
Author:
Tom Green
****************************************************************************/
#include "precomp.h"
#if DBG
// this is for translating a code into an ASCII string
typedef struct Code2Ascii { NDIS_OID Oid; PCHAR OidName; } Code2Ascii;
static Code2Ascii OidList[] = { OID_GEN_SUPPORTED_LIST, "OID_GEN_SUPPORTED_LIST", OID_GEN_HARDWARE_STATUS, "OID_GEN_HARDWARE_STATUS", OID_GEN_MEDIA_SUPPORTED, "OID_GEN_MEDIA_SUPPORTED", OID_GEN_MEDIA_IN_USE, "OID_GEN_MEDIA_IN_USE", OID_GEN_MAXIMUM_LOOKAHEAD, "OID_GEN_MAXIMUM_LOOKAHEAD", OID_GEN_MAXIMUM_FRAME_SIZE, "OID_GEN_MAXIMUM_FRAME_SIZE", OID_GEN_LINK_SPEED, "OID_GEN_LINK_SPEED", OID_GEN_TRANSMIT_BUFFER_SPACE, "OID_GEN_TRANSMIT_BUFFER_SPACE", OID_GEN_RECEIVE_BUFFER_SPACE, "OID_GEN_RECEIVE_BUFFER_SPACE", OID_GEN_TRANSMIT_BLOCK_SIZE, "OID_GEN_TRANSMIT_BLOCK_SIZE", OID_GEN_RECEIVE_BLOCK_SIZE, "OID_GEN_RECEIVE_BLOCK_SIZE", OID_GEN_VENDOR_ID, "OID_GEN_VENDOR_ID", OID_GEN_VENDOR_DESCRIPTION, "OID_GEN_VENDOR_DESCRIPTION", OID_GEN_CURRENT_PACKET_FILTER, "OID_GEN_CURRENT_PACKET_FILTER", OID_GEN_TRANSPORT_HEADER_OFFSET, "OID_GEN_TRANSPORT_HEADER_OFFSET", OID_GEN_CURRENT_LOOKAHEAD, "OID_GEN_CURRENT_LOOKAHEAD", OID_GEN_DRIVER_VERSION, "OID_GEN_DRIVER_VERSION", OID_GEN_VENDOR_DRIVER_VERSION, "OID_GEN_VENDOR_DRIVER_VERSION", OID_GEN_MAXIMUM_TOTAL_SIZE, "OID_GEN_MAXIMUM_TOTAL_SIZE", OID_GEN_PROTOCOL_OPTIONS, "OID_GEN_PROTOCOL_OPTIONS", OID_GEN_MAC_OPTIONS, "OID_GEN_MAC_OPTIONS", OID_GEN_MEDIA_CONNECT_STATUS, "OID_GEN_MEDIA_CONNECT_STATUS", OID_GEN_MAXIMUM_SEND_PACKETS, "OID_GEN_MAXIMUM_SEND_PACKETS", OID_GEN_SUPPORTED_GUIDS, "OID_GEN_SUPPORTED_GUIDS", OID_GEN_XMIT_OK, "OID_GEN_XMIT_OK", OID_GEN_RCV_OK, "OID_GEN_RCV_OK", OID_GEN_XMIT_ERROR, "OID_GEN_XMIT_ERROR", OID_GEN_RCV_ERROR, "OID_GEN_RCV_ERROR", OID_GEN_RCV_NO_BUFFER, "OID_GEN_RCV_NO_BUFFER", OID_GEN_RCV_CRC_ERROR, "OID_GEN_RCV_CRC_ERROR", OID_GEN_TRANSMIT_QUEUE_LENGTH, "OID_GEN_TRANSMIT_QUEUE_LENGTH", OID_802_3_PERMANENT_ADDRESS, "OID_802_3_PERMANENT_ADDRESS", OID_802_3_CURRENT_ADDRESS, "OID_802_3_CURRENT_ADDRESS", OID_802_3_MULTICAST_LIST, "OID_802_3_MULTICAST_LIST", OID_802_3_MAXIMUM_LIST_SIZE, "OID_802_3_MAXIMUM_LIST_SIZE", OID_802_3_RCV_ERROR_ALIGNMENT, "OID_802_3_RCV_ERROR_ALIGNMENT", OID_802_3_XMIT_ONE_COLLISION, "OID_802_3_XMIT_ONE_COLLISION", OID_802_3_XMIT_MORE_COLLISIONS, "OID_802_3_XMIT_MORE_COLLISIONS", OID_802_3_XMIT_DEFERRED, "OID_802_3_XMIT_DEFERRED", OID_802_3_XMIT_MAX_COLLISIONS, "OID_802_3_XMIT_MAX_COLLISIONS", OID_802_3_RCV_OVERRUN, "OID_802_3_RCV_OVERRUN", OID_802_3_XMIT_UNDERRUN, "OID_802_3_XMIT_UNDERRUN", OID_802_3_XMIT_HEARTBEAT_FAILURE, "OID_802_3_XMIT_HEARTBEAT_FAILURE", OID_802_3_XMIT_TIMES_CRS_LOST, "OID_802_3_XMIT_TIMES_CRS_LOST", OID_802_3_XMIT_LATE_COLLISIONS, "OID_802_3_XMIT_LATE_COLLISIONS", OID_802_3_MAC_OPTIONS, "OID_802_3_MAC_OPTIONS", OID_TCP_TASK_OFFLOAD, "OID_TCP_TASK_OFFLOAD", OID_PNP_CAPABILITIES, "OID_PNP_CAPABILITIES", OID_PNP_SET_POWER, "OID_PNP_SET_POWER", OID_PNP_QUERY_POWER, "OID_PNP_QUERY_POWER", OID_PNP_ADD_WAKE_UP_PATTERN, "OID_PNP_ADD_WAKE_UP_PATTERN", OID_PNP_REMOVE_WAKE_UP_PATTERN, "OID_PNP_REMOVE_WAKE_UP_PATTERN", OID_PNP_ENABLE_WAKE_UP, "OID_PNP_ENABLE_WAKE_UP" };
static UINT NumOid = sizeof(OidList) / sizeof(Code2Ascii);
//
// Debug level
//
UINT RndismpDebugFlags = DBG_LEVEL0 | DBG_LEVEL1; // | DBG_LEVEL2; // | DBG_DUMP; // | DBG_OID_LIST;
/****************************************************************************/ /* GetOidName */ /****************************************************************************/ /* */ /* Routine Description: */ /* */ /* Returns string with OID name */ /* */ /* Arguments: */ /* */ /* Oid - OID to find */ /* */ /* Return: */ /* */ /* PCHAR */ /* */ /****************************************************************************/ PCHAR GetOidName(IN NDIS_OID Oid) { UINT Index;
// see if the matching Oid and string are in the list
for(Index = 0; Index < NumOid; Index++) { if(Oid == OidList[Index].Oid) { return OidList[Index].OidName; } }
DbgPrint("GetOidName: unknown OID %x\n", Oid); return "Unknown OID";
} // GetOidName
/****************************************************************************/ /* DisplayOidList */ /****************************************************************************/ /* */ /* Routine Description: */ /* */ /* Prints list of supported OIDs and whether they are supported in */ /* the device or driver */ /* */ /* Arguments: */ /* */ /* Adapter - adapter object */ /* */ /* Return: */ /* */ /* VOID */ /* */ /****************************************************************************/ VOID DisplayOidList(IN PRNDISMP_ADAPTER Adapter) { ASSERT(Adapter->SupportedOIDList);
ASSERT(Adapter->OIDHandlerList);
if(RndismpDebugFlags & DBG_OID_LIST) { UINT Index;
for(Index = 0;Index < Adapter->NumOIDSupported;Index++) { if(Adapter->OIDHandlerList[Index] == DRIVER_SUPPORTED_OID) { DbgPrint("Support (%s) OID (%s)\n", "Driver", GetOidName(Adapter->SupportedOIDList[Index])); } else if(Adapter->OIDHandlerList[Index] == DEVICE_SUPPORTED_OID) { DbgPrint("Support (%s) OID (%s)\n", "Device", GetOidName(Adapter->SupportedOIDList[Index])); } else { DbgPrint("Support (%s) OID (%s) (%08X)\n", "Unknown", GetOidName(Adapter->SupportedOIDList[Index]), Adapter->OIDHandlerList[Index]); } } } } // DisplayOidList
#define BYTES_PER_LINE 16
#define CHARS_PER_BYTE 3 // e.g. " 12"
ULONG MaxHexDumpLength = 0xffff;
VOID RndisPrintHexDump(PVOID Pointer, ULONG Length) { CHAR DumpArray[BYTES_PER_LINE*CHARS_PER_BYTE+1]; PCHAR pBuf; PUCHAR pInBuf; ULONG i;
pInBuf = (PUCHAR)Pointer; pBuf = DumpArray;
Length = MIN(Length, MaxHexDumpLength);
for (i = 0; i < Length; i++) { //
// Are we at the end of a line?
//
if ((i > 0) && ((i & 0xf) == 0)) { *pBuf = '\0'; DbgPrint("%s\n", DumpArray); pBuf = &DumpArray[0]; }
//
// Print the address if we are at the start of a new line.
//
if ((i & 0xf) == 0) { DbgPrint("%08x ", pInBuf); }
//
// Convert the current hex byte into a sequence of two chars.
//
*pBuf = ' '; pBuf++;
*pBuf = ((*pInBuf) >> 4); *pBuf = ((*pBuf > 9)? (*pBuf - 10 + 'a') : (*pBuf + '0'));
pBuf++;
*pBuf = ((*pInBuf) & 0x0F); *pBuf = ((*pBuf > 9)? (*pBuf - 10 + 'a') : (*pBuf + '0'));
pBuf++;
pInBuf++; }
if (Length > 0) { *pBuf = '\0'; DbgPrint("%s\n", DumpArray); } }
#define LOG_ENTRY_SIZE 128
#define LOG_BUFFER_SIZE (2 * PAGE_SIZE)
VOID RndisLogSendMessage( IN PRNDISMP_ADAPTER pAdapter, IN PRNDISMP_MESSAGE_FRAME pMsgFrame) { NDIS_STATUS Status; BOOLEAN bLockAcquired; PUCHAR pMsgData; ULONG CopyLength; PUCHAR pDst;
bLockAcquired = TRUE; RNDISMP_ACQUIRE_ADAPTER_LOCK(pAdapter);
do { if (pAdapter->pSendLogBuffer == NULL) { pAdapter->LogBufferSize = LOG_BUFFER_SIZE; Status = MemAlloc(&pAdapter->pSendLogBuffer, LOG_BUFFER_SIZE); if (Status != NDIS_STATUS_SUCCESS) { TRACE1(("Failed to alloc log buffer (%d bytes)\n", LOG_BUFFER_SIZE)); break; }
pAdapter->pSendLogWrite = pAdapter->pSendLogBuffer; }
pDst = pAdapter->pSendLogWrite; pAdapter->pSendLogWrite += LOG_ENTRY_SIZE; if (pAdapter->pSendLogWrite >= pAdapter->pSendLogBuffer + pAdapter->LogBufferSize) { pAdapter->pSendLogWrite = pDst = pAdapter->pSendLogBuffer; }
RNDISMP_RELEASE_ADAPTER_LOCK(pAdapter); bLockAcquired = FALSE;
CopyLength = MIN(LOG_ENTRY_SIZE, RNDISMP_GET_MDL_LENGTH(pMsgFrame->pMessageMdl)); pMsgData = RNDISMP_GET_MDL_ADDRESS(pMsgFrame->pMessageMdl);
RtlFillMemory(pDst, LOG_ENTRY_SIZE, 0); RNDISMP_MOVE_MEM(pDst, pMsgData, CopyLength);
} while (FALSE);
if (bLockAcquired) { RNDISMP_RELEASE_ADAPTER_LOCK(pAdapter); } }
#endif
|