ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

ninfo.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.