reapply r64621 aka revert r64628, with various fixes:
authorJérôme Gardou <jerome.gardou@reactos.org>
Wed, 8 Oct 2014 21:58:10 +0000 (21:58 +0000)
committerJérôme Gardou <jerome.gardou@reactos.org>
Wed, 8 Oct 2014 21:58:10 +0000 (21:58 +0000)
[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
reactos/drivers/network/tcpip/CMakeLists.txt
reactos/drivers/network/tcpip/include/info.h
reactos/drivers/network/tcpip/include/tcp.h
reactos/drivers/network/tcpip/tcpip/cinfo.c [new file with mode: 0644]
reactos/drivers/network/tcpip/tcpip/info.c
reactos/include/psdk/tcpioctl.h
reactos/lib/drivers/ip/transport/tcp/tcp.c
reactos/lib/drivers/lwip/src/include/rosip.h
reactos/lib/drivers/lwip/src/rostcp.c

index 546dec1..7620d6a 100644 (file)
@@ -156,12 +156,18 @@ WSHGetSockaddrType(
     return NO_ERROR;
 }
 
     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:
 {
     switch (Level)
     {
        case SOL_SOCKET:
+          *TdiType = INFO_TYPE_ADDRESS_OBJECT;
           switch (OptionName)
           {
              case SO_KEEPALIVE:
           switch (OptionName)
           {
              case SO_KEEPALIVE:
@@ -174,21 +180,26 @@ GetAddressOption(INT Level, INT OptionName)
           break;
 
        case IPPROTO_IP:
           break;
 
        case IPPROTO_IP:
+          *TdiType = INFO_TYPE_ADDRESS_OBJECT;
           switch (OptionName)
           {
              case IP_TTL:
           switch (OptionName)
           {
              case IP_TTL:
-                return AO_OPTION_TTL;
+                *TdiId = AO_OPTION_TTL;
+                return;
 
              case IP_DONTFRAGMENT:
 
              case IP_DONTFRAGMENT:
-                return AO_OPTION_IP_DONTFRAGMENT;
+                 *TdiId = AO_OPTION_IP_DONTFRAGMENT;
+                 return;
 
 #if 0
              case IP_RECEIVE_BROADCAST:
 
 #if 0
              case IP_RECEIVE_BROADCAST:
-                return AO_OPTION_BROADCAST;
+                 *TdiId = AO_OPTION_BROADCAST;
+                 return;
 #endif
 
              case IP_HDRINCL:
 #endif
 
              case IP_HDRINCL:
-                return AO_OPTION_IP_HDRINCL;
+                 *TdiId = AO_OPTION_IP_HDRINCL;
+                 return;
 
              default:
                 break;
 
              default:
                 break;
@@ -198,10 +209,10 @@ GetAddressOption(INT Level, INT OptionName)
        case IPPROTO_TCP:
           switch (OptionName)
           {
        case IPPROTO_TCP:
           switch (OptionName)
           {
+              *TdiType = INFO_TYPE_CONNECTION;
              case TCP_NODELAY:
              case TCP_NODELAY:
-                 /* FIXME: Return proper option */
-                 ASSERT(FALSE);
-                 break;
+                 *TdiId = TCP_SOCKET_NODELAY;
+                 return;
              default:
                  break;
           }
              default:
                  break;
           }
@@ -211,7 +222,8 @@ GetAddressOption(INT Level, INT OptionName)
     }
 
     DPRINT1("Unknown level/option name: %d %d\n", Level, OptionName);
     }
 
     DPRINT1("Unknown level/option name: %d %d\n", Level, OptionName);
-    return 0;
+    *TdiType = 0;
+    *TdiId = 0;
 }
 
 INT
 }
 
 INT
@@ -642,7 +654,7 @@ WSHSetSocketInformation(
     IN  INT OptionLength)
 {
     PSOCKET_CONTEXT Context = HelperDllSocketContext;
     IN  INT OptionLength)
 {
     PSOCKET_CONTEXT Context = HelperDllSocketContext;
-    UINT RealOptionName;
+    ULONG TdiType, TdiId;
     INT Status;
     PTCP_REQUEST_SET_INFORMATION_EX Info;
     PQUEUED_REQUEST Queued, NextQueued;
     INT Status;
     PTCP_REQUEST_SET_INFORMATION_EX Info;
     PQUEUED_REQUEST Queued, NextQueued;
@@ -697,9 +709,11 @@ WSHSetSocketInformation(
             switch (OptionName)
             {
                 case TCP_NODELAY:
             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 */
 
                 default:
                     /* Invalid option */
@@ -714,8 +728,8 @@ WSHSetSocketInformation(
     }
 
     /* If we get here, GetAddressOption must return something valid */
     }
 
     /* 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)
 
     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_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);
 
     Info->BufferSize = OptionLength;
     memcpy(Info->Buffer, OptionValue, OptionLength);
 
index 317f112..5a8230a 100644 (file)
@@ -14,6 +14,7 @@ list(APPEND SOURCE
     datalink/lan.c
     tcpip/ainfo.c
     tcpip/buffer.c
     datalink/lan.c
     tcpip/ainfo.c
     tcpip/buffer.c
+    tcpip/cinfo.c
     tcpip/dispatch.c
     tcpip/fileobjs.c
     tcpip/iinfo.c
     tcpip/dispatch.c
     tcpip/fileobjs.c
     tcpip/iinfo.c
index a05b0b2..6801204 100644 (file)
@@ -183,6 +183,11 @@ TDI_STATUS GetAddressFileInfo(TDIObjectID *ID,
                               PVOID Buffer,
                               PUINT BufferSize);
 
                               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 );
 
 /* Insert and remove entities */
 VOID InsertTDIInterfaceEntity( PIP_INTERFACE Interface );
 
index c31293c..20147c7 100644 (file)
@@ -186,6 +186,8 @@ NTSTATUS TCPShutdown(
 
 BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Connection, PIRP Irp );
 
 
 BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Connection, PIRP Irp );
 
+NTSTATUS TCPSetNoDelay(PCONNECTION_ENDPOINT Connection, BOOLEAN Set);
+
 VOID
 TCPUpdateInterfaceLinkStatus(PIP_INTERFACE IF);
 
 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 (file)
index 0000000..184532c
--- /dev/null
@@ -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;
+}
index ac4174f..3dbe574 100644 (file)
@@ -325,41 +325,59 @@ TDI_STATUS InfoTdiSetInformationEx
 
     switch (ID->toi_class)
     {
 
     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;
                         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;
     }
 }
     }
 }
