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