diff --git a/reactos/drivers/lib/ip/network/ip.c b/reactos/drivers/lib/ip/network/ip.c index ef23f27b5d1..b25b1424696 100644 --- a/reactos/drivers/lib/ip/network/ip.c +++ b/reactos/drivers/lib/ip/network/ip.c @@ -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 (!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); diff --git a/reactos/drivers/lib/ip/transport/tcp/if.c b/reactos/drivers/lib/ip/transport/tcp/if.c index 729bc0eabee..027e68d71bb 100644 --- a/reactos/drivers/lib/ip/transport/tcp/if.c +++ b/reactos/drivers/lib/ip/transport/tcp/if.c @@ -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, diff --git a/reactos/drivers/net/tcpip/include/ip.h b/reactos/drivers/net/tcpip/include/ip.h index 68950cebcee..98c8f39b483 100644 --- a/reactos/drivers/net/tcpip/include/ip.h +++ b/reactos/drivers/net/tcpip/include/ip.h @@ -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); diff --git a/reactos/drivers/net/tcpip/include/tcp.h b/reactos/drivers/net/tcpip/include/tcp.h index 8279db48685..14914bc4f5b 100644 --- a/reactos/drivers/net/tcpip/include/tcp.h +++ b/reactos/drivers/net/tcpip/include/tcp.h @@ -156,6 +156,8 @@ NTSTATUS TCPClose( PCONNECTION_ENDPOINT Connection ); PVOID TCPPrepareInterface( PIP_INTERFACE IF ); +VOID TCPDisposeInterfaceData( PVOID Data ); + NTSTATUS TCPTranslateError( int OskitError ); VOID TCPTimeout(); diff --git a/reactos/drivers/net/tcpip/tcpip/dispatch.c b/reactos/drivers/net/tcpip/tcpip/dispatch.c index 0f25e9e41a5..efd261fa28e 100644 --- a/reactos/drivers/net/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/net/tcpip/tcpip/dispatch.c @@ -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; diff --git a/reactos/drivers/net/tcpip/tcpip/main.c b/reactos/drivers/net/tcpip/tcpip/main.c index ca9e274ff95..275cbf0416f 100644 --- a/reactos/drivers/net/tcpip/tcpip/main.c +++ b/reactos/drivers/net/tcpip/tcpip/main.c @@ -9,7 +9,7 @@ */ #include "precomp.h" -//#define NDEBUG +#define NDEBUG #ifndef NDEBUG DWORD DebugTraceLevel = DEBUG_ULTRA & ~(DEBUG_LOCK | DEBUG_PBUFFER); diff --git a/reactos/drivers/net/tcpip/tcpip/ninfo.c b/reactos/drivers/net/tcpip/tcpip/ninfo.c index 85409b37694..59578a98588 100644 --- a/reactos/drivers/net/tcpip/tcpip/ninfo.c +++ b/reactos/drivers/net/tcpip/tcpip/ninfo.c @@ -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;