index 28d0f35..6817528 100644 (file)
@@ -90,6 +90,9 @@
 #define AO_OPTION_UNBIND            37
 #define AO_OPTION_PROTECT           38
 
 #define AO_OPTION_UNBIND            37
 #define AO_OPTION_PROTECT           38
 
+/* TCP connection options */
+#define TCP_SOCKET_NODELAY 1
+
 typedef struct IFEntry
 {
     ULONG if_index;
 typedef struct IFEntry
 {
     ULONG if_index;
index d29e93c..5d013be 100644 (file)
@@ -674,4 +674,16 @@ BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Endpoint, PIRP Irp )
     return Found;
 }
 
     return Found;
 }
 
+NTSTATUS
+TCPSetNoDelay(
+    PCONNECTION_ENDPOINT Connection,
+    BOOLEAN Set)
+{
+    if (Connection->SocketContext == NULL)
+        return STATUS_UNSUCCESSFUL;
+    LibTCPSetNoDelay(Connection->SocketContext, Set);
+    return STATUS_SUCCESS;
+}
+
+
 /* EOF */
 /* EOF */
index 9fa2b16..f8f5592 100755 (executable)
@@ -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);
 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);
 
 
 /* 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
index 44a865a..ea06d75 100755 (executable)
@@ -829,3 +829,14 @@ LibTCPGetPeerName(PTCP_PCB pcb, struct ip_addr * const ipaddr, u16_t * const por
 
     return ERR_OK;
 }
 
     return ERR_OK;
 }
+
+void
+LibTCPSetNoDelay(
+    PTCP_PCB pcb,
+    BOOLEAN Set)
+{
+    if (Set)
+        pcb->flags |= TF_NODELAY;
+    else
+        pcb->flags &= ~TF_NODELAY;
+}