Author: cgutman
Date: Mon Jul  4 18:07:55 2011
New Revision: 52538

URL: http://svn.reactos.org/svn/reactos?rev=52538&view=rev
Log:
[AFD]
- Add support for AFD_INFO_INLINING_MODE
- Add support for setting AFD_INFO_RECEIVE_WINDOW_SIZE and 
AFD_INFO_SEND_WINDOW_SIZE
- None of this is used by our current msafd but mswsock_new uses it

Modified:
    trunk/reactos/drivers/network/afd/afd/connect.c
    trunk/reactos/drivers/network/afd/afd/info.c
    trunk/reactos/drivers/network/afd/include/afd.h

Modified: trunk/reactos/drivers/network/afd/afd/connect.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/connect.c?rev=52538&r1=52537&r2=52538&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/connect.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/connect.c [iso-8859-1] Mon Jul  4 
18:07:55 2011
@@ -223,26 +223,33 @@
     ASSERT(!FCB->Recv.Window);
     ASSERT(!FCB->Send.Window);
 
-    Status = TdiQueryMaxDatagramLength(FCB->Connection.Object,
-                                       &FCB->Send.Size);
-    if (!NT_SUCCESS(Status))
-        return Status;
-
-    FCB->Recv.Size = FCB->Send.Size;
+    if (!FCB->Recv.Size)
+    {
+        Status = TdiQueryMaxDatagramLength(FCB->Connection.Object,
+                                           &FCB->Recv.Size);
+        if (!NT_SUCCESS(Status))
+            return Status;
+    }
+
+    if (!FCB->Send.Size)
+    {
+        Status = TdiQueryMaxDatagramLength(FCB->Connection.Object,
+                                           &FCB->Send.Size);
+        if (!NT_SUCCESS(Status))
+            return Status;
+    }
 
     /* Allocate the receive area and start receiving */
-    FCB->Recv.Window =
-       ExAllocatePool( PagedPool, FCB->Recv.Size );
-
-    if( !FCB->Recv.Window ) return STATUS_NO_MEMORY;
-
-    FCB->Send.Window =
-       ExAllocatePool( PagedPool, FCB->Send.Size );
-
-    if( !FCB->Send.Window ) {
-       ExFreePool( FCB->Recv.Window );
-       FCB->Recv.Window = NULL;
-       return STATUS_NO_MEMORY;
+    if (!FCB->Recv.Window)
+    {
+        FCB->Recv.Window = ExAllocatePool( PagedPool, FCB->Recv.Size );
+        if( !FCB->Recv.Window ) return STATUS_NO_MEMORY;
+    }
+
+    if (!FCB->Send.Window)
+    {
+        FCB->Send.Window = ExAllocatePool( PagedPool, FCB->Send.Size );
+        if( !FCB->Send.Window ) return STATUS_NO_MEMORY;
     }
 
     FCB->State = SOCKET_STATE_CONNECTED;

Modified: trunk/reactos/drivers/network/afd/afd/info.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/info.c?rev=52538&r1=52537&r2=52538&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] Mon Jul  4 
18:07:55 2011
@@ -50,6 +50,10 @@
        case AFD_INFO_BLOCKING_MODE:
            InfoReq->Information.Boolean = FCB->NonBlocking;
            break;
+            
+    case AFD_INFO_INLINING_MODE:
+        InfoReq->Information.Boolean = FCB->OobInline;
+        break;
 
     case AFD_INFO_RECEIVE_CONTENT_SIZE:
         /* Only touch InfoReq if a socket has been set up.
@@ -106,6 +110,7 @@
     PAFD_INFO InfoReq = LockRequest(Irp, IrpSp);
     PFILE_OBJECT FileObject = IrpSp->FileObject;
     PAFD_FCB FCB = FileObject->FsContext;
+    PCHAR NewBuffer;
 
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
     
@@ -117,6 +122,61 @@
         case AFD_INFO_BLOCKING_MODE:
           AFD_DbgPrint(MID_TRACE,("Blocking mode set to %d\n", 
InfoReq->Information.Boolean));
           FCB->NonBlocking = InfoReq->Information.Boolean;
+          break;
+        case AFD_INFO_INLINING_MODE:
+          FCB->OobInline = InfoReq->Information.Boolean;
+          break;
+        case AFD_INFO_RECEIVE_WINDOW_SIZE:
+          NewBuffer = ExAllocatePool(PagedPool, InfoReq->Information.Ulong);
+          if (NewBuffer)
+          {
+              if (FCB->Recv.Content > InfoReq->Information.Ulong)
+                  FCB->Recv.Content = InfoReq->Information.Ulong;
+              
+              if (FCB->Recv.Window)
+              {
+                  RtlCopyMemory(NewBuffer,
+                                FCB->Recv.Window,
+                                FCB->Recv.Content);
+                  
+                  ExFreePool(FCB->Recv.Window);
+              }
+              
+              FCB->Recv.Size = InfoReq->Information.Ulong;
+              FCB->Recv.Window = NewBuffer;
+              
+              Status = STATUS_SUCCESS;
+          }
+          else
+          {
+              Status = STATUS_NO_MEMORY;
+          }
+          break;
+        case AFD_INFO_SEND_WINDOW_SIZE:
+          NewBuffer = ExAllocatePool(PagedPool, InfoReq->Information.Ulong);
+          if (NewBuffer)
+          {
+              if (FCB->Send.BytesUsed > InfoReq->Information.Ulong)
+                  FCB->Send.BytesUsed = InfoReq->Information.Ulong;
+                  
+              if (FCB->Send.Window)
+              {
+                  RtlCopyMemory(NewBuffer,
+                                FCB->Send.Window,
+                                FCB->Send.BytesUsed);
+                  
+                  ExFreePool(FCB->Send.Window);
+              }
+                  
+              FCB->Send.Size = InfoReq->Information.Ulong;
+              FCB->Send.Window = NewBuffer;
+                  
+              Status = STATUS_SUCCESS;
+          }
+          else
+          {
+              Status = STATUS_NO_MEMORY;
+          }
           break;
         default:
           AFD_DbgPrint(MIN_TRACE,("Unknown request %d\n", 
InfoReq->InformationClass));

Modified: trunk/reactos/drivers/network/afd/include/afd.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/include/afd.h?rev=52538&r1=52537&r2=52538&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/include/afd.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/include/afd.h [iso-8859-1] Mon Jul  4 
18:07:55 2011
@@ -173,7 +173,7 @@
 } AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
 
 typedef struct _AFD_FCB {
-    BOOLEAN Locked, Critical, Overread, NonBlocking;
+    BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline;
     UINT State, Flags, GroupID, GroupType;
     KIRQL OldIrql;
     UINT LockCount;


Reply via email to