Needed infrastructure for DHCP:
authorArt Yerkes <art.yerkes@gmail.com>
Sun, 17 Apr 2005 07:55:24 +0000 (07:55 +0000)
committerArt Yerkes <art.yerkes@gmail.com>
Sun, 17 Apr 2005 07:55:24 +0000 (07:55 +0000)
Corrected adapter index problem in iinfo.c.  Now the index returned is from
 IF->Index.
ninfo: ditto.
ip.c: Expose IPAddInterfaceRoute and IPRemoveInterfaceRoute for use by
 set ip address IOCTL.
if.c: Allow deleting of TCP context.
main.c: Turn off debugging in CVS.

svn path=/trunk/; revision=14644

reactos/drivers/lib/ip/network/ip.c
reactos/drivers/lib/ip/transport/tcp/if.c
reactos/drivers/net/tcpip/include/ip.h
reactos/drivers/net/tcpip/include/tcp.h
reactos/drivers/net/tcpip/tcpip/dispatch.c
reactos/drivers/net/tcpip/tcpip/main.c
reactos/drivers/net/tcpip/tcpip/ninfo.c

index ef23f27..b25b142 100644 (file)
@@ -232,6 +232,27 @@ VOID IPDestroyInterface(
     exFreePool(IF);
 }
 
+VOID IPAddInterfaceRoute( PIP_INTERFACE IF ) {
+    PNEIGHBOR_CACHE_ENTRY NCE;
+    IP_ADDRESS NetworkAddress;
+
+    /* Add a permanent neighbor for this NTE */
+    NCE = NBAddNeighbor(IF, &IF->Unicast, 
+                       IF->Address, IF->AddressLength, 
+                       NUD_PERMANENT);
+    if (!NCE) {
+       TI_DbgPrint(MIN_TRACE, ("Could not create NCE.\n"));
+    }
+    
+    AddrWidenAddress( &NetworkAddress, &IF->Unicast, &IF->Netmask );
+
+    if (!RouterAddRoute(&NetworkAddress, &IF->Netmask, NCE, 1)) {
+       TI_DbgPrint(MIN_TRACE, ("Could not add route due to insufficient resources.\n"));
+    }
+
+    /* Allow TCP to hang some configuration on this interface */
+    IF->TCPContext = TCPPrepareInterface( IF );
+}
 
 BOOLEAN IPRegisterInterface(
     PIP_INTERFACE IF)
@@ -246,8 +267,6 @@ BOOLEAN IPRegisterInterface(
     KIRQL OldIrql;
     UINT ChosenIndex = 1;
     BOOLEAN IndexHasBeenChosen;
-    IP_ADDRESS NetworkAddress;
-    PNEIGHBOR_CACHE_ENTRY NCE;
     IF_LIST_ITER(Interface);
 
     TI_DbgPrint(MID_TRACE, ("Called. IF (0x%X).\n", IF));
@@ -264,38 +283,37 @@ BOOLEAN IPRegisterInterface(
             }
         } EndFor(Interface);
     } while( !IndexHasBeenChosen );
-
-    IF->Index = ChosenIndex;
-
-    /* Add a permanent neighbor for this NTE */
-    NCE = NBAddNeighbor(IF, &IF->Unicast, 
-                       IF->Address, IF->AddressLength, 
-                       NUD_PERMANENT);
-    if (!NCE) {
-       TI_DbgPrint(MIN_TRACE, ("Could not create NCE.\n"));
-       TcpipReleaseSpinLock(&IF->Lock, OldIrql);
-       return FALSE;
-    }
     
-    AddrWidenAddress( &NetworkAddress, &IF->Unicast, &IF->Netmask );
+    IF->Index = ChosenIndex;
 
-    if (!RouterAddRoute(&NetworkAddress, &IF->Netmask, NCE, 1)) {
-       TI_DbgPrint(MIN_TRACE, ("Could not add route due to insufficient resources.\n"));
-    }
+    IPAddInterfaceRoute( IF );
     
     /* Add interface to the global interface list */
     TcpipInterlockedInsertTailList(&InterfaceListHead, 
                                   &IF->ListEntry, 
                                   &InterfaceListLock);
 
-    /* Allow TCP to hang some configuration on this interface */
-    IF->TCPContext = TCPPrepareInterface( IF );
-
     TcpipReleaseSpinLock(&IF->Lock, OldIrql);
 
     return TRUE;
 }
 
