1*ed2a80fdSPablo de Lara /*- 2*ed2a80fdSPablo de Lara * BSD LICENSE 3*ed2a80fdSPablo de Lara * 4*ed2a80fdSPablo de Lara * Copyright(c) 2016-2017 Intel Corporation. All rights reserved. 5*ed2a80fdSPablo de Lara * All rights reserved. 6*ed2a80fdSPablo de Lara * 7*ed2a80fdSPablo de Lara * Redistribution and use in source and binary forms, with or without 8*ed2a80fdSPablo de Lara * modification, are permitted provided that the following conditions 9*ed2a80fdSPablo de Lara * are met: 10*ed2a80fdSPablo de Lara * 11*ed2a80fdSPablo de Lara * * Redistributions of source code must retain the above copyright 12*ed2a80fdSPablo de Lara * notice, this list of conditions and the following disclaimer. 13*ed2a80fdSPablo de Lara * * Redistributions in binary form must reproduce the above copyright 14*ed2a80fdSPablo de Lara * notice, this list of conditions and the following disclaimer in 15*ed2a80fdSPablo de Lara * the documentation and/or other materials provided with the 16*ed2a80fdSPablo de Lara * distribution. 17*ed2a80fdSPablo de Lara * * Neither the name of Intel Corporation nor the names of its 18*ed2a80fdSPablo de Lara * contributors may be used to endorse or promote products derived 19*ed2a80fdSPablo de Lara * from this software without specific prior written permission. 20*ed2a80fdSPablo de Lara * 21*ed2a80fdSPablo de Lara * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22*ed2a80fdSPablo de Lara * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23*ed2a80fdSPablo de Lara * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24*ed2a80fdSPablo de Lara * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25*ed2a80fdSPablo de Lara * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26*ed2a80fdSPablo de Lara * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27*ed2a80fdSPablo de Lara * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28*ed2a80fdSPablo de Lara * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29*ed2a80fdSPablo de Lara * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30*ed2a80fdSPablo de Lara * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31*ed2a80fdSPablo de Lara * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32*ed2a80fdSPablo de Lara */ 33*ed2a80fdSPablo de Lara 34*ed2a80fdSPablo de Lara #include <stdint.h> 35*ed2a80fdSPablo de Lara #include <stdio.h> 36*ed2a80fdSPablo de Lara #include <string.h> 37*ed2a80fdSPablo de Lara #include <sys/queue.h> 38*ed2a80fdSPablo de Lara #include <errno.h> 39*ed2a80fdSPablo de Lara #include <stdarg.h> 40*ed2a80fdSPablo de Lara #include <inttypes.h> 41*ed2a80fdSPablo de Lara 42*ed2a80fdSPablo de Lara #include <rte_common.h> 43*ed2a80fdSPablo de Lara #include <rte_memory.h> 44*ed2a80fdSPablo de Lara #include <rte_memzone.h> 45*ed2a80fdSPablo de Lara #include <rte_eal.h> 46*ed2a80fdSPablo de Lara #include <rte_byteorder.h> 47*ed2a80fdSPablo de Lara #include <rte_atomic.h> 48*ed2a80fdSPablo de Lara #include <rte_launch.h> 49*ed2a80fdSPablo de Lara #include <rte_per_lcore.h> 50*ed2a80fdSPablo de Lara #include <rte_lcore.h> 51*ed2a80fdSPablo de Lara #include <rte_branch_prediction.h> 52*ed2a80fdSPablo de Lara #include <rte_debug.h> 53*ed2a80fdSPablo de Lara #include <rte_ring.h> 54*ed2a80fdSPablo de Lara #include <rte_log.h> 55*ed2a80fdSPablo de Lara #include <rte_mempool.h> 56*ed2a80fdSPablo de Lara #include <rte_memcpy.h> 57*ed2a80fdSPablo de Lara #include <rte_mbuf.h> 58*ed2a80fdSPablo de Lara #include <rte_interrupts.h> 59*ed2a80fdSPablo de Lara #include <rte_pci.h> 60*ed2a80fdSPablo de Lara #include <rte_ether.h> 61*ed2a80fdSPablo de Lara #include <rte_ethdev.h> 62*ed2a80fdSPablo de Lara #include <rte_malloc.h> 63*ed2a80fdSPablo de Lara #include <rte_string_fns.h> 64*ed2a80fdSPablo de Lara #include <rte_cycles.h> 65*ed2a80fdSPablo de Lara #include <rte_efd.h> 66*ed2a80fdSPablo de Lara #include <rte_hash.h> 67*ed2a80fdSPablo de Lara 68*ed2a80fdSPablo de Lara #include "common.h" 69*ed2a80fdSPablo de Lara #include "args.h" 70*ed2a80fdSPablo de Lara #include "init.h" 71*ed2a80fdSPablo de Lara 72*ed2a80fdSPablo de Lara #define MBUFS_PER_NODE 1536 73*ed2a80fdSPablo de Lara #define MBUFS_PER_PORT 1536 74*ed2a80fdSPablo de Lara #define MBUF_CACHE_SIZE 512 75*ed2a80fdSPablo de Lara 76*ed2a80fdSPablo de Lara #define RTE_MP_RX_DESC_DEFAULT 512 77*ed2a80fdSPablo de Lara #define RTE_MP_TX_DESC_DEFAULT 512 78*ed2a80fdSPablo de Lara #define NODE_QUEUE_RINGSIZE 128 79*ed2a80fdSPablo de Lara 80*ed2a80fdSPablo de Lara #define NO_FLAGS 0 81*ed2a80fdSPablo de Lara 82*ed2a80fdSPablo de Lara /* The mbuf pool for packet rx */ 83*ed2a80fdSPablo de Lara struct rte_mempool *pktmbuf_pool; 84*ed2a80fdSPablo de Lara 85*ed2a80fdSPablo de Lara /* array of info/queues for nodes */ 86*ed2a80fdSPablo de Lara struct node *nodes; 87*ed2a80fdSPablo de Lara 88*ed2a80fdSPablo de Lara /* EFD table */ 89*ed2a80fdSPablo de Lara struct rte_efd_table *efd_table; 90*ed2a80fdSPablo de Lara 91*ed2a80fdSPablo de Lara /* Shared info between server and nodes */ 92*ed2a80fdSPablo de Lara struct shared_info *info; 93*ed2a80fdSPablo de Lara 94*ed2a80fdSPablo de Lara /** 95*ed2a80fdSPablo de Lara * Initialise the mbuf pool for packet reception for the NIC, and any other 96*ed2a80fdSPablo de Lara * buffer pools needed by the app - currently none. 97*ed2a80fdSPablo de Lara */ 98*ed2a80fdSPablo de Lara static int 99*ed2a80fdSPablo de Lara init_mbuf_pools(void) 100*ed2a80fdSPablo de Lara { 101*ed2a80fdSPablo de Lara const unsigned int num_mbufs = (num_nodes * MBUFS_PER_NODE) + 102*ed2a80fdSPablo de Lara (info->num_ports * MBUFS_PER_PORT); 103*ed2a80fdSPablo de Lara 104*ed2a80fdSPablo de Lara /* 105*ed2a80fdSPablo de Lara * Don't pass single-producer/single-consumer flags to mbuf create as it 106*ed2a80fdSPablo de Lara * seems faster to use a cache instead 107*ed2a80fdSPablo de Lara */ 108*ed2a80fdSPablo de Lara printf("Creating mbuf pool '%s' [%u mbufs] ...\n", 109*ed2a80fdSPablo de Lara PKTMBUF_POOL_NAME, num_mbufs); 110*ed2a80fdSPablo de Lara pktmbuf_pool = rte_pktmbuf_pool_create(PKTMBUF_POOL_NAME, num_mbufs, 111*ed2a80fdSPablo de Lara MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id()); 112*ed2a80fdSPablo de Lara 113*ed2a80fdSPablo de Lara return pktmbuf_pool == NULL; /* 0 on success */ 114*ed2a80fdSPablo de Lara } 115*ed2a80fdSPablo de Lara 116*ed2a80fdSPablo de Lara /** 117*ed2a80fdSPablo de Lara * Initialise an individual port: 118*ed2a80fdSPablo de Lara * - configure number of rx and tx rings 119*ed2a80fdSPablo de Lara * - set up each rx ring, to pull from the main mbuf pool 120*ed2a80fdSPablo de Lara * - set up each tx ring 121*ed2a80fdSPablo de Lara * - start the port and report its status to stdout 122*ed2a80fdSPablo de Lara */ 123*ed2a80fdSPablo de Lara static int 124*ed2a80fdSPablo de Lara init_port(uint8_t port_num) 125*ed2a80fdSPablo de Lara { 126*ed2a80fdSPablo de Lara /* for port configuration all features are off by default */ 127*ed2a80fdSPablo de Lara const struct rte_eth_conf port_conf = { 128*ed2a80fdSPablo de Lara .rxmode = { 129*ed2a80fdSPablo de Lara .mq_mode = ETH_MQ_RX_RSS 130*ed2a80fdSPablo de Lara } 131*ed2a80fdSPablo de Lara }; 132*ed2a80fdSPablo de Lara const uint16_t rx_rings = 1, tx_rings = num_nodes; 133*ed2a80fdSPablo de Lara const uint16_t rx_ring_size = RTE_MP_RX_DESC_DEFAULT; 134*ed2a80fdSPablo de Lara const uint16_t tx_ring_size = RTE_MP_TX_DESC_DEFAULT; 135*ed2a80fdSPablo de Lara 136*ed2a80fdSPablo de Lara uint16_t q; 137*ed2a80fdSPablo de Lara int retval; 138*ed2a80fdSPablo de Lara 139*ed2a80fdSPablo de Lara printf("Port %u init ... ", (unsigned int)port_num); 140*ed2a80fdSPablo de Lara fflush(stdout); 141*ed2a80fdSPablo de Lara 142*ed2a80fdSPablo de Lara /* 143*ed2a80fdSPablo de Lara * Standard DPDK port initialisation - config port, then set up 144*ed2a80fdSPablo de Lara * rx and tx rings. 145*ed2a80fdSPablo de Lara */ 146*ed2a80fdSPablo de Lara retval = rte_eth_dev_configure(port_num, rx_rings, tx_rings, &port_conf); 147*ed2a80fdSPablo de Lara if (retval != 0) 148*ed2a80fdSPablo de Lara return retval; 149*ed2a80fdSPablo de Lara 150*ed2a80fdSPablo de Lara for (q = 0; q < rx_rings; q++) { 151*ed2a80fdSPablo de Lara retval = rte_eth_rx_queue_setup(port_num, q, rx_ring_size, 152*ed2a80fdSPablo de Lara rte_eth_dev_socket_id(port_num), 153*ed2a80fdSPablo de Lara NULL, pktmbuf_pool); 154*ed2a80fdSPablo de Lara if (retval < 0) 155*ed2a80fdSPablo de Lara return retval; 156*ed2a80fdSPablo de Lara } 157*ed2a80fdSPablo de Lara 158*ed2a80fdSPablo de Lara for (q = 0; q < tx_rings; q++) { 159*ed2a80fdSPablo de Lara retval = rte_eth_tx_queue_setup(port_num, q, tx_ring_size, 160*ed2a80fdSPablo de Lara rte_eth_dev_socket_id(port_num), 161*ed2a80fdSPablo de Lara NULL); 162*ed2a80fdSPablo de Lara if (retval < 0) 163*ed2a80fdSPablo de Lara return retval; 164*ed2a80fdSPablo de Lara } 165*ed2a80fdSPablo de Lara 166*ed2a80fdSPablo de Lara rte_eth_promiscuous_enable(port_num); 167*ed2a80fdSPablo de Lara 168*ed2a80fdSPablo de Lara retval = rte_eth_dev_start(port_num); 169*ed2a80fdSPablo de Lara if (retval < 0) 170*ed2a80fdSPablo de Lara return retval; 171*ed2a80fdSPablo de Lara 172*ed2a80fdSPablo de Lara printf("done:\n"); 173*ed2a80fdSPablo de Lara 174*ed2a80fdSPablo de Lara return 0; 175*ed2a80fdSPablo de Lara } 176*ed2a80fdSPablo de Lara 177*ed2a80fdSPablo de Lara /** 178*ed2a80fdSPablo de Lara * Set up the DPDK rings which will be used to pass packets, via 179*ed2a80fdSPablo de Lara * pointers, between the multi-process server and node processes. 180*ed2a80fdSPablo de Lara * Each node needs one RX queue. 181*ed2a80fdSPablo de Lara */ 182*ed2a80fdSPablo de Lara static int 183*ed2a80fdSPablo de Lara init_shm_rings(void) 184*ed2a80fdSPablo de Lara { 185*ed2a80fdSPablo de Lara unsigned int i; 186*ed2a80fdSPablo de Lara unsigned int socket_id; 187*ed2a80fdSPablo de Lara const char *q_name; 188*ed2a80fdSPablo de Lara const unsigned int ringsize = NODE_QUEUE_RINGSIZE; 189*ed2a80fdSPablo de Lara 190*ed2a80fdSPablo de Lara nodes = rte_malloc("node details", 191*ed2a80fdSPablo de Lara sizeof(*nodes) * num_nodes, 0); 192*ed2a80fdSPablo de Lara if (nodes == NULL) 193*ed2a80fdSPablo de Lara rte_exit(EXIT_FAILURE, "Cannot allocate memory for " 194*ed2a80fdSPablo de Lara "node program details\n"); 195*ed2a80fdSPablo de Lara 196*ed2a80fdSPablo de Lara for (i = 0; i < num_nodes; i++) { 197*ed2a80fdSPablo de Lara /* Create an RX queue for each node */ 198*ed2a80fdSPablo de Lara socket_id = rte_socket_id(); 199*ed2a80fdSPablo de Lara q_name = get_rx_queue_name(i); 200*ed2a80fdSPablo de Lara nodes[i].rx_q = rte_ring_create(q_name, 201*ed2a80fdSPablo de Lara ringsize, socket_id, 202*ed2a80fdSPablo de Lara RING_F_SP_ENQ | RING_F_SC_DEQ); 203*ed2a80fdSPablo de Lara if (nodes[i].rx_q == NULL) 204*ed2a80fdSPablo de Lara rte_exit(EXIT_FAILURE, "Cannot create rx ring queue " 205*ed2a80fdSPablo de Lara "for node %u\n", i); 206*ed2a80fdSPablo de Lara } 207*ed2a80fdSPablo de Lara return 0; 208*ed2a80fdSPablo de Lara } 209*ed2a80fdSPablo de Lara 210*ed2a80fdSPablo de Lara /* 211*ed2a80fdSPablo de Lara * Create EFD table which will contain all the flows 212*ed2a80fdSPablo de Lara * that will be distributed among the nodes 213*ed2a80fdSPablo de Lara */ 214*ed2a80fdSPablo de Lara static void 215*ed2a80fdSPablo de Lara create_efd_table(void) 216*ed2a80fdSPablo de Lara { 217*ed2a80fdSPablo de Lara uint8_t socket_id = rte_socket_id(); 218*ed2a80fdSPablo de Lara 219*ed2a80fdSPablo de Lara /* create table */ 220*ed2a80fdSPablo de Lara efd_table = rte_efd_create("flow table", num_flows * 2, sizeof(uint32_t), 221*ed2a80fdSPablo de Lara 1 << socket_id, socket_id); 222*ed2a80fdSPablo de Lara 223*ed2a80fdSPablo de Lara if (efd_table == NULL) 224*ed2a80fdSPablo de Lara rte_exit(EXIT_FAILURE, "Problem creating the flow table\n"); 225*ed2a80fdSPablo de Lara } 226*ed2a80fdSPablo de Lara 227*ed2a80fdSPablo de Lara static void 228*ed2a80fdSPablo de Lara populate_efd_table(void) 229*ed2a80fdSPablo de Lara { 230*ed2a80fdSPablo de Lara unsigned int i; 231*ed2a80fdSPablo de Lara int32_t ret; 232*ed2a80fdSPablo de Lara uint32_t ip_dst; 233*ed2a80fdSPablo de Lara uint8_t socket_id = rte_socket_id(); 234*ed2a80fdSPablo de Lara uint64_t node_id; 235*ed2a80fdSPablo de Lara 236*ed2a80fdSPablo de Lara /* Add flows in table */ 237*ed2a80fdSPablo de Lara for (i = 0; i < num_flows; i++) { 238*ed2a80fdSPablo de Lara node_id = i % num_nodes; 239*ed2a80fdSPablo de Lara 240*ed2a80fdSPablo de Lara ip_dst = rte_cpu_to_be_32(i); 241*ed2a80fdSPablo de Lara ret = rte_efd_update(efd_table, socket_id, 242*ed2a80fdSPablo de Lara (void *)&ip_dst, (efd_value_t)node_id); 243*ed2a80fdSPablo de Lara if (ret < 0) 244*ed2a80fdSPablo de Lara rte_exit(EXIT_FAILURE, "Unable to add entry %u in " 245*ed2a80fdSPablo de Lara "EFD table\n", i); 246*ed2a80fdSPablo de Lara } 247*ed2a80fdSPablo de Lara 248*ed2a80fdSPablo de Lara printf("EFD table: Adding 0x%x keys\n", num_flows); 249*ed2a80fdSPablo de Lara } 250*ed2a80fdSPablo de Lara 251*ed2a80fdSPablo de Lara /* Check the link status of all ports in up to 9s, and print them finally */ 252*ed2a80fdSPablo de Lara static void 253*ed2a80fdSPablo de Lara check_all_ports_link_status(uint8_t port_num, uint32_t port_mask) 254*ed2a80fdSPablo de Lara { 255*ed2a80fdSPablo de Lara #define CHECK_INTERVAL 100 /* 100ms */ 256*ed2a80fdSPablo de Lara #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */ 257*ed2a80fdSPablo de Lara uint8_t portid, count, all_ports_up, print_flag = 0; 258*ed2a80fdSPablo de Lara struct rte_eth_link link; 259*ed2a80fdSPablo de Lara 260*ed2a80fdSPablo de Lara printf("\nChecking link status"); 261*ed2a80fdSPablo de Lara fflush(stdout); 262*ed2a80fdSPablo de Lara for (count = 0; count <= MAX_CHECK_TIME; count++) { 263*ed2a80fdSPablo de Lara all_ports_up = 1; 264*ed2a80fdSPablo de Lara for (portid = 0; portid < port_num; portid++) { 265*ed2a80fdSPablo de Lara if ((port_mask & (1 << info->id[portid])) == 0) 266*ed2a80fdSPablo de Lara continue; 267*ed2a80fdSPablo de Lara memset(&link, 0, sizeof(link)); 268*ed2a80fdSPablo de Lara rte_eth_link_get_nowait(info->id[portid], &link); 269*ed2a80fdSPablo de Lara /* print link status if flag set */ 270*ed2a80fdSPablo de Lara if (print_flag == 1) { 271*ed2a80fdSPablo de Lara if (link.link_status) 272*ed2a80fdSPablo de Lara printf("Port %d Link Up - speed %u " 273*ed2a80fdSPablo de Lara "Mbps - %s\n", info->id[portid], 274*ed2a80fdSPablo de Lara (unsigned int)link.link_speed, 275*ed2a80fdSPablo de Lara (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? 276*ed2a80fdSPablo de Lara ("full-duplex") : ("half-duplex\n")); 277*ed2a80fdSPablo de Lara else 278*ed2a80fdSPablo de Lara printf("Port %d Link Down\n", 279*ed2a80fdSPablo de Lara (uint8_t)info->id[portid]); 280*ed2a80fdSPablo de Lara continue; 281*ed2a80fdSPablo de Lara } 282*ed2a80fdSPablo de Lara /* clear all_ports_up flag if any link down */ 283*ed2a80fdSPablo de Lara if (link.link_status == ETH_LINK_DOWN) { 284*ed2a80fdSPablo de Lara all_ports_up = 0; 285*ed2a80fdSPablo de Lara break; 286*ed2a80fdSPablo de Lara } 287*ed2a80fdSPablo de Lara } 288*ed2a80fdSPablo de Lara /* after finally printing all link status, get out */ 289*ed2a80fdSPablo de Lara if (print_flag == 1) 290*ed2a80fdSPablo de Lara break; 291*ed2a80fdSPablo de Lara 292*ed2a80fdSPablo de Lara if (all_ports_up == 0) { 293*ed2a80fdSPablo de Lara printf("."); 294*ed2a80fdSPablo de Lara fflush(stdout); 295*ed2a80fdSPablo de Lara rte_delay_ms(CHECK_INTERVAL); 296*ed2a80fdSPablo de Lara } 297*ed2a80fdSPablo de Lara 298*ed2a80fdSPablo de Lara /* set the print_flag if all ports up or timeout */ 299*ed2a80fdSPablo de Lara if (all_ports_up == 1 || count == (MAX_CHECK_TIME - 1)) { 300*ed2a80fdSPablo de Lara print_flag = 1; 301*ed2a80fdSPablo de Lara printf("done\n"); 302*ed2a80fdSPablo de Lara } 303*ed2a80fdSPablo de Lara } 304*ed2a80fdSPablo de Lara } 305*ed2a80fdSPablo de Lara 306*ed2a80fdSPablo de Lara /** 307*ed2a80fdSPablo de Lara * Main init function for the multi-process server app, 308*ed2a80fdSPablo de Lara * calls subfunctions to do each stage of the initialisation. 309*ed2a80fdSPablo de Lara */ 310*ed2a80fdSPablo de Lara int 311*ed2a80fdSPablo de Lara init(int argc, char *argv[]) 312*ed2a80fdSPablo de Lara { 313*ed2a80fdSPablo de Lara int retval; 314*ed2a80fdSPablo de Lara const struct rte_memzone *mz; 315*ed2a80fdSPablo de Lara uint8_t i, total_ports; 316*ed2a80fdSPablo de Lara 317*ed2a80fdSPablo de Lara /* init EAL, parsing EAL args */ 318*ed2a80fdSPablo de Lara retval = rte_eal_init(argc, argv); 319*ed2a80fdSPablo de Lara if (retval < 0) 320*ed2a80fdSPablo de Lara return -1; 321*ed2a80fdSPablo de Lara argc -= retval; 322*ed2a80fdSPablo de Lara argv += retval; 323*ed2a80fdSPablo de Lara 324*ed2a80fdSPablo de Lara /* get total number of ports */ 325*ed2a80fdSPablo de Lara total_ports = rte_eth_dev_count(); 326*ed2a80fdSPablo de Lara 327*ed2a80fdSPablo de Lara /* set up array for port data */ 328*ed2a80fdSPablo de Lara mz = rte_memzone_reserve(MZ_SHARED_INFO, sizeof(*info), 329*ed2a80fdSPablo de Lara rte_socket_id(), NO_FLAGS); 330*ed2a80fdSPablo de Lara if (mz == NULL) 331*ed2a80fdSPablo de Lara rte_exit(EXIT_FAILURE, "Cannot reserve memory zone " 332*ed2a80fdSPablo de Lara "for port information\n"); 333*ed2a80fdSPablo de Lara memset(mz->addr, 0, sizeof(*info)); 334*ed2a80fdSPablo de Lara info = mz->addr; 335*ed2a80fdSPablo de Lara 336*ed2a80fdSPablo de Lara /* parse additional, application arguments */ 337*ed2a80fdSPablo de Lara retval = parse_app_args(total_ports, argc, argv); 338*ed2a80fdSPablo de Lara if (retval != 0) 339*ed2a80fdSPablo de Lara return -1; 340*ed2a80fdSPablo de Lara 341*ed2a80fdSPablo de Lara /* initialise mbuf pools */ 342*ed2a80fdSPablo de Lara retval = init_mbuf_pools(); 343*ed2a80fdSPablo de Lara if (retval != 0) 344*ed2a80fdSPablo de Lara rte_exit(EXIT_FAILURE, "Cannot create needed mbuf pools\n"); 345*ed2a80fdSPablo de Lara 346*ed2a80fdSPablo de Lara /* now initialise the ports we will use */ 347*ed2a80fdSPablo de Lara for (i = 0; i < info->num_ports; i++) { 348*ed2a80fdSPablo de Lara retval = init_port(info->id[i]); 349*ed2a80fdSPablo de Lara if (retval != 0) 350*ed2a80fdSPablo de Lara rte_exit(EXIT_FAILURE, "Cannot initialise port %u\n", 351*ed2a80fdSPablo de Lara (unsigned int) i); 352*ed2a80fdSPablo de Lara } 353*ed2a80fdSPablo de Lara 354*ed2a80fdSPablo de Lara check_all_ports_link_status(info->num_ports, (~0x0)); 355*ed2a80fdSPablo de Lara 356*ed2a80fdSPablo de Lara /* initialise the node queues/rings for inter-eu comms */ 357*ed2a80fdSPablo de Lara init_shm_rings(); 358*ed2a80fdSPablo de Lara 359*ed2a80fdSPablo de Lara /* Create the EFD table */ 360*ed2a80fdSPablo de Lara create_efd_table(); 361*ed2a80fdSPablo de Lara 362*ed2a80fdSPablo de Lara /* Populate the EFD table */ 363*ed2a80fdSPablo de Lara populate_efd_table(); 364*ed2a80fdSPablo de Lara 365*ed2a80fdSPablo de Lara /* Share the total number of nodes */ 366*ed2a80fdSPablo de Lara info->num_nodes = num_nodes; 367*ed2a80fdSPablo de Lara 368*ed2a80fdSPablo de Lara /* Share the total number of flows */ 369*ed2a80fdSPablo de Lara info->num_flows = num_flows; 370*ed2a80fdSPablo de Lara return 0; 371*ed2a80fdSPablo de Lara } 372