b316a236286fa76d44adccc9038ab4953fa57547
[vpp.git] / src / plugins / ioam / lib-trace / trace_util.c
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 trace_main_t trace_main;
24
25 static int
26 trace_profile_cleanup (trace_profile * profile)
27 {
28
29   memset (profile, 0, sizeof (trace_profile));
30   profile->trace_tsp = TSP_MICROSECONDS;        /* Micro seconds */
31   ip6_trace_profile_cleanup (); /* lib-trace_TODO: Remove this once IOAM-IPv6 transport is a plugin */
32   return 0;
33
34 }
35
36 static int
37 trace_main_profiles_reset (void)
38 {
39   int rv;
40
41   trace_main_t *sm = &trace_main;
42   rv = trace_profile_cleanup (&(sm->profile));
43   return (rv);
44 }
45
46 int
47 trace_util_init (void)
48 {
49   int rv;
50
51   rv = trace_main_profiles_reset ();
52   return (rv);
53 }
54
55
56 int
57 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   if (!trace_type || !num_elts || !(node_id))
62     {
63       return (-1);
64     }
65   if (profile && !profile->valid)
66     {
67       //rv = trace_profile_cleanup (profile);
68       profile->trace_type = trace_type;
69       profile->num_elts = num_elts;
70       profile->trace_tsp = trace_tsp;
71       profile->node_id = node_id;
72       profile->app_data = app_data;
73       profile->valid = 1;
74
75       /* lib-trace_TODO: Remove this once IOAM-IPv6 transport is a plugin */
76       ip6_trace_profile_setup ();
77       return (0);
78     }
79
80   return (-1);
81 }
82
83
84
85 clib_error_t *
86 clear_trace_profile_command_fn (vlib_main_t * vm,
87                                 unformat_input_t * input,
88                                 vlib_cli_command_t * cmd)
89 {
90
91   trace_main_profiles_reset ();
92   return 0;
93 }
94
95 void
96 clear_trace_profiles (void)
97 {
98   clear_trace_profile_command_fn (0, 0, 0);
99 }
100
101 /* *INDENT-OFF* */
102 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 set_trace_profile_command_fn (vlib_main_t * vm,
112                               unformat_input_t * input,
113                               vlib_cli_command_t * cmd)
114 {
115   u8 trace_type = 0;
116   u8 num_elts = 0;
117   u32 node_id = 0;
118   u32 app_data = 0;
119   u32 trace_tsp = 0;
120   trace_profile *profile = NULL;
121   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
122     {
123       if (unformat (input, "trace-type 0x%x", &trace_type));
124       else if (unformat (input, "trace-elts %d", &num_elts));
125       else if (unformat (input, "trace-tsp %d", &trace_tsp));
126       else if (unformat (input, "node-id 0x%x", &node_id));
127       else if (unformat (input, "app-data 0x%x", &app_data));
128       else
129         break;
130     }
131   profile = trace_profile_find ();
132   if (profile)
133     {
134       trace_profile_create (profile, trace_type, num_elts, trace_tsp,
135                             node_id, app_data);
136     }
137   return 0;
138 }
139
140 /* *INDENT-OFF* */
141 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 show_trace_profile_command_fn (vlib_main_t * vm,
153                                unformat_input_t * input,
154                                vlib_cli_command_t * cmd)
155 {
156   trace_profile *p = NULL;
157   u8 *s = 0;
158   p = trace_profile_find ();
159   if (!(p && p->valid))
160     {
161       s = format (s, "\nTrace configuration not valid\n");
162       vlib_cli_output (vm, "%v", s);
163       vec_free (s);
164       return 0;
165     }
166   s = format (s, " HOP BY HOP OPTIONS - TRACE CONFIG - \n");
167   s = format (s, "                        Trace Type : 0x%x (%d)\n",
168               p->trace_type, p->trace_type);
169   s =
170     format (s, "         Trace timestamp precision : %d (%s)\n",
171             p->trace_tsp,
172             (p->trace_tsp ==
173              TSP_SECONDS) ? "Seconds" : ((p->trace_tsp ==
174                                           TSP_MILLISECONDS) ?
175                                          "Milliseconds"
176                                          : (((p->trace_tsp ==
177                                               TSP_MICROSECONDS) ?
178                                              "Microseconds" :
179                                              "Nanoseconds"))));
180   s = format (s, "                Num of trace nodes : %d\n", p->num_elts);
181   s =
182     format (s, "                           Node-id : 0x%x (%d)\n",
183             p->node_id, p->node_id);
184   s =
185     format (s, "                          App Data : 0x%x (%d)\n",
186             p->app_data, p->app_data);
187   vlib_cli_output (vm, "%v", s);
188   vec_free (s);
189   return 0;
190 }
191
192 /* *INDENT-OFF* */
193 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  */