- Fix some typos from my last commit
[reactos.git] / reactos / drivers / network / tcpip / tcpip / ninfo.c
index f39b35b..968fe5c 100644 (file)
 #define IP_ROUTE_TYPE_ADD 3
 #define IP_ROUTE_TYPE_DEL 2
 
-TDI_STATUS InfoTdiQueryGetAddrTable( PNDIS_BUFFER Buffer,
-                                    PUINT BufferSize ) {
 
-    TDI_STATUS Status = TDI_INVALID_REQUEST;
-    KIRQL OldIrql;
-    UINT Count = 0;
-    UINT IfCount = CountInterfaces();
-    PIPADDR_ENTRY IpAddress =
-       ExAllocatePool( NonPagedPool, sizeof( IPADDR_ENTRY ) * IfCount );
-    PIPADDR_ENTRY IpCurrent = IpAddress;
-    IF_LIST_ITER(CurrentIF);
-
-    TI_DbgPrint(DEBUG_INFO, ("Called.\n"));
-
-    if (!IpAddress)
-       return TDI_NO_RESOURCES;
-
-    TcpipAcquireSpinLock(&InterfaceListLock, &OldIrql);
-
-    ForEachInterface(CurrentIF) {
-       IpCurrent->Index     = CurrentIF->Index;
-       IpCurrent->Addr      = 0;
-       IpCurrent->BcastAddr = 0;
-       IpCurrent->Mask      = 0;
-
-       /* Locate the diffrent addresses and put them the right place */
-       GetInterfaceIPv4Address( CurrentIF,
-                                ADE_UNICAST,
-                                &IpCurrent->Addr );
-       GetInterfaceIPv4Address( CurrentIF,
-                                ADE_BROADCAST,
-                                &IpCurrent->BcastAddr );
-       GetInterfaceIPv4Address( CurrentIF,
-                                ADE_ADDRMASK,
-                                &IpCurrent->Mask );
-       IpCurrent++;
-       Count++;
-    } EndFor(CurrentIF);
-    ASSERT( Count == IfCount );
-
-    TcpipReleaseSpinLock(&InterfaceListLock, OldIrql);
-
-    Status = InfoCopyOut( (PCHAR)IpAddress, sizeof(*IpAddress) * IfCount,
-                         Buffer, BufferSize );
-
-    ExFreePool( IpAddress );
-
-    TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status));
-
-    return Status;
-}
 
 /* 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 ),
+       exAllocatePool( NonPagedPool, sizeof( FIB_ENTRY ) * RtCount ),
        RCacheCur = RCache;
-    PIPROUTE_ENTRY RouteEntries = ExAllocatePool( NonPagedPool, Size ),
+    PIPROUTE_ENTRY RouteEntries = exAllocatePool( NonPagedPool, Size ),
        RtCurrent = RouteEntries;
+    UINT i;
 
     TI_DbgPrint(DEBUG_INFO, ("Called, routes = %d, RCache = %08x\n",
                            RtCount, RCache));
 
     if( !RCache || !RouteEntries ) {
-       if( RCache ) ExFreePool( RCache );
-       if( RouteEntries ) ExFreePool( RouteEntries );
+       if( RCache ) exFreePool( RCache );
+       if( RouteEntries ) exFreePool( RouteEntries );
        return TDI_NO_RESOURCES;
     }
 
     RtlZeroMemory( RouteEntries, Size );
 
-    RtCount = CopyFIBs( RCache );
+    RtCount = CopyFIBs( IF, RCache );
 
     while( RtCurrent < RouteEntries + RtCount ) {
-       /* Copy Desitnation */
+       ASSERT(RCacheCur->Router);
+
        RtlCopyMemory( &RtCurrent->Dest,
                       &RCacheCur->NetworkAddress.Address,
                       sizeof(RtCurrent->Dest) );
        RtlCopyMemory( &RtCurrent->Mask,
                       &RCacheCur->Netmask.Address,
                       sizeof(RtCurrent->Mask) );
