mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 07:02:56 +00:00
[OSKITTCP]
- Check for a shutdown connection that we missed a few times - Remove some junk and stop playing with flags behind oskit's back - Fix an invalid parameter check - Enable a check to ensure that accept doesn't get called for a socket that isn't listening - Use the queue manipulation function instead of manually changing the queue - Signal that we accepted/connected a socket [IP] - Set the network mask and destination address in TCPGetInterfaceData svn path=/trunk/; revision=48686
This commit is contained in:
parent
33fffd0b38
commit
93ae36ab99
3 changed files with 34 additions and 45 deletions
|
@ -163,7 +163,7 @@ PIP_INTERFACE IPCreateInterface(
|
||||||
TcpipInitializeSpinLock(&IF->Lock);
|
TcpipInitializeSpinLock(&IF->Lock);
|
||||||
|
|
||||||
IF->TCPContext = ExAllocatePoolWithTag
|
IF->TCPContext = ExAllocatePoolWithTag
|
||||||
( NonPagedPool, sizeof(OSK_IFADDR) + 2 * sizeof( struct sockaddr_in ),
|
( NonPagedPool, sizeof(OSK_IFADDR) + 3 * sizeof( struct sockaddr_in ),
|
||||||
OSKITTCP_CONTEXT_TAG );
|
OSKITTCP_CONTEXT_TAG );
|
||||||
if (!IF->TCPContext) {
|
if (!IF->TCPContext) {
|
||||||
ExFreePoolWithTag(IF, IP_INTERFACE_TAG);
|
ExFreePoolWithTag(IF, IP_INTERFACE_TAG);
|
||||||
|
|
|
@ -35,20 +35,17 @@ POSK_IFADDR TCPGetInterfaceData( PIP_INTERFACE IF ) {
|
||||||
POSK_IFADDR ifaddr = IF->TCPContext;
|
POSK_IFADDR ifaddr = IF->TCPContext;
|
||||||
struct sockaddr_in *addr_in;
|
struct sockaddr_in *addr_in;
|
||||||
struct sockaddr_in *dstaddr_in;
|
struct sockaddr_in *dstaddr_in;
|
||||||
|
struct sockaddr_in *netmask_in;
|
||||||
ASSERT(ifaddr);
|
ASSERT(ifaddr);
|
||||||
|
|
||||||
RtlZeroMemory(ifaddr, sizeof(OSK_IFADDR) + 2 * sizeof( struct sockaddr_in ));
|
RtlZeroMemory(ifaddr, sizeof(OSK_IFADDR) + 3 * sizeof( struct sockaddr_in ));
|
||||||
|
|
||||||
addr_in = (struct sockaddr_in *)&ifaddr[1];
|
addr_in = (struct sockaddr_in *)&ifaddr[1];
|
||||||
dstaddr_in = (struct sockaddr_in *)&addr_in[1];
|
dstaddr_in = (struct sockaddr_in *)&addr_in[1];
|
||||||
|
netmask_in = (struct sockaddr_in *)&dstaddr_in[1];
|
||||||
|
|
||||||
TI_DbgPrint(DEBUG_TCPIF,("Called\n"));
|
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;
|
ifaddr->ifa_addr = (struct sockaddr *)addr_in;
|
||||||
Status = GetInterfaceIPv4Address( IF,
|
Status = GetInterfaceIPv4Address( IF,
|
||||||
ADE_UNICAST,
|
ADE_UNICAST,
|
||||||
|
@ -56,10 +53,24 @@ POSK_IFADDR TCPGetInterfaceData( PIP_INTERFACE IF ) {
|
||||||
|
|
||||||
ASSERT(NT_SUCCESS(Status));
|
ASSERT(NT_SUCCESS(Status));
|
||||||
|
|
||||||
|
ifaddr->ifa_dstaddr = (struct sockaddr *)dstaddr_in;
|
||||||
|
Status = GetInterfaceIPv4Address(IF,
|
||||||
|
ADE_POINTOPOINT,
|
||||||
|
(PULONG)&dstaddr_in->sin_addr.s_addr );
|
||||||
|
|
||||||
|
ASSERT(NT_SUCCESS(Status));
|
||||||
|
|
||||||
|
ifaddr->ifa_netmask = (struct sockaddr *)netmask_in;
|
||||||
|
Status = GetInterfaceIPv4Address(IF,
|
||||||
|
ADE_ADDRMASK,
|
||||||
|
(PULONG)&netmask_in->sin_addr.s_addr );
|
||||||
|
|
||||||
|
ASSERT(NT_SUCCESS(Status));
|
||||||
|
|
||||||
TI_DbgPrint(DEBUG_TCPIF,("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;
|
||||||
ifaddr->ifa_refcnt = 0; /* Anachronistic */
|
ifaddr->ifa_refcnt = 0; /* Anachronistic */
|
||||||
ifaddr->ifa_metric = 1; /* We can get it like in ninfo.c, if we want */
|
ifaddr->ifa_metric = 1; /* We can get it like in ninfo.c, if we want */
|
||||||
ifaddr->ifa_mtu = IF->MTU;
|
ifaddr->ifa_mtu = IF->MTU;
|
||||||
|
|
|
@ -151,6 +151,9 @@ int OskitTCPRecv( void *connection,
|
||||||
struct iovec iov = { 0 };
|
struct iovec iov = { 0 };
|
||||||
int error = 0;
|
int error = 0;
|
||||||
int tcp_flags = 0;
|
int tcp_flags = 0;
|
||||||
|
|
||||||
|
if (!connection)
|
||||||
|
return OSK_ESHUTDOWN;
|
||||||
|
|
||||||
OS_DbgPrint(OSK_MID_TRACE,
|
OS_DbgPrint(OSK_MID_TRACE,
|
||||||
("so->so_state %x\n", ((struct socket *)connection)->so_state));
|
("so->so_state %x\n", ((struct socket *)connection)->so_state));
|
||||||
|
@ -218,14 +221,12 @@ int OskitTCPConnect( void *socket, void *nam, OSK_UINT namelen ) {
|
||||||
struct sockaddr addr;
|
struct sockaddr addr;
|
||||||
|
|
||||||
OS_DbgPrint(OSK_MID_TRACE,("Called, socket = %08x\n", socket));
|
OS_DbgPrint(OSK_MID_TRACE,("Called, socket = %08x\n", socket));
|
||||||
|
|
||||||
OSKLock();
|
if (!socket)
|
||||||
if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
|
return OSK_ESHUTDOWN;
|
||||||
error = EALREADY;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
OS_DbgPrint(OSK_MIN_TRACE,("Nam: %x\n", nam));
|
OS_DbgPrint(OSK_MIN_TRACE,("Nam: %x\n", nam));
|
||||||
|
|
||||||
if( nam )
|
if( nam )
|
||||||
addr = *((struct sockaddr *)nam);
|
addr = *((struct sockaddr *)nam);
|
||||||
|
|
||||||
|
@ -236,26 +237,12 @@ int OskitTCPConnect( void *socket, void *nam, OSK_UINT namelen ) {
|
||||||
addr.sa_family = addr.sa_len;
|
addr.sa_family = addr.sa_len;
|
||||||
addr.sa_len = sizeof(struct sockaddr);
|
addr.sa_len = sizeof(struct sockaddr);
|
||||||
|
|
||||||
|
OSKLock();
|
||||||
error = soconnect(so, &sabuf);
|
error = soconnect(so, &sabuf);
|
||||||
|
|
||||||
if (error == EINPROGRESS)
|
|
||||||
goto done;
|
|
||||||
else if (error)
|
|
||||||
goto bad;
|
|
||||||
|
|
||||||
if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
|
|
||||||
error = EINPROGRESS;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
bad:
|
|
||||||
so->so_state &= ~SS_ISCONNECTING;
|
|
||||||
|
|
||||||
if (error == ERESTART)
|
|
||||||
error = EINTR;
|
|
||||||
|
|
||||||
done:
|
|
||||||
OSKUnlock();
|
OSKUnlock();
|
||||||
|
|
||||||
|
if (error == 0) error = OSK_EINPROGRESS;
|
||||||
|
|
||||||
OS_DbgPrint(OSK_MID_TRACE,("Ending: %08x\n", error));
|
OS_DbgPrint(OSK_MID_TRACE,("Ending: %08x\n", error));
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
@ -347,14 +334,12 @@ int OskitTCPAccept( void *socket,
|
||||||
if (!socket)
|
if (!socket)
|
||||||
return OSK_ESHUTDOWN;
|
return OSK_ESHUTDOWN;
|
||||||
|
|
||||||
if (!new_socket || !AddrOut)
|
if (!new_socket)
|
||||||
return OSK_EINVAL;
|
return OSK_EINVAL;
|
||||||
|
|
||||||
OS_DbgPrint(OSK_MID_TRACE,("OSKITTCP: Doing accept (Finish %d)\n",
|
OS_DbgPrint(OSK_MID_TRACE,("OSKITTCP: Doing accept (Finish %d)\n",
|
||||||
FinishAccepting));
|
FinishAccepting));
|
||||||
|
|
||||||
*OutAddrLen = AddrLen;
|
|
||||||
|
|
||||||
if (name)
|
if (name)
|
||||||
/* that's a copyin actually */
|
/* that's a copyin actually */
|
||||||
namelen = *OutAddrLen;
|
namelen = *OutAddrLen;
|
||||||
|
@ -363,19 +348,17 @@ int OskitTCPAccept( void *socket,
|
||||||
|
|
||||||
s = splnet();
|
s = splnet();
|
||||||
|
|
||||||
#if 0
|
|
||||||
if ((head->so_options & SO_ACCEPTCONN) == 0) {
|
if ((head->so_options & SO_ACCEPTCONN) == 0) {
|
||||||
OS_DbgPrint(OSK_MID_TRACE,("OSKITTCP: head->so_options = %x, wanted bit %x\n",
|
OS_DbgPrint(OSK_MID_TRACE,("OSKITTCP: head->so_options = %x, wanted bit %x\n",
|
||||||
head->so_options, SO_ACCEPTCONN));
|
head->so_options, SO_ACCEPTCONN));
|
||||||
error = EINVAL;
|
error = EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
OS_DbgPrint(OSK_MID_TRACE,("head->so_q = %x, head->so_state = %x\n",
|
OS_DbgPrint(OSK_MID_TRACE,("head->so_q = %x, head->so_state = %x\n",
|
||||||
head->so_q, head->so_state));
|
head->so_q, head->so_state));
|
||||||
|
|
||||||
if ((head->so_state & SS_NBIO) && head->so_q == NULL) {
|
if (head->so_q == NULL) {
|
||||||
error = EWOULDBLOCK;
|
error = EWOULDBLOCK;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -395,8 +378,6 @@ int OskitTCPAccept( void *socket,
|
||||||
|
|
||||||
OS_DbgPrint(OSK_MID_TRACE,("error = %d\n", error));
|
OS_DbgPrint(OSK_MID_TRACE,("error = %d\n", error));
|
||||||
if( FinishAccepting && so ) {
|
if( FinishAccepting && so ) {
|
||||||
head->so_q = so->so_q;
|
|
||||||
head->so_qlen--;
|
|
||||||
|
|
||||||
mnam.m_data = (char *)&sa;
|
mnam.m_data = (char *)&sa;
|
||||||
mnam.m_len = sizeof(sa);
|
mnam.m_len = sizeof(sa);
|
||||||
|
@ -405,12 +386,9 @@ int OskitTCPAccept( void *socket,
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
InitializeSocketFlags(so);
|
soqremque(so, 1);
|
||||||
so->so_state |= SS_ISCONNECTED;
|
|
||||||
so->so_q = so->so_q0 = NULL;
|
|
||||||
so->so_qlen = so->so_q0len = 0;
|
|
||||||
so->so_head = 0;
|
|
||||||
so->so_connection = context;
|
so->so_connection = context;
|
||||||
|
soisconnected(so);
|
||||||
|
|
||||||
*newso = so;
|
*newso = so;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue