FD.io VPP  v20.01-48-g3e0dafb74
Vector Packet Processing
ip6_ioam_analyse.c
Go to the documentation of this file.
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>
21 #include <vnet/ip/ip.h>
23 
25 static clib_error_t *
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;
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  {
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  {
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 *
76  vlib_cli_command_t * cmd)
77 {
78  int is_export = 0;
79  int is_add = 1;
80  int remote_listen = 0;
81 
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 /* *INDENT-OFF* */
98 VLIB_CLI_COMMAND (set_ioam_analyse_command, static) = {
99  .path = "set ioam analyse",
100  .short_help = "set ioam analyse [export-ipfix-collector] [disable] [listen-ipfix]",
101  .function = set_ioam_analyse_command_fn,
102 };
103 /* *INDENT-ON* */
104 
105 static clib_error_t *
107  vlib_cli_command_t * cmd)
108 {
110  ioam_analyser_data_t *record = NULL;
111  u8 i;
112  u8 *s = 0;
113 
114  vec_reset_length (s);
115  s = format (0, "iOAM Analyse Information: \n");
117  {
118  record = am->aggregated_data + i;
119  if (record->is_free)
120  continue;
121 
122  s = format (s, "Flow Number: %u\n", i);
123  s = print_analyse_flow (s, record);
124  s = format (s, "\n");
125  }
126  vlib_cli_output (vm, "%v", s);
127 
128  vec_free (s);
129 
130  return 0;
131 }
132 
133 /* *INDENT-OFF* */
134 VLIB_CLI_COMMAND (ip6_show_ioam_ipfix_cmd, static) = {
135  .path = "show ioam analyse ",
136  .short_help = "show ioam analyser information",
137  .function = show_ioam_analyse_cmd_fn,
138 };
139 /* *INDENT-ON* */
140 
141 static clib_error_t *
143 {
145  u16 i;
146 
149  {
151  }
152 
153  return 0;
154 }
155 
157 
158 /*
159  * fd.io coding-style-patch-verification: ON
160  *
161  * Local Variables:
162  * eval: (c-set-style "gnu")
163  * End:
164  */
u16 del
Add(0) or del(1) operation.
#define vec_foreach_index(var, v)
Iterate over vector indices.
u16 ipfix_setid
Setid of IPFix for which client is intereseted in getting packets.
static u8 * print_analyse_flow(u8 *s, ioam_analyser_data_t *record)
Definition: ioam_analyse.h:449
static void ioam_export_reset_next_node(ioam_export_main_t *em)
Definition: ioam_export.h:100
static void ioam_analyse_init_data(ioam_analyser_data_t *data)
Definition: ioam_analyse.h:498
#define NULL
Definition: clib.h:58
int i
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:424
clib_error_t * ioam_flow_create(u8 del)
#define vec_validate_aligned(V, I, A)
Make sure vector is long enough for given index (no header, specified alignment)
Definition: vec.h:451
unsigned char u8
Definition: types.h:56
ip6_ioam_analyser_main_t ioam_analyser_main
Definition: node.c:64
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
IP6-iOAM analyser main structure.
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:173
u8 * client_name
String containing name of the client interested in getting ip-fix packets.
static clib_error_t * ioam_analyse_init(vlib_main_t *vm)
#define IPFIX_IOAM_EXPORT_ID
Definition: ioam_export.h:203
struct _unformat_input_t unformat_input_t
unsigned short u16
Definition: types.h:57
vlib_main_t * vm
Definition: in2out_ed.c:1810
static clib_error_t * set_ioam_analyse_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define UNFORMAT_END_OF_INPUT
Definition: format.h:145
static void ioam_export_set_next_node(ioam_export_main_t *em, u8 *next_node_name)
Definition: ioam_export.h:91
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:342
ioam_export_main_t ioam_export_main
Definition: ioam_export.c:37
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:152
ioam_analyser_data_t * aggregated_data
This contains the aggregated data from the time VPP started analysing.
void ip6_ioam_analyse_register_handlers(void)
Definition: node.c:449
Analysed iOAM data.
Definition: ioam_analyse.h:98
static clib_error_t * show_ioam_analyse_cmd_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
int ipfix_collector_reg_setid(vlib_main_t *vm, ipfix_client_add_del_t *info)
IP-FIX SetID registration function.
static clib_error_t * ioam_analyse_enable_disable(vlib_main_t *vm, int is_add, int is_export, int remote_listen)
Structure other nodes to use for registering with IP-FIX collector.
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:59
void ip6_ioam_analyse_unregister_handlers(void)
Definition: node.c:460
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:689
vlib_node_registration_t analyse_node_remote
(constructor) VLIB_REGISTER_NODE (analyse_node_remote)
Definition: node.c:493
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:978
u32 client_node
Node index where packets have to be redirected.
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:171