LCOV - code coverage report
Current view: top level - plugins/ioam/lib-trace - trace_util.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 15 78 19.2 %
Date: 2023-07-05 22:20:52 Functions: 9 14 64.3 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2016 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             : #include <vnet/vnet.h>
      16             : #include <stdint.h>
      17             : #include <time.h>
      18             : #include <string.h>
      19             : #include <vppinfra/mem.h>
      20             : #include "trace_util.h"
      21             : #include "trace_config.h"
      22             : 
      23             : __clib_export trace_main_t trace_main;
      24             : 
      25             : static int
      26         559 : trace_profile_cleanup (trace_profile * profile)
      27             : {
      28             : 
      29         559 :   clib_memset (profile, 0, sizeof (trace_profile));
      30         559 :   profile->trace_tsp = TSP_MICROSECONDS;     /* Micro seconds */
      31         559 :   ip6_trace_profile_cleanup (); /* lib-trace_TODO: Remove this once IOAM-IPv6 transport is a plugin */
      32         559 :   return 0;
      33             : 
      34             : }
      35             : 
      36             : static int
      37         559 : trace_main_profiles_reset (void)
      38             : {
      39             :   int rv;
      40             : 
      41         559 :   trace_main_t *sm = &trace_main;
      42         559 :   rv = trace_profile_cleanup (&(sm->profile));
      43         559 :   return (rv);
      44             : }
      45             : 
      46             : int
      47         559 : trace_util_init (void)
      48             : {
      49             :   int rv;
      50             : 
      51         559 :   rv = trace_main_profiles_reset ();
      52         559 :   return (rv);
      53             : }
      54             : 
      55             : 
      56             : int
      57           0 : trace_profile_create (trace_profile * profile, u8 trace_type, u8 num_elts,
      58             :                       u32 trace_tsp, u32 node_id, u32 app_data)
      59             : {
      60             : 
      61           0 :   if (!trace_type || !num_elts || !(node_id))
      62             :     {
      63           0 :       return (-1);
      64             :     }
      65           0 :   if (profile && !profile->valid)
      66             :     {
      67             :       //rv = trace_profile_cleanup (profile);
      68           0 :       profile->trace_type = trace_type;
      69           0 :       profile->num_elts = num_elts;
      70           0 :       profile->trace_tsp = trace_tsp;
      71           0 :       profile->node_id = node_id;
      72           0 :       profile->app_data = app_data;
      73           0 :       profile->valid = 1;
      74             : 
      75             :       /* lib-trace_TODO: Remove this once IOAM-IPv6 transport is a plugin */
      76           0 :       ip6_trace_profile_setup ();
      77           0 :       return (0);
      78             :     }
      79             : 
      80           0 :   return (-1);
      81             : }
      82             : 
      83             : 
      84             : 
      85             : clib_error_t *
      86           0 : clear_trace_profile_command_fn (vlib_main_t * vm,
      87             :                                 unformat_input_t * input,
      88             :                                 vlib_cli_command_t * cmd)
      89             : {
      90             : 
      91           0 :   trace_main_profiles_reset ();
      92           0 :   return 0;
      93             : }
      94             : 
      95             : void
      96           0 : clear_trace_profiles (void)
      97             : {
      98           0 :   clear_trace_profile_command_fn (0, 0, 0);
      99           0 : }
     100             : 
     101             : /* *INDENT-OFF* */
     102      176567 : VLIB_CLI_COMMAND(clear_trace_profile_command) =
     103             : {
     104             : .path = "clear ioam-trace profile",
     105             : .short_help = "clear ioam-trace profile [<index>|all]",
     106             : .function = clear_trace_profile_command_fn,
     107             : };
     108             : /* *INDENT-ON* */
     109             : 
     110             : static clib_error_t *
     111           0 : set_trace_profile_command_fn (vlib_main_t * vm,
     112             :                               unformat_input_t * input,
     113             :                               vlib_cli_command_t * cmd)
     114             : {
     115           0 :   u8 trace_type = 0;
     116           0 :   u8 num_elts = 0;
     117           0 :   u32 node_id = 0;
     118           0 :   u32 app_data = 0;
     119           0 :   u32 trace_tsp = 0;
     120           0 :   trace_profile *profile = NULL;
     121           0 :   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     122             :     {
     123           0 :       if (unformat (input, "trace-type 0x%x", &trace_type));
     124           0 :       else if (unformat (input, "trace-elts %d", &num_elts));
     125           0 :       else if (unformat (input, "trace-tsp %d", &trace_tsp));
     126           0 :       else if (unformat (input, "node-id 0x%x", &node_id));
     127           0 :       else if (unformat (input, "app-data 0x%x", &app_data));
     128             :       else
     129           0 :         break;
     130             :     }
     131           0 :   profile = trace_profile_find ();
     132           0 :   if (profile)
     133             :     {
     134           0 :       trace_profile_create (profile, trace_type, num_elts, trace_tsp,
     135             :                             node_id, app_data);
     136             :     }
     137           0 :   return 0;
     138             : }
     139             : 
     140             : /* *INDENT-OFF* */
     141      176567 : VLIB_CLI_COMMAND (set_trace_profile_command, static) =
     142             : {
     143             : .path = "set ioam-trace profile",
     144             : .short_help = "set ioam-trace \
     145             :              trace-type <0x1f|0x3|0x9|0x11|0x19> trace-elts <nn> trace-tsp <0|1|2|3> \
     146             :              node-id <node id in hex> app-data <app_data in hex>",
     147             : .function = set_trace_profile_command_fn,
     148             : };
     149             : /* *INDENT-ON* */
     150             : 
     151             : static clib_error_t *
     152           0 : show_trace_profile_command_fn (vlib_main_t * vm,
     153             :                                unformat_input_t * input,
     154             :                                vlib_cli_command_t * cmd)
     155             : {
     156           0 :   trace_profile *p = NULL;
     157           0 :   u8 *s = 0;
     158           0 :   p = trace_profile_find ();
     159           0 :   if (!(p && p->valid))
     160             :     {
     161           0 :       s = format (s, "\nTrace configuration not valid\n");
     162           0 :       vlib_cli_output (vm, "%v", s);
     163           0 :       vec_free (s);
     164           0 :       return 0;
     165             :     }
     166           0 :   s = format (s, " HOP BY HOP OPTIONS - TRACE CONFIG - \n");
     167           0 :   s = format (s, "                        Trace Type : 0x%x (%d)\n",
     168           0 :               p->trace_type, p->trace_type);
     169           0 :   s =
     170           0 :     format (s, "         Trace timestamp precision : %d (%s)\n",
     171             :             p->trace_tsp,
     172           0 :             (p->trace_tsp ==
     173           0 :              TSP_SECONDS) ? "Seconds" : ((p->trace_tsp ==
     174             :                                           TSP_MILLISECONDS) ?
     175             :                                          "Milliseconds"
     176           0 :                                          : (((p->trace_tsp ==
     177             :                                               TSP_MICROSECONDS) ?
     178           0 :                                              "Microseconds" :
     179             :                                              "Nanoseconds"))));
     180           0 :   s = format (s, "                Num of trace nodes : %d\n", p->num_elts);
     181           0 :   s =
     182           0 :     format (s, "                           Node-id : 0x%x (%d)\n",
     183             :             p->node_id, p->node_id);
     184           0 :   s =
     185           0 :     format (s, "                          App Data : 0x%x (%d)\n",
     186             :             p->app_data, p->app_data);
     187           0 :   vlib_cli_output (vm, "%v", s);
     188           0 :   vec_free (s);
     189           0 :   return 0;
     190             : }
     191             : 
     192             : /* *INDENT-OFF* */
     193      176567 : VLIB_CLI_COMMAND (show_trace_profile_command, static) =
     194             : {
     195             : .path = "show ioam-trace profile",
     196             : .short_help = "show ioam-trace profile",
     197             : .function = show_trace_profile_command_fn,
     198             : };
     199             : /* *INDENT-ON* */
     200             : 
     201             : /*
     202             :  * fd.io coding-style-patch-verification: ON
     203             :  *
     204             :  * Local Variables:
     205             :  * eval: (c-set-style "gnu")
     206             :  * End:
     207             :  */

Generated by: LCOV version 1.14