From 604f4f13c1f8d079e60a173a7adca6ef7e1feed1 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Fri, 18 Mar 2005 03:26:12 +0000 Subject: [PATCH] Added simple dword OID query to lan. Correct oper status, admin status and type settings in iinfo. Small fixes in lan.c for adapter name. svn path=/trunk/; revision=14173 --- reactos/drivers/lib/ip/network/interface.c | 25 +++++++++++++++++ reactos/drivers/net/tcpip/datalink/lan.c | 27 +++++++++++++++++-- reactos/drivers/net/tcpip/include/interface.h | 2 ++ reactos/drivers/net/tcpip/include/lan.h | 3 +++ reactos/drivers/net/tcpip/include/precomp.h | 1 + reactos/drivers/net/tcpip/tcpip/iinfo.c | 12 ++++++--- 6 files changed, 65 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/lib/ip/network/interface.c b/reactos/drivers/lib/ip/network/interface.c index 8094c43050f..00803526da3 100644 --- a/reactos/drivers/lib/ip/network/interface.c +++ b/reactos/drivers/lib/ip/network/interface.c @@ -209,3 +209,28 @@ PIP_INTERFACE FindOnLinkInterface(PIP_ADDRESS Address) return NULL; } + +NTSTATUS GetInterfaceConnectionStatus +( PIP_INTERFACE Interface, PDWORD Result ) { + NTSTATUS Status = TcpipLanGetDwordOid + ( Interface, OID_GEN_HARDWARE_STATUS, Result ); + if( NT_SUCCESS(Status) ) switch( *Result ) { + case NdisHardwareStatusReady: + *Result = MIB_IF_OPER_STATUS_OPERATIONAL; + break; + case NdisHardwareStatusInitializing: + *Result = MIB_IF_OPER_STATUS_CONNECTING; + break; + case NdisHardwareStatusReset: + *Result = MIB_IF_OPER_STATUS_DISCONNECTED; + break; + case NdisHardwareStatusNotReady: + *Result = MIB_IF_OPER_STATUS_DISCONNECTED; + break; + case NdisHardwareStatusClosing: + default: + *Result = MIB_IF_OPER_STATUS_NON_OPERATIONAL; + break; + } + return Status; +} diff --git a/reactos/drivers/net/tcpip/datalink/lan.c b/reactos/drivers/net/tcpip/datalink/lan.c index 4633b63c543..79972b7d905 100644 --- a/reactos/drivers/net/tcpip/datalink/lan.c +++ b/reactos/drivers/net/tcpip/datalink/lan.c @@ -165,6 +165,28 @@ VOID FreeAdapter( } +NTSTATUS TcpipLanGetDwordOid +( PIP_INTERFACE Interface, + NDIS_OID Oid, + PDWORD Result ) { + /* Get maximum frame size */ + if( Interface->Context ) { + return NDISCall((PLAN_ADAPTER)Interface->Context, + NdisRequestQueryInformation, + Oid, + Result, + sizeof(DWORD)); + } else switch( Oid ) { /* Loopback Case */ + case OID_GEN_HARDWARE_STATUS: + *Result = NdisHardwareStatusReady; + return STATUS_SUCCESS; + + default: + return STATUS_INVALID_PARAMETER; + } +} + + VOID STDCALL ProtocolOpenAdapterComplete( NDIS_HANDLE BindingContext, NDIS_STATUS Status, @@ -916,11 +938,10 @@ VOID BindAdapter( TI_DbgPrint(MID_TRACE,("BCAST(IF) %s\n", A2S(&IF->Broadcast))); if(NT_SUCCESS(Status)) { + RtlZeroMemory( &IF->Name, sizeof(IF->Name) ); Status = ReadStringFromRegistry( RegHandle, L"DeviceDesc", &IF->Name ); - RtlZeroMemory( &IF->Name, sizeof( IF->Name ) ); - /* I think that not getting a devicedesc is not a fatal error */ if( !NT_SUCCESS(Status) ) { if( IF->Name.Buffer ) exFreePool( IF->Name.Buffer ); @@ -929,6 +950,8 @@ VOID BindAdapter( Status = STATUS_SUCCESS; } + TI_DbgPrint(MID_TRACE,("Adapter Name: %wZ\n", &IF->Name)); + if(!NT_SUCCESS(Status)) { TI_DbgPrint(MIN_TRACE, ("Unable to open protocol-specific registry key: 0x%x\n", Status)); diff --git a/reactos/drivers/net/tcpip/include/interface.h b/reactos/drivers/net/tcpip/include/interface.h index a8ad99fd1c1..8f082356ae8 100644 --- a/reactos/drivers/net/tcpip/include/interface.h +++ b/reactos/drivers/net/tcpip/include/interface.h @@ -13,6 +13,8 @@ UINT CountInterfaceAddresses( PIP_INTERFACE Interface ); NTSTATUS GetInterfaceSpeed( PIP_INTERFACE Interface, PUINT Speed ); NTSTATUS GetInterfaceName( PIP_INTERFACE Interface, PCHAR NameBuffer, UINT NameMaxLen ); +NTSTATUS GetInterfaceConnectionStatus( PIP_INTERFACE Interface, + PDWORD OperStatus ); PIP_INTERFACE FindOnLinkInterface(PIP_ADDRESS Address); #endif//_TCPIP_INTERFACE_H diff --git a/reactos/drivers/net/tcpip/include/lan.h b/reactos/drivers/net/tcpip/include/lan.h index bbfeda5bd88..e88bd9eaeff 100644 --- a/reactos/drivers/net/tcpip/include/lan.h +++ b/reactos/drivers/net/tcpip/include/lan.h @@ -98,6 +98,9 @@ VOID LANUnregisterProtocol( VOID LANStartup(); VOID LANShutdown(); +NTSTATUS TcpipLanGetDwordOid( PIP_INTERFACE Interface, NDIS_OID Oid, + PDWORD Result ); + NDIS_STATUS NDISCall( PLAN_ADAPTER Adapter, NDIS_REQUEST_TYPE Type, diff --git a/reactos/drivers/net/tcpip/include/precomp.h b/reactos/drivers/net/tcpip/include/precomp.h index 568c4a7e4b0..3b2ff7b6f89 100644 --- a/reactos/drivers/net/tcpip/include/precomp.h +++ b/reactos/drivers/net/tcpip/include/precomp.h @@ -35,5 +35,6 @@ #include #include #include +#include #define NTOS_MODE_USER #include diff --git a/reactos/drivers/net/tcpip/tcpip/iinfo.c b/reactos/drivers/net/tcpip/tcpip/iinfo.c index d0afdfd3f18..4d47b555c50 100644 --- a/reactos/drivers/net/tcpip/tcpip/iinfo.c +++ b/reactos/drivers/net/tcpip/tcpip/iinfo.c @@ -35,13 +35,19 @@ TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID, OutData->Index = ID->tei_instance + 1; /* viz: tcpip keeps those indices */ - OutData->Type = Interface == Loopback ? IFENT_SOFTWARE_LOOPBACK : 0; + OutData->Type = Interface == + Loopback ? MIB_IF_TYPE_LOOPBACK : MIB_IF_TYPE_ETHERNET; OutData->Mtu = Interface->MTU; TI_DbgPrint(MAX_TRACE, ("Getting interface speed\n")); OutData->PhysAddrLen = Interface->AddressLength; - OutData->AdminStatus = 1; /* XXX Up -- How do I know? */ - OutData->OperStatus = 1; /* XXX Up -- How do I know? */ + OutData->AdminStatus = MIB_IF_ADMIN_STATUS_UP; + /* NDIS_HARDWARE_STATUS -> ROUTER_CONNECTION_STATE */ + Status = GetInterfaceConnectionStatus( Interface, &OutData->OperStatus ); + + /* Not sure what to do here, but not ready seems a safe bet on failure */ + if( !NT_SUCCESS(Status) ) + OutData->OperStatus = NdisHardwareStatusNotReady; IFDescr = (PCHAR)&OutData[1];