session: cleanup session tx function
[vpp.git] / src / tests / vnet / session / tcp_echo.c
index d48c5d9..d3d4c0a 100644 (file)
@@ -85,7 +85,7 @@ typedef struct
   int i_am_master;
 
   /* drop all packets */
-  int drop_packets;
+  int no_return;
 
   /* Our event queue */
   svm_queue_t *our_event_queue;
@@ -117,6 +117,7 @@ typedef struct
   u32 client_bytes_received;
   u8 test_return_packets;
   u64 bytes_to_send;
+  u32 fifo_size;
 
   /** Flag that decides if socket, instead of svm, api is used to connect to
    * vpp. If sock api is used, shm binary api is subsequently bootstrapped
@@ -135,6 +136,62 @@ echo_main_t echo_main;
 #define NITER 4000000
 #endif
 
+const char test_srv_crt_rsa[] =
+  "-----BEGIN CERTIFICATE-----\r\n"
+  "MIID5zCCAs+gAwIBAgIJALeMYCEHrTtJMA0GCSqGSIb3DQEBCwUAMIGJMQswCQYD\r\n"
+  "VQQGEwJVUzELMAkGA1UECAwCQ0ExETAPBgNVBAcMCFNhbiBKb3NlMQ4wDAYDVQQK\r\n"
+  "DAVDaXNjbzEOMAwGA1UECwwFZmQuaW8xFjAUBgNVBAMMDXRlc3R0bHMuZmQuaW8x\r\n"
+  "IjAgBgkqhkiG9w0BCQEWE3ZwcC1kZXZAbGlzdHMuZmQuaW8wHhcNMTgwMzA1MjEx\r\n"
+  "NTEyWhcNMjgwMzAyMjExNTEyWjCBiTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNB\r\n"
+  "MREwDwYDVQQHDAhTYW4gSm9zZTEOMAwGA1UECgwFQ2lzY28xDjAMBgNVBAsMBWZk\r\n"
+  "LmlvMRYwFAYDVQQDDA10ZXN0dGxzLmZkLmlvMSIwIAYJKoZIhvcNAQkBFhN2cHAt\r\n"
+  "ZGV2QGxpc3RzLmZkLmlvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\r\n"
+  "4C1k8a1DuStgggqT4o09fP9sJ2dC54bxhS/Xk2VEfaIZ222WSo4X/syRVfVy9Yah\r\n"
+  "cpI1zJ/RDxaZSFhgA+nPZBrFMsrULkrdAOpOVj8eDEp9JuWdO2ODSoFnCvLxcYWB\r\n"
+  "Yc5kHryJpEaGJl1sFQSesnzMFty/59ta0stk0Fp8r5NhIjWvSovGzPo6Bhz+VS2c\r\n"
+  "ebIZh4x1t2hHaFcgm0qJoJ6DceReWCW8w+yOVovTolGGq+bpb2Hn7MnRSZ2K2NdL\r\n"
+  "+aLXpkZbS/AODP1FF2vTO1mYL290LO7/51vJmPXNKSDYMy5EvILr5/VqtjsFCwRL\r\n"
+  "Q4jcM/+GeHSAFWx4qIv0BwIDAQABo1AwTjAdBgNVHQ4EFgQUWa1SOB37xmT53tZQ\r\n"
+  "aXuLLhRI7U8wHwYDVR0jBBgwFoAUWa1SOB37xmT53tZQaXuLLhRI7U8wDAYDVR0T\r\n"
+  "BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAoUht13W4ya27NVzQuCMvqPWL3VM4\r\n"
+  "3xbPFk02FaGz/WupPu276zGlzJAZrbuDcQowwwU1Ni1Yygxl96s1c2M5rHDTrOKG\r\n"
+  "rK0hbkSFBo+i6I8u4HiiQ4rYmG0Hv6+sXn3of0HsbtDPGgWZoipPWDljPYEURu3e\r\n"
+  "3HRe/Dtsj9CakBoSDzs8ndWaBR+f4sM9Tk1cjD46Gq2T/qpSPXqKxEUXlzhdCAn4\r\n"
+  "twub17Bq2kykHpppCwPg5M+v30tHG/R2Go15MeFWbEJthFk3TZMjKL7UFs7fH+x2\r\n"
+  "wSonXb++jY+KmCb93C+soABBizE57g/KmiR2IxQ/LMjDik01RSUIaM0lLA==\r\n"
+  "-----END CERTIFICATE-----\r\n";
+const u32 test_srv_crt_rsa_len = sizeof (test_srv_crt_rsa);
+
+const char test_srv_key_rsa[] =
+  "-----BEGIN PRIVATE KEY-----\r\n"
+  "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDgLWTxrUO5K2CC\r\n"
+  "CpPijT18/2wnZ0LnhvGFL9eTZUR9ohnbbZZKjhf+zJFV9XL1hqFykjXMn9EPFplI\r\n"
+  "WGAD6c9kGsUyytQuSt0A6k5WPx4MSn0m5Z07Y4NKgWcK8vFxhYFhzmQevImkRoYm\r\n"
+  "XWwVBJ6yfMwW3L/n21rSy2TQWnyvk2EiNa9Ki8bM+joGHP5VLZx5shmHjHW3aEdo\r\n"
+  "VyCbSomgnoNx5F5YJbzD7I5Wi9OiUYar5ulvYefsydFJnYrY10v5otemRltL8A4M\r\n"
+  "/UUXa9M7WZgvb3Qs7v/nW8mY9c0pINgzLkS8guvn9Wq2OwULBEtDiNwz/4Z4dIAV\r\n"
+  "bHioi/QHAgMBAAECggEBAMzGipP8+oT166U+NlJXRFifFVN1DvdhG9PWnOxGL+c3\r\n"
+  "ILmBBC08WQzmHshPemBvR6DZkA1H23cV5JTiLWrFtC00CvhXsLRMrE5+uWotI6yE\r\n"
+  "iofybMroHvD6/X5R510UX9hQ6MHu5ShLR5VZ9zXHz5MpTmB/60jG5dLx+jgcwBK8\r\n"
+  "LuGv2YB/WCUwT9QJ3YU2eaingnXtz/MrFbkbltrqlnBdlD+kTtw6Yac9y1XuuQXc\r\n"
+  "BPeulLNDuPolJVWbUvDBZrpt2dXTgz8ws1sv+wCNE0xwQJsqW4Nx3QkpibUL9RUr\r\n"
+  "CVbKlNfa9lopT6nGKlgX69R/uH35yh9AOsfasro6w0ECgYEA82UJ8u/+ORah+0sF\r\n"
+  "Q0FfW5MTdi7OAUHOz16pUsGlaEv0ERrjZxmAkHA/VRwpvDBpx4alCv0Hc39PFLIk\r\n"
+  "nhSsM2BEuBkTAs6/GaoNAiBtQVE/hN7awNRWVmlieS0go3Y3dzaE9IUMyj8sPOFT\r\n"
+  "5JdJ6BM69PHKCkY3dKdnnfpFEuECgYEA68mRpteunF1mdZgXs+WrN+uLlRrQR20F\r\n"
+  "ZyMYiUCH2Dtn26EzA2moy7FipIIrQcX/j+KhYNGM3e7MU4LymIO29E18mn8JODnH\r\n"
+  "sQOXzBTsf8A4yIVMkcuQD3bfb0JiUGYUPOidTp2N7IJA7+6Yc3vQOyb74lnKnJoO\r\n"
+  "gougPT2wS+cCgYAn7muzb6xFsXDhyW0Tm6YJYBfRS9yAWEuVufINobeBZPSl2cN1\r\n"
+  "Jrnw+HlrfTNbrJWuJmjtZJXUXQ6cVp2rUbjutNyRV4vG6iRwEXYQ40EJdkr1gZpi\r\n"
+  "CHQhuShuuPih2MNAy7EEbM+sXrDjTBR3bFqzuHPzu7dp+BshCFX3lRfAAQKBgGQt\r\n"
+  "K5i7IhCFDjb/+3IPLgOAK7mZvsvZ4eXD33TQ2eZgtut1PXtBtNl17/b85uv293Fm\r\n"
+  "VDISVcsk3eLNS8zIiT6afUoWlxAwXEs0v5WRfjl4radkGvgGiJpJYvyeM67877RB\r\n"
+  "EDSKc/X8ESLfOB44iGvZUEMG6zJFscx9DgN25iQZAoGAbyd+JEWwdVH9/K3IH1t2\r\n"
+  "PBkZX17kNWv+iVM1WyFjbe++vfKZCrOJiyiqhDeEqgrP3AuNMlaaduC3VRC3G5oV\r\n"
+  "Mj1tlhDWQ/qhvKdCKNdIVQYDE75nw+FRWV8yYkHAnXYW3tNoweDIwixE0hkPR1bc\r\n"
+  "oEjPLVNtx8SOj/M4rhaPT3I=\r\n" "-----END PRIVATE KEY-----\r\n";
+const u32 test_srv_key_rsa_len = sizeof (test_srv_key_rsa);
+
 static u8 *
 format_api_error (u8 * s, va_list * args)
 {
@@ -191,7 +248,9 @@ void
 application_send_attach (echo_main_t * em)
 {
   vl_api_application_attach_t *bmp;
-  u32 fifo_size = 4 << 20;
+  vl_api_application_tls_cert_add_t *cert_mp;
+  vl_api_application_tls_key_add_t *key_mp;
+
   bmp = vl_msg_api_alloc (sizeof (*bmp));
   memset (bmp, 0, sizeof (*bmp));
 
@@ -201,11 +260,29 @@ application_send_attach (echo_main_t * em)
   bmp->options[APP_OPTIONS_FLAGS] =
     APP_OPTIONS_FLAGS_ACCEPT_REDIRECT | APP_OPTIONS_FLAGS_ADD_SEGMENT;
   bmp->options[APP_OPTIONS_PREALLOC_FIFO_PAIRS] = 16;
-  bmp->options[APP_OPTIONS_RX_FIFO_SIZE] = fifo_size;
-  bmp->options[APP_OPTIONS_TX_FIFO_SIZE] = fifo_size;
+  bmp->options[APP_OPTIONS_RX_FIFO_SIZE] = em->fifo_size;
+  bmp->options[APP_OPTIONS_TX_FIFO_SIZE] = em->fifo_size;
   bmp->options[APP_OPTIONS_ADD_SEGMENT_SIZE] = 128 << 20;
   bmp->options[APP_OPTIONS_SEGMENT_SIZE] = 256 << 20;
   vl_msg_api_send_shmem (em->vl_input_queue, (u8 *) & bmp);
+
+  cert_mp = vl_msg_api_alloc (sizeof (*cert_mp) + test_srv_crt_rsa_len);
+  memset (cert_mp, 0, sizeof (*cert_mp));
+  cert_mp->_vl_msg_id = ntohs (VL_API_APPLICATION_TLS_CERT_ADD);
+  cert_mp->client_index = em->my_client_index;
+  cert_mp->context = ntohl (0xfeedface);
+  cert_mp->cert_len = clib_host_to_net_u16 (test_srv_crt_rsa_len);
+  clib_memcpy (cert_mp->cert, test_srv_crt_rsa, test_srv_crt_rsa_len);
+  vl_msg_api_send_shmem (em->vl_input_queue, (u8 *) & cert_mp);
+
+  key_mp = vl_msg_api_alloc (sizeof (*key_mp) + test_srv_key_rsa_len);
+  memset (key_mp, 0, sizeof (*key_mp) + test_srv_key_rsa_len);
+  key_mp->_vl_msg_id = ntohs (VL_API_APPLICATION_TLS_KEY_ADD);
+  key_mp->client_index = em->my_client_index;
+  key_mp->context = ntohl (0xfeedface);
+  key_mp->key_len = clib_host_to_net_u16 (test_srv_key_rsa_len);
+  clib_memcpy (key_mp->key, test_srv_key_rsa, test_srv_key_rsa_len);
+  vl_msg_api_send_shmem (em->vl_input_queue, (u8 *) & key_mp);
 }
 
 int
@@ -479,6 +556,7 @@ vl_api_disconnect_session_t_handler (vl_api_disconnect_session_t * mp)
   rmp->_vl_msg_id = ntohs (VL_API_DISCONNECT_SESSION_REPLY);
   rmp->retval = rv;
   rmp->handle = mp->handle;
+  rmp->context = mp->context;
   vl_msg_api_send_shmem (em->vl_input_queue, (u8 *) & rmp);
 
   if (session)
@@ -679,11 +757,10 @@ vl_api_connect_session_reply_t_handler (vl_api_connect_session_reply_t * mp)
 static void
 send_test_chunk (echo_main_t * em, svm_fifo_t * tx_fifo, int mypid, u32 bytes)
 {
+  u32 bytes_to_snd, enq_space, min_chunk = 16 << 10;
   u8 *test_data = em->connect_test_data;
   u64 bytes_sent = 0;
   int test_buf_offset = 0;
-  u32 bytes_to_snd;
-  u32 queue_max_chunk = 128 << 10, actual_write;
   session_fifo_event_t evt;
   int rv;
 
@@ -693,11 +770,12 @@ send_test_chunk (echo_main_t * em, svm_fifo_t * tx_fifo, int mypid, u32 bytes)
 
   while (bytes_to_snd > 0 && !em->time_to_stop)
     {
-      actual_write = (bytes_to_snd > queue_max_chunk) ?
-       queue_max_chunk : bytes_to_snd;
-      rv = svm_fifo_enqueue_nowait (tx_fifo, actual_write,
+      enq_space = svm_fifo_max_enqueue (tx_fifo);
+      if (enq_space < clib_min (bytes_to_snd, min_chunk))
+       continue;
+      rv = svm_fifo_enqueue_nowait (tx_fifo,
+                                   clib_min (bytes_to_snd, enq_space),
                                    test_data + test_buf_offset);
-
       if (rv > 0)
        {
          bytes_to_snd -= rv;
@@ -709,9 +787,8 @@ send_test_chunk (echo_main_t * em, svm_fifo_t * tx_fifo, int mypid, u32 bytes)
              /* Fabricate TX event, send to vpp */
              evt.fifo = tx_fifo;
              evt.event_type = FIFO_EVENT_APP_TX;