+VOID IPRemoveInterfaceRoute( PIP_INTERFACE IF ) {
+    PNEIGHBOR_CACHE_ENTRY NCE;
+    IP_ADDRESS GeneralRoute;
+
+    TCPDisposeInterfaceData( IF->TCPContext );
+    IF->TCPContext = NULL;
+
+    AddrWidenAddress(&GeneralRoute,&IF->Unicast,&IF->Netmask);
+    RouterRemoveRoute(&GeneralRoute, &IF->Unicast);
+    
+    /* Remove permanent NCE, but first we have to find it */
+    NCE = NBLocateNeighbor(&IF->Unicast);
+    if (NCE)
+       NBRemoveNeighbor(NCE);
+
+}
 
 VOID IPUnregisterInterface(
     PIP_INTERFACE IF)
@@ -306,15 +324,11 @@ VOID IPUnregisterInterface(
  */
 {
     KIRQL OldIrql3;
-    PNEIGHBOR_CACHE_ENTRY NCE;
 
     TI_DbgPrint(DEBUG_IP, ("Called. IF (0x%X).\n", IF));
 
-    /* Remove permanent NCE, but first we have to find it */
-    NCE = NBLocateNeighbor(&IF->Unicast);
-    if (NCE)
-       NBRemoveNeighbor(NCE);
-    
+    IPRemoveInterfaceRoute( IF );
+
     TcpipAcquireSpinLock(&InterfaceListLock, &OldIrql3);
     RemoveEntryList(&IF->ListEntry);
     TcpipReleaseSpinLock(&InterfaceListLock, OldIrql3);
index 729bc0e..027e68d 100644 (file)
@@ -65,6 +65,10 @@ PVOID TCPPrepareInterface( PIP_INTERFACE IF ) {
     return ifaddr;
 }
 
+VOID TCPDisposeInterfaceData( PVOID Ptr ) {
+    exFreePool( Ptr );
+}
+
 POSK_IFADDR TCPFindInterface( void *ClientData,
                              OSK_UINT AddrType,
                              OSK_UINT FindType,
index 68950ce..98c8f39 100644 (file)
@@ -207,6 +207,12 @@ PIP_PACKET IPInitializePacket(
 PIP_INTERFACE IPCreateInterface(
     PLLIP_BIND_INFO BindInfo);
 
+VOID IPAddInterfaceRoute(
+    PIP_INTERFACE IF);
+
+VOID IPRemoveInterfaceRoute(
+    PIP_INTERFACE IF);
+
 VOID IPDestroyInterface(
     PIP_INTERFACE IF);
 
index 8279db4..14914bc 100644 (file)
@@ -156,6 +156,8 @@ NTSTATUS TCPClose( PCONNECTION_ENDPOINT Connection );
 
 PVOID TCPPrepareInterface( PIP_INTERFACE IF );
 
+VOID TCPDisposeInterfaceData( PVOID Data );
+
 NTSTATUS TCPTranslateError( int OskitError );
 
 VOID TCPTimeout();
index 0f25e9e..efd261f 100644 (file)
@@ -1483,10 +1483,20 @@ NTSTATUS DispTdiSetIPAddress( PIRP Irp, PIO_STACK_LOCATION IrpSp ) {
             break;
         }
         if( IF->Index == IpAddrChange->NteIndex ) {
+            IPRemoveInterfaceRoute( IF );
+
             IF->Unicast.Type = IP_ADDRESS_V4;
             IF->Unicast.Address.IPv4Address = IpAddrChange->Address;
             IF->Netmask.Type = IP_ADDRESS_V4;
             IF->Netmask.Address.IPv4Address = IpAddrChange->Netmask;
+
+            TI_DbgPrint(MID_TRACE,("New Unicast Address: %x\n", 
+                                   IF->Unicast.Address.IPv4Address));
+            TI_DbgPrint(MID_TRACE,("New Netmask        : %x\n", 
+                                   IF->Netmask.Address.IPv4Address));
+
+            IPAddInterfaceRoute( IF );
+    
             IpAddrChange->Address = IF->Index;
             Status = STATUS_SUCCESS;
             Irp->IoStatus.Information = IF->Index;
index ca9e274..275cbf0 100644 (file)
@@ -9,7 +9,7 @@
  */
 #include "precomp.h"
 
-//#define NDEBUG
+#define NDEBUG
 
 #ifndef NDEBUG
 DWORD DebugTraceLevel = DEBUG_ULTRA & ~(DEBUG_LOCK | DEBUG_PBUFFER);
index 85409b3..59578a9 100644 (file)
@@ -30,7 +30,7 @@ TDI_STATUS InfoTdiQueryGetAddrTable( PNDIS_BUFFER Buffer,
     TcpipAcquireSpinLock(&InterfaceListLock, &OldIrql);
     
     ForEachInterface(CurrentIF) {
-       IpCurrent->Index     = Count;
+       IpCurrent->Index     = CurrentIF->Index;
        IpCurrent->Addr      = 0;
        IpCurrent->BcastAddr = 0;
        IpCurrent->Mask      = 0;