-static u8 * format_dpdk_device_name (u8 * s, va_list * args)
-{
- dpdk_main_t * dm = &dpdk_main;
- char *devname_format;
- char *device_name;
- u32 i = va_arg (*args, u32);
- struct rte_eth_dev_info dev_info;
- u8 * ret;
-
- if (dm->interface_name_format_decimal)
- devname_format = "%s%d/%d/%d";
- else
- devname_format = "%s%x/%x/%x";
-
-#ifdef RTE_LIBRTE_KNI
- if (dm->devices[i].dev_type == VNET_DPDK_DEV_KNI) {
- return format(s, "kni%d", dm->devices[i].kni_port_id);
- } else
-#endif
- if (dm->devices[i].dev_type == VNET_DPDK_DEV_VHOST_USER) {
- return format(s, "VirtualEthernet0/0/%d", dm->devices[i].vu_if_id);
- }
- switch (dm->devices[i].port_type)
- {
- case VNET_DPDK_PORT_TYPE_ETH_1G:
- device_name = "GigabitEthernet";
- break;
-
- case VNET_DPDK_PORT_TYPE_ETH_10G:
- device_name = "TenGigabitEthernet";
- break;
-
- case VNET_DPDK_PORT_TYPE_ETH_40G:
- device_name = "FortyGigabitEthernet";
- break;
-
- case VNET_DPDK_PORT_TYPE_ETH_SWITCH:
- device_name = "EthernetSwitch";
- break;
-
- #ifdef NETMAP
- case VNET_DPDK_PORT_TYPE_NETMAP:
- rte_eth_dev_info_get(i, &dev_info);
- return format(s, "netmap:%s", dev_info.driver_name);
- #endif
-
- case VNET_DPDK_PORT_TYPE_AF_PACKET:
- rte_eth_dev_info_get(i, &dev_info);
- return format(s, "af_packet%d", dm->devices[i].af_packet_port_id);
-
- default:
- case VNET_DPDK_PORT_TYPE_UNKNOWN:
- device_name = "UnknownEthernet";
- break;
- }
-
- rte_eth_dev_info_get(i, &dev_info);
- ret = format (s, devname_format, device_name, dev_info.pci_dev->addr.bus,
- dev_info.pci_dev->addr.devid,
- dev_info.pci_dev->addr.function);
-
- /* address Chelsio cards which share PCI address */
- if (dm->devices[i].pmd == VNET_DPDK_PMD_CXGBE) {
- struct rte_eth_dev_info di;
-
- di.pci_dev = 0;
- rte_eth_dev_info_get(i+1, &di);
- if (di.pci_dev && memcmp(&dev_info.pci_dev->addr, &di.pci_dev->addr,
- sizeof(struct rte_pci_addr)) == 0)
- return format(ret, "/0");
-
- di.pci_dev = 0;
- rte_eth_dev_info_get(i-1, &di);
- if (di.pci_dev && memcmp(&dev_info.pci_dev->addr, &di.pci_dev->addr,
- sizeof(struct rte_pci_addr)) == 0)
- return format(ret, "/1");
- }
- return ret;
-}
-
-static u8 * format_dpdk_device_type (u8 * s, va_list * args)
-{
- dpdk_main_t * dm = &dpdk_main;
- char *dev_type;
- u32 i = va_arg (*args, u32);
-
- if (dm->devices[i].dev_type == VNET_DPDK_DEV_KNI) {
- return format(s, "Kernel NIC Interface");
- } else if (dm->devices[i].dev_type == VNET_DPDK_DEV_VHOST_USER) {
- return format(s, "vhost-user interface");
- }
-
- switch (dm->devices[i].pmd)
- {
- case VNET_DPDK_PMD_E1000EM:
- dev_type = "Intel 82540EM (e1000)";
- break;
-
- case VNET_DPDK_PMD_IGB:
- dev_type = "Intel e1000";
- break;
-
- case VNET_DPDK_PMD_I40E:
- dev_type = "Intel X710/XL710 Family";
- break;
-
- case VNET_DPDK_PMD_I40EVF:
- dev_type = "Intel X710/XL710 Family VF";
- break;
-
- case VNET_DPDK_PMD_FM10K:
- dev_type = "Intel FM10000 Family Ethernet Switch";
- break;
-
- case VNET_DPDK_PMD_IGBVF:
- dev_type = "Intel e1000 VF";
- break;
-
- case VNET_DPDK_PMD_VIRTIO:
- dev_type = "Red Hat Virtio";
- break;
-
- case VNET_DPDK_PMD_IXGBEVF:
- dev_type = "Intel 82599 VF";
- break;
-
- case VNET_DPDK_PMD_IXGBE:
- dev_type = "Intel 82599";
- break;
-
- case VNET_DPDK_PMD_VICE:
- case VNET_DPDK_PMD_ENIC:
- dev_type = "Cisco VIC";
- break;
-
- case VNET_DPDK_PMD_CXGBE:
- dev_type = "Chelsio T4/T5";
- break;
-
- case VNET_DPDK_PMD_VMXNET3:
- dev_type = "VMware VMXNET3";
- break;
-
-#ifdef NETMAP
- case VNET_DPDK_PMD_NETMAP:
- dev_type = "Netmap/Vale";
- break;
-#endif
-
- case VNET_DPDK_PMD_AF_PACKET:
- dev_type = "af_packet";
- break;
-
- default:
- case VNET_DPDK_PMD_UNKNOWN:
- dev_type = "### UNKNOWN ###";
- break;
- }
-
- return format (s, dev_type);
-}
-
-static u8 * format_dpdk_link_status (u8 * s, va_list * args)
-{
- dpdk_device_t * xd = va_arg (*args, dpdk_device_t *);
- struct rte_eth_link * l = &xd->link;
- vnet_main_t * vnm = vnet_get_main();
- vnet_hw_interface_t * hi = vnet_get_hw_interface (vnm, xd->vlib_hw_if_index);
-
- s = format (s, "%s ", l->link_status ? "up" : "down");
- if (l->link_status)
- {
- u32 promisc = rte_eth_promiscuous_get (xd->device_index);
-
- s = format (s, "%s duplex ", (l->link_duplex == ETH_LINK_FULL_DUPLEX) ?
- "full" : "half");
- s = format (s, "speed %u mtu %d %s\n", l->link_speed,
- hi->max_packet_bytes, promisc ? " promisc" : "");
- }
- else
- s = format (s, "\n");
-
- return s;
-}
-
-#define _line_len 72
-#define _(v, str) \
-if (bitmap & v) { \
- if (format_get_indent (s) > next_split ) { \
- next_split += _line_len; \
- s = format(s,"\n%U", format_white_space, indent); \
- } \
- s = format(s, "%s ", str); \
-}
-
-static u8 * format_dpdk_rss_hf_name(u8 * s, va_list * args)
-{
- u64 bitmap = va_arg (*args, u64);
- int next_split = _line_len;
- int indent = format_get_indent (s);
-
- if (!bitmap)
- return format(s, "none");
-
- foreach_dpdk_rss_hf
-
- return s;
-}
-
-static u8 * format_dpdk_rx_offload_caps(u8 * s, va_list * args)
-{
- u32 bitmap = va_arg (*args, u32);
- int next_split = _line_len;
- int indent = format_get_indent (s);
-
- if (!bitmap)
- return format(s, "none");
-
- foreach_dpdk_rx_offload_caps
-
- return s;
-}
-
-static u8 * format_dpdk_tx_offload_caps(u8 * s, va_list * args)
-{
- u32 bitmap = va_arg (*args, u32);
- int next_split = _line_len;
- int indent = format_get_indent (s);
- if (!bitmap)
- return format(s, "none");
-
- foreach_dpdk_tx_offload_caps
-
- return s;
-}
-
-#undef _line_len
-#undef _
-
-static u8 * format_dpdk_device (u8 * s, va_list * args)
-{
- u32 dev_instance = va_arg (*args, u32);
- int verbose = va_arg (*args, int);
- dpdk_main_t * dm = &dpdk_main;
- dpdk_device_t * xd = vec_elt_at_index (dm->devices, dev_instance);
- uword indent = format_get_indent (s);
- f64 now = vlib_time_now (dm->vlib_main);
-
- dpdk_update_counters (xd, now);
- dpdk_update_link_state (xd, now);
-
- s = format (s, "%U\n%Ucarrier %U",
- format_dpdk_device_type, xd->device_index,
- format_white_space, indent + 2,
- format_dpdk_link_status, xd);
-
- if (verbose > 1 && xd->dev_type == VNET_DPDK_DEV_ETH)
- {
- struct rte_eth_dev_info di;
- struct rte_pci_device * pci;
- struct rte_eth_rss_conf rss_conf;
- int vlan_off;
-
- rss_conf.rss_key = 0;
- rte_eth_dev_info_get(xd->device_index, &di);
- rte_eth_dev_rss_hash_conf_get(xd->device_index, &rss_conf);
- pci = di.pci_dev;
-
- if (pci)
- s = format(s, "%Upci id: device %04x:%04x subsystem %04x:%04x\n"
- "%Upci address: %04x:%02x:%02x.%02x\n",
- format_white_space, indent + 2,
- pci->id.vendor_id, pci->id.device_id,
- pci->id.subsystem_vendor_id,
- pci->id.subsystem_device_id,
- format_white_space, indent + 2,
- pci->addr.domain, pci->addr.bus,
- pci->addr.devid, pci->addr.function);
- s = format(s, "%Umax rx packet len: %d\n",
- format_white_space, indent + 2, di.max_rx_pktlen);
- s = format(s, "%Upromiscuous: unicast %s all-multicast %s\n",
- format_white_space, indent + 2,
- rte_eth_promiscuous_get(xd->device_index) ? "on" : "off",
- rte_eth_promiscuous_get(xd->device_index) ? "on" : "off");
- vlan_off = rte_eth_dev_get_vlan_offload(xd->device_index);
- s = format(s, "%Uvlan offload: strip %s filter %s qinq %s\n",
- format_white_space, indent + 2,
- vlan_off & ETH_VLAN_STRIP_OFFLOAD ? "on" : "off",
- vlan_off & ETH_VLAN_FILTER_OFFLOAD ? "on" : "off",
- vlan_off & ETH_VLAN_EXTEND_OFFLOAD ? "on" : "off");
- s = format(s, "%Uqueue size (max): rx %d (%d) tx %d (%d)\n",
- format_white_space, indent + 2,
- xd->rx_q_used, di.max_rx_queues,
- xd->tx_q_used, di.max_tx_queues);
- s = format(s, "%Urx offload caps: %U\n",
- format_white_space, indent + 2,
- format_dpdk_rx_offload_caps, di.rx_offload_capa);
- s = format(s, "%Utx offload caps: %U\n",
- format_white_space, indent + 2,
- format_dpdk_tx_offload_caps, di.tx_offload_capa);
- s = format(s, "%Urss active: %U\n"
- "%Urss supported: %U\n",
- format_white_space, indent + 2,
- format_dpdk_rss_hf_name, rss_conf.rss_hf,
- format_white_space, indent + 2,
- format_dpdk_rss_hf_name, di.flow_type_rss_offloads);
- }
-
- if (xd->cpu_socket > -1)
- s = format (s, "%Ucpu socket %d",
- format_white_space, indent + 2,
- xd->cpu_socket);
-
- /* $$$ MIB counters */
-
- {
-#define _(N, V) \
- if (xd->stats.V != 0) \
- s = format (s, "\n%U%-40U%16Ld", \
- format_white_space, indent + 2, \
- format_c_identifier, #N, xd->stats.V);
-
- foreach_dpdk_counter
-#undef _
- }
-
- u8 * xs = 0;
- struct rte_eth_xstats * xstat;
-
- vec_foreach(xstat, xd->xstats)
- {
- if (xstat->value)
- {
- /* format_c_identifier don't like c strings inside vector */
- u8 * name = format(0,"%s", xstat->name);
- xs = format(xs, "\n%U%-38U%16Ld",
- format_white_space, indent + 4,
- format_c_identifier, name, xstat->value);
- vec_free(name);
- }
- }
-
- if (xs)
- {
- s = format(s, "\n%Uextended stats:%v",
- format_white_space, indent + 2, xs);
- vec_free(xs);
- }
-
- return s;
-}
-
-static u8 * format_dpdk_tx_dma_trace (u8 * s, va_list * va)
-{
- CLIB_UNUSED (vlib_main_t * vm) = va_arg (*va, vlib_main_t *);
- CLIB_UNUSED (vlib_node_t * node) = va_arg (*va, vlib_node_t *);
- CLIB_UNUSED (vnet_main_t * vnm) = vnet_get_main();
- dpdk_tx_dma_trace_t * t = va_arg (*va, dpdk_tx_dma_trace_t *);
- dpdk_main_t * dm = &dpdk_main;
- dpdk_device_t * xd = vec_elt_at_index (dm->devices, t->device_index);
- uword indent = format_get_indent (s);
- vnet_sw_interface_t * sw = vnet_get_sw_interface (vnm, xd->vlib_sw_if_index);
-
- s = format (s, "%U tx queue %d",
- format_vnet_sw_interface_name, vnm, sw,
- t->queue_index);
-
- s = format (s, "\n%Ubuffer 0x%x: %U",
- format_white_space, indent,
- t->buffer_index,
- format_vlib_buffer, &t->buffer);
-
- s = format (s, "\n%U%U", format_white_space, indent,
- format_ethernet_header_with_length, t->buffer.pre_data,
- sizeof (t->buffer.pre_data));
-
- return s;
-}
-