[ros-diffs] [cgutman] 58896: [LWIP] - Call tcp_shutdown() two different times for TX|RX shutdown to avoid the tcp_close() problem entirely - Forcefully close the socket in LibTCPCloseCallback (not optimal, but...

cgutman at svn.reactos.org cgutman at svn.reactos.org
Tue Apr 30 09:33:40 UTC 2013


Author: cgutman
Date: Tue Apr 30 09:33:40 2013
New Revision: 58896

URL: http://svn.reactos.org/svn/reactos?rev=58896&view=rev
Log:
[LWIP]
- Call tcp_shutdown() two different times for TX|RX shutdown to avoid the tcp_close() problem entirely
- Forcefully close the socket in LibTCPCloseCallback (not optimal, but good enough)

Modified:
    trunk/reactos/lib/drivers/lwip/src/rostcp.c

Modified: trunk/reactos/lib/drivers/lwip/src/rostcp.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/lwip/src/rostcp.c?rev=58896&r1=58895&r2=58896&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/lwip/src/rostcp.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/lwip/src/rostcp.c [iso-8859-1] Tue Apr 30 09:33:40 2013
@@ -631,7 +631,14 @@
         goto done;
     }
 
-    msg->Output.Shutdown.Error = tcp_shutdown(pcb, msg->Input.Shutdown.shut_rx, msg->Input.Shutdown.shut_tx);
+    /* These need to be called separately, otherwise we get a tcp_close() */
+    if (msg->Input.Shutdown.shut_rx) {
+        msg->Output.Shutdown.Error = tcp_shutdown(pcb, TRUE, FALSE);
+    }
+    if (msg->Input.Shutdown.shut_tx) {
+        msg->Output.Shutdown.Error = tcp_shutdown(pcb, FALSE, TRUE);
+    }
+
     if (!msg->Output.Shutdown.Error)
     {
         if (msg->Input.Shutdown.shut_rx)
@@ -642,10 +649,6 @@
 
         if (msg->Input.Shutdown.shut_tx)
             msg->Input.Shutdown.Connection->SendShutdown = TRUE;
-            
-        /* Shutting down both sides is like a close to LwIP, so clear the context */
-        if (msg->Input.Shutdown.shut_rx && msg->Input.Shutdown.shut_tx)
-            msg->Input.Shutdown.Connection->SocketContext = NULL;
     }
 
 done:
@@ -706,7 +709,6 @@
         case CLOSED:
         case LISTEN:
         case SYN_SENT:
-        case CLOSE_WAIT:
            msg->Output.Close.Error = tcp_close(pcb);
 
            if (!msg->Output.Close.Error && msg->Input.Close.Callback)
@@ -714,8 +716,9 @@
            break;
 
         default:
-           /* Start the graceful close process (or send RST for pending data) */
-           msg->Output.Close.Error = tcp_close(pcb);
+           /* Abort the socket */
+           tcp_abort(pcb);
+           msg->Output.Close.Error = ERR_OK;
            break;
     }
 




More information about the Ros-diffs mailing list