vcl: allow non-blocking connects

Type: feature

Change-Id: I55349f482ce6781337f747b2f0d2c0a027c3a675
Signed-off-by: Florin Coras <fcoras@cisco.com>
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c
index f56c02b..72ec4f4 100644
--- a/src/vcl/vppcom.c
+++ b/src/vcl/vppcom.c
@@ -1590,10 +1590,14 @@
 	clib_net_to_host_u16 (session->transport.rmt_port),
 	vppcom_proto_str (session->session_type));
 
-  /*
-   * Send connect request and wait for reply from vpp
-   */
   vcl_send_session_connect (wrk, session);
+
+  if (VCL_SESS_ATTR_TEST (session->attr, VCL_SESS_ATTR_NONBLOCK))
+    return VPPCOM_EINPROGRESS;
+
+  /*
+   * Wait for reply from vpp if blocking
+   */
   rv = vppcom_wait_for_session_state_change (session_index, STATE_CONNECT,
 					     vcm->cfg.session_timeout);
 
@@ -2033,7 +2037,14 @@
       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;
diff --git a/src/vcl/vppcom.h b/src/vcl/vppcom.h
index 90bec31..6281509 100644
--- a/src/vcl/vppcom.h
+++ b/src/vcl/vppcom.h
@@ -18,6 +18,7 @@
 
 #include <netdb.h>
 #include <errno.h>
+#include <sys/fcntl.h>
 #include <sys/poll.h>
 #include <sys/epoll.h>
 
@@ -115,6 +116,7 @@
   VPPCOM_OK = 0,
   VPPCOM_EAGAIN = -EAGAIN,
   VPPCOM_EWOULDBLOCK = -EWOULDBLOCK,
+  VPPCOM_EINPROGRESS = -EINPROGRESS,
   VPPCOM_EFAULT = -EFAULT,
   VPPCOM_ENOMEM = -ENOMEM,
   VPPCOM_EINVAL = -EINVAL,