From 7200f7a6ea787338279290e28fd111e7a5a494f0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Wed, 8 Oct 2014 21:58:10 +0000 Subject: [PATCH] reapply r64621 aka revert r64628, with various fixes: [WSHTCPIP] - Fix swapped function parameters [TCPIP] - Re-enable some code which got lost because of me being unable to decipher this indentation mess. svn path=/trunk/; revision=64629 --- reactos/dll/win32/wshtcpip/wshtcpip.c | 50 +++++++---- reactos/drivers/network/tcpip/CMakeLists.txt | 1 + reactos/drivers/network/tcpip/include/info.h | 5 ++ reactos/drivers/network/tcpip/include/tcp.h | 2 + reactos/drivers/network/tcpip/tcpip/cinfo.c | 32 +++++++ reactos/drivers/network/tcpip/tcpip/info.c | 88 ++++++++++++-------- reactos/include/psdk/tcpioctl.h | 3 + reactos/lib/drivers/ip/transport/tcp/tcp.c | 12 +++ reactos/lib/drivers/lwip/src/include/rosip.h | 3 +- reactos/lib/drivers/lwip/src/rostcp.c | 11 +++ 10 files changed, 153 insertions(+), 54 deletions(-) create mode 100644 reactos/drivers/network/tcpip/tcpip/cinfo.c diff --git a/reactos/dll/win32/wshtcpip/wshtcpip.c b/reactos/dll/win32/wshtcpip/wshtcpip.c index 546dec171d1..7620d6a3373 100644 --- a/reactos/dll/win32/wshtcpip/wshtcpip.c +++ b/reactos/dll/win32/wshtcpip/wshtcpip.c @@ -156,12 +156,18 @@ WSHGetSockaddrType( 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 @@ GetAddressOption(INT Level, INT OptionName) 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 @@ GetAddressOption(INT Level, INT OptionName) 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 @@ GetAddressOption(INT Level, INT OptionName) } DPRINT1("Unknown level/option name: %d %d\n", Level, OptionName); - return 0; + *TdiType = 0; + *TdiId = 0; } INT @@ -642,7 +654,7 @@ WSHSetSocketInformation( 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 @@ WSHSetSocketInformation( 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 @@ WSHSetSocketInformation( } /* If we get here, GetAddressOption must return something valid */ - RealOptionName = GetAddressOption(Level, OptionName); - ASSERT(RealOptionName != 0); + GetTdiTypeId(Level, OptionName, &TdiType, &TdiId); + ASSERT((TdiId != 0) && (TdiType != 0)); Info = HeapAlloc(GetProcessHeap(), 0, sizeof(*Info) + OptionLength); if (!Info) @@ -724,8 +738,8 @@ WSHSetSocketInformation( 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); diff --git a/reactos/drivers/network/tcpip/CMakeLists.txt b/reactos/drivers/network/tcpip/CMakeLists.txt index 317f11241d3..5a8230a8e9c 100644 --- a/reactos/drivers/network/tcpip/CMakeLists.txt +++ b/reactos/drivers/network/tcpip/CMakeLists.txt @@ -14,6 +14,7 @@ list(APPEND SOURCE datalink/lan.c tcpip/ainfo.c tcpip/buffer.c + tcpip/cinfo.c tcpip/dispatch.c tcpip/fileobjs.c tcpip/iinfo.c diff --git a/reactos/drivers/network/tcpip/include/info.h b/reactos/drivers/network/tcpip/include/info.h index a05b0b2944e..68012042630 100644 --- a/reactos/drivers/network/tcpip/include/info.h +++ b/reactos/drivers/network/tcpip/include/info.h @@ -183,6 +183,11 @@ TDI_STATUS GetAddressFileInfo(TDIObjectID *ID, 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 ); diff --git a/reactos/drivers/network/tcpip/include/tcp.h b/reactos/drivers/network/tcpip/include/tcp.h index c31293c0e0b..20147c77d79 100644 --- a/reactos/drivers/network/tcpip/include/tcp.h +++ b/reactos/drivers/network/tcpip/include/tcp.h @@ -186,6 +186,8 @@ NTSTATUS TCPShutdown( BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Connection, PIRP Irp ); +NTSTATUS TCPSetNoDelay(PCONNECTION_ENDPOINT Connection, BOOLEAN Set); + VOID TCPUpdateInterfaceLinkStatus(PIP_INTERFACE IF); diff --git a/reactos/drivers/network/tcpip/tcpip/cinfo.c b/reactos/drivers/network/tcpip/tcpip/cinfo.c new file mode 100644 index 00000000000..184532cc5ed --- /dev/null +++ b/reactos/drivers/network/tcpip/tcpip/cinfo.c @@ -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; +} diff --git a/reactos/drivers/network/tcpip/tcpip/info.c b/reactos/drivers/network/tcpip/tcpip/info.c index ac4174f0285..3dbe574a634 100644 --- a/reactos/drivers/network/tcpip/tcpip/info.c +++ b/reactos/drivers/network/tcpip/tcpip/info.c @@ -325,41 +325,59 @@ TDI_STATUS InfoTdiSetInformationEx switch (ID->toi_class) { - case INFO_CLASS_PROTOCOL: - if (ID->toi_type == INFO_TYPE_ADDRESS_OBJECT) - { - if ((EntityListContext = GetContext(ID->toi_entity))) - return SetAddressFileInfo(ID, EntityListContext, Buffer, BufferSize); - else - return TDI_INVALID_PARAMETER; - } - - switch (ID->toi_id) - { - case IP_MIB_ARPTABLE_ENTRY_ID: - if (ID->toi_type != INFO_TYPE_PROVIDER) - return TDI_INVALID_PARAMETER; - - if (ID->toi_entity.tei_entity == AT_ENTITY) - if ((EntityListContext = GetContext(ID->toi_entity))) - return InfoTdiSetArptableMIB(EntityListContext, - Buffer, BufferSize); - else - return TDI_INVALID_PARAMETER; - else if (ID->toi_entity.tei_entity == CL_NL_ENTITY || - ID->toi_entity.tei_entity == CO_NL_ENTITY) - if ((EntityListContext = GetContext(ID->toi_entity))) - return InfoTdiSetRoute(EntityListContext, Buffer, BufferSize); - else + case INFO_CLASS_PROTOCOL: + { + switch (ID->toi_type) + { + case INFO_TYPE_ADDRESS_OBJECT: + { + if ((EntityListContext = GetContext(ID->toi_entity))) + return SetAddressFileInfo(ID, EntityListContext, Buffer, BufferSize); + else return TDI_INVALID_PARAMETER; - else - return TDI_INVALID_PARAMETER; - - default: - return TDI_INVALID_REQUEST; - } - - default: - return TDI_INVALID_REQUEST; + } + 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); + } + case INFO_TYPE_PROVIDER: + { + switch (ID->toi_id) + { + case IP_MIB_ARPTABLE_ENTRY_ID: + if (ID->toi_type != INFO_TYPE_PROVIDER) + return TDI_INVALID_PARAMETER; + + if (ID->toi_entity.tei_entity == AT_ENTITY) + if ((EntityListContext = GetContext(ID->toi_entity))) + return InfoTdiSetArptableMIB(EntityListContext, Buffer, + BufferSize); + else + return TDI_INVALID_PARAMETER; + else if (ID->toi_entity.tei_entity == CL_NL_ENTITY + || ID->toi_entity.tei_entity == CO_NL_ENTITY) + if ((EntityListContext = GetContext(ID->toi_entity))) + return InfoTdiSetRoute(EntityListContext, Buffer, BufferSize); + else + return TDI_INVALID_PARAMETER; + else + return TDI_INVALID_PARAMETER; + + default: + return TDI_INVALID_REQUEST; + } + } + default: + DbgPrint("TCPIP: IOCTL_TCP_SET_INFORMATION_EX - Unrecognized information type for INFO_CLASS_PROTOCOL: %#x.\n", ID->toi_type); + return TDI_INVALID_PARAMETER; + } + break; + } + default: + DbgPrint("TCPIP: IOCTL_TCP_SET_INFORMATION_EX - Unrecognized information class %#x.\n", ID->toi_class); + return TDI_INVALID_REQUEST; } } diff --git a/reactos/include/psdk/tcpioctl.h b/reactos/include/psdk/tcpioctl.h index 28d0f351773..6817528ec42 100644 --- a/reactos/include/psdk/tcpioctl.h +++ b/reactos/include/psdk/tcpioctl.h @@ -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; diff --git a/reactos/lib/drivers/ip/transport/tcp/tcp.c b/reactos/lib/drivers/ip/transport/tcp/tcp.c index d29e93c2f0e..5d013be3531 100644 --- a/reactos/lib/drivers/ip/transport/tcp/tcp.c +++ b/reactos/lib/drivers/ip/transport/tcp/tcp.c @@ -674,4 +674,16 @@ BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Endpoint, PIRP Irp ) return Found; } +NTSTATUS +TCPSetNoDelay( + PCONNECTION_ENDPOINT Connection, + BOOLEAN Set) +{ + if (Connection->SocketContext == NULL) + return STATUS_UNSUCCESSFUL; + LibTCPSetNoDelay(Connection->SocketContext, Set); + return STATUS_SUCCESS; +} + + /* EOF */ diff --git a/reactos/lib/drivers/lwip/src/include/rosip.h b/reactos/lib/drivers/lwip/src/include/rosip.h index 9fa2b16cc3a..f8f5592ad5d 100755 --- a/reactos/lib/drivers/lwip/src/include/rosip.h +++ b/reactos/lib/drivers/lwip/src/include/rosip.h @@ -107,10 +107,11 @@ err_t LibTCPClose(PCONNECTION_ENDPOINT Connection, const int safe, const i 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 \ No newline at end of file +#endif diff --git a/reactos/lib/drivers/lwip/src/rostcp.c b/reactos/lib/drivers/lwip/src/rostcp.c index 44a865ab3ca..ea06d75a7f4 100755 --- a/reactos/lib/drivers/lwip/src/rostcp.c +++ b/reactos/lib/drivers/lwip/src/rostcp.c @@ -829,3 +829,14 @@ LibTCPGetPeerName(PTCP_PCB pcb, struct ip_addr * const ipaddr, u16_t * const por return ERR_OK; } + +void +LibTCPSetNoDelay( + PTCP_PCB pcb, + BOOLEAN Set) +{ + if (Set) + pcb->flags |= TF_NODELAY; + else + pcb->flags &= ~TF_NODELAY; +} -- 2.17.1