vcl: confirm reset on transport cleanup
[vpp.git] / src / vcl / vppcom.c
index dd50df1..947bf28 100644 (file)
@@ -784,9 +784,22 @@ vcl_session_cleanup_handler (vcl_worker_t * wrk, void *data)
       /* Transport was cleaned up before we confirmed close. Probably the
        * app is still waiting for some data that cannot be delivered.
        * Confirm close to make sure everything is cleaned up */
-      if (session->session_state == VCL_STATE_VPP_CLOSING)
-       vcl_session_cleanup (wrk, session, vcl_session_handle (session),
-                            1 /* do_disconnect */ );
+      if (session->session_state == VCL_STATE_VPP_CLOSING
+         || session->session_state == VCL_STATE_DISCONNECT)
+       {
+         vcl_session_cleanup (wrk, session, vcl_session_handle (session),
+                              1 /* do_disconnect */ );
+         /* Move to undetermined state to ensure that the session is not
+          * removed before both vpp and the app cleanup.
+          * - If the app closes first, the session is moved to CLOSED state
+          *   and the session cleanup notification from vpp removes the
+          *   session.
+          * - If vpp cleans up the session first, the session is moved to
+          *   DETACHED state lower and subsequently the close from the app
+          *   frees the session
+          */
+         session->session_state = VCL_STATE_UPDATED;
+       }
       return;
     }