Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenninfo.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS TCP/IP protocol driver 00004 * FILE: tcpip/ninfo.c 00005 * PURPOSE: Network information 00006 * PROGRAMMERS: Art Yerkes 00007 * REVISIONS: 00008 * CSH 01/08-2000 Created 00009 */ 00010 00011 #include "precomp.h" 00012 00013 #define IP_ROUTE_TYPE_ADD 3 00014 #define IP_ROUTE_TYPE_DEL 2 00015 00016 00017 00018 /* Get IPRouteEntry s for each of the routes in the system */ 00019 TDI_STATUS InfoTdiQueryGetRouteTable( PIP_INTERFACE IF, PNDIS_BUFFER Buffer, PUINT BufferSize ) { 00020 TDI_STATUS Status; 00021 KIRQL OldIrql; 00022 UINT RtCount = CountFIBs(IF); 00023 UINT Size = sizeof( IPROUTE_ENTRY ) * RtCount; 00024 PFIB_ENTRY RCache, RCacheCur; 00025 PIPROUTE_ENTRY RouteEntries, RtCurrent; 00026 UINT i; 00027 00028 TI_DbgPrint(DEBUG_INFO, ("Called, routes = %d\n", 00029 RtCount)); 00030 00031 if (RtCount == 0) 00032 return InfoCopyOut(NULL, 0, NULL, BufferSize); 00033 00034 RouteEntries = ExAllocatePool( NonPagedPool, Size ); 00035 RtCurrent = RouteEntries; 00036 00037 RCache = ExAllocatePool( NonPagedPool, sizeof( FIB_ENTRY ) * RtCount ); 00038 RCacheCur = RCache; 00039 00040 if( !RCache || !RouteEntries ) { 00041 if( RCache ) ExFreePool( RCache ); 00042 if( RouteEntries ) ExFreePool( RouteEntries ); 00043 return TDI_NO_RESOURCES; 00044 } 00045 00046 RtlZeroMemory( RouteEntries, Size ); 00047 00048 RtCount = CopyFIBs( IF, RCache ); 00049 00050 while( RtCurrent < RouteEntries + RtCount ) { 00051 ASSERT(RCacheCur->Router); 00052 00053 RtlCopyMemory( &RtCurrent->Dest, 00054 &RCacheCur->NetworkAddress.Address, 00055 sizeof(RtCurrent->Dest) ); 00056 RtlCopyMemory( &RtCurrent->Mask, 00057 &RCacheCur->Netmask.Address, 00058 sizeof(RtCurrent->Mask) ); 00059 RtlCopyMemory( &RtCurrent->Gw, 00060 &RCacheCur->Router->Address.Address, 00061 sizeof(RtCurrent->Gw) ); 00062 00063 RtCurrent->Metric1 = RCacheCur->Metric; 00064 RtCurrent->Type = TDI_ADDRESS_TYPE_IP; 00065 00066 TI_DbgPrint 00067 (DEBUG_INFO, 00068 ("%d: NA %08x NM %08x GW %08x MT %x\n", 00069 RtCurrent - RouteEntries, 00070 RtCurrent->Dest, 00071 RtCurrent->Mask, 00072 RtCurrent->Gw, 00073 RtCurrent->Metric1 )); 00074 00075 TcpipAcquireSpinLock(&EntityListLock, &OldIrql); 00076 for (i = 0; i < EntityCount; i++) 00077 if (EntityList[i].context == IF) 00078 break; 00079 00080 if (i < EntityCount) 00081 RtCurrent->Index = EntityList[i].tei_instance; 00082 else 00083 RtCurrent->Index = 0; 00084 00085 TcpipReleaseSpinLock(&EntityListLock, OldIrql); 00086 00087 RtCurrent++; RCacheCur++; 00088 } 00089 00090 Status = InfoCopyOut( (PCHAR)RouteEntries, Size, Buffer, BufferSize ); 00091 00092 ExFreePool( RouteEntries ); 00093 ExFreePool( RCache ); 00094 00095 TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status)); 00096 00097 return Status; 00098 } 00099 00100 TDI_STATUS InfoTdiQueryGetAddrTable(TDIEntityID ID, 00101 PNDIS_BUFFER Buffer, 00102 PUINT BufferSize) 00103 { 00104 KIRQL OldIrql; 00105 PIPADDR_ENTRY IPEntry; 00106 PIP_INTERFACE CurrentIF; 00107 UINT i; 00108 00109 TI_DbgPrint(DEBUG_INFO, ("Called.\n")); 00110 00111 00112 TcpipAcquireSpinLock(&EntityListLock, &OldIrql); 00113 00114 for (i = 0; i < EntityCount; i++) 00115 { 00116 if (EntityList[i].tei_entity == ID.tei_entity && 00117 EntityList[i].tei_instance == ID.tei_instance) 00118 break; 00119 } 00120 00121 if (i == EntityCount) 00122 { 00123 TcpipReleaseSpinLock(&EntityListLock, OldIrql); 00124 return TDI_INVALID_PARAMETER; 00125 } 00126 00127 IPEntry = ExAllocatePool(NonPagedPool, sizeof(IPADDR_ENTRY)); 00128 if (!IPEntry) 00129 { 00130 TcpipReleaseSpinLock(&EntityListLock, OldIrql); 00131 return TDI_NO_RESOURCES; 00132 } 00133 00134 CurrentIF = EntityList[i].context; 00135 00136 IPEntry->Index = CurrentIF->Index; 00137 GetInterfaceIPv4Address(CurrentIF, 00138 ADE_UNICAST, 00139 &IPEntry->Addr); 00140 GetInterfaceIPv4Address(CurrentIF, 00141 ADE_ADDRMASK, 00142 &IPEntry->Mask); 00143 GetInterfaceIPv4Address(CurrentIF, 00144 ADE_BROADCAST, 00145 &IPEntry->BcastAddr); 00146 00147 TcpipReleaseSpinLock(&EntityListLock, OldIrql); 00148 00149 InfoCopyOut((PCHAR)IPEntry, sizeof(IPADDR_ENTRY), 00150 Buffer, BufferSize); 00151 00152 ExFreePool(IPEntry); 00153 00154 return TDI_SUCCESS; 00155 } 00156 00157 TDI_STATUS InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID, 00158 PIP_INTERFACE IF, 00159 PNDIS_BUFFER Buffer, 00160 PUINT BufferSize ) { 00161 IPSNMP_INFO SnmpInfo; 00162 UINT IfCount = CountInterfaces(); 00163 UINT RouteCount = CountFIBs(IF); 00164 TDI_STATUS Status = TDI_INVALID_REQUEST; 00165 00166 TI_DbgPrint(DEBUG_INFO, ("Called.\n")); 00167 00168 RtlZeroMemory(&SnmpInfo, sizeof(IPSNMP_INFO)); 00169 00170 SnmpInfo.NumIf = IfCount; 00171 SnmpInfo.NumAddr = 1; 00172 SnmpInfo.NumRoutes = RouteCount; 00173 00174 Status = InfoCopyOut( (PCHAR)&SnmpInfo, sizeof(SnmpInfo), 00175 Buffer, BufferSize ); 00176 00177 TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status)); 00178 00179 return Status; 00180 } 00181 00182 TDI_STATUS InfoTdiSetRoute(PIP_INTERFACE IF, PVOID Buffer, UINT BufferSize) 00183 { 00184 IP_ADDRESS Address, Netmask, Router; 00185 PIPROUTE_ENTRY Route = Buffer; 00186 00187 AddrInitIPv4( &Address, Route->Dest ); 00188 AddrInitIPv4( &Netmask, Route->Mask ); 00189 AddrInitIPv4( &Router, Route->Gw ); 00190 00191 if (!Buffer || BufferSize < sizeof(IPROUTE_ENTRY)) 00192 return TDI_INVALID_PARAMETER; 00193 00194 if (IF == Loopback) 00195 { 00196 DbgPrint("Failing attempt to add route to loopback adapter\n"); 00197 return TDI_INVALID_PARAMETER; 00198 } 00199 00200 if( Route->Type == IP_ROUTE_TYPE_ADD ) { /* Add the route */ 00201 TI_DbgPrint(DEBUG_INFO,("Adding route (%s)\n", A2S(&Address))); 00202 if (!RouterCreateRoute( &Address, &Netmask, &Router, 00203 IF, Route->Metric1)) 00204 return TDI_NO_RESOURCES; 00205 00206 return TDI_SUCCESS; 00207 } else if( Route->Type == IP_ROUTE_TYPE_DEL ) { 00208 TI_DbgPrint(DEBUG_INFO,("Removing route (%s)\n", A2S(&Address))); 00209 if (NT_SUCCESS(RouterRemoveRoute( &Address, &Router ))) 00210 return TDI_SUCCESS; 00211 else 00212 return TDI_INVALID_PARAMETER; 00213 } 00214 00215 return TDI_INVALID_REQUEST; 00216 } 00217 Generated on Sun May 27 2012 04:28:08 for ReactOS by
1.7.6.1
|