FD.io VPP  v17.04-9-g99c0734
Vector Packet Processing
interface_format.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 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  * interface_format.c: interface formatting
17  *
18  * Copyright (c) 2008 Eliot Dresselhaus
19  *
20  * Permission is hereby granted, free of charge, to any person obtaining
21  * a copy of this software and associated documentation files (the
22  * "Software"), to deal in the Software without restriction, including
23  * without limitation the rights to use, copy, modify, merge, publish,
24  * distribute, sublicense, and/or sell copies of the Software, and to
25  * permit persons to whom the Software is furnished to do so, subject to
26  * the following conditions:
27  *
28  * The above copyright notice and this permission notice shall be
29  * included in all copies or substantial portions of the Software.
30  *
31  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
35  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
36  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
37  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38  */
39 
40 #include <vnet/vnet.h>
41 #include <vppinfra/bitmap.h>
42 
43 u8 *
44 format_vnet_sw_interface_flags (u8 * s, va_list * args)
45 {
46  u32 flags = va_arg (*args, u32);
47 
49  s = format (s, "bond-slave");
50  else
51  {
52  s = format (s, "%s",
53  (flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) ? "up" : "down");
54  if (flags & VNET_SW_INTERFACE_FLAG_PUNT)
55  s = format (s, "/punt");
56  }
57 
58  return s;
59 }
60 
61 u8 *
62 format_vnet_hw_interface (u8 * s, va_list * args)
63 {
64  vnet_main_t *vnm = va_arg (*args, vnet_main_t *);
65  vnet_hw_interface_t *hi = va_arg (*args, vnet_hw_interface_t *);
66  vnet_hw_interface_class_t *hw_class;
67  vnet_device_class_t *dev_class;
68  int verbose = va_arg (*args, int);
69  uword indent;
70 
71  if (!hi)
72  return format (s, "%=32s%=6s%=8s%s", "Name", "Idx", "Link", "Hardware");
73 
74  indent = format_get_indent (s);
75 
76  s = format (s, "%-32v%=6d", hi->name, hi->hw_if_index);
77 
79  s = format (s, "%=8s", "slave");
80  else
81  s = format (s, "%=8s",
82  hi->flags & VNET_HW_INTERFACE_FLAG_LINK_UP ? "up" : "down");
83 
84  hw_class = vnet_get_hw_interface_class (vnm, hi->hw_class_index);
85  dev_class = vnet_get_device_class (vnm, hi->dev_class_index);
86 
88  {
89  int hw_idx;
90  s = format (s, "Slave-Idx:");
91  clib_bitmap_foreach (hw_idx, hi->bond_info, s =
92  format (s, " %d", hw_idx));
93  }
94  else if (dev_class->format_device_name)
95  s = format (s, "%U", dev_class->format_device_name, hi->dev_instance);
96  else
97  s = format (s, "%s%d", dev_class->name, hi->dev_instance);
98 
99  if (verbose)
100  {
101  if (hw_class->format_device)
102  s = format (s, "\n%U%U",
103  format_white_space, indent + 2,
104  hw_class->format_device, hi->hw_if_index, verbose);
105  else
106  {
107  s = format (s, "\n%U%s",
108  format_white_space, indent + 2, hw_class->name);
109  if (hw_class->format_address && vec_len (hi->hw_address) > 0)
110  s =
111  format (s, " address %U", hw_class->format_address,
112  hi->hw_address);
113  }
114 
115  if (dev_class->format_device)
116  s = format (s, "\n%U%U",
117  format_white_space, indent + 2,
118  dev_class->format_device, hi->dev_instance, verbose);
119  }
120 
121  return s;
122 }
123 
124 u8 *
125 format_vnet_sw_interface_name (u8 * s, va_list * args)
126 {
127  vnet_main_t *vnm = va_arg (*args, vnet_main_t *);
128  vnet_sw_interface_t *si = va_arg (*args, vnet_sw_interface_t *);
129  vnet_sw_interface_t *si_sup =
131  vnet_hw_interface_t *hi_sup;
132 
134  hi_sup = vnet_get_hw_interface (vnm, si_sup->hw_if_index);
135 
136  s = format (s, "%v", hi_sup->name);
137 
139  s = format (s, ".%d", si->sub.id);
140 
141  return s;
142 }
143 
144 u8 *
145 format_vnet_sw_if_index_name (u8 * s, va_list * args)
146 {
147  vnet_main_t *vnm = va_arg (*args, vnet_main_t *);
148  u32 sw_if_index = va_arg (*args, u32);
149  return format (s, "%U",
151  vnet_get_sw_interface (vnm, sw_if_index));
152 }
153 
154 u8 *
156  vnet_sw_interface_t * si)
157 {
158  uword indent, n_printed;
159  int i, j, n_counters;
160  static vnet_main_t **my_vnet_mains;
161 
162  vec_reset_length (my_vnet_mains);
163 
164  indent = format_get_indent (s);
165  n_printed = 0;
166 
167  {
169  vlib_counter_t v, vtotal;
170  u8 *n = 0;
171 
172  for (i = 0; i < vec_len (vnet_mains); i++)
173  {
174  if (vnet_mains[i])
175  vec_add1 (my_vnet_mains, vnet_mains[i]);
176  }
177 
178  if (vec_len (my_vnet_mains) == 0)
179  vec_add1 (my_vnet_mains, &vnet_main);
180 
181  /* Each vnet_main_t has its own copy of the interface counters */
182  n_counters = vec_len (im->combined_sw_if_counters);
183 
184  /* rx, tx counters... */
185  for (j = 0; j < n_counters; j++)
186  {
187  vtotal.packets = 0;
188  vtotal.bytes = 0;
189 
190  for (i = 0; i < vec_len (my_vnet_mains); i++)
191  {
192  im = &my_vnet_mains[i]->interface_main;
193  cm = im->combined_sw_if_counters + j;
195  vtotal.packets += v.packets;
196  vtotal.bytes += v.bytes;
197  }
198 
199  /* Only display non-zero counters. */
200  if (vtotal.packets == 0)
201  continue;
202 
203  if (n_printed > 0)
204  s = format (s, "\n%U", format_white_space, indent);
205  n_printed += 2;
206 
207  if (n)
208  _vec_len (n) = 0;
209  n = format (n, "%s packets", cm->name);
210  s = format (s, "%-16v%16Ld", n, vtotal.packets);
211 
212  _vec_len (n) = 0;
213  n = format (n, "%s bytes", cm->name);
214  s = format (s, "\n%U%-16v%16Ld",
215  format_white_space, indent, n, vtotal.bytes);
216  }
217  vec_free (n);
218  }
219 
220  {
222  u64 v, vtotal;
223 
224  n_counters = vec_len (im->sw_if_counters);
225 
226  for (j = 0; j < n_counters; j++)
227  {
228  vtotal = 0;
229 
230  for (i = 0; i < vec_len (my_vnet_mains); i++)
231  {
232  im = &my_vnet_mains[i]->interface_main;
233  cm = im->sw_if_counters + j;
234 
235  v = vlib_get_simple_counter (cm, si->sw_if_index);
236  vtotal += v;
237  }
238 
239  /* Only display non-zero counters. */
240  if (vtotal == 0)
241  continue;
242 
243  if (n_printed > 0)
244  s = format (s, "\n%U", format_white_space, indent);
245  n_printed += 1;
246 
247  s = format (s, "%-16s%16Ld", cm->name, vtotal);
248  }
249  }
250 
251  return s;
252 }
253 
254 u8 *
255 format_vnet_sw_interface (u8 * s, va_list * args)
256 {
257  vnet_main_t *vnm = va_arg (*args, vnet_main_t *);
258  vnet_sw_interface_t *si = va_arg (*args, vnet_sw_interface_t *);
260 
261  if (!si)
262  return format (s, "%=32s%=5s%=16s%=16s%=16s",
263  "Name", "Idx", "State", "Counter", "Count");
264 
265  s = format (s, "%-32U%=5d%=16U",
268 
269  s = format_vnet_sw_interface_cntrs (s, im, si);
270 
271  return s;
272 }
273 
274 u8 *
276 {
277  vnet_main_t *vnm = va_arg (*args, vnet_main_t *);
278  vnet_sw_interface_t *si = va_arg (*args, vnet_sw_interface_t *);
279  /* caller supplied display name for this interface */
280  u8 *name = va_arg (*args, u8 *);
282 
283 
284  if (!si)
285  return format (s, "%=32s%=5s%=16s%=16s%=16s",
286  "Name", "Idx", "State", "Counter", "Count");
287 
288  s = format (s, "%-32v%=5d%=16U",
289  name, si->sw_if_index,
291 
292  s = format_vnet_sw_interface_cntrs (s, im, si);
293 
294  return s;
295 }
296 
297 uword
299 {
300  vnet_main_t *vnm = va_arg (*args, vnet_main_t *);
301  u32 *hw_if_index = va_arg (*args, u32 *);
304 
305  /* Try per device class functions first. */
306  vec_foreach (c, im->device_classes)
307  {
308  if (c->unformat_device_name
309  && unformat_user (input, c->unformat_device_name, hw_if_index))
310  return 1;
311  }
312 
314  im->hw_interface_by_name, hw_if_index);
315 }
316 
317 uword
319 {
320  vnet_main_t *vnm = va_arg (*args, vnet_main_t *);
321  u32 *result = va_arg (*args, u32 *);
323  u32 hw_if_index, id, id_specified;
324  u32 sw_if_index;
325  u8 *if_name = 0;
326  uword *p, error = 0;
327 
328  id = ~0;
329  if (unformat (input, "%_%v.%d%_", &if_name, &id)
330  && ((p = hash_get (vnm->interface_main.hw_interface_by_name, if_name))))
331  {
332  hw_if_index = p[0];
333  id_specified = 1;
334  }
335  else
336  if (unformat (input, "%U", unformat_vnet_hw_interface, vnm, &hw_if_index))
337  id_specified = 0;
338  else
339  goto done;
340 
341  hi = vnet_get_hw_interface (vnm, hw_if_index);
342  if (!id_specified)
343  {
344  sw_if_index = hi->sw_if_index;
345  }
346  else
347  {
348  if (!(p = hash_get (hi->sub_interface_sw_if_index_by_id, id)))
349  goto done;
350  sw_if_index = p[0];
351  }
352  if (!vnet_sw_interface_is_api_visible (vnm, sw_if_index))
353  goto done;
354  *result = sw_if_index;
355  error = 1;
356 done:
357  vec_free (if_name);
358  return error;
359 }
360 
361 uword
363 {
364  u32 *result = va_arg (*args, u32 *);
365  u32 flags = 0;
366 
367  if (unformat (input, "up"))
369  else if (unformat (input, "down"))
371  else if (unformat (input, "punt"))
373  else if (unformat (input, "enable"))
374  flags &= ~VNET_SW_INTERFACE_FLAG_PUNT;
375  else
376  return 0;
377 
378  *result = flags;
379  return 1;
380 }
381 
382 uword
384 {
385  u32 *result = va_arg (*args, u32 *);
386  u32 flags = 0;
387 
388  if (unformat (input, "up"))
390  else if (unformat (input, "down"))
392  else
393  return 0;
394 
395  *result = flags;
396  return 1;
397 }
398 
399 /*
400  * fd.io coding-style-patch-verification: ON
401  *
402  * Local Variables:
403  * eval: (c-set-style "gnu")
404  * End:
405  */
vmrglw vmrglh hi
sll srl srl sll sra u16x4 i
Definition: vector_sse2.h:343
uword unformat_vnet_hw_interface(unformat_input_t *input, va_list *args)
vnet_interface_main_t interface_main
Definition: vnet.h:57
u8 * format_vnet_sw_interface_flags(u8 *s, va_list *args)
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
vnet_main_t ** vnet_mains
Definition: vnet.h:83
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:522
Combined counter to hold both packets and byte differences.
Definition: counter.h:139
uword unformat_user(unformat_input_t *input, unformat_function_t *func,...)
Definition: unformat.c:982
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
uword * sub_interface_sw_if_index_by_id
Definition: interface.h:454
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:418
#define VNET_HW_INTERFACE_FLAG_LINK_UP
Definition: interface.h:379
u8 * format_vnet_hw_interface(u8 *s, va_list *args)
struct _vnet_device_class vnet_device_class_t
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
static counter_t vlib_get_simple_counter(vlib_simple_counter_main_t *cm, u32 index)
Get the value of a simple counter Scrapes the entire set of per-thread counters.
Definition: counter.h:97
static vnet_device_class_t * vnet_get_device_class(vnet_main_t *vnm, u32 dev_class_index)
static uword format_get_indent(u8 *s)
Definition: format.h:72
vlib_combined_counter_main_t * combined_sw_if_counters
Definition: interface.h:626
u8 * format_white_space(u8 *s, va_list *va)
Definition: std-formats.c:113
static vnet_sw_interface_t * vnet_get_sup_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
unsigned long u64
Definition: types.h:89
A collection of simple counters.
Definition: counter.h:58
u8 * format_vnet_sw_interface(u8 *s, va_list *args)
char * name
The counter collection&#39;s name.
Definition: counter.h:65
uword * hw_interface_by_name
Definition: interface.h:606
u8 * format_vnet_sw_interface_name_override(u8 *s, va_list *args)
#define hash_get(h, key)
Definition: hash.h:248
#define clib_bitmap_foreach(i, ai, body)
Macro to iterate across set bits in a bitmap.
Definition: bitmap.h:361
vnet_sub_interface_t sub
Definition: interface.h:569
counter_t packets
packet counter
Definition: counter.h:141
#define VNET_SW_INTERFACE_FLAG_BOND_SLAVE
Definition: interface.h:545
#define v
Definition: acl.c:246
struct _unformat_input_t unformat_input_t
u8 * format_vnet_sw_if_index_name(u8 *s, va_list *args)
vnet_main_t vnet_main
Definition: misc.c:43
vlib_simple_counter_main_t * sw_if_counters
Definition: interface.h:625
uword unformat_vnet_hw_interface_flags(unformat_input_t *input, va_list *args)
unformat_function_t unformat_hash_vec_string
Definition: hash.h:680
#define VNET_HW_INTERFACE_BOND_INFO_SLAVE
Definition: interface.h:465
svmdb_client_t * c
static void vlib_get_combined_counter(const vlib_combined_counter_main_t *cm, u32 index, vlib_counter_t *result)
Get the value of a combined counter, never called in the speed path Scrapes the entire set of per-thr...
Definition: counter.h:250
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:340
u8 * format_vnet_sw_interface_name(u8 *s, va_list *args)
#define VNET_SW_INTERFACE_FLAG_ADMIN_UP
Definition: interface.h:536
#define ASSERT(truth)
unsigned int u32
Definition: types.h:88
#define VNET_SW_INTERFACE_FLAG_PUNT
Definition: interface.h:539
static vnet_hw_interface_class_t * vnet_get_hw_interface_class(vnet_main_t *vnm, u32 hw_class_index)
Bitmaps built as vectors of machine words.
u8 * format_vnet_sw_interface_cntrs(u8 *s, vnet_interface_main_t *im, vnet_sw_interface_t *si)
u64 uword
Definition: types.h:112
counter_t bytes
byte counter
Definition: counter.h:142
struct _vnet_hw_interface_class vnet_hw_interface_class_t
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
unsigned char u8
Definition: types.h:56
char * name
The counter collection&#39;s name.
Definition: counter.h:185
A collection of combined counters.
Definition: counter.h:180
vnet_sw_interface_type_t type
Definition: interface.h:531
#define vec_foreach(var, vec)
Vector iterator.
vnet_device_class_t * device_classes
Definition: interface.h:610
u32 flags
Definition: vhost-user.h:78
uword unformat_vnet_sw_interface(unformat_input_t *input, va_list *args)
uword unformat_vnet_sw_interface_flags(unformat_input_t *input, va_list *args)
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:971
static uword vnet_sw_interface_is_api_visible(vnet_main_t *vnm, u32 sw_if_index)