diff options
Diffstat (limited to 'src/plugins/dev_iavf/format.c')
-rw-r--r-- | src/plugins/dev_iavf/format.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/plugins/dev_iavf/format.c b/src/plugins/dev_iavf/format.c new file mode 100644 index 00000000000..bc84cc3ab2f --- /dev/null +++ b/src/plugins/dev_iavf/format.c @@ -0,0 +1,133 @@ +/* SPDX-License-Identifier: Apache-2.0 + * Copyright (c) 2023 Cisco Systems, Inc. + */ + +#include <vnet/vnet.h> +#include <vnet/dev/dev.h> +#include <vnet/dev/pci.h> +#include <vnet/dev/counters.h> +#include <dev_iavf/iavf.h> +#include <dev_iavf/virtchnl.h> + +u8 * +format_iavf_vf_cap_flags (u8 *s, va_list *args) +{ + u32 flags = va_arg (*args, u32); + int not_first = 0; + + char *strs[32] = { +#define _(a, b, c) [a] = c, + foreach_iavf_vf_cap_flag +#undef _ + }; + + for (int i = 0; i < 32; i++) + { + if ((flags & (1 << i)) == 0) + continue; + if (not_first) + s = format (s, " "); + if (strs[i]) + s = format (s, "%s", strs[i]); + else + s = format (s, "unknown(%u)", i); + not_first = 1; + } + return s; +} + +u8 * +format_iavf_rx_desc_qw1 (u8 *s, va_list *args) +{ + iavf_rx_desc_qw1_t *qw1 = va_arg (*args, iavf_rx_desc_qw1_t *); + s = format (s, "len %u ptype %u ubmcast %u fltstat %u flags", qw1->length, + qw1->ptype, qw1->ubmcast, qw1->fltstat); + +#define _(f) \ + if (qw1->f) \ + s = format (s, " " #f) + + _ (dd); + _ (eop); + _ (l2tag1p); + _ (l3l4p); + _ (crcp); + _ (flm); + _ (lpbk); + _ (ipv6exadd); + _ (int_udp_0); + _ (ipe); + _ (l4e); + _ (oversize); +#undef _ + return s; +} + +u8 * +format_iavf_rx_trace (u8 *s, va_list *args) +{ + vlib_main_t *vm = va_arg (*args, vlib_main_t *); + vlib_node_t *node = va_arg (*args, vlib_node_t *); + iavf_rx_trace_t *t = va_arg (*args, iavf_rx_trace_t *); + iavf_rx_desc_qw1_t *qw1; + vnet_main_t *vnm = vnet_get_main (); + vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, t->hw_if_index); + u32 indent = format_get_indent (s); + int i = 0; + + s = format (s, "avf: %v (%d) qid %u next-node %U flow-id %u", hi->name, + t->hw_if_index, t->qid, format_vlib_next_node_name, vm, + node->index, t->next_index, t->flow_id); + + qw1 = (iavf_rx_desc_qw1_t *) t->qw1s; + + do + s = format (s, "\n%Udesc %u: %U", format_white_space, indent + 2, i, + format_iavf_rx_desc_qw1, qw1 + i); + while ((qw1[i++].eop) == 0 && i < IAVF_RX_MAX_DESC_IN_CHAIN); + + return s; +} + +u8 * +format_iavf_port_status (u8 *s, va_list *args) +{ + vnet_dev_format_args_t __clib_unused *a = + va_arg (*args, vnet_dev_format_args_t *); + vnet_dev_port_t *port = va_arg (*args, vnet_dev_port_t *); + iavf_port_t *ap = vnet_dev_get_port_data (port); + u32 indent = format_get_indent (s); + + s = format (s, "caps: %U", format_iavf_vf_cap_flags, ap->vf_cap_flags); + s = format (s, "\n%Uvsi is %u, RSS key size is %u, RSS lut size is %u", + format_white_space, indent, ap->vsi_id, ap->rss_key_size, + ap->rss_lut_size); + s = format (s, "\n%Uflow offload ", format_white_space, indent); + if (ap->flow_offload) + s = format (s, "enabled, %u flows configured", + vec_len (ap->flow_lookup_entries)); + else + s = format (s, "disabled"); + return s; +} + +u8 * +format_iavf_log (u8 *s, va_list *args) +{ + vnet_dev_t *dev = va_arg (*args, vnet_dev_t *); + char *func = va_arg (*args, char *); + + if (dev) + s = format (s, "%U", format_vnet_dev_addr, dev); + if (dev && func) + vec_add1 (s, ' '); + if (func) + { + if (strncmp (func, "iavf_", 5) == 0) + func += 5; + s = format (s, "%s", func); + } + vec_add1 (s, ':'); + vec_add1 (s, ' '); + return s; +} |