vcl/ldp: add write msg function and fine tuning
[vpp.git] / src / vcl / vppcom.c
index a456ed0..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)
@@ -795,7 +792,11 @@ vcl_intercept_sigchld_handler (int signum, siginfo_t * si, void *uc)
   if (vcl_get_worker_index () == ~0)
     return;
 
-  sigaction (SIGCHLD, &old_sa, 0);
+  if (sigaction (SIGCHLD, &old_sa, 0))
+    {
+      VERR ("couldn't restore sigchld");
+      exit (-1);
+    }
 
   wrk = vcl_worker_get_current ();
   if (wrk->forked_child == ~0)
@@ -1115,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:
@@ -1374,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);
 }
@@ -1520,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;
     }
@@ -1827,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)
 {
@@ -2538,7 +2543,8 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
       ASSERT (e->fifo->client_thread_index == vcl_get_worker_index ());
       vcl_fifo_rx_evt_valid_or_break (e->fifo);
       sid = e->fifo->client_session_index;
-      session = vcl_session_get (wrk, sid);
+      if (!(session = vcl_session_get (wrk, sid)))
+       break;
       session_events = session->vep.ev.events;
       if (!(EPOLLIN & session->vep.ev.events) || session->has_rx_evt)
        break;
@@ -2549,7 +2555,8 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
       break;
     case FIFO_EVENT_APP_TX:
       sid = e->fifo->client_session_index;
-      session = vcl_session_get (wrk, sid);
+      if (!(session = vcl_session_get (wrk, sid)))
+       break;
       session_events = session->vep.ev.events;
       if (!(EPOLLOUT & session_events))
        break;
@@ -2560,6 +2567,8 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
     case SESSION_IO_EVT_CT_TX:
       vcl_fifo_rx_evt_valid_or_break (e->fifo);
       session = vcl_ct_session_get_from_fifo (wrk, e->fifo, 0);
+      if (PREDICT_FALSE (!session))
+       break;
       sid = session->session_index;
       session_events = session->vep.ev.events;
       if (!(EPOLLIN & session->vep.ev.events) || session->has_rx_evt)
@@ -2571,6 +2580,8 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
       break;
     case SESSION_IO_EVT_CT_RX:
       session = vcl_ct_session_get_from_fifo (wrk, e->fifo, 1);
+      if (PREDICT_FALSE (!session))
+       break;
       sid = session->session_index;
       session_events = session->vep.ev.events;
       if (!(EPOLLOUT & session_events))
@@ -2598,7 +2609,8 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
       vcl_session_connected_handler (wrk, connected_msg);
       /* Generate EPOLLOUT because there's no connected event */
       sid = vcl_session_index_from_vpp_handle (wrk, connected_msg->handle);
-      session = vcl_session_get (wrk, sid);
+      if (!(session = vcl_session_get (wrk, sid)))
+       break;
       session_events = session->vep.ev.events;
       if (EPOLLOUT & session_events)
        {