]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /*- |
2 | * BSD LICENSE | |
3 | * | |
4 | * Copyright(c) 2010-2016 Intel Corporation. All rights reserved. | |
5 | * All rights reserved. | |
6 | * | |
7 | * Redistribution and use in source and binary forms, with or without | |
8 | * modification, are permitted provided that the following conditions | |
9 | * are met: | |
10 | * | |
11 | * * Redistributions of source code must retain the above copyright | |
12 | * notice, this list of conditions and the following disclaimer. | |
13 | * * Redistributions in binary form must reproduce the above copyright | |
14 | * notice, this list of conditions and the following disclaimer in | |
15 | * the documentation and/or other materials provided with the | |
16 | * distribution. | |
17 | * * Neither the name of Intel Corporation nor the names of its | |
18 | * contributors may be used to endorse or promote products derived | |
19 | * from this software without specific prior written permission. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
22 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
23 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
24 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
25 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
26 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
27 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
28 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
29 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
30 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
31 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
32 | */ | |
33 | ||
34 | #ifndef _TESTPMD_H_ | |
35 | #define _TESTPMD_H_ | |
36 | ||
37 | #define RTE_PORT_ALL (~(portid_t)0x0) | |
38 | ||
39 | #define RTE_TEST_RX_DESC_MAX 2048 | |
40 | #define RTE_TEST_TX_DESC_MAX 2048 | |
41 | ||
42 | #define RTE_PORT_STOPPED (uint16_t)0 | |
43 | #define RTE_PORT_STARTED (uint16_t)1 | |
44 | #define RTE_PORT_CLOSED (uint16_t)2 | |
45 | #define RTE_PORT_HANDLING (uint16_t)3 | |
46 | ||
47 | /* | |
48 | * It is used to allocate the memory for hash key. | |
49 | * The hash key size is NIC dependent. | |
50 | */ | |
51 | #define RSS_HASH_KEY_LENGTH 64 | |
52 | ||
53 | /* | |
54 | * Default size of the mbuf data buffer to receive standard 1518-byte | |
55 | * Ethernet frames in a mono-segment memory buffer. | |
56 | */ | |
57 | #define DEFAULT_MBUF_DATA_SIZE RTE_MBUF_DEFAULT_BUF_SIZE | |
58 | /**< Default size of mbuf data buffer. */ | |
59 | ||
60 | /* | |
61 | * The maximum number of segments per packet is used when creating | |
62 | * scattered transmit packets composed of a list of mbufs. | |
63 | */ | |
64 | #define RTE_MAX_SEGS_PER_PKT 255 /**< nb_segs is a 8-bit unsigned char. */ | |
65 | ||
66 | #define MAX_PKT_BURST 512 | |
67 | #define DEF_PKT_BURST 32 | |
68 | ||
69 | #define DEF_MBUF_CACHE 250 | |
70 | ||
71 | #define RTE_CACHE_LINE_SIZE_ROUNDUP(size) \ | |
72 | (RTE_CACHE_LINE_SIZE * ((size + RTE_CACHE_LINE_SIZE - 1) / RTE_CACHE_LINE_SIZE)) | |
73 | ||
74 | #define NUMA_NO_CONFIG 0xFF | |
75 | #define UMA_NO_CONFIG 0xFF | |
76 | ||
77 | typedef uint8_t lcoreid_t; | |
78 | typedef uint8_t portid_t; | |
79 | typedef uint16_t queueid_t; | |
80 | typedef uint16_t streamid_t; | |
81 | ||
82 | #define MAX_QUEUE_ID ((1 << (sizeof(queueid_t) * 8)) - 1) | |
83 | ||
84 | enum { | |
85 | PORT_TOPOLOGY_PAIRED, | |
86 | PORT_TOPOLOGY_CHAINED, | |
87 | PORT_TOPOLOGY_LOOP, | |
88 | }; | |
89 | ||
90 | #ifdef RTE_TEST_PMD_RECORD_BURST_STATS | |
91 | /** | |
92 | * The data structure associated with RX and TX packet burst statistics | |
93 | * that are recorded for each forwarding stream. | |
94 | */ | |
95 | struct pkt_burst_stats { | |
96 | unsigned int pkt_burst_spread[MAX_PKT_BURST]; | |
97 | }; | |
98 | #endif | |
99 | ||
100 | /** | |
101 | * The data structure associated with a forwarding stream between a receive | |
102 | * port/queue and a transmit port/queue. | |
103 | */ | |
104 | struct fwd_stream { | |
105 | /* "read-only" data */ | |
106 | portid_t rx_port; /**< port to poll for received packets */ | |
107 | queueid_t rx_queue; /**< RX queue to poll on "rx_port" */ | |
108 | portid_t tx_port; /**< forwarding port of received packets */ | |
109 | queueid_t tx_queue; /**< TX queue to send forwarded packets */ | |
110 | streamid_t peer_addr; /**< index of peer ethernet address of packets */ | |
111 | ||
112 | unsigned int retry_enabled; | |
113 | ||
114 | /* "read-write" results */ | |
115 | unsigned int rx_packets; /**< received packets */ | |
116 | unsigned int tx_packets; /**< received packets transmitted */ | |
117 | unsigned int fwd_dropped; /**< received packets not forwarded */ | |
118 | unsigned int rx_bad_ip_csum ; /**< received packets has bad ip checksum */ | |
119 | unsigned int rx_bad_l4_csum ; /**< received packets has bad l4 checksum */ | |
120 | #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES | |
121 | uint64_t core_cycles; /**< used for RX and TX processing */ | |
122 | #endif | |
123 | #ifdef RTE_TEST_PMD_RECORD_BURST_STATS | |
124 | struct pkt_burst_stats rx_burst_stats; | |
125 | struct pkt_burst_stats tx_burst_stats; | |
126 | #endif | |
127 | }; | |
128 | ||
129 | /** Offload IP checksum in csum forward engine */ | |
130 | #define TESTPMD_TX_OFFLOAD_IP_CKSUM 0x0001 | |
131 | /** Offload UDP checksum in csum forward engine */ | |
132 | #define TESTPMD_TX_OFFLOAD_UDP_CKSUM 0x0002 | |
133 | /** Offload TCP checksum in csum forward engine */ | |
134 | #define TESTPMD_TX_OFFLOAD_TCP_CKSUM 0x0004 | |
135 | /** Offload SCTP checksum in csum forward engine */ | |
136 | #define TESTPMD_TX_OFFLOAD_SCTP_CKSUM 0x0008 | |
137 | /** Offload outer IP checksum in csum forward engine for recognized tunnels */ | |
138 | #define TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM 0x0010 | |
139 | /** Parse tunnel in csum forward engine. If set, dissect tunnel headers | |
140 | * of rx packets. If not set, treat inner headers as payload. */ | |
141 | #define TESTPMD_TX_OFFLOAD_PARSE_TUNNEL 0x0020 | |
142 | /** Insert VLAN header in forward engine */ | |
143 | #define TESTPMD_TX_OFFLOAD_INSERT_VLAN 0x0040 | |
144 | /** Insert double VLAN header in forward engine */ | |
145 | #define TESTPMD_TX_OFFLOAD_INSERT_QINQ 0x0080 | |
146 | ||
147 | /** | |
148 | * The data structure associated with each port. | |
149 | */ | |
150 | struct rte_port { | |
151 | uint8_t enabled; /**< Port enabled or not */ | |
152 | struct rte_eth_dev_info dev_info; /**< PCI info + driver name */ | |
153 | struct rte_eth_conf dev_conf; /**< Port configuration. */ | |
154 | struct ether_addr eth_addr; /**< Port ethernet address */ | |
155 | struct rte_eth_stats stats; /**< Last port statistics */ | |
156 | uint64_t tx_dropped; /**< If no descriptor in TX ring */ | |
157 | struct fwd_stream *rx_stream; /**< Port RX stream, if unique */ | |
158 | struct fwd_stream *tx_stream; /**< Port TX stream, if unique */ | |
159 | unsigned int socket_id; /**< For NUMA support */ | |
160 | uint16_t tx_ol_flags;/**< TX Offload Flags (TESTPMD_TX_OFFLOAD...). */ | |
161 | uint16_t tso_segsz; /**< Segmentation offload MSS for non-tunneled packets. */ | |
162 | uint16_t tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */ | |
163 | uint16_t tx_vlan_id;/**< The tag ID */ | |
164 | uint16_t tx_vlan_id_outer;/**< The outer tag ID */ | |
165 | void *fwd_ctx; /**< Forwarding mode context */ | |
166 | uint64_t rx_bad_ip_csum; /**< rx pkts with bad ip checksum */ | |
167 | uint64_t rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */ | |
168 | uint8_t tx_queue_stats_mapping_enabled; | |
169 | uint8_t rx_queue_stats_mapping_enabled; | |
170 | volatile uint16_t port_status; /**< port started or not */ | |
171 | uint8_t need_reconfig; /**< need reconfiguring port or not */ | |
172 | uint8_t need_reconfig_queues; /**< need reconfiguring queues or not */ | |
173 | uint8_t rss_flag; /**< enable rss or not */ | |
174 | uint8_t dcb_flag; /**< enable dcb */ | |
175 | struct rte_eth_rxconf rx_conf; /**< rx configuration */ | |
176 | struct rte_eth_txconf tx_conf; /**< tx configuration */ | |
177 | struct ether_addr *mc_addr_pool; /**< pool of multicast addrs */ | |
178 | uint32_t mc_addr_nb; /**< nb. of addr. in mc_addr_pool */ | |
179 | uint8_t slave_flag; /**< bonding slave port */ | |
180 | }; | |
181 | ||
182 | extern portid_t __rte_unused | |
183 | find_next_port(portid_t p, struct rte_port *ports, int size); | |
184 | ||
185 | #define FOREACH_PORT(p, ports) \ | |
186 | for (p = find_next_port(0, ports, RTE_MAX_ETHPORTS); \ | |
187 | p < RTE_MAX_ETHPORTS; \ | |
188 | p = find_next_port(p + 1, ports, RTE_MAX_ETHPORTS)) | |
189 | ||
190 | /** | |
191 | * The data structure associated with each forwarding logical core. | |
192 | * The logical cores are internally numbered by a core index from 0 to | |
193 | * the maximum number of logical cores - 1. | |
194 | * The system CPU identifier of all logical cores are setup in a global | |
195 | * CPU id. configuration table. | |
196 | */ | |
197 | struct fwd_lcore { | |
198 | struct rte_mempool *mbp; /**< The mbuf pool to use by this core */ | |
199 | streamid_t stream_idx; /**< index of 1st stream in "fwd_streams" */ | |
200 | streamid_t stream_nb; /**< number of streams in "fwd_streams" */ | |
201 | lcoreid_t cpuid_idx; /**< index of logical core in CPU id table */ | |
202 | queueid_t tx_queue; /**< TX queue to send forwarded packets */ | |
203 | volatile char stopped; /**< stop forwarding when set */ | |
204 | }; | |
205 | ||
206 | /* | |
207 | * Forwarding mode operations: | |
208 | * - IO forwarding mode (default mode) | |
209 | * Forwards packets unchanged. | |
210 | * | |
211 | * - MAC forwarding mode | |
212 | * Set the source and the destination Ethernet addresses of packets | |
213 | * before forwarding them. | |
214 | * | |
215 | * - IEEE1588 forwarding mode | |
216 | * Check that received IEEE1588 Precise Time Protocol (PTP) packets are | |
217 | * filtered and timestamped by the hardware. | |
218 | * Forwards packets unchanged on the same port. | |
219 | * Check that sent IEEE1588 PTP packets are timestamped by the hardware. | |
220 | */ | |
221 | typedef void (*port_fwd_begin_t)(portid_t pi); | |
222 | typedef void (*port_fwd_end_t)(portid_t pi); | |
223 | typedef void (*packet_fwd_t)(struct fwd_stream *fs); | |
224 | ||
225 | struct fwd_engine { | |
226 | const char *fwd_mode_name; /**< Forwarding mode name. */ | |
227 | port_fwd_begin_t port_fwd_begin; /**< NULL if nothing special to do. */ | |
228 | port_fwd_end_t port_fwd_end; /**< NULL if nothing special to do. */ | |
229 | packet_fwd_t packet_fwd; /**< Mandatory. */ | |
230 | }; | |
231 | ||
232 | #define BURST_TX_WAIT_US 1 | |
233 | #define BURST_TX_RETRIES 64 | |
234 | ||
235 | extern uint32_t burst_tx_delay_time; | |
236 | extern uint32_t burst_tx_retry_num; | |
237 | ||
238 | extern struct fwd_engine io_fwd_engine; | |
239 | extern struct fwd_engine mac_fwd_engine; | |
240 | extern struct fwd_engine mac_swap_engine; | |
241 | extern struct fwd_engine flow_gen_engine; | |
242 | extern struct fwd_engine rx_only_engine; | |
243 | extern struct fwd_engine tx_only_engine; | |
244 | extern struct fwd_engine csum_fwd_engine; | |
245 | extern struct fwd_engine icmp_echo_engine; | |
246 | #ifdef RTE_LIBRTE_IEEE1588 | |
247 | extern struct fwd_engine ieee1588_fwd_engine; | |
248 | #endif | |
249 | ||
250 | extern struct fwd_engine * fwd_engines[]; /**< NULL terminated array. */ | |
251 | ||
252 | /** | |
253 | * Forwarding Configuration | |
254 | * | |
255 | */ | |
256 | struct fwd_config { | |
257 | struct fwd_engine *fwd_eng; /**< Packet forwarding mode. */ | |
258 | streamid_t nb_fwd_streams; /**< Nb. of forward streams to process. */ | |
259 | lcoreid_t nb_fwd_lcores; /**< Nb. of logical cores to launch. */ | |
260 | portid_t nb_fwd_ports; /**< Nb. of ports involved. */ | |
261 | }; | |
262 | ||
263 | /** | |
264 | * DCB mode enable | |
265 | */ | |
266 | enum dcb_mode_enable | |
267 | { | |
268 | DCB_VT_ENABLED, | |
269 | DCB_ENABLED | |
270 | }; | |
271 | ||
272 | #define MAX_TX_QUEUE_STATS_MAPPINGS 1024 /* MAX_PORT of 32 @ 32 tx_queues/port */ | |
273 | #define MAX_RX_QUEUE_STATS_MAPPINGS 4096 /* MAX_PORT of 32 @ 128 rx_queues/port */ | |
274 | ||
275 | struct queue_stats_mappings { | |
276 | uint8_t port_id; | |
277 | uint16_t queue_id; | |
278 | uint8_t stats_counter_id; | |
279 | } __rte_cache_aligned; | |
280 | ||
281 | extern struct queue_stats_mappings tx_queue_stats_mappings_array[]; | |
282 | extern struct queue_stats_mappings rx_queue_stats_mappings_array[]; | |
283 | ||
284 | /* Assign both tx and rx queue stats mappings to the same default values */ | |
285 | extern struct queue_stats_mappings *tx_queue_stats_mappings; | |
286 | extern struct queue_stats_mappings *rx_queue_stats_mappings; | |
287 | ||
288 | extern uint16_t nb_tx_queue_stats_mappings; | |
289 | extern uint16_t nb_rx_queue_stats_mappings; | |
290 | ||
291 | /* globals used for configuration */ | |
292 | extern uint16_t verbose_level; /**< Drives messages being displayed, if any. */ | |
293 | extern uint8_t interactive; | |
294 | extern uint8_t auto_start; | |
295 | extern uint8_t numa_support; /**< set by "--numa" parameter */ | |
296 | extern uint16_t port_topology; /**< set by "--port-topology" parameter */ | |
297 | extern uint8_t no_flush_rx; /**<set by "--no-flush-rx" parameter */ | |
298 | extern uint8_t mp_anon; /**< set by "--mp-anon" parameter */ | |
299 | extern uint8_t no_link_check; /**<set by "--disable-link-check" parameter */ | |
300 | extern volatile int test_done; /* stop packet forwarding when set to 1. */ | |
301 | ||
302 | #ifdef RTE_NIC_BYPASS | |
303 | extern uint32_t bypass_timeout; /**< Store the NIC bypass watchdog timeout */ | |
304 | #endif | |
305 | ||
306 | /* | |
307 | * Store specified sockets on which memory pool to be used by ports | |
308 | * is allocated. | |
309 | */ | |
310 | uint8_t port_numa[RTE_MAX_ETHPORTS]; | |
311 | ||
312 | /* | |
313 | * Store specified sockets on which RX ring to be used by ports | |
314 | * is allocated. | |
315 | */ | |
316 | uint8_t rxring_numa[RTE_MAX_ETHPORTS]; | |
317 | ||
318 | /* | |
319 | * Store specified sockets on which TX ring to be used by ports | |
320 | * is allocated. | |
321 | */ | |
322 | uint8_t txring_numa[RTE_MAX_ETHPORTS]; | |
323 | ||
324 | extern uint8_t socket_num; | |
325 | ||
326 | /* | |
327 | * Configuration of logical cores: | |
328 | * nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores | |
329 | */ | |
330 | extern lcoreid_t nb_lcores; /**< Number of logical cores probed at init time. */ | |
331 | extern lcoreid_t nb_cfg_lcores; /**< Number of configured logical cores. */ | |
332 | extern lcoreid_t nb_fwd_lcores; /**< Number of forwarding logical cores. */ | |
333 | extern unsigned int fwd_lcores_cpuids[RTE_MAX_LCORE]; | |
334 | extern unsigned max_socket; | |
335 | ||
336 | /* | |
337 | * Configuration of Ethernet ports: | |
338 | * nb_fwd_ports <= nb_cfg_ports <= nb_ports | |
339 | */ | |
340 | extern portid_t nb_ports; /**< Number of ethernet ports probed at init time. */ | |
341 | extern portid_t nb_cfg_ports; /**< Number of configured ports. */ | |
342 | extern portid_t nb_fwd_ports; /**< Number of forwarding ports. */ | |
343 | extern portid_t fwd_ports_ids[RTE_MAX_ETHPORTS]; | |
344 | extern struct rte_port *ports; | |
345 | ||
346 | extern struct rte_eth_rxmode rx_mode; | |
347 | extern uint64_t rss_hf; | |
348 | ||
349 | extern queueid_t nb_rxq; | |
350 | extern queueid_t nb_txq; | |
351 | ||
352 | extern uint16_t nb_rxd; | |
353 | extern uint16_t nb_txd; | |
354 | ||
355 | extern int16_t rx_free_thresh; | |
356 | extern int8_t rx_drop_en; | |
357 | extern int16_t tx_free_thresh; | |
358 | extern int16_t tx_rs_thresh; | |
359 | extern int32_t txq_flags; | |
360 | ||
361 | extern uint8_t dcb_config; | |
362 | extern uint8_t dcb_test; | |
363 | extern enum dcb_queue_mapping_mode dcb_q_mapping; | |
364 | ||
365 | extern uint16_t mbuf_data_size; /**< Mbuf data space size. */ | |
366 | extern uint32_t param_total_num_mbufs; | |
367 | ||
368 | extern struct rte_fdir_conf fdir_conf; | |
369 | ||
370 | /* | |
371 | * Configuration of packet segments used by the "txonly" processing engine. | |
372 | */ | |
373 | #define TXONLY_DEF_PACKET_LEN 64 | |
374 | extern uint16_t tx_pkt_length; /**< Length of TXONLY packet */ | |
375 | extern uint16_t tx_pkt_seg_lengths[RTE_MAX_SEGS_PER_PKT]; /**< Seg. lengths */ | |
376 | extern uint8_t tx_pkt_nb_segs; /**< Number of segments in TX packets */ | |
377 | ||
378 | enum tx_pkt_split { | |
379 | TX_PKT_SPLIT_OFF, | |
380 | TX_PKT_SPLIT_ON, | |
381 | TX_PKT_SPLIT_RND, | |
382 | }; | |
383 | ||
384 | extern enum tx_pkt_split tx_pkt_split; | |
385 | ||
386 | extern uint16_t nb_pkt_per_burst; | |
387 | extern uint16_t mb_mempool_cache; | |
388 | extern int8_t rx_pthresh; | |
389 | extern int8_t rx_hthresh; | |
390 | extern int8_t rx_wthresh; | |
391 | extern int8_t tx_pthresh; | |
392 | extern int8_t tx_hthresh; | |
393 | extern int8_t tx_wthresh; | |
394 | ||
395 | extern struct fwd_config cur_fwd_config; | |
396 | extern struct fwd_engine *cur_fwd_eng; | |
397 | extern uint32_t retry_enabled; | |
398 | extern struct fwd_lcore **fwd_lcores; | |
399 | extern struct fwd_stream **fwd_streams; | |
400 | ||
401 | extern portid_t nb_peer_eth_addrs; /**< Number of peer ethernet addresses. */ | |
402 | extern struct ether_addr peer_eth_addrs[RTE_MAX_ETHPORTS]; | |
403 | ||
404 | extern uint32_t burst_tx_delay_time; /**< Burst tx delay time(us) for mac-retry. */ | |
405 | extern uint32_t burst_tx_retry_num; /**< Burst tx retry number for mac-retry. */ | |
406 | ||
407 | static inline unsigned int | |
408 | lcore_num(void) | |
409 | { | |
410 | unsigned int i; | |
411 | ||
412 | for (i = 0; i < RTE_MAX_LCORE; ++i) | |
413 | if (fwd_lcores_cpuids[i] == rte_lcore_id()) | |
414 | return i; | |
415 | ||
416 | rte_panic("lcore_id of current thread not found in fwd_lcores_cpuids\n"); | |
417 | } | |
418 | ||
419 | static inline struct fwd_lcore * | |
420 | current_fwd_lcore(void) | |
421 | { | |
422 | return fwd_lcores[lcore_num()]; | |
423 | } | |
424 | ||
425 | /* Mbuf Pools */ | |
426 | static inline void | |
427 | mbuf_poolname_build(unsigned int sock_id, char* mp_name, int name_size) | |
428 | { | |
429 | snprintf(mp_name, name_size, "mbuf_pool_socket_%u", sock_id); | |
430 | } | |
431 | ||
432 | static inline struct rte_mempool * | |
433 | mbuf_pool_find(unsigned int sock_id) | |
434 | { | |
435 | char pool_name[RTE_MEMPOOL_NAMESIZE]; | |
436 | ||
437 | mbuf_poolname_build(sock_id, pool_name, sizeof(pool_name)); | |
438 | return rte_mempool_lookup((const char *)pool_name); | |
439 | } | |
440 | ||
441 | /** | |
442 | * Read/Write operations on a PCI register of a port. | |
443 | */ | |
444 | static inline uint32_t | |
445 | port_pci_reg_read(struct rte_port *port, uint32_t reg_off) | |
446 | { | |
447 | void *reg_addr; | |
448 | uint32_t reg_v; | |
449 | ||
450 | reg_addr = (void *) | |
451 | ((char *)port->dev_info.pci_dev->mem_resource[0].addr + | |
452 | reg_off); | |
453 | reg_v = *((volatile uint32_t *)reg_addr); | |
454 | return rte_le_to_cpu_32(reg_v); | |
455 | } | |
456 | ||
457 | #define port_id_pci_reg_read(pt_id, reg_off) \ | |
458 | port_pci_reg_read(&ports[(pt_id)], (reg_off)) | |
459 | ||
460 | static inline void | |
461 | port_pci_reg_write(struct rte_port *port, uint32_t reg_off, uint32_t reg_v) | |
462 | { | |
463 | void *reg_addr; | |
464 | ||
465 | reg_addr = (void *) | |
466 | ((char *)port->dev_info.pci_dev->mem_resource[0].addr + | |
467 | reg_off); | |
468 | *((volatile uint32_t *)reg_addr) = rte_cpu_to_le_32(reg_v); | |
469 | } | |
470 | ||
471 | #define port_id_pci_reg_write(pt_id, reg_off, reg_value) \ | |
472 | port_pci_reg_write(&ports[(pt_id)], (reg_off), (reg_value)) | |
473 | ||
474 | /* Prototypes */ | |
475 | unsigned int parse_item_list(char* str, const char* item_name, | |
476 | unsigned int max_items, | |
477 | unsigned int *parsed_items, int check_unique_values); | |
478 | void launch_args_parse(int argc, char** argv); | |
479 | void prompt(void); | |
480 | void prompt_exit(void); | |
481 | void nic_stats_display(portid_t port_id); | |
482 | void nic_stats_clear(portid_t port_id); | |
483 | void nic_xstats_display(portid_t port_id); | |
484 | void nic_xstats_clear(portid_t port_id); | |
485 | void nic_stats_mapping_display(portid_t port_id); | |
486 | void port_infos_display(portid_t port_id); | |
487 | void rx_queue_infos_display(portid_t port_idi, uint16_t queue_id); | |
488 | void tx_queue_infos_display(portid_t port_idi, uint16_t queue_id); | |
489 | void fwd_lcores_config_display(void); | |
490 | void pkt_fwd_config_display(struct fwd_config *cfg); | |
491 | void rxtx_config_display(void); | |
492 | void fwd_config_setup(void); | |
493 | void set_def_fwd_config(void); | |
494 | void reconfig(portid_t new_port_id, unsigned socket_id); | |
495 | int init_fwd_streams(void); | |
496 | ||
497 | void port_mtu_set(portid_t port_id, uint16_t mtu); | |
498 | void port_reg_bit_display(portid_t port_id, uint32_t reg_off, uint8_t bit_pos); | |
499 | void port_reg_bit_set(portid_t port_id, uint32_t reg_off, uint8_t bit_pos, | |
500 | uint8_t bit_v); | |
501 | void port_reg_bit_field_display(portid_t port_id, uint32_t reg_off, | |
502 | uint8_t bit1_pos, uint8_t bit2_pos); | |
503 | void port_reg_bit_field_set(portid_t port_id, uint32_t reg_off, | |
504 | uint8_t bit1_pos, uint8_t bit2_pos, uint32_t value); | |
505 | void port_reg_display(portid_t port_id, uint32_t reg_off); | |
506 | void port_reg_set(portid_t port_id, uint32_t reg_off, uint32_t value); | |
507 | ||
508 | void rx_ring_desc_display(portid_t port_id, queueid_t rxq_id, uint16_t rxd_id); | |
509 | void tx_ring_desc_display(portid_t port_id, queueid_t txq_id, uint16_t txd_id); | |
510 | ||
511 | int set_fwd_lcores_list(unsigned int *lcorelist, unsigned int nb_lc); | |
512 | int set_fwd_lcores_mask(uint64_t lcoremask); | |
513 | void set_fwd_lcores_number(uint16_t nb_lc); | |
514 | ||
515 | void set_fwd_ports_list(unsigned int *portlist, unsigned int nb_pt); | |
516 | void set_fwd_ports_mask(uint64_t portmask); | |
517 | void set_fwd_ports_number(uint16_t nb_pt); | |
518 | int port_is_forwarding(portid_t port_id); | |
519 | ||
520 | void rx_vlan_strip_set(portid_t port_id, int on); | |
521 | void rx_vlan_strip_set_on_queue(portid_t port_id, uint16_t queue_id, int on); | |
522 | ||
523 | void rx_vlan_filter_set(portid_t port_id, int on); | |
524 | void rx_vlan_all_filter_set(portid_t port_id, int on); | |
525 | int rx_vft_set(portid_t port_id, uint16_t vlan_id, int on); | |
526 | void vlan_extend_set(portid_t port_id, int on); | |
527 | void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type, | |
528 | uint16_t tp_id); | |
529 | void tx_vlan_set(portid_t port_id, uint16_t vlan_id); | |
530 | void tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer); | |
531 | void tx_vlan_reset(portid_t port_id); | |
532 | void tx_vlan_pvid_set(portid_t port_id, uint16_t vlan_id, int on); | |
533 | ||
534 | void set_qmap(portid_t port_id, uint8_t is_rx, uint16_t queue_id, uint8_t map_value); | |
535 | ||
536 | void set_verbose_level(uint16_t vb_level); | |
537 | void set_tx_pkt_segments(unsigned *seg_lengths, unsigned nb_segs); | |
538 | void show_tx_pkt_segments(void); | |
539 | void set_tx_pkt_split(const char *name); | |
540 | void set_nb_pkt_per_burst(uint16_t pkt_burst); | |
541 | char *list_pkt_forwarding_modes(void); | |
542 | char *list_pkt_forwarding_retry_modes(void); | |
543 | void set_pkt_forwarding_mode(const char *fwd_mode); | |
544 | void start_packet_forwarding(int with_tx_first); | |
545 | void stop_packet_forwarding(void); | |
546 | void dev_set_link_up(portid_t pid); | |
547 | void dev_set_link_down(portid_t pid); | |
548 | void init_port_config(void); | |
549 | void set_port_slave_flag(portid_t slave_pid); | |
550 | void clear_port_slave_flag(portid_t slave_pid); | |
551 | uint8_t port_is_bonding_slave(portid_t slave_pid); | |
552 | ||
553 | int init_port_dcb_config(portid_t pid, enum dcb_mode_enable dcb_mode, | |
554 | enum rte_eth_nb_tcs num_tcs, | |
555 | uint8_t pfc_en); | |
556 | int start_port(portid_t pid); | |
557 | void stop_port(portid_t pid); | |
558 | void close_port(portid_t pid); | |
559 | void attach_port(char *identifier); | |
560 | void detach_port(uint8_t port_id); | |
561 | int all_ports_stopped(void); | |
562 | int port_is_started(portid_t port_id); | |
563 | void pmd_test_exit(void); | |
564 | void fdir_get_infos(portid_t port_id); | |
565 | void fdir_set_flex_mask(portid_t port_id, | |
566 | struct rte_eth_fdir_flex_mask *cfg); | |
567 | void fdir_set_flex_payload(portid_t port_id, | |
568 | struct rte_eth_flex_payload_cfg *cfg); | |
569 | void port_rss_reta_info(portid_t port_id, | |
570 | struct rte_eth_rss_reta_entry64 *reta_conf, | |
571 | uint16_t nb_entries); | |
572 | ||
573 | void set_vf_traffic(portid_t port_id, uint8_t is_rx, uint16_t vf, uint8_t on); | |
574 | void set_vf_rx_vlan(portid_t port_id, uint16_t vlan_id, | |
575 | uint64_t vf_mask, uint8_t on); | |
576 | ||
577 | int set_queue_rate_limit(portid_t port_id, uint16_t queue_idx, uint16_t rate); | |
578 | int set_vf_rate_limit(portid_t port_id, uint16_t vf, uint16_t rate, | |
579 | uint64_t q_msk); | |
580 | ||
581 | void port_rss_hash_conf_show(portid_t port_id, char rss_info[], | |
582 | int show_rss_key); | |
583 | void port_rss_hash_key_update(portid_t port_id, char rss_type[], | |
584 | uint8_t *hash_key, uint hash_key_len); | |
585 | void get_syn_filter(uint8_t port_id); | |
586 | void get_ethertype_filter(uint8_t port_id, uint16_t index); | |
587 | void get_2tuple_filter(uint8_t port_id, uint16_t index); | |
588 | void get_5tuple_filter(uint8_t port_id, uint16_t index); | |
589 | int rx_queue_id_is_invalid(queueid_t rxq_id); | |
590 | int tx_queue_id_is_invalid(queueid_t txq_id); | |
591 | ||
592 | /* Functions to manage the set of filtered Multicast MAC addresses */ | |
593 | void mcast_addr_add(uint8_t port_id, struct ether_addr *mc_addr); | |
594 | void mcast_addr_remove(uint8_t port_id, struct ether_addr *mc_addr); | |
595 | void port_dcb_info_display(uint8_t port_id); | |
596 | ||
597 | enum print_warning { | |
598 | ENABLED_WARN = 0, | |
599 | DISABLED_WARN | |
600 | }; | |
601 | int port_id_is_invalid(portid_t port_id, enum print_warning warning); | |
602 | ||
603 | /* | |
604 | * Work-around of a compilation error with ICC on invocations of the | |
605 | * rte_be_to_cpu_16() function. | |
606 | */ | |
607 | #ifdef __GCC__ | |
608 | #define RTE_BE_TO_CPU_16(be_16_v) rte_be_to_cpu_16((be_16_v)) | |
609 | #define RTE_CPU_TO_BE_16(cpu_16_v) rte_cpu_to_be_16((cpu_16_v)) | |
610 | #else | |
611 | #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN | |
612 | #define RTE_BE_TO_CPU_16(be_16_v) (be_16_v) | |
613 | #define RTE_CPU_TO_BE_16(cpu_16_v) (cpu_16_v) | |
614 | #else | |
615 | #define RTE_BE_TO_CPU_16(be_16_v) \ | |
616 | (uint16_t) ((((be_16_v) & 0xFF) << 8) | ((be_16_v) >> 8)) | |
617 | #define RTE_CPU_TO_BE_16(cpu_16_v) \ | |
618 | (uint16_t) ((((cpu_16_v) & 0xFF) << 8) | ((cpu_16_v) >> 8)) | |
619 | #endif | |
620 | #endif /* __GCC__ */ | |
621 | ||
622 | #endif /* _TESTPMD_H_ */ |