X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface_format.c;h=8278102c6440e87cb8d005003348045a2d5816cd;hb=08eb2bb205f998a75dacd1f3b999ec1a10160b35;hp=e25a05aa9f1df12fc060364eb4fed54067383190;hpb=8fdde3c22ff981f0c41b78d3640e3249873e8495;p=vpp.git diff --git a/src/vnet/interface_format.c b/src/vnet/interface_format.c index e25a05aa9f1..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,12 +250,21 @@ 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 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; @@ -244,6 +287,21 @@ format_vnet_sw_interface_cntrs (u8 * s, vnet_interface_main_t * im, if (vtotal.packets == 0) continue; + 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; @@ -279,6 +337,19 @@ format_vnet_sw_interface_cntrs (u8 * s, vnet_interface_main_t * im, 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; @@ -317,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; } @@ -340,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; } @@ -361,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: "); @@ -407,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", @@ -432,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, @@ -462,18 +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.sad_index: %d", 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, @@ -496,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'); @@ -510,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; } @@ -537,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; @@ -556,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) {