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=", ð_hdr->s_addr);
123d30ea906Sjfb8856606 print_ether_addr(" - dst=", ð_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