xref: /dpdk/app/test-pmd/util.c (revision dbd8e4102d49ba89f5b4ae7a9557e48693da4609)
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, };
1011b9f2746SGregory Etelson 
102d862c45bSRaslan Darawsheh 		mb = pkts[i];
1033e6b0d5fSDavid Marchand 		eth_hdr = rte_pktmbuf_read(mb, 0, sizeof(_eth_hdr), &_eth_hdr);
104d862c45bSRaslan Darawsheh 		eth_type = RTE_BE_TO_CPU_16(eth_hdr->ether_type);
105d862c45bSRaslan Darawsheh 		packet_type = mb->packet_type;
106d862c45bSRaslan Darawsheh 		is_encapsulation = RTE_ETH_IS_TUNNEL_PKT(packet_type);
1071b9f2746SGregory Etelson 		ret = rte_flow_get_restore_info(port_id, mb, &info, &error);
1081b9f2746SGregory Etelson 		if (!ret) {
1092ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
1102ce96495SJiawei Wang 				  "restore info:");
1111b9f2746SGregory Etelson 			if (info.flags & RTE_FLOW_RESTORE_INFO_TUNNEL) {
1121b9f2746SGregory Etelson 				struct port_flow_tunnel *port_tunnel;
113d862c45bSRaslan Darawsheh 
1141b9f2746SGregory Etelson 				port_tunnel = port_flow_locate_tunnel
1151b9f2746SGregory Etelson 					      (port_id, &info.tunnel);
1162ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
1172ce96495SJiawei Wang 					  " - tunnel");
1181b9f2746SGregory Etelson 				if (port_tunnel)
1192ce96495SJiawei Wang 					MKDUMPSTR(print_buf, buf_size, cur_len,
1202ce96495SJiawei Wang 						  " #%u", port_tunnel->id);
1211b9f2746SGregory Etelson 				else
1222ce96495SJiawei Wang 					MKDUMPSTR(print_buf, buf_size, cur_len,
1232ce96495SJiawei Wang 						  " %s", "-none-");
1242ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
1252ce96495SJiawei Wang 					  " type %s", port_flow_tunnel_type
1262ce96495SJiawei Wang 					  (&info.tunnel));
1271b9f2746SGregory Etelson 			} else {
1282ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
1292ce96495SJiawei Wang 					  " - no tunnel info");
1301b9f2746SGregory Etelson 			}
1311b9f2746SGregory Etelson 			if (info.flags & RTE_FLOW_RESTORE_INFO_ENCAPSULATED)
1322ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
1332ce96495SJiawei Wang 					  " - outer header present");
1341b9f2746SGregory Etelson 			else
1352ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
1362ce96495SJiawei Wang 					  " - no outer header");
1371b9f2746SGregory Etelson 			if (info.flags & RTE_FLOW_RESTORE_INFO_GROUP_ID)
1382ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
1392ce96495SJiawei Wang 					  " - miss group %u", info.group_id);
1401b9f2746SGregory Etelson 			else
1412ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
1422ce96495SJiawei Wang 					  " - no miss group");
1432ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len, "\n");
1441b9f2746SGregory Etelson 		}
1452ce96495SJiawei Wang 		print_ether_addr("  src=", &eth_hdr->s_addr,
1462ce96495SJiawei Wang 				 print_buf, buf_size, &cur_len);
1472ce96495SJiawei Wang 		print_ether_addr(" - dst=", &eth_hdr->d_addr,
1482ce96495SJiawei Wang 				 print_buf, buf_size, &cur_len);
1492ce96495SJiawei Wang 		MKDUMPSTR(print_buf, buf_size, cur_len,
1502ce96495SJiawei Wang 			  " - type=0x%04x - length=%u - nb_segs=%d",
151d862c45bSRaslan Darawsheh 			  eth_type, (unsigned int) mb->pkt_len,
152d862c45bSRaslan Darawsheh 			  (int)mb->nb_segs);
1531b9f2746SGregory Etelson 		ol_flags = mb->ol_flags;
154d862c45bSRaslan Darawsheh 		if (ol_flags & PKT_RX_RSS_HASH) {
1552ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
1562ce96495SJiawei Wang 				  " - RSS hash=0x%x",
1572ce96495SJiawei Wang 				  (unsigned int) mb->hash.rss);
1582ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
1592ce96495SJiawei Wang 				  " - RSS queue=0x%x", (unsigned int) queue);
160d862c45bSRaslan Darawsheh 		}
161d862c45bSRaslan Darawsheh 		if (ol_flags & PKT_RX_FDIR) {
1622ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
1632ce96495SJiawei Wang 				  " - FDIR matched ");
164d862c45bSRaslan Darawsheh 			if (ol_flags & PKT_RX_FDIR_ID)
1652ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
1662ce96495SJiawei Wang 					  "ID=0x%x", mb->hash.fdir.hi);
167d862c45bSRaslan Darawsheh 			else if (ol_flags & PKT_RX_FDIR_FLX)
1682ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
1692ce96495SJiawei Wang 					  "flex bytes=0x%08x %08x",
170d862c45bSRaslan Darawsheh 					  mb->hash.fdir.hi, mb->hash.fdir.lo);
171d862c45bSRaslan Darawsheh 			else
1722ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
1732ce96495SJiawei Wang 					  "hash=0x%x ID=0x%x ",
174d862c45bSRaslan Darawsheh 					  mb->hash.fdir.hash, mb->hash.fdir.id);
175d862c45bSRaslan Darawsheh 		}
1767a0c6491SThomas Monjalon 		if (is_timestamp_enabled(mb))
1772ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
1782ce96495SJiawei Wang 				  " - timestamp %"PRIu64" ", get_timestamp(mb));
179d862c45bSRaslan Darawsheh 		if (ol_flags & PKT_RX_QINQ)
1802ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
1812ce96495SJiawei Wang 				  " - QinQ VLAN tci=0x%x, VLAN tci outer=0x%x",
182d862c45bSRaslan Darawsheh 				  mb->vlan_tci, mb->vlan_tci_outer);
183d862c45bSRaslan Darawsheh 		else if (ol_flags & PKT_RX_VLAN)
1842ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
1852ce96495SJiawei Wang 				  " - VLAN tci=0x%x", mb->vlan_tci);
186d56ec3dcSDekel Peled 		if (!is_rx && (ol_flags & PKT_TX_DYNF_METADATA))
1872ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
1882ce96495SJiawei Wang 				  " - Tx metadata: 0x%x",
1899bf26e13SViacheslav Ovsiienko 				  *RTE_FLOW_DYNF_METADATA(mb));
190d56ec3dcSDekel Peled 		if (is_rx && (ol_flags & PKT_RX_DYNF_METADATA))
1912ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
1922ce96495SJiawei Wang 				  " - Rx metadata: 0x%x",
193e02ecc13SViacheslav Ovsiienko 				  *RTE_FLOW_DYNF_METADATA(mb));
194b57b66a9SOri Kam 		for (dynf_index = 0; dynf_index < 64; dynf_index++) {
195b57b66a9SOri Kam 			if (dynf_names[dynf_index][0] != '\0')
1962ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
1972ce96495SJiawei Wang 					  " - dynf %s: %d",
198b57b66a9SOri Kam 					  dynf_names[dynf_index],
199b57b66a9SOri Kam 					  !!(ol_flags & (1UL << dynf_index)));
200b57b66a9SOri Kam 		}
201d862c45bSRaslan Darawsheh 		if (mb->packet_type) {
202d862c45bSRaslan Darawsheh 			rte_get_ptype_name(mb->packet_type, buf, sizeof(buf));
2032ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
2042ce96495SJiawei Wang 				  " - hw ptype: %s", buf);
205d862c45bSRaslan Darawsheh 		}
206d862c45bSRaslan Darawsheh 		sw_packet_type = rte_net_get_ptype(mb, &hdr_lens,
207d862c45bSRaslan Darawsheh 					RTE_PTYPE_ALL_MASK);
208d862c45bSRaslan Darawsheh 		rte_get_ptype_name(sw_packet_type, buf, sizeof(buf));
2092ce96495SJiawei Wang 		MKDUMPSTR(print_buf, buf_size, cur_len, " - sw ptype: %s", buf);
210d862c45bSRaslan Darawsheh 		if (sw_packet_type & RTE_PTYPE_L2_MASK)
2112ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len, " - l2_len=%d",
2122ce96495SJiawei Wang 				  hdr_lens.l2_len);
213d862c45bSRaslan Darawsheh 		if (sw_packet_type & RTE_PTYPE_L3_MASK)
2142ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len, " - l3_len=%d",
2152ce96495SJiawei Wang 				  hdr_lens.l3_len);
216d862c45bSRaslan Darawsheh 		if (sw_packet_type & RTE_PTYPE_L4_MASK)
2172ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len, " - l4_len=%d",
2182ce96495SJiawei Wang 				  hdr_lens.l4_len);
219d862c45bSRaslan Darawsheh 		if (sw_packet_type & RTE_PTYPE_TUNNEL_MASK)
2202ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
2212ce96495SJiawei Wang 				  " - tunnel_len=%d", hdr_lens.tunnel_len);
222d862c45bSRaslan Darawsheh 		if (sw_packet_type & RTE_PTYPE_INNER_L2_MASK)
2232ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
2242ce96495SJiawei Wang 				  " - inner_l2_len=%d", hdr_lens.inner_l2_len);
225d862c45bSRaslan Darawsheh 		if (sw_packet_type & RTE_PTYPE_INNER_L3_MASK)
2262ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
2272ce96495SJiawei Wang 				  " - inner_l3_len=%d", hdr_lens.inner_l3_len);
228d862c45bSRaslan Darawsheh 		if (sw_packet_type & RTE_PTYPE_INNER_L4_MASK)
2292ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
2302ce96495SJiawei Wang 				  " - inner_l4_len=%d", hdr_lens.inner_l4_len);
231d862c45bSRaslan Darawsheh 		if (is_encapsulation) {
232a7c528e5SOlivier Matz 			struct rte_ipv4_hdr *ipv4_hdr;
233a7c528e5SOlivier Matz 			struct rte_ipv6_hdr *ipv6_hdr;
234e73e3547SOlivier Matz 			struct rte_udp_hdr *udp_hdr;
235d862c45bSRaslan Darawsheh 			uint8_t l2_len;
236d862c45bSRaslan Darawsheh 			uint8_t l3_len;
237d862c45bSRaslan Darawsheh 			uint8_t l4_len;
238d862c45bSRaslan Darawsheh 			uint8_t l4_proto;
2396d13ea8eSOlivier Matz 			struct  rte_vxlan_hdr *vxlan_hdr;
240d862c45bSRaslan Darawsheh 
2416d13ea8eSOlivier Matz 			l2_len  = sizeof(struct rte_ether_hdr);
242d862c45bSRaslan Darawsheh 
243d862c45bSRaslan Darawsheh 			/* Do not support ipv4 option field */
244d862c45bSRaslan Darawsheh 			if (RTE_ETH_IS_IPV4_HDR(packet_type)) {
245a7c528e5SOlivier Matz 				l3_len = sizeof(struct rte_ipv4_hdr);
246d862c45bSRaslan Darawsheh 				ipv4_hdr = rte_pktmbuf_mtod_offset(mb,
247a7c528e5SOlivier Matz 				struct rte_ipv4_hdr *,
248d862c45bSRaslan Darawsheh 				l2_len);
249d862c45bSRaslan Darawsheh 				l4_proto = ipv4_hdr->next_proto_id;
250d862c45bSRaslan Darawsheh 			} else {
251a7c528e5SOlivier Matz 				l3_len = sizeof(struct rte_ipv6_hdr);
252d862c45bSRaslan Darawsheh 				ipv6_hdr = rte_pktmbuf_mtod_offset(mb,
253a7c528e5SOlivier Matz 				struct rte_ipv6_hdr *,
254d862c45bSRaslan Darawsheh 				l2_len);
255d862c45bSRaslan Darawsheh 				l4_proto = ipv6_hdr->proto;
256d862c45bSRaslan Darawsheh 			}
257d862c45bSRaslan Darawsheh 			if (l4_proto == IPPROTO_UDP) {
258d862c45bSRaslan Darawsheh 				udp_hdr = rte_pktmbuf_mtod_offset(mb,
259e73e3547SOlivier Matz 				struct rte_udp_hdr *,
260d862c45bSRaslan Darawsheh 				l2_len + l3_len);
261e73e3547SOlivier Matz 				l4_len = sizeof(struct rte_udp_hdr);
262d862c45bSRaslan Darawsheh 				vxlan_hdr = rte_pktmbuf_mtod_offset(mb,
2636d13ea8eSOlivier Matz 				struct rte_vxlan_hdr *,
264d862c45bSRaslan Darawsheh 				l2_len + l3_len + l4_len);
265d862c45bSRaslan Darawsheh 				udp_port = RTE_BE_TO_CPU_16(udp_hdr->dst_port);
266d862c45bSRaslan Darawsheh 				vx_vni = rte_be_to_cpu_32(vxlan_hdr->vx_vni);
2672ce96495SJiawei Wang 				MKDUMPSTR(print_buf, buf_size, cur_len,
2682ce96495SJiawei Wang 					  " - VXLAN packet: packet type =%d, "
269*dbd8e410SRongwei Liu 					  "Destination UDP port =%d, VNI = %d, "
270*dbd8e410SRongwei Liu 					  "last_rsvd = %d", packet_type,
271*dbd8e410SRongwei Liu 					  udp_port, vx_vni >> 8, vx_vni & 0xff);
272d862c45bSRaslan Darawsheh 			}
273d862c45bSRaslan Darawsheh 		}
2742ce96495SJiawei Wang 		MKDUMPSTR(print_buf, buf_size, cur_len,
2752ce96495SJiawei Wang 			  " - %s queue=0x%x", is_rx ? "Receive" : "Send",
276d862c45bSRaslan Darawsheh 			  (unsigned int) queue);
2772ce96495SJiawei Wang 		MKDUMPSTR(print_buf, buf_size, cur_len, "\n");
278d862c45bSRaslan Darawsheh 		rte_get_rx_ol_flag_list(mb->ol_flags, buf, sizeof(buf));
2792ce96495SJiawei Wang 		MKDUMPSTR(print_buf, buf_size, cur_len,
2802ce96495SJiawei Wang 			  "  ol_flags: %s\n", buf);
281b6ec9ce9SDavid Marchand 		if (rte_mbuf_check(mb, 1, &reason) < 0)
2822ce96495SJiawei Wang 			MKDUMPSTR(print_buf, buf_size, cur_len,
2832ce96495SJiawei Wang 				  "INVALID mbuf: %s\n", reason);
2842ce96495SJiawei Wang 		if (cur_len >= buf_size)
2852ce96495SJiawei Wang 			printf("%s ...\n", print_buf);
2862ce96495SJiawei Wang 		else
2872ce96495SJiawei Wang 			printf("%s", print_buf);
2882ce96495SJiawei Wang 		cur_len = 0;
289d862c45bSRaslan Darawsheh 	}
290d862c45bSRaslan Darawsheh }
291c77ad9deSRaslan Darawsheh 
292c77ad9deSRaslan Darawsheh uint16_t
293c77ad9deSRaslan Darawsheh dump_rx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
294c77ad9deSRaslan Darawsheh 	     uint16_t nb_pkts, __rte_unused uint16_t max_pkts,
295c77ad9deSRaslan Darawsheh 	     __rte_unused void *user_param)
296c77ad9deSRaslan Darawsheh {
297c77ad9deSRaslan Darawsheh 	dump_pkt_burst(port_id, queue, pkts, nb_pkts, 1);
298c77ad9deSRaslan Darawsheh 	return nb_pkts;
299c77ad9deSRaslan Darawsheh }
300c77ad9deSRaslan Darawsheh 
301c77ad9deSRaslan Darawsheh uint16_t
302c77ad9deSRaslan Darawsheh dump_tx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
303c77ad9deSRaslan Darawsheh 	     uint16_t nb_pkts, __rte_unused void *user_param)
304c77ad9deSRaslan Darawsheh {
305c77ad9deSRaslan Darawsheh 	dump_pkt_burst(port_id, queue, pkts, nb_pkts, 0);
306c77ad9deSRaslan Darawsheh 	return nb_pkts;
307c77ad9deSRaslan Darawsheh }
3081e45c908SDekel Peled 
3091e45c908SDekel Peled uint16_t
3101e45c908SDekel Peled tx_pkt_set_md(uint16_t port_id, __rte_unused uint16_t queue,
3111e45c908SDekel Peled 	      struct rte_mbuf *pkts[], uint16_t nb_pkts,
3121e45c908SDekel Peled 	      __rte_unused void *user_param)
3131e45c908SDekel Peled {
3141e45c908SDekel Peled 	uint16_t i = 0;
3151e45c908SDekel Peled 
3161e45c908SDekel Peled 	/*
3171e45c908SDekel Peled 	 * Add metadata value to every Tx packet,
3181e45c908SDekel Peled 	 * and set ol_flags accordingly.
3191e45c908SDekel Peled 	 */
3209bf26e13SViacheslav Ovsiienko 	if (rte_flow_dynf_metadata_avail())
3211e45c908SDekel Peled 		for (i = 0; i < nb_pkts; i++) {
3229bf26e13SViacheslav Ovsiienko 			*RTE_FLOW_DYNF_METADATA(pkts[i]) =
3239bf26e13SViacheslav Ovsiienko 						ports[port_id].tx_metadata;
3249bf26e13SViacheslav Ovsiienko 			pkts[i]->ol_flags |= PKT_TX_DYNF_METADATA;
3251e45c908SDekel Peled 		}
3261e45c908SDekel Peled 	return nb_pkts;
3271e45c908SDekel Peled }
3281e45c908SDekel Peled 
3291e45c908SDekel Peled void
3301e45c908SDekel Peled add_tx_md_callback(portid_t portid)
3311e45c908SDekel Peled {
3321e45c908SDekel Peled 	struct rte_eth_dev_info dev_info;
3331e45c908SDekel Peled 	uint16_t queue;
3346f51deb9SIvan Ilchenko 	int ret;
3351e45c908SDekel Peled 
3361e45c908SDekel Peled 	if (port_id_is_invalid(portid, ENABLED_WARN))
3371e45c908SDekel Peled 		return;
3386f51deb9SIvan Ilchenko 
3396f51deb9SIvan Ilchenko 	ret = eth_dev_info_get_print_err(portid, &dev_info);
3406f51deb9SIvan Ilchenko 	if (ret != 0)
3416f51deb9SIvan Ilchenko 		return;
3426f51deb9SIvan Ilchenko 
3431e45c908SDekel Peled 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
3441e45c908SDekel Peled 		if (!ports[portid].tx_set_md_cb[queue])
3451e45c908SDekel Peled 			ports[portid].tx_set_md_cb[queue] =
3461e45c908SDekel Peled 				rte_eth_add_tx_callback(portid, queue,
3471e45c908SDekel Peled 							tx_pkt_set_md, NULL);
3481e45c908SDekel Peled }
3491e45c908SDekel Peled 
3501e45c908SDekel Peled void
3511e45c908SDekel Peled remove_tx_md_callback(portid_t portid)
3521e45c908SDekel Peled {
3531e45c908SDekel Peled 	struct rte_eth_dev_info dev_info;
3541e45c908SDekel Peled 	uint16_t queue;
3556f51deb9SIvan Ilchenko 	int ret;
3561e45c908SDekel Peled 
3571e45c908SDekel Peled 	if (port_id_is_invalid(portid, ENABLED_WARN))
3581e45c908SDekel Peled 		return;
3596f51deb9SIvan Ilchenko 
3606f51deb9SIvan Ilchenko 	ret = eth_dev_info_get_print_err(portid, &dev_info);
3616f51deb9SIvan Ilchenko 	if (ret != 0)
3626f51deb9SIvan Ilchenko 		return;
3636f51deb9SIvan Ilchenko 
3641e45c908SDekel Peled 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
3651e45c908SDekel Peled 		if (ports[portid].tx_set_md_cb[queue]) {
3661e45c908SDekel Peled 			rte_eth_remove_tx_callback(portid, queue,
3671e45c908SDekel Peled 				ports[portid].tx_set_md_cb[queue]);
3681e45c908SDekel Peled 			ports[portid].tx_set_md_cb[queue] = NULL;
3691e45c908SDekel Peled 		}
3701e45c908SDekel Peled }
3716f51deb9SIvan Ilchenko 
372b57b66a9SOri Kam uint16_t
373b57b66a9SOri Kam tx_pkt_set_dynf(uint16_t port_id, __rte_unused uint16_t queue,
374b57b66a9SOri Kam 		struct rte_mbuf *pkts[], uint16_t nb_pkts,
375b57b66a9SOri Kam 		__rte_unused void *user_param)
376b57b66a9SOri Kam {
377b57b66a9SOri Kam 	uint16_t i = 0;
378b57b66a9SOri Kam 
379b57b66a9SOri Kam 	if (ports[port_id].mbuf_dynf)
380b57b66a9SOri Kam 		for (i = 0; i < nb_pkts; i++)
381b57b66a9SOri Kam 			pkts[i]->ol_flags |= ports[port_id].mbuf_dynf;
382b57b66a9SOri Kam 	return nb_pkts;
383b57b66a9SOri Kam }
384b57b66a9SOri Kam 
385b57b66a9SOri Kam void
386b57b66a9SOri Kam add_tx_dynf_callback(portid_t portid)
387b57b66a9SOri Kam {
388b57b66a9SOri Kam 	struct rte_eth_dev_info dev_info;
389b57b66a9SOri Kam 	uint16_t queue;
390b57b66a9SOri Kam 	int ret;
391b57b66a9SOri Kam 
392b57b66a9SOri Kam 	if (port_id_is_invalid(portid, ENABLED_WARN))
393b57b66a9SOri Kam 		return;
394b57b66a9SOri Kam 
395b57b66a9SOri Kam 	ret = eth_dev_info_get_print_err(portid, &dev_info);
396b57b66a9SOri Kam 	if (ret != 0)
397b57b66a9SOri Kam 		return;
398b57b66a9SOri Kam 
399b57b66a9SOri Kam 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
400b57b66a9SOri Kam 		if (!ports[portid].tx_set_dynf_cb[queue])
401b57b66a9SOri Kam 			ports[portid].tx_set_dynf_cb[queue] =
402b57b66a9SOri Kam 				rte_eth_add_tx_callback(portid, queue,
403b57b66a9SOri Kam 							tx_pkt_set_dynf, NULL);
404b57b66a9SOri Kam }
405b57b66a9SOri Kam 
406b57b66a9SOri Kam void
407b57b66a9SOri Kam remove_tx_dynf_callback(portid_t portid)
408b57b66a9SOri Kam {
409b57b66a9SOri Kam 	struct rte_eth_dev_info dev_info;
410b57b66a9SOri Kam 	uint16_t queue;
411b57b66a9SOri Kam 	int ret;
412b57b66a9SOri Kam 
413b57b66a9SOri Kam 	if (port_id_is_invalid(portid, ENABLED_WARN))
414b57b66a9SOri Kam 		return;
415b57b66a9SOri Kam 
416b57b66a9SOri Kam 	ret = eth_dev_info_get_print_err(portid, &dev_info);
417b57b66a9SOri Kam 	if (ret != 0)
418b57b66a9SOri Kam 		return;
419b57b66a9SOri Kam 
420b57b66a9SOri Kam 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
421b57b66a9SOri Kam 		if (ports[portid].tx_set_dynf_cb[queue]) {
422b57b66a9SOri Kam 			rte_eth_remove_tx_callback(portid, queue,
423b57b66a9SOri Kam 				ports[portid].tx_set_dynf_cb[queue]);
424b57b66a9SOri Kam 			ports[portid].tx_set_dynf_cb[queue] = NULL;
425b57b66a9SOri Kam 		}
426b57b66a9SOri Kam }
427b57b66a9SOri Kam 
4286f51deb9SIvan Ilchenko int
4296f51deb9SIvan Ilchenko eth_dev_info_get_print_err(uint16_t port_id,
4306f51deb9SIvan Ilchenko 					struct rte_eth_dev_info *dev_info)
4316f51deb9SIvan Ilchenko {
4326f51deb9SIvan Ilchenko 	int ret;
4336f51deb9SIvan Ilchenko 
4346f51deb9SIvan Ilchenko 	ret = rte_eth_dev_info_get(port_id, dev_info);
4356f51deb9SIvan Ilchenko 	if (ret != 0)
4366f51deb9SIvan Ilchenko 		printf("Error during getting device (port %u) info: %s\n",
4376f51deb9SIvan Ilchenko 				port_id, strerror(-ret));
4386f51deb9SIvan Ilchenko 
4396f51deb9SIvan Ilchenko 	return ret;
4406f51deb9SIvan Ilchenko }
44134fc1051SIvan Ilchenko 
44234fc1051SIvan Ilchenko void
44334fc1051SIvan Ilchenko eth_set_promisc_mode(uint16_t port, int enable)
44434fc1051SIvan Ilchenko {
44534fc1051SIvan Ilchenko 	int ret;
44634fc1051SIvan Ilchenko 
44734fc1051SIvan Ilchenko 	if (enable)
44834fc1051SIvan Ilchenko 		ret = rte_eth_promiscuous_enable(port);
44934fc1051SIvan Ilchenko 	else
45034fc1051SIvan Ilchenko 		ret = rte_eth_promiscuous_disable(port);
45134fc1051SIvan Ilchenko 
45234fc1051SIvan Ilchenko 	if (ret != 0)
45334fc1051SIvan Ilchenko 		printf("Error during %s promiscuous mode for port %u: %s\n",
45434fc1051SIvan Ilchenko 			enable ? "enabling" : "disabling",
45534fc1051SIvan Ilchenko 			port, rte_strerror(-ret));
45634fc1051SIvan Ilchenko }
457e661a08bSIgor Romanov 
4588835806dSIvan Ilchenko void
4598835806dSIvan Ilchenko eth_set_allmulticast_mode(uint16_t port, int enable)
4608835806dSIvan Ilchenko {
4618835806dSIvan Ilchenko 	int ret;
4628835806dSIvan Ilchenko 
4638835806dSIvan Ilchenko 	if (enable)
4648835806dSIvan Ilchenko 		ret = rte_eth_allmulticast_enable(port);
4658835806dSIvan Ilchenko 	else
4668835806dSIvan Ilchenko 		ret = rte_eth_allmulticast_disable(port);
4678835806dSIvan Ilchenko 
4688835806dSIvan Ilchenko 	if (ret != 0)
4698835806dSIvan Ilchenko 		printf("Error during %s all-multicast mode for port %u: %s\n",
4708835806dSIvan Ilchenko 			enable ? "enabling" : "disabling",
4718835806dSIvan Ilchenko 			port, rte_strerror(-ret));
4728835806dSIvan Ilchenko }
4738835806dSIvan Ilchenko 
474e661a08bSIgor Romanov int
475e661a08bSIgor Romanov eth_link_get_nowait_print_err(uint16_t port_id, struct rte_eth_link *link)
476e661a08bSIgor Romanov {
477e661a08bSIgor Romanov 	int ret;
478e661a08bSIgor Romanov 
479e661a08bSIgor Romanov 	ret = rte_eth_link_get_nowait(port_id, link);
480e661a08bSIgor Romanov 	if (ret < 0)
481e661a08bSIgor Romanov 		printf("Device (port %u) link get (without wait) failed: %s\n",
482e661a08bSIgor Romanov 			port_id, rte_strerror(-ret));
483e661a08bSIgor Romanov 
484e661a08bSIgor Romanov 	return ret;
485e661a08bSIgor Romanov }
486a5279d25SIgor Romanov 
487a5279d25SIgor Romanov int
488a5279d25SIgor Romanov eth_macaddr_get_print_err(uint16_t port_id, struct rte_ether_addr *mac_addr)
489a5279d25SIgor Romanov {
490a5279d25SIgor Romanov 	int ret;
491a5279d25SIgor Romanov 
492a5279d25SIgor Romanov 	ret = rte_eth_macaddr_get(port_id, mac_addr);
493a5279d25SIgor Romanov 	if (ret != 0)
494a5279d25SIgor Romanov 		printf("Error getting device (port %u) mac address: %s\n",
495a5279d25SIgor Romanov 				port_id, rte_strerror(-ret));
496a5279d25SIgor Romanov 
497a5279d25SIgor Romanov 	return ret;
498a5279d25SIgor Romanov }
499