X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface_format.c;h=c62e770e57b006ea24976493334553dca152d4f8;hb=5100aa9cb;hp=b3a30622031f1085ff4cb8c470e66d739b075a26;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vnet/interface_format.c b/src/vnet/interface_format.c index b3a30622031..c62e770e57b 100644 --- a/src/vnet/interface_format.c +++ b/src/vnet/interface_format.c @@ -45,7 +45,9 @@ format_vnet_sw_interface_flags (u8 * s, va_list * args) { u32 flags = va_arg (*args, u32); - if (flags & VNET_SW_INTERFACE_FLAG_BOND_SLAVE) + 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 { @@ -58,6 +60,41 @@ format_vnet_sw_interface_flags (u8 * s, va_list * args) return s; } +u8 * +format_vnet_hw_interface_rx_mode (u8 * s, va_list * args) +{ + vnet_hw_interface_rx_mode mode = va_arg (*args, vnet_hw_interface_rx_mode); + + if (mode == VNET_HW_INTERFACE_RX_MODE_POLLING) + return format (s, "polling"); + + if (mode == VNET_HW_INTERFACE_RX_MODE_INTERRUPT) + return format (s, "interrupt"); + + if (mode == VNET_HW_INTERFACE_RX_MODE_ADAPTIVE) + return format (s, "adaptive"); + + return format (s, "unknown"); +} + +u8 * +format_vnet_hw_interface_link_speed (u8 * s, va_list * args) +{ + u32 link_speed = va_arg (*args, u32); + + if (link_speed == 0) + return format (s, "unknown"); + + if (link_speed >= 1000000) + return format (s, "%f Gbps", (f64) link_speed / 1000000); + + if (link_speed >= 1000) + return format (s, "%f Mbps", (f64) link_speed / 1000); + + return format (s, "%u Kbps", link_speed); +} + + u8 * format_vnet_hw_interface (u8 * s, va_list * args) { @@ -66,7 +103,7 @@ format_vnet_hw_interface (u8 * s, va_list * args) vnet_hw_interface_class_t *hw_class; vnet_device_class_t *dev_class; int verbose = va_arg (*args, int); - uword indent; + u32 indent; if (!hi) return format (s, "%=32s%=6s%=8s%s", "Name", "Idx", "Link", "Hardware"); @@ -96,6 +133,9 @@ format_vnet_hw_interface (u8 * s, va_list * args) else s = format (s, "%s%d", dev_class->name, hi->dev_instance); + s = format (s, "\n%ULink speed: %U", format_white_space, indent + 2, + format_vnet_hw_interface_link_speed, hi->link_speed); + if (verbose) { if (hw_class->format_device) @@ -146,16 +186,37 @@ format_vnet_sw_if_index_name (u8 * s, va_list * args) { vnet_main_t *vnm = va_arg (*args, vnet_main_t *); u32 sw_if_index = va_arg (*args, u32); - return format (s, "%U", - format_vnet_sw_interface_name, vnm, - vnet_get_sw_interface (vnm, sw_if_index)); + vnet_sw_interface_t *si; + + si = vnet_get_sw_interface_safe (vnm, sw_if_index); + + if (NULL == si) + { + return format (s, "DELETED"); + } + return format (s, "%U", format_vnet_sw_interface_name, vnm, si); +} + +u8 * +format_vnet_hw_if_index_name (u8 * s, va_list * args) +{ + vnet_main_t *vnm = va_arg (*args, vnet_main_t *); + u32 hw_if_index = va_arg (*args, u32); + vnet_hw_interface_t *hi; + + hi = vnet_get_hw_interface (vnm, hw_if_index); + + if (hi == 0) + return format (s, "DELETED"); + + return format (s, "%v", hi->name); } u8 * format_vnet_sw_interface_cntrs (u8 * s, vnet_interface_main_t * im, vnet_sw_interface_t * si) { - uword indent, n_printed; + u32 indent, n_printed; int i, j, n_counters; static vnet_main_t **my_vnet_mains; @@ -251,6 +312,16 @@ format_vnet_sw_interface_cntrs (u8 * s, vnet_interface_main_t * im, return s; } +static u8 * +format_vnet_sw_interface_mtu (u8 * s, va_list * args) +{ + vnet_sw_interface_t *si = va_arg (*args, vnet_sw_interface_t *); + + return format (s, "%d/%d/%d/%d", si->mtu[VNET_MTU_L3], + si->mtu[VNET_MTU_IP4], + si->mtu[VNET_MTU_IP6], si->mtu[VNET_MTU_MPLS]); +} + u8 * format_vnet_sw_interface (u8 * s, va_list * args) { @@ -259,12 +330,14 @@ format_vnet_sw_interface (u8 * s, va_list * args) vnet_interface_main_t *im = &vnm->interface_main; if (!si) - return format (s, "%=32s%=5s%=16s%=16s%=16s", - "Name", "Idx", "State", "Counter", "Count"); + return format (s, "%=32s%=5s%=10s%=21s%=16s%=16s", + "Name", "Idx", "State", "MTU (L3/IP4/IP6/MPLS)", "Counter", + "Count"); - s = format (s, "%-32U%=5d%=16U", + s = format (s, "%-32U%=5d%=10U%=21U", format_vnet_sw_interface_name, vnm, si, si->sw_if_index, - format_vnet_sw_interface_flags, si->flags); + format_vnet_sw_interface_flags, si->flags, + format_vnet_sw_interface_mtu, si); s = format_vnet_sw_interface_cntrs (s, im, si); @@ -321,6 +394,7 @@ unformat_vnet_sw_interface (unformat_input_t * input, va_list * args) u32 *result = va_arg (*args, u32 *); vnet_hw_interface_t *hi; u32 hw_if_index, id, id_specified; + u32 sw_if_index; u8 *if_name = 0; uword *p, error = 0; @@ -340,14 +414,17 @@ unformat_vnet_sw_interface (unformat_input_t * input, va_list * args) hi = vnet_get_hw_interface (vnm, hw_if_index); if (!id_specified) { - *result = hi->sw_if_index; + sw_if_index = hi->sw_if_index; } else { if (!(p = hash_get (hi->sub_interface_sw_if_index_by_id, id))) - return 0; - *result = p[0]; + goto done; + sw_if_index = p[0]; } + if (!vnet_sw_interface_is_api_visible (vnm, sw_if_index)) + goto done; + *result = sw_if_index; error = 1; done: vec_free (if_name);