xref: /dpdk/app/test-pmd/util.c (revision e2bce04b48ab7e9fb184322a4ffa5a58705cae45)
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=", &eth_hdr->src_addr,
1502ce96495SJiawei Wang 				 print_buf, buf_size, &cur_len);
15104d43857SDmitry Kozlyuk 		print_ether_addr(" - dst=", &eth_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