LCOV - code coverage report
Current view: top level - plugins/hs_apps/sapi - vpp_echo_common.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 88 358 24.6 %
Date: 2023-07-05 22:20:52 Functions: 12 27 44.4 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2019 Cisco and/or its affiliates.
       3             :  * Licensed under the Apache License, Version 2.0 (the "License");
       4             :  * you may not use this file except in compliance with the License.
       5             :  * You may obtain a copy of the License at:
       6             :  *
       7             :  *     http://www.apache.org/licenses/LICENSE-2.0
       8             :  *
       9             :  * Unless required by applicable law or agreed to in writing, software
      10             :  * distributed under the License is distributed on an "AS IS" BASIS,
      11             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12             :  * See the License for the specific language governing permissions and
      13             :  * limitations under the License.
      14             :  */
      15             : 
      16             : #include <stdio.h>
      17             : #include <signal.h>
      18             : 
      19             : #include <hs_apps/sapi/vpp_echo_common.h>
      20             : 
      21             : char *echo_fail_code_str[] = {
      22             : #define _(sym, str) str,
      23             :   foreach_echo_fail_code
      24             : #undef _
      25             : };
      26             : 
      27             : /*
      28             :  *
      29             :  *  Format functions
      30             :  *
      31             :  */
      32             : 
      33             : u8 *
      34           1 : format_ip4_address (u8 * s, va_list * args)
      35             : {
      36           1 :   u8 *a = va_arg (*args, u8 *);
      37           1 :   return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
      38             : }
      39             : 
      40             : u8 *
      41           0 : format_ip6_address (u8 * s, va_list * args)
      42             : {
      43           0 :   ip6_address_t *a = va_arg (*args, ip6_address_t *);
      44             :   u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
      45             : 
      46           0 :   i_max_n_zero = ARRAY_LEN (a->as_u16);
      47           0 :   max_n_zeros = 0;
      48           0 :   i_first_zero = i_max_n_zero;
      49           0 :   n_zeros = 0;
      50           0 :   for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
      51             :     {
      52           0 :       u32 is_zero = a->as_u16[i] == 0;
      53           0 :       if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
      54             :         {
      55           0 :           i_first_zero = i;
      56           0 :           n_zeros = 0;
      57             :         }
      58           0 :       n_zeros += is_zero;
      59           0 :       if ((!is_zero && n_zeros > max_n_zeros)
      60           0 :           || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
      61             :         {
      62           0 :           i_max_n_zero = i_first_zero;
      63           0 :           max_n_zeros = n_zeros;
      64           0 :           i_first_zero = ARRAY_LEN (a->as_u16);
      65           0 :           n_zeros = 0;
      66             :         }
      67             :     }
      68             : 
      69           0 :   last_double_colon = 0;
      70           0 :   for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
      71             :     {
      72           0 :       if (i == i_max_n_zero && max_n_zeros > 1)
      73             :         {
      74           0 :           s = format (s, "::");
      75           0 :           i += max_n_zeros - 1;
      76           0 :           last_double_colon = 1;
      77             :         }
      78             :       else
      79             :         {
      80           0 :           s = format (s, "%s%x",
      81           0 :                       (last_double_colon || i == 0) ? "" : ":",
      82           0 :                       clib_net_to_host_u16 (a->as_u16[i]));
      83           0 :           last_double_colon = 0;
      84             :         }
      85             :     }
      86             : 
      87           0 :   return s;
      88             : }
      89             : 
      90             : /* Format an IP46 address. */
      91             : u8 *
      92           1 : format_ip46_address (u8 * s, va_list * args)
      93             : {
      94           1 :   ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
      95           1 :   ip46_type_t type = va_arg (*args, ip46_type_t);
      96           1 :   int is_ip4 = 1;
      97             : 
      98           1 :   switch (type)
      99             :     {
     100           0 :     case IP46_TYPE_ANY:
     101           0 :       is_ip4 = ip46_address_is_ip4 (ip46);
     102           0 :       break;
     103           1 :     case IP46_TYPE_IP4:
     104           1 :       is_ip4 = 1;
     105           1 :       break;
     106           0 :     case IP46_TYPE_IP6:
     107           0 :       is_ip4 = 0;
     108           0 :       break;
     109             :     }
     110             : 
     111           1 :   return is_ip4 ?
     112           1 :     format (s, "%U", format_ip4_address, &ip46->ip4) :
     113           0 :     format (s, "%U", format_ip6_address, &ip46->ip6);
     114             : }
     115             : 
     116             : u8 *
     117           0 : format_api_error (u8 * s, va_list * args)
     118             : {
     119           0 :   echo_main_t *em = &echo_main;
     120           0 :   i32 error = va_arg (*args, u32);
     121             :   uword *p;
     122             : 
     123           0 :   p = hash_get (em->error_string_by_error_number, -error);
     124             : 
     125           0 :   if (p)
     126           0 :     s = format (s, "%s", p[0]);
     127             :   else
     128           0 :     s = format (s, "%d", error);
     129           0 :   return s;
     130             : }
     131             : 
     132             : void
     133           4 : init_error_string_table ()
     134             : {
     135           4 :   echo_main_t *em = &echo_main;
     136           4 :   em->error_string_by_error_number = hash_create (0, sizeof (uword));
     137             : 
     138             : #define _(n,v,s) hash_set (em->error_string_by_error_number, -v, s);
     139           4 :   foreach_vnet_api_error;
     140             : #undef _
     141             : 
     142           4 :   hash_set (em->error_string_by_error_number, 99, "Misc");
     143           4 : }
     144             : 
     145             : u8 *
     146           0 : echo_format_session (u8 * s, va_list * args)
     147             : {
     148           0 :   echo_session_t *session = va_arg (*args, echo_session_t *);
     149             : 
     150           0 :   return format (s, "%U 0x%lx S[%u]", echo_format_session_type,
     151           0 :                  session->session_type, session->vpp_session_handle,
     152             :                  session->session_index);
     153             : }
     154             : 
     155             : u8 *
     156           0 : echo_format_session_type (u8 * s, va_list * args)
     157             : {
     158           0 :   u32 session_type = va_arg (*args, u32);
     159           0 :   switch (session_type)
     160             :     {
     161           0 :     case ECHO_SESSION_TYPE_QUIC:
     162           0 :       return format (s, "Qsession");
     163           0 :     case ECHO_SESSION_TYPE_STREAM:
     164           0 :       return format (s, "Stream");
     165           0 :     case ECHO_SESSION_TYPE_LISTEN:
     166           0 :       return format (s, "Lsession");
     167           0 :     default:
     168           0 :       break;
     169             :     }
     170           0 :   return format (s, "BadSession");
     171             : }
     172             : 
     173             : u8 *
     174           0 : echo_format_session_state (u8 * s, va_list * args)
     175             : {
     176           0 :   u32 session_state = va_arg (*args, u32);
     177           0 :   switch (session_state)
     178             :     {
     179           0 :     case ECHO_SESSION_STATE_INITIAL:
     180           0 :       return format (s, "ECHO_SESSION_STATE_INITIAL (%u)", session_state);
     181           0 :     case ECHO_SESSION_STATE_READY:
     182           0 :       return format (s, "ECHO_SESSION_STATE_READY (%u)", session_state);
     183           0 :     case ECHO_SESSION_STATE_AWAIT_CLOSING:
     184           0 :       return format (s, "ECHO_SESSION_STATE_AWAIT_CLOSING (%u)",
     185             :                      session_state);
     186           0 :     case ECHO_SESSION_STATE_AWAIT_DATA:
     187           0 :       return format (s, "ECHO_SESSION_STATE_AWAIT_DATA (%u)", session_state);
     188           0 :     case ECHO_SESSION_STATE_CLOSING:
     189           0 :       return format (s, "ECHO_SESSION_STATE_CLOSING (%u)", session_state);
     190           0 :     case ECHO_SESSION_STATE_CLOSED:
     191           0 :       return format (s, "ECHO_SESSION_STATE_CLOSED (%u)", session_state);
     192           0 :     default:
     193           0 :       break;
     194             :     }
     195           0 :   return format (s, "unknown session state (%u)", session_state);
     196             : }
     197             : 
     198             : u8 *
     199           0 : echo_format_app_state (u8 * s, va_list * args)
     200             : {
     201           0 :   u32 state = va_arg (*args, u32);
     202           0 :   if (state == STATE_START)
     203           0 :     return format (s, "STATE_START (%u)", state);
     204           0 :   if (state == STATE_ATTACHED)
     205           0 :     return format (s, "STATE_ATTACHED (%u)", state);
     206           0 :   if (state == STATE_ATTACHED_NO_CERT)
     207           0 :     return format (s, "STATE_ATTACHED_NO_CERT (%u)", state);
     208           0 :   if (state == STATE_LISTEN)
     209           0 :     return format (s, "STATE_LISTEN (%u)", state);
     210           0 :   if (state == STATE_READY)
     211           0 :     return format (s, "STATE_READY (%u)", state);
     212           0 :   if (state == STATE_DATA_DONE)
     213           0 :     return format (s, "STATE_DATA_DONE (%u)", state);
     214           0 :   if (state == STATE_DISCONNECTED)
     215           0 :     return format (s, "STATE_DISCONNECTED (%u)", state);
     216           0 :   if (state == STATE_DETACHED)
     217           0 :     return format (s, "STATE_DETACHED (%u)", state);
     218             :   else
     219           0 :     return format (s, "unknown state (%u)", state);
     220             : }
     221             : 
     222             : uword
     223           0 : echo_unformat_close (unformat_input_t * input, va_list * args)
     224             : {
     225           0 :   u8 *a = va_arg (*args, u8 *);
     226           0 :   if (unformat (input, "Y"))
     227           0 :     *a = ECHO_CLOSE_F_ACTIVE;
     228           0 :   else if (unformat (input, "N"))
     229           0 :     *a = ECHO_CLOSE_F_NONE;
     230           0 :   else if (unformat (input, "W"))
     231           0 :     *a = ECHO_CLOSE_F_PASSIVE;
     232             :   else
     233           0 :     return 0;
     234           0 :   return 1;
     235             : }
     236             : 
     237             : uword
     238           0 : echo_unformat_timing_event (unformat_input_t * input, va_list * args)
     239             : {
     240           0 :   u8 *a = va_arg (*args, u8 *);
     241           0 :   if (unformat (input, "start"))
     242           0 :     *a = ECHO_EVT_START;
     243           0 :   else if (unformat (input, "qconnected"))
     244           0 :     *a = ECHO_EVT_LAST_QCONNECTED;
     245           0 :   else if (unformat (input, "qconnect"))
     246           0 :     *a = ECHO_EVT_FIRST_QCONNECT;
     247           0 :   else if (unformat (input, "sconnected"))
     248           0 :     *a = ECHO_EVT_LAST_SCONNECTED;
     249           0 :   else if (unformat (input, "sconnect"))
     250           0 :     *a = ECHO_EVT_FIRST_SCONNECT;
     251           0 :   else if (unformat (input, "lastbyte"))
     252           0 :     *a = ECHO_EVT_LAST_BYTE;
     253           0 :   else if (unformat (input, "exit"))
     254           0 :     *a = ECHO_EVT_EXIT;
     255             :   else
     256           0 :     return 0;
     257           0 :   return 1;
     258             : }
     259             : 
     260             : u8 *
     261           0 : echo_format_bytes_per_sec (u8 * s, va_list * args)
     262             : {
     263           0 :   f64 bps = va_arg (*args, f64) * 8;
     264           0 :   if (bps > 1e9)
     265           0 :     return format (s, "%.3f Gb/s", bps / 1e9);
     266           0 :   else if (bps > 1e6)
     267           0 :     return format (s, "%.3f Mb/s", bps / 1e6);
     268           0 :   else if (bps > 1e3)
     269           0 :     return format (s, "%.3f Kb/s", bps / 1e3);
     270             :   else
     271           0 :     return format (s, "%.3f b/s", bps);
     272             : }
     273             : 
     274             : u8 *
     275           8 : echo_format_timing_event (u8 * s, va_list * args)
     276             : {
     277           8 :   u32 timing_event = va_arg (*args, u32);
     278           8 :   if (timing_event == ECHO_EVT_START)
     279           0 :     return format (s, "start");
     280           8 :   if (timing_event == ECHO_EVT_FIRST_QCONNECT)
     281           4 :     return format (s, "qconnect");
     282           4 :   if (timing_event == ECHO_EVT_LAST_QCONNECTED)
     283           0 :     return format (s, "qconnected");
     284           4 :   if (timing_event == ECHO_EVT_FIRST_SCONNECT)
     285           0 :     return format (s, "sconnect");
     286           4 :   if (timing_event == ECHO_EVT_LAST_SCONNECTED)
     287           0 :     return format (s, "sconnected");
     288           4 :   if (timing_event == ECHO_EVT_LAST_BYTE)
     289           4 :     return format (s, "lastbyte");
     290           0 :   if (timing_event == ECHO_EVT_EXIT)
     291           0 :     return format (s, "exit");
     292             :   else
     293           0 :     return format (s, "unknown timing event");
     294             : }
     295             : 
     296             : uword
     297           4 : unformat_transport_proto (unformat_input_t * input, va_list * args)
     298             : {
     299           4 :   u32 *proto = va_arg (*args, u32 *);
     300           4 :   if (unformat (input, "tcp"))
     301           0 :     *proto = TRANSPORT_PROTO_TCP;
     302           4 :   else if (unformat (input, "TCP"))
     303           0 :     *proto = TRANSPORT_PROTO_TCP;
     304           4 :   else if (unformat (input, "udp"))
     305           0 :     *proto = TRANSPORT_PROTO_UDP;
     306           4 :   else if (unformat (input, "UDP"))
     307           0 :     *proto = TRANSPORT_PROTO_UDP;
     308           4 :   else if (unformat (input, "tls"))
     309           0 :     *proto = TRANSPORT_PROTO_TLS;
     310           4 :   else if (unformat (input, "TLS"))
     311           0 :     *proto = TRANSPORT_PROTO_TLS;
     312           4 :   else if (unformat (input, "quic"))
     313           4 :     *proto = TRANSPORT_PROTO_QUIC;
     314           0 :   else if (unformat (input, "QUIC"))
     315           0 :     *proto = TRANSPORT_PROTO_QUIC;
     316             :   else
     317           0 :     return 0;
     318           4 :   return 1;
     319             : }
     320             : 
     321             : u8 *
     322           0 : format_transport_proto (u8 * s, va_list * args)
     323             : {
     324           0 :   u32 transport_proto = va_arg (*args, u32);
     325           0 :   switch (transport_proto)
     326             :     {
     327           0 :     case TRANSPORT_PROTO_TCP:
     328           0 :       s = format (s, "TCP");
     329           0 :       break;
     330           0 :     case TRANSPORT_PROTO_UDP:
     331           0 :       s = format (s, "UDP");
     332           0 :       break;
     333           0 :     case TRANSPORT_PROTO_NONE:
     334           0 :       s = format (s, "NONE");
     335           0 :       break;
     336           0 :     case TRANSPORT_PROTO_TLS:
     337           0 :       s = format (s, "TLS");
     338           0 :       break;
     339           0 :     case TRANSPORT_PROTO_QUIC:
     340           0 :       s = format (s, "QUIC");
     341           0 :       break;
     342           0 :     case TRANSPORT_PROTO_DTLS:
     343           0 :       s = format (s, "DTLS");
     344           0 :       break;
     345           0 :     case TRANSPORT_PROTO_SRTP:
     346           0 :       s = format (s, "SRTP");
     347           0 :       break;
     348           0 :     default:
     349           0 :       s = format (s, "UNKNOWN");
     350           0 :       break;
     351             :     }
     352           0 :   return s;
     353             : }
     354             : 
     355             : uword
     356           4 : unformat_ip4_address (unformat_input_t * input, va_list * args)
     357             : {
     358           4 :   u8 *result = va_arg (*args, u8 *);
     359             :   unsigned a[4];
     360             : 
     361           4 :   if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
     362           0 :     return 0;
     363             : 
     364           4 :   if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
     365           0 :     return 0;
     366             : 
     367           4 :   result[0] = a[0];
     368           4 :   result[1] = a[1];
     369           4 :   result[2] = a[2];
     370           4 :   result[3] = a[3];
     371             : 
     372           4 :   return 1;
     373             : }
     374             : 
     375             : uword
     376           0 : unformat_ip6_address (unformat_input_t * input, va_list * args)
     377             : {
     378           0 :   ip6_address_t *result = va_arg (*args, ip6_address_t *);
     379             :   u16 hex_quads[8];
     380             :   uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
     381             :   uword c, n_colon, double_colon_index;
     382             : 
     383           0 :   n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
     384           0 :   double_colon_index = ARRAY_LEN (hex_quads);
     385           0 :   while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
     386             :     {
     387           0 :       hex_digit = 16;
     388           0 :       if (c >= '0' && c <= '9')
     389           0 :         hex_digit = c - '0';
     390           0 :       else if (c >= 'a' && c <= 'f')
     391           0 :         hex_digit = c + 10 - 'a';
     392           0 :       else if (c >= 'A' && c <= 'F')
     393           0 :         hex_digit = c + 10 - 'A';
     394           0 :       else if (c == ':' && n_colon < 2)
     395           0 :         n_colon++;
     396             :       else
     397             :         {
     398           0 :           unformat_put_input (input);
     399           0 :           break;
     400             :         }
     401             : 
     402             :       /* Too many hex quads. */
     403           0 :       if (n_hex_quads >= ARRAY_LEN (hex_quads))
     404           0 :         return 0;
     405             : 
     406           0 :       if (hex_digit < 16)
     407             :         {
     408           0 :           hex_quad = (hex_quad << 4) | hex_digit;
     409             : 
     410             :           /* Hex quad must fit in 16 bits. */
     411           0 :           if (n_hex_digits >= 4)
     412           0 :             return 0;
     413             : 
     414           0 :           n_colon = 0;
     415           0 :           n_hex_digits++;
     416             :         }
     417             : 
     418             :       /* Save position of :: */
     419           0 :       if (n_colon == 2)
     420             :         {
     421             :           /* More than one :: ? */
     422           0 :           if (double_colon_index < ARRAY_LEN (hex_quads))
     423           0 :             return 0;
     424           0 :           double_colon_index = n_hex_quads;
     425             :         }
     426             : 
     427           0 :       if (n_colon > 0 && n_hex_digits > 0)
     428             :         {
     429           0 :           hex_quads[n_hex_quads++] = hex_quad;
     430           0 :           hex_quad = 0;
     431           0 :           n_hex_digits = 0;
     432             :         }
     433             :     }
     434             : 
     435           0 :   if (n_hex_digits > 0)
     436           0 :     hex_quads[n_hex_quads++] = hex_quad;
     437             : 
     438             :   {
     439             :     word i;
     440             : 
     441             :     /* Expand :: to appropriate number of zero hex quads. */
     442           0 :     if (double_colon_index < ARRAY_LEN (hex_quads))
     443             :       {
     444           0 :         word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
     445             : 
     446           0 :         for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
     447           0 :           hex_quads[n_zero + i] = hex_quads[i];
     448             : 
     449           0 :         for (i = 0; i < n_zero; i++)
     450           0 :           hex_quads[double_colon_index + i] = 0;
     451             : 
     452           0 :         n_hex_quads = ARRAY_LEN (hex_quads);
     453             :       }
     454             : 
     455             :     /* Too few hex quads given. */
     456           0 :     if (n_hex_quads < ARRAY_LEN (hex_quads))
     457           0 :       return 0;
     458             : 
     459           0 :     for (i = 0; i < ARRAY_LEN (hex_quads); i++)
     460           0 :       result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
     461             : 
     462           0 :     return 1;
     463             :   }
     464             : }
     465             : 
     466             : uword
     467           0 : unformat_ip46_address (unformat_input_t * input, va_list * args)
     468             : {
     469           0 :   ip46_address_t *ip = va_arg (*args, ip46_address_t *);
     470             : 
     471           0 :   if (unformat (input, "%U", unformat_ip4_address, &ip->ip4))
     472             :     ;
     473           0 :   else if (unformat (input, "%U", unformat_ip6_address, &ip->ip6))
     474             :     ;
     475             :   else
     476           0 :     return 0;
     477           0 :   return 1;
     478             : }
     479             : 
     480             : u8 *
     481           0 : echo_format_crypto_engine (u8 * s, va_list * args)
     482             : {
     483           0 :   u32 state = va_arg (*args, u32);
     484           0 :   if (state == CRYPTO_ENGINE_MBEDTLS)
     485           0 :     return format (s, "mbedtls");
     486           0 :   if (state == CRYPTO_ENGINE_OPENSSL)
     487           0 :     return format (s, "openssl");
     488           0 :   if (state == CRYPTO_ENGINE_PICOTLS)
     489           0 :     return format (s, "picotls");
     490           0 :   if (state == CRYPTO_ENGINE_VPP)
     491           0 :     return format (s, "vpp");
     492             :   else
     493           0 :     return format (s, "unknown crypto engine");
     494             : }
     495             : 
     496             : uword
     497           0 : echo_unformat_crypto_engine (unformat_input_t * input, va_list * args)
     498             : {
     499           0 :   u8 *a = va_arg (*args, u8 *);
     500           0 :   if (unformat (input, "mbedtls"))
     501           0 :     *a = CRYPTO_ENGINE_MBEDTLS;
     502           0 :   else if (unformat (input, "openssl"))
     503           0 :     *a = CRYPTO_ENGINE_OPENSSL;
     504           0 :   else if (unformat (input, "picotls"))
     505           0 :     *a = CRYPTO_ENGINE_PICOTLS;
     506           0 :   else if (unformat (input, "vpp"))
     507           0 :     *a = CRYPTO_ENGINE_VPP;
     508             :   else
     509           0 :     return 0;
     510           0 :   return 1;
     511             : }
     512             : 
     513             : 
     514             : /*
     515             :  *
     516             :  *  End of format functions
     517             :  *
     518             :  */
     519             : 
     520             : void
     521          20 : echo_session_handle_add_del (echo_main_t * em, u64 handle, u32 sid)
     522             : {
     523          20 :   clib_spinlock_lock (&em->sid_vpp_handles_lock);
     524          20 :   if (sid == SESSION_INVALID_INDEX)
     525             :     {
     526          10 :       ECHO_LOG (3, "hash_unset(0x%lx)", handle);
     527          10 :       hash_unset (em->session_index_by_vpp_handles, handle);
     528             :     }
     529             :   else
     530             :     {
     531          10 :       ECHO_LOG (3, "hash_set(0x%lx) S[%d]", handle, sid);
     532          10 :       hash_set (em->session_index_by_vpp_handles, handle, sid);
     533             :     }
     534          20 :   clib_spinlock_unlock (&em->sid_vpp_handles_lock);
     535          20 : }
     536             : 
     537             : echo_session_t *
     538          10 : echo_session_new (echo_main_t * em)
     539             : {
     540             :   /* thread safe new prealloced session
     541             :    * see echo_session_prealloc */
     542          10 :   return pool_elt_at_index (em->sessions,
     543             :                             clib_atomic_fetch_add (&em->nxt_available_sidx,
     544             :                                                    1));
     545             : }
     546             : 
     547             : int
     548           6 : echo_send_rpc (echo_main_t * em, void *fp, echo_rpc_args_t * args)
     549             : {
     550             :   svm_msg_q_msg_t msg;
     551             :   echo_rpc_msg_t *evt;
     552           6 :   if (PREDICT_FALSE (svm_msg_q_lock (&em->rpc_msq_queue)))
     553             :     {
     554           0 :       ECHO_FAIL (ECHO_FAIL_RPC_SIZE, "RPC lock failed");
     555           0 :       return -1;
     556             :     }
     557           6 :   if (PREDICT_FALSE (svm_msg_q_ring_is_full (&em->rpc_msq_queue, 0)))
     558             :     {
     559           0 :       svm_msg_q_unlock (&em->rpc_msq_queue);
     560           0 :       ECHO_FAIL (ECHO_FAIL_RPC_SIZE, "RPC ring is full");
     561           0 :       return -2;
     562             :     }
     563           6 :   msg = svm_msg_q_alloc_msg_w_ring (&em->rpc_msq_queue, 0);
     564           6 :   evt = (echo_rpc_msg_t *) svm_msg_q_msg_data (&em->rpc_msq_queue, &msg);
     565           6 :   evt->fp = fp;
     566           6 :   clib_memcpy (&evt->args, args, sizeof (evt->args));
     567             : 
     568           6 :   svm_msg_q_add_and_unlock (&em->rpc_msq_queue, &msg);
     569           6 :   return 0;
     570             : }
     571             : 
     572             : echo_session_t *
     573          12 : echo_get_session_from_handle (echo_main_t * em, u64 handle)
     574             : {
     575             :   uword *p;
     576          12 :   clib_spinlock_lock (&em->sid_vpp_handles_lock);
     577          12 :   p = hash_get (em->session_index_by_vpp_handles, handle);
     578          12 :   clib_spinlock_unlock (&em->sid_vpp_handles_lock);
     579          12 :   if (!p)
     580             :     {
     581           0 :       ECHO_LOG (2, "unknown handle 0x%lx", handle);
     582           0 :       return 0;
     583             :     }
     584          12 :   return pool_elt_at_index (em->sessions, p[0]);
     585             : }
     586             : 
     587             : int
     588          10 : wait_for_state_change (echo_main_t * em, connection_state_t state,
     589             :                        f64 timeout)
     590             : {
     591          10 :   f64 end_time = clib_time_now (&em->clib_time) + timeout;
     592  1145540000 :   while (!timeout || clib_time_now (&em->clib_time) < end_time)
     593             :     {
     594  1145540000 :       if (em->state == state)
     595          10 :         return 0;
     596  1145540000 :       if (em->time_to_stop)
     597           0 :         return 1;
     598             :     }
     599           0 :   ECHO_LOG (2, "timeout waiting for %U", echo_format_app_state, state);
     600           0 :   return -1;
     601             : }
     602             : 
     603             : void
     604          28 : echo_notify_event (echo_main_t * em, echo_test_evt_t e)
     605             : {
     606          28 :   if (em->timing.events_sent & e)
     607           0 :     return;
     608          28 :   if (em->timing.start_event == e)
     609           4 :     em->timing.start_time = clib_time_now (&em->clib_time);
     610          24 :   else if (em->timing.end_event == e)
     611           4 :     em->timing.end_time = clib_time_now (&em->clib_time);
     612          28 :   em->timing.events_sent |= e;
     613             : }
     614             : 
     615             : void
     616           0 : echo_session_print_stats (echo_main_t * em, echo_session_t * session)
     617             : {
     618           0 :   f64 deltat = clib_time_now (&em->clib_time) - session->start;
     619           0 :   ECHO_LOG (1, "Session 0x%x done in %.6fs RX[%.4f] TX[%.4f] Gbit/s\n",
     620             :             session->vpp_session_handle, deltat,
     621             :             (session->bytes_received * 8.0) / deltat / 1e9,
     622             :             (session->bytes_sent * 8.0) / deltat / 1e9);
     623           0 : }
     624             : 
     625             : /*
     626             :  * fd.io coding-style-patch-verification: ON
     627             :  *
     628             :  * Local Variables:
     629             :  * eval: (c-set-style "gnu")
     630             :  * End:
     631             :  */

Generated by: LCOV version 1.14