* 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 */
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;
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;
}