- Remove more hacks from iphlpapi
svn path=/trunk/; revision=43339
{
RouteTable *out_route_table;
DWORD numRoutes = getNumRoutes(), routesAdded = 0;
{
RouteTable *out_route_table;
DWORD numRoutes = getNumRoutes(), routesAdded = 0;
TDIEntityID ent;
HANDLE tcpFile;
NTSTATUS status = openTcpFile( &tcpFile );
TDIEntityID ent;
HANDLE tcpFile;
NTSTATUS status = openTcpFile( &tcpFile );
out_route_table->numRoutes = numRoutes;
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 );
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 );
tdiGetRoutesForIpEntity( tcpFile, &ent, &route_set, &numRoutes );
if( !route_set ) {
closeTcpFile( tcpFile );
HeapFree( GetProcessHeap(), 0, out_route_table );
return 0;
}
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
#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;
int routeNum = j + routesAdded;
out_route_table->routes[routeNum].dest =
route_set[j].ire_dest;
if( route_set ) tdiFreeThingSet( route_set );
if( route_set ) tdiFreeThingSet( route_set );
- routesAdded += snmpInfo.ipsi_numroutes;
+ routesAdded += numRoutes;
}
closeTcpFile( tcpFile );
}
closeTcpFile( tcpFile );
TRACE("Called.\n");
if( NT_SUCCESS(status) ) {
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;
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];
req.Req.BufferSize = sizeof(*rte);
rte =
(IPRouteEntry *)&req.Req.Buffer[0];
TRACE("Called.\n");
if( NT_SUCCESS(status) ) {
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;
if( NT_SUCCESS(status) ) {
req.Req.ID.toi_class = INFO_CLASS_PROTOCOL;
PUINT BufferSize);
TDI_STATUS InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID,
PUINT BufferSize);
TDI_STATUS InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID,
PNDIS_BUFFER Buffer,
PUINT BufferSize );
PNDIS_BUFFER Buffer,
PUINT BufferSize );
-TDI_STATUS InfoTdiQueryGetRouteTable( PNDIS_BUFFER Buffer,
+TDI_STATUS InfoTdiQueryGetRouteTable( PIP_INTERFACE IF,
+ PNDIS_BUFFER Buffer,
-TDI_STATUS InfoTdiSetRoute(PIPROUTE_ENTRY Route);
+TDI_STATUS InfoTdiSetRoute(PIP_INTERFACE IF, PIPROUTE_ENTRY Route);
TDI_STATUS InfoTdiQueryGetArptableMIB(TDIEntityID ID,
PIP_INTERFACE Interface,
TDI_STATUS InfoTdiQueryGetArptableMIB(TDIEntityID ID,
PIP_INTERFACE Interface,
NTSTATUS RouterShutdown(
VOID);
NTSTATUS RouterShutdown(
VOID);
+UINT CountFIBs(PIP_INTERFACE IF);
-UINT CopyFIBs( PFIB_ENTRY Target );
+UINT CopyFIBs( PIP_INTERFACE IF, PFIB_ENTRY Target );
return TDI_INVALID_PARAMETER;
else if (ID->toi_entity.tei_entity == CL_NL_ENTITY ||
ID->toi_entity.tei_entity == CO_NL_ENTITY)
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;
else
return TDI_INVALID_PARAMETER;
return TDI_INVALID_PARAMETER;
else if (ID->toi_entity.tei_entity == CO_NL_ENTITY ||
ID->toi_entity.tei_entity == CL_NL_ENTITY)
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;
else
return TDI_INVALID_PARAMETER;
* Status of operation
*/
{
* Status of operation
*/
{
+ PVOID EntityListContext;
+
switch (ID->toi_class)
{
case INFO_CLASS_PROTOCOL:
switch (ID->toi_id)
{
case IP_MIB_ARPTABLE_ENTRY_ID:
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 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;
default:
return TDI_INVALID_REQUEST;
/* Get IPRouteEntry s for each of the routes in the system */
/* 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;
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 Size = sizeof( IPROUTE_ENTRY ) * RtCount;
PFIB_ENTRY RCache =
exAllocatePool( NonPagedPool, sizeof( FIB_ENTRY ) * RtCount ),
RCacheCur = RCache;
PIPROUTE_ENTRY RouteEntries = exAllocatePool( NonPagedPool, Size ),
RtCurrent = RouteEntries;
TI_DbgPrint(DEBUG_INFO, ("Called, routes = %d, RCache = %08x\n",
RtCount, RCache));
TI_DbgPrint(DEBUG_INFO, ("Called, routes = %d, RCache = %08x\n",
RtCount, RCache));
RtlZeroMemory( RouteEntries, Size );
RtlZeroMemory( RouteEntries, Size );
- RtCount = CopyFIBs( RCache );
+ RtCount = CopyFIBs( IF, RCache );
while( RtCurrent < RouteEntries + RtCount ) {
ASSERT(RCacheCur->Router);
while( RtCurrent < RouteEntries + RtCount ) {
ASSERT(RCacheCur->Router);
RtCurrent->Metric1 ));
TcpipAcquireSpinLock(&EntityListLock, &OldIrql);
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++;
TcpipReleaseSpinLock(&EntityListLock, OldIrql);
RtCurrent++; RCacheCur++;
}
TDI_STATUS InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID,
}
TDI_STATUS InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID,
PNDIS_BUFFER Buffer,
PUINT BufferSize ) {
IPSNMP_INFO SnmpInfo;
UINT IfCount = CountInterfaces();
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"));
TDI_STATUS Status = TDI_INVALID_REQUEST;
TI_DbgPrint(DEBUG_INFO, ("Called.\n"));
-TDI_STATUS InfoTdiSetRoute(PIPROUTE_ENTRY Route)
+TDI_STATUS InfoTdiSetRoute(PIP_INTERFACE IF, PIPROUTE_ENTRY Route)
{
IP_ADDRESS Address, Netmask, Router;
{
IP_ADDRESS Address, Netmask, Router;
- PNEIGHBOR_CACHE_ENTRY NCE;
AddrInitIPv4( &Address, Route->Dest );
AddrInitIPv4( &Netmask, Route->Mask );
AddrInitIPv4( &Address, Route->Dest );
AddrInitIPv4( &Netmask, Route->Mask );
if( Route->Type == IP_ROUTE_TYPE_ADD ) { /* Add the route */
TI_DbgPrint(DEBUG_INFO,("Adding route (%s)\n", A2S(&Address)));
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,
if (!RouterCreateRoute( &Address, &Netmask, &Router,
- NCE->Interface, Route->Metric1))
return TDI_NO_RESOURCES;
return TDI_SUCCESS;
return TDI_NO_RESOURCES;
return TDI_SUCCESS;
+UINT CountFIBs(PIP_INTERFACE IF) {
UINT FibCount = 0;
PLIST_ENTRY CurrentEntry;
PLIST_ENTRY NextEntry;
UINT FibCount = 0;
PLIST_ENTRY CurrentEntry;
PLIST_ENTRY NextEntry;
- /* Search the list and remove every FIB entry we find */
CurrentEntry = FIBListHead.Flink;
while (CurrentEntry != &FIBListHead) {
NextEntry = CurrentEntry->Flink;
CurrentEntry = FIBListHead.Flink;
while (CurrentEntry != &FIBListHead) {
NextEntry = CurrentEntry->Flink;
+ Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry);
+ if (Current->Router->Interface == IF)
+ FibCount++;
CurrentEntry = NextEntry;
CurrentEntry = NextEntry;
-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;
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);
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;
CurrentEntry = NextEntry;