1
2
3
4
5#ifndef _TESTPMD_H_
6#define _TESTPMD_H_
7
8#include <stdbool.h>
9
10#include <rte_pci.h>
11#include <rte_bus_pci.h>
12#include <rte_gro.h>
13#include <rte_gso.h>
14#include <rte_os_shim.h>
15#include <cmdline.h>
16#include <sys/queue.h>
17
18#define RTE_PORT_ALL (~(portid_t)0x0)
19
20#define RTE_TEST_RX_DESC_MAX 2048
21#define RTE_TEST_TX_DESC_MAX 2048
22
23#define RTE_PORT_STOPPED (uint16_t)0
24#define RTE_PORT_STARTED (uint16_t)1
25#define RTE_PORT_CLOSED (uint16_t)2
26#define RTE_PORT_HANDLING (uint16_t)3
27
28
29
30
31
32#define RSS_HASH_KEY_LENGTH 64
33
34
35
36
37
38#define DEFAULT_MBUF_DATA_SIZE RTE_MBUF_DEFAULT_BUF_SIZE
39
40
41
42
43
44
45#define RTE_MAX_SEGS_PER_PKT 255
46
47
48
49
50
51
52#define MAX_SEGS_BUFFER_SPLIT 8
53
54
55#define MBUF_POOL_NAME_PFX "mb_pool"
56
57#define MAX_PKT_BURST 512
58#define DEF_PKT_BURST 32
59
60#define DEF_MBUF_CACHE 250
61
62#define RTE_CACHE_LINE_SIZE_ROUNDUP(size) \
63 (RTE_CACHE_LINE_SIZE * ((size + RTE_CACHE_LINE_SIZE - 1) / RTE_CACHE_LINE_SIZE))
64
65#define NUMA_NO_CONFIG 0xFF
66#define UMA_NO_CONFIG 0xFF
67
68typedef uint8_t lcoreid_t;
69typedef uint16_t portid_t;
70typedef uint16_t queueid_t;
71typedef uint16_t streamid_t;
72
73enum {
74 PORT_TOPOLOGY_PAIRED,
75 PORT_TOPOLOGY_CHAINED,
76 PORT_TOPOLOGY_LOOP,
77};
78
79enum {
80 MP_ALLOC_NATIVE,
81 MP_ALLOC_ANON,
82
83 MP_ALLOC_XMEM,
84
85 MP_ALLOC_XMEM_HUGE,
86
87 MP_ALLOC_XBUF
88
89};
90
91
92
93
94
95struct pkt_burst_stats {
96 unsigned int pkt_burst_spread[MAX_PKT_BURST];
97};
98
99
100struct rss_type_info {
101 const char *str;
102 uint64_t rss_type;
103};
104
105
106
107
108
109
110extern const struct rss_type_info rss_type_table[];
111
112
113
114
115
116
117extern char dynf_names[64][RTE_MBUF_DYN_NAMESIZE];
118
119
120
121
122
123struct fwd_stream {
124
125 portid_t rx_port;
126 queueid_t rx_queue;
127 portid_t tx_port;
128 queueid_t tx_queue;
129 streamid_t peer_addr;
130
131 unsigned int retry_enabled;
132
133
134 uint64_t rx_packets;
135 uint64_t tx_packets;
136 uint64_t fwd_dropped;
137 uint64_t rx_bad_ip_csum ;
138 uint64_t rx_bad_l4_csum ;
139 uint64_t rx_bad_outer_l4_csum;
140
141 uint64_t rx_bad_outer_ip_csum;
142
143 unsigned int gro_times;
144 uint64_t core_cycles;
145 struct pkt_burst_stats rx_burst_stats;
146 struct pkt_burst_stats tx_burst_stats;
147};
148
149
150
151
152
153enum age_action_context_type {
154 ACTION_AGE_CONTEXT_TYPE_FLOW,
155 ACTION_AGE_CONTEXT_TYPE_INDIRECT_ACTION,
156};
157
158
159struct port_flow {
160 struct port_flow *next;
161 struct port_flow *tmp;
162 uint32_t id;
163 struct rte_flow *flow;
164 struct rte_flow_conv_rule rule;
165 enum age_action_context_type age_type;
166 uint8_t data[];
167};
168
169
170struct port_indirect_action {
171 struct port_indirect_action *next;
172 uint32_t id;
173 enum rte_flow_action_type type;
174 struct rte_flow_action_handle *handle;
175 enum age_action_context_type age_type;
176};
177
178struct port_flow_tunnel {
179 LIST_ENTRY(port_flow_tunnel) chain;
180 struct rte_flow_action *pmd_actions;
181 struct rte_flow_item *pmd_items;
182 uint32_t id;
183 uint32_t num_pmd_actions;
184 uint32_t num_pmd_items;
185 struct rte_flow_tunnel tunnel;
186 struct rte_flow_action *actions;
187 struct rte_flow_item *items;
188};
189
190struct tunnel_ops {
191 uint32_t id;
192 char type[16];
193 uint32_t enabled:1;
194 uint32_t actions:1;
195 uint32_t items:1;
196};
197
198
199
200
201struct rte_port {
202 struct rte_eth_dev_info dev_info;
203 struct rte_eth_conf dev_conf;
204 struct rte_ether_addr eth_addr;
205 struct rte_eth_stats stats;
206 unsigned int socket_id;
207 uint16_t parse_tunnel:1;
208 uint16_t tso_segsz;
209 uint16_t tunnel_tso_segsz;
210 uint16_t tx_vlan_id;
211 uint16_t tx_vlan_id_outer;
212 volatile uint16_t port_status;
213 uint8_t need_setup;
214 uint8_t need_reconfig;
215 uint8_t need_reconfig_queues;
216 uint8_t rss_flag;
217 uint8_t dcb_flag;
218 uint16_t nb_rx_desc[RTE_MAX_QUEUES_PER_PORT+1];
219 uint16_t nb_tx_desc[RTE_MAX_QUEUES_PER_PORT+1];
220 struct rte_eth_rxconf rx_conf[RTE_MAX_QUEUES_PER_PORT+1];
221 struct rte_eth_txconf tx_conf[RTE_MAX_QUEUES_PER_PORT+1];
222 struct rte_ether_addr *mc_addr_pool;
223 uint32_t mc_addr_nb;
224 uint8_t slave_flag;
225 struct port_flow *flow_list;
226 struct port_indirect_action *actions_list;
227
228 LIST_HEAD(, port_flow_tunnel) flow_tunnel_list;
229 const struct rte_eth_rxtx_callback *rx_dump_cb[RTE_MAX_QUEUES_PER_PORT+1];
230 const struct rte_eth_rxtx_callback *tx_dump_cb[RTE_MAX_QUEUES_PER_PORT+1];
231
232 uint32_t tx_metadata;
233 const struct rte_eth_rxtx_callback *tx_set_md_cb[RTE_MAX_QUEUES_PER_PORT+1];
234
235 uint64_t mbuf_dynf;
236 const struct rte_eth_rxtx_callback *tx_set_dynf_cb[RTE_MAX_QUEUES_PER_PORT+1];
237};
238
239
240
241
242
243
244
245
246struct fwd_lcore {
247 struct rte_gso_ctx gso_ctx;
248 struct rte_mempool *mbp;
249 void *gro_ctx;
250 streamid_t stream_idx;
251 streamid_t stream_nb;
252 lcoreid_t cpuid_idx;
253 volatile char stopped;
254};
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271typedef void (*port_fwd_begin_t)(portid_t pi);
272typedef void (*port_fwd_end_t)(portid_t pi);
273typedef void (*packet_fwd_t)(struct fwd_stream *fs);
274
275struct fwd_engine {
276 const char *fwd_mode_name;
277 port_fwd_begin_t port_fwd_begin;
278 port_fwd_end_t port_fwd_end;
279 packet_fwd_t packet_fwd;
280};
281
282#define BURST_TX_WAIT_US 1
283#define BURST_TX_RETRIES 64
284
285extern uint32_t burst_tx_delay_time;
286extern uint32_t burst_tx_retry_num;
287
288extern struct fwd_engine io_fwd_engine;
289extern struct fwd_engine mac_fwd_engine;
290extern struct fwd_engine mac_swap_engine;
291extern struct fwd_engine flow_gen_engine;
292extern struct fwd_engine rx_only_engine;
293extern struct fwd_engine tx_only_engine;
294extern struct fwd_engine csum_fwd_engine;
295extern struct fwd_engine icmp_echo_engine;
296extern struct fwd_engine noisy_vnf_engine;
297extern struct fwd_engine five_tuple_swap_fwd_engine;
298#ifdef RTE_LIBRTE_IEEE1588
299extern struct fwd_engine ieee1588_fwd_engine;
300#endif
301
302extern struct fwd_engine * fwd_engines[];
303extern cmdline_parse_inst_t cmd_set_raw;
304extern cmdline_parse_inst_t cmd_show_set_raw;
305extern cmdline_parse_inst_t cmd_show_set_raw_all;
306
307extern uint16_t mempool_flags;
308
309
310
311
312
313struct fwd_config {
314 struct fwd_engine *fwd_eng;
315 streamid_t nb_fwd_streams;
316 lcoreid_t nb_fwd_lcores;
317 portid_t nb_fwd_ports;
318};
319
320
321
322
323enum dcb_mode_enable
324{
325 DCB_VT_ENABLED,
326 DCB_ENABLED
327};
328
329extern uint8_t xstats_hide_zero;
330
331
332extern uint8_t record_core_cycles;
333extern uint8_t record_burst_stats;
334extern uint16_t verbose_level;
335extern int testpmd_logtype;
336extern uint8_t interactive;
337extern uint8_t auto_start;
338extern uint8_t tx_first;
339extern char cmdline_filename[PATH_MAX];
340extern uint8_t numa_support;
341extern uint16_t port_topology;
342extern uint8_t no_flush_rx;
343extern uint8_t flow_isolate_all;
344extern uint8_t mp_alloc_type;
345
346extern uint32_t eth_link_speed;
347extern uint8_t no_link_check;
348extern uint8_t no_device_start;
349extern volatile int test_done;
350extern uint8_t lsc_interrupt;
351extern uint8_t rmv_interrupt;
352extern uint32_t event_print_mask;
353
354extern bool setup_on_probe_event;
355extern uint8_t hot_plug;
356extern int do_mlockall;
357extern uint8_t clear_ptypes;
358
359#ifdef RTE_LIBRTE_IXGBE_BYPASS
360extern uint32_t bypass_timeout;
361#endif
362
363
364
365
366
367extern uint8_t port_numa[RTE_MAX_ETHPORTS];
368
369
370
371
372
373extern uint8_t rxring_numa[RTE_MAX_ETHPORTS];
374
375
376
377
378
379extern uint8_t txring_numa[RTE_MAX_ETHPORTS];
380
381extern uint8_t socket_num;
382
383
384
385
386
387extern lcoreid_t nb_lcores;
388extern lcoreid_t nb_cfg_lcores;
389extern lcoreid_t nb_fwd_lcores;
390extern unsigned int fwd_lcores_cpuids[RTE_MAX_LCORE];
391extern unsigned int num_sockets;
392extern unsigned int socket_ids[RTE_MAX_NUMA_NODES];
393
394
395
396
397
398extern portid_t nb_ports;
399extern portid_t nb_cfg_ports;
400extern portid_t nb_fwd_ports;
401extern portid_t fwd_ports_ids[RTE_MAX_ETHPORTS];
402extern struct rte_port *ports;
403
404extern struct rte_eth_rxmode rx_mode;
405extern struct rte_eth_txmode tx_mode;
406
407extern uint64_t rss_hf;
408
409extern queueid_t nb_hairpinq;
410extern queueid_t nb_rxq;
411extern queueid_t nb_txq;
412
413extern uint16_t nb_rxd;
414extern uint16_t nb_txd;
415
416extern int16_t rx_free_thresh;
417extern int8_t rx_drop_en;
418extern int16_t tx_free_thresh;
419extern int16_t tx_rs_thresh;
420
421extern uint16_t noisy_tx_sw_bufsz;
422extern uint16_t noisy_tx_sw_buf_flush_time;
423extern uint64_t noisy_lkup_mem_sz;
424extern uint64_t noisy_lkup_num_writes;
425extern uint64_t noisy_lkup_num_reads;
426extern uint64_t noisy_lkup_num_reads_writes;
427
428extern uint8_t dcb_config;
429
430extern uint32_t mbuf_data_size_n;
431extern uint16_t mbuf_data_size[MAX_SEGS_BUFFER_SPLIT];
432
433extern uint32_t param_total_num_mbufs;
434
435extern uint16_t stats_period;
436
437extern uint16_t hairpin_mode;
438
439#ifdef RTE_LIB_LATENCYSTATS
440extern uint8_t latencystats_enabled;
441extern lcoreid_t latencystats_lcore_id;
442#endif
443
444#ifdef RTE_LIB_BITRATESTATS
445extern lcoreid_t bitrate_lcore_id;
446extern uint8_t bitrate_enabled;
447#endif
448
449extern struct rte_fdir_conf fdir_conf;
450
451
452
453
454
455extern uint16_t rx_pkt_seg_lengths[MAX_SEGS_BUFFER_SPLIT];
456extern uint8_t rx_pkt_nb_segs;
457extern uint16_t rx_pkt_seg_offsets[MAX_SEGS_BUFFER_SPLIT];
458extern uint8_t rx_pkt_nb_offs;
459
460
461
462
463#define TXONLY_DEF_PACKET_LEN 64
464extern uint16_t tx_pkt_length;
465extern uint16_t tx_pkt_seg_lengths[RTE_MAX_SEGS_PER_PKT];
466extern uint8_t tx_pkt_nb_segs;
467extern uint32_t tx_pkt_times_intra;
468extern uint32_t tx_pkt_times_inter;
469
470enum tx_pkt_split {
471 TX_PKT_SPLIT_OFF,
472 TX_PKT_SPLIT_ON,
473 TX_PKT_SPLIT_RND,
474};
475
476extern enum tx_pkt_split tx_pkt_split;
477
478extern uint8_t txonly_multi_flow;
479
480extern uint16_t nb_pkt_per_burst;
481extern uint16_t nb_pkt_flowgen_clones;
482extern uint16_t mb_mempool_cache;
483extern int8_t rx_pthresh;
484extern int8_t rx_hthresh;
485extern int8_t rx_wthresh;
486extern int8_t tx_pthresh;
487extern int8_t tx_hthresh;
488extern int8_t tx_wthresh;
489
490extern uint16_t tx_udp_src_port;
491extern uint16_t tx_udp_dst_port;
492
493extern uint32_t tx_ip_src_addr;
494extern uint32_t tx_ip_dst_addr;
495
496extern struct fwd_config cur_fwd_config;
497extern struct fwd_engine *cur_fwd_eng;
498extern uint32_t retry_enabled;
499extern struct fwd_lcore **fwd_lcores;
500extern struct fwd_stream **fwd_streams;
501
502extern uint16_t vxlan_gpe_udp_port;
503extern uint16_t geneve_udp_port;
504
505extern portid_t nb_peer_eth_addrs;
506extern struct rte_ether_addr peer_eth_addrs[RTE_MAX_ETHPORTS];
507
508extern uint32_t burst_tx_delay_time;
509extern uint32_t burst_tx_retry_num;
510
511#define GRO_DEFAULT_ITEM_NUM_PER_FLOW 32
512#define GRO_DEFAULT_FLOW_NUM (RTE_GRO_MAX_BURST_ITEM_NUM / \
513 GRO_DEFAULT_ITEM_NUM_PER_FLOW)
514
515#define GRO_DEFAULT_FLUSH_CYCLES 1
516#define GRO_MAX_FLUSH_CYCLES 4
517
518struct gro_status {
519 struct rte_gro_param param;
520 uint8_t enable;
521};
522extern struct gro_status gro_ports[RTE_MAX_ETHPORTS];
523extern uint8_t gro_flush_cycles;
524
525#define GSO_MAX_PKT_BURST 2048
526struct gso_status {
527 uint8_t enable;
528};
529extern struct gso_status gso_ports[RTE_MAX_ETHPORTS];
530extern uint16_t gso_max_segment_size;
531
532
533struct vxlan_encap_conf {
534 uint32_t select_ipv4:1;
535 uint32_t select_vlan:1;
536 uint32_t select_tos_ttl:1;
537 uint8_t vni[3];
538 rte_be16_t udp_src;
539 rte_be16_t udp_dst;
540 rte_be32_t ipv4_src;
541 rte_be32_t ipv4_dst;
542 uint8_t ipv6_src[16];
543 uint8_t ipv6_dst[16];
544 rte_be16_t vlan_tci;
545 uint8_t ip_tos;
546 uint8_t ip_ttl;
547 uint8_t eth_src[RTE_ETHER_ADDR_LEN];
548 uint8_t eth_dst[RTE_ETHER_ADDR_LEN];
549};
550
551extern struct vxlan_encap_conf vxlan_encap_conf;
552
553
554struct nvgre_encap_conf {
555 uint32_t select_ipv4:1;
556 uint32_t select_vlan:1;
557 uint8_t tni[3];
558 rte_be32_t ipv4_src;
559 rte_be32_t ipv4_dst;
560 uint8_t ipv6_src[16];
561 uint8_t ipv6_dst[16];
562 rte_be16_t vlan_tci;
563 uint8_t eth_src[RTE_ETHER_ADDR_LEN];
564 uint8_t eth_dst[RTE_ETHER_ADDR_LEN];
565};
566
567extern struct nvgre_encap_conf nvgre_encap_conf;
568
569
570struct l2_encap_conf {
571 uint32_t select_ipv4:1;
572 uint32_t select_vlan:1;
573 rte_be16_t vlan_tci;
574 uint8_t eth_src[RTE_ETHER_ADDR_LEN];
575 uint8_t eth_dst[RTE_ETHER_ADDR_LEN];
576};
577extern struct l2_encap_conf l2_encap_conf;
578
579
580struct l2_decap_conf {
581 uint32_t select_vlan:1;
582};
583extern struct l2_decap_conf l2_decap_conf;
584
585
586struct mplsogre_encap_conf {
587 uint32_t select_ipv4:1;
588 uint32_t select_vlan:1;
589 uint8_t label[3];
590 rte_be32_t ipv4_src;
591 rte_be32_t ipv4_dst;
592 uint8_t ipv6_src[16];
593 uint8_t ipv6_dst[16];
594 rte_be16_t vlan_tci;
595 uint8_t eth_src[RTE_ETHER_ADDR_LEN];
596 uint8_t eth_dst[RTE_ETHER_ADDR_LEN];
597};
598extern struct mplsogre_encap_conf mplsogre_encap_conf;
599
600
601struct mplsogre_decap_conf {
602 uint32_t select_ipv4:1;
603 uint32_t select_vlan:1;
604};
605extern struct mplsogre_decap_conf mplsogre_decap_conf;
606
607
608struct mplsoudp_encap_conf {
609 uint32_t select_ipv4:1;
610 uint32_t select_vlan:1;
611 uint8_t label[3];
612 rte_be16_t udp_src;
613 rte_be16_t udp_dst;
614 rte_be32_t ipv4_src;
615 rte_be32_t ipv4_dst;
616 uint8_t ipv6_src[16];
617 uint8_t ipv6_dst[16];
618 rte_be16_t vlan_tci;
619 uint8_t eth_src[RTE_ETHER_ADDR_LEN];
620 uint8_t eth_dst[RTE_ETHER_ADDR_LEN];
621};
622extern struct mplsoudp_encap_conf mplsoudp_encap_conf;
623
624
625struct mplsoudp_decap_conf {
626 uint32_t select_ipv4:1;
627 uint32_t select_vlan:1;
628};
629extern struct mplsoudp_decap_conf mplsoudp_decap_conf;
630
631extern enum rte_eth_rx_mq_mode rx_mq_mode;
632
633extern struct rte_flow_action_conntrack conntrack_context;
634
635static inline unsigned int
636lcore_num(void)
637{
638 unsigned int i;
639
640 for (i = 0; i < RTE_MAX_LCORE; ++i)
641 if (fwd_lcores_cpuids[i] == rte_lcore_id())
642 return i;
643
644 rte_panic("lcore_id of current thread not found in fwd_lcores_cpuids\n");
645}
646
647void
648parse_fwd_portlist(const char *port);
649
650static inline struct fwd_lcore *
651current_fwd_lcore(void)
652{
653 return fwd_lcores[lcore_num()];
654}
655
656
657static inline void
658mbuf_poolname_build(unsigned int sock_id, char *mp_name,
659 int name_size, uint16_t idx)
660{
661 if (!idx)
662 snprintf(mp_name, name_size,
663 MBUF_POOL_NAME_PFX "_%u", sock_id);
664 else
665 snprintf(mp_name, name_size,
666 MBUF_POOL_NAME_PFX "_%hu_%hu", (uint16_t)sock_id, idx);
667}
668
669static inline struct rte_mempool *
670mbuf_pool_find(unsigned int sock_id, uint16_t idx)
671{
672 char pool_name[RTE_MEMPOOL_NAMESIZE];
673
674 mbuf_poolname_build(sock_id, pool_name, sizeof(pool_name), idx);
675 return rte_mempool_lookup((const char *)pool_name);
676}
677
678
679
680
681static inline uint32_t
682port_pci_reg_read(struct rte_port *port, uint32_t reg_off)
683{
684 const struct rte_pci_device *pci_dev;
685 const struct rte_bus *bus;
686 void *reg_addr;
687 uint32_t reg_v;
688
689 if (!port->dev_info.device) {
690 fprintf(stderr, "Invalid device\n");
691 return 0;
692 }
693
694 bus = rte_bus_find_by_device(port->dev_info.device);
695 if (bus && !strcmp(bus->name, "pci")) {
696 pci_dev = RTE_DEV_TO_PCI(port->dev_info.device);
697 } else {
698 fprintf(stderr, "Not a PCI device\n");
699 return 0;
700 }
701
702 reg_addr = ((char *)pci_dev->mem_resource[0].addr + reg_off);
703 reg_v = *((volatile uint32_t *)reg_addr);
704 return rte_le_to_cpu_32(reg_v);
705}
706
707#define port_id_pci_reg_read(pt_id, reg_off) \
708 port_pci_reg_read(&ports[(pt_id)], (reg_off))
709
710static inline void
711port_pci_reg_write(struct rte_port *port, uint32_t reg_off, uint32_t reg_v)
712{
713 const struct rte_pci_device *pci_dev;
714 const struct rte_bus *bus;
715 void *reg_addr;
716
717 if (!port->dev_info.device) {
718 fprintf(stderr, "Invalid device\n");
719 return;
720 }
721
722 bus = rte_bus_find_by_device(port->dev_info.device);
723 if (bus && !strcmp(bus->name, "pci")) {
724 pci_dev = RTE_DEV_TO_PCI(port->dev_info.device);
725 } else {
726 fprintf(stderr, "Not a PCI device\n");
727 return;
728 }
729
730 reg_addr = ((char *)pci_dev->mem_resource[0].addr + reg_off);
731 *((volatile uint32_t *)reg_addr) = rte_cpu_to_le_32(reg_v);
732}
733
734#define port_id_pci_reg_write(pt_id, reg_off, reg_value) \
735 port_pci_reg_write(&ports[(pt_id)], (reg_off), (reg_value))
736
737static inline void
738get_start_cycles(uint64_t *start_tsc)
739{
740 if (record_core_cycles)
741 *start_tsc = rte_rdtsc();
742}
743
744static inline void
745get_end_cycles(struct fwd_stream *fs, uint64_t start_tsc)
746{
747 if (record_core_cycles)
748 fs->core_cycles += rte_rdtsc() - start_tsc;
749}
750
751static inline void
752inc_rx_burst_stats(struct fwd_stream *fs, uint16_t nb_rx)
753{
754 if (record_burst_stats)
755 fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
756}
757
758static inline void
759inc_tx_burst_stats(struct fwd_stream *fs, uint16_t nb_tx)
760{
761 if (record_burst_stats)
762 fs->tx_burst_stats.pkt_burst_spread[nb_tx]++;
763}
764
765
766unsigned int parse_item_list(const char *str, const char *item_name,
767 unsigned int max_items,
768 unsigned int *parsed_items, int check_unique_values);
769void launch_args_parse(int argc, char** argv);
770void cmdline_read_from_file(const char *filename);
771void prompt(void);
772void prompt_exit(void);
773void nic_stats_display(portid_t port_id);
774void nic_stats_clear(portid_t port_id);
775void nic_xstats_display(portid_t port_id);
776void nic_xstats_clear(portid_t port_id);
777void device_infos_display(const char *identifier);
778void port_infos_display(portid_t port_id);
779void port_summary_display(portid_t port_id);
780void port_eeprom_display(portid_t port_id);
781void port_module_eeprom_display(portid_t port_id);
782void port_summary_header_display(void);
783void rx_queue_infos_display(portid_t port_idi, uint16_t queue_id);
784void tx_queue_infos_display(portid_t port_idi, uint16_t queue_id);
785void fwd_lcores_config_display(void);
786void pkt_fwd_config_display(struct fwd_config *cfg);
787void rxtx_config_display(void);
788void fwd_config_setup(void);
789void set_def_fwd_config(void);
790void reconfig(portid_t new_port_id, unsigned socket_id);
791int init_fwd_streams(void);
792void update_fwd_ports(portid_t new_pid);
793
794void set_fwd_eth_peer(portid_t port_id, char *peer_addr);
795
796void port_mtu_set(portid_t port_id, uint16_t mtu);
797void port_reg_bit_display(portid_t port_id, uint32_t reg_off, uint8_t bit_pos);
798void port_reg_bit_set(portid_t port_id, uint32_t reg_off, uint8_t bit_pos,
799 uint8_t bit_v);
800void port_reg_bit_field_display(portid_t port_id, uint32_t reg_off,
801 uint8_t bit1_pos, uint8_t bit2_pos);
802void port_reg_bit_field_set(portid_t port_id, uint32_t reg_off,
803 uint8_t bit1_pos, uint8_t bit2_pos, uint32_t value);
804void port_reg_display(portid_t port_id, uint32_t reg_off);
805void port_reg_set(portid_t port_id, uint32_t reg_off, uint32_t value);
806int port_action_handle_create(portid_t port_id, uint32_t id,
807 const struct rte_flow_indir_action_conf *conf,
808 const struct rte_flow_action *action);
809int port_action_handle_destroy(portid_t port_id,
810 uint32_t n, const uint32_t *action);
811struct rte_flow_action_handle *port_action_handle_get_by_id(portid_t port_id,
812 uint32_t id);
813int port_action_handle_update(portid_t port_id, uint32_t id,
814 const struct rte_flow_action *action);
815int port_flow_validate(portid_t port_id,
816 const struct rte_flow_attr *attr,
817 const struct rte_flow_item *pattern,
818 const struct rte_flow_action *actions,
819 const struct tunnel_ops *tunnel_ops);
820int port_flow_create(portid_t port_id,
821 const struct rte_flow_attr *attr,
822 const struct rte_flow_item *pattern,
823 const struct rte_flow_action *actions,
824 const struct tunnel_ops *tunnel_ops);
825int port_action_handle_query(portid_t port_id, uint32_t id);
826void update_age_action_context(const struct rte_flow_action *actions,
827 struct port_flow *pf);
828int port_flow_destroy(portid_t port_id, uint32_t n, const uint32_t *rule);
829int port_flow_flush(portid_t port_id);
830int port_flow_dump(portid_t port_id, bool dump_all,
831 uint32_t rule, const char *file_name);
832int port_flow_query(portid_t port_id, uint32_t rule,
833 const struct rte_flow_action *action);
834void port_flow_list(portid_t port_id, uint32_t n, const uint32_t *group);
835void port_flow_aged(portid_t port_id, uint8_t destroy);
836const char *port_flow_tunnel_type(struct rte_flow_tunnel *tunnel);
837struct port_flow_tunnel *
838port_flow_locate_tunnel(uint16_t port_id, struct rte_flow_tunnel *tun);
839void port_flow_tunnel_list(portid_t port_id);
840void port_flow_tunnel_destroy(portid_t port_id, uint32_t tunnel_id);
841void port_flow_tunnel_create(portid_t port_id, const struct tunnel_ops *ops);
842int port_flow_isolate(portid_t port_id, int set);
843int port_meter_policy_add(portid_t port_id, uint32_t policy_id,
844 const struct rte_flow_action *actions);
845
846void rx_ring_desc_display(portid_t port_id, queueid_t rxq_id, uint16_t rxd_id);
847void tx_ring_desc_display(portid_t port_id, queueid_t txq_id, uint16_t txd_id);
848
849int set_fwd_lcores_list(unsigned int *lcorelist, unsigned int nb_lc);
850int set_fwd_lcores_mask(uint64_t lcoremask);
851void set_fwd_lcores_number(uint16_t nb_lc);
852
853void set_fwd_ports_list(unsigned int *portlist, unsigned int nb_pt);
854void set_fwd_ports_mask(uint64_t portmask);
855void set_fwd_ports_number(uint16_t nb_pt);
856int port_is_forwarding(portid_t port_id);
857
858void rx_vlan_strip_set(portid_t port_id, int on);
859void rx_vlan_strip_set_on_queue(portid_t port_id, uint16_t queue_id, int on);
860
861void rx_vlan_filter_set(portid_t port_id, int on);
862void rx_vlan_all_filter_set(portid_t port_id, int on);
863void rx_vlan_qinq_strip_set(portid_t port_id, int on);
864int rx_vft_set(portid_t port_id, uint16_t vlan_id, int on);
865void vlan_extend_set(portid_t port_id, int on);
866void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type,
867 uint16_t tp_id);
868void tx_vlan_set(portid_t port_id, uint16_t vlan_id);
869void tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer);
870void tx_vlan_reset(portid_t port_id);
871void tx_vlan_pvid_set(portid_t port_id, uint16_t vlan_id, int on);
872
873void set_qmap(portid_t port_id, uint8_t is_rx, uint16_t queue_id, uint8_t map_value);
874
875void set_xstats_hide_zero(uint8_t on_off);
876
877void set_record_core_cycles(uint8_t on_off);
878void set_record_burst_stats(uint8_t on_off);
879void set_verbose_level(uint16_t vb_level);
880void set_rx_pkt_segments(unsigned int *seg_lengths, unsigned int nb_segs);
881void show_rx_pkt_segments(void);
882void set_rx_pkt_offsets(unsigned int *seg_offsets, unsigned int nb_offs);
883void show_rx_pkt_offsets(void);
884void set_tx_pkt_segments(unsigned int *seg_lengths, unsigned int nb_segs);
885void show_tx_pkt_segments(void);
886void set_tx_pkt_times(unsigned int *tx_times);
887void show_tx_pkt_times(void);
888void set_tx_pkt_split(const char *name);
889int parse_fec_mode(const char *name, uint32_t *fec_capa);
890void show_fec_capability(uint32_t num, struct rte_eth_fec_capa *speed_fec_capa);
891void set_nb_pkt_per_burst(uint16_t pkt_burst);
892char *list_pkt_forwarding_modes(void);
893char *list_pkt_forwarding_retry_modes(void);
894void set_pkt_forwarding_mode(const char *fwd_mode);
895void start_packet_forwarding(int with_tx_first);
896void fwd_stats_display(void);
897void fwd_stats_reset(void);
898void stop_packet_forwarding(void);
899void dev_set_link_up(portid_t pid);
900void dev_set_link_down(portid_t pid);
901void init_port_config(void);
902void set_port_slave_flag(portid_t slave_pid);
903void clear_port_slave_flag(portid_t slave_pid);
904uint8_t port_is_bonding_slave(portid_t slave_pid);
905
906int init_port_dcb_config(portid_t pid, enum dcb_mode_enable dcb_mode,
907 enum rte_eth_nb_tcs num_tcs,
908 uint8_t pfc_en);
909int start_port(portid_t pid);
910void stop_port(portid_t pid);
911void close_port(portid_t pid);
912void reset_port(portid_t pid);
913void attach_port(char *identifier);
914void detach_devargs(char *identifier);
915void detach_port_device(portid_t port_id);
916int all_ports_stopped(void);
917int port_is_stopped(portid_t port_id);
918int port_is_started(portid_t port_id);
919void pmd_test_exit(void);
920#if defined(RTE_NET_I40E) || defined(RTE_NET_IXGBE)
921void fdir_get_infos(portid_t port_id);
922#endif
923void fdir_set_flex_mask(portid_t port_id,
924 struct rte_eth_fdir_flex_mask *cfg);
925void fdir_set_flex_payload(portid_t port_id,
926 struct rte_eth_flex_payload_cfg *cfg);
927void port_rss_reta_info(portid_t port_id,
928 struct rte_eth_rss_reta_entry64 *reta_conf,
929 uint16_t nb_entries);
930
931void set_vf_traffic(portid_t port_id, uint8_t is_rx, uint16_t vf, uint8_t on);
932
933int
934rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
935 uint16_t nb_rx_desc, unsigned int socket_id,
936 struct rte_eth_rxconf *rx_conf, struct rte_mempool *mp);
937
938int set_queue_rate_limit(portid_t port_id, uint16_t queue_idx, uint16_t rate);
939int set_vf_rate_limit(portid_t port_id, uint16_t vf, uint16_t rate,
940 uint64_t q_msk);
941
942void port_rss_hash_conf_show(portid_t port_id, int show_rss_key);
943void port_rss_hash_key_update(portid_t port_id, char rss_type[],
944 uint8_t *hash_key, uint8_t hash_key_len);
945int rx_queue_id_is_invalid(queueid_t rxq_id);
946int tx_queue_id_is_invalid(queueid_t txq_id);
947void setup_gro(const char *onoff, portid_t port_id);
948void setup_gro_flush_cycles(uint8_t cycles);
949void show_gro(portid_t port_id);
950void setup_gso(const char *mode, portid_t port_id);
951int eth_dev_info_get_print_err(uint16_t port_id,
952 struct rte_eth_dev_info *dev_info);
953void eth_set_promisc_mode(uint16_t port_id, int enable);
954void eth_set_allmulticast_mode(uint16_t port, int enable);
955int eth_link_get_nowait_print_err(uint16_t port_id, struct rte_eth_link *link);
956int eth_macaddr_get_print_err(uint16_t port_id,
957 struct rte_ether_addr *mac_addr);
958
959
960void show_macs(portid_t port_id);
961void show_mcast_macs(portid_t port_id);
962
963
964void mcast_addr_add(portid_t port_id, struct rte_ether_addr *mc_addr);
965void mcast_addr_remove(portid_t port_id, struct rte_ether_addr *mc_addr);
966void port_dcb_info_display(portid_t port_id);
967
968uint8_t *open_file(const char *file_path, uint32_t *size);
969int save_file(const char *file_path, uint8_t *buf, uint32_t size);
970int close_file(uint8_t *buf);
971
972void port_queue_region_info_display(portid_t port_id, void *buf);
973
974enum print_warning {
975 ENABLED_WARN = 0,
976 DISABLED_WARN
977};
978int port_id_is_invalid(portid_t port_id, enum print_warning warning);
979void print_valid_ports(void);
980int new_socket_id(unsigned int socket_id);
981
982queueid_t get_allowed_max_nb_rxq(portid_t *pid);
983int check_nb_rxq(queueid_t rxq);
984queueid_t get_allowed_max_nb_txq(portid_t *pid);
985int check_nb_txq(queueid_t txq);
986int check_nb_rxd(queueid_t rxd);
987int check_nb_txd(queueid_t txd);
988queueid_t get_allowed_max_nb_hairpinq(portid_t *pid);
989int check_nb_hairpinq(queueid_t hairpinq);
990
991uint16_t dump_rx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
992 uint16_t nb_pkts, __rte_unused uint16_t max_pkts,
993 __rte_unused void *user_param);
994
995uint16_t dump_tx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
996 uint16_t nb_pkts, __rte_unused void *user_param);
997
998void add_rx_dump_callbacks(portid_t portid);
999void remove_rx_dump_callbacks(portid_t portid);
1000void add_tx_dump_callbacks(portid_t portid);
1001void remove_tx_dump_callbacks(portid_t portid);
1002void configure_rxtx_dump_callbacks(uint16_t verbose);
1003
1004uint16_t tx_pkt_set_md(uint16_t port_id, __rte_unused uint16_t queue,
1005 struct rte_mbuf *pkts[], uint16_t nb_pkts,
1006 __rte_unused void *user_param);
1007void add_tx_md_callback(portid_t portid);
1008void remove_tx_md_callback(portid_t portid);
1009
1010uint16_t tx_pkt_set_dynf(uint16_t port_id, __rte_unused uint16_t queue,
1011 struct rte_mbuf *pkts[], uint16_t nb_pkts,
1012 __rte_unused void *user_param);
1013void add_tx_dynf_callback(portid_t portid);
1014void remove_tx_dynf_callback(portid_t portid);
1015int update_jumbo_frame_offload(portid_t portid);
1016
1017
1018
1019
1020
1021#ifdef __GCC__
1022#define RTE_BE_TO_CPU_16(be_16_v) rte_be_to_cpu_16((be_16_v))
1023#define RTE_CPU_TO_BE_16(cpu_16_v) rte_cpu_to_be_16((cpu_16_v))
1024#else
1025#if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
1026#define RTE_BE_TO_CPU_16(be_16_v) (be_16_v)
1027#define RTE_CPU_TO_BE_16(cpu_16_v) (cpu_16_v)
1028#else
1029#define RTE_BE_TO_CPU_16(be_16_v) \
1030 (uint16_t) ((((be_16_v) & 0xFF) << 8) | ((be_16_v) >> 8))
1031#define RTE_CPU_TO_BE_16(cpu_16_v) \
1032 (uint16_t) ((((cpu_16_v) & 0xFF) << 8) | ((cpu_16_v) >> 8))
1033#endif
1034#endif
1035
1036#define TESTPMD_LOG(level, fmt, args...) \
1037 rte_log(RTE_LOG_ ## level, testpmd_logtype, "testpmd: " fmt, ## args)
1038
1039#endif
1040