X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface_format.c;h=8278102c6440e87cb8d005003348045a2d5816cd;hb=08eb2bb205f998a75dacd1f3b999ec1a10160b35;hp=2cc10f9b057e6c67ea46cb6003f4b67f09ce90b8;hpb=4ba67723d716660c56326ce498b99a060a9471b1;p=vpp.git diff --git a/src/vnet/interface_format.c b/src/vnet/interface_format.c index 2cc10f9b057..8278102c644 100644 --- a/src/vnet/interface_format.c +++ b/src/vnet/interface_format.c @@ -41,6 +41,42 @@ #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) @@ -49,8 +85,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", @@ -190,7 +224,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) { @@ -216,69 +250,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; - - for (i = 0; i < vec_len (vnet_mains); i++) - { - if (vnet_mains[i]) - vec_add1 (my_vnet_mains, vnet_mains[i]); - } + n_counters = vec_len (im->combined_sw_if_counters); - if (vec_len (my_vnet_mains) == 0) - vec_add1 (my_vnet_mains, &vnet_main); + /* 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; - /* Each vnet_main_t has its own copy of the interface counters */ - n_counters = vec_len (im->combined_sw_if_counters); + 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; - /* rx, tx counters... */ - for (j = 0; j < n_counters; j++) - { - vtotal.packets = 0; - vtotal.bytes = 0; + /* Only display non-zero counters. */ + if (vtotal.packets == 0) + continue; - 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) + 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) - _vec_len (n) = 0; - n = format (n, "%s packets", cm->name); - s = format (s, "%-16v%16Ld", n, vtotal.packets); + 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 bytes", cm->name); - s = format (s, "\n%U%-16v%16Ld", - format_white_space, indent, n, vtotal.bytes); - } - vec_free (n); - } + 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); { vlib_simple_counter_main_t *cm; @@ -290,19 +328,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; @@ -341,7 +388,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; } @@ -364,7 +411,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; } @@ -385,6 +432,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: "); @@ -431,6 +480,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", @@ -456,13 +516,15 @@ 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.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: %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, @@ -486,20 +548,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, @@ -522,12 +588,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'); @@ -536,25 +601,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; } @@ -563,6 +618,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; @@ -582,11 +639,65 @@ format_vnet_buffer_opaque2 (u8 * s, va_list * args) (u32) (o->gbp.flags), (u32) (o->gbp.sclass)); vec_add1 (s, '\n'); + 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, "avail8")) + 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_hw_interface (unformat_input_t * input, va_list * args) {