From 1f7271bf919278c3ba96af2c03141dbbe9f5b271 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 9 Oct 2009 05:18:35 +0000 Subject: [PATCH] - Fix some typos from my last commit - Remove more hacks from iphlpapi svn path=/trunk/; revision=43339 --- reactos/dll/win32/iphlpapi/ipstats_reactos.c | 14 +++----- reactos/dll/win32/iphlpapi/route_reactos.c | 6 ++-- reactos/drivers/network/tcpip/include/info.h | 6 ++-- .../drivers/network/tcpip/include/router.h | 4 +-- reactos/drivers/network/tcpip/tcpip/info.c | 19 ++++++++--- reactos/drivers/network/tcpip/tcpip/ninfo.c | 34 +++++++++---------- reactos/lib/drivers/ip/network/router.c | 18 ++++++---- 7 files changed, 56 insertions(+), 45 deletions(-) diff --git a/reactos/dll/win32/iphlpapi/ipstats_reactos.c b/reactos/dll/win32/iphlpapi/ipstats_reactos.c index 4a41866078b..7fb7cbff953 100644 --- a/reactos/dll/win32/iphlpapi/ipstats_reactos.c +++ b/reactos/dll/win32/iphlpapi/ipstats_reactos.c @@ -423,7 +423,6 @@ RouteTable *getRouteTable(void) { RouteTable *out_route_table; DWORD numRoutes = getNumRoutes(), routesAdded = 0; - IPSNMPInfo snmpInfo; TDIEntityID ent; HANDLE tcpFile; NTSTATUS status = openTcpFile( &tcpFile ); @@ -444,31 +443,28 @@ RouteTable *getRouteTable(void) out_route_table->numRoutes = numRoutes; - for( i = 0; routesAdded < numRoutes; i++ ) { + for( i = 0; routesAdded < out_route_table->numRoutes; i++ ) { int j; IPRouteEntry *route_set; getNthIpEntity( tcpFile, i, &ent ); - tdiGetMibForIpEntity( tcpFile, &ent, &snmpInfo ); - - TRACE( "%d routes in instance %d\n", snmpInfo.ipsi_numroutes, i ); tdiGetRoutesForIpEntity( tcpFile, &ent, &route_set, &numRoutes ); - + if( !route_set ) { closeTcpFile( tcpFile ); HeapFree( GetProcessHeap(), 0, out_route_table ); return 0; } - TRACE("Route set returned\n"); + TRACE( "%d routes in instance %d\n", numRoutes, i ); #if 0 HexDump( route_set, sizeof( IPRouteEntry ) * snmpInfo.ipsi_numroutes ); #endif - for( j = 0; j < snmpInfo.ipsi_numroutes; j++ ) { + for( j = 0; j < numRoutes; j++ ) { int routeNum = j + routesAdded; out_route_table->routes[routeNum].dest = route_set[j].ire_dest; @@ -484,7 +480,7 @@ RouteTable *getRouteTable(void) if( route_set ) tdiFreeThingSet( route_set ); - routesAdded += snmpInfo.ipsi_numroutes; + routesAdded += numRoutes; } closeTcpFile( tcpFile ); diff --git a/reactos/dll/win32/iphlpapi/route_reactos.c b/reactos/dll/win32/iphlpapi/route_reactos.c index 84ee77e0dc3..ef6b63983dc 100644 --- a/reactos/dll/win32/iphlpapi/route_reactos.c +++ b/reactos/dll/win32/iphlpapi/route_reactos.c @@ -64,14 +64,14 @@ DWORD createIpForwardEntry( PMIB_IPFORWARDROW pRoute ) { TRACE("Called.\n"); if( NT_SUCCESS(status) ) { - status = getNthIpEntity( tcpFile, 0, &id ); + status = getNthIpEntity( tcpFile, pRoute->dwForwardIfIndex, &id ); if( NT_SUCCESS(status) ) { req.Req.ID.toi_class = INFO_CLASS_PROTOCOL; req.Req.ID.toi_type = INFO_TYPE_PROVIDER; req.Req.ID.toi_id = IP_MIB_ARPTABLE_ENTRY_ID; req.Req.ID.toi_entity.tei_instance = id.tei_instance; - req.Req.ID.toi_entity.tei_instance = CL_NL_ENTITY; + req.Req.ID.toi_entity.tei_entity = CL_NL_ENTITY; req.Req.BufferSize = sizeof(*rte); rte = (IPRouteEntry *)&req.Req.Buffer[0]; @@ -129,7 +129,7 @@ DWORD deleteIpForwardEntry( PMIB_IPFORWARDROW pRoute ) { TRACE("Called.\n"); if( NT_SUCCESS(status) ) { - status = getNthIpEntity( tcpFile, 0, &id ); + status = getNthIpEntity( tcpFile, pRoute->dwForwardIfIndex, &id ); if( NT_SUCCESS(status) ) { req.Req.ID.toi_class = INFO_CLASS_PROTOCOL; diff --git a/reactos/drivers/network/tcpip/include/info.h b/reactos/drivers/network/tcpip/include/info.h index 432d9536384..efae370e33c 100644 --- a/reactos/drivers/network/tcpip/include/info.h +++ b/reactos/drivers/network/tcpip/include/info.h @@ -152,13 +152,15 @@ TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID ID, PUINT BufferSize); TDI_STATUS InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID, + PIP_INTERFACE IF, PNDIS_BUFFER Buffer, PUINT BufferSize ); -TDI_STATUS InfoTdiQueryGetRouteTable( PNDIS_BUFFER Buffer, +TDI_STATUS InfoTdiQueryGetRouteTable( PIP_INTERFACE IF, + PNDIS_BUFFER Buffer, PUINT BufferSize ); -TDI_STATUS InfoTdiSetRoute(PIPROUTE_ENTRY Route); +TDI_STATUS InfoTdiSetRoute(PIP_INTERFACE IF, PIPROUTE_ENTRY Route); TDI_STATUS InfoTdiQueryGetArptableMIB(TDIEntityID ID, PIP_INTERFACE Interface, diff --git a/reactos/drivers/network/tcpip/include/router.h b/reactos/drivers/network/tcpip/include/router.h index 92ff35e435c..73d2409f22a 100644 --- a/reactos/drivers/network/tcpip/include/router.h +++ b/reactos/drivers/network/tcpip/include/router.h @@ -43,9 +43,9 @@ NTSTATUS RouterStartup( NTSTATUS RouterShutdown( VOID); -UINT CountFIBs(VOID); +UINT CountFIBs(PIP_INTERFACE IF); -UINT CopyFIBs( PFIB_ENTRY Target ); +UINT CopyFIBs( PIP_INTERFACE IF, PFIB_ENTRY Target ); #endif /* __ROUTER_H */ diff --git a/reactos/drivers/network/tcpip/tcpip/info.c b/reactos/drivers/network/tcpip/tcpip/info.c index 3cb29e9c8f1..8a83303ead5 100644 --- a/reactos/drivers/network/tcpip/tcpip/info.c +++ b/reactos/drivers/network/tcpip/tcpip/info.c @@ -188,7 +188,10 @@ TDI_STATUS InfoTdiQueryInformationEx( return TDI_INVALID_PARAMETER; else if (ID->toi_entity.tei_entity == CL_NL_ENTITY || ID->toi_entity.tei_entity == CO_NL_ENTITY) - return InfoTdiQueryGetIPSnmpInfo(ID->toi_entity, Buffer, BufferSize); + if ((EntityListContext = GetContext(ID->toi_entity))) + return InfoTdiQueryGetIPSnmpInfo(ID->toi_entity, EntityListContext, Buffer, BufferSize); + else + return TDI_INVALID_PARAMETER; else return TDI_INVALID_PARAMETER; @@ -214,7 +217,10 @@ TDI_STATUS InfoTdiQueryInformationEx( return TDI_INVALID_PARAMETER; else if (ID->toi_entity.tei_entity == CO_NL_ENTITY || ID->toi_entity.tei_entity == CL_NL_ENTITY) - return InfoTdiQueryGetRouteTable(Buffer, BufferSize); + if ((EntityListContext = GetContext(ID->toi_entity))) + return InfoTdiQueryGetRouteTable(EntityListContext, Buffer, BufferSize); + else + return TDI_INVALID_PARAMETER; else return TDI_INVALID_PARAMETER; @@ -251,20 +257,25 @@ TDI_STATUS InfoTdiSetInformationEx * Status of operation */ { + PVOID EntityListContext; + switch (ID->toi_class) { case INFO_CLASS_PROTOCOL: switch (ID->toi_id) { case IP_MIB_ARPTABLE_ENTRY_ID: - if (ID->toi_id != INFO_TYPE_PROVIDER) + if (ID->toi_type != INFO_TYPE_PROVIDER) return TDI_INVALID_PARAMETER; if (ID->toi_entity.tei_entity != CL_NL_ENTITY && ID->toi_entity.tei_entity != CO_NL_ENTITY) return TDI_INVALID_PARAMETER; - return InfoTdiSetRoute((PIPROUTE_ENTRY)Buffer); + if ((EntityListContext = GetContext(ID->toi_entity))) + return InfoTdiSetRoute(EntityListContext, (PIPROUTE_ENTRY)Buffer); + else + return TDI_INVALID_PARAMETER; default: return TDI_INVALID_REQUEST; diff --git a/reactos/drivers/network/tcpip/tcpip/ninfo.c b/reactos/drivers/network/tcpip/tcpip/ninfo.c index 352d8cf1ba5..968fe5c9952 100644 --- a/reactos/drivers/network/tcpip/tcpip/ninfo.c +++ b/reactos/drivers/network/tcpip/tcpip/ninfo.c @@ -16,16 +16,17 @@ /* Get IPRouteEntry s for each of the routes in the system */ -TDI_STATUS InfoTdiQueryGetRouteTable( PNDIS_BUFFER Buffer, PUINT BufferSize ) { +TDI_STATUS InfoTdiQueryGetRouteTable( PIP_INTERFACE IF, PNDIS_BUFFER Buffer, PUINT BufferSize ) { TDI_STATUS Status; KIRQL OldIrql; - UINT RtCount = CountFIBs(); + UINT RtCount = CountFIBs(IF); UINT Size = sizeof( IPROUTE_ENTRY ) * RtCount; PFIB_ENTRY RCache = exAllocatePool( NonPagedPool, sizeof( FIB_ENTRY ) * RtCount ), RCacheCur = RCache; PIPROUTE_ENTRY RouteEntries = exAllocatePool( NonPagedPool, Size ), RtCurrent = RouteEntries; + UINT i; TI_DbgPrint(DEBUG_INFO, ("Called, routes = %d, RCache = %08x\n", RtCount, RCache)); @@ -38,7 +39,7 @@ TDI_STATUS InfoTdiQueryGetRouteTable( PNDIS_BUFFER Buffer, PUINT BufferSize ) { RtlZeroMemory( RouteEntries, Size ); - RtCount = CopyFIBs( RCache ); + RtCount = CopyFIBs( IF, RCache ); while( RtCurrent < RouteEntries + RtCount ) { ASSERT(RCacheCur->Router); @@ -66,13 +67,15 @@ TDI_STATUS InfoTdiQueryGetRouteTable( PNDIS_BUFFER Buffer, PUINT BufferSize ) { RtCurrent->Metric1 )); TcpipAcquireSpinLock(&EntityListLock, &OldIrql); - for( RtCurrent->Index = EntityCount; - RtCurrent->Index > 0 && - RCacheCur->Router->Interface != - EntityList[RtCurrent->Index - 1].context; - RtCurrent->Index-- ); + for (i = 0; i < EntityCount; i++) + if (EntityList[i].context == IF) + break; + + if (i < EntityCount) + RtCurrent->Index = EntityList[i].tei_instance; + else + RtCurrent->Index = 0; - RtCurrent->Index = EntityList[RtCurrent->Index - 1].tei_instance; TcpipReleaseSpinLock(&EntityListLock, OldIrql); RtCurrent++; RCacheCur++; @@ -146,11 +149,12 @@ TDI_STATUS InfoTdiQueryGetAddrTable(TDIEntityID ID, } TDI_STATUS InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID, + PIP_INTERFACE IF, PNDIS_BUFFER Buffer, PUINT BufferSize ) { IPSNMP_INFO SnmpInfo; UINT IfCount = CountInterfaces(); - UINT RouteCount = CountFIBs(); + UINT RouteCount = CountFIBs(IF); TDI_STATUS Status = TDI_INVALID_REQUEST; TI_DbgPrint(DEBUG_INFO, ("Called.\n")); @@ -169,10 +173,9 @@ TDI_STATUS InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID, return Status; } -TDI_STATUS InfoTdiSetRoute(PIPROUTE_ENTRY Route) +TDI_STATUS InfoTdiSetRoute(PIP_INTERFACE IF, PIPROUTE_ENTRY Route) { IP_ADDRESS Address, Netmask, Router; - PNEIGHBOR_CACHE_ENTRY NCE; AddrInitIPv4( &Address, Route->Dest ); AddrInitIPv4( &Netmask, Route->Mask ); @@ -180,13 +183,8 @@ TDI_STATUS InfoTdiSetRoute(PIPROUTE_ENTRY Route) if( Route->Type == IP_ROUTE_TYPE_ADD ) { /* Add the route */ TI_DbgPrint(DEBUG_INFO,("Adding route (%s)\n", A2S(&Address))); - /* Find the existing route this belongs to */ - NCE = RouterGetRoute( &Router ); - if (!NCE) return TDI_INVALID_PARAMETER; - - /* Really add the route */ if (!RouterCreateRoute( &Address, &Netmask, &Router, - NCE->Interface, Route->Metric1)) + IF, Route->Metric1)) return TDI_NO_RESOURCES; return TDI_SUCCESS; diff --git a/reactos/lib/drivers/ip/network/router.c b/reactos/lib/drivers/ip/network/router.c index a220db84e17..c2b79a2f968 100644 --- a/reactos/lib/drivers/ip/network/router.c +++ b/reactos/lib/drivers/ip/network/router.c @@ -99,37 +99,41 @@ VOID DestroyFIBEs( } -UINT CountFIBs() { +UINT CountFIBs(PIP_INTERFACE IF) { UINT FibCount = 0; PLIST_ENTRY CurrentEntry; PLIST_ENTRY NextEntry; + PFIB_ENTRY Current; - /* Search the list and remove every FIB entry we find */ CurrentEntry = FIBListHead.Flink; while (CurrentEntry != &FIBListHead) { NextEntry = CurrentEntry->Flink; + Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry); + if (Current->Router->Interface == IF) + FibCount++; CurrentEntry = NextEntry; - FibCount++; } return FibCount; } -UINT CopyFIBs( PFIB_ENTRY Target ) { +UINT CopyFIBs( PIP_INTERFACE IF, PFIB_ENTRY Target ) { UINT FibCount = 0; PLIST_ENTRY CurrentEntry; PLIST_ENTRY NextEntry; PFIB_ENTRY Current; - /* Search the list and remove every FIB entry we find */ CurrentEntry = FIBListHead.Flink; while (CurrentEntry != &FIBListHead) { NextEntry = CurrentEntry->Flink; Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry); - Target[FibCount] = *Current; + if (Current->Router->Interface == IF) + { + Target[FibCount] = *Current; + FibCount++; + } CurrentEntry = NextEntry; - FibCount++; } return FibCount; -- 2.17.1