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/wshtcpip... ============================================================================== --- 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/CMake... ============================================================================== --- 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/inclu... ============================================================================== --- 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/inclu... ============================================================================== --- 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/tcpip... ============================================================================== --- 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/tcpip... ============================================================================== --- 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?rev... ============================================================================== --- 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/tc... ============================================================================== --- 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/includ... ============================================================================== --- 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/rostcp... ============================================================================== --- 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; +}