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 uint16_t udp_port; 85d862c45bSRaslan Darawsheh uint32_t vx_vni; 86b6ec9ce9SDavid Marchand const char *reason; 87b57b66a9SOri Kam int dynf_index; 882ce96495SJiawei Wang char print_buf[MAX_STRING_LEN]; 892ce96495SJiawei Wang size_t buf_size = MAX_STRING_LEN; 902ce96495SJiawei Wang size_t cur_len = 0; 91d862c45bSRaslan Darawsheh 92d862c45bSRaslan Darawsheh if (!nb_pkts) 93d862c45bSRaslan Darawsheh return; 942ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 952ce96495SJiawei Wang "port %u/queue %u: %s %u packets\n", port_id, queue, 962ce96495SJiawei Wang is_rx ? "received" : "sent", (unsigned int) nb_pkts); 97d862c45bSRaslan Darawsheh for (i = 0; i < nb_pkts; i++) { 981b9f2746SGregory Etelson int ret; 991b9f2746SGregory Etelson struct rte_flow_error error; 1001b9f2746SGregory Etelson struct rte_flow_restore_info info = { 0, }; 1011179f05cSIvan Malov struct rte_port *port = &ports[port_id]; 1021b9f2746SGregory Etelson 103d862c45bSRaslan Darawsheh mb = pkts[i]; 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); 1111179f05cSIvan Malov 1121179f05cSIvan Malov ret = rte_flow_get_restore_info(port->flow_transfer_proxy, 1131179f05cSIvan Malov mb, &info, &error); 1141b9f2746SGregory Etelson if (!ret) { 1152ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1162ce96495SJiawei Wang "restore info:"); 1171b9f2746SGregory Etelson if (info.flags & RTE_FLOW_RESTORE_INFO_TUNNEL) { 1181b9f2746SGregory Etelson struct port_flow_tunnel *port_tunnel; 119d862c45bSRaslan Darawsheh 1201b9f2746SGregory Etelson port_tunnel = port_flow_locate_tunnel 1211b9f2746SGregory Etelson (port_id, &info.tunnel); 1222ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1232ce96495SJiawei Wang " - tunnel"); 1241b9f2746SGregory Etelson if (port_tunnel) 1252ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1262ce96495SJiawei Wang " #%u", port_tunnel->id); 1271b9f2746SGregory Etelson else 1282ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1292ce96495SJiawei Wang " %s", "-none-"); 1302ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1312ce96495SJiawei Wang " type %s", port_flow_tunnel_type 1322ce96495SJiawei Wang (&info.tunnel)); 1331b9f2746SGregory Etelson } else { 1342ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1352ce96495SJiawei Wang " - no tunnel info"); 1361b9f2746SGregory Etelson } 1371b9f2746SGregory Etelson if (info.flags & RTE_FLOW_RESTORE_INFO_ENCAPSULATED) 1382ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1392ce96495SJiawei Wang " - outer header present"); 1401b9f2746SGregory Etelson else 1412ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1422ce96495SJiawei Wang " - no outer header"); 1431b9f2746SGregory Etelson if (info.flags & RTE_FLOW_RESTORE_INFO_GROUP_ID) 1442ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1452ce96495SJiawei Wang " - miss group %u", info.group_id); 1461b9f2746SGregory Etelson else 1472ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1482ce96495SJiawei Wang " - no miss group"); 1492ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, "\n"); 1501b9f2746SGregory Etelson } 15104d43857SDmitry Kozlyuk print_ether_addr(" src=", ð_hdr->src_addr, 1522ce96495SJiawei Wang print_buf, buf_size, &cur_len); 15304d43857SDmitry Kozlyuk print_ether_addr(" - dst=", ð_hdr->dst_addr, 1542ce96495SJiawei Wang print_buf, buf_size, &cur_len); 1552ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1562ce96495SJiawei Wang " - type=0x%04x - length=%u - nb_segs=%d", 157d862c45bSRaslan Darawsheh eth_type, (unsigned int) mb->pkt_len, 158d862c45bSRaslan Darawsheh (int)mb->nb_segs); 1591b9f2746SGregory Etelson ol_flags = mb->ol_flags; 160*daa02b5cSOlivier Matz if (ol_flags & RTE_MBUF_F_RX_RSS_HASH) { 1612ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1622ce96495SJiawei Wang " - RSS hash=0x%x", 1632ce96495SJiawei Wang (unsigned int) mb->hash.rss); 1642ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1652ce96495SJiawei Wang " - RSS queue=0x%x", (unsigned int) queue); 166d862c45bSRaslan Darawsheh } 167*daa02b5cSOlivier Matz if (ol_flags & RTE_MBUF_F_RX_FDIR) { 1682ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1692ce96495SJiawei Wang " - FDIR matched "); 170*daa02b5cSOlivier Matz if (ol_flags & RTE_MBUF_F_RX_FDIR_ID) 1712ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1722ce96495SJiawei Wang "ID=0x%x", mb->hash.fdir.hi); 173*daa02b5cSOlivier Matz else if (ol_flags & RTE_MBUF_F_RX_FDIR_FLX) 1742ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1752ce96495SJiawei Wang "flex bytes=0x%08x %08x", 176d862c45bSRaslan Darawsheh mb->hash.fdir.hi, mb->hash.fdir.lo); 177d862c45bSRaslan Darawsheh else 1782ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1792ce96495SJiawei Wang "hash=0x%x ID=0x%x ", 180d862c45bSRaslan Darawsheh mb->hash.fdir.hash, mb->hash.fdir.id); 181d862c45bSRaslan Darawsheh } 1827a0c6491SThomas Monjalon if (is_timestamp_enabled(mb)) 1832ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1842ce96495SJiawei Wang " - timestamp %"PRIu64" ", get_timestamp(mb)); 185*daa02b5cSOlivier Matz if (ol_flags & RTE_MBUF_F_RX_QINQ) 1862ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1872ce96495SJiawei Wang " - QinQ VLAN tci=0x%x, VLAN tci outer=0x%x", 188d862c45bSRaslan Darawsheh mb->vlan_tci, mb->vlan_tci_outer); 189*daa02b5cSOlivier Matz else if (ol_flags & RTE_MBUF_F_RX_VLAN) 1902ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1912ce96495SJiawei Wang " - VLAN tci=0x%x", mb->vlan_tci); 192*daa02b5cSOlivier Matz if (!is_rx && (ol_flags & RTE_MBUF_DYNFLAG_TX_METADATA)) 1932ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1942ce96495SJiawei Wang " - Tx metadata: 0x%x", 1959bf26e13SViacheslav Ovsiienko *RTE_FLOW_DYNF_METADATA(mb)); 196*daa02b5cSOlivier Matz if (is_rx && (ol_flags & RTE_MBUF_DYNFLAG_RX_METADATA)) 1972ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 1982ce96495SJiawei Wang " - Rx metadata: 0x%x", 199e02ecc13SViacheslav Ovsiienko *RTE_FLOW_DYNF_METADATA(mb)); 200b57b66a9SOri Kam for (dynf_index = 0; dynf_index < 64; dynf_index++) { 201b57b66a9SOri Kam if (dynf_names[dynf_index][0] != '\0') 2022ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2032ce96495SJiawei Wang " - dynf %s: %d", 204b57b66a9SOri Kam dynf_names[dynf_index], 205b57b66a9SOri Kam !!(ol_flags & (1UL << dynf_index))); 206b57b66a9SOri Kam } 207d862c45bSRaslan Darawsheh if (mb->packet_type) { 208d862c45bSRaslan Darawsheh rte_get_ptype_name(mb->packet_type, buf, sizeof(buf)); 2092ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2102ce96495SJiawei Wang " - hw ptype: %s", buf); 211d862c45bSRaslan Darawsheh } 212d862c45bSRaslan Darawsheh sw_packet_type = rte_net_get_ptype(mb, &hdr_lens, 213d862c45bSRaslan Darawsheh RTE_PTYPE_ALL_MASK); 214d862c45bSRaslan Darawsheh rte_get_ptype_name(sw_packet_type, buf, sizeof(buf)); 2152ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, " - sw ptype: %s", buf); 216d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_L2_MASK) 2172ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, " - l2_len=%d", 2182ce96495SJiawei Wang hdr_lens.l2_len); 219d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_L3_MASK) 2202ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, " - l3_len=%d", 2212ce96495SJiawei Wang hdr_lens.l3_len); 222d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_L4_MASK) 2232ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, " - l4_len=%d", 2242ce96495SJiawei Wang hdr_lens.l4_len); 225d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_TUNNEL_MASK) 2262ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2272ce96495SJiawei Wang " - tunnel_len=%d", hdr_lens.tunnel_len); 228d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_INNER_L2_MASK) 2292ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2302ce96495SJiawei Wang " - inner_l2_len=%d", hdr_lens.inner_l2_len); 231d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_INNER_L3_MASK) 2322ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2332ce96495SJiawei Wang " - inner_l3_len=%d", hdr_lens.inner_l3_len); 234d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_INNER_L4_MASK) 2352ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2362ce96495SJiawei Wang " - inner_l4_len=%d", hdr_lens.inner_l4_len); 237d862c45bSRaslan Darawsheh if (is_encapsulation) { 238a7c528e5SOlivier Matz struct rte_ipv4_hdr *ipv4_hdr; 239a7c528e5SOlivier Matz struct rte_ipv6_hdr *ipv6_hdr; 240e73e3547SOlivier Matz struct rte_udp_hdr *udp_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; 2456d13ea8eSOlivier Matz struct rte_vxlan_hdr *vxlan_hdr; 246d862c45bSRaslan Darawsheh 2476d13ea8eSOlivier Matz l2_len = sizeof(struct rte_ether_hdr); 248d862c45bSRaslan Darawsheh 249d862c45bSRaslan Darawsheh /* Do not support ipv4 option field */ 250d862c45bSRaslan Darawsheh if (RTE_ETH_IS_IPV4_HDR(packet_type)) { 251a7c528e5SOlivier Matz l3_len = sizeof(struct rte_ipv4_hdr); 252d862c45bSRaslan Darawsheh ipv4_hdr = rte_pktmbuf_mtod_offset(mb, 253a7c528e5SOlivier Matz struct rte_ipv4_hdr *, 254d862c45bSRaslan Darawsheh l2_len); 255d862c45bSRaslan Darawsheh l4_proto = ipv4_hdr->next_proto_id; 256d862c45bSRaslan Darawsheh } else { 257a7c528e5SOlivier Matz l3_len = sizeof(struct rte_ipv6_hdr); 258d862c45bSRaslan Darawsheh ipv6_hdr = rte_pktmbuf_mtod_offset(mb, 259a7c528e5SOlivier Matz struct rte_ipv6_hdr *, 260d862c45bSRaslan Darawsheh l2_len); 261d862c45bSRaslan Darawsheh l4_proto = ipv6_hdr->proto; 262d862c45bSRaslan Darawsheh } 263d862c45bSRaslan Darawsheh if (l4_proto == IPPROTO_UDP) { 264d862c45bSRaslan Darawsheh udp_hdr = rte_pktmbuf_mtod_offset(mb, 265e73e3547SOlivier Matz struct rte_udp_hdr *, 266d862c45bSRaslan Darawsheh l2_len + l3_len); 267e73e3547SOlivier Matz l4_len = sizeof(struct rte_udp_hdr); 268d862c45bSRaslan Darawsheh vxlan_hdr = rte_pktmbuf_mtod_offset(mb, 2696d13ea8eSOlivier Matz struct rte_vxlan_hdr *, 270d862c45bSRaslan Darawsheh l2_len + l3_len + l4_len); 271d862c45bSRaslan Darawsheh udp_port = RTE_BE_TO_CPU_16(udp_hdr->dst_port); 272d862c45bSRaslan Darawsheh vx_vni = rte_be_to_cpu_32(vxlan_hdr->vx_vni); 2732ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2742ce96495SJiawei Wang " - VXLAN packet: packet type =%d, " 275dbd8e410SRongwei Liu "Destination UDP port =%d, VNI = %d, " 276dbd8e410SRongwei Liu "last_rsvd = %d", packet_type, 277dbd8e410SRongwei Liu udp_port, vx_vni >> 8, vx_vni & 0xff); 278d862c45bSRaslan Darawsheh } 279d862c45bSRaslan Darawsheh } 2802ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2812ce96495SJiawei Wang " - %s queue=0x%x", is_rx ? "Receive" : "Send", 282d862c45bSRaslan Darawsheh (unsigned int) queue); 2832ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, "\n"); 284eeedef70SNithin Dabilpuram if (is_rx) 285d862c45bSRaslan Darawsheh rte_get_rx_ol_flag_list(mb->ol_flags, buf, sizeof(buf)); 286eeedef70SNithin Dabilpuram else 287eeedef70SNithin Dabilpuram rte_get_tx_ol_flag_list(mb->ol_flags, buf, sizeof(buf)); 288eeedef70SNithin Dabilpuram 2892ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2902ce96495SJiawei Wang " ol_flags: %s\n", buf); 291b6ec9ce9SDavid Marchand if (rte_mbuf_check(mb, 1, &reason) < 0) 2922ce96495SJiawei Wang MKDUMPSTR(print_buf, buf_size, cur_len, 2932ce96495SJiawei Wang "INVALID mbuf: %s\n", reason); 2942ce96495SJiawei Wang if (cur_len >= buf_size) 2952ce96495SJiawei Wang printf("%s ...\n", print_buf); 2962ce96495SJiawei Wang else 2972ce96495SJiawei Wang printf("%s", print_buf); 2982ce96495SJiawei Wang cur_len = 0; 299d862c45bSRaslan Darawsheh } 300d862c45bSRaslan Darawsheh } 301c77ad9deSRaslan Darawsheh 302c77ad9deSRaslan Darawsheh uint16_t 303c77ad9deSRaslan Darawsheh dump_rx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], 304c77ad9deSRaslan Darawsheh uint16_t nb_pkts, __rte_unused uint16_t max_pkts, 305c77ad9deSRaslan Darawsheh __rte_unused void *user_param) 306c77ad9deSRaslan Darawsheh { 307c77ad9deSRaslan Darawsheh dump_pkt_burst(port_id, queue, pkts, nb_pkts, 1); 308c77ad9deSRaslan Darawsheh return nb_pkts; 309c77ad9deSRaslan Darawsheh } 310c77ad9deSRaslan Darawsheh 311c77ad9deSRaslan Darawsheh uint16_t 312c77ad9deSRaslan Darawsheh dump_tx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], 313c77ad9deSRaslan Darawsheh uint16_t nb_pkts, __rte_unused void *user_param) 314c77ad9deSRaslan Darawsheh { 315c77ad9deSRaslan Darawsheh dump_pkt_burst(port_id, queue, pkts, nb_pkts, 0); 316c77ad9deSRaslan Darawsheh return nb_pkts; 317c77ad9deSRaslan Darawsheh } 3181e45c908SDekel Peled 3191e45c908SDekel Peled uint16_t 3201e45c908SDekel Peled tx_pkt_set_md(uint16_t port_id, __rte_unused uint16_t queue, 3211e45c908SDekel Peled struct rte_mbuf *pkts[], uint16_t nb_pkts, 3221e45c908SDekel Peled __rte_unused void *user_param) 3231e45c908SDekel Peled { 3241e45c908SDekel Peled uint16_t i = 0; 3251e45c908SDekel Peled 3261e45c908SDekel Peled /* 3271e45c908SDekel Peled * Add metadata value to every Tx packet, 3281e45c908SDekel Peled * and set ol_flags accordingly. 3291e45c908SDekel Peled */ 3309bf26e13SViacheslav Ovsiienko if (rte_flow_dynf_metadata_avail()) 3311e45c908SDekel Peled for (i = 0; i < nb_pkts; i++) { 3329bf26e13SViacheslav Ovsiienko *RTE_FLOW_DYNF_METADATA(pkts[i]) = 3339bf26e13SViacheslav Ovsiienko ports[port_id].tx_metadata; 334*daa02b5cSOlivier Matz pkts[i]->ol_flags |= RTE_MBUF_DYNFLAG_TX_METADATA; 3351e45c908SDekel Peled } 3361e45c908SDekel Peled return nb_pkts; 3371e45c908SDekel Peled } 3381e45c908SDekel Peled 3391e45c908SDekel Peled void 3401e45c908SDekel Peled add_tx_md_callback(portid_t portid) 3411e45c908SDekel Peled { 3421e45c908SDekel Peled struct rte_eth_dev_info dev_info; 3431e45c908SDekel Peled uint16_t queue; 3446f51deb9SIvan Ilchenko int ret; 3451e45c908SDekel Peled 3461e45c908SDekel Peled if (port_id_is_invalid(portid, ENABLED_WARN)) 3471e45c908SDekel Peled return; 3486f51deb9SIvan Ilchenko 3496f51deb9SIvan Ilchenko ret = eth_dev_info_get_print_err(portid, &dev_info); 3506f51deb9SIvan Ilchenko if (ret != 0) 3516f51deb9SIvan Ilchenko return; 3526f51deb9SIvan Ilchenko 3531e45c908SDekel Peled for (queue = 0; queue < dev_info.nb_tx_queues; queue++) 3541e45c908SDekel Peled if (!ports[portid].tx_set_md_cb[queue]) 3551e45c908SDekel Peled ports[portid].tx_set_md_cb[queue] = 3561e45c908SDekel Peled rte_eth_add_tx_callback(portid, queue, 3571e45c908SDekel Peled tx_pkt_set_md, NULL); 3581e45c908SDekel Peled } 3591e45c908SDekel Peled 3601e45c908SDekel Peled void 3611e45c908SDekel Peled remove_tx_md_callback(portid_t portid) 3621e45c908SDekel Peled { 3631e45c908SDekel Peled struct rte_eth_dev_info dev_info; 3641e45c908SDekel Peled uint16_t queue; 3656f51deb9SIvan Ilchenko int ret; 3661e45c908SDekel Peled 3671e45c908SDekel Peled if (port_id_is_invalid(portid, ENABLED_WARN)) 3681e45c908SDekel Peled return; 3696f51deb9SIvan Ilchenko 3706f51deb9SIvan Ilchenko ret = eth_dev_info_get_print_err(portid, &dev_info); 3716f51deb9SIvan Ilchenko if (ret != 0) 3726f51deb9SIvan Ilchenko return; 3736f51deb9SIvan Ilchenko 3741e45c908SDekel Peled for (queue = 0; queue < dev_info.nb_tx_queues; queue++) 3751e45c908SDekel Peled if (ports[portid].tx_set_md_cb[queue]) { 3761e45c908SDekel Peled rte_eth_remove_tx_callback(portid, queue, 3771e45c908SDekel Peled ports[portid].tx_set_md_cb[queue]); 3781e45c908SDekel Peled ports[portid].tx_set_md_cb[queue] = NULL; 3791e45c908SDekel Peled } 3801e45c908SDekel Peled } 3816f51deb9SIvan Ilchenko 382b57b66a9SOri Kam uint16_t 383b57b66a9SOri Kam tx_pkt_set_dynf(uint16_t port_id, __rte_unused uint16_t queue, 384b57b66a9SOri Kam struct rte_mbuf *pkts[], uint16_t nb_pkts, 385b57b66a9SOri Kam __rte_unused void *user_param) 386b57b66a9SOri Kam { 387b57b66a9SOri Kam uint16_t i = 0; 388b57b66a9SOri Kam 389b57b66a9SOri Kam if (ports[port_id].mbuf_dynf) 390b57b66a9SOri Kam for (i = 0; i < nb_pkts; i++) 391b57b66a9SOri Kam pkts[i]->ol_flags |= ports[port_id].mbuf_dynf; 392b57b66a9SOri Kam return nb_pkts; 393b57b66a9SOri Kam } 394b57b66a9SOri Kam 395b57b66a9SOri Kam void 396b57b66a9SOri Kam add_tx_dynf_callback(portid_t portid) 397b57b66a9SOri Kam { 398b57b66a9SOri Kam struct rte_eth_dev_info dev_info; 399b57b66a9SOri Kam uint16_t queue; 400b57b66a9SOri Kam int ret; 401b57b66a9SOri Kam 402b57b66a9SOri Kam if (port_id_is_invalid(portid, ENABLED_WARN)) 403b57b66a9SOri Kam return; 404b57b66a9SOri Kam 405b57b66a9SOri Kam ret = eth_dev_info_get_print_err(portid, &dev_info); 406b57b66a9SOri Kam if (ret != 0) 407b57b66a9SOri Kam return; 408b57b66a9SOri Kam 409b57b66a9SOri Kam for (queue = 0; queue < dev_info.nb_tx_queues; queue++) 410b57b66a9SOri Kam if (!ports[portid].tx_set_dynf_cb[queue]) 411b57b66a9SOri Kam ports[portid].tx_set_dynf_cb[queue] = 412b57b66a9SOri Kam rte_eth_add_tx_callback(portid, queue, 413b57b66a9SOri Kam tx_pkt_set_dynf, NULL); 414b57b66a9SOri Kam } 415b57b66a9SOri Kam 416b57b66a9SOri Kam void 417b57b66a9SOri Kam remove_tx_dynf_callback(portid_t portid) 418b57b66a9SOri Kam { 419b57b66a9SOri Kam struct rte_eth_dev_info dev_info; 420b57b66a9SOri Kam uint16_t queue; 421b57b66a9SOri Kam int ret; 422b57b66a9SOri Kam 423b57b66a9SOri Kam if (port_id_is_invalid(portid, ENABLED_WARN)) 424b57b66a9SOri Kam return; 425b57b66a9SOri Kam 426b57b66a9SOri Kam ret = eth_dev_info_get_print_err(portid, &dev_info); 427b57b66a9SOri Kam if (ret != 0) 428b57b66a9SOri Kam return; 429b57b66a9SOri Kam 430b57b66a9SOri Kam for (queue = 0; queue < dev_info.nb_tx_queues; queue++) 431b57b66a9SOri Kam if (ports[portid].tx_set_dynf_cb[queue]) { 432b57b66a9SOri Kam rte_eth_remove_tx_callback(portid, queue, 433b57b66a9SOri Kam ports[portid].tx_set_dynf_cb[queue]); 434b57b66a9SOri Kam ports[portid].tx_set_dynf_cb[queue] = NULL; 435b57b66a9SOri Kam } 436b57b66a9SOri Kam } 437b57b66a9SOri Kam 4386f51deb9SIvan Ilchenko int 4396f51deb9SIvan Ilchenko eth_dev_info_get_print_err(uint16_t port_id, 4406f51deb9SIvan Ilchenko struct rte_eth_dev_info *dev_info) 4416f51deb9SIvan Ilchenko { 4426f51deb9SIvan Ilchenko int ret; 4436f51deb9SIvan Ilchenko 4446f51deb9SIvan Ilchenko ret = rte_eth_dev_info_get(port_id, dev_info); 4456f51deb9SIvan Ilchenko if (ret != 0) 44661a3b0e5SAndrew Rybchenko fprintf(stderr, 44761a3b0e5SAndrew Rybchenko "Error during getting device (port %u) info: %s\n", 4486f51deb9SIvan Ilchenko port_id, strerror(-ret)); 4496f51deb9SIvan Ilchenko 4506f51deb9SIvan Ilchenko return ret; 4516f51deb9SIvan Ilchenko } 45234fc1051SIvan Ilchenko 453655eae01SJie Wang int 454655eae01SJie Wang eth_dev_conf_get_print_err(uint16_t port_id, struct rte_eth_conf *dev_conf) 455655eae01SJie Wang { 456655eae01SJie Wang int ret; 457655eae01SJie Wang 458655eae01SJie Wang ret = rte_eth_dev_conf_get(port_id, dev_conf); 459655eae01SJie Wang if (ret != 0) 460655eae01SJie Wang fprintf(stderr, 461655eae01SJie Wang "Error during getting device configuration (port %u): %s\n", 462655eae01SJie Wang port_id, strerror(-ret)); 463655eae01SJie Wang 464655eae01SJie Wang return ret; 465655eae01SJie Wang } 466655eae01SJie Wang 46734fc1051SIvan Ilchenko void 46834fc1051SIvan Ilchenko eth_set_promisc_mode(uint16_t port, int enable) 46934fc1051SIvan Ilchenko { 47034fc1051SIvan Ilchenko int ret; 47134fc1051SIvan Ilchenko 47234fc1051SIvan Ilchenko if (enable) 47334fc1051SIvan Ilchenko ret = rte_eth_promiscuous_enable(port); 47434fc1051SIvan Ilchenko else 47534fc1051SIvan Ilchenko ret = rte_eth_promiscuous_disable(port); 47634fc1051SIvan Ilchenko 47734fc1051SIvan Ilchenko if (ret != 0) 47861a3b0e5SAndrew Rybchenko fprintf(stderr, 47961a3b0e5SAndrew Rybchenko "Error during %s promiscuous mode for port %u: %s\n", 48034fc1051SIvan Ilchenko enable ? "enabling" : "disabling", 48134fc1051SIvan Ilchenko port, rte_strerror(-ret)); 48234fc1051SIvan Ilchenko } 483e661a08bSIgor Romanov 4848835806dSIvan Ilchenko void 4858835806dSIvan Ilchenko eth_set_allmulticast_mode(uint16_t port, int enable) 4868835806dSIvan Ilchenko { 4878835806dSIvan Ilchenko int ret; 4888835806dSIvan Ilchenko 4898835806dSIvan Ilchenko if (enable) 4908835806dSIvan Ilchenko ret = rte_eth_allmulticast_enable(port); 4918835806dSIvan Ilchenko else 4928835806dSIvan Ilchenko ret = rte_eth_allmulticast_disable(port); 4938835806dSIvan Ilchenko 4948835806dSIvan Ilchenko if (ret != 0) 49561a3b0e5SAndrew Rybchenko fprintf(stderr, 49661a3b0e5SAndrew Rybchenko "Error during %s all-multicast mode for port %u: %s\n", 4978835806dSIvan Ilchenko enable ? "enabling" : "disabling", 4988835806dSIvan Ilchenko port, rte_strerror(-ret)); 4998835806dSIvan Ilchenko } 5008835806dSIvan Ilchenko 501e661a08bSIgor Romanov int 502e661a08bSIgor Romanov eth_link_get_nowait_print_err(uint16_t port_id, struct rte_eth_link *link) 503e661a08bSIgor Romanov { 504e661a08bSIgor Romanov int ret; 505e661a08bSIgor Romanov 506e661a08bSIgor Romanov ret = rte_eth_link_get_nowait(port_id, link); 507e661a08bSIgor Romanov if (ret < 0) 50861a3b0e5SAndrew Rybchenko fprintf(stderr, 50961a3b0e5SAndrew Rybchenko "Device (port %u) link get (without wait) failed: %s\n", 510e661a08bSIgor Romanov port_id, rte_strerror(-ret)); 511e661a08bSIgor Romanov 512e661a08bSIgor Romanov return ret; 513e661a08bSIgor Romanov } 514a5279d25SIgor Romanov 515a5279d25SIgor Romanov int 516a5279d25SIgor Romanov eth_macaddr_get_print_err(uint16_t port_id, struct rte_ether_addr *mac_addr) 517a5279d25SIgor Romanov { 518a5279d25SIgor Romanov int ret; 519a5279d25SIgor Romanov 520a5279d25SIgor Romanov ret = rte_eth_macaddr_get(port_id, mac_addr); 521a5279d25SIgor Romanov if (ret != 0) 52261a3b0e5SAndrew Rybchenko fprintf(stderr, 52361a3b0e5SAndrew Rybchenko "Error getting device (port %u) mac address: %s\n", 524a5279d25SIgor Romanov port_id, rte_strerror(-ret)); 525a5279d25SIgor Romanov 526a5279d25SIgor Romanov return ret; 527a5279d25SIgor Romanov } 528