Needed infrastructure for DHCP: 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. Modified: trunk/reactos/drivers/lib/ip/network/ip.c Modified: trunk/reactos/drivers/lib/ip/transport/tcp/if.c Modified: trunk/reactos/drivers/net/tcpip/include/ip.h Modified: trunk/reactos/drivers/net/tcpip/include/tcp.h Modified: trunk/reactos/drivers/net/tcpip/tcpip/dispatch.c Modified: trunk/reactos/drivers/net/tcpip/tcpip/main.c Modified: trunk/reactos/drivers/net/tcpip/tcpip/ninfo.c _____
Modified: trunk/reactos/drivers/lib/ip/network/ip.c --- trunk/reactos/drivers/lib/ip/network/ip.c 2005-04-17 04:20:16 UTC (rev 14643) +++ trunk/reactos/drivers/lib/ip/network/ip.c 2005-04-17 07:55:24 UTC (rev 14644) @@ -232,7 +232,28 @@
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 @@ 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,39 +283,38 @@ } } 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; - } + IPAddInterfaceRoute( IF );
- 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")); - } - /* 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 @@ */ { 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); _____
Modified: trunk/reactos/drivers/lib/ip/transport/tcp/if.c --- trunk/reactos/drivers/lib/ip/transport/tcp/if.c 2005-04-17 04:20:16 UTC (rev 14643) +++ trunk/reactos/drivers/lib/ip/transport/tcp/if.c 2005-04-17 07:55:24 UTC (rev 14644) @@ -65,6 +65,10 @@
return ifaddr; }
+VOID TCPDisposeInterfaceData( PVOID Ptr ) { + exFreePool( Ptr ); +} + POSK_IFADDR TCPFindInterface( void *ClientData, OSK_UINT AddrType, OSK_UINT FindType, _____
Modified: trunk/reactos/drivers/net/tcpip/include/ip.h --- trunk/reactos/drivers/net/tcpip/include/ip.h 2005-04-17 04:20:16 UTC (rev 14643) +++ trunk/reactos/drivers/net/tcpip/include/ip.h 2005-04-17 07:55:24 UTC (rev 14644) @@ -207,6 +207,12 @@
PIP_INTERFACE IPCreateInterface( PLLIP_BIND_INFO BindInfo);
+VOID IPAddInterfaceRoute( + PIP_INTERFACE IF); + +VOID IPRemoveInterfaceRoute( + PIP_INTERFACE IF); + VOID IPDestroyInterface( PIP_INTERFACE IF);
_____
Modified: trunk/reactos/drivers/net/tcpip/include/tcp.h --- trunk/reactos/drivers/net/tcpip/include/tcp.h 2005-04-17 04:20:16 UTC (rev 14643) +++ trunk/reactos/drivers/net/tcpip/include/tcp.h 2005-04-17 07:55:24 UTC (rev 14644) @@ -156,6 +156,8 @@
PVOID TCPPrepareInterface( PIP_INTERFACE IF );
+VOID TCPDisposeInterfaceData( PVOID Data ); + NTSTATUS TCPTranslateError( int OskitError );
VOID TCPTimeout(); _____
Modified: trunk/reactos/drivers/net/tcpip/tcpip/dispatch.c --- trunk/reactos/drivers/net/tcpip/tcpip/dispatch.c 2005-04-17 04:20:16 UTC (rev 14643) +++ trunk/reactos/drivers/net/tcpip/tcpip/dispatch.c 2005-04-17 07:55:24 UTC (rev 14644) @@ -1483,10 +1483,20 @@
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; _____
Modified: trunk/reactos/drivers/net/tcpip/tcpip/main.c --- trunk/reactos/drivers/net/tcpip/tcpip/main.c 2005-04-17 04:20:16 UTC (rev 14643) +++ trunk/reactos/drivers/net/tcpip/tcpip/main.c 2005-04-17 07:55:24 UTC (rev 14644) @@ -9,7 +9,7 @@
*/ #include "precomp.h"
-//#define NDEBUG +#define NDEBUG
#ifndef NDEBUG DWORD DebugTraceLevel = DEBUG_ULTRA & ~(DEBUG_LOCK | DEBUG_PBUFFER); _____
Modified: trunk/reactos/drivers/net/tcpip/tcpip/ninfo.c --- trunk/reactos/drivers/net/tcpip/tcpip/ninfo.c 2005-04-17 04:20:16 UTC (rev 14643) +++ trunk/reactos/drivers/net/tcpip/tcpip/ninfo.c 2005-04-17 07:55:24 UTC (rev 14644) @@ -30,7 +30,7 @@
TcpipAcquireSpinLock(&InterfaceListLock, &OldIrql);
ForEachInterface(CurrentIF) { - IpCurrent->Index = Count; + IpCurrent->Index = CurrentIF->Index; IpCurrent->Addr = 0; IpCurrent->BcastAddr = 0; IpCurrent->Mask = 0;