xref: /f-stack/dpdk/app/test-pmd/util.c (revision 2d9fd380)
1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606  * Copyright(c) 2010-2014 Intel Corporation
34418919fSjohnjiang  * Copyright 2018 Mellanox Technologies, Ltd
4d30ea906Sjfb8856606  */
5d30ea906Sjfb8856606 
6d30ea906Sjfb8856606 #include <stdio.h>
7d30ea906Sjfb8856606 
8*2d9fd380Sjfb8856606 #include <rte_bitops.h>
9d30ea906Sjfb8856606 #include <rte_net.h>
10d30ea906Sjfb8856606 #include <rte_mbuf.h>
11d30ea906Sjfb8856606 #include <rte_ether.h>
124418919fSjohnjiang #include <rte_vxlan.h>
13d30ea906Sjfb8856606 #include <rte_ethdev.h>
14d30ea906Sjfb8856606 #include <rte_flow.h>
15d30ea906Sjfb8856606 
16d30ea906Sjfb8856606 #include "testpmd.h"
17d30ea906Sjfb8856606 
18d30ea906Sjfb8856606 static inline void
print_ether_addr(const char * what,const struct rte_ether_addr * eth_addr)194418919fSjohnjiang print_ether_addr(const char *what, const struct rte_ether_addr *eth_addr)
20d30ea906Sjfb8856606 {
214418919fSjohnjiang 	char buf[RTE_ETHER_ADDR_FMT_SIZE];
224418919fSjohnjiang 	rte_ether_format_addr(buf, RTE_ETHER_ADDR_FMT_SIZE, eth_addr);
23d30ea906Sjfb8856606 	printf("%s%s", what, buf);
24d30ea906Sjfb8856606 }
25d30ea906Sjfb8856606 
26*2d9fd380Sjfb8856606 static inline bool
is_timestamp_enabled(const struct rte_mbuf * mbuf)27*2d9fd380Sjfb8856606 is_timestamp_enabled(const struct rte_mbuf *mbuf)
28*2d9fd380Sjfb8856606 {
29*2d9fd380Sjfb8856606 	static uint64_t timestamp_rx_dynflag;
30*2d9fd380Sjfb8856606 	int timestamp_rx_dynflag_offset;
31*2d9fd380Sjfb8856606 
32*2d9fd380Sjfb8856606 	if (timestamp_rx_dynflag == 0) {
33*2d9fd380Sjfb8856606 		timestamp_rx_dynflag_offset = rte_mbuf_dynflag_lookup(
34*2d9fd380Sjfb8856606 				RTE_MBUF_DYNFLAG_RX_TIMESTAMP_NAME, NULL);
35*2d9fd380Sjfb8856606 		if (timestamp_rx_dynflag_offset < 0)
36*2d9fd380Sjfb8856606 			return false;
37*2d9fd380Sjfb8856606 		timestamp_rx_dynflag = RTE_BIT64(timestamp_rx_dynflag_offset);
38*2d9fd380Sjfb8856606 	}
39*2d9fd380Sjfb8856606 
40*2d9fd380Sjfb8856606 	return (mbuf->ol_flags & timestamp_rx_dynflag) != 0;
41*2d9fd380Sjfb8856606 }
42*2d9fd380Sjfb8856606 
43*2d9fd380Sjfb8856606 static inline rte_mbuf_timestamp_t
get_timestamp(const struct rte_mbuf * mbuf)44*2d9fd380Sjfb8856606 get_timestamp(const struct rte_mbuf *mbuf)
45*2d9fd380Sjfb8856606 {
46*2d9fd380Sjfb8856606 	static int timestamp_dynfield_offset = -1;
47*2d9fd380Sjfb8856606 
48*2d9fd380Sjfb8856606 	if (timestamp_dynfield_offset < 0) {
49*2d9fd380Sjfb8856606 		timestamp_dynfield_offset = rte_mbuf_dynfield_lookup(
50*2d9fd380Sjfb8856606 				RTE_MBUF_DYNFIELD_TIMESTAMP_NAME, NULL);
51*2d9fd380Sjfb8856606 		if (timestamp_dynfield_offset < 0)
52*2d9fd380Sjfb8856606 			return 0;
53*2d9fd380Sjfb8856606 	}
54*2d9fd380Sjfb8856606 
55*2d9fd380Sjfb8856606 	return *RTE_MBUF_DYNFIELD(mbuf,
56*2d9fd380Sjfb8856606 			timestamp_dynfield_offset, rte_mbuf_timestamp_t *);
57*2d9fd380Sjfb8856606 }
58*2d9fd380Sjfb8856606 
59d30ea906Sjfb8856606 static inline void
dump_pkt_burst(uint16_t port_id,uint16_t queue,struct rte_mbuf * pkts[],uint16_t nb_pkts,int is_rx)60d30ea906Sjfb8856606 dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
61d30ea906Sjfb8856606 	      uint16_t nb_pkts, int is_rx)
62d30ea906Sjfb8856606 {
63d30ea906Sjfb8856606 	struct rte_mbuf  *mb;
644418919fSjohnjiang 	const struct rte_ether_hdr *eth_hdr;
654418919fSjohnjiang 	struct rte_ether_hdr _eth_hdr;
66d30ea906Sjfb8856606 	uint16_t eth_type;
67d30ea906Sjfb8856606 	uint64_t ol_flags;
68d30ea906Sjfb8856606 	uint16_t i, packet_type;
69d30ea906Sjfb8856606 	uint16_t is_encapsulation;
70d30ea906Sjfb8856606 	char buf[256];
71d30ea906Sjfb8856606 	struct rte_net_hdr_lens hdr_lens;
72d30ea906Sjfb8856606 	uint32_t sw_packet_type;
73d30ea906Sjfb8856606 	uint16_t udp_port;
74d30ea906Sjfb8856606 	uint32_t vx_vni;
754418919fSjohnjiang 	const char *reason;
76*2d9fd380Sjfb8856606 	int dynf_index;
77d30ea906Sjfb8856606 
78d30ea906Sjfb8856606 	if (!nb_pkts)
79d30ea906Sjfb8856606 		return;
80d30ea906Sjfb8856606 	printf("port %u/queue %u: %s %u packets\n",
81d30ea906Sjfb8856606 		port_id, queue,
82d30ea906Sjfb8856606 	       is_rx ? "received" : "sent",
83d30ea906Sjfb8856606 	       (unsigned int) nb_pkts);
84d30ea906Sjfb8856606 	for (i = 0; i < nb_pkts; i++) {
85*2d9fd380Sjfb8856606 		int ret;
86*2d9fd380Sjfb8856606 		struct rte_flow_error error;
87*2d9fd380Sjfb8856606 		struct rte_flow_restore_info info = { 0, };
88*2d9fd380Sjfb8856606 
89d30ea906Sjfb8856606 		mb = pkts[i];
904b05018fSfengbojiang 		eth_hdr = rte_pktmbuf_read(mb, 0, sizeof(_eth_hdr), &_eth_hdr);
91d30ea906Sjfb8856606 		eth_type = RTE_BE_TO_CPU_16(eth_hdr->ether_type);
92d30ea906Sjfb8856606 		packet_type = mb->packet_type;
93d30ea906Sjfb8856606 		is_encapsulation = RTE_ETH_IS_TUNNEL_PKT(packet_type);
94*2d9fd380Sjfb8856606 		ret = rte_flow_get_restore_info(port_id, mb, &info, &error);
95*2d9fd380Sjfb8856606 		if (!ret) {
96*2d9fd380Sjfb8856606 			printf("restore info:");
97*2d9fd380Sjfb8856606 			if (info.flags & RTE_FLOW_RESTORE_INFO_TUNNEL) {
98*2d9fd380Sjfb8856606 				struct port_flow_tunnel *port_tunnel;
99d30ea906Sjfb8856606 
100*2d9fd380Sjfb8856606 				port_tunnel = port_flow_locate_tunnel
101*2d9fd380Sjfb8856606 					      (port_id, &info.tunnel);
102*2d9fd380Sjfb8856606 				printf(" - tunnel");
103*2d9fd380Sjfb8856606 				if (port_tunnel)
104*2d9fd380Sjfb8856606 					printf(" #%u", port_tunnel->id);
105*2d9fd380Sjfb8856606 				else
106*2d9fd380Sjfb8856606 					printf(" %s", "-none-");
107*2d9fd380Sjfb8856606 				printf(" type %s",
108*2d9fd380Sjfb8856606 					port_flow_tunnel_type(&info.tunnel));
109*2d9fd380Sjfb8856606 			} else {
110*2d9fd380Sjfb8856606 				printf(" - no tunnel info");
111*2d9fd380Sjfb8856606 			}
112*2d9fd380Sjfb8856606 			if (info.flags & RTE_FLOW_RESTORE_INFO_ENCAPSULATED)
113*2d9fd380Sjfb8856606 				printf(" - outer header present");
114*2d9fd380Sjfb8856606 			else
115*2d9fd380Sjfb8856606 				printf(" - no outer header");
116*2d9fd380Sjfb8856606 			if (info.flags & RTE_FLOW_RESTORE_INFO_GROUP_ID)
117*2d9fd380Sjfb8856606 				printf(" - miss group %u", info.group_id);
118*2d9fd380Sjfb8856606 			else
119*2d9fd380Sjfb8856606 				printf(" - no miss group");
120*2d9fd380Sjfb8856606 			printf("\n");
121*2d9fd380Sjfb8856606 		}
122d30ea906Sjfb8856606 		print_ether_addr("  src=", &eth_hdr->s_addr);
123d30ea906Sjfb8856606 		print_ether_addr(" - dst=", &eth_hdr->d_addr);
124d30ea906Sjfb8856606 		printf(" - type=0x%04x - length=%u - nb_segs=%d",
125d30ea906Sjfb8856606 		       eth_type, (unsigned int) mb->pkt_len,
126d30ea906Sjfb8856606 		       (int)mb->nb_segs);
127*2d9fd380Sjfb8856606 		ol_flags = mb->ol_flags;
128d30ea906Sjfb8856606 		if (ol_flags & PKT_RX_RSS_HASH) {
129d30ea906Sjfb8856606 			printf(" - RSS hash=0x%x", (unsigned int) mb->hash.rss);
130d30ea906Sjfb8856606 			printf(" - RSS queue=0x%x", (unsigned int) queue);
131d30ea906Sjfb8856606 		}
132d30ea906Sjfb8856606 		if (ol_flags & PKT_RX_FDIR) {
133d30ea906Sjfb8856606 			printf(" - FDIR matched ");
134d30ea906Sjfb8856606 			if (ol_flags & PKT_RX_FDIR_ID)
135d30ea906Sjfb8856606 				printf("ID=0x%x",
136d30ea906Sjfb8856606 				       mb->hash.fdir.hi);
137d30ea906Sjfb8856606 			else if (ol_flags & PKT_RX_FDIR_FLX)
138d30ea906Sjfb8856606 				printf("flex bytes=0x%08x %08x",
139d30ea906Sjfb8856606 				       mb->hash.fdir.hi, mb->hash.fdir.lo);
140d30ea906Sjfb8856606 			else
141d30ea906Sjfb8856606 				printf("hash=0x%x ID=0x%x ",
142d30ea906Sjfb8856606 				       mb->hash.fdir.hash, mb->hash.fdir.id);
143d30ea906Sjfb8856606 		}
144*2d9fd380Sjfb8856606 		if (is_timestamp_enabled(mb))
145*2d9fd380Sjfb8856606 			printf(" - timestamp %"PRIu64" ", get_timestamp(mb));
146d30ea906Sjfb8856606 		if (ol_flags & PKT_RX_QINQ)
147d30ea906Sjfb8856606 			printf(" - QinQ VLAN tci=0x%x, VLAN tci outer=0x%x",
148d30ea906Sjfb8856606 			       mb->vlan_tci, mb->vlan_tci_outer);
149d30ea906Sjfb8856606 		else if (ol_flags & PKT_RX_VLAN)
150d30ea906Sjfb8856606 			printf(" - VLAN tci=0x%x", mb->vlan_tci);
1514418919fSjohnjiang 		if (!is_rx && (ol_flags & PKT_TX_DYNF_METADATA))
1524418919fSjohnjiang 			printf(" - Tx metadata: 0x%x",
1534418919fSjohnjiang 			       *RTE_FLOW_DYNF_METADATA(mb));
1544418919fSjohnjiang 		if (is_rx && (ol_flags & PKT_RX_DYNF_METADATA))
1554418919fSjohnjiang 			printf(" - Rx metadata: 0x%x",
1564418919fSjohnjiang 			       *RTE_FLOW_DYNF_METADATA(mb));
157*2d9fd380Sjfb8856606 		for (dynf_index = 0; dynf_index < 64; dynf_index++) {
158*2d9fd380Sjfb8856606 			if (dynf_names[dynf_index][0] != '\0')
159*2d9fd380Sjfb8856606 				printf(" - dynf %s: %d",
160*2d9fd380Sjfb8856606 				       dynf_names[dynf_index],
161*2d9fd380Sjfb8856606 				       !!(ol_flags & (1UL << dynf_index)));
162*2d9fd380Sjfb8856606 		}
163d30ea906Sjfb8856606 		if (mb->packet_type) {
164d30ea906Sjfb8856606 			rte_get_ptype_name(mb->packet_type, buf, sizeof(buf));
165d30ea906Sjfb8856606 			printf(" - hw ptype: %s", buf);
166d30ea906Sjfb8856606 		}
167d30ea906Sjfb8856606 		sw_packet_type = rte_net_get_ptype(mb, &hdr_lens,
168d30ea906Sjfb8856606 					RTE_PTYPE_ALL_MASK);
169d30ea906Sjfb8856606 		rte_get_ptype_name(sw_packet_type, buf, sizeof(buf));
170d30ea906Sjfb8856606 		printf(" - sw ptype: %s", buf);
171d30ea906Sjfb8856606 		if (sw_packet_type & RTE_PTYPE_L2_MASK)
172d30ea906Sjfb8856606 			printf(" - l2_len=%d", hdr_lens.l2_len);
173d30ea906Sjfb8856606 		if (sw_packet_type & RTE_PTYPE_L3_MASK)
174d30ea906Sjfb8856606 			printf(" - l3_len=%d", hdr_lens.l3_len);
175d30ea906Sjfb8856606 		if (sw_packet_type & RTE_PTYPE_L4_MASK)
176d30ea906Sjfb8856606 			printf(" - l4_len=%d", hdr_lens.l4_len);
177d30ea906Sjfb8856606 		if (sw_packet_type & RTE_PTYPE_TUNNEL_MASK)
178d30ea906Sjfb8856606 			printf(" - tunnel_len=%d", hdr_lens.tunnel_len);
179d30ea906Sjfb8856606 		if (sw_packet_type & RTE_PTYPE_INNER_L2_MASK)
180d30ea906Sjfb8856606 			printf(" - inner_l2_len=%d", hdr_lens.inner_l2_len);
181d30ea906Sjfb8856606 		if (sw_packet_type & RTE_PTYPE_INNER_L3_MASK)
182d30ea906Sjfb8856606 			printf(" - inner_l3_len=%d", hdr_lens.inner_l3_len);
183d30ea906Sjfb8856606 		if (sw_packet_type & RTE_PTYPE_INNER_L4_MASK)
184d30ea906Sjfb8856606 			printf(" - inner_l4_len=%d", hdr_lens.inner_l4_len);
185d30ea906Sjfb8856606 		if (is_encapsulation) {
1864418919fSjohnjiang 			struct rte_ipv4_hdr *ipv4_hdr;
1874418919fSjohnjiang 			struct rte_ipv6_hdr *ipv6_hdr;
1884418919fSjohnjiang 			struct rte_udp_hdr *udp_hdr;
189d30ea906Sjfb8856606 			uint8_t l2_len;
190d30ea906Sjfb8856606 			uint8_t l3_len;
191d30ea906Sjfb8856606 			uint8_t l4_len;
192d30ea906Sjfb8856606 			uint8_t l4_proto;
1934418919fSjohnjiang 			struct  rte_vxlan_hdr *vxlan_hdr;
194d30ea906Sjfb8856606 
1954418919fSjohnjiang 			l2_len  = sizeof(struct rte_ether_hdr);
196d30ea906Sjfb8856606 
197d30ea906Sjfb8856606 			/* Do not support ipv4 option field */
198d30ea906Sjfb8856606 			if (RTE_ETH_IS_IPV4_HDR(packet_type)) {
1994418919fSjohnjiang 				l3_len = sizeof(struct rte_ipv4_hdr);
200d30ea906Sjfb8856606 				ipv4_hdr = rte_pktmbuf_mtod_offset(mb,
2014418919fSjohnjiang 				struct rte_ipv4_hdr *,
202d30ea906Sjfb8856606 				l2_len);
203d30ea906Sjfb8856606 				l4_proto = ipv4_hdr->next_proto_id;
204d30ea906Sjfb8856606 			} else {
2054418919fSjohnjiang 				l3_len = sizeof(struct rte_ipv6_hdr);
206d30ea906Sjfb8856606 				ipv6_hdr = rte_pktmbuf_mtod_offset(mb,
2074418919fSjohnjiang 				struct rte_ipv6_hdr *,
208d30ea906Sjfb8856606 				l2_len);
209d30ea906Sjfb8856606 				l4_proto = ipv6_hdr->proto;
210d30ea906Sjfb8856606 			}
211d30ea906Sjfb8856606 			if (l4_proto == IPPROTO_UDP) {
212d30ea906Sjfb8856606 				udp_hdr = rte_pktmbuf_mtod_offset(mb,
2134418919fSjohnjiang 				struct rte_udp_hdr *,
214d30ea906Sjfb8856606 				l2_len + l3_len);
2154418919fSjohnjiang 				l4_len = sizeof(struct rte_udp_hdr);
216d30ea906Sjfb8856606 				vxlan_hdr = rte_pktmbuf_mtod_offset(mb,
2174418919fSjohnjiang 				struct rte_vxlan_hdr *,
218d30ea906Sjfb8856606 				l2_len + l3_len + l4_len);
219d30ea906Sjfb8856606 				udp_port = RTE_BE_TO_CPU_16(udp_hdr->dst_port);
220d30ea906Sjfb8856606 				vx_vni = rte_be_to_cpu_32(vxlan_hdr->vx_vni);
221d30ea906Sjfb8856606 				printf(" - VXLAN packet: packet type =%d, "
222d30ea906Sjfb8856606 				       "Destination UDP port =%d, VNI = %d",
223d30ea906Sjfb8856606 				       packet_type, udp_port, vx_vni >> 8);
224d30ea906Sjfb8856606 			}
225d30ea906Sjfb8856606 		}
226d30ea906Sjfb8856606 		printf(" - %s queue=0x%x", is_rx ? "Receive" : "Send",
227d30ea906Sjfb8856606 			(unsigned int) queue);
228d30ea906Sjfb8856606 		printf("\n");
229d30ea906Sjfb8856606 		rte_get_rx_ol_flag_list(mb->ol_flags, buf, sizeof(buf));
230d30ea906Sjfb8856606 		printf("  ol_flags: %s\n", buf);
2314418919fSjohnjiang 		if (rte_mbuf_check(mb, 1, &reason) < 0)
2324418919fSjohnjiang 			printf("INVALID mbuf: %s\n", reason);
233d30ea906Sjfb8856606 	}
234d30ea906Sjfb8856606 }
235d30ea906Sjfb8856606 
236d30ea906Sjfb8856606 uint16_t
dump_rx_pkts(uint16_t port_id,uint16_t queue,struct rte_mbuf * pkts[],uint16_t nb_pkts,__rte_unused uint16_t max_pkts,__rte_unused void * user_param)237d30ea906Sjfb8856606 dump_rx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
238d30ea906Sjfb8856606 	     uint16_t nb_pkts, __rte_unused uint16_t max_pkts,
239d30ea906Sjfb8856606 	     __rte_unused void *user_param)
240d30ea906Sjfb8856606 {
241d30ea906Sjfb8856606 	dump_pkt_burst(port_id, queue, pkts, nb_pkts, 1);
242d30ea906Sjfb8856606 	return nb_pkts;
243d30ea906Sjfb8856606 }
244d30ea906Sjfb8856606 
245d30ea906Sjfb8856606 uint16_t
dump_tx_pkts(uint16_t port_id,uint16_t queue,struct rte_mbuf * pkts[],uint16_t nb_pkts,__rte_unused void * user_param)246d30ea906Sjfb8856606 dump_tx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
247d30ea906Sjfb8856606 	     uint16_t nb_pkts, __rte_unused void *user_param)
248d30ea906Sjfb8856606 {
249d30ea906Sjfb8856606 	dump_pkt_burst(port_id, queue, pkts, nb_pkts, 0);
250d30ea906Sjfb8856606 	return nb_pkts;
251d30ea906Sjfb8856606 }
252d30ea906Sjfb8856606 
253d30ea906Sjfb8856606 uint16_t
tx_pkt_set_md(uint16_t port_id,__rte_unused uint16_t queue,struct rte_mbuf * pkts[],uint16_t nb_pkts,__rte_unused void * user_param)254d30ea906Sjfb8856606 tx_pkt_set_md(uint16_t port_id, __rte_unused uint16_t queue,
255d30ea906Sjfb8856606 	      struct rte_mbuf *pkts[], uint16_t nb_pkts,
256d30ea906Sjfb8856606 	      __rte_unused void *user_param)
257d30ea906Sjfb8856606 {
258d30ea906Sjfb8856606 	uint16_t i = 0;
259d30ea906Sjfb8856606 
260d30ea906Sjfb8856606 	/*
261d30ea906Sjfb8856606 	 * Add metadata value to every Tx packet,
262d30ea906Sjfb8856606 	 * and set ol_flags accordingly.
263d30ea906Sjfb8856606 	 */
2644418919fSjohnjiang 	if (rte_flow_dynf_metadata_avail())
265d30ea906Sjfb8856606 		for (i = 0; i < nb_pkts; i++) {
2664418919fSjohnjiang 			*RTE_FLOW_DYNF_METADATA(pkts[i]) =
2674418919fSjohnjiang 						ports[port_id].tx_metadata;
2684418919fSjohnjiang 			pkts[i]->ol_flags |= PKT_TX_DYNF_METADATA;
269d30ea906Sjfb8856606 		}
270d30ea906Sjfb8856606 	return nb_pkts;
271d30ea906Sjfb8856606 }
272d30ea906Sjfb8856606 
273d30ea906Sjfb8856606 void
add_tx_md_callback(portid_t portid)274d30ea906Sjfb8856606 add_tx_md_callback(portid_t portid)
275d30ea906Sjfb8856606 {
276d30ea906Sjfb8856606 	struct rte_eth_dev_info dev_info;
277d30ea906Sjfb8856606 	uint16_t queue;
2784418919fSjohnjiang 	int ret;
279d30ea906Sjfb8856606 
280d30ea906Sjfb8856606 	if (port_id_is_invalid(portid, ENABLED_WARN))
281d30ea906Sjfb8856606 		return;
2824418919fSjohnjiang 
2834418919fSjohnjiang 	ret = eth_dev_info_get_print_err(portid, &dev_info);
2844418919fSjohnjiang 	if (ret != 0)
2854418919fSjohnjiang 		return;
2864418919fSjohnjiang 
287d30ea906Sjfb8856606 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
288d30ea906Sjfb8856606 		if (!ports[portid].tx_set_md_cb[queue])
289d30ea906Sjfb8856606 			ports[portid].tx_set_md_cb[queue] =
290d30ea906Sjfb8856606 				rte_eth_add_tx_callback(portid, queue,
291d30ea906Sjfb8856606 							tx_pkt_set_md, NULL);
292d30ea906Sjfb8856606 }
293d30ea906Sjfb8856606 
294d30ea906Sjfb8856606 void
remove_tx_md_callback(portid_t portid)295d30ea906Sjfb8856606 remove_tx_md_callback(portid_t portid)
296d30ea906Sjfb8856606 {
297d30ea906Sjfb8856606 	struct rte_eth_dev_info dev_info;
298d30ea906Sjfb8856606 	uint16_t queue;
2994418919fSjohnjiang 	int ret;
300d30ea906Sjfb8856606 
301d30ea906Sjfb8856606 	if (port_id_is_invalid(portid, ENABLED_WARN))
302d30ea906Sjfb8856606 		return;
3034418919fSjohnjiang 
3044418919fSjohnjiang 	ret = eth_dev_info_get_print_err(portid, &dev_info);
3054418919fSjohnjiang 	if (ret != 0)
3064418919fSjohnjiang 		return;
3074418919fSjohnjiang 
308d30ea906Sjfb8856606 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
309d30ea906Sjfb8856606 		if (ports[portid].tx_set_md_cb[queue]) {
310d30ea906Sjfb8856606 			rte_eth_remove_tx_callback(portid, queue,
311d30ea906Sjfb8856606 				ports[portid].tx_set_md_cb[queue]);
312d30ea906Sjfb8856606 			ports[portid].tx_set_md_cb[queue] = NULL;
313d30ea906Sjfb8856606 		}
314d30ea906Sjfb8856606 }
3154418919fSjohnjiang 
316*2d9fd380Sjfb8856606 uint16_t
tx_pkt_set_dynf(uint16_t port_id,__rte_unused uint16_t queue,struct rte_mbuf * pkts[],uint16_t nb_pkts,__rte_unused void * user_param)317*2d9fd380Sjfb8856606 tx_pkt_set_dynf(uint16_t port_id, __rte_unused uint16_t queue,
318*2d9fd380Sjfb8856606 		struct rte_mbuf *pkts[], uint16_t nb_pkts,
319*2d9fd380Sjfb8856606 		__rte_unused void *user_param)
320*2d9fd380Sjfb8856606 {
321*2d9fd380Sjfb8856606 	uint16_t i = 0;
322*2d9fd380Sjfb8856606 
323*2d9fd380Sjfb8856606 	if (ports[port_id].mbuf_dynf)
324*2d9fd380Sjfb8856606 		for (i = 0; i < nb_pkts; i++)
325*2d9fd380Sjfb8856606 			pkts[i]->ol_flags |= ports[port_id].mbuf_dynf;
326*2d9fd380Sjfb8856606 	return nb_pkts;
327*2d9fd380Sjfb8856606 }
328*2d9fd380Sjfb8856606 
329*2d9fd380Sjfb8856606 void
add_tx_dynf_callback(portid_t portid)330*2d9fd380Sjfb8856606 add_tx_dynf_callback(portid_t portid)
331*2d9fd380Sjfb8856606 {
332*2d9fd380Sjfb8856606 	struct rte_eth_dev_info dev_info;
333*2d9fd380Sjfb8856606 	uint16_t queue;
334*2d9fd380Sjfb8856606 	int ret;
335*2d9fd380Sjfb8856606 
336*2d9fd380Sjfb8856606 	if (port_id_is_invalid(portid, ENABLED_WARN))
337*2d9fd380Sjfb8856606 		return;
338*2d9fd380Sjfb8856606 
339*2d9fd380Sjfb8856606 	ret = eth_dev_info_get_print_err(portid, &dev_info);
340*2d9fd380Sjfb8856606 	if (ret != 0)
341*2d9fd380Sjfb8856606 		return;
342*2d9fd380Sjfb8856606 
343*2d9fd380Sjfb8856606 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
344*2d9fd380Sjfb8856606 		if (!ports[portid].tx_set_dynf_cb[queue])
345*2d9fd380Sjfb8856606 			ports[portid].tx_set_dynf_cb[queue] =
346*2d9fd380Sjfb8856606 				rte_eth_add_tx_callback(portid, queue,
347*2d9fd380Sjfb8856606 							tx_pkt_set_dynf, NULL);
348*2d9fd380Sjfb8856606 }
349*2d9fd380Sjfb8856606 
350*2d9fd380Sjfb8856606 void
remove_tx_dynf_callback(portid_t portid)351*2d9fd380Sjfb8856606 remove_tx_dynf_callback(portid_t portid)
352*2d9fd380Sjfb8856606 {
353*2d9fd380Sjfb8856606 	struct rte_eth_dev_info dev_info;
354*2d9fd380Sjfb8856606 	uint16_t queue;
355*2d9fd380Sjfb8856606 	int ret;
356*2d9fd380Sjfb8856606 
357*2d9fd380Sjfb8856606 	if (port_id_is_invalid(portid, ENABLED_WARN))
358*2d9fd380Sjfb8856606 		return;
359*2d9fd380Sjfb8856606 
360*2d9fd380Sjfb8856606 	ret = eth_dev_info_get_print_err(portid, &dev_info);
361*2d9fd380Sjfb8856606 	if (ret != 0)
362*2d9fd380Sjfb8856606 		return;
363*2d9fd380Sjfb8856606 
364*2d9fd380Sjfb8856606 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
365*2d9fd380Sjfb8856606 		if (ports[portid].tx_set_dynf_cb[queue]) {
366*2d9fd380Sjfb8856606 			rte_eth_remove_tx_callback(portid, queue,
367*2d9fd380Sjfb8856606 				ports[portid].tx_set_dynf_cb[queue]);
368*2d9fd380Sjfb8856606 			ports[portid].tx_set_dynf_cb[queue] = NULL;
369*2d9fd380Sjfb8856606 		}
370*2d9fd380Sjfb8856606 }
371*2d9fd380Sjfb8856606 
3724418919fSjohnjiang int
eth_dev_info_get_print_err(uint16_t port_id,struct rte_eth_dev_info * dev_info)3734418919fSjohnjiang eth_dev_info_get_print_err(uint16_t port_id,
3744418919fSjohnjiang 					struct rte_eth_dev_info *dev_info)
3754418919fSjohnjiang {
3764418919fSjohnjiang 	int ret;
3774418919fSjohnjiang 
3784418919fSjohnjiang 	ret = rte_eth_dev_info_get(port_id, dev_info);
3794418919fSjohnjiang 	if (ret != 0)
3804418919fSjohnjiang 		printf("Error during getting device (port %u) info: %s\n",
3814418919fSjohnjiang 				port_id, strerror(-ret));
3824418919fSjohnjiang 
3834418919fSjohnjiang 	return ret;
3844418919fSjohnjiang }
3854418919fSjohnjiang 
3864418919fSjohnjiang void
eth_set_promisc_mode(uint16_t port,int enable)3874418919fSjohnjiang eth_set_promisc_mode(uint16_t port, int enable)
3884418919fSjohnjiang {
3894418919fSjohnjiang 	int ret;
3904418919fSjohnjiang 
3914418919fSjohnjiang 	if (enable)
3924418919fSjohnjiang 		ret = rte_eth_promiscuous_enable(port);
3934418919fSjohnjiang 	else
3944418919fSjohnjiang 		ret = rte_eth_promiscuous_disable(port);
3954418919fSjohnjiang 
3964418919fSjohnjiang 	if (ret != 0)
3974418919fSjohnjiang 		printf("Error during %s promiscuous mode for port %u: %s\n",
3984418919fSjohnjiang 			enable ? "enabling" : "disabling",
3994418919fSjohnjiang 			port, rte_strerror(-ret));
4004418919fSjohnjiang }
4014418919fSjohnjiang 
4024418919fSjohnjiang void
eth_set_allmulticast_mode(uint16_t port,int enable)4034418919fSjohnjiang eth_set_allmulticast_mode(uint16_t port, int enable)
4044418919fSjohnjiang {
4054418919fSjohnjiang 	int ret;
4064418919fSjohnjiang 
4074418919fSjohnjiang 	if (enable)
4084418919fSjohnjiang 		ret = rte_eth_allmulticast_enable(port);
4094418919fSjohnjiang 	else
4104418919fSjohnjiang 		ret = rte_eth_allmulticast_disable(port);
4114418919fSjohnjiang 
4124418919fSjohnjiang 	if (ret != 0)
4134418919fSjohnjiang 		printf("Error during %s all-multicast mode for port %u: %s\n",
4144418919fSjohnjiang 			enable ? "enabling" : "disabling",
4154418919fSjohnjiang 			port, rte_strerror(-ret));
4164418919fSjohnjiang }
4174418919fSjohnjiang 
4184418919fSjohnjiang int
eth_link_get_nowait_print_err(uint16_t port_id,struct rte_eth_link * link)4194418919fSjohnjiang eth_link_get_nowait_print_err(uint16_t port_id, struct rte_eth_link *link)
4204418919fSjohnjiang {
4214418919fSjohnjiang 	int ret;
4224418919fSjohnjiang 
4234418919fSjohnjiang 	ret = rte_eth_link_get_nowait(port_id, link);
4244418919fSjohnjiang 	if (ret < 0)
4254418919fSjohnjiang 		printf("Device (port %u) link get (without wait) failed: %s\n",
4264418919fSjohnjiang 			port_id, rte_strerror(-ret));
4274418919fSjohnjiang 
4284418919fSjohnjiang 	return ret;
4294418919fSjohnjiang }
4304418919fSjohnjiang 
4314418919fSjohnjiang int
eth_macaddr_get_print_err(uint16_t port_id,struct rte_ether_addr * mac_addr)4324418919fSjohnjiang eth_macaddr_get_print_err(uint16_t port_id, struct rte_ether_addr *mac_addr)
4334418919fSjohnjiang {
4344418919fSjohnjiang 	int ret;
4354418919fSjohnjiang 
4364418919fSjohnjiang 	ret = rte_eth_macaddr_get(port_id, mac_addr);
4374418919fSjohnjiang 	if (ret != 0)
4384418919fSjohnjiang 		printf("Error getting device (port %u) mac address: %s\n",
4394418919fSjohnjiang 				port_id, rte_strerror(-ret));
4404418919fSjohnjiang 
4414418919fSjohnjiang 	return ret;
4424418919fSjohnjiang }
443