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 }; 135 136 /** 137 * The data structure associated with each forwarding logical core. 138 * The logical cores are internally numbered by a core index from 0 to 139 * the maximum number of logical cores - 1. 140 * The system CPU identifier of all logical cores are setup in a global 141 * CPU id. configuration table. 142 */ 143 struct fwd_lcore { 144 struct rte_mempool *mbp; /**< The mbuf pool to use by this core */ 145 streamid_t stream_idx; /**< index of 1st stream in "fwd_streams" */ 146 streamid_t stream_nb; /**< number of streams in "fwd_streams" */ 147 lcoreid_t cpuid_idx; /**< index of logical core in CPU id table */ 148 queueid_t tx_queue; /**< TX queue to send forwarded packets */ 149 volatile char stopped; /**< stop forwarding when set */ 150 }; 151 152 /* 153 * Forwarding mode operations: 154 * - IO forwarding mode (default mode) 155 * Forwards packets unchanged. 156 * 157 * - MAC forwarding mode 158 * Set the source and the destination Ethernet addresses of packets 159 * before forwarding them. 160 * 161 * - IEEE1588 forwarding mode 162 * Check that received IEEE1588 Precise Time Protocol (PTP) packets are 163 * filtered and timestamped by the hardware. 164 * Forwards packets unchanged on the same port. 165 * Check that sent IEEE1588 PTP packets are timestamped by the hardware. 166 */ 167 typedef void (*port_fwd_begin_t)(portid_t pi); 168 typedef void (*port_fwd_end_t)(portid_t pi); 169 typedef void (*packet_fwd_t)(struct fwd_stream *fs); 170 171 struct fwd_engine { 172 const char *fwd_mode_name; /**< Forwarding mode name. */ 173 port_fwd_begin_t port_fwd_begin; /**< NULL if nothing special to do. */ 174 port_fwd_end_t port_fwd_end; /**< NULL if nothing special to do. */ 175 packet_fwd_t packet_fwd; /**< Mandatory. */ 176 }; 177 178 extern struct fwd_engine io_fwd_engine; 179 extern struct fwd_engine mac_fwd_engine; 180 extern struct fwd_engine rx_only_engine; 181 extern struct fwd_engine tx_only_engine; 182 extern struct fwd_engine csum_fwd_engine; 183 #ifdef RTE_LIBRTE_IEEE1588 184 extern struct fwd_engine ieee1588_fwd_engine; 185 #endif 186 187 extern struct fwd_engine * fwd_engines[]; /**< NULL terminated array. */ 188 189 /** 190 * Forwarding Configuration 191 * 192 */ 193 struct fwd_config { 194 struct fwd_engine *fwd_eng; /**< Packet forwarding mode. */ 195 streamid_t nb_fwd_streams; /**< Nb. of forward streams to process. */ 196 lcoreid_t nb_fwd_lcores; /**< Nb. of logical cores to launch. */ 197 portid_t nb_fwd_ports; /**< Nb. of ports involved. */ 198 }; 199 200 /* globals used for configuration */ 201 extern uint16_t verbose_level; /**< Drives messages being displayed, if any. */ 202 extern uint8_t interactive; 203 extern uint8_t numa_support; /**< set by "--numa" parameter */ 204 extern uint16_t port_topology; /**< set by "--port-topology" parameter */ 205 206 /* 207 * Configuration of logical cores: 208 * nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores 209 */ 210 extern lcoreid_t nb_lcores; /**< Number of logical cores probed at init time. */ 211 extern lcoreid_t nb_cfg_lcores; /**< Number of configured logical cores. */ 212 extern lcoreid_t nb_fwd_lcores; /**< Number of forwarding logical cores. */ 213 extern unsigned int fwd_lcores_cpuids[RTE_MAX_LCORE]; 214 215 /* 216 * Configuration of Ethernet ports: 217 * nb_fwd_ports <= nb_cfg_ports <= nb_ports 218 */ 219 extern portid_t nb_ports; /**< Number of ethernet ports probed at init time. */ 220 extern portid_t nb_cfg_ports; /**< Number of configured ports. */ 221 extern portid_t nb_fwd_ports; /**< Number of forwarding ports. */ 222 extern portid_t fwd_ports_ids[RTE_MAX_ETHPORTS]; 223 extern struct rte_port *ports; 224 225 extern struct rte_eth_rxmode rx_mode; 226 extern uint16_t rss_hf; 227 228 extern queueid_t nb_rxq; 229 extern queueid_t nb_txq; 230 231 extern uint16_t nb_rxd; 232 extern uint16_t nb_txd; 233 234 extern uint16_t rx_free_thresh; 235 extern uint16_t tx_free_thresh; 236 extern uint16_t tx_rs_thresh; 237 238 extern uint16_t mbuf_data_size; /**< Mbuf data space size. */ 239 240 extern struct rte_fdir_conf fdir_conf; 241 242 /* 243 * Configuration of packet segments used by the "txonly" processing engine. 244 */ 245 #define TXONLY_DEF_PACKET_LEN 64 246 extern uint16_t tx_pkt_length; /**< Length of TXONLY packet */ 247 extern uint16_t tx_pkt_seg_lengths[RTE_MAX_SEGS_PER_PKT]; /**< Seg. lengths */ 248 extern uint8_t tx_pkt_nb_segs; /**< Number of segments in TX packets */ 249 250 extern uint16_t nb_pkt_per_burst; 251 extern uint16_t mb_mempool_cache; 252 extern struct rte_eth_thresh rx_thresh; 253 extern struct rte_eth_thresh tx_thresh; 254 255 extern struct fwd_config cur_fwd_config; 256 extern struct fwd_engine *cur_fwd_eng; 257 extern struct fwd_lcore **fwd_lcores; 258 extern struct fwd_stream **fwd_streams; 259 260 extern portid_t nb_peer_eth_addrs; /**< Number of peer ethernet addresses. */ 261 extern struct ether_addr peer_eth_addrs[RTE_MAX_ETHPORTS]; 262 263 static inline unsigned int 264 lcore_num(void) 265 { 266 unsigned int i; 267 268 for (i = 0; i < RTE_MAX_LCORE; ++i) 269 if (fwd_lcores_cpuids[i] == rte_lcore_id()) 270 return i; 271 272 rte_panic("lcore_id of current thread not found in fwd_lcores_cpuids\n"); 273 } 274 275 static inline struct fwd_lcore * 276 current_fwd_lcore(void) 277 { 278 return fwd_lcores[lcore_num()]; 279 } 280 281 /* Mbuf Pools */ 282 static inline void 283 mbuf_poolname_build(unsigned int sock_id, char* mp_name, int name_size) 284 { 285 rte_snprintf(mp_name, name_size, "mbuf_pool_socket_%u", sock_id); 286 } 287 288 static inline struct rte_mempool * 289 mbuf_pool_find(unsigned int sock_id) 290 { 291 char pool_name[RTE_MEMPOOL_NAMESIZE]; 292 293 mbuf_poolname_build(sock_id, pool_name, sizeof(pool_name)); 294 return (rte_mempool_lookup((const char *)pool_name)); 295 } 296 297 /** 298 * Read/Write operations on a PCI register of a port. 299 */ 300 static inline uint32_t 301 port_pci_reg_read(struct rte_port *port, uint32_t reg_off) 302 { 303 void *reg_addr; 304 uint32_t reg_v; 305 306 reg_addr = (void *)((char *)port->dev_info.pci_dev->mem_resource.addr + 307 reg_off); 308 reg_v = *((volatile uint32_t *)reg_addr); 309 return rte_le_to_cpu_32(reg_v); 310 } 311 312 #define port_id_pci_reg_read(pt_id, reg_off) \ 313 port_pci_reg_read(&ports[(pt_id)], (reg_off)) 314 315 static inline void 316 port_pci_reg_write(struct rte_port *port, uint32_t reg_off, uint32_t reg_v) 317 { 318 void *reg_addr; 319 320 reg_addr = (void *)((char *)port->dev_info.pci_dev->mem_resource.addr + 321 reg_off); 322 *((volatile uint32_t *)reg_addr) = rte_cpu_to_le_32(reg_v); 323 } 324 325 #define port_id_pci_reg_write(pt_id, reg_off, reg_value) \ 326 port_pci_reg_write(&ports[(pt_id)], (reg_off), (reg_value)) 327 328 /* Prototypes */ 329 void launch_args_parse(int argc, char** argv); 330 void prompt(void); 331 void nic_stats_display(portid_t port_id); 332 void nic_stats_clear(portid_t port_id); 333 void port_infos_display(portid_t port_id); 334 void fwd_lcores_config_display(void); 335 void fwd_config_display(void); 336 void rxtx_config_display(void); 337 void fwd_config_setup(void); 338 void set_def_fwd_config(void); 339 340 void port_reg_bit_display(portid_t port_id, uint32_t reg_off, uint8_t bit_pos); 341 void port_reg_bit_set(portid_t port_id, uint32_t reg_off, uint8_t bit_pos, 342 uint8_t bit_v); 343 void port_reg_bit_field_display(portid_t port_id, uint32_t reg_off, 344 uint8_t bit1_pos, uint8_t bit2_pos); 345 void port_reg_bit_field_set(portid_t port_id, uint32_t reg_off, 346 uint8_t bit1_pos, uint8_t bit2_pos, uint32_t value); 347 void port_reg_display(portid_t port_id, uint32_t reg_off); 348 void port_reg_set(portid_t port_id, uint32_t reg_off, uint32_t value); 349 350 void rx_ring_desc_display(portid_t port_id, queueid_t rxq_id, uint16_t rxd_id); 351 void tx_ring_desc_display(portid_t port_id, queueid_t txq_id, uint16_t txd_id); 352 353 void set_fwd_lcores_list(unsigned int *lcorelist, unsigned int nb_lc); 354 void set_fwd_lcores_mask(uint64_t lcoremask); 355 void set_fwd_lcores_number(uint16_t nb_lc); 356 357 void set_fwd_ports_list(unsigned int *portlist, unsigned int nb_pt); 358 void set_fwd_ports_mask(uint64_t portmask); 359 void set_fwd_ports_number(uint16_t nb_pt); 360 361 void rx_vlan_filter_set(portid_t port_id, uint16_t vlan_id, int on); 362 void rx_vlan_all_filter_set(portid_t port_id, int on); 363 void tx_vlan_set(portid_t port_id, uint16_t vlan_id); 364 void tx_vlan_reset(portid_t port_id); 365 366 void tx_cksum_set(portid_t port_id, uint8_t cksum_mask); 367 368 void set_verbose_level(uint16_t vb_level); 369 void set_tx_pkt_segments(unsigned *seg_lengths, unsigned nb_segs); 370 void set_nb_pkt_per_burst(uint16_t pkt_burst); 371 void set_pkt_forwarding_mode(const char *fwd_mode); 372 void start_packet_forwarding(int with_tx_first); 373 void stop_packet_forwarding(void); 374 void pmd_test_exit(void); 375 376 void fdir_add_signature_filter(portid_t port_id, uint8_t queue_id, 377 struct rte_fdir_filter *fdir_filter); 378 void fdir_update_signature_filter(portid_t port_id, uint8_t queue_id, 379 struct rte_fdir_filter *fdir_filter); 380 void fdir_remove_signature_filter(portid_t port_id, 381 struct rte_fdir_filter *fdir_filter); 382 void fdir_get_infos(portid_t port_id); 383 void fdir_add_perfect_filter(portid_t port_id, uint16_t soft_id, 384 uint8_t queue_id, uint8_t drop, 385 struct rte_fdir_filter *fdir_filter); 386 void fdir_update_perfect_filter(portid_t port_id, uint16_t soft_id, 387 uint8_t queue_id, uint8_t drop, 388 struct rte_fdir_filter *fdir_filter); 389 void fdir_remove_perfect_filter(portid_t port_id, uint16_t soft_id, 390 struct rte_fdir_filter *fdir_filter); 391 void fdir_set_masks(portid_t port_id, struct rte_fdir_masks *fdir_masks); 392 393 /* 394 * Work-around of a compilation error with ICC on invocations of the 395 * rte_be_to_cpu_16() function. 396 */ 397 #ifdef __GCC__ 398 #define RTE_BE_TO_CPU_16(be_16_v) rte_be_to_cpu_16((be_16_v)) 399 #define RTE_CPU_TO_BE_16(cpu_16_v) rte_cpu_to_be_16((cpu_16_v)) 400 #else 401 #ifdef __big_endian__ 402 #define RTE_BE_TO_CPU_16(be_16_v) (be_16_v) 403 #define RTE_CPU_TO_BE_16(cpu_16_v) (cpu_16_v) 404 #else 405 #define RTE_BE_TO_CPU_16(be_16_v) \ 406 (uint16_t) ((((be_16_v) & 0xFF) << 8) | ((be_16_v) >> 8)) 407 #define RTE_CPU_TO_BE_16(cpu_16_v) \ 408 (uint16_t) ((((cpu_16_v) & 0xFF) << 8) | ((cpu_16_v) >> 8)) 409 #endif 410 #endif /* __GCC__ */ 411 412 #endif /* _TESTPMD_H_ */ 413