Add TLS support for VCL
[vpp.git] / src / vcl / vppcom.c
index f1c58c4..70afdce 100644 (file)
@@ -1191,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)
@@ -1246,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)
@@ -1420,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;
     }
@@ -1442,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
@@ -1944,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;
@@ -1955,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;
@@ -1967,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;
@@ -1978,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;
@@ -1990,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;
@@ -2006,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;
@@ -2014,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;
@@ -2144,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)
@@ -2188,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++;
       }
   }));
@@ -2208,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++;
       }
   }));