]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | /* SPDX-License-Identifier: BSD-3-Clause |
2 | * Copyright(c) 2010-2017 Intel Corporation | |
7c673cae FG |
3 | */ |
4 | ||
5 | #ifndef _TESTPMD_H_ | |
6 | #define _TESTPMD_H_ | |
7 | ||
9f95a23c TL |
8 | #include <stdbool.h> |
9 | ||
11fdf7f2 TL |
10 | #include <rte_pci.h> |
11 | #include <rte_bus_pci.h> | |
12 | #include <rte_gro.h> | |
13 | #include <rte_gso.h> | |
14 | ||
7c673cae FG |
15 | #define RTE_PORT_ALL (~(portid_t)0x0) |
16 | ||
17 | #define RTE_TEST_RX_DESC_MAX 2048 | |
18 | #define RTE_TEST_TX_DESC_MAX 2048 | |
19 | ||
20 | #define RTE_PORT_STOPPED (uint16_t)0 | |
21 | #define RTE_PORT_STARTED (uint16_t)1 | |
22 | #define RTE_PORT_CLOSED (uint16_t)2 | |
23 | #define RTE_PORT_HANDLING (uint16_t)3 | |
24 | ||
25 | /* | |
26 | * It is used to allocate the memory for hash key. | |
27 | * The hash key size is NIC dependent. | |
28 | */ | |
29 | #define RSS_HASH_KEY_LENGTH 64 | |
30 | ||
31 | /* | |
32 | * Default size of the mbuf data buffer to receive standard 1518-byte | |
33 | * Ethernet frames in a mono-segment memory buffer. | |
34 | */ | |
35 | #define DEFAULT_MBUF_DATA_SIZE RTE_MBUF_DEFAULT_BUF_SIZE | |
36 | /**< Default size of mbuf data buffer. */ | |
37 | ||
38 | /* | |
39 | * The maximum number of segments per packet is used when creating | |
40 | * scattered transmit packets composed of a list of mbufs. | |
41 | */ | |
42 | #define RTE_MAX_SEGS_PER_PKT 255 /**< nb_segs is a 8-bit unsigned char. */ | |
43 | ||
44 | #define MAX_PKT_BURST 512 | |
45 | #define DEF_PKT_BURST 32 | |
46 | ||
47 | #define DEF_MBUF_CACHE 250 | |
48 | ||
49 | #define RTE_CACHE_LINE_SIZE_ROUNDUP(size) \ | |
50 | (RTE_CACHE_LINE_SIZE * ((size + RTE_CACHE_LINE_SIZE - 1) / RTE_CACHE_LINE_SIZE)) | |
51 | ||
52 | #define NUMA_NO_CONFIG 0xFF | |
53 | #define UMA_NO_CONFIG 0xFF | |
54 | ||
55 | typedef uint8_t lcoreid_t; | |
11fdf7f2 | 56 | typedef uint16_t portid_t; |
7c673cae FG |
57 | typedef uint16_t queueid_t; |
58 | typedef uint16_t streamid_t; | |
59 | ||
60 | #define MAX_QUEUE_ID ((1 << (sizeof(queueid_t) * 8)) - 1) | |
61 | ||
11fdf7f2 TL |
62 | #if defined RTE_LIBRTE_PMD_SOFTNIC |
63 | #define SOFTNIC 1 | |
64 | #else | |
65 | #define SOFTNIC 0 | |
66 | #endif | |
67 | ||
7c673cae FG |
68 | enum { |
69 | PORT_TOPOLOGY_PAIRED, | |
70 | PORT_TOPOLOGY_CHAINED, | |
71 | PORT_TOPOLOGY_LOOP, | |
72 | }; | |
73 | ||
9f95a23c TL |
74 | enum { |
75 | MP_ALLOC_NATIVE, /**< allocate and populate mempool natively */ | |
76 | MP_ALLOC_ANON, | |
77 | /**< allocate mempool natively, but populate using anonymous memory */ | |
78 | MP_ALLOC_XMEM, | |
79 | /**< allocate and populate mempool using anonymous memory */ | |
80 | MP_ALLOC_XMEM_HUGE | |
81 | /**< allocate and populate mempool using anonymous hugepage memory */ | |
82 | }; | |
83 | ||
7c673cae FG |
84 | #ifdef RTE_TEST_PMD_RECORD_BURST_STATS |
85 | /** | |
86 | * The data structure associated with RX and TX packet burst statistics | |
87 | * that are recorded for each forwarding stream. | |
88 | */ | |
89 | struct pkt_burst_stats { | |
90 | unsigned int pkt_burst_spread[MAX_PKT_BURST]; | |
91 | }; | |
92 | #endif | |
93 | ||
11fdf7f2 TL |
94 | /** Information for a given RSS type. */ |
95 | struct rss_type_info { | |
96 | const char *str; /**< Type name. */ | |
97 | uint64_t rss_type; /**< Type value. */ | |
98 | }; | |
99 | ||
100 | /** | |
101 | * RSS type information table. | |
102 | * | |
103 | * An entry with a NULL type name terminates the list. | |
104 | */ | |
105 | extern const struct rss_type_info rss_type_table[]; | |
106 | ||
7c673cae FG |
107 | /** |
108 | * The data structure associated with a forwarding stream between a receive | |
109 | * port/queue and a transmit port/queue. | |
110 | */ | |
111 | struct fwd_stream { | |
112 | /* "read-only" data */ | |
113 | portid_t rx_port; /**< port to poll for received packets */ | |
114 | queueid_t rx_queue; /**< RX queue to poll on "rx_port" */ | |
115 | portid_t tx_port; /**< forwarding port of received packets */ | |
116 | queueid_t tx_queue; /**< TX queue to send forwarded packets */ | |
117 | streamid_t peer_addr; /**< index of peer ethernet address of packets */ | |
118 | ||
119 | unsigned int retry_enabled; | |
120 | ||
121 | /* "read-write" results */ | |
9f95a23c TL |
122 | uint64_t rx_packets; /**< received packets */ |
123 | uint64_t tx_packets; /**< received packets transmitted */ | |
124 | uint64_t fwd_dropped; /**< received packets not forwarded */ | |
125 | uint64_t rx_bad_ip_csum ; /**< received packets has bad ip checksum */ | |
126 | uint64_t rx_bad_l4_csum ; /**< received packets has bad l4 checksum */ | |
127 | uint64_t rx_bad_outer_l4_csum; | |
128 | /**< received packets has bad outer l4 checksum */ | |
11fdf7f2 | 129 | unsigned int gro_times; /**< GRO operation times */ |
7c673cae FG |
130 | #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES |
131 | uint64_t core_cycles; /**< used for RX and TX processing */ | |
132 | #endif | |
133 | #ifdef RTE_TEST_PMD_RECORD_BURST_STATS | |
134 | struct pkt_burst_stats rx_burst_stats; | |
135 | struct pkt_burst_stats tx_burst_stats; | |
136 | #endif | |
137 | }; | |
138 | ||
11fdf7f2 TL |
139 | /** Descriptor for a single flow. */ |
140 | struct port_flow { | |
11fdf7f2 TL |
141 | struct port_flow *next; /**< Next flow in list. */ |
142 | struct port_flow *tmp; /**< Temporary linking. */ | |
143 | uint32_t id; /**< Flow rule ID. */ | |
144 | struct rte_flow *flow; /**< Opaque flow object returned by PMD. */ | |
9f95a23c TL |
145 | struct rte_flow_conv_rule rule; /* Saved flow rule description. */ |
146 | uint8_t data[]; /**< Storage for flow rule description */ | |
11fdf7f2 TL |
147 | }; |
148 | ||
149 | #ifdef SOFTNIC | |
150 | /** | |
151 | * The data structure associate with softnic port | |
152 | */ | |
153 | struct softnic_port { | |
154 | uint32_t default_tm_hierarchy_enable; /**< default tm hierarchy */ | |
155 | struct fwd_lcore **fwd_lcore_arg; /**< softnic fwd core parameters */ | |
156 | }; | |
157 | #endif | |
7c673cae FG |
158 | |
159 | /** | |
160 | * The data structure associated with each port. | |
161 | */ | |
162 | struct rte_port { | |
7c673cae FG |
163 | struct rte_eth_dev_info dev_info; /**< PCI info + driver name */ |
164 | struct rte_eth_conf dev_conf; /**< Port configuration. */ | |
165 | struct ether_addr eth_addr; /**< Port ethernet address */ | |
166 | struct rte_eth_stats stats; /**< Last port statistics */ | |
7c673cae | 167 | unsigned int socket_id; /**< For NUMA support */ |
11fdf7f2 | 168 | uint16_t parse_tunnel:1; /**< Parse internal headers */ |
7c673cae FG |
169 | uint16_t tso_segsz; /**< Segmentation offload MSS for non-tunneled packets. */ |
170 | uint16_t tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */ | |
171 | uint16_t tx_vlan_id;/**< The tag ID */ | |
172 | uint16_t tx_vlan_id_outer;/**< The outer tag ID */ | |
7c673cae FG |
173 | uint8_t tx_queue_stats_mapping_enabled; |
174 | uint8_t rx_queue_stats_mapping_enabled; | |
175 | volatile uint16_t port_status; /**< port started or not */ | |
9f95a23c | 176 | uint8_t need_setup; /**< port just attached */ |
7c673cae FG |
177 | uint8_t need_reconfig; /**< need reconfiguring port or not */ |
178 | uint8_t need_reconfig_queues; /**< need reconfiguring queues or not */ | |
179 | uint8_t rss_flag; /**< enable rss or not */ | |
180 | uint8_t dcb_flag; /**< enable dcb */ | |
11fdf7f2 TL |
181 | uint16_t nb_rx_desc[MAX_QUEUE_ID+1]; /**< per queue rx desc number */ |
182 | uint16_t nb_tx_desc[MAX_QUEUE_ID+1]; /**< per queue tx desc number */ | |
183 | struct rte_eth_rxconf rx_conf[MAX_QUEUE_ID+1]; /**< per queue rx configuration */ | |
184 | struct rte_eth_txconf tx_conf[MAX_QUEUE_ID+1]; /**< per queue tx configuration */ | |
7c673cae FG |
185 | struct ether_addr *mc_addr_pool; /**< pool of multicast addrs */ |
186 | uint32_t mc_addr_nb; /**< nb. of addr. in mc_addr_pool */ | |
187 | uint8_t slave_flag; /**< bonding slave port */ | |
11fdf7f2 | 188 | struct port_flow *flow_list; /**< Associated flows. */ |
9f95a23c TL |
189 | const struct rte_eth_rxtx_callback *rx_dump_cb[MAX_QUEUE_ID+1]; |
190 | const struct rte_eth_rxtx_callback *tx_dump_cb[MAX_QUEUE_ID+1]; | |
11fdf7f2 TL |
191 | #ifdef SOFTNIC |
192 | struct softnic_port softport; /**< softnic params */ | |
193 | #endif | |
9f95a23c TL |
194 | /**< metadata value to insert in Tx packets. */ |
195 | rte_be32_t tx_metadata; | |
196 | const struct rte_eth_rxtx_callback *tx_set_md_cb[MAX_QUEUE_ID+1]; | |
7c673cae FG |
197 | }; |
198 | ||
7c673cae FG |
199 | /** |
200 | * The data structure associated with each forwarding logical core. | |
201 | * The logical cores are internally numbered by a core index from 0 to | |
202 | * the maximum number of logical cores - 1. | |
203 | * The system CPU identifier of all logical cores are setup in a global | |
204 | * CPU id. configuration table. | |
205 | */ | |
206 | struct fwd_lcore { | |
11fdf7f2 | 207 | struct rte_gso_ctx gso_ctx; /**< GSO context */ |
7c673cae | 208 | struct rte_mempool *mbp; /**< The mbuf pool to use by this core */ |
11fdf7f2 | 209 | void *gro_ctx; /**< GRO context */ |
7c673cae FG |
210 | streamid_t stream_idx; /**< index of 1st stream in "fwd_streams" */ |
211 | streamid_t stream_nb; /**< number of streams in "fwd_streams" */ | |
212 | lcoreid_t cpuid_idx; /**< index of logical core in CPU id table */ | |
213 | queueid_t tx_queue; /**< TX queue to send forwarded packets */ | |
214 | volatile char stopped; /**< stop forwarding when set */ | |
215 | }; | |
216 | ||
217 | /* | |
218 | * Forwarding mode operations: | |
219 | * - IO forwarding mode (default mode) | |
220 | * Forwards packets unchanged. | |
221 | * | |
222 | * - MAC forwarding mode | |
223 | * Set the source and the destination Ethernet addresses of packets | |
224 | * before forwarding them. | |
225 | * | |
226 | * - IEEE1588 forwarding mode | |
227 | * Check that received IEEE1588 Precise Time Protocol (PTP) packets are | |
228 | * filtered and timestamped by the hardware. | |
229 | * Forwards packets unchanged on the same port. | |
230 | * Check that sent IEEE1588 PTP packets are timestamped by the hardware. | |
231 | */ | |
232 | typedef void (*port_fwd_begin_t)(portid_t pi); | |
233 | typedef void (*port_fwd_end_t)(portid_t pi); | |
234 | typedef void (*packet_fwd_t)(struct fwd_stream *fs); | |
235 | ||
236 | struct fwd_engine { | |
237 | const char *fwd_mode_name; /**< Forwarding mode name. */ | |
238 | port_fwd_begin_t port_fwd_begin; /**< NULL if nothing special to do. */ | |
239 | port_fwd_end_t port_fwd_end; /**< NULL if nothing special to do. */ | |
240 | packet_fwd_t packet_fwd; /**< Mandatory. */ | |
241 | }; | |
242 | ||
243 | #define BURST_TX_WAIT_US 1 | |
244 | #define BURST_TX_RETRIES 64 | |
245 | ||
246 | extern uint32_t burst_tx_delay_time; | |
247 | extern uint32_t burst_tx_retry_num; | |
248 | ||
249 | extern struct fwd_engine io_fwd_engine; | |
250 | extern struct fwd_engine mac_fwd_engine; | |
251 | extern struct fwd_engine mac_swap_engine; | |
252 | extern struct fwd_engine flow_gen_engine; | |
253 | extern struct fwd_engine rx_only_engine; | |
254 | extern struct fwd_engine tx_only_engine; | |
255 | extern struct fwd_engine csum_fwd_engine; | |
256 | extern struct fwd_engine icmp_echo_engine; | |
9f95a23c | 257 | extern struct fwd_engine noisy_vnf_engine; |
11fdf7f2 TL |
258 | #ifdef SOFTNIC |
259 | extern struct fwd_engine softnic_fwd_engine; | |
260 | #endif | |
7c673cae FG |
261 | #ifdef RTE_LIBRTE_IEEE1588 |
262 | extern struct fwd_engine ieee1588_fwd_engine; | |
263 | #endif | |
264 | ||
265 | extern struct fwd_engine * fwd_engines[]; /**< NULL terminated array. */ | |
266 | ||
9f95a23c TL |
267 | extern uint16_t mempool_flags; |
268 | ||
7c673cae FG |
269 | /** |
270 | * Forwarding Configuration | |
271 | * | |
272 | */ | |
273 | struct fwd_config { | |
274 | struct fwd_engine *fwd_eng; /**< Packet forwarding mode. */ | |
275 | streamid_t nb_fwd_streams; /**< Nb. of forward streams to process. */ | |
276 | lcoreid_t nb_fwd_lcores; /**< Nb. of logical cores to launch. */ | |
277 | portid_t nb_fwd_ports; /**< Nb. of ports involved. */ | |
278 | }; | |
279 | ||
280 | /** | |
281 | * DCB mode enable | |
282 | */ | |
283 | enum dcb_mode_enable | |
284 | { | |
285 | DCB_VT_ENABLED, | |
286 | DCB_ENABLED | |
287 | }; | |
288 | ||
289 | #define MAX_TX_QUEUE_STATS_MAPPINGS 1024 /* MAX_PORT of 32 @ 32 tx_queues/port */ | |
290 | #define MAX_RX_QUEUE_STATS_MAPPINGS 4096 /* MAX_PORT of 32 @ 128 rx_queues/port */ | |
291 | ||
292 | struct queue_stats_mappings { | |
11fdf7f2 | 293 | portid_t port_id; |
7c673cae FG |
294 | uint16_t queue_id; |
295 | uint8_t stats_counter_id; | |
296 | } __rte_cache_aligned; | |
297 | ||
298 | extern struct queue_stats_mappings tx_queue_stats_mappings_array[]; | |
299 | extern struct queue_stats_mappings rx_queue_stats_mappings_array[]; | |
300 | ||
301 | /* Assign both tx and rx queue stats mappings to the same default values */ | |
302 | extern struct queue_stats_mappings *tx_queue_stats_mappings; | |
303 | extern struct queue_stats_mappings *rx_queue_stats_mappings; | |
304 | ||
305 | extern uint16_t nb_tx_queue_stats_mappings; | |
306 | extern uint16_t nb_rx_queue_stats_mappings; | |
307 | ||
11fdf7f2 TL |
308 | extern uint8_t xstats_hide_zero; /**< Hide zero values for xstats display */ |
309 | ||
7c673cae FG |
310 | /* globals used for configuration */ |
311 | extern uint16_t verbose_level; /**< Drives messages being displayed, if any. */ | |
11fdf7f2 | 312 | extern int testpmd_logtype; /**< Log type for testpmd logs */ |
7c673cae FG |
313 | extern uint8_t interactive; |
314 | extern uint8_t auto_start; | |
11fdf7f2 TL |
315 | extern uint8_t tx_first; |
316 | extern char cmdline_filename[PATH_MAX]; /**< offline commands file */ | |
7c673cae FG |
317 | extern uint8_t numa_support; /**< set by "--numa" parameter */ |
318 | extern uint16_t port_topology; /**< set by "--port-topology" parameter */ | |
319 | extern uint8_t no_flush_rx; /**<set by "--no-flush-rx" parameter */ | |
11fdf7f2 | 320 | extern uint8_t flow_isolate_all; /**< set by "--flow-isolate-all */ |
9f95a23c TL |
321 | extern uint8_t mp_alloc_type; |
322 | /**< set by "--mp-anon" or "--mp-alloc" parameter */ | |
7c673cae FG |
323 | extern uint8_t no_link_check; /**<set by "--disable-link-check" parameter */ |
324 | extern volatile int test_done; /* stop packet forwarding when set to 1. */ | |
11fdf7f2 TL |
325 | extern uint8_t lsc_interrupt; /**< disabled by "--no-lsc-interrupt" parameter */ |
326 | extern uint8_t rmv_interrupt; /**< disabled by "--no-rmv-interrupt" parameter */ | |
327 | extern uint32_t event_print_mask; | |
328 | /**< set by "--print-event xxxx" and "--mask-event xxxx parameters */ | |
9f95a23c | 329 | extern bool setup_on_probe_event; /**< disabled by port setup-on iterator */ |
11fdf7f2 TL |
330 | extern uint8_t hot_plug; /**< enable by "--hot-plug" parameter */ |
331 | extern int do_mlockall; /**< set by "--mlockall" or "--no-mlockall" parameter */ | |
332 | ||
333 | #ifdef RTE_LIBRTE_IXGBE_BYPASS | |
7c673cae FG |
334 | extern uint32_t bypass_timeout; /**< Store the NIC bypass watchdog timeout */ |
335 | #endif | |
336 | ||
337 | /* | |
338 | * Store specified sockets on which memory pool to be used by ports | |
339 | * is allocated. | |
340 | */ | |
11fdf7f2 | 341 | extern uint8_t port_numa[RTE_MAX_ETHPORTS]; |
7c673cae FG |
342 | |
343 | /* | |
344 | * Store specified sockets on which RX ring to be used by ports | |
345 | * is allocated. | |
346 | */ | |
11fdf7f2 | 347 | extern uint8_t rxring_numa[RTE_MAX_ETHPORTS]; |
7c673cae FG |
348 | |
349 | /* | |
350 | * Store specified sockets on which TX ring to be used by ports | |
351 | * is allocated. | |
352 | */ | |
11fdf7f2 | 353 | extern uint8_t txring_numa[RTE_MAX_ETHPORTS]; |
7c673cae FG |
354 | |
355 | extern uint8_t socket_num; | |
356 | ||
357 | /* | |
358 | * Configuration of logical cores: | |
359 | * nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores | |
360 | */ | |
361 | extern lcoreid_t nb_lcores; /**< Number of logical cores probed at init time. */ | |
362 | extern lcoreid_t nb_cfg_lcores; /**< Number of configured logical cores. */ | |
363 | extern lcoreid_t nb_fwd_lcores; /**< Number of forwarding logical cores. */ | |
364 | extern unsigned int fwd_lcores_cpuids[RTE_MAX_LCORE]; | |
11fdf7f2 TL |
365 | extern unsigned int num_sockets; |
366 | extern unsigned int socket_ids[RTE_MAX_NUMA_NODES]; | |
7c673cae FG |
367 | |
368 | /* | |
369 | * Configuration of Ethernet ports: | |
370 | * nb_fwd_ports <= nb_cfg_ports <= nb_ports | |
371 | */ | |
372 | extern portid_t nb_ports; /**< Number of ethernet ports probed at init time. */ | |
373 | extern portid_t nb_cfg_ports; /**< Number of configured ports. */ | |
374 | extern portid_t nb_fwd_ports; /**< Number of forwarding ports. */ | |
375 | extern portid_t fwd_ports_ids[RTE_MAX_ETHPORTS]; | |
376 | extern struct rte_port *ports; | |
377 | ||
378 | extern struct rte_eth_rxmode rx_mode; | |
11fdf7f2 TL |
379 | extern struct rte_eth_txmode tx_mode; |
380 | ||
7c673cae FG |
381 | extern uint64_t rss_hf; |
382 | ||
383 | extern queueid_t nb_rxq; | |
384 | extern queueid_t nb_txq; | |
385 | ||
386 | extern uint16_t nb_rxd; | |
387 | extern uint16_t nb_txd; | |
388 | ||
389 | extern int16_t rx_free_thresh; | |
390 | extern int8_t rx_drop_en; | |
391 | extern int16_t tx_free_thresh; | |
392 | extern int16_t tx_rs_thresh; | |
7c673cae | 393 | |
9f95a23c TL |
394 | extern uint16_t noisy_tx_sw_bufsz; |
395 | extern uint16_t noisy_tx_sw_buf_flush_time; | |
396 | extern uint64_t noisy_lkup_mem_sz; | |
397 | extern uint64_t noisy_lkup_num_writes; | |
398 | extern uint64_t noisy_lkup_num_reads; | |
399 | extern uint64_t noisy_lkup_num_reads_writes; | |
400 | ||
7c673cae FG |
401 | extern uint8_t dcb_config; |
402 | extern uint8_t dcb_test; | |
7c673cae FG |
403 | |
404 | extern uint16_t mbuf_data_size; /**< Mbuf data space size. */ | |
405 | extern uint32_t param_total_num_mbufs; | |
406 | ||
11fdf7f2 TL |
407 | extern uint16_t stats_period; |
408 | ||
409 | #ifdef RTE_LIBRTE_LATENCY_STATS | |
410 | extern uint8_t latencystats_enabled; | |
411 | extern lcoreid_t latencystats_lcore_id; | |
412 | #endif | |
413 | ||
414 | #ifdef RTE_LIBRTE_BITRATE | |
415 | extern lcoreid_t bitrate_lcore_id; | |
416 | extern uint8_t bitrate_enabled; | |
417 | #endif | |
418 | ||
7c673cae FG |
419 | extern struct rte_fdir_conf fdir_conf; |
420 | ||
421 | /* | |
422 | * Configuration of packet segments used by the "txonly" processing engine. | |
423 | */ | |
424 | #define TXONLY_DEF_PACKET_LEN 64 | |
425 | extern uint16_t tx_pkt_length; /**< Length of TXONLY packet */ | |
426 | extern uint16_t tx_pkt_seg_lengths[RTE_MAX_SEGS_PER_PKT]; /**< Seg. lengths */ | |
427 | extern uint8_t tx_pkt_nb_segs; /**< Number of segments in TX packets */ | |
428 | ||
429 | enum tx_pkt_split { | |
430 | TX_PKT_SPLIT_OFF, | |
431 | TX_PKT_SPLIT_ON, | |
432 | TX_PKT_SPLIT_RND, | |
433 | }; | |
434 | ||
435 | extern enum tx_pkt_split tx_pkt_split; | |
436 | ||
9f95a23c TL |
437 | extern uint8_t txonly_multi_flow; |
438 | ||
7c673cae FG |
439 | extern uint16_t nb_pkt_per_burst; |
440 | extern uint16_t mb_mempool_cache; | |
441 | extern int8_t rx_pthresh; | |
442 | extern int8_t rx_hthresh; | |
443 | extern int8_t rx_wthresh; | |
444 | extern int8_t tx_pthresh; | |
445 | extern int8_t tx_hthresh; | |
446 | extern int8_t tx_wthresh; | |
447 | ||
9f95a23c TL |
448 | extern uint16_t tx_udp_src_port; |
449 | extern uint16_t tx_udp_dst_port; | |
450 | ||
451 | extern uint32_t tx_ip_src_addr; | |
452 | extern uint32_t tx_ip_dst_addr; | |
453 | ||
7c673cae FG |
454 | extern struct fwd_config cur_fwd_config; |
455 | extern struct fwd_engine *cur_fwd_eng; | |
456 | extern uint32_t retry_enabled; | |
457 | extern struct fwd_lcore **fwd_lcores; | |
458 | extern struct fwd_stream **fwd_streams; | |
459 | ||
11fdf7f2 TL |
460 | extern uint16_t vxlan_gpe_udp_port; /**< UDP port of tunnel VXLAN-GPE. */ |
461 | ||
7c673cae FG |
462 | extern portid_t nb_peer_eth_addrs; /**< Number of peer ethernet addresses. */ |
463 | extern struct ether_addr peer_eth_addrs[RTE_MAX_ETHPORTS]; | |
464 | ||
465 | extern uint32_t burst_tx_delay_time; /**< Burst tx delay time(us) for mac-retry. */ | |
466 | extern uint32_t burst_tx_retry_num; /**< Burst tx retry number for mac-retry. */ | |
467 | ||
11fdf7f2 TL |
468 | #define GRO_DEFAULT_ITEM_NUM_PER_FLOW 32 |
469 | #define GRO_DEFAULT_FLOW_NUM (RTE_GRO_MAX_BURST_ITEM_NUM / \ | |
470 | GRO_DEFAULT_ITEM_NUM_PER_FLOW) | |
471 | ||
472 | #define GRO_DEFAULT_FLUSH_CYCLES 1 | |
473 | #define GRO_MAX_FLUSH_CYCLES 4 | |
474 | ||
475 | struct gro_status { | |
476 | struct rte_gro_param param; | |
477 | uint8_t enable; | |
478 | }; | |
479 | extern struct gro_status gro_ports[RTE_MAX_ETHPORTS]; | |
480 | extern uint8_t gro_flush_cycles; | |
481 | ||
482 | #define GSO_MAX_PKT_BURST 2048 | |
483 | struct gso_status { | |
484 | uint8_t enable; | |
485 | }; | |
486 | extern struct gso_status gso_ports[RTE_MAX_ETHPORTS]; | |
487 | extern uint16_t gso_max_segment_size; | |
488 | ||
489 | /* VXLAN encap/decap parameters. */ | |
490 | struct vxlan_encap_conf { | |
491 | uint32_t select_ipv4:1; | |
492 | uint32_t select_vlan:1; | |
9f95a23c | 493 | uint32_t select_tos_ttl:1; |
11fdf7f2 TL |
494 | uint8_t vni[3]; |
495 | rte_be16_t udp_src; | |
496 | rte_be16_t udp_dst; | |
497 | rte_be32_t ipv4_src; | |
498 | rte_be32_t ipv4_dst; | |
499 | uint8_t ipv6_src[16]; | |
500 | uint8_t ipv6_dst[16]; | |
501 | rte_be16_t vlan_tci; | |
9f95a23c TL |
502 | uint8_t ip_tos; |
503 | uint8_t ip_ttl; | |
11fdf7f2 TL |
504 | uint8_t eth_src[ETHER_ADDR_LEN]; |
505 | uint8_t eth_dst[ETHER_ADDR_LEN]; | |
506 | }; | |
507 | struct vxlan_encap_conf vxlan_encap_conf; | |
508 | ||
509 | /* NVGRE encap/decap parameters. */ | |
510 | struct nvgre_encap_conf { | |
511 | uint32_t select_ipv4:1; | |
512 | uint32_t select_vlan:1; | |
513 | uint8_t tni[3]; | |
514 | rte_be32_t ipv4_src; | |
515 | rte_be32_t ipv4_dst; | |
516 | uint8_t ipv6_src[16]; | |
517 | uint8_t ipv6_dst[16]; | |
518 | rte_be16_t vlan_tci; | |
519 | uint8_t eth_src[ETHER_ADDR_LEN]; | |
520 | uint8_t eth_dst[ETHER_ADDR_LEN]; | |
521 | }; | |
522 | struct nvgre_encap_conf nvgre_encap_conf; | |
523 | ||
9f95a23c TL |
524 | /* L2 encap parameters. */ |
525 | struct l2_encap_conf { | |
526 | uint32_t select_ipv4:1; | |
527 | uint32_t select_vlan:1; | |
528 | rte_be16_t vlan_tci; | |
529 | uint8_t eth_src[ETHER_ADDR_LEN]; | |
530 | uint8_t eth_dst[ETHER_ADDR_LEN]; | |
531 | }; | |
532 | struct l2_encap_conf l2_encap_conf; | |
533 | ||
534 | /* L2 decap parameters. */ | |
535 | struct l2_decap_conf { | |
536 | uint32_t select_vlan:1; | |
537 | }; | |
538 | struct l2_decap_conf l2_decap_conf; | |
539 | ||
540 | /* MPLSoGRE encap parameters. */ | |
541 | struct mplsogre_encap_conf { | |
542 | uint32_t select_ipv4:1; | |
543 | uint32_t select_vlan:1; | |
544 | uint8_t label[3]; | |
545 | rte_be32_t ipv4_src; | |
546 | rte_be32_t ipv4_dst; | |
547 | uint8_t ipv6_src[16]; | |
548 | uint8_t ipv6_dst[16]; | |
549 | rte_be16_t vlan_tci; | |
550 | uint8_t eth_src[ETHER_ADDR_LEN]; | |
551 | uint8_t eth_dst[ETHER_ADDR_LEN]; | |
552 | }; | |
553 | struct mplsogre_encap_conf mplsogre_encap_conf; | |
554 | ||
555 | /* MPLSoGRE decap parameters. */ | |
556 | struct mplsogre_decap_conf { | |
557 | uint32_t select_ipv4:1; | |
558 | uint32_t select_vlan:1; | |
559 | }; | |
560 | struct mplsogre_decap_conf mplsogre_decap_conf; | |
561 | ||
562 | /* MPLSoUDP encap parameters. */ | |
563 | struct mplsoudp_encap_conf { | |
564 | uint32_t select_ipv4:1; | |
565 | uint32_t select_vlan:1; | |
566 | uint8_t label[3]; | |
567 | rte_be16_t udp_src; | |
568 | rte_be16_t udp_dst; | |
569 | rte_be32_t ipv4_src; | |
570 | rte_be32_t ipv4_dst; | |
571 | uint8_t ipv6_src[16]; | |
572 | uint8_t ipv6_dst[16]; | |
573 | rte_be16_t vlan_tci; | |
574 | uint8_t eth_src[ETHER_ADDR_LEN]; | |
575 | uint8_t eth_dst[ETHER_ADDR_LEN]; | |
576 | }; | |
577 | struct mplsoudp_encap_conf mplsoudp_encap_conf; | |
578 | ||
579 | /* MPLSoUDP decap parameters. */ | |
580 | struct mplsoudp_decap_conf { | |
581 | uint32_t select_ipv4:1; | |
582 | uint32_t select_vlan:1; | |
583 | }; | |
584 | struct mplsoudp_decap_conf mplsoudp_decap_conf; | |
585 | ||
7c673cae FG |
586 | static inline unsigned int |
587 | lcore_num(void) | |
588 | { | |
589 | unsigned int i; | |
590 | ||
591 | for (i = 0; i < RTE_MAX_LCORE; ++i) | |
592 | if (fwd_lcores_cpuids[i] == rte_lcore_id()) | |
593 | return i; | |
594 | ||
595 | rte_panic("lcore_id of current thread not found in fwd_lcores_cpuids\n"); | |
596 | } | |
597 | ||
598 | static inline struct fwd_lcore * | |
599 | current_fwd_lcore(void) | |
600 | { | |
601 | return fwd_lcores[lcore_num()]; | |
602 | } | |
603 | ||
604 | /* Mbuf Pools */ | |
605 | static inline void | |
606 | mbuf_poolname_build(unsigned int sock_id, char* mp_name, int name_size) | |
607 | { | |
608 | snprintf(mp_name, name_size, "mbuf_pool_socket_%u", sock_id); | |
609 | } | |
610 | ||
611 | static inline struct rte_mempool * | |
612 | mbuf_pool_find(unsigned int sock_id) | |
613 | { | |
614 | char pool_name[RTE_MEMPOOL_NAMESIZE]; | |
615 | ||
616 | mbuf_poolname_build(sock_id, pool_name, sizeof(pool_name)); | |
617 | return rte_mempool_lookup((const char *)pool_name); | |
618 | } | |
619 | ||
620 | /** | |
621 | * Read/Write operations on a PCI register of a port. | |
622 | */ | |
623 | static inline uint32_t | |
624 | port_pci_reg_read(struct rte_port *port, uint32_t reg_off) | |
625 | { | |
11fdf7f2 TL |
626 | const struct rte_pci_device *pci_dev; |
627 | const struct rte_bus *bus; | |
7c673cae FG |
628 | void *reg_addr; |
629 | uint32_t reg_v; | |
630 | ||
11fdf7f2 TL |
631 | if (!port->dev_info.device) { |
632 | printf("Invalid device\n"); | |
633 | return 0; | |
634 | } | |
635 | ||
636 | bus = rte_bus_find_by_device(port->dev_info.device); | |
637 | if (bus && !strcmp(bus->name, "pci")) { | |
638 | pci_dev = RTE_DEV_TO_PCI(port->dev_info.device); | |
639 | } else { | |
640 | printf("Not a PCI device\n"); | |
641 | return 0; | |
642 | } | |
643 | ||
644 | reg_addr = ((char *)pci_dev->mem_resource[0].addr + reg_off); | |
7c673cae FG |
645 | reg_v = *((volatile uint32_t *)reg_addr); |
646 | return rte_le_to_cpu_32(reg_v); | |
647 | } | |
648 | ||
649 | #define port_id_pci_reg_read(pt_id, reg_off) \ | |
650 | port_pci_reg_read(&ports[(pt_id)], (reg_off)) | |
651 | ||
652 | static inline void | |
653 | port_pci_reg_write(struct rte_port *port, uint32_t reg_off, uint32_t reg_v) | |
654 | { | |
11fdf7f2 TL |
655 | const struct rte_pci_device *pci_dev; |
656 | const struct rte_bus *bus; | |
7c673cae FG |
657 | void *reg_addr; |
658 | ||
11fdf7f2 TL |
659 | if (!port->dev_info.device) { |
660 | printf("Invalid device\n"); | |
661 | return; | |
662 | } | |
663 | ||
664 | bus = rte_bus_find_by_device(port->dev_info.device); | |
665 | if (bus && !strcmp(bus->name, "pci")) { | |
666 | pci_dev = RTE_DEV_TO_PCI(port->dev_info.device); | |
667 | } else { | |
668 | printf("Not a PCI device\n"); | |
669 | return; | |
670 | } | |
671 | ||
672 | reg_addr = ((char *)pci_dev->mem_resource[0].addr + reg_off); | |
7c673cae FG |
673 | *((volatile uint32_t *)reg_addr) = rte_cpu_to_le_32(reg_v); |
674 | } | |
675 | ||
676 | #define port_id_pci_reg_write(pt_id, reg_off, reg_value) \ | |
677 | port_pci_reg_write(&ports[(pt_id)], (reg_off), (reg_value)) | |
678 | ||
679 | /* Prototypes */ | |
680 | unsigned int parse_item_list(char* str, const char* item_name, | |
681 | unsigned int max_items, | |
682 | unsigned int *parsed_items, int check_unique_values); | |
683 | void launch_args_parse(int argc, char** argv); | |
11fdf7f2 | 684 | void cmdline_read_from_file(const char *filename); |
7c673cae FG |
685 | void prompt(void); |
686 | void prompt_exit(void); | |
687 | void nic_stats_display(portid_t port_id); | |
688 | void nic_stats_clear(portid_t port_id); | |
689 | void nic_xstats_display(portid_t port_id); | |
690 | void nic_xstats_clear(portid_t port_id); | |
691 | void nic_stats_mapping_display(portid_t port_id); | |
692 | void port_infos_display(portid_t port_id); | |
9f95a23c TL |
693 | void port_summary_display(portid_t port_id); |
694 | void port_summary_header_display(void); | |
11fdf7f2 | 695 | void port_offload_cap_display(portid_t port_id); |
7c673cae FG |
696 | void rx_queue_infos_display(portid_t port_idi, uint16_t queue_id); |
697 | void tx_queue_infos_display(portid_t port_idi, uint16_t queue_id); | |
698 | void fwd_lcores_config_display(void); | |
699 | void pkt_fwd_config_display(struct fwd_config *cfg); | |
700 | void rxtx_config_display(void); | |
701 | void fwd_config_setup(void); | |
702 | void set_def_fwd_config(void); | |
703 | void reconfig(portid_t new_port_id, unsigned socket_id); | |
704 | int init_fwd_streams(void); | |
11fdf7f2 TL |
705 | void update_fwd_ports(portid_t new_pid); |
706 | ||
707 | void set_fwd_eth_peer(portid_t port_id, char *peer_addr); | |
7c673cae FG |
708 | |
709 | void port_mtu_set(portid_t port_id, uint16_t mtu); | |
710 | void port_reg_bit_display(portid_t port_id, uint32_t reg_off, uint8_t bit_pos); | |
711 | void port_reg_bit_set(portid_t port_id, uint32_t reg_off, uint8_t bit_pos, | |
712 | uint8_t bit_v); | |
713 | void port_reg_bit_field_display(portid_t port_id, uint32_t reg_off, | |
714 | uint8_t bit1_pos, uint8_t bit2_pos); | |
715 | void port_reg_bit_field_set(portid_t port_id, uint32_t reg_off, | |
716 | uint8_t bit1_pos, uint8_t bit2_pos, uint32_t value); | |
717 | void port_reg_display(portid_t port_id, uint32_t reg_off); | |
718 | void port_reg_set(portid_t port_id, uint32_t reg_off, uint32_t value); | |
11fdf7f2 TL |
719 | int port_flow_validate(portid_t port_id, |
720 | const struct rte_flow_attr *attr, | |
721 | const struct rte_flow_item *pattern, | |
722 | const struct rte_flow_action *actions); | |
723 | int port_flow_create(portid_t port_id, | |
724 | const struct rte_flow_attr *attr, | |
725 | const struct rte_flow_item *pattern, | |
726 | const struct rte_flow_action *actions); | |
727 | int port_flow_destroy(portid_t port_id, uint32_t n, const uint32_t *rule); | |
728 | int port_flow_flush(portid_t port_id); | |
729 | int port_flow_query(portid_t port_id, uint32_t rule, | |
730 | const struct rte_flow_action *action); | |
731 | void port_flow_list(portid_t port_id, uint32_t n, const uint32_t *group); | |
732 | int port_flow_isolate(portid_t port_id, int set); | |
7c673cae FG |
733 | |
734 | void rx_ring_desc_display(portid_t port_id, queueid_t rxq_id, uint16_t rxd_id); | |
735 | void tx_ring_desc_display(portid_t port_id, queueid_t txq_id, uint16_t txd_id); | |
736 | ||
737 | int set_fwd_lcores_list(unsigned int *lcorelist, unsigned int nb_lc); | |
738 | int set_fwd_lcores_mask(uint64_t lcoremask); | |
739 | void set_fwd_lcores_number(uint16_t nb_lc); | |
740 | ||
741 | void set_fwd_ports_list(unsigned int *portlist, unsigned int nb_pt); | |
742 | void set_fwd_ports_mask(uint64_t portmask); | |
743 | void set_fwd_ports_number(uint16_t nb_pt); | |
744 | int port_is_forwarding(portid_t port_id); | |
745 | ||
746 | void rx_vlan_strip_set(portid_t port_id, int on); | |
747 | void rx_vlan_strip_set_on_queue(portid_t port_id, uint16_t queue_id, int on); | |
748 | ||
749 | void rx_vlan_filter_set(portid_t port_id, int on); | |
750 | void rx_vlan_all_filter_set(portid_t port_id, int on); | |
751 | int rx_vft_set(portid_t port_id, uint16_t vlan_id, int on); | |
752 | void vlan_extend_set(portid_t port_id, int on); | |
753 | void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type, | |
754 | uint16_t tp_id); | |
755 | void tx_vlan_set(portid_t port_id, uint16_t vlan_id); | |
756 | void tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer); | |
757 | void tx_vlan_reset(portid_t port_id); | |
758 | void tx_vlan_pvid_set(portid_t port_id, uint16_t vlan_id, int on); | |
759 | ||
760 | void set_qmap(portid_t port_id, uint8_t is_rx, uint16_t queue_id, uint8_t map_value); | |
761 | ||
11fdf7f2 TL |
762 | void set_xstats_hide_zero(uint8_t on_off); |
763 | ||
7c673cae FG |
764 | void set_verbose_level(uint16_t vb_level); |
765 | void set_tx_pkt_segments(unsigned *seg_lengths, unsigned nb_segs); | |
766 | void show_tx_pkt_segments(void); | |
767 | void set_tx_pkt_split(const char *name); | |
768 | void set_nb_pkt_per_burst(uint16_t pkt_burst); | |
769 | char *list_pkt_forwarding_modes(void); | |
770 | char *list_pkt_forwarding_retry_modes(void); | |
771 | void set_pkt_forwarding_mode(const char *fwd_mode); | |
772 | void start_packet_forwarding(int with_tx_first); | |
9f95a23c TL |
773 | void fwd_stats_display(void); |
774 | void fwd_stats_reset(void); | |
7c673cae FG |
775 | void stop_packet_forwarding(void); |
776 | void dev_set_link_up(portid_t pid); | |
777 | void dev_set_link_down(portid_t pid); | |
778 | void init_port_config(void); | |
779 | void set_port_slave_flag(portid_t slave_pid); | |
780 | void clear_port_slave_flag(portid_t slave_pid); | |
781 | uint8_t port_is_bonding_slave(portid_t slave_pid); | |
782 | ||
783 | int init_port_dcb_config(portid_t pid, enum dcb_mode_enable dcb_mode, | |
784 | enum rte_eth_nb_tcs num_tcs, | |
785 | uint8_t pfc_en); | |
786 | int start_port(portid_t pid); | |
787 | void stop_port(portid_t pid); | |
788 | void close_port(portid_t pid); | |
11fdf7f2 | 789 | void reset_port(portid_t pid); |
7c673cae | 790 | void attach_port(char *identifier); |
9f95a23c | 791 | void detach_port_device(portid_t port_id); |
7c673cae | 792 | int all_ports_stopped(void); |
11fdf7f2 | 793 | int port_is_stopped(portid_t port_id); |
7c673cae FG |
794 | int port_is_started(portid_t port_id); |
795 | void pmd_test_exit(void); | |
796 | void fdir_get_infos(portid_t port_id); | |
797 | void fdir_set_flex_mask(portid_t port_id, | |
798 | struct rte_eth_fdir_flex_mask *cfg); | |
799 | void fdir_set_flex_payload(portid_t port_id, | |
800 | struct rte_eth_flex_payload_cfg *cfg); | |
801 | void port_rss_reta_info(portid_t port_id, | |
802 | struct rte_eth_rss_reta_entry64 *reta_conf, | |
803 | uint16_t nb_entries); | |
804 | ||
805 | void set_vf_traffic(portid_t port_id, uint8_t is_rx, uint16_t vf, uint8_t on); | |
7c673cae FG |
806 | |
807 | int set_queue_rate_limit(portid_t port_id, uint16_t queue_idx, uint16_t rate); | |
808 | int set_vf_rate_limit(portid_t port_id, uint16_t vf, uint16_t rate, | |
809 | uint64_t q_msk); | |
810 | ||
9f95a23c | 811 | void port_rss_hash_conf_show(portid_t port_id, int show_rss_key); |
7c673cae FG |
812 | void port_rss_hash_key_update(portid_t port_id, char rss_type[], |
813 | uint8_t *hash_key, uint hash_key_len); | |
7c673cae FG |
814 | int rx_queue_id_is_invalid(queueid_t rxq_id); |
815 | int tx_queue_id_is_invalid(queueid_t txq_id); | |
11fdf7f2 TL |
816 | void setup_gro(const char *onoff, portid_t port_id); |
817 | void setup_gro_flush_cycles(uint8_t cycles); | |
818 | void show_gro(portid_t port_id); | |
819 | void setup_gso(const char *mode, portid_t port_id); | |
7c673cae FG |
820 | |
821 | /* Functions to manage the set of filtered Multicast MAC addresses */ | |
11fdf7f2 TL |
822 | void mcast_addr_add(portid_t port_id, struct ether_addr *mc_addr); |
823 | void mcast_addr_remove(portid_t port_id, struct ether_addr *mc_addr); | |
824 | void port_dcb_info_display(portid_t port_id); | |
825 | ||
826 | uint8_t *open_file(const char *file_path, uint32_t *size); | |
827 | int save_file(const char *file_path, uint8_t *buf, uint32_t size); | |
828 | int close_file(uint8_t *buf); | |
829 | ||
830 | void port_queue_region_info_display(portid_t port_id, void *buf); | |
7c673cae FG |
831 | |
832 | enum print_warning { | |
833 | ENABLED_WARN = 0, | |
834 | DISABLED_WARN | |
835 | }; | |
836 | int port_id_is_invalid(portid_t port_id, enum print_warning warning); | |
11fdf7f2 TL |
837 | void print_valid_ports(void); |
838 | int new_socket_id(unsigned int socket_id); | |
839 | ||
840 | queueid_t get_allowed_max_nb_rxq(portid_t *pid); | |
841 | int check_nb_rxq(queueid_t rxq); | |
842 | queueid_t get_allowed_max_nb_txq(portid_t *pid); | |
843 | int check_nb_txq(queueid_t txq); | |
7c673cae | 844 | |
9f95a23c TL |
845 | uint16_t dump_rx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], |
846 | uint16_t nb_pkts, __rte_unused uint16_t max_pkts, | |
847 | __rte_unused void *user_param); | |
848 | ||
849 | uint16_t dump_tx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], | |
850 | uint16_t nb_pkts, __rte_unused void *user_param); | |
851 | ||
852 | void add_rx_dump_callbacks(portid_t portid); | |
853 | void remove_rx_dump_callbacks(portid_t portid); | |
854 | void add_tx_dump_callbacks(portid_t portid); | |
855 | void remove_tx_dump_callbacks(portid_t portid); | |
856 | void configure_rxtx_dump_callbacks(uint16_t verbose); | |
857 | ||
858 | uint16_t tx_pkt_set_md(uint16_t port_id, __rte_unused uint16_t queue, | |
859 | struct rte_mbuf *pkts[], uint16_t nb_pkts, | |
860 | __rte_unused void *user_param); | |
861 | void add_tx_md_callback(portid_t portid); | |
862 | void remove_tx_md_callback(portid_t portid); | |
863 | ||
7c673cae FG |
864 | /* |
865 | * Work-around of a compilation error with ICC on invocations of the | |
866 | * rte_be_to_cpu_16() function. | |
867 | */ | |
868 | #ifdef __GCC__ | |
869 | #define RTE_BE_TO_CPU_16(be_16_v) rte_be_to_cpu_16((be_16_v)) | |
870 | #define RTE_CPU_TO_BE_16(cpu_16_v) rte_cpu_to_be_16((cpu_16_v)) | |
871 | #else | |
872 | #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN | |
873 | #define RTE_BE_TO_CPU_16(be_16_v) (be_16_v) | |
874 | #define RTE_CPU_TO_BE_16(cpu_16_v) (cpu_16_v) | |
875 | #else | |
876 | #define RTE_BE_TO_CPU_16(be_16_v) \ | |
877 | (uint16_t) ((((be_16_v) & 0xFF) << 8) | ((be_16_v) >> 8)) | |
878 | #define RTE_CPU_TO_BE_16(cpu_16_v) \ | |
879 | (uint16_t) ((((cpu_16_v) & 0xFF) << 8) | ((cpu_16_v) >> 8)) | |
880 | #endif | |
881 | #endif /* __GCC__ */ | |
882 | ||
11fdf7f2 TL |
883 | #define TESTPMD_LOG(level, fmt, args...) \ |
884 | rte_log(RTE_LOG_ ## level, testpmd_logtype, "testpmd: " fmt, ## args) | |
885 | ||
7c673cae | 886 | #endif /* _TESTPMD_H_ */ |