-
-             svm_queue_add (em->vpp_event_queue,
-                            (u8 *) & evt, 0 /* do wait for mutex */ );
+             svm_queue_add (em->vpp_event_queue, (u8 *) & evt,
+                            0 /* do wait for mutex */ );
            }
        }
     }
@@ -746,7 +823,7 @@ client_send_data (echo_main_t * em)
   if (leftover)
     send_test_chunk (em, tx_fifo, mypid, leftover);
 
-  if (!em->drop_packets)
+  if (!em->no_return)
     {
       f64 timeout = clib_time_now (&em->clib_time) + 10;
 
@@ -761,6 +838,7 @@ client_send_data (echo_main_t * em)
            }
        }
     }
+
   em->time_to_stop = 1;
 }
 
@@ -833,7 +911,7 @@ client_run (echo_main_t * em)
     }
 
   /* Init test data */
-  vec_validate (em->connect_test_data, 128 * 1024 - 1);
+  vec_validate (em->connect_test_data, 1024 * 1024 - 1);
   for (i = 0; i < vec_len (em->connect_test_data); i++)
     em->connect_test_data[i] = i & 0xff;
 
@@ -1052,7 +1130,7 @@ server_handle_fifo_event_rx (echo_main_t * em, session_fifo_event_t * e)
        }
 
       /* Reflect if a non-drop session */
