Add TLS support for VCL
[vpp.git] / src / vcl / vppcom.c
index be3081e..70afdce 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:
@@ -1188,7 +1191,7 @@ vppcom_session_bind (uint32_t session_handle, vppcom_endpt_t * ep)
        format_ip46_address, &session->transport.lcl_ip,
        session->transport.is_ip4 ? IP46_TYPE_IP4 : IP46_TYPE_IP6,
        clib_net_to_host_u16 (session->transport.lcl_port),
-       session->session_type ? "UDP" : "TCP");
+       vppcom_proto_str (session->session_type));
   vcl_evt (VCL_EVT_BIND, session);
 
   if (session->session_type == VPPCOM_PROTO_UDP)
@@ -1243,6 +1246,55 @@ vppcom_session_listen (uint32_t listen_sh, uint32_t q_len)
   return VPPCOM_OK;
 }
 
+int
+vppcom_session_tls_add_cert (uint32_t session_handle, char *cert,
+                            uint32_t cert_len)
+{
+
+  vcl_worker_t *wrk = vcl_worker_get_current ();
+  vcl_session_t *session = 0;
+
+  session = vcl_session_get_w_handle (wrk, session_handle);
+  if (!session)
+    return VPPCOM_EBADFD;
+
+  if (cert_len == 0 || cert_len == ~0)
+    return VPPCOM_EBADFD;
+
+  /*
+   * Send listen request to vpp and wait for reply
+   */
+  vppcom_send_application_tls_cert_add (session, cert, cert_len);
+
+  return VPPCOM_OK;
+
+}
+
+int
+vppcom_session_tls_add_key (uint32_t session_handle, char *key,
+                           uint32_t key_len)
+{
+
+  vcl_worker_t *wrk = vcl_worker_get_current ();
+  vcl_session_t *session = 0;
+
+  session = vcl_session_get_w_handle (wrk, session_handle);
+  if (!session)
+    return VPPCOM_EBADFD;
+
+  if (key_len == 0 || key_len == ~0)
+    return VPPCOM_EBADFD;
+
+  /*
+   * Send listen request to vpp and wait for reply
+   */
+  vppcom_send_application_tls_key_add (session, key, key_len);
+
+  return VPPCOM_OK;
+
+
+}
+
 static int
 validate_args_session_accept_ (vcl_worker_t * wrk,
                               vcl_session_t * listen_session)
@@ -1378,19 +1430,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);
 }
@@ -1426,7 +1469,7 @@ vppcom_session_connect (uint32_t session_handle, vppcom_endpt_t * server_ep)
            &session->transport.rmt_ip, session->transport.is_ip4 ?
            IP46_TYPE_IP4 : IP46_TYPE_IP6,
            clib_net_to_host_u16 (session->transport.rmt_port),
-           session->session_type ? "UDP" : "TCP", session->session_state,
+           vppcom_proto_str (session->session_type), session->session_state,
            vppcom_session_state_str (session->session_state));
       return VPPCOM_OK;
     }
@@ -1448,7 +1491,7 @@ vppcom_session_connect (uint32_t session_handle, vppcom_endpt_t * server_ep)
        &session->transport.rmt_ip, session->transport.is_ip4 ?
        IP46_TYPE_IP4 : IP46_TYPE_IP6,
        clib_net_to_host_u16 (session->transport.rmt_port),
