Author: jgardou
Date: Wed Oct 8 19:50:38 2014
New Revision: 64621
URL:
http://svn.reactos.org/svn/reactos?rev=64621&view=rev
Log:
[WSHTCPIP]
- Implement IPPROTO_TCP:TCP_NODELAY case in WSHSetSocketInformation
[TCPIP]
- Implement setting TCP_SOCKET_NODELAY connection property.
Added:
trunk/reactos/drivers/network/tcpip/tcpip/cinfo.c (with props)
Modified:
trunk/reactos/dll/win32/wshtcpip/wshtcpip.c
trunk/reactos/drivers/network/tcpip/CMakeLists.txt
trunk/reactos/drivers/network/tcpip/include/info.h
trunk/reactos/drivers/network/tcpip/include/tcp.h
trunk/reactos/drivers/network/tcpip/tcpip/info.c
trunk/reactos/include/psdk/tcpioctl.h
trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c
trunk/reactos/lib/drivers/lwip/src/include/rosip.h
trunk/reactos/lib/drivers/lwip/src/rostcp.c
Modified: trunk/reactos/dll/win32/wshtcpip/wshtcpip.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/wshtcpip/wshtcpi…
==============================================================================
--- trunk/reactos/dll/win32/wshtcpip/wshtcpip.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/wshtcpip/wshtcpip.c [iso-8859-1] Wed Oct 8 19:50:38 2014
@@ -156,12 +156,18 @@
return NO_ERROR;
}
-UINT
-GetAddressOption(INT Level, INT OptionName)
+static
+void
+GetTdiTypeId(
+ _In_ INT Level,
+ _In_ INT OptionName,
+ _Out_ PULONG TdiType,
+ _Out_ PULONG TdiId)
{
switch (Level)
{
case SOL_SOCKET:
+ *TdiType = INFO_TYPE_ADDRESS_OBJECT;
switch (OptionName)
{
case SO_KEEPALIVE:
@@ -174,21 +180,26 @@
break;
case IPPROTO_IP:
+ *TdiType = INFO_TYPE_ADDRESS_OBJECT;
switch (OptionName)
{
case IP_TTL:
- return AO_OPTION_TTL;
+ *TdiId = AO_OPTION_TTL;
+ return;
case IP_DONTFRAGMENT:
- return AO_OPTION_IP_DONTFRAGMENT;
+ *TdiId = AO_OPTION_IP_DONTFRAGMENT;
+ return;
#if 0
case IP_RECEIVE_BROADCAST:
- return AO_OPTION_BROADCAST;
+ *TdiId = AO_OPTION_BROADCAST;
+ return;
#endif
case IP_HDRINCL:
- return AO_OPTION_IP_HDRINCL;
+ *TdiId = AO_OPTION_IP_HDRINCL;
+ return;
default:
break;
@@ -198,10 +209,10 @@
case IPPROTO_TCP:
switch (OptionName)
{
+ *TdiType = INFO_TYPE_CONNECTION;
case TCP_NODELAY:
- /* FIXME: Return proper option */
- ASSERT(FALSE);
- break;
+ *TdiId = TCP_SOCKET_NODELAY;
+ return;
default:
break;
}
@@ -211,7 +222,8 @@
}
DPRINT1("Unknown level/option name: %d %d\n", Level, OptionName);
- return 0;
+ *TdiType = 0;
+ *TdiId = 0;
}
INT
@@ -642,7 +654,7 @@
IN INT OptionLength)
{
PSOCKET_CONTEXT Context = HelperDllSocketContext;
- UINT RealOptionName;
+ ULONG TdiType, TdiId;
INT Status;
PTCP_REQUEST_SET_INFORMATION_EX Info;
PQUEUED_REQUEST Queued, NextQueued;
@@ -697,9 +709,11 @@
switch (OptionName)
{
case TCP_NODELAY:
- /* FIXME -- Send this to TCPIP */
- DPRINT1("Set: TCP_NODELAY not yet supported\n");
- return 0;
+ if (OptionLength < sizeof(CHAR))
+ {
+ return WSAEFAULT;
+ }
+ break;
default:
/* Invalid option */
@@ -714,8 +728,8 @@
}
/* If we get here, GetAddressOption must return something valid */
- RealOptionName = GetAddressOption(Level, OptionName);
- ASSERT(RealOptionName != 0);
+ GetTdiTypeId(Level, OptionName, &TdiId, &TdiType);
+ ASSERT((TdiId != 0) && (TdiType != 0));
Info = HeapAlloc(GetProcessHeap(), 0, sizeof(*Info) + OptionLength);
if (!Info)
@@ -724,8 +738,8 @@
Info->ID.toi_entity.tei_entity = Context->AddrFileEntityType;
Info->ID.toi_entity.tei_instance = Context->AddrFileInstance;
Info->ID.toi_class = INFO_CLASS_PROTOCOL;
- Info->ID.toi_type = INFO_TYPE_ADDRESS_OBJECT;
- Info->ID.toi_id = RealOptionName;
+ Info->ID.toi_type = TdiType;
+ Info->ID.toi_id = TdiId;
Info->BufferSize = OptionLength;
memcpy(Info->Buffer, OptionValue, OptionLength);
Modified: trunk/reactos/drivers/network/tcpip/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/CMak…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/CMakeLists.txt [iso-8859-1] Wed Oct 8 19:50:38
2014
@@ -14,6 +14,7 @@
datalink/lan.c
tcpip/ainfo.c
tcpip/buffer.c
+ tcpip/cinfo.c
tcpip/dispatch.c
tcpip/fileobjs.c
tcpip/iinfo.c
Modified: trunk/reactos/drivers/network/tcpip/include/info.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/incl…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/include/info.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/include/info.h [iso-8859-1] Wed Oct 8 19:50:38
2014
@@ -183,6 +183,11 @@
PVOID Buffer,
PUINT BufferSize);
+TDI_STATUS SetConnectionInfo(TDIObjectID *ID,
+ PCONNECTION_ENDPOINT Connection,
+ PVOID Buffer,
+ UINT BufferSize);
+
/* Insert and remove entities */
VOID InsertTDIInterfaceEntity( PIP_INTERFACE Interface );
Modified: trunk/reactos/drivers/network/tcpip/include/tcp.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/incl…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/include/tcp.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/include/tcp.h [iso-8859-1] Wed Oct 8 19:50:38
2014
@@ -186,6 +186,8 @@
BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Connection, PIRP Irp );
+NTSTATUS TCPSetNoDelay(PCONNECTION_ENDPOINT Connection, BOOLEAN Set);
+
VOID
TCPUpdateInterfaceLinkStatus(PIP_INTERFACE IF);
Added: trunk/reactos/drivers/network/tcpip/tcpip/cinfo.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpi…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/cinfo.c (added)
+++ trunk/reactos/drivers/network/tcpip/tcpip/cinfo.c [iso-8859-1] Wed Oct 8 19:50:38
2014
@@ -0,0 +1,32 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS TCP/IP protocol driver
+ * FILE: tcpip/cinfo.c
+ * PURPOSE: Per-socket connection information.
+ * PROGRAMMER: Jérôme Gardou
+ */
+
+#include "precomp.h"
+
+TDI_STATUS SetConnectionInfo(TDIObjectID *ID,
+ PCONNECTION_ENDPOINT Connection,
+ PVOID Buffer,
+ UINT BufferSize)
+{
+ ASSERT(ID->toi_type == INFO_TYPE_CONNECTION);
+ switch (ID->toi_id)
+ {
+ case TCP_SOCKET_NODELAY:
+ {
+ BOOLEAN Set;
+ if (BufferSize < sizeof(BOOLEAN))
+ return TDI_INVALID_PARAMETER;
+ Set = *(BOOLEAN*)Buffer;
+ return TCPSetNoDelay(Connection, Set);
+ }
+ default:
+ DbgPrint("TCPIP: Unknown connection info ID: %u.\n",
ID->toi_id);
+ }
+
+ return TDI_INVALID_PARAMETER;
+}
Propchange: trunk/reactos/drivers/network/tcpip/tcpip/cinfo.c
------------------------------------------------------------------------------
charset = UTF-8
Propchange: trunk/reactos/drivers/network/tcpip/tcpip/cinfo.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: trunk/reactos/drivers/network/tcpip/tcpip/cinfo.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: trunk/reactos/drivers/network/tcpip/tcpip/info.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpi…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/info.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/tcpip/info.c [iso-8859-1] Wed Oct 8 19:50:38
2014
@@ -326,12 +326,25 @@
switch (ID->toi_class)
{
case INFO_CLASS_PROTOCOL:
- if (ID->toi_type == INFO_TYPE_ADDRESS_OBJECT)
+ switch (ID->toi_type)
{
- if ((EntityListContext = GetContext(ID->toi_entity)))
- return SetAddressFileInfo(ID, EntityListContext, Buffer, BufferSize);
- else
- return TDI_INVALID_PARAMETER;
+ case INFO_TYPE_ADDRESS_OBJECT:
+ {
+ if ((EntityListContext = GetContext(ID->toi_entity)))
+ return SetAddressFileInfo(ID, EntityListContext, Buffer,
BufferSize);
+ else
+ return TDI_INVALID_PARAMETER;
+ }
+ case INFO_TYPE_CONNECTION:
+ {
+ PADDRESS_FILE AddressFile = GetContext(ID->toi_entity);
+ if (AddressFile == NULL)
+ return TDI_INVALID_PARAMETER;
+ return SetConnectionInfo(ID, AddressFile->Connection, Buffer,
BufferSize);
+ }
+ default:
+ DbgPrint("TCPIP: IOCTL_TCP_SET_INFORMATION_EX - Unrecognized
information type for INFO_CLASS_PROTOCOL: 0x%#x.\n", ID->toi_type);
+ return TDI_INVALID_PARAMETER;
}
switch (ID->toi_id)
Modified: trunk/reactos/include/psdk/tcpioctl.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/tcpioctl.h?re…
==============================================================================
--- trunk/reactos/include/psdk/tcpioctl.h [iso-8859-1] (original)
+++ trunk/reactos/include/psdk/tcpioctl.h [iso-8859-1] Wed Oct 8 19:50:38 2014
@@ -90,6 +90,9 @@
#define AO_OPTION_UNBIND 37
#define AO_OPTION_PROTECT 38
+/* TCP connection options */
+#define TCP_SOCKET_NODELAY 1
+
typedef struct IFEntry
{
ULONG if_index;
Modified: trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/t…
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] Wed Oct 8 19:50:38
2014
@@ -674,4 +674,16 @@
return Found;
}
+NTSTATUS
+TCPSetNoDelay(
+ PCONNECTION_ENDPOINT Connection,
+ BOOLEAN Set)
+{
+ if (Connection->SocketContext == NULL)
+ return STATUS_UNSUCCESSFUL;
+ LibTCPSetNoDelay(Connection->SocketContext, Set);
+ return STATUS_SUCCESS;
+}
+
+
/* EOF */
Modified: trunk/reactos/lib/drivers/lwip/src/include/rosip.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/lwip/src/inclu…
==============================================================================
--- trunk/reactos/lib/drivers/lwip/src/include/rosip.h [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/lwip/src/include/rosip.h [iso-8859-1] Wed Oct 8 19:50:38
2014
@@ -107,10 +107,11 @@
err_t LibTCPGetPeerName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const
port);
err_t LibTCPGetHostName(PTCP_PCB pcb, struct ip_addr *const ipaddr, u16_t *const
port);
void LibTCPAccept(PTCP_PCB pcb, struct tcp_pcb *listen_pcb, void *arg);
+void LibTCPSetNoDelay(PTCP_PCB pcb, BOOLEAN Set);
/* IP functions */
void LibIPInsertPacket(void *ifarg, const void *const data, const u32_t size);
void LibIPInitialize(void);
void LibIPShutdown(void);
-#endif
+#endif
Modified: trunk/reactos/lib/drivers/lwip/src/rostcp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/lwip/src/rostc…
==============================================================================
--- trunk/reactos/lib/drivers/lwip/src/rostcp.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/lwip/src/rostcp.c [iso-8859-1] Wed Oct 8 19:50:38 2014
@@ -829,3 +829,14 @@
return ERR_OK;
}
+
+void
+LibTCPSetNoDelay(
+ PTCP_PCB pcb,
+ BOOLEAN Set)
+{
+ if (Set)
+ pcb->flags |= TF_NODELAY;
+ else
+ pcb->flags &= ~TF_NODELAY;
+}