-
-       if( RCacheCur->Router )
-           RtlCopyMemory( &RtCurrent->Gw,
-                          &RCacheCur->Router->Address.Address,
-                          sizeof(RtCurrent->Gw) );
-       else
-           RtlZeroMemory( &RtCurrent->Gw, sizeof(RtCurrent->Gw) );
+       RtlCopyMemory( &RtCurrent->Gw,
+                      &RCacheCur->Router->Address.Address,
+                      sizeof(RtCurrent->Gw) );
 
        RtCurrent->Metric1 = RCacheCur->Metric;
        RtCurrent->Type = TDI_ADDRESS_TYPE_IP;
@@ -119,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++;
@@ -133,19 +83,78 @@ TDI_STATUS InfoTdiQueryGetRouteTable( PNDIS_BUFFER Buffer, PUINT BufferSize ) {
 
     Status = InfoCopyOut( (PCHAR)RouteEntries, Size, Buffer, BufferSize );
 
-    ExFreePool( RouteEntries );
-    ExFreePool( RCache );
+    exFreePool( RouteEntries );
+    exFreePool( RCache );
 
     TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status));
 
     return Status;
 }
 
-TDI_STATUS InfoTdiQueryGetIPSnmpInfo( PNDIS_BUFFER Buffer,
+TDI_STATUS InfoTdiQueryGetAddrTable(TDIEntityID ID,
+                                   PNDIS_BUFFER Buffer,
+                                   PUINT BufferSize)
+{
+    KIRQL OldIrql;
+    PIPADDR_ENTRY IPEntry;
+    PIP_INTERFACE CurrentIF;
+    UINT i;
+
+    TI_DbgPrint(DEBUG_INFO, ("Called.\n"));
+
+
+    TcpipAcquireSpinLock(&EntityListLock, &OldIrql);
+
+    for (i = 0; i < EntityCount; i++)
+    {
+        if (EntityList[i].tei_entity == ID.tei_entity &&
+            EntityList[i].tei_instance == ID.tei_instance)
+            break;
+    }
+
+    if (i == EntityCount)
+    {
+        TcpipReleaseSpinLock(&EntityListLock, OldIrql);
+        return TDI_INVALID_PARAMETER;
+    }
+
+    IPEntry = exAllocatePool(NonPagedPool, sizeof(IPADDR_ENTRY));
+    if (!IPEntry)
+    {
+        TcpipReleaseSpinLock(&EntityListLock, OldIrql);
+        return TDI_NO_RESOURCES;
+    }
+
+    CurrentIF = EntityList[i].context;
+
+    IPEntry->Index = CurrentIF->Index;
+    GetInterfaceIPv4Address(CurrentIF,
+                           ADE_UNICAST,
+                           &IPEntry->Addr);
+    GetInterfaceIPv4Address(CurrentIF,
+                           ADE_ADDRMASK,
+                           &IPEntry->Mask);
+    GetInterfaceIPv4Address(CurrentIF,
+                           ADE_BROADCAST,
+                           &IPEntry->BcastAddr);
+
+    TcpipReleaseSpinLock(&EntityListLock, OldIrql);
+
+    InfoCopyOut((PCHAR)IPEntry, sizeof(IPADDR_ENTRY),
+               Buffer, BufferSize);
+
+    exFreePool(IPEntry);
+
+    return TDI_SUCCESS;
+}
+
+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"));
@@ -164,95 +173,29 @@ TDI_STATUS InfoTdiQueryGetIPSnmpInfo( PNDIS_BUFFER Buffer,
     return Status;
 }
 
-TDI_STATUS InfoNetworkLayerTdiQueryEx( UINT InfoClass,
-                                      UINT InfoType,
-                                      UINT InfoId,
-                                      PVOID Context,
-                                      TDIEntityID *id,
-                                      PNDIS_BUFFER Buffer,
-                                      PUINT BufferSize ) {
-    TDI_STATUS Status = TDI_INVALID_REQUEST;
-
-    TI_DbgPrint(DEBUG_INFO, ("Called.\n"));
-
-    switch( InfoClass ) {
-    case INFO_CLASS_GENERIC:
-       if( InfoType == INFO_TYPE_PROVIDER && InfoId == ENTITY_TYPE_ID ) {
-           ULONG Return = CL_NL_IP;
-           Status = InfoCopyOut( (PCHAR)&Return, sizeof(Return),
-                                 Buffer, BufferSize );
-       }
-       break;
-
-    case INFO_CLASS_PROTOCOL:
-       switch( InfoType ) {
-       case INFO_TYPE_PROVIDER:
-           switch( InfoId ) {
-           case IP_MIB_ADDRTABLE_ENTRY_ID:
-               Status = InfoTdiQueryGetAddrTable( Buffer, BufferSize );
-               break;
-
-           case IP_MIB_ROUTETABLE_ENTRY_ID:
-               Status = InfoTdiQueryGetRouteTable( Buffer, BufferSize );
-               break;
-
-           case IP_MIB_STATS_ID:
-               Status = InfoTdiQueryGetIPSnmpInfo( Buffer, BufferSize );
-               break;
-           }
-           break;
-       }
-    }
-
-    TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status));
-
-    return Status;
+TDI_STATUS InfoTdiSetRoute(PIP_INTERFACE IF, PIPROUTE_ENTRY Route)
+{
+    IP_ADDRESS Address, Netmask, Router;
+
+    AddrInitIPv4( &Address, Route->Dest );
+    AddrInitIPv4( &Netmask, Route->Mask );
+    AddrInitIPv4( &Router,  Route->Gw );
+
+    if( Route->Type == IP_ROUTE_TYPE_ADD ) { /* Add the route */
+        TI_DbgPrint(DEBUG_INFO,("Adding route (%s)\n", A2S(&Address)));
+       if (!RouterCreateRoute( &Address, &Netmask, &Router,
+                              IF, Route->Metric1))
+           return TDI_NO_RESOURCES;
+
+        return TDI_SUCCESS;
+     } else if( Route->Type == IP_ROUTE_TYPE_DEL ) {
+       TI_DbgPrint(DEBUG_INFO,("Removing route (%s)\n", A2S(&Address)));
+       if (NT_SUCCESS(RouterRemoveRoute( &Address, &Router )))
+            return TDI_SUCCESS;
+        else
+            return TDI_INVALID_PARAMETER;
+     }
+
+     return TDI_INVALID_REQUEST;
 }
 
