-/* Copyright (C) 2003 Juan Lang
+/* Copyright (C) 2003 Art Yerkes
+ * A reimplementation of ifenum.c by Juan Lang
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * This file implements statistics getting using the /proc filesystem exported
- * by Linux, and maybe other OSes.
+ * This file is implemented on the IOCTL_TCP_QUERY_INFORMATION_EX ioctl on
+ * tcpip.sys
*/
-#include "ipprivate.h"
+#include "iphlpapi_private.h"
#include "ipstats.h"
#include "ifenum.h"
req.ID.toi_entity = *ent;
status =
- DeviceIoControl
- ( tcpFile,
- IOCTL_TCP_QUERY_INFORMATION_EX,
- &req,
- sizeof(req),
- &entityType,
- sizeof(entityType),
- &returnedLen,
- NULL );
+ DeviceIoControl
+ ( tcpFile,
+ IOCTL_TCP_QUERY_INFORMATION_EX,
+ &req,
+ sizeof(req),
+ &entityType,
+ sizeof(entityType),
+ &returnedLen,
+ NULL );
DPRINT("Ent: %04x:d -> %04x\n",
- ent->tei_entity, ent->tei_instance, entityType );
+ ent->tei_entity, ent->tei_instance, entityType );
return NT_SUCCESS(status) && entityType == CL_NL_IP;
}
int i;
if( !NT_SUCCESS(status) )
- return status;
+ return status;
for( i = 0; i < numEntities; i++ ) {
- if( isIpEntity( tcpFile, &entitySet[i] ) ) {
- DPRINT("Entity %d is an IP Entity\n", i);
- if( numRoutes == index ) break;
- else numRoutes++;
- }
+ if( isIpEntity( tcpFile, &entitySet[i] ) ) {
+ DPRINT("Entity %d is an IP Entity\n", i);
+ if( numRoutes == index ) break;
+ else numRoutes++;
+ }
}
- DPRINT("Index %d is entity #%d - %04x:%08x\n", index, i,
- entitySet[i].tei_entity, entitySet[i].tei_instance );
-
if( numRoutes == index && i < numEntities ) {
- memcpy( ent, &entitySet[i], sizeof(*ent) );
- tdiFreeThingSet( entitySet );
- return STATUS_SUCCESS;
+ DPRINT("Index %d is entity #%d - %04x:%08x\n", index, i,
+ entitySet[i].tei_entity, entitySet[i].tei_instance );
+ memcpy( ent, &entitySet[i], sizeof(*ent) );
+ tdiFreeThingSet( entitySet );
+ return STATUS_SUCCESS;
} else {
- tdiFreeThingSet( entitySet );
- return STATUS_UNSUCCESSFUL;
+ tdiFreeThingSet( entitySet );
+ return STATUS_UNSUCCESSFUL;
}
}
memset( entry, 0, sizeof( *entry ) );
DPRINT("TdiGetMibForIpEntity(tcpFile %x,entityId %x)\n",
- (DWORD)tcpFile, ent->tei_instance);
+ (DWORD)tcpFile, ent->tei_instance);
req.ID.toi_class = INFO_CLASS_PROTOCOL;
req.ID.toi_type = INFO_TYPE_PROVIDER;
req.ID.toi_entity = *ent;
status = DeviceIoControl( tcpFile,
- IOCTL_TCP_QUERY_INFORMATION_EX,
- &req,
- sizeof(req),
- entry,
- sizeof(*entry),
- &returnSize,
- NULL );
+ IOCTL_TCP_QUERY_INFORMATION_EX,
+ &req,
+ sizeof(req),
+ entry,
+ sizeof(*entry),
+ &returnSize,
+ NULL );
DPRINT("TdiGetMibForIpEntity() => {\n"
- " ipsi_forwarding ............ %d\n"
- " ipsi_defaultttl ............ %d\n"
- " ipsi_inreceives ............ %d\n"
- " ipsi_indelivers ............ %d\n"
- " ipsi_outrequests ........... %d\n"
- " ipsi_routingdiscards ....... %d\n"
- " ipsi_outdiscards ........... %d\n"
- " ipsi_outnoroutes ........... %d\n"
- " ipsi_numif ................. %d\n"
- " ipsi_numaddr ............... %d\n"
- " ipsi_numroutes ............. %d\n"
- "} status %08x\n",
- entry->ipsi_forwarding,
- entry->ipsi_defaultttl,
- entry->ipsi_inreceives,
- entry->ipsi_indelivers,
- entry->ipsi_outrequests,
- entry->ipsi_routingdiscards,
- entry->ipsi_outdiscards,
- entry->ipsi_outnoroutes,
- entry->ipsi_numif,
- entry->ipsi_numaddr,
- entry->ipsi_numroutes,
- status);
-
+ " ipsi_forwarding ............ %d\n"
+ " ipsi_defaultttl ............ %d\n"
+ " ipsi_inreceives ............ %d\n"
+ " ipsi_indelivers ............ %d\n"
+ " ipsi_outrequests ........... %d\n"
+ " ipsi_routingdiscards ....... %d\n"
+ " ipsi_outdiscards ........... %d\n"
+ " ipsi_outnoroutes ........... %d\n"
+ " ipsi_numif ................. %d\n"
+ " ipsi_numaddr ............... %d\n"
+ " ipsi_numroutes ............. %d\n"
+ "} status %08x\n",
+ entry->ipsi_forwarding,
+ entry->ipsi_defaultttl,
+ entry->ipsi_inreceives,
+ entry->ipsi_indelivers,
+ entry->ipsi_outrequests,
+ entry->ipsi_routingdiscards,
+ entry->ipsi_outdiscards,
+ entry->ipsi_outnoroutes,
+ entry->ipsi_numif,
+ entry->ipsi_numaddr,
+ entry->ipsi_numroutes,
+ status);
+
return status;
}
NTSTATUS tdiGetRoutesForIpEntity
-( HANDLE tcpFile, TDIEntityID *ent, int numRoutes, IPRouteEntry *routes ) {
- TCP_REQUEST_QUERY_INFORMATION_EX req = TCP_REQUEST_QUERY_INFORMATION_INIT;
+( HANDLE tcpFile, TDIEntityID *ent, IPRouteEntry **routes, PDWORD numRoutes ) {
NTSTATUS status = STATUS_SUCCESS;
- DWORD returnSize;
DPRINT("TdiGetRoutesForIpEntity(tcpFile %x,entityId %x)\n",
- (DWORD)tcpFile, ent->tei_instance);
+ (DWORD)tcpFile, ent->tei_instance);
+
+ status = tdiGetSetOfThings( tcpFile,
+ INFO_CLASS_PROTOCOL,
+ INFO_TYPE_PROVIDER,
+ IP_MIB_ROUTETABLE_ENTRY_ID,
+ ent->tei_entity,
+ 0,
+ sizeof(IPRouteEntry),
+ (PVOID *)routes,
+ numRoutes);
- req.ID.toi_class = INFO_CLASS_PROTOCOL;
- req.ID.toi_type = INFO_TYPE_PROVIDER;
- req.ID.toi_id = IP_MIB_ROUTETABLE_ENTRY_ID;
- req.ID.toi_entity = *ent;
+ return status;
+}
- status = DeviceIoControl( tcpFile,
- IOCTL_TCP_QUERY_INFORMATION_EX,
- &req,
- sizeof(req),
- routes,
- sizeof(*routes) * numRoutes,
- &returnSize,
- NULL );
+NTSTATUS tdiGetIpAddrsForIpEntity
+( HANDLE tcpFile, TDIEntityID *ent, IPAddrEntry **addrs, PDWORD numAddrs ) {
+ NTSTATUS status;
+
+ DPRINT("TdiGetIpAddrsForIpEntity(tcpFile %x,entityId %x)\n",
+ (DWORD)tcpFile, ent->tei_instance);
+
+ status = tdiGetSetOfThings( tcpFile,
+ INFO_CLASS_PROTOCOL,
+ INFO_TYPE_PROVIDER,
+ IP_MIB_ADDRTABLE_ENTRY_ID,
+ ent->tei_entity,
+ 0,
+ sizeof(IPAddrEntry),
+ (PVOID *)addrs,
+ numAddrs );
return status;
}
status = openTcpFile( &tcpFile );
if( !NT_SUCCESS(status) ) {
- TRACE("failure: %08x\n", (int)status );
- return 0;
+ TRACE("failure: %08x\n", (int)status );
+ return 0;
}
status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities );
if( !NT_SUCCESS(status) ) {
- TRACE("failure: %08x\n", (int)status );
- return 0;
+ TRACE("failure: %08x\n", (int)status );
+ return 0;
}
for( i = 0; i < numEntities; i++ ) {
- if( isIpEntity( tcpFile, &entitySet[i] ) ) {
- IPSNMPInfo isnmp;
- memset( &isnmp, 0, sizeof( isnmp ) );
- status = tdiGetMibForIpEntity( tcpFile, &entitySet[i], &isnmp );
- if( !NT_SUCCESS(status) ) {
- tdiFreeThingSet( entitySet );
- return status;
- }
- numRoutes += isnmp.ipsi_numroutes;
- }
+ if( isIpEntity( tcpFile, &entitySet[i] ) ) {
+ IPSNMPInfo isnmp;
+ memset( &isnmp, 0, sizeof( isnmp ) );
+ status = tdiGetMibForIpEntity( tcpFile, &entitySet[i], &isnmp );
+ if( !NT_SUCCESS(status) ) {
+ tdiFreeThingSet( entitySet );
+ return status;
+ }
+ numRoutes += isnmp.ipsi_numroutes;
+ }
}
TRACE("numRoutes: %d\n", (int)numRoutes);
int i;
for( i = 0; i < Len; i++ ) {
- if( !(i & 0xf) ) {
- if( i ) fprintf(stderr,"\n");
- fprintf(stderr,"%08x:", i);
- }
- fprintf( stderr, " %02x", Data[i] & 0xff );
+ if( !(i & 0xf) ) {
+ if( i ) fprintf(stderr,"\n");
+ fprintf(stderr,"%08x:", i);
+ }
+ fprintf( stderr, " %02x", Data[i] & 0xff );
}
fprintf(stderr,"\n");
}
int i;
if( !NT_SUCCESS(status) )
- return 0;
+ return 0;
out_route_table = HeapAlloc( GetProcessHeap(), 0,
- sizeof(RouteTable) +
- (sizeof(RouteEntry) * (numRoutes - 1)) );
+ sizeof(RouteTable) +
+ (sizeof(RouteEntry) * (numRoutes - 1)) );
out_route_table->numRoutes = numRoutes;
for( i = 0; routesAdded < numRoutes; i++ ) {
- int j;
- IPRouteEntry *route_set;
+ int j;
+ IPRouteEntry *route_set;
- getNthIpEntity( tcpFile, i, &ent );
- tdiGetMibForIpEntity( tcpFile, &ent, &snmpInfo );
- route_set = HeapAlloc( GetProcessHeap(), 0,
- sizeof( IPRouteEntry ) *
- snmpInfo.ipsi_numroutes );
+ getNthIpEntity( tcpFile, i, &ent );
+ tdiGetMibForIpEntity( tcpFile, &ent, &snmpInfo );
- DPRINT( "%d routes in instance %d\n", snmpInfo.ipsi_numroutes, i );
+ DPRINT( "%d routes in instance %d\n", snmpInfo.ipsi_numroutes, i );
- 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;
+ }
- tdiGetRoutesForIpEntity( tcpFile, &ent, numRoutes, route_set );
+ tdiGetRoutesForIpEntity( tcpFile, &ent, &route_set, &numRoutes );
- DPRINT("Route set returned\n");
+ DPRINT("Route set returned\n");
#if 0
- HexDump( route_set,
- sizeof( IPRouteEntry ) *
- snmpInfo.ipsi_numroutes );
+ HexDump( route_set,
+ sizeof( IPRouteEntry ) *
+ snmpInfo.ipsi_numroutes );
#endif
- for( j = 0; j < snmpInfo.ipsi_numroutes; j++ ) {
- int routeNum = j + routesAdded;
- out_route_table->routes[routeNum].dest =
- route_set[j].ire_dest;
- out_route_table->routes[routeNum].mask =
- route_set[j].ire_mask;
- out_route_table->routes[routeNum].gateway =
- route_set[j].ire_gw;
- out_route_table->routes[routeNum].ifIndex =
- route_set[j].ire_index;
- out_route_table->routes[routeNum].metric =
- route_set[j].ire_metric;
- }
-
- routesAdded += snmpInfo.ipsi_numroutes;
+ for( j = 0; j < snmpInfo.ipsi_numroutes; j++ ) {
+ int routeNum = j + routesAdded;
+ out_route_table->routes[routeNum].dest =
+ route_set[j].ire_dest;
+ out_route_table->routes[routeNum].mask =
+ route_set[j].ire_mask;
+ out_route_table->routes[routeNum].gateway =
+ route_set[j].ire_gw;
+ out_route_table->routes[routeNum].ifIndex =
+ route_set[j].ire_index;
+ out_route_table->routes[routeNum].metric =
+ route_set[j].ire_metric;
+ }
+
+ if( route_set ) tdiFreeThingSet( route_set );
+
+ routesAdded += snmpInfo.ipsi_numroutes;
}
return out_route_table;