vcl/ldp: add write msg function and fine tuning
[vpp.git] / src / vcl / vppcom.c
index 86bb214..a94df84 100644 (file)
@@ -410,7 +410,7 @@ vcl_flag_accepted_session (vcl_session_t * session, u64 handle, u32 flags)
       accepted_msg = &session->accept_evts_fifo[i];
       if (accepted_msg->accepted_msg.handle == handle)
        {
-         accepted_msg->flags = flags;
+         accepted_msg->flags |= flags;
          return 1;
        }
     }
@@ -431,8 +431,6 @@ vcl_session_reset_handler (vcl_worker_t * wrk,
       VDBG (0, "request to reset unknown handle 0x%llx", reset_msg->handle);
       return VCL_INVALID_SESSION_INDEX;
     }
-  if (session->session_state >= STATE_VPP_CLOSING)
-    return sid;
 
   /* Caught a reset before actually accepting the session */
   if (session->session_state == STATE_LISTEN)
@@ -446,8 +444,6 @@ vcl_session_reset_handler (vcl_worker_t * wrk,
 
   session->session_state = STATE_DISCONNECT;
   VDBG (0, "reset session %u [0x%llx]", sid, reset_msg->handle);
-  vcl_send_session_reset_reply (vcl_session_vpp_evt_q (wrk, session),
-                               wrk->my_client_index, reset_msg->handle, 0);
   return sid;
 }
 
@@ -509,7 +505,8 @@ vcl_session_accepted (vcl_worker_t * wrk, session_accepted_msg_t * msg)
 
   session = vcl_session_get_w_vpp_handle (wrk, msg->handle);
   if (PREDICT_FALSE (session != 0))
-    VWRN ("session handle overlap %lu!", msg->handle);
+    VWRN ("session overlap handle %lu state %u!", msg->handle,
+         session->session_state);
 
   session = vcl_session_table_lookup_listener (wrk, msg->listener_handle);
   if (!session)
@@ -1119,6 +1116,12 @@ vppcom_session_close (uint32_t session_handle)
                          getpid (), vpp_handle, session_handle,
                          rv, vppcom_retval_str (rv));
        }
+      else if (state == STATE_DISCONNECT)
+       {
+         svm_msg_q_t *mq = vcl_session_vpp_evt_q (wrk, session);
+         vcl_send_session_reset_reply (mq, wrk->my_client_index,
+                                       session->vpp_handle, 0);
+       }
     }
 
 cleanup:
@@ -1378,19 +1381,10 @@ handle:
    */
   if (accept_flags)
     {
-      svm_msg_q_t *mq = vcl_session_vpp_evt_q (wrk, client_session);
       if (accept_flags & VCL_ACCEPTED_F_CLOSED)
-       {
-         client_session->session_state = STATE_DISCONNECT;
-         vcl_send_session_disconnected_reply (mq, wrk->my_client_index,
-                                              client_session->vpp_handle, 0);
-       }
+       client_session->session_state = STATE_VPP_CLOSING;
       else if (accept_flags & VCL_ACCEPTED_F_RESET)
-       {
-         client_session->session_state = STATE_DISCONNECT;
-         vcl_send_session_reset_reply (mq, wrk->my_client_index,
-                                       client_session->vpp_handle, 0);
-       }
+       client_session->session_state = STATE_DISCONNECT;
     }
   return vcl_session_handle (client_session);
 }
@@ -1524,9 +1518,8 @@ vppcom_session_read_internal (uint32_t session_handle, void *buf, int n,
       session_state_t state = s->session_state;
       rv = ((state & STATE_DISCONNECT) ? VPPCOM_ECONNRESET : VPPCOM_ENOTCONN);
 
-      VDBG (0, "VCL<%d>: vpp handle 0x%llx, sid %u: %s session is not open! "
-           "state 0x%x (%s), returning %d (%s)",
-           getpid (), s->vpp_handle, session_handle, state,
+      VDBG (0, "session handle %u[0x%llx] is not open! state 0x%x (%s),"
+           " returning %d (%s)", session_handle, s->vpp_handle, state,
            vppcom_session_state_str (state), rv, vppcom_retval_str (rv));
       return rv;
     }
@@ -1831,6 +1824,14 @@ vppcom_session_write (uint32_t session_handle, void *buf, size_t n)
                                      0 /* is_flush */ );
 }
 
+int
+vppcom_session_write_msg (uint32_t session_handle, void *buf, size_t n)
+{
+  return vppcom_session_write_inline (session_handle, buf, n,
+                                     1 /* is_flush */ );
+}
+
+
 static vcl_session_t *
 vcl_ct_session_get_from_fifo (vcl_worker_t * wrk, svm_fifo_t * f, u8 type)
 {