-TDI_STATUS InfoNetworkLayerTdiSetEx( UINT InfoClass,
-                                    UINT InfoType,
-                                    UINT InfoId,
-                                    PVOID Context,
-                                    TDIEntityID *id,
-                                    PCHAR Buffer,
-                                    UINT BufferSize ) {
-    NTSTATUS Status = TDI_INVALID_REQUEST;
-    IP_ADDRESS Address;
-    IP_ADDRESS Netmask;
-    IP_ADDRESS Router;
-    PNEIGHBOR_CACHE_ENTRY NCE;
-
-    TI_DbgPrint(DEBUG_INFO,("Called\n"));
-
-    //OskitDumpBuffer( (OSK_PCHAR)Buffer, BufferSize );
-
-    if( InfoClass == INFO_CLASS_PROTOCOL &&
-       InfoType == INFO_TYPE_PROVIDER &&
-       InfoId == IP_MIB_ROUTETABLE_ENTRY_ID &&
-       id->tei_entity == CL_NL_ENTITY ) { /* Add or delete a route */
-       PIPROUTE_ENTRY Route = (PIPROUTE_ENTRY)Buffer;
-       AddrInitIPv4( &Address, Route->Dest );
-       AddrInitIPv4( &Netmask, Route->Mask );
-       AddrInitIPv4( &Router,  Route->Gw );
-
-       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 );
-           /* Really add the route */
-           if( NCE &&
-               RouterCreateRoute( &Address, &Netmask, &Router,
-                                  NCE->Interface, Route->Metric1 ) )
-               Status = STATUS_SUCCESS;
-           else
-               Status = STATUS_UNSUCCESSFUL;
-       } else if( Route->Type == IP_ROUTE_TYPE_DEL ) {
-           TI_DbgPrint(DEBUG_INFO,("Removing route (%s)\n", A2S(&Address)));
-           Status = RouterRemoveRoute( &Address, &Router );
-       } else Status = TDI_INVALID_REQUEST;
-    }
-
-    TI_DbgPrint(DEBUG_INFO,("Returning %x\n", Status));
-
-    return Status;
-}