-       session->session_type ? "UDP" : "TCP");
+       vppcom_proto_str (session->session_type));
 
   /*
    * Send connect request and wait for reply from vpp
@@ -1524,9 +1567,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;
     }
@@ -1578,8 +1620,8 @@ vppcom_session_read_internal (uint32_t session_handle, void *buf, int n,
                              SVM_Q_WAIT);
     }
 
-  VDBG (2, "VCL<%d>: vpp handle 0x%llx, sid %u: read %d bytes from (%p)",
-       getpid (), s->vpp_handle, session_handle, n_read, rx_fifo);
+  VDBG (2, "vpp handle 0x%llx, sid %u: read %d bytes from (%p)",
+       s->vpp_handle, session_handle, n_read, rx_fifo);
 
   return n_read;
 }
@@ -1831,6 +1873,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)
 {
@@ -1943,7 +1993,7 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
        break;
       if (sid < n_bits && read_map)
        {
-         clib_bitmap_set_no_check (read_map, sid, 1);
+         clib_bitmap_set_no_check ((uword *) read_map, sid, 1);
          *bits_set += 1;
        }
       break;
@@ -1954,7 +2004,7 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
        break;
       if (sid < n_bits && write_map)
        {
-         clib_bitmap_set_no_check (write_map, sid, 1);
+         clib_bitmap_set_no_check ((uword *) write_map, sid, 1);
          *bits_set += 1;
        }
       break;
@@ -1966,7 +2016,7 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
       sid = session->session_index;
       if (sid < n_bits && read_map)
        {
-         clib_bitmap_set_no_check (read_map, sid, 1);
+         clib_bitmap_set_no_check ((uword *) read_map, sid, 1);
          *bits_set += 1;
        }
       break;
@@ -1977,7 +2027,7 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
       sid = session->session_index;
       if (sid < n_bits && write_map)
        {
-         clib_bitmap_set_no_check (write_map, sid, 1);
+         clib_bitmap_set_no_check ((uword *) write_map, sid, 1);
          *bits_set += 1;
        }
       break;
@@ -1989,7 +2039,7 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
       sid = session->session_index;
       if (sid < n_bits && read_map)
        {
-         clib_bitmap_set_no_check (read_map, sid, 1);
+         clib_bitmap_set_no_check ((uword *) read_map, sid, 1);
          *bits_set += 1;
        }
       break;
@@ -2005,7 +2055,7 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
       sid = session->session_index;
       if (sid < n_bits && except_map)
        {
-         clib_bitmap_set_no_check (except_map, sid, 1);
+         clib_bitmap_set_no_check ((uword *) except_map, sid, 1);
          *bits_set += 1;
        }
       break;
@@ -2013,7 +2063,7 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
       sid = vcl_session_reset_handler (wrk, (session_reset_msg_t *) e->data);
       if (sid < n_bits && except_map)
        {
-         clib_bitmap_set_no_check (except_map, sid, 1);
+         clib_bitmap_set_no_check ((uword *) except_map, sid, 1);
          *bits_set += 1;
        }
       break;
@@ -2143,30 +2193,35 @@ vppcom_select (unsigned long n_bits, unsigned long *read_map,
   vcl_session_t *session = 0;
   int rv, i;
 
-  ASSERT (sizeof (clib_bitmap_t) == sizeof (long int));
+  STATIC_ASSERT (sizeof (clib_bitmap_t) == sizeof (unsigned long),
+                "vppcom bitmap size mismatch");
+  STATIC_ASSERT (sizeof (clib_bitmap_t) == sizeof (fd_mask),
+                "vppcom bitmap size mismatch");
+  STATIC_ASSERT (sizeof (clib_bitmap_t) == sizeof (uword),
+                "vppcom bitmap size mismatch");
 
   if (n_bits && read_map)
     {
       clib_bitmap_validate (wrk->rd_bitmap, minbits);
       clib_memcpy_fast (wrk->rd_bitmap, read_map,
-                       vec_len (wrk->rd_bitmap) * sizeof (clib_bitmap_t));
-      memset (read_map, 0, vec_len (wrk->rd_bitmap) * sizeof (clib_bitmap_t));
+                       vec_len (wrk->rd_bitmap) * sizeof (unsigned long));
+      memset (read_map, 0, vec_len (wrk->rd_bitmap) * sizeof (unsigned long));
     }
   if (n_bits && write_map)
     {
       clib_bitmap_validate (wrk->wr_bitmap, minbits);
       clib_memcpy_fast (wrk->wr_bitmap, write_map,
-                       vec_len (wrk->wr_bitmap) * sizeof (clib_bitmap_t));
+                       vec_len (wrk->wr_bitmap) * sizeof (unsigned long));
       memset (write_map, 0,
-             vec_len (wrk->wr_bitmap) * sizeof (clib_bitmap_t));
+             vec_len (wrk->wr_bitmap) * sizeof (unsigned long));
     }
   if (n_bits && except_map)
     {
       clib_bitmap_validate (wrk->ex_bitmap, minbits);
       clib_memcpy_fast (wrk->ex_bitmap, except_map,
-                       vec_len (wrk->ex_bitmap) * sizeof (clib_bitmap_t));
+                       vec_len (wrk->ex_bitmap) * sizeof (unsigned long));
       memset (except_map, 0,
-             vec_len (wrk->ex_bitmap) * sizeof (clib_bitmap_t));
+             vec_len (wrk->ex_bitmap) * sizeof (unsigned long));
     }
 
   if (!n_bits)
@@ -2187,7 +2242,7 @@ vppcom_select (unsigned long n_bits, unsigned long *read_map,
     rv = svm_fifo_is_full (session->tx_fifo);
     if (!rv)
       {
-        clib_bitmap_set_no_check (write_map, sid, 1);
+        clib_bitmap_set_no_check ((uword*)write_map, sid, 1);
         bits_set++;
       }
   }));
@@ -2207,7 +2262,7 @@ check_rd:
     rv = vppcom_session_read_ready (session);
     if (rv)
       {
-        clib_bitmap_set_no_check (read_map, sid, 1);
+        clib_bitmap_set_no_check ((uword*)read_map, sid, 1);
         bits_set++;
       }
   }));
@@ -2329,9 +2384,8 @@ vppcom_epoll_create (void)
   vep_session->wait_cont_idx = ~0;
   vep_session->vpp_handle = ~0;
 
-  vcl_evt (VCL_EVT_EPOLL_CREATE, vep_session, vep_sh);
-  VDBG (0, "VCL<%d>: Created vep_idx %u / sid %u!",
-       getpid (), vep_session->session_index, vep_session->session_index);
+  vcl_evt (VCL_EVT_EPOLL_CREATE, vep_session, vep_session->session_index);
+  VDBG (0, "Created vep_idx %u", vep_session->session_index);
 
   return vcl_session_handle (vep_session);
 }
@@ -2347,21 +2401,19 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
 
   if (vep_handle == session_handle)
     {
-      clib_warning ("VCL<%d>: ERROR: vep_idx == session_index (%u)!",
-                   getpid (), vep_handle);
+      VDBG (0, "vep_sh == session handle (%u)!", vep_handle);
       return VPPCOM_EINVAL;
     }
 
   vep_session = vcl_session_get_w_handle (wrk, vep_handle);
   if (PREDICT_FALSE (!vep_session))
     {
-      clib_warning ("VCL<%d>: ERROR: Invalid vep_idx (%u)!", vep_handle);
+      VDBG (0, "Invalid vep_sh (%u)!", vep_handle);
       return VPPCOM_EBADFD;
     }
   if (PREDICT_FALSE (!vep_session->is_vep))
     {
-      clib_warning ("VCL<%d>: ERROR: vep_idx (%u) is not a vep!",
-                   getpid (), vep_handle);
+      VDBG (0, "vep_sh (%u) is not a vep!", vep_handle);
       return VPPCOM_EINVAL;
     }
 
@@ -2371,13 +2423,12 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
   session = vcl_session_get_w_handle (wrk, session_handle);
   if (PREDICT_FALSE (!session))
     {
-      VDBG (0, "VCL<%d>: ERROR: Invalid session_handle (%u)!",
-           getpid (), session_handle);
+      VDBG (0, "Invalid session_handle (%u)!", session_handle);
       return VPPCOM_EBADFD;
     }
   if (PREDICT_FALSE (session->is_vep))
     {
-      clib_warning ("ERROR: session_handle (%u) is a vep!", vep_handle);
+      VDBG (0, "session_handle (%u) is a vep!", vep_handle);
       return VPPCOM_EINVAL;
     }
 
@@ -2386,8 +2437,7 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
     case EPOLL_CTL_ADD:
       if (PREDICT_FALSE (!event))
        {
-         clib_warning ("VCL<%d>: ERROR: EPOLL_CTL_ADD: NULL pointer to "
-                       "epoll_event structure!", getpid ());
+         VDBG (0, "EPOLL_CTL_ADD: NULL pointer to epoll_event structure!");
          return VPPCOM_EINVAL;
        }
       if (vep_session->vep.next_sh != ~0)
@@ -2397,9 +2447,8 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
                                                   vep_session->vep.next_sh);
          if (PREDICT_FALSE (!next_session))
            {
-             clib_warning ("VCL<%d>: ERROR: EPOLL_CTL_ADD: Invalid "
-                           "vep.next_sid (%u) on vep_idx (%u)!",
-                           getpid (), vep_session->vep.next_sh, vep_handle);
+             VDBG (0, "EPOLL_CTL_ADD: Invalid vep.next_sid (%u) on "
+                   "vep_idx (%u)!", vep_session->vep.next_sh, vep_handle);
              return VPPCOM_EBADFD;
            }
          ASSERT (next_session->vep.prev_sh == vep_handle);
@@ -2414,57 +2463,49 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
       session->is_vep_session = 1;
       vep_session->vep.next_sh = session_handle;
 
-      VDBG (1, "VCL<%d>: EPOLL_CTL_ADD: vep_idx %u, sid %u, events 0x%x, "
-           "data 0x%llx!", getpid (), vep_handle, session_handle,
-           event->events, event->data.u64);
+      VDBG (1, "EPOLL_CTL_ADD: vep_sh %u, sh %u, events 0x%x, data 0x%llx!",
+           vep_handle, session_handle, event->events, event->data.u64);
       vcl_evt (VCL_EVT_EPOLL_CTLADD, session, event->events, event->data.u64);
       break;
 
     case EPOLL_CTL_MOD:
       if (PREDICT_FALSE (!event))
        {
-         clib_warning ("VCL<%d>: ERROR: EPOLL_CTL_MOD: NULL pointer to "
-                       "epoll_event structure!", getpid ());
+         VDBG (0, "EPOLL_CTL_MOD: NULL pointer to epoll_event structure!");
          rv = VPPCOM_EINVAL;
          goto done;
        }
       else if (PREDICT_FALSE (!session->is_vep_session))
        {
-         clib_warning ("VCL<%d>: ERROR: sid %u EPOLL_CTL_MOD: "
-                       "not a vep session!", getpid (), session_handle);
+         VDBG (0, "sid %u EPOLL_CTL_MOD: not a vep session!",
+               session_handle);
          rv = VPPCOM_EINVAL;
          goto done;
        }
       else if (PREDICT_FALSE (session->vep.vep_sh != vep_handle))
        {
-         clib_warning ("VCL<%d>: ERROR: sid %u EPOLL_CTL_MOD: "
-                       "vep_idx (%u) != vep_idx (%u)!",
-                       getpid (), session_handle,
-                       session->vep.vep_sh, vep_handle);
+         VDBG (0, "EPOLL_CTL_MOD: sh %u vep_sh (%u) != vep_sh (%u)!",
+               session_handle, session->vep.vep_sh, vep_handle);
          rv = VPPCOM_EINVAL;
          goto done;
        }
       session->vep.et_mask = VEP_DEFAULT_ET_MASK;
       session->vep.ev = *event;
-      VDBG (1, "VCL<%d>: EPOLL_CTL_MOD: vep_idx %u, sid %u, events 0x%x,"
-           " data 0x%llx!", getpid (), vep_handle, session_handle,
-           event->events, event->data.u64);
+      VDBG (1, "EPOLL_CTL_MOD: vep_sh %u, sh %u, events 0x%x, data 0x%llx!",
+           vep_handle, session_handle, event->events, event->data.u64);
       break;
 
     case EPOLL_CTL_DEL:
       if (PREDICT_FALSE (!session->is_vep_session))
        {
-         clib_warning ("VCL<%d>: ERROR: sid %u EPOLL_CTL_DEL: "
-                       "not a vep session!", getpid (), session_handle);
+         VDBG (0, "EPOLL_CTL_DEL: %u not a vep session!", session_handle);
          rv = VPPCOM_EINVAL;
          goto done;
        }
       else if (PREDICT_FALSE (session->vep.vep_sh != vep_handle))
        {
-         clib_warning ("VCL<%d>: ERROR: sid %u EPOLL_CTL_DEL: "
-                       "vep_idx (%u) != vep_idx (%u)!",
-                       getpid (), session_handle,
-                       session->vep.vep_sh, vep_handle);
+         VDBG (0, "EPOLL_CTL_DEL: sh %u vep_sh (%u) != vep_sh (%u)!",
+               session_handle, session->vep.vep_sh, vep_handle);
          rv = VPPCOM_EINVAL;
          goto done;
        }
@@ -2481,9 +2522,8 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
          prev_session = vcl_session_get_w_handle (wrk, session->vep.prev_sh);
          if (PREDICT_FALSE (!prev_session))
            {
-             clib_warning ("VCL<%d>: ERROR: EPOLL_CTL_DEL: Invalid "
-                           "vep.prev_sid (%u) on sid (%u)!",
-                           getpid (), session->vep.prev_sh, session_handle);
+             VDBG (0, "EPOLL_CTL_DEL: Invalid prev_sid (%u) on sid (%u)!",
+                   session->vep.prev_sh, session_handle);
              return VPPCOM_EBADFD;
            }
          ASSERT (prev_session->vep.next_sh == session_handle);
@@ -2495,9 +2535,8 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
          next_session = vcl_session_get_w_handle (wrk, session->vep.next_sh);
          if (PREDICT_FALSE (!next_session))
            {
-             clib_warning ("VCL<%d>: ERROR: EPOLL_CTL_DEL: Invalid "
-                           "vep.next_sid (%u) on sid (%u)!",
-                           getpid (), session->vep.next_sh, session_handle);
+             VDBG (0, "EPOLL_CTL_DEL: Invalid next_sid (%u) on sid (%u)!",
+                   session->vep.next_sh, session_handle);
              return VPPCOM_EBADFD;
            }
          ASSERT (next_session->vep.prev_sh == session_handle);
@@ -2509,13 +2548,13 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
       session->vep.prev_sh = ~0;
       session->vep.vep_sh = ~0;
       session->is_vep_session = 0;
-      VDBG (1, "VCL<%d>: EPOLL_CTL_DEL: vep_idx %u, sid %u!",
-           getpid (), vep_handle, session_handle);
+      VDBG (1, "EPOLL_CTL_DEL: vep_idx %u, sid %u!", vep_handle,
+           session_handle);
       vcl_evt (VCL_EVT_EPOLL_CTLDEL, session, vep_sh);
       break;
 
     default:
-      clib_warning ("VCL<%d>: ERROR: Invalid operation (%d)!", getpid (), op);
+      VDBG (0, "Invalid operation (%d)!", op);
       rv = VPPCOM_EINVAL;
     }
 
@@ -2542,7 +2581,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;
@@ -2553,7 +2593,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;
@@ -2564,6 +2605,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)
@@ -2575,6 +2618,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))
@@ -2602,7 +2647,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)
        {
@@ -3373,8 +3419,7 @@ vppcom_session_recvfrom (uint32_t session_handle, void *buffer,
     rv = vppcom_session_peek (session_handle, buffer, buflen);
   else
     {
-      clib_warning ("VCL<%d>: Unsupport flags for recvfrom %d",
-                   getpid (), flags);
+      VDBG (0, "Unsupport flags for recvfrom %d", flags);
       return VPPCOM_EAFNOSUPPORT;
     }