- Set up the TCP interface data as needed in TCPFindInterface

svn path=/trunk/; revision=40933
This commit is contained in:
Cameron Gutman 2009-05-16 01:24:21 +00:00
parent 6c1741b0aa
commit 691ef7c32a
3 changed files with 22 additions and 31 deletions

View file

@ -158,10 +158,6 @@ NTSTATUS TCPSendData(
NTSTATUS TCPClose( PCONNECTION_ENDPOINT Connection ); NTSTATUS TCPClose( PCONNECTION_ENDPOINT Connection );
PVOID TCPPrepareInterface( PIP_INTERFACE IF );
VOID TCPDisposeInterfaceData( PVOID Data );
NTSTATUS TCPTranslateError( int OskitError ); NTSTATUS TCPTranslateError( int OskitError );
VOID TCPTimeout(); VOID TCPTimeout();

View file

@ -219,6 +219,13 @@ PIP_INTERFACE IPCreateInterface(
TcpipInitializeSpinLock(&IF->Lock); TcpipInitializeSpinLock(&IF->Lock);
IF->TCPContext = exAllocatePool
( NonPagedPool, sizeof(OSK_IFADDR) + 2 * sizeof( struct sockaddr_in ) );
if (!IF->TCPContext) {
exFreePool(IF);
return NULL;
}
#ifdef __NTDRIVER__ #ifdef __NTDRIVER__
InsertTDIInterfaceEntity( IF ); InsertTDIInterfaceEntity( IF );
#endif #endif
@ -241,6 +248,7 @@ VOID IPDestroyInterface(
RemoveTDIInterfaceEntity( IF ); RemoveTDIInterfaceEntity( IF );
#endif #endif
exFreePool(IF->TCPContext);
exFreePool(IF); exFreePool(IF);
} }
@ -263,9 +271,6 @@ VOID IPAddInterfaceRoute( PIP_INTERFACE IF ) {
TI_DbgPrint(MIN_TRACE, ("Could not add route due to insufficient resources.\n")); TI_DbgPrint(MIN_TRACE, ("Could not add route due to insufficient resources.\n"));
return; return;
} }
/* Allow TCP to hang some configuration on this interface */
IF->TCPContext = TCPPrepareInterface( IF );
} }
BOOLEAN IPRegisterInterface( BOOLEAN IPRegisterInterface(
@ -317,11 +322,6 @@ VOID IPRemoveInterfaceRoute( PIP_INTERFACE IF ) {
NCE = NBLocateNeighbor(&IF->Unicast); NCE = NBLocateNeighbor(&IF->Unicast);
if (NCE) if (NCE)
{ {
if ( IF->TCPContext ) {
TCPDisposeInterfaceData( IF->TCPContext );
IF->TCPContext = NULL;
}
TI_DbgPrint(DEBUG_IP,("Removing interface Addr %s\n", A2S(&IF->Unicast))); TI_DbgPrint(DEBUG_IP,("Removing interface Addr %s\n", A2S(&IF->Unicast)));
TI_DbgPrint(DEBUG_IP,(" Mask %s\n", A2S(&IF->Netmask))); TI_DbgPrint(DEBUG_IP,(" Mask %s\n", A2S(&IF->Netmask)));

View file

@ -30,17 +30,20 @@ struct ifnet *ifnet;
* parameters. * parameters.
*/ */
PVOID TCPPrepareInterface( PIP_INTERFACE IF ) { POSK_IFADDR TCPGetInterfaceData( PIP_INTERFACE IF ) {
NTSTATUS Status; NTSTATUS Status;
POSK_IFADDR ifaddr = exAllocatePool POSK_IFADDR ifaddr = IF->TCPContext;
( NonPagedPool, sizeof(*ifaddr) + 2 * sizeof( struct sockaddr_in ) ); ASSERT(ifaddr);
if( !ifaddr ) return NULL;
RtlZeroMemory(ifaddr, sizeof(OSK_IFADDR) + 2 * sizeof( struct sockaddr_in ));
struct sockaddr_in *addr_in = (struct sockaddr_in *)&ifaddr[1]; struct sockaddr_in *addr_in = (struct sockaddr_in *)&ifaddr[1];
struct sockaddr_in *dstaddr_in = (struct sockaddr_in *)&addr_in[1]; struct sockaddr_in *dstaddr_in = (struct sockaddr_in *)&addr_in[1];
TI_DbgPrint(DEBUG_TCPIF,("Called\n")); TI_DbgPrint(DEBUG_TCPIF,("Called\n"));
ifaddr->ifa_dstaddr = (struct sockaddr *)dstaddr_in; ifaddr->ifa_dstaddr = (struct sockaddr *)dstaddr_in;
/* XXX - Point-to-point interfaces not supported yet */ /* XXX - Point-to-point interfaces not supported yet */
memset( &ifaddr->ifa_dstaddr, 0, sizeof( struct sockaddr ) ); memset( &ifaddr->ifa_dstaddr, 0, sizeof( struct sockaddr ) );
@ -49,10 +52,9 @@ PVOID TCPPrepareInterface( PIP_INTERFACE IF ) {
ADE_UNICAST, ADE_UNICAST,
(PULONG)&addr_in->sin_addr.s_addr ); (PULONG)&addr_in->sin_addr.s_addr );
if( !NT_SUCCESS(Status) ) ASSERT(NT_SUCCESS(Status));
addr_in->sin_addr.s_addr = 0;
TI_DbgPrint(DEBUG_TCPIF,("Prepare interface %x : addr %x\n", TI_DbgPrint(DEBUG_TCPIF,("interface %x : addr %x\n",
IF, addr_in->sin_addr.s_addr)); IF, addr_in->sin_addr.s_addr));
ifaddr->ifa_flags = 0; /* XXX what goes here? */ ifaddr->ifa_flags = 0; /* XXX what goes here? */
@ -65,10 +67,6 @@ PVOID TCPPrepareInterface( PIP_INTERFACE IF ) {
return ifaddr; return ifaddr;
} }
VOID TCPDisposeInterfaceData( PVOID Ptr ) {
exFreePool( Ptr );
}
POSK_IFADDR TCPFindInterface( void *ClientData, POSK_IFADDR TCPFindInterface( void *ClientData,
OSK_UINT AddrType, OSK_UINT AddrType,
OSK_UINT FindType, OSK_UINT FindType,
@ -77,6 +75,7 @@ POSK_IFADDR TCPFindInterface( void *ClientData,
PIP_INTERFACE IF; PIP_INTERFACE IF;
IP_ADDRESS Destination; IP_ADDRESS Destination;
struct sockaddr_in *addr_in = (struct sockaddr_in *)ReqAddr; struct sockaddr_in *addr_in = (struct sockaddr_in *)ReqAddr;
POSK_IFADDR InterfaceData;
TI_DbgPrint(DEBUG_TCPIF,("called for type %d\n", FindType)); TI_DbgPrint(DEBUG_TCPIF,("called for type %d\n", FindType));
@ -91,19 +90,15 @@ POSK_IFADDR TCPFindInterface( void *ClientData,
TI_DbgPrint(DEBUG_TCPIF,("Address is %x\n", addr_in->sin_addr.s_addr)); TI_DbgPrint(DEBUG_TCPIF,("Address is %x\n", addr_in->sin_addr.s_addr));
IF = FindOnLinkInterface(&Destination); IF = FindOnLinkInterface(&Destination);
if (!IF) return NULL;
if (!IF || !IF->TCPContext) { InterfaceData = TCPGetInterfaceData(IF);
/* TCPContext can be NULL if we don't have an IP address yet */
TI_DbgPrint(DEBUG_TCPIF, ("No interface or TCP context (%x) (%x)\n",
IF, IF ? IF->TCPContext : 0));
return NULL;
}
addr_in = (struct sockaddr_in *) addr_in = (struct sockaddr_in *)
((POSK_IFADDR)IF->TCPContext)->ifa_addr; InterfaceData->ifa_addr;
TI_DbgPrint(DEBUG_TCPIF,("returning addr %x\n", addr_in->sin_addr.s_addr)); TI_DbgPrint(DEBUG_TCPIF,("returning addr %x\n", addr_in->sin_addr.s_addr));
return IF->TCPContext; return InterfaceData;
} }