X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface_format.c;h=e34b6fb62c01fd95bcb0919268ee3df8278334e1;hb=8bea589cfe0fca1a6f560e16ca66a4cf199041a2;hp=98be8728e7706f4e6d633793b3724bd1686b2dac;hpb=7fff3d205463d5e0a95d6bdd337100988ef323a3;p=vpp.git diff --git a/src/vnet/interface_format.c b/src/vnet/interface_format.c index 98be8728e77..e34b6fb62c0 100644 --- a/src/vnet/interface_format.c +++ b/src/vnet/interface_format.c @@ -39,6 +39,46 @@ #include #include +#include +#include +#include +#include +#include + +u8 * +format_vtr (u8 * s, va_list * args) +{ + u32 vtr_op = va_arg (*args, u32); + u32 dot1q = va_arg (*args, u32); + u32 tag1 = va_arg (*args, u32); + u32 tag2 = va_arg (*args, u32); + switch (vtr_op) + { + case L2_VTR_DISABLED: + return format (s, "none"); + case L2_VTR_PUSH_1: + return format (s, "push-1 %s %d", dot1q ? "dot1q" : "dot1ad", tag1); + case L2_VTR_PUSH_2: + return format (s, "push-2 %s %d %d", dot1q ? "dot1q" : "dot1ad", tag1, + tag2); + case L2_VTR_POP_1: + return format (s, "pop-1"); + case L2_VTR_POP_2: + return format (s, "pop-2"); + case L2_VTR_TRANSLATE_1_1: + return format (s, "trans-1-1 %s %d", dot1q ? "dot1q" : "dot1ad", tag1); + case L2_VTR_TRANSLATE_1_2: + return format (s, "trans-1-2 %s %d %d", dot1q ? "dot1q" : "dot1ad", + tag1, tag2); + case L2_VTR_TRANSLATE_2_1: + return format (s, "trans-2-1 %s %d", dot1q ? "dot1q" : "dot1ad", tag1); + case L2_VTR_TRANSLATE_2_2: + return format (s, "trans-2-2 %s %d %d", dot1q ? "dot1q" : "dot1ad", + tag1, tag2); + default: + return format (s, "none"); + } +} u8 * format_vnet_sw_interface_flags (u8 * s, va_list * args) @@ -47,8 +87,6 @@ format_vnet_sw_interface_flags (u8 * s, va_list * args) if (flags & VNET_SW_INTERFACE_FLAG_ERROR) s = format (s, "error"); - else if (flags & VNET_SW_INTERFACE_FLAG_BOND_SLAVE) - s = format (s, "bond-slave"); else { s = format (s, "%s", @@ -61,17 +99,17 @@ format_vnet_sw_interface_flags (u8 * s, va_list * args) } u8 * -format_vnet_hw_interface_rx_mode (u8 * s, va_list * args) +format_vnet_hw_if_rx_mode (u8 * s, va_list * args) { - vnet_hw_interface_rx_mode mode = va_arg (*args, vnet_hw_interface_rx_mode); + vnet_hw_if_rx_mode mode = va_arg (*args, vnet_hw_if_rx_mode); - if (mode == VNET_HW_INTERFACE_RX_MODE_POLLING) + if (mode == VNET_HW_IF_RX_MODE_POLLING) return format (s, "polling"); - if (mode == VNET_HW_INTERFACE_RX_MODE_INTERRUPT) + if (mode == VNET_HW_IF_RX_MODE_INTERRUPT) return format (s, "interrupt"); - if (mode == VNET_HW_INTERFACE_RX_MODE_ADAPTIVE) + if (mode == VNET_HW_IF_RX_MODE_ADAPTIVE) return format (s, "adaptive"); return format (s, "unknown"); @@ -94,6 +132,26 @@ format_vnet_hw_interface_link_speed (u8 * s, va_list * args) return format (s, "%u Kbps", link_speed); } +u8 * +format_vnet_hw_interface_rss_queues (u8 * s, va_list * args) +{ + clib_bitmap_t *bitmap = va_arg (*args, clib_bitmap_t *); + int i; + + if (bitmap == NULL) + return s; + + if (bitmap) + { + /* *INDENT-OFF* */ + clib_bitmap_foreach (i, bitmap) { + s = format (s, "%u ", i); + } + /* *INDENT-ON* */ + } + + return s; +} u8 * format_vnet_hw_interface (u8 * s, va_list * args) @@ -125,8 +183,8 @@ format_vnet_hw_interface (u8 * s, va_list * args) { int hw_idx; s = format (s, "Slave-Idx:"); - clib_bitmap_foreach (hw_idx, hi->bond_info, s = - format (s, " %d", hw_idx)); + clib_bitmap_foreach (hw_idx, hi->bond_info) + s = format (s, " %d", hw_idx); } else if (dev_class->format_device_name) s = format (s, "%U", dev_class->format_device_name, hi->dev_instance); @@ -136,6 +194,46 @@ format_vnet_hw_interface (u8 * s, va_list * args) s = format (s, "\n%ULink speed: %U", format_white_space, indent + 2, format_vnet_hw_interface_link_speed, hi->link_speed); + if (vec_len (hi->rx_queue_indices)) + { + s = format (s, "\n%URX Queues:", format_white_space, indent + 2); + s = format (s, "\n%U%-6s%-15s%-10s", format_white_space, indent + 4, + "queue", "thread", "mode"); + for (int i = 0; i < vec_len (hi->rx_queue_indices); i++) + { + vnet_hw_if_rx_queue_t *rxq; + rxq = vnet_hw_if_get_rx_queue (vnm, hi->rx_queue_indices[i]); + s = format (s, "\n%U%-6u%-15U%-10U", format_white_space, indent + 4, + rxq->queue_id, format_vlib_thread_name_and_index, + rxq->thread_index, format_vnet_hw_if_rx_mode, rxq->mode); + } + } + + if (vec_len (hi->tx_queue_indices)) + { + s = format (s, "\n%UTX Queues:", format_white_space, indent + 2); + s = format ( + s, "\n%UTX Hash: %U", format_white_space, indent + 4, format_vnet_hash, + vnet_hash_function_from_func (hi->hf, hw_class->tx_hash_fn_type)); + s = format (s, "\n%U%-6s%-7s%-15s", format_white_space, indent + 4, + "queue", "shared", "thread(s)"); + for (int i = 0; i < vec_len (hi->tx_queue_indices); i++) + { + vnet_hw_if_tx_queue_t *txq; + txq = vnet_hw_if_get_tx_queue (vnm, hi->tx_queue_indices[i]); + s = format ( + s, "\n%U%-6u%-7s%U", format_white_space, indent + 4, txq->queue_id, + clib_bitmap_count_set_bits (txq->threads) > 1 ? "yes" : "no", + format_bitmap_list, txq->threads); + } + } + + if (hi->rss_queues) + { + s = format (s, "\n%URSS queues: %U", format_white_space, indent + 2, + format_vnet_hw_interface_rss_queues, hi->rss_queues); + } + if (verbose) { if (hw_class->format_device) @@ -188,7 +286,7 @@ format_vnet_sw_if_index_name (u8 * s, va_list * args) u32 sw_if_index = va_arg (*args, u32); vnet_sw_interface_t *si; - si = vnet_get_sw_interface_safe (vnm, sw_if_index); + si = vnet_get_sw_interface_or_null (vnm, sw_if_index); if (NULL == si) { @@ -214,69 +312,73 @@ format_vnet_hw_if_index_name (u8 * s, va_list * args) u8 * format_vnet_sw_interface_cntrs (u8 * s, vnet_interface_main_t * im, - vnet_sw_interface_t * si) + vnet_sw_interface_t * si, int json) { u32 indent, n_printed; - int i, j, n_counters; - static vnet_main_t **my_vnet_mains; - - vec_reset_length (my_vnet_mains); + int j, n_counters; + char *x = ""; + int json_need_comma_nl = 0; + u8 *n = 0; + + /* + * to output a json snippet, stick quotes in lots of places + * definitely deserves a one-character variable name. + */ + if (json) + x = "\""; indent = format_get_indent (s); n_printed = 0; - { - vlib_combined_counter_main_t *cm; - vlib_counter_t v, vtotal; - u8 *n = 0; + n_counters = vec_len (im->combined_sw_if_counters); - for (i = 0; i < vec_len (vnet_mains); i++) - { - if (vnet_mains[i]) - vec_add1 (my_vnet_mains, vnet_mains[i]); - } - - if (vec_len (my_vnet_mains) == 0) - vec_add1 (my_vnet_mains, &vnet_main); - - /* Each vnet_main_t has its own copy of the interface counters */ - n_counters = vec_len (im->combined_sw_if_counters); + /* rx, tx counters... */ + for (j = 0; j < n_counters; j++) + { + vlib_combined_counter_main_t *cm; + vlib_counter_t v, vtotal; + vtotal.packets = 0; + vtotal.bytes = 0; - /* rx, tx counters... */ - for (j = 0; j < n_counters; j++) - { - vtotal.packets = 0; - vtotal.bytes = 0; + cm = im->combined_sw_if_counters + j; + vlib_get_combined_counter (cm, si->sw_if_index, &v); + vtotal.packets += v.packets; + vtotal.bytes += v.bytes; - for (i = 0; i < vec_len (my_vnet_mains); i++) - { - im = &my_vnet_mains[i]->interface_main; - cm = im->combined_sw_if_counters + j; - vlib_get_combined_counter (cm, si->sw_if_index, &v); - vtotal.packets += v.packets; - vtotal.bytes += v.bytes; - } + /* Only display non-zero counters. */ + if (vtotal.packets == 0) + continue; - /* Only display non-zero counters. */ - if (vtotal.packets == 0) + if (json) + { + if (json_need_comma_nl) + { + vec_add1 (s, ','); + vec_add1 (s, '\n'); + } + s = format (s, "%s%s_packets%s: %s%Ld%s,\n", x, cm->name, x, x, + vtotal.packets, x); + s = format (s, "%s%s_bytes%s: %s%Ld%s", x, cm->name, x, x, + vtotal.bytes, x); + json_need_comma_nl = 1; continue; + } - if (n_printed > 0) - s = format (s, "\n%U", format_white_space, indent); - n_printed += 2; + if (n_printed > 0) + s = format (s, "\n%U", format_white_space, indent); + n_printed += 2; - if (n) - _vec_len (n) = 0; - n = format (n, "%s packets", cm->name); - s = format (s, "%-16v%16Ld", n, vtotal.packets); + if (n) + vec_set_len (n, 0); + n = format (n, "%s packets", cm->name); + s = format (s, "%-16v%16Ld", n, vtotal.packets); - _vec_len (n) = 0; - n = format (n, "%s bytes", cm->name); - s = format (s, "\n%U%-16v%16Ld", - format_white_space, indent, n, vtotal.bytes); - } - vec_free (n); - } + vec_set_len (n, 0); + n = format (n, "%s bytes", cm->name); + s = format (s, "\n%U%-16v%16Ld", + format_white_space, indent, n, vtotal.bytes); + } + vec_free (n); { vlib_simple_counter_main_t *cm; @@ -288,19 +390,28 @@ format_vnet_sw_interface_cntrs (u8 * s, vnet_interface_main_t * im, { vtotal = 0; - for (i = 0; i < vec_len (my_vnet_mains); i++) - { - im = &my_vnet_mains[i]->interface_main; - cm = im->sw_if_counters + j; + cm = im->sw_if_counters + j; - v = vlib_get_simple_counter (cm, si->sw_if_index); - vtotal += v; - } + v = vlib_get_simple_counter (cm, si->sw_if_index); + vtotal += v; /* Only display non-zero counters. */ if (vtotal == 0) continue; + if (json) + { + if (json_need_comma_nl) + { + vec_add1 (s, ','); + vec_add1 (s, '\n'); + } + s = format (s, "%s%s%s: %s%Ld%s", x, cm->name, x, x, vtotal, x); + json_need_comma_nl = 1; + continue; + } + + if (n_printed > 0) s = format (s, "\n%U", format_white_space, indent); n_printed += 1; @@ -339,7 +450,7 @@ format_vnet_sw_interface (u8 * s, va_list * args) format_vnet_sw_interface_flags, si->flags, format_vnet_sw_interface_mtu, si); - s = format_vnet_sw_interface_cntrs (s, im, si); + s = format_vnet_sw_interface_cntrs (s, im, si, 0 /* want json */ ); return s; } @@ -362,7 +473,7 @@ format_vnet_sw_interface_name_override (u8 * s, va_list * args) name, si->sw_if_index, format_vnet_sw_interface_flags, si->flags); - s = format_vnet_sw_interface_cntrs (s, im, si); + s = format_vnet_sw_interface_cntrs (s, im, si, 0 /* want json */ ); return s; } @@ -383,6 +494,8 @@ format_vnet_buffer_opaque (u8 * s, va_list * args) { vlib_buffer_t *b = va_arg (*args, vlib_buffer_t *); vnet_buffer_opaque_t *o = (vnet_buffer_opaque_t *) b->opaque; + vnet_interface_main_t *im = &vnet_get_main ()->interface_main; + vnet_buffer_opquae_formatter_t helper_fp; int i; s = format (s, "raw: "); @@ -429,6 +542,17 @@ format_vnet_buffer_opaque (u8 * s, va_list * args) "ip.reass.next_index: %d, ip.reass.estimated_mtu: %d", o->ip.reass.next_index, (u32) (o->ip.reass.estimated_mtu)); vec_add1 (s, '\n'); + s = format (s, + "ip.reass.error_next_index: %d, ip.reass.owner_thread_index: %d", + o->ip.reass.error_next_index, + (u32) (o->ip.reass.owner_thread_index)); + vec_add1 (s, '\n'); + s = format (s, + "ip.reass.ip_proto: %d, ip.reass.l4_src_port: %d", + o->ip.reass.ip_proto, (u32) (o->ip.reass.l4_src_port)); + vec_add1 (s, '\n'); + s = format (s, "ip.reass.l4_dst_port: %d", o->ip.reass.l4_dst_port); + vec_add1 (s, '\n'); s = format (s, "ip.reass.fragment_first: %d ip.reass.fragment_last: %d", @@ -454,13 +578,21 @@ format_vnet_buffer_opaque (u8 * s, va_list * args) (u32) (o->mpls.ttl), (u32) (o->mpls.exp), (u32) (o->mpls.first), o->mpls.save_rewrite_length, (u32) (o->mpls.bier.n_bytes)); vec_add1 (s, '\n'); + s = format (s, "mpls.mpls_hdr_length: %d", (u32) (o->mpls.mpls_hdr_length)); + vec_add1 (s, '\n'); + + s = format (s, + "l2.feature_bitmap: %08x, l2.bd_index: %d, l2.l2fib_sn %d, " + "l2.l2_len: %d, l2.shg: %d, l2.bd_age: %d", + (u32) (o->l2.feature_bitmap), (u32) (o->l2.bd_index), + (u32) (o->l2.l2fib_sn), + (u32) (o->l2.l2_len), (u32) (o->l2.shg), (u32) (o->l2.bd_age)); + vec_add1 (s, '\n'); s = format (s, - "l2.feature_bitmap: %08x, l2.bd_index: %d, l2.l2_len: %d, " - "l2.shg: %d, l2.l2fib_sn: %d, l2.bd_age: %d", - o->l2.feature_bitmap, (u32) (o->l2.bd_index), - (u32) (o->l2.l2_len), (u32) (o->l2.shg), (u32) (o->l2.l2fib_sn), - (u32) (o->l2.bd_age)); + "l2.feature_bitmap_input: %U, L2.feature_bitmap_output: %U", + format_l2_input_feature_bitmap, o->l2.feature_bitmap, 0, + format_l2_output_features, o->l2.feature_bitmap, 0); vec_add1 (s, '\n'); s = format (s, @@ -478,20 +610,24 @@ format_vnet_buffer_opaque (u8 * s, va_list * args) s = format (s, "policer.index: %d", o->policer.index); vec_add1 (s, '\n'); - s = format (s, - "ipsec.flags: 0x%x, ipsec.sad_index: %d", - o->ipsec.flags, o->ipsec.sad_index); + s = format (s, "ipsec.sad_index: %d, ipsec.protect_index", + o->ipsec.sad_index, o->ipsec.protect_index); vec_add1 (s, '\n'); s = format (s, "map.mtu: %d", (u32) (o->map.mtu)); vec_add1 (s, '\n'); s = format (s, - "map_t.v6.saddr: 0x%x, map_t.v6.daddr: 0x%x, " - "map_t.v6.frag_offset: %d, map_t.v6.l4_offset: %d", + "map_t.map_domain_index: %d, map_t.v6.saddr: 0x%x, " + "map_t.v6.daddr: 0x%x, map_t.v6.frag_offset: %d, " + "map_t.v6.l4_offset: %d, map_t.v6.l4_protocol: %d, " + "map.t.checksum_offset: %d", + o->map_t.map_domain_index, o->map_t.v6.saddr, o->map_t.v6.daddr, - (u32) (o->map_t.v6.frag_offset), (u32) (o->map_t.v6.l4_offset)); + (u32) (o->map_t.v6.frag_offset), (u32) (o->map_t.v6.l4_offset), + (u32) (o->map_t.v6.l4_protocol), + (u32) (o->map_t.checksum_offset)); vec_add1 (s, '\n'); s = format (s, @@ -514,12 +650,11 @@ format_vnet_buffer_opaque (u8 * s, va_list * args) vec_add1 (s, '\n'); s = format - (s, "tcp.connection_index: %d, tcp.seq_number: %d, tcp.seq_end: %d, " - "tcp.ack_number: %d, tcp.hdr_offset: %d, tcp.data_offset: %d", - o->tcp.connection_index, - o->tcp.seq_number, - o->tcp.seq_end, - o->tcp.ack_number, + (s, + "tcp.connection_index: %d, tcp.seq_number: %d, tcp.next_node_opaque: %d " + "tcp.seq_end: %d, tcp.ack_number: %d, tcp.hdr_offset: %d, " + "tcp.data_offset: %d", o->tcp.connection_index, o->tcp.next_node_opaque, + o->tcp.seq_number, o->tcp.seq_end, o->tcp.ack_number, (u32) (o->tcp.hdr_offset), (u32) (o->tcp.data_offset)); vec_add1 (s, '\n'); @@ -528,25 +663,15 @@ format_vnet_buffer_opaque (u8 * s, va_list * args) (u32) (o->tcp.data_len), (u32) (o->tcp.flags)); vec_add1 (s, '\n'); - s = format (s, - "sctp.connection_index: %d, sctp.sid: %d, sctp.ssn: %d, " - "sctp.tsn: %d, sctp.hdr_offset: %d", - o->sctp.connection_index, - (u32) (o->sctp.sid), - (u32) (o->sctp.ssn), - (u32) (o->sctp.tsn), (u32) (o->sctp.hdr_offset)); + s = format (s, "snat.flags: 0x%x", o->snat.flags); vec_add1 (s, '\n'); - s = format - (s, "sctp.data_offset: %d, sctp.data_len: %d, sctp.subconn_idx: %d, " - "sctp.flags: 0x%x", - (u32) (o->sctp.data_offset), - (u32) (o->sctp.data_len), - (u32) (o->sctp.subconn_idx), (u32) (o->sctp.flags)); - vec_add1 (s, '\n'); + for (i = 0; i < vec_len (im->buffer_opaque_format_helpers); i++) + { + helper_fp = im->buffer_opaque_format_helpers[i]; + s = (*helper_fp) (b, s); + } - s = format (s, "snat.flags: 0x%x", o->snat.flags); - vec_add1 (s, '\n'); return s; } @@ -555,6 +680,8 @@ format_vnet_buffer_opaque2 (u8 * s, va_list * args) { vlib_buffer_t *b = va_arg (*args, vlib_buffer_t *); vnet_buffer_opaque2_t *o = (vnet_buffer_opaque2_t *) b->opaque2; + vnet_interface_main_t *im = &vnet_get_main ()->interface_main; + vnet_buffer_opquae_formatter_t helper_fp; int i; @@ -570,15 +697,88 @@ format_vnet_buffer_opaque2 (u8 * s, va_list * args) s = format (s, "loop_counter: %d", o->loop_counter); vec_add1 (s, '\n'); - s = format (s, "gbp.flags: %x, gbp.src_epg: %d", - (u32) (o->gbp.flags), (u32) (o->gbp.src_epg)); + s = format (s, "gso_size: %d, gso_l4_hdr_sz: %d", + (u32) (o->gso_size), (u32) (o->gso_l4_hdr_sz)); vec_add1 (s, '\n'); - s = format (s, "pg_replay_timestamp: %llu", (u32) (o->pg_replay_timestamp)); - vec_add1 (s, '\n'); + for (i = 0; i < vec_len (im->buffer_opaque2_format_helpers); i++) + { + helper_fp = im->buffer_opaque2_format_helpers[i]; + s = (*helper_fp) (b, s); + } + return s; } +void +vnet_register_format_buffer_opaque_helper (vnet_buffer_opquae_formatter_t fp) +{ + vnet_interface_main_t *im = &vnet_get_main ()->interface_main; + vec_add1 (im->buffer_opaque_format_helpers, fp); +} + +void +vnet_register_format_buffer_opaque2_helper (vnet_buffer_opquae_formatter_t fp) +{ + vnet_interface_main_t *im = &vnet_get_main ()->interface_main; + vec_add1 (im->buffer_opaque2_format_helpers, fp); +} + + +uword +unformat_vnet_buffer_flags (unformat_input_t * input, va_list * args) +{ + u32 *flagp = va_arg (*args, u32 *); + int rv = 0; + u32 flags = 0; + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + /* Red herring, there is no such buffer flag */ + if (unformat (input, "avail10")) + return 0; +#define _(bit,enum,str,verbose) \ + else if (unformat (input, str)) \ + { \ + flags |= (1 << LOG2_VLIB_BUFFER_FLAG_USER(bit)); \ + rv = 1; \ + } + foreach_vnet_buffer_flag +#undef _ + else + break; + } + if (rv) + *flagp = flags; + return rv; +} + +uword +unformat_vnet_buffer_offload_flags (unformat_input_t *input, va_list *args) +{ + u32 *flagp = va_arg (*args, u32 *); + int rv = 0; + vnet_buffer_oflags_t oflags = 0; + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (0) + ; +#define _(bit, enum, str, verbose) \ + else if (unformat (input, str)) \ + { \ + oflags |= (1 << bit); \ + rv = 1; \ + } + foreach_vnet_buffer_offload_flag +#undef _ + else break; + } + if (rv) + *flagp = (u32) oflags; + return rv; +} + uword unformat_vnet_hw_interface (unformat_input_t * input, va_list * args) {