1b77f6600SCristian Dumitrescu /* SPDX-License-Identifier: BSD-3-Clause 2b77f6600SCristian Dumitrescu * Copyright(c) 2020 Intel Corporation 3b77f6600SCristian Dumitrescu */ 4b77f6600SCristian Dumitrescu 5b77f6600SCristian Dumitrescu #include <stdlib.h> 6b77f6600SCristian Dumitrescu #include <string.h> 7e2b8dc52SVenkata Suresh Kumar P #include <netinet/in.h> 8e2b8dc52SVenkata Suresh Kumar P #ifdef RTE_EXEC_ENV_LINUX 9e2b8dc52SVenkata Suresh Kumar P #include <linux/if.h> 10e2b8dc52SVenkata Suresh Kumar P #include <linux/if_tun.h> 11e2b8dc52SVenkata Suresh Kumar P #endif 12e2b8dc52SVenkata Suresh Kumar P #include <sys/ioctl.h> 13e2b8dc52SVenkata Suresh Kumar P #include <fcntl.h> 14e2b8dc52SVenkata Suresh Kumar P #include <unistd.h> 15b77f6600SCristian Dumitrescu 16b77f6600SCristian Dumitrescu #include <rte_mempool.h> 17b77f6600SCristian Dumitrescu #include <rte_mbuf.h> 18b77f6600SCristian Dumitrescu #include <rte_ethdev.h> 19b77f6600SCristian Dumitrescu #include <rte_swx_ctl.h> 20b77f6600SCristian Dumitrescu 21b77f6600SCristian Dumitrescu #include "obj.h" 22b77f6600SCristian Dumitrescu 23b77f6600SCristian Dumitrescu /* 24b77f6600SCristian Dumitrescu * mempool 25b77f6600SCristian Dumitrescu */ 26b77f6600SCristian Dumitrescu TAILQ_HEAD(mempool_list, mempool); 27b77f6600SCristian Dumitrescu 28b77f6600SCristian Dumitrescu /* 29b77f6600SCristian Dumitrescu * link 30b77f6600SCristian Dumitrescu */ 31b77f6600SCristian Dumitrescu TAILQ_HEAD(link_list, link); 32b77f6600SCristian Dumitrescu 33b77f6600SCristian Dumitrescu /* 3477a41301SCristian Dumitrescu * ring 3577a41301SCristian Dumitrescu */ 3677a41301SCristian Dumitrescu TAILQ_HEAD(ring_list, ring); 3777a41301SCristian Dumitrescu 3877a41301SCristian Dumitrescu /* 39e2b8dc52SVenkata Suresh Kumar P * tap 40e2b8dc52SVenkata Suresh Kumar P */ 41e2b8dc52SVenkata Suresh Kumar P TAILQ_HEAD(tap_list, tap); 42e2b8dc52SVenkata Suresh Kumar P 43e2b8dc52SVenkata Suresh Kumar P /* 44b77f6600SCristian Dumitrescu * obj 45b77f6600SCristian Dumitrescu */ 46b77f6600SCristian Dumitrescu struct obj { 47b77f6600SCristian Dumitrescu struct mempool_list mempool_list; 48b77f6600SCristian Dumitrescu struct link_list link_list; 4977a41301SCristian Dumitrescu struct ring_list ring_list; 50e2b8dc52SVenkata Suresh Kumar P struct tap_list tap_list; 51b77f6600SCristian Dumitrescu }; 52b77f6600SCristian Dumitrescu 53b77f6600SCristian Dumitrescu /* 54b77f6600SCristian Dumitrescu * mempool 55b77f6600SCristian Dumitrescu */ 56b77f6600SCristian Dumitrescu #define BUFFER_SIZE_MIN (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM) 57b77f6600SCristian Dumitrescu 58b77f6600SCristian Dumitrescu struct mempool * 59b77f6600SCristian Dumitrescu mempool_create(struct obj *obj, const char *name, struct mempool_params *params) 60b77f6600SCristian Dumitrescu { 61b77f6600SCristian Dumitrescu struct mempool *mempool; 62b77f6600SCristian Dumitrescu struct rte_mempool *m; 63b77f6600SCristian Dumitrescu 64b77f6600SCristian Dumitrescu /* Check input params */ 65b77f6600SCristian Dumitrescu if ((name == NULL) || 66b77f6600SCristian Dumitrescu mempool_find(obj, name) || 67b77f6600SCristian Dumitrescu (params == NULL) || 68b77f6600SCristian Dumitrescu (params->buffer_size < BUFFER_SIZE_MIN) || 69b77f6600SCristian Dumitrescu (params->pool_size == 0)) 70b77f6600SCristian Dumitrescu return NULL; 71b77f6600SCristian Dumitrescu 72b77f6600SCristian Dumitrescu /* Resource create */ 73b77f6600SCristian Dumitrescu m = rte_pktmbuf_pool_create( 74b77f6600SCristian Dumitrescu name, 75b77f6600SCristian Dumitrescu params->pool_size, 76b77f6600SCristian Dumitrescu params->cache_size, 77b77f6600SCristian Dumitrescu 0, 78b77f6600SCristian Dumitrescu params->buffer_size - sizeof(struct rte_mbuf), 79b77f6600SCristian Dumitrescu params->cpu_id); 80b77f6600SCristian Dumitrescu 81b77f6600SCristian Dumitrescu if (m == NULL) 82b77f6600SCristian Dumitrescu return NULL; 83b77f6600SCristian Dumitrescu 84b77f6600SCristian Dumitrescu /* Node allocation */ 85b77f6600SCristian Dumitrescu mempool = calloc(1, sizeof(struct mempool)); 86b77f6600SCristian Dumitrescu if (mempool == NULL) { 87b77f6600SCristian Dumitrescu rte_mempool_free(m); 88b77f6600SCristian Dumitrescu return NULL; 89b77f6600SCristian Dumitrescu } 90b77f6600SCristian Dumitrescu 91b77f6600SCristian Dumitrescu /* Node fill in */ 92b77f6600SCristian Dumitrescu strlcpy(mempool->name, name, sizeof(mempool->name)); 93b77f6600SCristian Dumitrescu mempool->m = m; 94b77f6600SCristian Dumitrescu mempool->buffer_size = params->buffer_size; 95b77f6600SCristian Dumitrescu 96b77f6600SCristian Dumitrescu /* Node add to list */ 97b77f6600SCristian Dumitrescu TAILQ_INSERT_TAIL(&obj->mempool_list, mempool, node); 98b77f6600SCristian Dumitrescu 99b77f6600SCristian Dumitrescu return mempool; 100b77f6600SCristian Dumitrescu } 101b77f6600SCristian Dumitrescu 102b77f6600SCristian Dumitrescu struct mempool * 103b77f6600SCristian Dumitrescu mempool_find(struct obj *obj, const char *name) 104b77f6600SCristian Dumitrescu { 105b77f6600SCristian Dumitrescu struct mempool *mempool; 106b77f6600SCristian Dumitrescu 107b77f6600SCristian Dumitrescu if (!obj || !name) 108b77f6600SCristian Dumitrescu return NULL; 109b77f6600SCristian Dumitrescu 110b77f6600SCristian Dumitrescu TAILQ_FOREACH(mempool, &obj->mempool_list, node) 111b77f6600SCristian Dumitrescu if (strcmp(mempool->name, name) == 0) 112b77f6600SCristian Dumitrescu return mempool; 113b77f6600SCristian Dumitrescu 114b77f6600SCristian Dumitrescu return NULL; 115b77f6600SCristian Dumitrescu } 116b77f6600SCristian Dumitrescu 117b77f6600SCristian Dumitrescu /* 118b77f6600SCristian Dumitrescu * link 119b77f6600SCristian Dumitrescu */ 120b77f6600SCristian Dumitrescu static struct rte_eth_conf port_conf_default = { 121b77f6600SCristian Dumitrescu .link_speeds = 0, 122b77f6600SCristian Dumitrescu .rxmode = { 123295968d1SFerruh Yigit .mq_mode = RTE_ETH_MQ_RX_NONE, 1241bb4a528SFerruh Yigit .mtu = 9000 - (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN), /* Jumbo frame MTU */ 125b77f6600SCristian Dumitrescu .split_hdr_size = 0, /* Header split buffer size */ 126b77f6600SCristian Dumitrescu }, 127b77f6600SCristian Dumitrescu .rx_adv_conf = { 128b77f6600SCristian Dumitrescu .rss_conf = { 129b77f6600SCristian Dumitrescu .rss_key = NULL, 130b77f6600SCristian Dumitrescu .rss_key_len = 40, 131b77f6600SCristian Dumitrescu .rss_hf = 0, 132b77f6600SCristian Dumitrescu }, 133b77f6600SCristian Dumitrescu }, 134b77f6600SCristian Dumitrescu .txmode = { 135295968d1SFerruh Yigit .mq_mode = RTE_ETH_MQ_TX_NONE, 136b77f6600SCristian Dumitrescu }, 137b77f6600SCristian Dumitrescu .lpbk_mode = 0, 138b77f6600SCristian Dumitrescu }; 139b77f6600SCristian Dumitrescu 140295968d1SFerruh Yigit #define RETA_CONF_SIZE (RTE_ETH_RSS_RETA_SIZE_512 / RTE_ETH_RETA_GROUP_SIZE) 141b77f6600SCristian Dumitrescu 142b77f6600SCristian Dumitrescu static int 143b77f6600SCristian Dumitrescu rss_setup(uint16_t port_id, 144b77f6600SCristian Dumitrescu uint16_t reta_size, 145b77f6600SCristian Dumitrescu struct link_params_rss *rss) 146b77f6600SCristian Dumitrescu { 147b77f6600SCristian Dumitrescu struct rte_eth_rss_reta_entry64 reta_conf[RETA_CONF_SIZE]; 148b77f6600SCristian Dumitrescu uint32_t i; 149b77f6600SCristian Dumitrescu int status; 150b77f6600SCristian Dumitrescu 151b77f6600SCristian Dumitrescu /* RETA setting */ 152b77f6600SCristian Dumitrescu memset(reta_conf, 0, sizeof(reta_conf)); 153b77f6600SCristian Dumitrescu 154b77f6600SCristian Dumitrescu for (i = 0; i < reta_size; i++) 155295968d1SFerruh Yigit reta_conf[i / RTE_ETH_RETA_GROUP_SIZE].mask = UINT64_MAX; 156b77f6600SCristian Dumitrescu 157b77f6600SCristian Dumitrescu for (i = 0; i < reta_size; i++) { 158295968d1SFerruh Yigit uint32_t reta_id = i / RTE_ETH_RETA_GROUP_SIZE; 159295968d1SFerruh Yigit uint32_t reta_pos = i % RTE_ETH_RETA_GROUP_SIZE; 160b77f6600SCristian Dumitrescu uint32_t rss_qs_pos = i % rss->n_queues; 161b77f6600SCristian Dumitrescu 162b77f6600SCristian Dumitrescu reta_conf[reta_id].reta[reta_pos] = 163b77f6600SCristian Dumitrescu (uint16_t) rss->queue_id[rss_qs_pos]; 164b77f6600SCristian Dumitrescu } 165b77f6600SCristian Dumitrescu 166b77f6600SCristian Dumitrescu /* RETA update */ 167b77f6600SCristian Dumitrescu status = rte_eth_dev_rss_reta_update(port_id, 168b77f6600SCristian Dumitrescu reta_conf, 169b77f6600SCristian Dumitrescu reta_size); 170b77f6600SCristian Dumitrescu 171b77f6600SCristian Dumitrescu return status; 172b77f6600SCristian Dumitrescu } 173b77f6600SCristian Dumitrescu 174b77f6600SCristian Dumitrescu struct link * 175b77f6600SCristian Dumitrescu link_create(struct obj *obj, const char *name, struct link_params *params) 176b77f6600SCristian Dumitrescu { 177b77f6600SCristian Dumitrescu struct rte_eth_dev_info port_info; 178b77f6600SCristian Dumitrescu struct rte_eth_conf port_conf; 179b77f6600SCristian Dumitrescu struct link *link; 180b77f6600SCristian Dumitrescu struct link_params_rss *rss; 181b77f6600SCristian Dumitrescu struct mempool *mempool; 182b77f6600SCristian Dumitrescu uint32_t cpu_id, i; 183b77f6600SCristian Dumitrescu int status; 184*f31c80f8SCristian Dumitrescu uint16_t port_id = 0; 185b77f6600SCristian Dumitrescu 186b77f6600SCristian Dumitrescu /* Check input params */ 187b77f6600SCristian Dumitrescu if ((name == NULL) || 188b77f6600SCristian Dumitrescu link_find(obj, name) || 189b77f6600SCristian Dumitrescu (params == NULL) || 190b77f6600SCristian Dumitrescu (params->rx.n_queues == 0) || 191b77f6600SCristian Dumitrescu (params->rx.queue_size == 0) || 192b77f6600SCristian Dumitrescu (params->tx.n_queues == 0) || 193b77f6600SCristian Dumitrescu (params->tx.queue_size == 0)) 194b77f6600SCristian Dumitrescu return NULL; 195b77f6600SCristian Dumitrescu 196*f31c80f8SCristian Dumitrescu status = rte_eth_dev_get_port_by_name(name, &port_id); 197b77f6600SCristian Dumitrescu if (status) 198b77f6600SCristian Dumitrescu return NULL; 199b77f6600SCristian Dumitrescu 200b77f6600SCristian Dumitrescu if (rte_eth_dev_info_get(port_id, &port_info) != 0) 201b77f6600SCristian Dumitrescu return NULL; 202b77f6600SCristian Dumitrescu 203b77f6600SCristian Dumitrescu mempool = mempool_find(obj, params->rx.mempool_name); 204b77f6600SCristian Dumitrescu if (mempool == NULL) 205b77f6600SCristian Dumitrescu return NULL; 206b77f6600SCristian Dumitrescu 207b77f6600SCristian Dumitrescu rss = params->rx.rss; 208b77f6600SCristian Dumitrescu if (rss) { 209b77f6600SCristian Dumitrescu if ((port_info.reta_size == 0) || 210295968d1SFerruh Yigit (port_info.reta_size > RTE_ETH_RSS_RETA_SIZE_512)) 211b77f6600SCristian Dumitrescu return NULL; 212b77f6600SCristian Dumitrescu 213b77f6600SCristian Dumitrescu if ((rss->n_queues == 0) || 214b77f6600SCristian Dumitrescu (rss->n_queues >= LINK_RXQ_RSS_MAX)) 215b77f6600SCristian Dumitrescu return NULL; 216b77f6600SCristian Dumitrescu 217b77f6600SCristian Dumitrescu for (i = 0; i < rss->n_queues; i++) 218b77f6600SCristian Dumitrescu if (rss->queue_id[i] >= port_info.max_rx_queues) 219b77f6600SCristian Dumitrescu return NULL; 220b77f6600SCristian Dumitrescu } 221b77f6600SCristian Dumitrescu 222b77f6600SCristian Dumitrescu /** 223b77f6600SCristian Dumitrescu * Resource create 224b77f6600SCristian Dumitrescu */ 225b77f6600SCristian Dumitrescu /* Port */ 226b77f6600SCristian Dumitrescu memcpy(&port_conf, &port_conf_default, sizeof(port_conf)); 227b77f6600SCristian Dumitrescu if (rss) { 228295968d1SFerruh Yigit port_conf.rxmode.mq_mode = RTE_ETH_MQ_RX_RSS; 229b77f6600SCristian Dumitrescu port_conf.rx_adv_conf.rss_conf.rss_hf = 230295968d1SFerruh Yigit (RTE_ETH_RSS_IP | RTE_ETH_RSS_TCP | RTE_ETH_RSS_UDP) & 231b77f6600SCristian Dumitrescu port_info.flow_type_rss_offloads; 232b77f6600SCristian Dumitrescu } 233b77f6600SCristian Dumitrescu 234b77f6600SCristian Dumitrescu cpu_id = (uint32_t) rte_eth_dev_socket_id(port_id); 235b77f6600SCristian Dumitrescu if (cpu_id == (uint32_t) SOCKET_ID_ANY) 236b77f6600SCristian Dumitrescu cpu_id = 0; 237b77f6600SCristian Dumitrescu 238b77f6600SCristian Dumitrescu status = rte_eth_dev_configure( 239b77f6600SCristian Dumitrescu port_id, 240b77f6600SCristian Dumitrescu params->rx.n_queues, 241b77f6600SCristian Dumitrescu params->tx.n_queues, 242b77f6600SCristian Dumitrescu &port_conf); 243b77f6600SCristian Dumitrescu 244b77f6600SCristian Dumitrescu if (status < 0) 245b77f6600SCristian Dumitrescu return NULL; 246b77f6600SCristian Dumitrescu 247b77f6600SCristian Dumitrescu if (params->promiscuous) { 248b77f6600SCristian Dumitrescu status = rte_eth_promiscuous_enable(port_id); 249b77f6600SCristian Dumitrescu if (status != 0) 250b77f6600SCristian Dumitrescu return NULL; 251b77f6600SCristian Dumitrescu } 252b77f6600SCristian Dumitrescu 253b77f6600SCristian Dumitrescu /* Port RX */ 254b77f6600SCristian Dumitrescu for (i = 0; i < params->rx.n_queues; i++) { 255b77f6600SCristian Dumitrescu status = rte_eth_rx_queue_setup( 256b77f6600SCristian Dumitrescu port_id, 257b77f6600SCristian Dumitrescu i, 258b77f6600SCristian Dumitrescu params->rx.queue_size, 259b77f6600SCristian Dumitrescu cpu_id, 260b77f6600SCristian Dumitrescu NULL, 261b77f6600SCristian Dumitrescu mempool->m); 262b77f6600SCristian Dumitrescu 263b77f6600SCristian Dumitrescu if (status < 0) 264b77f6600SCristian Dumitrescu return NULL; 265b77f6600SCristian Dumitrescu } 266b77f6600SCristian Dumitrescu 267b77f6600SCristian Dumitrescu /* Port TX */ 268b77f6600SCristian Dumitrescu for (i = 0; i < params->tx.n_queues; i++) { 269b77f6600SCristian Dumitrescu status = rte_eth_tx_queue_setup( 270b77f6600SCristian Dumitrescu port_id, 271b77f6600SCristian Dumitrescu i, 272b77f6600SCristian Dumitrescu params->tx.queue_size, 273b77f6600SCristian Dumitrescu cpu_id, 274b77f6600SCristian Dumitrescu NULL); 275b77f6600SCristian Dumitrescu 276b77f6600SCristian Dumitrescu if (status < 0) 277b77f6600SCristian Dumitrescu return NULL; 278b77f6600SCristian Dumitrescu } 279b77f6600SCristian Dumitrescu 280b77f6600SCristian Dumitrescu /* Port start */ 281b77f6600SCristian Dumitrescu status = rte_eth_dev_start(port_id); 282b77f6600SCristian Dumitrescu if (status < 0) 283b77f6600SCristian Dumitrescu return NULL; 284b77f6600SCristian Dumitrescu 285b77f6600SCristian Dumitrescu if (rss) { 286b77f6600SCristian Dumitrescu status = rss_setup(port_id, port_info.reta_size, rss); 287b77f6600SCristian Dumitrescu 288b77f6600SCristian Dumitrescu if (status) { 289b77f6600SCristian Dumitrescu rte_eth_dev_stop(port_id); 290b77f6600SCristian Dumitrescu return NULL; 291b77f6600SCristian Dumitrescu } 292b77f6600SCristian Dumitrescu } 293b77f6600SCristian Dumitrescu 294b77f6600SCristian Dumitrescu /* Port link up */ 295b77f6600SCristian Dumitrescu status = rte_eth_dev_set_link_up(port_id); 296b77f6600SCristian Dumitrescu if ((status < 0) && (status != -ENOTSUP)) { 297b77f6600SCristian Dumitrescu rte_eth_dev_stop(port_id); 298b77f6600SCristian Dumitrescu return NULL; 299b77f6600SCristian Dumitrescu } 300b77f6600SCristian Dumitrescu 301b77f6600SCristian Dumitrescu /* Node allocation */ 302b77f6600SCristian Dumitrescu link = calloc(1, sizeof(struct link)); 303b77f6600SCristian Dumitrescu if (link == NULL) { 304b77f6600SCristian Dumitrescu rte_eth_dev_stop(port_id); 305b77f6600SCristian Dumitrescu return NULL; 306b77f6600SCristian Dumitrescu } 307b77f6600SCristian Dumitrescu 308b77f6600SCristian Dumitrescu /* Node fill in */ 309b77f6600SCristian Dumitrescu strlcpy(link->name, name, sizeof(link->name)); 310b77f6600SCristian Dumitrescu link->port_id = port_id; 311b77f6600SCristian Dumitrescu link->n_rxq = params->rx.n_queues; 312b77f6600SCristian Dumitrescu link->n_txq = params->tx.n_queues; 313b77f6600SCristian Dumitrescu 314b77f6600SCristian Dumitrescu /* Node add to list */ 315b77f6600SCristian Dumitrescu TAILQ_INSERT_TAIL(&obj->link_list, link, node); 316b77f6600SCristian Dumitrescu 317b77f6600SCristian Dumitrescu return link; 318b77f6600SCristian Dumitrescu } 319b77f6600SCristian Dumitrescu 320b77f6600SCristian Dumitrescu int 321b77f6600SCristian Dumitrescu link_is_up(struct obj *obj, const char *name) 322b77f6600SCristian Dumitrescu { 323b77f6600SCristian Dumitrescu struct rte_eth_link link_params; 324b77f6600SCristian Dumitrescu struct link *link; 325b77f6600SCristian Dumitrescu 326b77f6600SCristian Dumitrescu /* Check input params */ 327b77f6600SCristian Dumitrescu if (!obj || !name) 328b77f6600SCristian Dumitrescu return 0; 329b77f6600SCristian Dumitrescu 330b77f6600SCristian Dumitrescu link = link_find(obj, name); 331b77f6600SCristian Dumitrescu if (link == NULL) 332b77f6600SCristian Dumitrescu return 0; 333b77f6600SCristian Dumitrescu 334b77f6600SCristian Dumitrescu /* Resource */ 335b77f6600SCristian Dumitrescu if (rte_eth_link_get(link->port_id, &link_params) < 0) 336b77f6600SCristian Dumitrescu return 0; 337b77f6600SCristian Dumitrescu 338295968d1SFerruh Yigit return (link_params.link_status == RTE_ETH_LINK_DOWN) ? 0 : 1; 339b77f6600SCristian Dumitrescu } 340b77f6600SCristian Dumitrescu 341b77f6600SCristian Dumitrescu struct link * 342b77f6600SCristian Dumitrescu link_find(struct obj *obj, const char *name) 343b77f6600SCristian Dumitrescu { 344b77f6600SCristian Dumitrescu struct link *link; 345b77f6600SCristian Dumitrescu 346b77f6600SCristian Dumitrescu if (!obj || !name) 347b77f6600SCristian Dumitrescu return NULL; 348b77f6600SCristian Dumitrescu 349b77f6600SCristian Dumitrescu TAILQ_FOREACH(link, &obj->link_list, node) 350b77f6600SCristian Dumitrescu if (strcmp(link->name, name) == 0) 351b77f6600SCristian Dumitrescu return link; 352b77f6600SCristian Dumitrescu 353b77f6600SCristian Dumitrescu return NULL; 354b77f6600SCristian Dumitrescu } 355b77f6600SCristian Dumitrescu 356b77f6600SCristian Dumitrescu struct link * 357b77f6600SCristian Dumitrescu link_next(struct obj *obj, struct link *link) 358b77f6600SCristian Dumitrescu { 359b77f6600SCristian Dumitrescu return (link == NULL) ? 360b77f6600SCristian Dumitrescu TAILQ_FIRST(&obj->link_list) : TAILQ_NEXT(link, node); 361b77f6600SCristian Dumitrescu } 362b77f6600SCristian Dumitrescu 363b77f6600SCristian Dumitrescu /* 36477a41301SCristian Dumitrescu * ring 36577a41301SCristian Dumitrescu */ 36677a41301SCristian Dumitrescu struct ring * 36777a41301SCristian Dumitrescu ring_create(struct obj *obj, const char *name, struct ring_params *params) 36877a41301SCristian Dumitrescu { 36977a41301SCristian Dumitrescu struct ring *ring; 37077a41301SCristian Dumitrescu struct rte_ring *r; 37177a41301SCristian Dumitrescu unsigned int flags = RING_F_SP_ENQ | RING_F_SC_DEQ; 37277a41301SCristian Dumitrescu 37377a41301SCristian Dumitrescu /* Check input params */ 37477a41301SCristian Dumitrescu if (!name || ring_find(obj, name) || !params || !params->size) 37577a41301SCristian Dumitrescu return NULL; 37677a41301SCristian Dumitrescu 37777a41301SCristian Dumitrescu /** 37877a41301SCristian Dumitrescu * Resource create 37977a41301SCristian Dumitrescu */ 38077a41301SCristian Dumitrescu r = rte_ring_create( 38177a41301SCristian Dumitrescu name, 38277a41301SCristian Dumitrescu params->size, 38377a41301SCristian Dumitrescu params->numa_node, 38477a41301SCristian Dumitrescu flags); 38577a41301SCristian Dumitrescu if (!r) 38677a41301SCristian Dumitrescu return NULL; 38777a41301SCristian Dumitrescu 38877a41301SCristian Dumitrescu /* Node allocation */ 38977a41301SCristian Dumitrescu ring = calloc(1, sizeof(struct ring)); 39077a41301SCristian Dumitrescu if (!ring) { 39177a41301SCristian Dumitrescu rte_ring_free(r); 39277a41301SCristian Dumitrescu return NULL; 39377a41301SCristian Dumitrescu } 39477a41301SCristian Dumitrescu 39577a41301SCristian Dumitrescu /* Node fill in */ 39677a41301SCristian Dumitrescu strlcpy(ring->name, name, sizeof(ring->name)); 39777a41301SCristian Dumitrescu 39877a41301SCristian Dumitrescu /* Node add to list */ 39977a41301SCristian Dumitrescu TAILQ_INSERT_TAIL(&obj->ring_list, ring, node); 40077a41301SCristian Dumitrescu 40177a41301SCristian Dumitrescu return ring; 40277a41301SCristian Dumitrescu } 40377a41301SCristian Dumitrescu 40477a41301SCristian Dumitrescu struct ring * 40577a41301SCristian Dumitrescu ring_find(struct obj *obj, const char *name) 40677a41301SCristian Dumitrescu { 40777a41301SCristian Dumitrescu struct ring *ring; 40877a41301SCristian Dumitrescu 40977a41301SCristian Dumitrescu if (!obj || !name) 41077a41301SCristian Dumitrescu return NULL; 41177a41301SCristian Dumitrescu 41277a41301SCristian Dumitrescu TAILQ_FOREACH(ring, &obj->ring_list, node) 41377a41301SCristian Dumitrescu if (strcmp(ring->name, name) == 0) 41477a41301SCristian Dumitrescu return ring; 41577a41301SCristian Dumitrescu 41677a41301SCristian Dumitrescu return NULL; 41777a41301SCristian Dumitrescu } 41877a41301SCristian Dumitrescu 41977a41301SCristian Dumitrescu /* 420e2b8dc52SVenkata Suresh Kumar P * tap 421e2b8dc52SVenkata Suresh Kumar P */ 422e2b8dc52SVenkata Suresh Kumar P #define TAP_DEV "/dev/net/tun" 423e2b8dc52SVenkata Suresh Kumar P 424e2b8dc52SVenkata Suresh Kumar P struct tap * 425e2b8dc52SVenkata Suresh Kumar P tap_find(struct obj *obj, const char *name) 426e2b8dc52SVenkata Suresh Kumar P { 427e2b8dc52SVenkata Suresh Kumar P struct tap *tap; 428e2b8dc52SVenkata Suresh Kumar P 429e2b8dc52SVenkata Suresh Kumar P if (!obj || !name) 430e2b8dc52SVenkata Suresh Kumar P return NULL; 431e2b8dc52SVenkata Suresh Kumar P 432e2b8dc52SVenkata Suresh Kumar P TAILQ_FOREACH(tap, &obj->tap_list, node) 433e2b8dc52SVenkata Suresh Kumar P if (strcmp(tap->name, name) == 0) 434e2b8dc52SVenkata Suresh Kumar P return tap; 435e2b8dc52SVenkata Suresh Kumar P 436e2b8dc52SVenkata Suresh Kumar P return NULL; 437e2b8dc52SVenkata Suresh Kumar P } 438e2b8dc52SVenkata Suresh Kumar P 439e2b8dc52SVenkata Suresh Kumar P struct tap * 440e2b8dc52SVenkata Suresh Kumar P tap_next(struct obj *obj, struct tap *tap) 441e2b8dc52SVenkata Suresh Kumar P { 442e2b8dc52SVenkata Suresh Kumar P return (tap == NULL) ? 443e2b8dc52SVenkata Suresh Kumar P TAILQ_FIRST(&obj->tap_list) : TAILQ_NEXT(tap, node); 444e2b8dc52SVenkata Suresh Kumar P } 445e2b8dc52SVenkata Suresh Kumar P 446e2b8dc52SVenkata Suresh Kumar P #ifndef RTE_EXEC_ENV_LINUX 447e2b8dc52SVenkata Suresh Kumar P 448e2b8dc52SVenkata Suresh Kumar P struct tap * 449e2b8dc52SVenkata Suresh Kumar P tap_create(struct obj *obj __rte_unused, const char *name __rte_unused) 450e2b8dc52SVenkata Suresh Kumar P { 451e2b8dc52SVenkata Suresh Kumar P return NULL; 452e2b8dc52SVenkata Suresh Kumar P } 453e2b8dc52SVenkata Suresh Kumar P 454e2b8dc52SVenkata Suresh Kumar P #else 455e2b8dc52SVenkata Suresh Kumar P 456e2b8dc52SVenkata Suresh Kumar P struct tap * 457e2b8dc52SVenkata Suresh Kumar P tap_create(struct obj *obj, const char *name) 458e2b8dc52SVenkata Suresh Kumar P { 459e2b8dc52SVenkata Suresh Kumar P struct tap *tap; 460e2b8dc52SVenkata Suresh Kumar P struct ifreq ifr; 461e2b8dc52SVenkata Suresh Kumar P int fd, status; 462e2b8dc52SVenkata Suresh Kumar P 463e2b8dc52SVenkata Suresh Kumar P /* Check input params */ 464e2b8dc52SVenkata Suresh Kumar P if ((name == NULL) || 465e2b8dc52SVenkata Suresh Kumar P tap_find(obj, name)) 466e2b8dc52SVenkata Suresh Kumar P return NULL; 467e2b8dc52SVenkata Suresh Kumar P 468e2b8dc52SVenkata Suresh Kumar P /* Resource create */ 469e2b8dc52SVenkata Suresh Kumar P fd = open(TAP_DEV, O_RDWR | O_NONBLOCK); 470e2b8dc52SVenkata Suresh Kumar P if (fd < 0) 471e2b8dc52SVenkata Suresh Kumar P return NULL; 472e2b8dc52SVenkata Suresh Kumar P 473e2b8dc52SVenkata Suresh Kumar P memset(&ifr, 0, sizeof(ifr)); 474e2b8dc52SVenkata Suresh Kumar P ifr.ifr_flags = IFF_TAP | IFF_NO_PI; /* No packet information */ 475e2b8dc52SVenkata Suresh Kumar P strlcpy(ifr.ifr_name, name, IFNAMSIZ); 476e2b8dc52SVenkata Suresh Kumar P 477e2b8dc52SVenkata Suresh Kumar P status = ioctl(fd, TUNSETIFF, (void *) &ifr); 478e2b8dc52SVenkata Suresh Kumar P if (status < 0) { 479e2b8dc52SVenkata Suresh Kumar P close(fd); 480e2b8dc52SVenkata Suresh Kumar P return NULL; 481e2b8dc52SVenkata Suresh Kumar P } 482e2b8dc52SVenkata Suresh Kumar P 483e2b8dc52SVenkata Suresh Kumar P /* Node allocation */ 484e2b8dc52SVenkata Suresh Kumar P tap = calloc(1, sizeof(struct tap)); 485e2b8dc52SVenkata Suresh Kumar P if (tap == NULL) { 486e2b8dc52SVenkata Suresh Kumar P close(fd); 487e2b8dc52SVenkata Suresh Kumar P return NULL; 488e2b8dc52SVenkata Suresh Kumar P } 489e2b8dc52SVenkata Suresh Kumar P /* Node fill in */ 490e2b8dc52SVenkata Suresh Kumar P strlcpy(tap->name, name, sizeof(tap->name)); 491e2b8dc52SVenkata Suresh Kumar P tap->fd = fd; 492e2b8dc52SVenkata Suresh Kumar P 493e2b8dc52SVenkata Suresh Kumar P /* Node add to list */ 494e2b8dc52SVenkata Suresh Kumar P TAILQ_INSERT_TAIL(&obj->tap_list, tap, node); 495e2b8dc52SVenkata Suresh Kumar P 496e2b8dc52SVenkata Suresh Kumar P return tap; 497e2b8dc52SVenkata Suresh Kumar P } 498e2b8dc52SVenkata Suresh Kumar P 499e2b8dc52SVenkata Suresh Kumar P #endif 500e2b8dc52SVenkata Suresh Kumar P 501e2b8dc52SVenkata Suresh Kumar P /* 502b77f6600SCristian Dumitrescu * obj 503b77f6600SCristian Dumitrescu */ 504b77f6600SCristian Dumitrescu struct obj * 505b77f6600SCristian Dumitrescu obj_init(void) 506b77f6600SCristian Dumitrescu { 507b77f6600SCristian Dumitrescu struct obj *obj; 508b77f6600SCristian Dumitrescu 509b77f6600SCristian Dumitrescu obj = calloc(1, sizeof(struct obj)); 510b77f6600SCristian Dumitrescu if (!obj) 511b77f6600SCristian Dumitrescu return NULL; 512b77f6600SCristian Dumitrescu 513b77f6600SCristian Dumitrescu TAILQ_INIT(&obj->mempool_list); 514b77f6600SCristian Dumitrescu TAILQ_INIT(&obj->link_list); 51577a41301SCristian Dumitrescu TAILQ_INIT(&obj->ring_list); 516e2b8dc52SVenkata Suresh Kumar P TAILQ_INIT(&obj->tap_list); 517b77f6600SCristian Dumitrescu 518b77f6600SCristian Dumitrescu return obj; 519b77f6600SCristian Dumitrescu } 520