- Leftover 2 from 42210
[reactos.git] / reactos / lib / drivers / ip / transport / tcp / if.c
index 225215e..d9598af 100644 (file)
@@ -30,30 +30,36 @@ struct      ifnet *ifnet;
  * parameters.
  */
 
-PVOID TCPPrepareInterface( PIP_INTERFACE IF ) {
+POSK_IFADDR TCPGetInterfaceData( PIP_INTERFACE IF ) {
     NTSTATUS Status;
-    POSK_IFADDR ifaddr = exAllocatePool
-       ( NonPagedPool, sizeof(*ifaddr) + 2 * sizeof( struct sockaddr_in ) );
-    if( !ifaddr ) return NULL;
-    struct sockaddr_in *addr_in = (struct sockaddr_in *)&ifaddr[1];
-    struct sockaddr_in *dstaddr_in = (struct sockaddr_in *)&addr_in[1];
+    POSK_IFADDR ifaddr = IF->TCPContext;
+    struct sockaddr_in *addr_in;
+    struct sockaddr_in *dstaddr_in;
+    ASSERT(ifaddr);
+
+    ASSERT_LOCKED(&TCPLock);
+
+    RtlZeroMemory(ifaddr, sizeof(OSK_IFADDR) + 2 * sizeof( struct sockaddr_in ));
+
+    addr_in = (struct sockaddr_in *)&ifaddr[1];
+    dstaddr_in = (struct sockaddr_in *)&addr_in[1];
 
     TI_DbgPrint(DEBUG_TCPIF,("Called\n"));
 
     ifaddr->ifa_dstaddr = (struct sockaddr *)dstaddr_in;
+
     /* XXX - Point-to-point interfaces not supported yet */
     memset( &ifaddr->ifa_dstaddr, 0, sizeof( struct sockaddr ) );
 
     ifaddr->ifa_addr = (struct sockaddr *)addr_in;
     Status = GetInterfaceIPv4Address( IF,
-                                     ADE_UNICAST,
-                                     (PULONG)&addr_in->sin_addr.s_addr );
+                      ADE_UNICAST,
+                      (PULONG)&addr_in->sin_addr.s_addr );
 
-    if( !NT_SUCCESS(Status) )
-       addr_in->sin_addr.s_addr = 0;
+    ASSERT(NT_SUCCESS(Status));
 
-    TI_DbgPrint(DEBUG_TCPIF,("Prepare interface %x : addr %x\n",
-                          IF, addr_in->sin_addr.s_addr));
+    TI_DbgPrint(DEBUG_TCPIF,("interface %x : addr %x\n",
+               IF, addr_in->sin_addr.s_addr));
 
     ifaddr->ifa_flags = 0; /* XXX what goes here? */
     ifaddr->ifa_refcnt = 0; /* Anachronistic */
@@ -65,24 +71,23 @@ PVOID TCPPrepareInterface( PIP_INTERFACE IF ) {
     return ifaddr;
 }
 
-VOID TCPDisposeInterfaceData( PVOID Ptr ) {
-    exFreePool( Ptr );
-}
-
 POSK_IFADDR TCPFindInterface( void *ClientData,
-                             OSK_UINT AddrType,
-                             OSK_UINT FindType,
-                             OSK_SOCKADDR *ReqAddr,
-                             OSK_IFADDR *Interface ) {
-    PNEIGHBOR_CACHE_ENTRY NCE;
+                  OSK_UINT AddrType,
+                  OSK_UINT FindType,
+                  OSK_SOCKADDR *ReqAddr,
+                  OSK_IFADDR *Interface ) {
+    PIP_INTERFACE IF;
     IP_ADDRESS Destination;
     struct sockaddr_in *addr_in = (struct sockaddr_in *)ReqAddr;
+    POSK_IFADDR InterfaceData;
+
+    ASSERT_LOCKED(&TCPLock);
 
     TI_DbgPrint(DEBUG_TCPIF,("called for type %d\n", FindType));
 
     if( !ReqAddr ) {
-       TI_DbgPrint(DEBUG_TCPIF,("no addr or no ifaddr (%x)\n", ReqAddr));
-       return NULL;
+    TI_DbgPrint(DEBUG_TCPIF,("no addr or no ifaddr (%x)\n", ReqAddr));
+    return NULL;
     }
 
     Destination.Type = IP_ADDRESS_V4;
@@ -90,23 +95,16 @@ POSK_IFADDR TCPFindInterface( void *ClientData,
 
     TI_DbgPrint(DEBUG_TCPIF,("Address is %x\n", addr_in->sin_addr.s_addr));
 
-    NCE = RouteGetRouteToDestination(&Destination);
+    IF = FindOnLinkInterface(&Destination);
+    if (!IF) return NULL;
 
-    if( !NCE || !NCE->Interface ) {
-       TI_DbgPrint(DEBUG_TCPIF,("no neighbor cache or no interface (%x %x)\n",
-                              NCE, NCE ? NCE->Interface : 0));
-       return NULL;
-    }
-
-    TI_DbgPrint(DEBUG_TCPIF,("NCE: %x\n", NCE));
-    TI_DbgPrint(DEBUG_TCPIF,("NCE->Interface: %x\n", NCE->Interface));
-    TI_DbgPrint(DEBUG_TCPIF,("NCE->Interface->TCPContext: %x\n",
-                          NCE->Interface->TCPContext));
+    InterfaceData = TCPGetInterfaceData(IF);
 
     addr_in = (struct sockaddr_in *)
-       ((POSK_IFADDR)NCE->Interface->TCPContext)->ifa_addr;
+    InterfaceData->ifa_addr;
+
     TI_DbgPrint(DEBUG_TCPIF,("returning addr %x\n", addr_in->sin_addr.s_addr));
 
-    return NCE->Interface->TCPContext;
+    return InterfaceData;
 }