diff --git a/reactos/drivers/network/tcpip/include/ip.h b/reactos/drivers/network/tcpip/include/ip.h index a172eb3bc06..47f9771f0d9 100644 --- a/reactos/drivers/network/tcpip/include/ip.h +++ b/reactos/drivers/network/tcpip/include/ip.h @@ -134,6 +134,19 @@ typedef struct _LLIP_BIND_INFO { LL_TRANSMIT_ROUTINE Transmit; /* Transmit function for this interface */ } LLIP_BIND_INFO, *PLLIP_BIND_INFO; +typedef struct _SEND_RECV_STATS { + UINT InBytes; + UINT InUnicast; + UINT InNUnicast; + UINT InDiscarded; + UINT InErrors; + UINT InDiscardedUnknownProto; + UINT OutBytes; + UINT OutUnicast; + UINT OutNUnicast; + UINT OutDiscarded; + UINT OutErrors; +} SEND_RECV_STATS, *PSEND_RECV_STATS; /* Information about an IP interface */ typedef struct _IP_INTERFACE { @@ -157,6 +170,7 @@ typedef struct _IP_INTERFACE { UINT Index; /* Index of adapter (used to add ip addr) */ LL_TRANSMIT_ROUTINE Transmit; /* Pointer to transmit function */ PVOID TCPContext; /* TCP Content for this interface */ + SEND_RECV_STATS Stats; /* Send/Receive statistics */ } IP_INTERFACE, *PIP_INTERFACE; typedef struct _IP_SET_ADDRESS { diff --git a/reactos/drivers/network/tcpip/tcpip/iinfo.c b/reactos/drivers/network/tcpip/tcpip/iinfo.c index 2da0df136c0..21ac96166e8 100644 --- a/reactos/drivers/network/tcpip/tcpip/iinfo.c +++ b/reactos/drivers/network/tcpip/tcpip/iinfo.c @@ -20,6 +20,7 @@ TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID, PCHAR IFDescr; ULONG Size; UINT DescrLenMax = MAX_IFDESCR_LEN - 1; + NDIS_STATUS NdisStatus; TI_DbgPrint(DEBUG_INFO, ("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n", @@ -57,6 +58,28 @@ TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID, ("IF Speed = %d * 100bps\n", OutData->Speed)); memcpy(OutData->PhysAddr,Interface->Address,Interface->AddressLength); TI_DbgPrint(DEBUG_INFO, ("Got HWAddr\n")); + + memcpy(&OutData->InOctets, &Interface->Stats, sizeof(SEND_RECV_STATS)); + + NdisStatus = NDISCall(IF, + NdisRequestQueryInformation, + OID_GEN_XMIT_ERROR, + &OutData->OutErrors, + sizeof(ULONG)); + if (NdisStatus != NDIS_STATUS_SUCCESS) + OutData->OutErrors = 0; + + TI_DbgPrint(DEBUG_INFO, ("OutErrors = %d\n", OutData->OutErrors)); + + NdisStatus = NDISCall(IF, + NdisRequestQueryInformation, + OID_GEN_RCV_ERROR, + &OutData->InErrors, + sizeof(ULONG)); + if (NdisStatus != NDIS_STATUS_SUCCESS) + OutData->InErrors = 0; + + TI_DbgPrint(DEBUG_INFO, ("InErrors = %d\n", OutData->InErrors)); } GetInterfaceName( Interface, IFDescr, MAX_IFDESCR_LEN - 1 ); diff --git a/reactos/lib/drivers/ip/network/ip.c b/reactos/lib/drivers/ip/network/ip.c index 2046e35be77..c6f0f464bb5 100644 --- a/reactos/lib/drivers/ip/network/ip.c +++ b/reactos/lib/drivers/ip/network/ip.c @@ -323,6 +323,8 @@ VOID DefaultProtocolHandler( { TI_DbgPrint(MID_TRACE, ("[IF %x] Packet of unknown Internet protocol " "discarded.\n", Interface)); + + Interface->Stats.InDiscardedUnknownProto++; } diff --git a/reactos/lib/drivers/ip/network/receive.c b/reactos/lib/drivers/ip/network/receive.c index 6cafe5fe268..aff556b297a 100644 --- a/reactos/lib/drivers/ip/network/receive.c +++ b/reactos/lib/drivers/ip/network/receive.c @@ -464,6 +464,8 @@ VOID ProcessFragment( /* Give the packet to the protocol dispatcher */ IPDispatchProtocol(IF, &Datagram); + IF->Stats.InBytes += Datagram.TotalSize; + /* We're done with this datagram */ exFreePool(Datagram.Header); TI_DbgPrint(MAX_TRACE, ("Freeing datagram at (0x%X).\n", Datagram)); diff --git a/reactos/lib/drivers/ip/network/transmit.c b/reactos/lib/drivers/ip/network/transmit.c index 1d78bfd773a..51a99c27439 100644 --- a/reactos/lib/drivers/ip/network/transmit.c +++ b/reactos/lib/drivers/ip/network/transmit.c @@ -240,6 +240,8 @@ NTSTATUS IPSendDatagram(PIP_PACKET IPPacket, PNEIGHBOR_CACHE_ENTRY NCE, * send routine (IPSendFragment) */ { + UINT PacketSize; + TI_DbgPrint(MAX_TRACE, ("Called. IPPacket (0x%X) NCE (0x%X)\n", IPPacket, NCE)); DISPLAY_IP_PACKET(IPPacket); @@ -264,6 +266,14 @@ NTSTATUS IPSendDatagram(PIP_PACKET IPPacket, PNEIGHBOR_CACHE_ENTRY NCE, IPPacket->Flags)); } + NdisQueryPacket(IPPacket->NdisPacket, + NULL, + NULL, + NULL, + &PacketSize); + + NCE->Interface->Stats.OutBytes += PacketSize; + return SendFragments(IPPacket, NCE, NCE->Interface->MTU, Complete, Context); }