-      if (!em->drop_packets && n_read > 0)
+      if (!em->no_return && n_read > 0)
        {
          offset = 0;
          do
@@ -1217,17 +1295,35 @@ vl_api_disconnect_session_reply_t_handler (vl_api_disconnect_session_reply_t *
     session_print_stats (em, session);
 }
 
-#define foreach_tcp_echo_msg                                   \
-_(BIND_URI_REPLY, bind_uri_reply)                              \
-_(UNBIND_URI_REPLY, unbind_uri_reply)                          \
-_(ACCEPT_SESSION, accept_session)                              \
-_(CONNECT_SESSION_REPLY, connect_session_reply)                \
-_(DISCONNECT_SESSION, disconnect_session)                      \
-_(DISCONNECT_SESSION_REPLY, disconnect_session_reply)          \
-_(RESET_SESSION, reset_session)                                \
-_(APPLICATION_ATTACH_REPLY, application_attach_reply)          \
-_(APPLICATION_DETACH_REPLY, application_detach_reply)          \
-_(MAP_ANOTHER_SEGMENT, map_another_segment)                    \
+static void
+  vl_api_application_tls_cert_add_reply_t_handler
+  (vl_api_application_tls_cert_add_reply_t * mp)
+{
+  if (mp->retval)
+    clib_warning ("failed to add tls cert");
+}
+
+static void
+  vl_api_application_tls_key_add_reply_t_handler
+  (vl_api_application_tls_key_add_reply_t * mp)
+{
+  if (mp->retval)
+    clib_warning ("failed to add tls key");
+}
+
+#define foreach_tcp_echo_msg                                           \
+_(BIND_URI_REPLY, bind_uri_reply)                                      \
+_(UNBIND_URI_REPLY, unbind_uri_reply)                                  \
+_(ACCEPT_SESSION, accept_session)                                      \
+_(CONNECT_SESSION_REPLY, connect_session_reply)                        \
+_(DISCONNECT_SESSION, disconnect_session)                              \
+_(DISCONNECT_SESSION_REPLY, disconnect_session_reply)                  \
+_(RESET_SESSION, reset_session)                                        \
+_(APPLICATION_ATTACH_REPLY, application_attach_reply)                  \
+_(APPLICATION_DETACH_REPLY, application_detach_reply)                  \
+_(MAP_ANOTHER_SEGMENT, map_another_segment)                            \
+_(APPLICATION_TLS_CERT_ADD_REPLY, application_tls_cert_add_reply)      \
+_(APPLICATION_TLS_KEY_ADD_REPLY, application_tls_key_add_reply)                \
 
 void
 tcp_echo_api_hookup (echo_main_t * em)
@@ -1246,13 +1342,13 @@ tcp_echo_api_hookup (echo_main_t * em)
 int
 main (int argc, char **argv)
 {
-  int i_am_master = 1, drop_packets = 0, test_return_packets = 0;
+  int i_am_server = 1, test_return_packets = 0;
   echo_main_t *em = &echo_main;
   unformat_input_t _argv, *a = &_argv;
   u8 *chroot_prefix;
   u8 *heap, *uri = 0;
   u8 *bind_uri = (u8 *) "tcp://0.0.0.0/1234";
-  u8 *connect_uri = (u8 *) "tcp://6.0.1.2/1234";
+  u8 *connect_uri = (u8 *) "tcp://6.0.1.1/1234";
   u64 bytes_to_send = 64 << 10, mbytes;
   char *app_name;
   u32 tmp;
@@ -1269,11 +1365,11 @@ main (int argc, char **argv)
   vec_validate (em->rx_buf, 128 << 10);
 
   em->session_index_by_vpp_handles = hash_create (0, sizeof (uword));
-
   em->my_pid = getpid ();
   em->configured_segment_size = 1 << 20;
   em->socket_name = 0;
   em->use_sock_api = 1;
+  em->fifo_size = 64 << 10;
 
   clib_time_init (&em->clib_time);
   init_error_string_table (em);
@@ -1292,12 +1388,12 @@ main (int argc, char **argv)
        em->configured_segment_size = tmp << 20;
       else if (unformat (a, "segment-size %dG", &tmp))
        em->configured_segment_size = tmp << 30;
-      else if (unformat (a, "master"))
-       i_am_master = 1;
-      else if (unformat (a, "slave"))
-       i_am_master = 0;
-      else if (unformat (a, "drop"))
-       drop_packets = 1;
+      else if (unformat (a, "server"))
+       i_am_server = 1;
+      else if (unformat (a, "client"))
+       i_am_server = 0;
+      else if (unformat (a, "no-return"))
+       em->no_return = 1;
       else if (unformat (a, "test"))
        test_return_packets = 1;
       else if (unformat (a, "mbytes %lld", &mbytes))
@@ -1312,6 +1408,8 @@ main (int argc, char **argv)
        ;
       else if (unformat (a, "use-svm-api"))
        em->use_sock_api = 0;
+      else if (unformat (a, "fifo-size %d", &tmp))
+       em->fifo_size = tmp << 10;
       else
        {
          fformat (stderr, "%s: usage [master|slave]\n");
@@ -1333,9 +1431,8 @@ main (int argc, char **argv)
       em->connect_uri = format (0, "%s%c", connect_uri, 0);
     }
 
-  em->i_am_master = i_am_master;
+  em->i_am_master = i_am_server;
   em->segment_main = &svm_fifo_segment_main;
-  em->drop_packets = drop_packets;
   em->test_return_packets = test_return_packets;
   em->bytes_to_send = bytes_to_send;
   em->time_to_stop = 0;
@@ -1343,7 +1440,7 @@ main (int argc, char **argv)
   setup_signal_handlers ();
   tcp_echo_api_hookup (em);
 
-  app_name = i_am_master ? "tcp_echo_server" : "tcp_echo_client";
+  app_name = i_am_server ? "tcp_echo_server" : "tcp_echo_client";
   if (connect_to_vpp (app_name) < 0)
     {
       svm_region_exit ();
@@ -1351,7 +1448,7 @@ main (int argc, char **argv)
       exit (1);
     }
 
-  if (i_am_master == 0)
+  if (i_am_server == 0)
     client_run (em);
   else
     server_run (em);