1d862c45bSRaslan Darawsheh /* SPDX-License-Identifier: BSD-3-Clause 2d862c45bSRaslan Darawsheh * Copyright(c) 2010-2014 Intel Corporation 380139e35SThomas Monjalon * Copyright 2018 Mellanox Technologies, Ltd 4d862c45bSRaslan Darawsheh */ 5d862c45bSRaslan Darawsheh 6d862c45bSRaslan Darawsheh #include <stdio.h> 7d862c45bSRaslan Darawsheh 87a0c6491SThomas Monjalon #include <rte_bitops.h> 9d862c45bSRaslan Darawsheh #include <rte_net.h> 10d862c45bSRaslan Darawsheh #include <rte_mbuf.h> 11d862c45bSRaslan Darawsheh #include <rte_ether.h> 12512d873fSFlavia Musatescu #include <rte_vxlan.h> 13d862c45bSRaslan Darawsheh #include <rte_ethdev.h> 14d862c45bSRaslan Darawsheh #include <rte_flow.h> 15d862c45bSRaslan Darawsheh 16d862c45bSRaslan Darawsheh #include "testpmd.h" 17d862c45bSRaslan Darawsheh 182ce96495SJiawei Wang #define MAX_STRING_LEN 8192 192ce96495SJiawei Wang 202ce96495SJiawei Wang #define MKDUMPSTR(buf, buf_size, cur_len, ...) \ 212ce96495SJiawei Wang do { \ 222ce96495SJiawei Wang if (cur_len >= buf_size) \ 232ce96495SJiawei Wang break; \ 242ce96495SJiawei Wang cur_len += snprintf(buf + cur_len, buf_size - cur_len, __VA_ARGS__); \ 252ce96495SJiawei Wang } while (0) 262ce96495SJiawei Wang 27d862c45bSRaslan Darawsheh static inline void 282ce96495SJiawei Wang print_ether_addr(const char *what, const struct rte_ether_addr *eth_addr, 292ce96495SJiawei Wang char print_buf[], size_t buf_size, size_t *cur_len) 30d862c45bSRaslan Darawsheh { 3135b2d13fSOlivier Matz char buf[RTE_ETHER_ADDR_FMT_SIZE]; 322ce96495SJiawei Wang 3335b2d13fSOlivier Matz rte_ether_format_addr(buf, RTE_ETHER_ADDR_FMT_SIZE, eth_addr); 342ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, *cur_len, "%s%s", what, buf); 35d862c45bSRaslan Darawsheh } 36d862c45bSRaslan Darawsheh 377a0c6491SThomas Monjalon static inline bool 387a0c6491SThomas Monjalon is_timestamp_enabled(const struct rte_mbuf *mbuf) 397a0c6491SThomas Monjalon { 407a0c6491SThomas Monjalon static uint64_t timestamp_rx_dynflag; 417a0c6491SThomas Monjalon int timestamp_rx_dynflag_offset; 427a0c6491SThomas Monjalon 437a0c6491SThomas Monjalon if (timestamp_rx_dynflag == 0) { 447a0c6491SThomas Monjalon timestamp_rx_dynflag_offset = rte_mbuf_dynflag_lookup( 457a0c6491SThomas Monjalon RTE_MBUF_DYNFLAG_RX_TIMESTAMP_NAME, NULL); 467a0c6491SThomas Monjalon if (timestamp_rx_dynflag_offset < 0) 477a0c6491SThomas Monjalon return false; 487a0c6491SThomas Monjalon timestamp_rx_dynflag = RTE_BIT64(timestamp_rx_dynflag_offset); 497a0c6491SThomas Monjalon } 507a0c6491SThomas Monjalon 517a0c6491SThomas Monjalon return (mbuf->ol_flags & timestamp_rx_dynflag) != 0; 527a0c6491SThomas Monjalon } 537a0c6491SThomas Monjalon 547a0c6491SThomas Monjalon static inline rte_mbuf_timestamp_t 557a0c6491SThomas Monjalon get_timestamp(const struct rte_mbuf *mbuf) 567a0c6491SThomas Monjalon { 577a0c6491SThomas Monjalon static int timestamp_dynfield_offset = -1; 587a0c6491SThomas Monjalon 597a0c6491SThomas Monjalon if (timestamp_dynfield_offset < 0) { 607a0c6491SThomas Monjalon timestamp_dynfield_offset = rte_mbuf_dynfield_lookup( 617a0c6491SThomas Monjalon RTE_MBUF_DYNFIELD_TIMESTAMP_NAME, NULL); 627a0c6491SThomas Monjalon if (timestamp_dynfield_offset < 0) 637a0c6491SThomas Monjalon return 0; 647a0c6491SThomas Monjalon } 657a0c6491SThomas Monjalon 667a0c6491SThomas Monjalon return *RTE_MBUF_DYNFIELD(mbuf, 677a0c6491SThomas Monjalon timestamp_dynfield_offset, rte_mbuf_timestamp_t *); 687a0c6491SThomas Monjalon } 697a0c6491SThomas Monjalon 70c77ad9deSRaslan Darawsheh static inline void 71d862c45bSRaslan Darawsheh dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], 72d862c45bSRaslan Darawsheh uint16_t nb_pkts, int is_rx) 73d862c45bSRaslan Darawsheh { 74d862c45bSRaslan Darawsheh struct rte_mbuf *mb; 753e6b0d5fSDavid Marchand const struct rte_ether_hdr *eth_hdr; 763e6b0d5fSDavid Marchand struct rte_ether_hdr _eth_hdr; 77d862c45bSRaslan Darawsheh uint16_t eth_type; 78d862c45bSRaslan Darawsheh uint64_t ol_flags; 79d862c45bSRaslan Darawsheh uint16_t i, packet_type; 80d862c45bSRaslan Darawsheh uint16_t is_encapsulation; 81d862c45bSRaslan Darawsheh char buf[256]; 82d862c45bSRaslan Darawsheh struct rte_net_hdr_lens hdr_lens; 83d862c45bSRaslan Darawsheh uint32_t sw_packet_type; 84d862c45bSRaslan Darawsheh uint32_t vx_vni; 85b6ec9ce9SDavid Marchand const char *reason; 86b57b66a9SOri Kam int dynf_index; 872ce96495SJiawei Wang char print_buf[MAX_STRING_LEN]; 882ce96495SJiawei Wang size_t buf_size = MAX_STRING_LEN; 892ce96495SJiawei Wang size_t cur_len = 0; 90fca8cba4SDavid Marchand uint64_t restore_info_dynflag; 91d862c45bSRaslan Darawsheh 92d862c45bSRaslan Darawsheh if (!nb_pkts) 93d862c45bSRaslan Darawsheh return; 94fca8cba4SDavid Marchand restore_info_dynflag = rte_flow_restore_info_dynflag(); 952ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 962ce96495SJiawei Wang "port %u/queue %u: %s %u packets\n", port_id, queue, 972ce96495SJiawei Wang is_rx ? "received" : "sent", (unsigned int) nb_pkts); 98d862c45bSRaslan Darawsheh for (i = 0; i < nb_pkts; i++) { 991b9f2746SGregory Etelson struct rte_flow_error error; 1001b9f2746SGregory Etelson struct rte_flow_restore_info info = { 0, }; 1011b9f2746SGregory Etelson 102d862c45bSRaslan Darawsheh mb = pkts[i]; 103fca8cba4SDavid Marchand ol_flags = mb->ol_flags; 1047fbf4a02SXueming Li if (rxq_share > 0) 1057fbf4a02SXueming Li MKDUMPSTR(print_buf, buf_size, cur_len, "port %u, ", 1067fbf4a02SXueming Li mb->port); 1073e6b0d5fSDavid Marchand eth_hdr = rte_pktmbuf_read(mb, 0, sizeof(_eth_hdr), &_eth_hdr); 108d862c45bSRaslan Darawsheh eth_type = RTE_BE_TO_CPU_16(eth_hdr->ether_type); 109d862c45bSRaslan Darawsheh packet_type = mb->packet_type; 110d862c45bSRaslan Darawsheh is_encapsulation = RTE_ETH_IS_TUNNEL_PKT(packet_type); 111fca8cba4SDavid Marchand if ((ol_flags & restore_info_dynflag) != 0 && 112fca8cba4SDavid Marchand rte_flow_get_restore_info(port_id, mb, &info, &error) == 0) { 1132ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1142ce96495SJiawei Wang "restore info:"); 1151b9f2746SGregory Etelson if (info.flags & RTE_FLOW_RESTORE_INFO_TUNNEL) { 1161b9f2746SGregory Etelson struct port_flow_tunnel *port_tunnel; 117d862c45bSRaslan Darawsheh 1181b9f2746SGregory Etelson port_tunnel = port_flow_locate_tunnel 1191b9f2746SGregory Etelson (port_id, &info.tunnel); 1202ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1212ce96495SJiawei Wang " - tunnel"); 1221b9f2746SGregory Etelson if (port_tunnel) 1232ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1242ce96495SJiawei Wang " #%u", port_tunnel->id); 1251b9f2746SGregory Etelson else 1262ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1272ce96495SJiawei Wang " %s", "-none-"); 1282ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1292ce96495SJiawei Wang " type %s", port_flow_tunnel_type 1302ce96495SJiawei Wang (&info.tunnel)); 1311b9f2746SGregory Etelson } else { 1322ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1332ce96495SJiawei Wang " - no tunnel info"); 1341b9f2746SGregory Etelson } 1351b9f2746SGregory Etelson if (info.flags & RTE_FLOW_RESTORE_INFO_ENCAPSULATED) 1362ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1372ce96495SJiawei Wang " - outer header present"); 1381b9f2746SGregory Etelson else 1392ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1402ce96495SJiawei Wang " - no outer header"); 1411b9f2746SGregory Etelson if (info.flags & RTE_FLOW_RESTORE_INFO_GROUP_ID) 1422ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1432ce96495SJiawei Wang " - miss group %u", info.group_id); 1441b9f2746SGregory Etelson else 1452ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1462ce96495SJiawei Wang " - no miss group"); 1472ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, "\n"); 1481b9f2746SGregory Etelson } 14904d43857SDmitry Kozlyuk print_ether_addr(" src=", ð_hdr->src_addr, 1502ce96495SJiawei Wang print_buf, buf_size, &cur_len); 15104d43857SDmitry Kozlyuk print_ether_addr(" - dst=", ð_hdr->dst_addr, 1522ce96495SJiawei Wang print_buf, buf_size, &cur_len); 1532ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1544f04edcdSHanumanth Pothula " - pool=%s - type=0x%04x - length=%u - nb_segs=%d", 1554f04edcdSHanumanth Pothula mb->pool->name, eth_type, (unsigned int) mb->pkt_len, 156d862c45bSRaslan Darawsheh (int)mb->nb_segs); 157daa02b5cSOlivier Matz if (ol_flags & RTE_MBUF_F_RX_RSS_HASH) { 1582ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1592ce96495SJiawei Wang " - RSS hash=0x%x", 1602ce96495SJiawei Wang (unsigned int) mb->hash.rss); 1612ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1622ce96495SJiawei Wang " - RSS queue=0x%x", (unsigned int) queue); 163d862c45bSRaslan Darawsheh } 164daa02b5cSOlivier Matz if (ol_flags & RTE_MBUF_F_RX_FDIR) { 1652ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1662ce96495SJiawei Wang " - FDIR matched "); 167daa02b5cSOlivier Matz if (ol_flags & RTE_MBUF_F_RX_FDIR_ID) 1682ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1692ce96495SJiawei Wang "ID=0x%x", mb->hash.fdir.hi); 170daa02b5cSOlivier Matz else if (ol_flags & RTE_MBUF_F_RX_FDIR_FLX) 1712ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1722ce96495SJiawei Wang "flex bytes=0x%08x %08x", 173d862c45bSRaslan Darawsheh mb->hash.fdir.hi, mb->hash.fdir.lo); 174d862c45bSRaslan Darawsheh else 1752ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1762ce96495SJiawei Wang "hash=0x%x ID=0x%x ", 177d862c45bSRaslan Darawsheh mb->hash.fdir.hash, mb->hash.fdir.id); 178d862c45bSRaslan Darawsheh } 1797a0c6491SThomas Monjalon if (is_timestamp_enabled(mb)) 1802ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1812ce96495SJiawei Wang " - timestamp %"PRIu64" ", get_timestamp(mb)); 18203c162f3SDavid Marchand if ((is_rx && (ol_flags & RTE_MBUF_F_RX_QINQ) != 0) || 18303c162f3SDavid Marchand (!is_rx && (ol_flags & RTE_MBUF_F_TX_QINQ) != 0)) 1842ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1852ce96495SJiawei Wang " - QinQ VLAN tci=0x%x, VLAN tci outer=0x%x", 186d862c45bSRaslan Darawsheh mb->vlan_tci, mb->vlan_tci_outer); 18703c162f3SDavid Marchand else if ((is_rx && (ol_flags & RTE_MBUF_F_RX_VLAN) != 0) || 18803c162f3SDavid Marchand (!is_rx && (ol_flags & RTE_MBUF_F_TX_VLAN) != 0)) 1892ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1902ce96495SJiawei Wang " - VLAN tci=0x%x", mb->vlan_tci); 191daa02b5cSOlivier Matz if (!is_rx && (ol_flags & RTE_MBUF_DYNFLAG_TX_METADATA)) 1922ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1932ce96495SJiawei Wang " - Tx metadata: 0x%x", 1949bf26e13SViacheslav Ovsiienko *RTE_FLOW_DYNF_METADATA(mb)); 195daa02b5cSOlivier Matz if (is_rx && (ol_flags & RTE_MBUF_DYNFLAG_RX_METADATA)) 1962ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1972ce96495SJiawei Wang " - Rx metadata: 0x%x", 198e02ecc13SViacheslav Ovsiienko *RTE_FLOW_DYNF_METADATA(mb)); 199b57b66a9SOri Kam for (dynf_index = 0; dynf_index < 64; dynf_index++) { 200b57b66a9SOri Kam if (dynf_names[dynf_index][0] != '\0') 2012ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2022ce96495SJiawei Wang " - dynf %s: %d", 203b57b66a9SOri Kam dynf_names[dynf_index], 204b57b66a9SOri Kam !!(ol_flags & (1UL << dynf_index))); 205b57b66a9SOri Kam } 206d862c45bSRaslan Darawsheh if (mb->packet_type) { 207d862c45bSRaslan Darawsheh rte_get_ptype_name(mb->packet_type, buf, sizeof(buf)); 2082ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2092ce96495SJiawei Wang " - hw ptype: %s", buf); 210d862c45bSRaslan Darawsheh } 211d862c45bSRaslan Darawsheh sw_packet_type = rte_net_get_ptype(mb, &hdr_lens, 212d862c45bSRaslan Darawsheh RTE_PTYPE_ALL_MASK); 213d862c45bSRaslan Darawsheh rte_get_ptype_name(sw_packet_type, buf, sizeof(buf)); 2142ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, " - sw ptype: %s", buf); 215d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_L2_MASK) 2162ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, " - l2_len=%d", 2172ce96495SJiawei Wang hdr_lens.l2_len); 218d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_L3_MASK) 2192ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, " - l3_len=%d", 2202ce96495SJiawei Wang hdr_lens.l3_len); 221d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_L4_MASK) 2222ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, " - l4_len=%d", 2232ce96495SJiawei Wang hdr_lens.l4_len); 224d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_TUNNEL_MASK) 2252ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2262ce96495SJiawei Wang " - tunnel_len=%d", hdr_lens.tunnel_len); 227d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_INNER_L2_MASK) 2282ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2292ce96495SJiawei Wang " - inner_l2_len=%d", hdr_lens.inner_l2_len); 230d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_INNER_L3_MASK) 2312ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2322ce96495SJiawei Wang " - inner_l3_len=%d", hdr_lens.inner_l3_len); 233d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_INNER_L4_MASK) 2342ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2352ce96495SJiawei Wang " - inner_l4_len=%d", hdr_lens.inner_l4_len); 236*e2bce04bSAlex Chapman 237a7c528e5SOlivier Matz struct rte_ipv4_hdr *ipv4_hdr; 238a7c528e5SOlivier Matz struct rte_ipv6_hdr *ipv6_hdr; 239e73e3547SOlivier Matz struct rte_udp_hdr *udp_hdr; 240*e2bce04bSAlex Chapman struct rte_tcp_hdr *tcp_hdr; 241d862c45bSRaslan Darawsheh uint8_t l2_len; 242d862c45bSRaslan Darawsheh uint8_t l3_len; 243d862c45bSRaslan Darawsheh uint8_t l4_len; 244d862c45bSRaslan Darawsheh uint8_t l4_proto; 245*e2bce04bSAlex Chapman uint16_t l4_port; 2466d13ea8eSOlivier Matz struct rte_vxlan_hdr *vxlan_hdr; 247d862c45bSRaslan Darawsheh 2486d13ea8eSOlivier Matz l2_len = sizeof(struct rte_ether_hdr); 249d862c45bSRaslan Darawsheh 250d862c45bSRaslan Darawsheh /* Do not support ipv4 option field */ 251d862c45bSRaslan Darawsheh if (RTE_ETH_IS_IPV4_HDR(packet_type)) { 252a7c528e5SOlivier Matz l3_len = sizeof(struct rte_ipv4_hdr); 253d862c45bSRaslan Darawsheh ipv4_hdr = rte_pktmbuf_mtod_offset(mb, 254a7c528e5SOlivier Matz struct rte_ipv4_hdr *, 255d862c45bSRaslan Darawsheh l2_len); 256d862c45bSRaslan Darawsheh l4_proto = ipv4_hdr->next_proto_id; 257d862c45bSRaslan Darawsheh } else { 258a7c528e5SOlivier Matz l3_len = sizeof(struct rte_ipv6_hdr); 259d862c45bSRaslan Darawsheh ipv6_hdr = rte_pktmbuf_mtod_offset(mb, 260a7c528e5SOlivier Matz struct rte_ipv6_hdr *, 261d862c45bSRaslan Darawsheh l2_len); 262d862c45bSRaslan Darawsheh l4_proto = ipv6_hdr->proto; 263d862c45bSRaslan Darawsheh } 264d862c45bSRaslan Darawsheh if (l4_proto == IPPROTO_UDP) { 265d862c45bSRaslan Darawsheh udp_hdr = rte_pktmbuf_mtod_offset(mb, 266e73e3547SOlivier Matz struct rte_udp_hdr *, 267d862c45bSRaslan Darawsheh l2_len + l3_len); 268*e2bce04bSAlex Chapman l4_port = RTE_BE_TO_CPU_16(udp_hdr->dst_port); 269*e2bce04bSAlex Chapman if (is_encapsulation) { 270e73e3547SOlivier Matz l4_len = sizeof(struct rte_udp_hdr); 271d862c45bSRaslan Darawsheh vxlan_hdr = rte_pktmbuf_mtod_offset(mb, 2726d13ea8eSOlivier Matz struct rte_vxlan_hdr *, 273d862c45bSRaslan Darawsheh l2_len + l3_len + l4_len); 274d862c45bSRaslan Darawsheh vx_vni = rte_be_to_cpu_32(vxlan_hdr->vx_vni); 2752ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2762ce96495SJiawei Wang " - VXLAN packet: packet type =%d, " 277dbd8e410SRongwei Liu "Destination UDP port =%d, VNI = %d, " 278dbd8e410SRongwei Liu "last_rsvd = %d", packet_type, 279*e2bce04bSAlex Chapman l4_port, vx_vni >> 8, vx_vni & 0xff); 280*e2bce04bSAlex Chapman } else { 281*e2bce04bSAlex Chapman MKDUMPSTR(print_buf, buf_size, cur_len, 282*e2bce04bSAlex Chapman " - Destination UDP port=%d", l4_port); 283d862c45bSRaslan Darawsheh } 284*e2bce04bSAlex Chapman } else if (l4_proto == IPPROTO_TCP) { 285*e2bce04bSAlex Chapman tcp_hdr = rte_pktmbuf_mtod_offset(mb, 286*e2bce04bSAlex Chapman struct rte_tcp_hdr *, 287*e2bce04bSAlex Chapman l2_len + l3_len); 288*e2bce04bSAlex Chapman l4_port = RTE_BE_TO_CPU_16(tcp_hdr->dst_port); 289*e2bce04bSAlex Chapman MKDUMPSTR(print_buf, buf_size, cur_len, 290*e2bce04bSAlex Chapman " - Destination TCP port=%d", l4_port); 291d862c45bSRaslan Darawsheh } 292*e2bce04bSAlex Chapman 2932ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2942ce96495SJiawei Wang " - %s queue=0x%x", is_rx ? "Receive" : "Send", 295d862c45bSRaslan Darawsheh (unsigned int) queue); 2962ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, "\n"); 297eeedef70SNithin Dabilpuram if (is_rx) 298d862c45bSRaslan Darawsheh rte_get_rx_ol_flag_list(mb->ol_flags, buf, sizeof(buf)); 299eeedef70SNithin Dabilpuram else 300eeedef70SNithin Dabilpuram rte_get_tx_ol_flag_list(mb->ol_flags, buf, sizeof(buf)); 301eeedef70SNithin Dabilpuram 3022ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 3032ce96495SJiawei Wang " ol_flags: %s\n", buf); 304b6ec9ce9SDavid Marchand if (rte_mbuf_check(mb, 1, &reason) < 0) 3052ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 3062ce96495SJiawei Wang "INVALID mbuf: %s\n", reason); 3072ce96495SJiawei Wang if (cur_len >= buf_size) 3082ce96495SJiawei Wang printf("%s ...\n", print_buf); 3092ce96495SJiawei Wang else 3102ce96495SJiawei Wang printf("%s", print_buf); 3112ce96495SJiawei Wang cur_len = 0; 312d862c45bSRaslan Darawsheh } 313d862c45bSRaslan Darawsheh } 314c77ad9deSRaslan Darawsheh 315c77ad9deSRaslan Darawsheh uint16_t 316c77ad9deSRaslan Darawsheh dump_rx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], 317c77ad9deSRaslan Darawsheh uint16_t nb_pkts, __rte_unused uint16_t max_pkts, 318c77ad9deSRaslan Darawsheh __rte_unused void *user_param) 319c77ad9deSRaslan Darawsheh { 320c77ad9deSRaslan Darawsheh dump_pkt_burst(port_id, queue, pkts, nb_pkts, 1); 321c77ad9deSRaslan Darawsheh return nb_pkts; 322c77ad9deSRaslan Darawsheh } 323c77ad9deSRaslan Darawsheh 324c77ad9deSRaslan Darawsheh uint16_t 325c77ad9deSRaslan Darawsheh dump_tx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], 326c77ad9deSRaslan Darawsheh uint16_t nb_pkts, __rte_unused void *user_param) 327c77ad9deSRaslan Darawsheh { 328c77ad9deSRaslan Darawsheh dump_pkt_burst(port_id, queue, pkts, nb_pkts, 0); 329c77ad9deSRaslan Darawsheh return nb_pkts; 330c77ad9deSRaslan Darawsheh } 3311e45c908SDekel Peled 3321e45c908SDekel Peled uint16_t 3331e45c908SDekel Peled tx_pkt_set_md(uint16_t port_id, __rte_unused uint16_t queue, 3341e45c908SDekel Peled struct rte_mbuf *pkts[], uint16_t nb_pkts, 3351e45c908SDekel Peled __rte_unused void *user_param) 3361e45c908SDekel Peled { 3371e45c908SDekel Peled uint16_t i = 0; 3381e45c908SDekel Peled 3391e45c908SDekel Peled /* 3401e45c908SDekel Peled * Add metadata value to every Tx packet, 3411e45c908SDekel Peled * and set ol_flags accordingly. 3421e45c908SDekel Peled */ 3439bf26e13SViacheslav Ovsiienko if (rte_flow_dynf_metadata_avail()) 3441e45c908SDekel Peled for (i = 0; i < nb_pkts; i++) { 3459bf26e13SViacheslav Ovsiienko *RTE_FLOW_DYNF_METADATA(pkts[i]) = 3469bf26e13SViacheslav Ovsiienko ports[port_id].tx_metadata; 347daa02b5cSOlivier Matz pkts[i]->ol_flags |= RTE_MBUF_DYNFLAG_TX_METADATA; 3481e45c908SDekel Peled } 3491e45c908SDekel Peled return nb_pkts; 3501e45c908SDekel Peled } 3511e45c908SDekel Peled 3521e45c908SDekel Peled void 3531e45c908SDekel Peled add_tx_md_callback(portid_t portid) 3541e45c908SDekel Peled { 3551e45c908SDekel Peled struct rte_eth_dev_info dev_info; 3561e45c908SDekel Peled uint16_t queue; 3576f51deb9SIvan Ilchenko int ret; 3581e45c908SDekel Peled 3591e45c908SDekel Peled if (port_id_is_invalid(portid, ENABLED_WARN)) 3601e45c908SDekel Peled return; 3616f51deb9SIvan Ilchenko 3626f51deb9SIvan Ilchenko ret = eth_dev_info_get_print_err(portid, &dev_info); 3636f51deb9SIvan Ilchenko if (ret != 0) 3646f51deb9SIvan Ilchenko return; 3656f51deb9SIvan Ilchenko 3661e45c908SDekel Peled for (queue = 0; queue < dev_info.nb_tx_queues; queue++) 3671e45c908SDekel Peled if (!ports[portid].tx_set_md_cb[queue]) 3681e45c908SDekel Peled ports[portid].tx_set_md_cb[queue] = 3691e45c908SDekel Peled rte_eth_add_tx_callback(portid, queue, 3701e45c908SDekel Peled tx_pkt_set_md, NULL); 3711e45c908SDekel Peled } 3721e45c908SDekel Peled 3731e45c908SDekel Peled void 3741e45c908SDekel Peled remove_tx_md_callback(portid_t portid) 3751e45c908SDekel Peled { 3761e45c908SDekel Peled struct rte_eth_dev_info dev_info; 3771e45c908SDekel Peled uint16_t queue; 3786f51deb9SIvan Ilchenko int ret; 3791e45c908SDekel Peled 3801e45c908SDekel Peled if (port_id_is_invalid(portid, ENABLED_WARN)) 3811e45c908SDekel Peled return; 3826f51deb9SIvan Ilchenko 3836f51deb9SIvan Ilchenko ret = eth_dev_info_get_print_err(portid, &dev_info); 3846f51deb9SIvan Ilchenko if (ret != 0) 3856f51deb9SIvan Ilchenko return; 3866f51deb9SIvan Ilchenko 3871e45c908SDekel Peled for (queue = 0; queue < dev_info.nb_tx_queues; queue++) 3881e45c908SDekel Peled if (ports[portid].tx_set_md_cb[queue]) { 3891e45c908SDekel Peled rte_eth_remove_tx_callback(portid, queue, 3901e45c908SDekel Peled ports[portid].tx_set_md_cb[queue]); 3911e45c908SDekel Peled ports[portid].tx_set_md_cb[queue] = NULL; 3921e45c908SDekel Peled } 3931e45c908SDekel Peled } 3946f51deb9SIvan Ilchenko 395b57b66a9SOri Kam uint16_t 396b57b66a9SOri Kam tx_pkt_set_dynf(uint16_t port_id, __rte_unused uint16_t queue, 397b57b66a9SOri Kam struct rte_mbuf *pkts[], uint16_t nb_pkts, 398b57b66a9SOri Kam __rte_unused void *user_param) 399b57b66a9SOri Kam { 400b57b66a9SOri Kam uint16_t i = 0; 401b57b66a9SOri Kam 402b57b66a9SOri Kam if (ports[port_id].mbuf_dynf) 403b57b66a9SOri Kam for (i = 0; i < nb_pkts; i++) 404b57b66a9SOri Kam pkts[i]->ol_flags |= ports[port_id].mbuf_dynf; 405b57b66a9SOri Kam return nb_pkts; 406b57b66a9SOri Kam } 407b57b66a9SOri Kam 408b57b66a9SOri Kam void 409b57b66a9SOri Kam add_tx_dynf_callback(portid_t portid) 410b57b66a9SOri Kam { 411b57b66a9SOri Kam struct rte_eth_dev_info dev_info; 412b57b66a9SOri Kam uint16_t queue; 413b57b66a9SOri Kam int ret; 414b57b66a9SOri Kam 415b57b66a9SOri Kam if (port_id_is_invalid(portid, ENABLED_WARN)) 416b57b66a9SOri Kam return; 417b57b66a9SOri Kam 418b57b66a9SOri Kam ret = eth_dev_info_get_print_err(portid, &dev_info); 419b57b66a9SOri Kam if (ret != 0) 420b57b66a9SOri Kam return; 421b57b66a9SOri Kam 422b57b66a9SOri Kam for (queue = 0; queue < dev_info.nb_tx_queues; queue++) 423b57b66a9SOri Kam if (!ports[portid].tx_set_dynf_cb[queue]) 424b57b66a9SOri Kam ports[portid].tx_set_dynf_cb[queue] = 425b57b66a9SOri Kam rte_eth_add_tx_callback(portid, queue, 426b57b66a9SOri Kam tx_pkt_set_dynf, NULL); 427b57b66a9SOri Kam } 428b57b66a9SOri Kam 429b57b66a9SOri Kam void 430b57b66a9SOri Kam remove_tx_dynf_callback(portid_t portid) 431b57b66a9SOri Kam { 432b57b66a9SOri Kam struct rte_eth_dev_info dev_info; 433b57b66a9SOri Kam uint16_t queue; 434b57b66a9SOri Kam int ret; 435b57b66a9SOri Kam 436b57b66a9SOri Kam if (port_id_is_invalid(portid, ENABLED_WARN)) 437b57b66a9SOri Kam return; 438b57b66a9SOri Kam 439b57b66a9SOri Kam ret = eth_dev_info_get_print_err(portid, &dev_info); 440b57b66a9SOri Kam if (ret != 0) 441b57b66a9SOri Kam return; 442b57b66a9SOri Kam 443b57b66a9SOri Kam for (queue = 0; queue < dev_info.nb_tx_queues; queue++) 444b57b66a9SOri Kam if (ports[portid].tx_set_dynf_cb[queue]) { 445b57b66a9SOri Kam rte_eth_remove_tx_callback(portid, queue, 446b57b66a9SOri Kam ports[portid].tx_set_dynf_cb[queue]); 447b57b66a9SOri Kam ports[portid].tx_set_dynf_cb[queue] = NULL; 448b57b66a9SOri Kam } 449b57b66a9SOri Kam } 450b57b66a9SOri Kam 4516f51deb9SIvan Ilchenko int 4526f51deb9SIvan Ilchenko eth_dev_info_get_print_err(uint16_t port_id, 4536f51deb9SIvan Ilchenko struct rte_eth_dev_info *dev_info) 4546f51deb9SIvan Ilchenko { 4556f51deb9SIvan Ilchenko int ret; 4566f51deb9SIvan Ilchenko 4576f51deb9SIvan Ilchenko ret = rte_eth_dev_info_get(port_id, dev_info); 4586f51deb9SIvan Ilchenko if (ret != 0) 45961a3b0e5SAndrew Rybchenko fprintf(stderr, 46061a3b0e5SAndrew Rybchenko "Error during getting device (port %u) info: %s\n", 4616f51deb9SIvan Ilchenko port_id, strerror(-ret)); 4626f51deb9SIvan Ilchenko 4636f51deb9SIvan Ilchenko return ret; 4646f51deb9SIvan Ilchenko } 46534fc1051SIvan Ilchenko 466655eae01SJie Wang int 467655eae01SJie Wang eth_dev_conf_get_print_err(uint16_t port_id, struct rte_eth_conf *dev_conf) 468655eae01SJie Wang { 469655eae01SJie Wang int ret; 470655eae01SJie Wang 471655eae01SJie Wang ret = rte_eth_dev_conf_get(port_id, dev_conf); 472655eae01SJie Wang if (ret != 0) 473655eae01SJie Wang fprintf(stderr, 474655eae01SJie Wang "Error during getting device configuration (port %u): %s\n", 475655eae01SJie Wang port_id, strerror(-ret)); 476655eae01SJie Wang 477655eae01SJie Wang return ret; 478655eae01SJie Wang } 479655eae01SJie Wang 48034fc1051SIvan Ilchenko void 48134fc1051SIvan Ilchenko eth_set_promisc_mode(uint16_t port, int enable) 48234fc1051SIvan Ilchenko { 48334fc1051SIvan Ilchenko int ret; 48434fc1051SIvan Ilchenko 48534fc1051SIvan Ilchenko if (enable) 48634fc1051SIvan Ilchenko ret = rte_eth_promiscuous_enable(port); 48734fc1051SIvan Ilchenko else 48834fc1051SIvan Ilchenko ret = rte_eth_promiscuous_disable(port); 48934fc1051SIvan Ilchenko 49034fc1051SIvan Ilchenko if (ret != 0) 49161a3b0e5SAndrew Rybchenko fprintf(stderr, 49261a3b0e5SAndrew Rybchenko "Error during %s promiscuous mode for port %u: %s\n", 49334fc1051SIvan Ilchenko enable ? "enabling" : "disabling", 49434fc1051SIvan Ilchenko port, rte_strerror(-ret)); 49534fc1051SIvan Ilchenko } 496e661a08bSIgor Romanov 4978835806dSIvan Ilchenko void 4988835806dSIvan Ilchenko eth_set_allmulticast_mode(uint16_t port, int enable) 4998835806dSIvan Ilchenko { 5008835806dSIvan Ilchenko int ret; 5018835806dSIvan Ilchenko 5028835806dSIvan Ilchenko if (enable) 5038835806dSIvan Ilchenko ret = rte_eth_allmulticast_enable(port); 5048835806dSIvan Ilchenko else 5058835806dSIvan Ilchenko ret = rte_eth_allmulticast_disable(port); 5068835806dSIvan Ilchenko 5078835806dSIvan Ilchenko if (ret != 0) 50861a3b0e5SAndrew Rybchenko fprintf(stderr, 50961a3b0e5SAndrew Rybchenko "Error during %s all-multicast mode for port %u: %s\n", 5108835806dSIvan Ilchenko enable ? "enabling" : "disabling", 5118835806dSIvan Ilchenko port, rte_strerror(-ret)); 5128835806dSIvan Ilchenko } 5138835806dSIvan Ilchenko 514e661a08bSIgor Romanov int 515e661a08bSIgor Romanov eth_link_get_nowait_print_err(uint16_t port_id, struct rte_eth_link *link) 516e661a08bSIgor Romanov { 517e661a08bSIgor Romanov int ret; 518e661a08bSIgor Romanov 519e661a08bSIgor Romanov ret = rte_eth_link_get_nowait(port_id, link); 520e661a08bSIgor Romanov if (ret < 0) 52161a3b0e5SAndrew Rybchenko fprintf(stderr, 52261a3b0e5SAndrew Rybchenko "Device (port %u) link get (without wait) failed: %s\n", 523e661a08bSIgor Romanov port_id, rte_strerror(-ret)); 524e661a08bSIgor Romanov 525e661a08bSIgor Romanov return ret; 526e661a08bSIgor Romanov } 527a5279d25SIgor Romanov 528a5279d25SIgor Romanov int 529a5279d25SIgor Romanov eth_macaddr_get_print_err(uint16_t port_id, struct rte_ether_addr *mac_addr) 530a5279d25SIgor Romanov { 531a5279d25SIgor Romanov int ret; 532a5279d25SIgor Romanov 533a5279d25SIgor Romanov ret = rte_eth_macaddr_get(port_id, mac_addr); 534a5279d25SIgor Romanov if (ret != 0) 53561a3b0e5SAndrew Rybchenko fprintf(stderr, 53661a3b0e5SAndrew Rybchenko "Error getting device (port %u) mac address: %s\n", 537a5279d25SIgor Romanov port_id, rte_strerror(-ret)); 538a5279d25SIgor Romanov 539a5279d25SIgor Romanov return ret; 540a5279d25SIgor Romanov } 541