1 /*- 2 * BSD LICENSE 3 * 4 * Copyright(c) 2010-2012 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 35 #ifndef _TESTPMD_H_ 36 #define _TESTPMD_H_ 37 38 /* icc on baremetal gives us troubles with function named 'main' */ 39 #ifdef RTE_EXEC_ENV_BAREMETAL 40 #define main _main 41 int main(int argc, char **argv); 42 #endif 43 44 /* 45 * Default size of the mbuf data buffer to receive standard 1518-byte 46 * Ethernet frames in a mono-segment memory buffer. 47 */ 48 #define DEFAULT_MBUF_DATA_SIZE 2048 /**< Default size of mbuf data buffer. */ 49 50 /* 51 * The maximum number of segments per packet is used when creating 52 * scattered transmit packets composed of a list of mbufs. 53 */ 54 #define RTE_MAX_SEGS_PER_PKT 255 /**< pkt.nb_segs is a 8-bit unsigned char. */ 55 56 #define MAX_PKT_BURST 512 57 #define DEF_PKT_BURST 16 58 59 #define CACHE_LINE_SIZE_ROUNDUP(size) \ 60 (CACHE_LINE_SIZE * ((size + CACHE_LINE_SIZE - 1) / CACHE_LINE_SIZE)) 61 62 typedef uint8_t lcoreid_t; 63 typedef uint8_t portid_t; 64 typedef uint16_t queueid_t; 65 typedef uint16_t streamid_t; 66 67 #define MAX_QUEUE_ID ((1 << (sizeof(queueid_t) * 8)) - 1) 68 69 enum { 70 PORT_TOPOLOGY_PAIRED, 71 PORT_TOPOLOGY_CHAINED 72 }; 73 74 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS 75 /** 76 * The data structure associated with RX and TX packet burst statistics 77 * that are recorded for each forwarding stream. 78 */ 79 struct pkt_burst_stats { 80 unsigned int pkt_burst_spread[MAX_PKT_BURST]; 81 }; 82 #endif 83 84 /** 85 * The data structure associated with a forwarding stream between a receive 86 * port/queue and a transmit port/queue. 87 */ 88 struct fwd_stream { 89 /* "read-only" data */ 90 portid_t rx_port; /**< port to poll for received packets */ 91 queueid_t rx_queue; /**< RX queue to poll on "rx_port" */ 92 portid_t tx_port; /**< forwarding port of received packets */ 93 queueid_t tx_queue; /**< TX queue to send forwarded packets */ 94 streamid_t peer_addr; /**< index of peer ethernet address of packets */ 95 96 /* "read-write" results */ 97 unsigned int rx_packets; /**< received packets */ 98 unsigned int tx_packets; /**< received packets transmitted */ 99 unsigned int fwd_dropped; /**< received packets not forwarded */ 100 unsigned int rx_bad_ip_csum ; /**< received packets has bad ip checksum */ 101 unsigned int rx_bad_l4_csum ; /**< received packets has bad l4 checksum */ 102 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES 103 uint64_t core_cycles; /**< used for RX and TX processing */ 104 #endif 105 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS 106 struct pkt_burst_stats rx_burst_stats; 107 struct pkt_burst_stats tx_burst_stats; 108 #endif 109 }; 110 111 /** 112 * The data structure associated with each port. 113 * tx_ol_flags is slightly different from ol_flags of rte_mbuf. 114 * Bit 0: Insert IP checksum 115 * Bit 1: Insert UDP checksum 116 * Bit 2: Insert TCP checksum 117 * Bit 3: Insert SCTP checksum 118 * Bit 11: Insert VLAN Label 119 */ 120 struct rte_port { 121 struct rte_eth_dev_info dev_info; /**< PCI info + driver name */ 122 struct rte_eth_conf dev_conf; /**< Port configuration. */ 123 struct ether_addr eth_addr; /**< Port ethernet address */ 124 struct rte_eth_stats stats; /**< Last port statistics */ 125 uint64_t tx_dropped; /**< If no descriptor in TX ring */ 126 struct fwd_stream *rx_stream; /**< Port RX stream, if unique */ 127 struct fwd_stream *tx_stream; /**< Port TX stream, if unique */ 128 unsigned int socket_id; /**< For NUMA support */ 129 uint16_t tx_ol_flags;/**< Offload Flags of TX packets. */ 130 uint16_t tx_vlan_id; /**< Tag Id. in TX VLAN packets. */ 131 void *fwd_ctx; /**< Forwarding mode context */ 132 uint64_t rx_bad_ip_csum; /**< rx pkts with bad ip checksum */ 133 uint64_t rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */ 134 uint8_t tx_queue_stats_mapping_enabled; 135 uint8_t rx_queue_stats_mapping_enabled; 136 }; 137 138 /** 139 * The data structure associated with each forwarding logical core. 140 * The logical cores are internally numbered by a core index from 0 to 141 * the maximum number of logical cores - 1. 142 * The system CPU identifier of all logical cores are setup in a global 143 * CPU id. configuration table. 144 */ 145 struct fwd_lcore { 146 struct rte_mempool *mbp; /**< The mbuf pool to use by this core */ 147 streamid_t stream_idx; /**< index of 1st stream in "fwd_streams" */ 148 streamid_t stream_nb; /**< number of streams in "fwd_streams" */ 149 lcoreid_t cpuid_idx; /**< index of logical core in CPU id table */ 150 queueid_t tx_queue; /**< TX queue to send forwarded packets */ 151 volatile char stopped; /**< stop forwarding when set */ 152 }; 153 154 /* 155 * Forwarding mode operations: 156 * - IO forwarding mode (default mode) 157 * Forwards packets unchanged. 158 * 159 * - MAC forwarding mode 160 * Set the source and the destination Ethernet addresses of packets 161 * before forwarding them. 162 * 163 * - IEEE1588 forwarding mode 164 * Check that received IEEE1588 Precise Time Protocol (PTP) packets are 165 * filtered and timestamped by the hardware. 166 * Forwards packets unchanged on the same port. 167 * Check that sent IEEE1588 PTP packets are timestamped by the hardware. 168 */ 169 typedef void (*port_fwd_begin_t)(portid_t pi); 170 typedef void (*port_fwd_end_t)(portid_t pi); 171 typedef void (*packet_fwd_t)(struct fwd_stream *fs); 172 173 struct fwd_engine { 174 const char *fwd_mode_name; /**< Forwarding mode name. */ 175 port_fwd_begin_t port_fwd_begin; /**< NULL if nothing special to do. */ 176 port_fwd_end_t port_fwd_end; /**< NULL if nothing special to do. */ 177 packet_fwd_t packet_fwd; /**< Mandatory. */ 178 }; 179 180 extern struct fwd_engine io_fwd_engine; 181 extern struct fwd_engine mac_fwd_engine; 182 extern struct fwd_engine rx_only_engine; 183 extern struct fwd_engine tx_only_engine; 184 extern struct fwd_engine csum_fwd_engine; 185 #ifdef RTE_LIBRTE_IEEE1588 186 extern struct fwd_engine ieee1588_fwd_engine; 187 #endif 188 189 extern struct fwd_engine * fwd_engines[]; /**< NULL terminated array. */ 190 191 /** 192 * Forwarding Configuration 193 * 194 */ 195 struct fwd_config { 196 struct fwd_engine *fwd_eng; /**< Packet forwarding mode. */ 197 streamid_t nb_fwd_streams; /**< Nb. of forward streams to process. */ 198 lcoreid_t nb_fwd_lcores; /**< Nb. of logical cores to launch. */ 199 portid_t nb_fwd_ports; /**< Nb. of ports involved. */ 200 }; 201 202 #define MAX_TX_QUEUE_STATS_MAPPINGS 1024 /* MAX_PORT of 32 @ 32 tx_queues/port */ 203 #define MAX_RX_QUEUE_STATS_MAPPINGS 4096 /* MAX_PORT of 32 @ 128 rx_queues/port */ 204 205 struct queue_stats_mappings { 206 uint8_t port_id; 207 uint16_t queue_id; 208 uint8_t stats_counter_id; 209 } __rte_cache_aligned; 210 211 extern struct queue_stats_mappings tx_queue_stats_mappings_array[]; 212 extern struct queue_stats_mappings rx_queue_stats_mappings_array[]; 213 214 /* Assign both tx and rx queue stats mappings to the same default values */ 215 extern struct queue_stats_mappings *tx_queue_stats_mappings; 216 extern struct queue_stats_mappings *rx_queue_stats_mappings; 217 218 extern uint16_t nb_tx_queue_stats_mappings; 219 extern uint16_t nb_rx_queue_stats_mappings; 220 221 /* globals used for configuration */ 222 extern uint16_t verbose_level; /**< Drives messages being displayed, if any. */ 223 extern uint8_t interactive; 224 extern uint8_t numa_support; /**< set by "--numa" parameter */ 225 extern uint16_t port_topology; /**< set by "--port-topology" parameter */ 226 227 /* 228 * Configuration of logical cores: 229 * nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores 230 */ 231 extern lcoreid_t nb_lcores; /**< Number of logical cores probed at init time. */ 232 extern lcoreid_t nb_cfg_lcores; /**< Number of configured logical cores. */ 233 extern lcoreid_t nb_fwd_lcores; /**< Number of forwarding logical cores. */ 234 extern unsigned int fwd_lcores_cpuids[RTE_MAX_LCORE]; 235 236 /* 237 * Configuration of Ethernet ports: 238 * nb_fwd_ports <= nb_cfg_ports <= nb_ports 239 */ 240 extern portid_t nb_ports; /**< Number of ethernet ports probed at init time. */ 241 extern portid_t nb_cfg_ports; /**< Number of configured ports. */ 242 extern portid_t nb_fwd_ports; /**< Number of forwarding ports. */ 243 extern portid_t fwd_ports_ids[RTE_MAX_ETHPORTS]; 244 extern struct rte_port *ports; 245 246 extern struct rte_eth_rxmode rx_mode; 247 extern uint16_t rss_hf; 248 249 extern queueid_t nb_rxq; 250 extern queueid_t nb_txq; 251 252 extern uint16_t nb_rxd; 253 extern uint16_t nb_txd; 254 255 extern uint16_t rx_free_thresh; 256 extern uint16_t tx_free_thresh; 257 extern uint16_t tx_rs_thresh; 258 259 extern uint16_t mbuf_data_size; /**< Mbuf data space size. */ 260 261 extern struct rte_fdir_conf fdir_conf; 262 263 /* 264 * Configuration of packet segments used by the "txonly" processing engine. 265 */ 266 #define TXONLY_DEF_PACKET_LEN 64 267 extern uint16_t tx_pkt_length; /**< Length of TXONLY packet */ 268 extern uint16_t tx_pkt_seg_lengths[RTE_MAX_SEGS_PER_PKT]; /**< Seg. lengths */ 269 extern uint8_t tx_pkt_nb_segs; /**< Number of segments in TX packets */ 270 271 extern uint16_t nb_pkt_per_burst; 272 extern uint16_t mb_mempool_cache; 273 extern struct rte_eth_thresh rx_thresh; 274 extern struct rte_eth_thresh tx_thresh; 275 276 extern struct fwd_config cur_fwd_config; 277 extern struct fwd_engine *cur_fwd_eng; 278 extern struct fwd_lcore **fwd_lcores; 279 extern struct fwd_stream **fwd_streams; 280 281 extern portid_t nb_peer_eth_addrs; /**< Number of peer ethernet addresses. */ 282 extern struct ether_addr peer_eth_addrs[RTE_MAX_ETHPORTS]; 283 284 static inline unsigned int 285 lcore_num(void) 286 { 287 unsigned int i; 288 289 for (i = 0; i < RTE_MAX_LCORE; ++i) 290 if (fwd_lcores_cpuids[i] == rte_lcore_id()) 291 return i; 292 293 rte_panic("lcore_id of current thread not found in fwd_lcores_cpuids\n"); 294 } 295 296 static inline struct fwd_lcore * 297 current_fwd_lcore(void) 298 { 299 return fwd_lcores[lcore_num()]; 300 } 301 302 /* Mbuf Pools */ 303 static inline void 304 mbuf_poolname_build(unsigned int sock_id, char* mp_name, int name_size) 305 { 306 rte_snprintf(mp_name, name_size, "mbuf_pool_socket_%u", sock_id); 307 } 308 309 static inline struct rte_mempool * 310 mbuf_pool_find(unsigned int sock_id) 311 { 312 char pool_name[RTE_MEMPOOL_NAMESIZE]; 313 314 mbuf_poolname_build(sock_id, pool_name, sizeof(pool_name)); 315 return (rte_mempool_lookup((const char *)pool_name)); 316 } 317 318 /** 319 * Read/Write operations on a PCI register of a port. 320 */ 321 static inline uint32_t 322 port_pci_reg_read(struct rte_port *port, uint32_t reg_off) 323 { 324 void *reg_addr; 325 uint32_t reg_v; 326 327 reg_addr = (void *)((char *)port->dev_info.pci_dev->mem_resource.addr + 328 reg_off); 329 reg_v = *((volatile uint32_t *)reg_addr); 330 return rte_le_to_cpu_32(reg_v); 331 } 332 333 #define port_id_pci_reg_read(pt_id, reg_off) \ 334 port_pci_reg_read(&ports[(pt_id)], (reg_off)) 335 336 static inline void 337 port_pci_reg_write(struct rte_port *port, uint32_t reg_off, uint32_t reg_v) 338 { 339 void *reg_addr; 340 341 reg_addr = (void *)((char *)port->dev_info.pci_dev->mem_resource.addr + 342 reg_off); 343 *((volatile uint32_t *)reg_addr) = rte_cpu_to_le_32(reg_v); 344 } 345 346 #define port_id_pci_reg_write(pt_id, reg_off, reg_value) \ 347 port_pci_reg_write(&ports[(pt_id)], (reg_off), (reg_value)) 348 349 /* Prototypes */ 350 void launch_args_parse(int argc, char** argv); 351 void prompt(void); 352 void nic_stats_display(portid_t port_id); 353 void nic_stats_clear(portid_t port_id); 354 void nic_stats_mapping_display(portid_t port_id); 355 void port_infos_display(portid_t port_id); 356 void fwd_lcores_config_display(void); 357 void fwd_config_display(void); 358 void rxtx_config_display(void); 359 void fwd_config_setup(void); 360 void set_def_fwd_config(void); 361 362 void port_reg_bit_display(portid_t port_id, uint32_t reg_off, uint8_t bit_pos); 363 void port_reg_bit_set(portid_t port_id, uint32_t reg_off, uint8_t bit_pos, 364 uint8_t bit_v); 365 void port_reg_bit_field_display(portid_t port_id, uint32_t reg_off, 366 uint8_t bit1_pos, uint8_t bit2_pos); 367 void port_reg_bit_field_set(portid_t port_id, uint32_t reg_off, 368 uint8_t bit1_pos, uint8_t bit2_pos, uint32_t value); 369 void port_reg_display(portid_t port_id, uint32_t reg_off); 370 void port_reg_set(portid_t port_id, uint32_t reg_off, uint32_t value); 371 372 void rx_ring_desc_display(portid_t port_id, queueid_t rxq_id, uint16_t rxd_id); 373 void tx_ring_desc_display(portid_t port_id, queueid_t txq_id, uint16_t txd_id); 374 375 void set_fwd_lcores_list(unsigned int *lcorelist, unsigned int nb_lc); 376 void set_fwd_lcores_mask(uint64_t lcoremask); 377 void set_fwd_lcores_number(uint16_t nb_lc); 378 379 void set_fwd_ports_list(unsigned int *portlist, unsigned int nb_pt); 380 void set_fwd_ports_mask(uint64_t portmask); 381 void set_fwd_ports_number(uint16_t nb_pt); 382 383 void rx_vlan_filter_set(portid_t port_id, uint16_t vlan_id, int on); 384 void rx_vlan_all_filter_set(portid_t port_id, int on); 385 void tx_vlan_set(portid_t port_id, uint16_t vlan_id); 386 void tx_vlan_reset(portid_t port_id); 387 388 389 void set_qmap(portid_t port_id, uint8_t is_rx, uint16_t queue_id, uint8_t map_value); 390 391 void tx_cksum_set(portid_t port_id, uint8_t cksum_mask); 392 393 void set_verbose_level(uint16_t vb_level); 394 void set_tx_pkt_segments(unsigned *seg_lengths, unsigned nb_segs); 395 void set_nb_pkt_per_burst(uint16_t pkt_burst); 396 void set_pkt_forwarding_mode(const char *fwd_mode); 397 void start_packet_forwarding(int with_tx_first); 398 void stop_packet_forwarding(void); 399 void pmd_test_exit(void); 400 401 void fdir_add_signature_filter(portid_t port_id, uint8_t queue_id, 402 struct rte_fdir_filter *fdir_filter); 403 void fdir_update_signature_filter(portid_t port_id, uint8_t queue_id, 404 struct rte_fdir_filter *fdir_filter); 405 void fdir_remove_signature_filter(portid_t port_id, 406 struct rte_fdir_filter *fdir_filter); 407 void fdir_get_infos(portid_t port_id); 408 void fdir_add_perfect_filter(portid_t port_id, uint16_t soft_id, 409 uint8_t queue_id, uint8_t drop, 410 struct rte_fdir_filter *fdir_filter); 411 void fdir_update_perfect_filter(portid_t port_id, uint16_t soft_id, 412 uint8_t queue_id, uint8_t drop, 413 struct rte_fdir_filter *fdir_filter); 414 void fdir_remove_perfect_filter(portid_t port_id, uint16_t soft_id, 415 struct rte_fdir_filter *fdir_filter); 416 void fdir_set_masks(portid_t port_id, struct rte_fdir_masks *fdir_masks); 417 418 /* 419 * Work-around of a compilation error with ICC on invocations of the 420 * rte_be_to_cpu_16() function. 421 */ 422 #ifdef __GCC__ 423 #define RTE_BE_TO_CPU_16(be_16_v) rte_be_to_cpu_16((be_16_v)) 424 #define RTE_CPU_TO_BE_16(cpu_16_v) rte_cpu_to_be_16((cpu_16_v)) 425 #else 426 #ifdef __big_endian__ 427 #define RTE_BE_TO_CPU_16(be_16_v) (be_16_v) 428 #define RTE_CPU_TO_BE_16(cpu_16_v) (cpu_16_v) 429 #else 430 #define RTE_BE_TO_CPU_16(be_16_v) \ 431 (uint16_t) ((((be_16_v) & 0xFF) << 8) | ((be_16_v) >> 8)) 432 #define RTE_CPU_TO_BE_16(cpu_16_v) \ 433 (uint16_t) ((((cpu_16_v) & 0xFF) << 8) | ((cpu_16_v) >> 8)) 434 #endif 435 #endif /* __GCC__ */ 436 437 #endif /* _TESTPMD_H_ */ 438