vcl: allow non-blocking connects
[vpp.git] / src / vcl / vppcom.c
index f56c02b..72ec4f4 100644 (file)
@@ -1590,10 +1590,14 @@ vppcom_session_connect (uint32_t session_handle, vppcom_endpt_t * server_ep)
        clib_net_to_host_u16 (session->transport.rmt_port),
        vppcom_proto_str (session->session_type));
 
+  vcl_send_session_connect (wrk, session);
+
+  if (VCL_SESS_ATTR_TEST (session->attr, VCL_SESS_ATTR_NONBLOCK))
+    return VPPCOM_EINPROGRESS;
+
   /*
-   * Send connect request and wait for reply from vpp
+   * Wait for reply from vpp if blocking
    */
-  vcl_send_session_connect (wrk, session);
   rv = vppcom_wait_for_session_state_change (session_index, STATE_CONNECT,
                                             vcm->cfg.session_timeout);
 
@@ -2033,7 +2037,14 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
       break;
     case SESSION_CTRL_EVT_CONNECTED:
       connected_msg = (session_connected_msg_t *) e->data;
-      vcl_session_connected_handler (wrk, connected_msg);
+      sid = vcl_session_connected_handler (wrk, connected_msg);
+      if (sid == VCL_INVALID_SESSION_INDEX)
+       break;
+      if (sid < n_bits && write_map)
+       {
+         clib_bitmap_set_no_check ((uword *) write_map, sid, 1);
+         *bits_set += 1;
+       }
       break;
     case SESSION_CTRL_EVT_DISCONNECTED:
       disconnected_msg = (session_disconnected_msg_t *) e->data;