dpdk: xstats vecor stuck at 0 elements
[vpp.git] / src / plugins / ioam / analyse / ip6 / ip6_ioam_analyse.c
1 /*
2  * Copyright (c) 2017 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 <vnet/ethernet/ethernet.h>
17 #include <ioam/analyse/ioam_analyse.h>
18 #include <ioam/export-common/ioam_export.h>
19 #include <ioam/analyse/ip6/ip6_ioam_analyse.h>
20 #include <ioam/analyse/ioam_summary_export.h>
21 #include <vnet/ip/ip.h>
22 #include <ioam/ipfixcollector/ipfixcollector.h>
23
24 extern ioam_export_main_t ioam_export_main;
25 static clib_error_t *
26 ioam_analyse_enable_disable (vlib_main_t * vm,
27                              int is_add, int is_export, int remote_listen)
28 {
29   ipfix_client_add_del_t ipfix_reg;
30   clib_error_t *rv = 0;
31
32   ipfix_reg.client_name = format (0, "ip6-hbh-analyse-remote");
33   ipfix_reg.client_node = analyse_node_remote.index;
34   ipfix_reg.ipfix_setid = IPFIX_IOAM_EXPORT_ID;
35
36   if (is_export)
37     {
38       rv = ioam_flow_create (!is_add);
39       if (rv)
40         goto ret;
41     }
42
43   if (is_add)
44     {
45       ip6_ioam_analyse_register_handlers ();
46       if (remote_listen)
47         {
48           ipfix_reg.del = 0;
49           ipfix_collector_reg_setid (vm, &ipfix_reg);
50         }
51       else
52         {
53           ioam_export_set_next_node (&ioam_export_main,
54                                      (u8 *) "ip6-hbh-analyse-local");
55         }
56     }
57   else
58     {
59       ip6_ioam_analyse_unregister_handlers ();
60       if (remote_listen)
61         {
62           ipfix_reg.del = 1;
63           ipfix_collector_reg_setid (vm, &ipfix_reg);
64         }
65       else
66         ioam_export_reset_next_node (&ioam_export_main);
67     }
68
69 ret:
70   vec_free (ipfix_reg.client_name);
71   return rv;
72 }
73
74 static clib_error_t *
75 set_ioam_analyse_command_fn (vlib_main_t * vm, unformat_input_t * input,
76                              vlib_cli_command_t * cmd)
77 {
78   int is_export = 0;
79   int is_add = 1;
80   int remote_listen = 0;
81
82   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
83     {
84       if (unformat (input, "export-ipfix-collector"))
85         is_export = 1;
86       else if (unformat (input, "disable"))
87         is_add = 0;
88       else if (unformat (input, "listen-ipfix"))
89         remote_listen = 1;
90       else
91         break;
92     }
93
94   return (ioam_analyse_enable_disable (vm, is_add, is_export, remote_listen));
95 }
96
97 VLIB_CLI_COMMAND (set_ioam_analyse_command, static) = {
98   .path = "set ioam analyse",
99   .short_help = "set ioam analyse [export-ipfix-collector] [disable] [listen-ipfix]",
100   .function = set_ioam_analyse_command_fn,
101 };
102
103 static clib_error_t *
104 show_ioam_analyse_cmd_fn (vlib_main_t * vm, unformat_input_t * input,
105                           vlib_cli_command_t * cmd)
106 {
107   ip6_ioam_analyser_main_t *am = &ioam_analyser_main;
108   ioam_analyser_data_t *record = NULL;
109   u8 i;
110   u8 *s = 0;
111
112   vec_reset_length (s);
113   s = format (0, "iOAM Analyse Information: \n");
114   vec_foreach_index (i, am->aggregated_data)
115   {
116     record = am->aggregated_data + i;
117     if (record->is_free)
118       continue;
119
120     s = format (s, "Flow Number: %u\n", i);
121     s = print_analyse_flow (s, record);
122     s = format (s, "\n");
123   }
124   vlib_cli_output (vm, "%v", s);
125
126   vec_free (s);
127
128   return 0;
129 }
130
131 VLIB_CLI_COMMAND (ip6_show_ioam_ipfix_cmd, static) = {
132   .path = "show ioam analyse ",
133   .short_help = "show ioam analyser information",
134   .function = show_ioam_analyse_cmd_fn,
135 };
136
137 static clib_error_t *
138 ioam_analyse_init (vlib_main_t * vm)
139 {
140   ip6_ioam_analyser_main_t *am = &ioam_analyser_main;
141   u16 i;
142
143   vec_validate_aligned (am->aggregated_data, 50, CLIB_CACHE_LINE_BYTES);
144   vec_foreach_index (i, am->aggregated_data)
145   {
146     ioam_analyse_init_data (am->aggregated_data + i);
147   }
148
149   return 0;
150 }
151
152 VLIB_INIT_FUNCTION (ioam_analyse_init);
153
154 /*
155  * fd.io coding-style-patch-verification: ON
156  *
157  * Local Variables:
158  * eval: (c-set-style "gnu")
159  * End:
160  */