1d75c371eSJasvinder Singh /* SPDX-License-Identifier: BSD-3-Clause 2d75c371eSJasvinder Singh * Copyright(c) 2010-2018 Intel Corporation 3d75c371eSJasvinder Singh */ 4d75c371eSJasvinder Singh 5d75c371eSJasvinder Singh #include <stdlib.h> 6d75c371eSJasvinder Singh #include <string.h> 7d75c371eSJasvinder Singh 8d75c371eSJasvinder Singh #include <rte_common.h> 9d75c371eSJasvinder Singh #include <rte_ip.h> 10d75c371eSJasvinder Singh #include <rte_tcp.h> 11d75c371eSJasvinder Singh 127959831bSJasvinder Singh #include <rte_string_fns.h> 13d75c371eSJasvinder Singh #include <rte_port_ethdev.h> 14d75c371eSJasvinder Singh #include <rte_port_ring.h> 15d75c371eSJasvinder Singh #include <rte_port_source_sink.h> 16d75c371eSJasvinder Singh #include <rte_port_fd.h> 17d75c371eSJasvinder Singh #include <rte_port_sched.h> 18e1884698SFan Zhang #include <rte_port_sym_crypto.h> 19d75c371eSJasvinder Singh 20d75c371eSJasvinder Singh #include <rte_table_acl.h> 21d75c371eSJasvinder Singh #include <rte_table_array.h> 22d75c371eSJasvinder Singh #include <rte_table_hash.h> 23a5bd3a14SKevin Laatz #include <rte_table_hash_func.h> 24d75c371eSJasvinder Singh #include <rte_table_lpm.h> 25d75c371eSJasvinder Singh #include <rte_table_lpm_ipv6.h> 26d75c371eSJasvinder Singh #include <rte_table_stub.h> 27d75c371eSJasvinder Singh 28d75c371eSJasvinder Singh #include "link.h" 29d75c371eSJasvinder Singh #include "mempool.h" 30d75c371eSJasvinder Singh #include "pipeline.h" 31d75c371eSJasvinder Singh #include "tap.h" 32d75c371eSJasvinder Singh #include "tmgr.h" 33d75c371eSJasvinder Singh #include "swq.h" 34e1884698SFan Zhang #include "cryptodev.h" 35d75c371eSJasvinder Singh 36d75c371eSJasvinder Singh #ifndef PIPELINE_MSGQ_SIZE 37d75c371eSJasvinder Singh #define PIPELINE_MSGQ_SIZE 64 38d75c371eSJasvinder Singh #endif 39d75c371eSJasvinder Singh 40d75c371eSJasvinder Singh #ifndef TABLE_LPM_NUMBER_TBL8 41d75c371eSJasvinder Singh #define TABLE_LPM_NUMBER_TBL8 256 42d75c371eSJasvinder Singh #endif 43d75c371eSJasvinder Singh 44d75c371eSJasvinder Singh static struct pipeline_list pipeline_list; 45d75c371eSJasvinder Singh 46d75c371eSJasvinder Singh int 47d75c371eSJasvinder Singh pipeline_init(void) 48d75c371eSJasvinder Singh { 49d75c371eSJasvinder Singh TAILQ_INIT(&pipeline_list); 50d75c371eSJasvinder Singh 51d75c371eSJasvinder Singh return 0; 52d75c371eSJasvinder Singh } 53d75c371eSJasvinder Singh 54d75c371eSJasvinder Singh struct pipeline * 55d75c371eSJasvinder Singh pipeline_find(const char *name) 56d75c371eSJasvinder Singh { 57d75c371eSJasvinder Singh struct pipeline *pipeline; 58d75c371eSJasvinder Singh 59d75c371eSJasvinder Singh if (name == NULL) 60d75c371eSJasvinder Singh return NULL; 61d75c371eSJasvinder Singh 62d75c371eSJasvinder Singh TAILQ_FOREACH(pipeline, &pipeline_list, node) 63d75c371eSJasvinder Singh if (strcmp(name, pipeline->name) == 0) 64d75c371eSJasvinder Singh return pipeline; 65d75c371eSJasvinder Singh 66d75c371eSJasvinder Singh return NULL; 67d75c371eSJasvinder Singh } 68d75c371eSJasvinder Singh 69d75c371eSJasvinder Singh struct pipeline * 70d75c371eSJasvinder Singh pipeline_create(const char *name, struct pipeline_params *params) 71d75c371eSJasvinder Singh { 72d75c371eSJasvinder Singh char msgq_name[NAME_MAX]; 73d75c371eSJasvinder Singh struct rte_pipeline_params pp; 74d75c371eSJasvinder Singh struct pipeline *pipeline; 75d75c371eSJasvinder Singh struct rte_pipeline *p; 76d75c371eSJasvinder Singh struct rte_ring *msgq_req; 77d75c371eSJasvinder Singh struct rte_ring *msgq_rsp; 78d75c371eSJasvinder Singh 79d75c371eSJasvinder Singh /* Check input params */ 80d75c371eSJasvinder Singh if ((name == NULL) || 81d75c371eSJasvinder Singh pipeline_find(name) || 82d75c371eSJasvinder Singh (params == NULL) || 83d75c371eSJasvinder Singh (params->timer_period_ms == 0)) 84d75c371eSJasvinder Singh return NULL; 85d75c371eSJasvinder Singh 86d75c371eSJasvinder Singh /* Resource create */ 87d75c371eSJasvinder Singh snprintf(msgq_name, sizeof(msgq_name), "%s-MSGQ-REQ", name); 88d75c371eSJasvinder Singh 89d75c371eSJasvinder Singh msgq_req = rte_ring_create(msgq_name, 90d75c371eSJasvinder Singh PIPELINE_MSGQ_SIZE, 91d75c371eSJasvinder Singh params->cpu_id, 92d75c371eSJasvinder Singh RING_F_SP_ENQ | RING_F_SC_DEQ); 93d75c371eSJasvinder Singh if (msgq_req == NULL) 94d75c371eSJasvinder Singh return NULL; 95d75c371eSJasvinder Singh 96d75c371eSJasvinder Singh snprintf(msgq_name, sizeof(msgq_name), "%s-MSGQ-RSP", name); 97d75c371eSJasvinder Singh 98d75c371eSJasvinder Singh msgq_rsp = rte_ring_create(msgq_name, 99d75c371eSJasvinder Singh PIPELINE_MSGQ_SIZE, 100d75c371eSJasvinder Singh params->cpu_id, 101d75c371eSJasvinder Singh RING_F_SP_ENQ | RING_F_SC_DEQ); 102d75c371eSJasvinder Singh if (msgq_rsp == NULL) { 103d75c371eSJasvinder Singh rte_ring_free(msgq_req); 104d75c371eSJasvinder Singh return NULL; 105d75c371eSJasvinder Singh } 106d75c371eSJasvinder Singh 107d75c371eSJasvinder Singh pp.name = name; 108d75c371eSJasvinder Singh pp.socket_id = (int) params->cpu_id; 109d75c371eSJasvinder Singh pp.offset_port_id = params->offset_port_id; 110d75c371eSJasvinder Singh 111d75c371eSJasvinder Singh p = rte_pipeline_create(&pp); 112d75c371eSJasvinder Singh if (p == NULL) { 113d75c371eSJasvinder Singh rte_ring_free(msgq_rsp); 114d75c371eSJasvinder Singh rte_ring_free(msgq_req); 115d75c371eSJasvinder Singh return NULL; 116d75c371eSJasvinder Singh } 117d75c371eSJasvinder Singh 118d75c371eSJasvinder Singh /* Node allocation */ 119d75c371eSJasvinder Singh pipeline = calloc(1, sizeof(struct pipeline)); 120d75c371eSJasvinder Singh if (pipeline == NULL) { 121d75c371eSJasvinder Singh rte_pipeline_free(p); 122d75c371eSJasvinder Singh rte_ring_free(msgq_rsp); 123d75c371eSJasvinder Singh rte_ring_free(msgq_req); 124d75c371eSJasvinder Singh return NULL; 125d75c371eSJasvinder Singh } 126d75c371eSJasvinder Singh 127d75c371eSJasvinder Singh /* Node fill in */ 1287959831bSJasvinder Singh strlcpy(pipeline->name, name, sizeof(pipeline->name)); 129d75c371eSJasvinder Singh pipeline->p = p; 130d75c371eSJasvinder Singh pipeline->n_ports_in = 0; 131d75c371eSJasvinder Singh pipeline->n_ports_out = 0; 132d75c371eSJasvinder Singh pipeline->n_tables = 0; 133d75c371eSJasvinder Singh pipeline->msgq_req = msgq_req; 134d75c371eSJasvinder Singh pipeline->msgq_rsp = msgq_rsp; 135d75c371eSJasvinder Singh pipeline->timer_period_ms = params->timer_period_ms; 136d75c371eSJasvinder Singh pipeline->enabled = 0; 137d75c371eSJasvinder Singh pipeline->cpu_id = params->cpu_id; 138d75c371eSJasvinder Singh 139d75c371eSJasvinder Singh /* Node add to list */ 140d75c371eSJasvinder Singh TAILQ_INSERT_TAIL(&pipeline_list, pipeline, node); 141d75c371eSJasvinder Singh 142d75c371eSJasvinder Singh return pipeline; 143d75c371eSJasvinder Singh } 144d75c371eSJasvinder Singh 145d75c371eSJasvinder Singh int 146d75c371eSJasvinder Singh pipeline_port_in_create(const char *pipeline_name, 147d75c371eSJasvinder Singh struct port_in_params *params, 148d75c371eSJasvinder Singh int enabled) 149d75c371eSJasvinder Singh { 150d75c371eSJasvinder Singh struct rte_pipeline_port_in_params p; 151d75c371eSJasvinder Singh 152d75c371eSJasvinder Singh union { 153d75c371eSJasvinder Singh struct rte_port_ethdev_reader_params ethdev; 154d75c371eSJasvinder Singh struct rte_port_ring_reader_params ring; 155d75c371eSJasvinder Singh struct rte_port_sched_reader_params sched; 156d75c371eSJasvinder Singh struct rte_port_fd_reader_params fd; 157d75c371eSJasvinder Singh struct rte_port_source_params source; 158e1884698SFan Zhang struct rte_port_sym_crypto_reader_params sym_crypto; 159d75c371eSJasvinder Singh } pp; 160d75c371eSJasvinder Singh 161d75c371eSJasvinder Singh struct pipeline *pipeline; 162d75c371eSJasvinder Singh struct port_in *port_in; 163d75c371eSJasvinder Singh struct port_in_action_profile *ap; 164d75c371eSJasvinder Singh struct rte_port_in_action *action; 165d75c371eSJasvinder Singh uint32_t port_id; 166d75c371eSJasvinder Singh int status; 167d75c371eSJasvinder Singh 168d75c371eSJasvinder Singh memset(&p, 0, sizeof(p)); 169d75c371eSJasvinder Singh memset(&pp, 0, sizeof(pp)); 170d75c371eSJasvinder Singh 171d75c371eSJasvinder Singh /* Check input params */ 172d75c371eSJasvinder Singh if ((pipeline_name == NULL) || 173d75c371eSJasvinder Singh (params == NULL) || 174d75c371eSJasvinder Singh (params->burst_size == 0) || 175d75c371eSJasvinder Singh (params->burst_size > RTE_PORT_IN_BURST_SIZE_MAX)) 176d75c371eSJasvinder Singh return -1; 177d75c371eSJasvinder Singh 178d75c371eSJasvinder Singh pipeline = pipeline_find(pipeline_name); 179d75c371eSJasvinder Singh if (pipeline == NULL) 180d75c371eSJasvinder Singh return -1; 181d75c371eSJasvinder Singh 182d75c371eSJasvinder Singh ap = NULL; 183d75c371eSJasvinder Singh if (params->action_profile_name) { 184d75c371eSJasvinder Singh ap = port_in_action_profile_find(params->action_profile_name); 185d75c371eSJasvinder Singh if (ap == NULL) 186d75c371eSJasvinder Singh return -1; 187d75c371eSJasvinder Singh } 188d75c371eSJasvinder Singh 189d75c371eSJasvinder Singh switch (params->type) { 190d75c371eSJasvinder Singh case PORT_IN_RXQ: 191d75c371eSJasvinder Singh { 192d75c371eSJasvinder Singh struct link *link; 193d75c371eSJasvinder Singh 194d75c371eSJasvinder Singh link = link_find(params->dev_name); 195d75c371eSJasvinder Singh if (link == NULL) 196d75c371eSJasvinder Singh return -1; 197d75c371eSJasvinder Singh 198d75c371eSJasvinder Singh if (params->rxq.queue_id >= link->n_rxq) 199d75c371eSJasvinder Singh return -1; 200d75c371eSJasvinder Singh 201d75c371eSJasvinder Singh pp.ethdev.port_id = link->port_id; 202d75c371eSJasvinder Singh pp.ethdev.queue_id = params->rxq.queue_id; 203d75c371eSJasvinder Singh 204d75c371eSJasvinder Singh p.ops = &rte_port_ethdev_reader_ops; 205d75c371eSJasvinder Singh p.arg_create = &pp.ethdev; 206d75c371eSJasvinder Singh break; 207d75c371eSJasvinder Singh } 208d75c371eSJasvinder Singh 209d75c371eSJasvinder Singh case PORT_IN_SWQ: 210d75c371eSJasvinder Singh { 211d75c371eSJasvinder Singh struct swq *swq; 212d75c371eSJasvinder Singh 213d75c371eSJasvinder Singh swq = swq_find(params->dev_name); 214d75c371eSJasvinder Singh if (swq == NULL) 215d75c371eSJasvinder Singh return -1; 216d75c371eSJasvinder Singh 217d75c371eSJasvinder Singh pp.ring.ring = swq->r; 218d75c371eSJasvinder Singh 219d75c371eSJasvinder Singh p.ops = &rte_port_ring_reader_ops; 220d75c371eSJasvinder Singh p.arg_create = &pp.ring; 221d75c371eSJasvinder Singh break; 222d75c371eSJasvinder Singh } 223d75c371eSJasvinder Singh 224d75c371eSJasvinder Singh case PORT_IN_TMGR: 225d75c371eSJasvinder Singh { 226d75c371eSJasvinder Singh struct tmgr_port *tmgr_port; 227d75c371eSJasvinder Singh 228d75c371eSJasvinder Singh tmgr_port = tmgr_port_find(params->dev_name); 229d75c371eSJasvinder Singh if (tmgr_port == NULL) 230d75c371eSJasvinder Singh return -1; 231d75c371eSJasvinder Singh 232d75c371eSJasvinder Singh pp.sched.sched = tmgr_port->s; 233d75c371eSJasvinder Singh 234d75c371eSJasvinder Singh p.ops = &rte_port_sched_reader_ops; 235d75c371eSJasvinder Singh p.arg_create = &pp.sched; 236d75c371eSJasvinder Singh break; 237d75c371eSJasvinder Singh } 238d75c371eSJasvinder Singh 239d75c371eSJasvinder Singh case PORT_IN_TAP: 240d75c371eSJasvinder Singh { 241d75c371eSJasvinder Singh struct tap *tap; 242d75c371eSJasvinder Singh struct mempool *mempool; 243d75c371eSJasvinder Singh 244d75c371eSJasvinder Singh tap = tap_find(params->dev_name); 245d75c371eSJasvinder Singh mempool = mempool_find(params->tap.mempool_name); 246d75c371eSJasvinder Singh if ((tap == NULL) || (mempool == NULL)) 247d75c371eSJasvinder Singh return -1; 248d75c371eSJasvinder Singh 249d75c371eSJasvinder Singh pp.fd.fd = tap->fd; 250d75c371eSJasvinder Singh pp.fd.mempool = mempool->m; 251d75c371eSJasvinder Singh pp.fd.mtu = params->tap.mtu; 252d75c371eSJasvinder Singh 253d75c371eSJasvinder Singh p.ops = &rte_port_fd_reader_ops; 254d75c371eSJasvinder Singh p.arg_create = &pp.fd; 255d75c371eSJasvinder Singh break; 256d75c371eSJasvinder Singh } 257d75c371eSJasvinder Singh 258d75c371eSJasvinder Singh 259d75c371eSJasvinder Singh case PORT_IN_SOURCE: 260d75c371eSJasvinder Singh { 261d75c371eSJasvinder Singh struct mempool *mempool; 262d75c371eSJasvinder Singh 263d75c371eSJasvinder Singh mempool = mempool_find(params->source.mempool_name); 264d75c371eSJasvinder Singh if (mempool == NULL) 265d75c371eSJasvinder Singh return -1; 266d75c371eSJasvinder Singh 267d75c371eSJasvinder Singh pp.source.mempool = mempool->m; 268d75c371eSJasvinder Singh pp.source.file_name = params->source.file_name; 269d75c371eSJasvinder Singh pp.source.n_bytes_per_pkt = params->source.n_bytes_per_pkt; 270d75c371eSJasvinder Singh 271d75c371eSJasvinder Singh p.ops = &rte_port_source_ops; 272d75c371eSJasvinder Singh p.arg_create = &pp.source; 273d75c371eSJasvinder Singh break; 274d75c371eSJasvinder Singh } 275d75c371eSJasvinder Singh 276e1884698SFan Zhang case PORT_IN_CRYPTODEV: 277e1884698SFan Zhang { 278e1884698SFan Zhang struct cryptodev *cryptodev; 279e1884698SFan Zhang 280e1884698SFan Zhang cryptodev = cryptodev_find(params->dev_name); 281e1884698SFan Zhang if (cryptodev == NULL) 282e1884698SFan Zhang return -1; 283e1884698SFan Zhang 284e1884698SFan Zhang if (params->rxq.queue_id > cryptodev->n_queues - 1) 285e1884698SFan Zhang return -1; 286e1884698SFan Zhang 287e1884698SFan Zhang pp.sym_crypto.cryptodev_id = cryptodev->dev_id; 288e1884698SFan Zhang pp.sym_crypto.queue_id = params->cryptodev.queue_id; 289e1884698SFan Zhang pp.sym_crypto.f_callback = params->cryptodev.f_callback; 290e1884698SFan Zhang pp.sym_crypto.arg_callback = params->cryptodev.arg_callback; 291e1884698SFan Zhang p.ops = &rte_port_sym_crypto_reader_ops; 292e1884698SFan Zhang p.arg_create = &pp.sym_crypto; 293e1884698SFan Zhang 294e1884698SFan Zhang break; 295e1884698SFan Zhang } 296e1884698SFan Zhang 297d75c371eSJasvinder Singh default: 298d75c371eSJasvinder Singh return -1; 299d75c371eSJasvinder Singh } 300d75c371eSJasvinder Singh 301d75c371eSJasvinder Singh p.burst_size = params->burst_size; 302d75c371eSJasvinder Singh 303d75c371eSJasvinder Singh /* Resource create */ 304d75c371eSJasvinder Singh action = NULL; 305d75c371eSJasvinder Singh p.f_action = NULL; 306d75c371eSJasvinder Singh p.arg_ah = NULL; 307d75c371eSJasvinder Singh 308d75c371eSJasvinder Singh if (ap) { 309d75c371eSJasvinder Singh action = rte_port_in_action_create(ap->ap, 310d75c371eSJasvinder Singh pipeline->cpu_id); 311d75c371eSJasvinder Singh if (action == NULL) 312d75c371eSJasvinder Singh return -1; 313d75c371eSJasvinder Singh 314d75c371eSJasvinder Singh status = rte_port_in_action_params_get( 315d75c371eSJasvinder Singh action, 316d75c371eSJasvinder Singh &p); 317d75c371eSJasvinder Singh if (status) { 318d75c371eSJasvinder Singh rte_port_in_action_free(action); 319d75c371eSJasvinder Singh return -1; 320d75c371eSJasvinder Singh } 321d75c371eSJasvinder Singh } 322d75c371eSJasvinder Singh 323d75c371eSJasvinder Singh status = rte_pipeline_port_in_create(pipeline->p, 324d75c371eSJasvinder Singh &p, 325d75c371eSJasvinder Singh &port_id); 326d75c371eSJasvinder Singh if (status) { 327d75c371eSJasvinder Singh rte_port_in_action_free(action); 328d75c371eSJasvinder Singh return -1; 329d75c371eSJasvinder Singh } 330d75c371eSJasvinder Singh 331d75c371eSJasvinder Singh if (enabled) 332d75c371eSJasvinder Singh rte_pipeline_port_in_enable(pipeline->p, port_id); 333d75c371eSJasvinder Singh 334d75c371eSJasvinder Singh /* Pipeline */ 335d75c371eSJasvinder Singh port_in = &pipeline->port_in[pipeline->n_ports_in]; 336d75c371eSJasvinder Singh memcpy(&port_in->params, params, sizeof(*params)); 337d75c371eSJasvinder Singh port_in->ap = ap; 338d75c371eSJasvinder Singh port_in->a = action; 339d75c371eSJasvinder Singh pipeline->n_ports_in++; 340d75c371eSJasvinder Singh 341d75c371eSJasvinder Singh return 0; 342d75c371eSJasvinder Singh } 343d75c371eSJasvinder Singh 344d75c371eSJasvinder Singh int 345d75c371eSJasvinder Singh pipeline_port_in_connect_to_table(const char *pipeline_name, 346d75c371eSJasvinder Singh uint32_t port_id, 347d75c371eSJasvinder Singh uint32_t table_id) 348d75c371eSJasvinder Singh { 349d75c371eSJasvinder Singh struct pipeline *pipeline; 350d75c371eSJasvinder Singh int status; 351d75c371eSJasvinder Singh 352d75c371eSJasvinder Singh /* Check input params */ 353d75c371eSJasvinder Singh if (pipeline_name == NULL) 354d75c371eSJasvinder Singh return -1; 355d75c371eSJasvinder Singh 356d75c371eSJasvinder Singh pipeline = pipeline_find(pipeline_name); 357d75c371eSJasvinder Singh if ((pipeline == NULL) || 358d75c371eSJasvinder Singh (port_id >= pipeline->n_ports_in) || 359d75c371eSJasvinder Singh (table_id >= pipeline->n_tables)) 360d75c371eSJasvinder Singh return -1; 361d75c371eSJasvinder Singh 362d75c371eSJasvinder Singh /* Resource */ 363d75c371eSJasvinder Singh status = rte_pipeline_port_in_connect_to_table(pipeline->p, 364d75c371eSJasvinder Singh port_id, 365d75c371eSJasvinder Singh table_id); 366d75c371eSJasvinder Singh 367d75c371eSJasvinder Singh return status; 368d75c371eSJasvinder Singh 369d75c371eSJasvinder Singh } 370d75c371eSJasvinder Singh 371d75c371eSJasvinder Singh int 372d75c371eSJasvinder Singh pipeline_port_out_create(const char *pipeline_name, 373d75c371eSJasvinder Singh struct port_out_params *params) 374d75c371eSJasvinder Singh { 375d75c371eSJasvinder Singh struct rte_pipeline_port_out_params p; 376d75c371eSJasvinder Singh 377d75c371eSJasvinder Singh union { 378d75c371eSJasvinder Singh struct rte_port_ethdev_writer_params ethdev; 379d75c371eSJasvinder Singh struct rte_port_ring_writer_params ring; 380d75c371eSJasvinder Singh struct rte_port_sched_writer_params sched; 381d75c371eSJasvinder Singh struct rte_port_fd_writer_params fd; 382d75c371eSJasvinder Singh struct rte_port_sink_params sink; 383e1884698SFan Zhang struct rte_port_sym_crypto_writer_params sym_crypto; 384d75c371eSJasvinder Singh } pp; 385d75c371eSJasvinder Singh 386d75c371eSJasvinder Singh union { 387d75c371eSJasvinder Singh struct rte_port_ethdev_writer_nodrop_params ethdev; 388d75c371eSJasvinder Singh struct rte_port_ring_writer_nodrop_params ring; 389d75c371eSJasvinder Singh struct rte_port_fd_writer_nodrop_params fd; 390e1884698SFan Zhang struct rte_port_sym_crypto_writer_nodrop_params sym_crypto; 391d75c371eSJasvinder Singh } pp_nodrop; 392d75c371eSJasvinder Singh 393d75c371eSJasvinder Singh struct pipeline *pipeline; 394d75c371eSJasvinder Singh uint32_t port_id; 395d75c371eSJasvinder Singh int status; 396d75c371eSJasvinder Singh 397d75c371eSJasvinder Singh memset(&p, 0, sizeof(p)); 398d75c371eSJasvinder Singh memset(&pp, 0, sizeof(pp)); 399d75c371eSJasvinder Singh memset(&pp_nodrop, 0, sizeof(pp_nodrop)); 400d75c371eSJasvinder Singh 401d75c371eSJasvinder Singh /* Check input params */ 402d75c371eSJasvinder Singh if ((pipeline_name == NULL) || 403d75c371eSJasvinder Singh (params == NULL) || 404d75c371eSJasvinder Singh (params->burst_size == 0) || 405d75c371eSJasvinder Singh (params->burst_size > RTE_PORT_IN_BURST_SIZE_MAX)) 406d75c371eSJasvinder Singh return -1; 407d75c371eSJasvinder Singh 408d75c371eSJasvinder Singh pipeline = pipeline_find(pipeline_name); 409d75c371eSJasvinder Singh if (pipeline == NULL) 410d75c371eSJasvinder Singh return -1; 411d75c371eSJasvinder Singh 412d75c371eSJasvinder Singh switch (params->type) { 413d75c371eSJasvinder Singh case PORT_OUT_TXQ: 414d75c371eSJasvinder Singh { 415d75c371eSJasvinder Singh struct link *link; 416d75c371eSJasvinder Singh 417d75c371eSJasvinder Singh link = link_find(params->dev_name); 418d75c371eSJasvinder Singh if (link == NULL) 419d75c371eSJasvinder Singh return -1; 420d75c371eSJasvinder Singh 421d75c371eSJasvinder Singh if (params->txq.queue_id >= link->n_txq) 422d75c371eSJasvinder Singh return -1; 423d75c371eSJasvinder Singh 424d75c371eSJasvinder Singh pp.ethdev.port_id = link->port_id; 425d75c371eSJasvinder Singh pp.ethdev.queue_id = params->txq.queue_id; 426d75c371eSJasvinder Singh pp.ethdev.tx_burst_sz = params->burst_size; 427d75c371eSJasvinder Singh 428d75c371eSJasvinder Singh pp_nodrop.ethdev.port_id = link->port_id; 429d75c371eSJasvinder Singh pp_nodrop.ethdev.queue_id = params->txq.queue_id; 430d75c371eSJasvinder Singh pp_nodrop.ethdev.tx_burst_sz = params->burst_size; 431d75c371eSJasvinder Singh pp_nodrop.ethdev.n_retries = params->n_retries; 432d75c371eSJasvinder Singh 433d75c371eSJasvinder Singh if (params->retry == 0) { 434d75c371eSJasvinder Singh p.ops = &rte_port_ethdev_writer_ops; 435d75c371eSJasvinder Singh p.arg_create = &pp.ethdev; 436d75c371eSJasvinder Singh } else { 437d75c371eSJasvinder Singh p.ops = &rte_port_ethdev_writer_nodrop_ops; 438d75c371eSJasvinder Singh p.arg_create = &pp_nodrop.ethdev; 439d75c371eSJasvinder Singh } 440d75c371eSJasvinder Singh break; 441d75c371eSJasvinder Singh } 442d75c371eSJasvinder Singh 443d75c371eSJasvinder Singh case PORT_OUT_SWQ: 444d75c371eSJasvinder Singh { 445d75c371eSJasvinder Singh struct swq *swq; 446d75c371eSJasvinder Singh 447d75c371eSJasvinder Singh swq = swq_find(params->dev_name); 448d75c371eSJasvinder Singh if (swq == NULL) 449d75c371eSJasvinder Singh return -1; 450d75c371eSJasvinder Singh 451d75c371eSJasvinder Singh pp.ring.ring = swq->r; 452d75c371eSJasvinder Singh pp.ring.tx_burst_sz = params->burst_size; 453d75c371eSJasvinder Singh 454d75c371eSJasvinder Singh pp_nodrop.ring.ring = swq->r; 455d75c371eSJasvinder Singh pp_nodrop.ring.tx_burst_sz = params->burst_size; 456d75c371eSJasvinder Singh pp_nodrop.ring.n_retries = params->n_retries; 457d75c371eSJasvinder Singh 458d75c371eSJasvinder Singh if (params->retry == 0) { 459d75c371eSJasvinder Singh p.ops = &rte_port_ring_writer_ops; 460d75c371eSJasvinder Singh p.arg_create = &pp.ring; 461d75c371eSJasvinder Singh } else { 462d75c371eSJasvinder Singh p.ops = &rte_port_ring_writer_nodrop_ops; 463d75c371eSJasvinder Singh p.arg_create = &pp_nodrop.ring; 464d75c371eSJasvinder Singh } 465d75c371eSJasvinder Singh break; 466d75c371eSJasvinder Singh } 467d75c371eSJasvinder Singh 468d75c371eSJasvinder Singh case PORT_OUT_TMGR: 469d75c371eSJasvinder Singh { 470d75c371eSJasvinder Singh struct tmgr_port *tmgr_port; 471d75c371eSJasvinder Singh 472d75c371eSJasvinder Singh tmgr_port = tmgr_port_find(params->dev_name); 473d75c371eSJasvinder Singh if (tmgr_port == NULL) 474d75c371eSJasvinder Singh return -1; 475d75c371eSJasvinder Singh 476d75c371eSJasvinder Singh pp.sched.sched = tmgr_port->s; 477d75c371eSJasvinder Singh pp.sched.tx_burst_sz = params->burst_size; 478d75c371eSJasvinder Singh 479d75c371eSJasvinder Singh p.ops = &rte_port_sched_writer_ops; 480d75c371eSJasvinder Singh p.arg_create = &pp.sched; 481d75c371eSJasvinder Singh break; 482d75c371eSJasvinder Singh } 483d75c371eSJasvinder Singh 484d75c371eSJasvinder Singh case PORT_OUT_TAP: 485d75c371eSJasvinder Singh { 486d75c371eSJasvinder Singh struct tap *tap; 487d75c371eSJasvinder Singh 488d75c371eSJasvinder Singh tap = tap_find(params->dev_name); 489d75c371eSJasvinder Singh if (tap == NULL) 490d75c371eSJasvinder Singh return -1; 491d75c371eSJasvinder Singh 492d75c371eSJasvinder Singh pp.fd.fd = tap->fd; 493d75c371eSJasvinder Singh pp.fd.tx_burst_sz = params->burst_size; 494d75c371eSJasvinder Singh 495d75c371eSJasvinder Singh pp_nodrop.fd.fd = tap->fd; 496d75c371eSJasvinder Singh pp_nodrop.fd.tx_burst_sz = params->burst_size; 497d75c371eSJasvinder Singh pp_nodrop.fd.n_retries = params->n_retries; 498d75c371eSJasvinder Singh 499d75c371eSJasvinder Singh if (params->retry == 0) { 500d75c371eSJasvinder Singh p.ops = &rte_port_fd_writer_ops; 501d75c371eSJasvinder Singh p.arg_create = &pp.fd; 502d75c371eSJasvinder Singh } else { 503d75c371eSJasvinder Singh p.ops = &rte_port_fd_writer_nodrop_ops; 504d75c371eSJasvinder Singh p.arg_create = &pp_nodrop.fd; 505d75c371eSJasvinder Singh } 506d75c371eSJasvinder Singh break; 507d75c371eSJasvinder Singh } 508d75c371eSJasvinder Singh 509d75c371eSJasvinder Singh 510d75c371eSJasvinder Singh case PORT_OUT_SINK: 511d75c371eSJasvinder Singh { 512d75c371eSJasvinder Singh pp.sink.file_name = params->sink.file_name; 513d75c371eSJasvinder Singh pp.sink.max_n_pkts = params->sink.max_n_pkts; 514d75c371eSJasvinder Singh 515d75c371eSJasvinder Singh p.ops = &rte_port_sink_ops; 516d75c371eSJasvinder Singh p.arg_create = &pp.sink; 517d75c371eSJasvinder Singh break; 518d75c371eSJasvinder Singh } 519d75c371eSJasvinder Singh 520e1884698SFan Zhang case PORT_OUT_CRYPTODEV: 521e1884698SFan Zhang { 522e1884698SFan Zhang struct cryptodev *cryptodev; 523e1884698SFan Zhang 524e1884698SFan Zhang cryptodev = cryptodev_find(params->dev_name); 525e1884698SFan Zhang if (cryptodev == NULL) 526e1884698SFan Zhang return -1; 527e1884698SFan Zhang 528e1884698SFan Zhang if (params->cryptodev.queue_id >= cryptodev->n_queues) 529e1884698SFan Zhang return -1; 530e1884698SFan Zhang 531e1884698SFan Zhang pp.sym_crypto.cryptodev_id = cryptodev->dev_id; 532e1884698SFan Zhang pp.sym_crypto.queue_id = params->cryptodev.queue_id; 533e1884698SFan Zhang pp.sym_crypto.tx_burst_sz = params->burst_size; 534e1884698SFan Zhang pp.sym_crypto.crypto_op_offset = params->cryptodev.op_offset; 535e1884698SFan Zhang 536e1884698SFan Zhang pp_nodrop.sym_crypto.cryptodev_id = cryptodev->dev_id; 537e1884698SFan Zhang pp_nodrop.sym_crypto.queue_id = params->cryptodev.queue_id; 538e1884698SFan Zhang pp_nodrop.sym_crypto.tx_burst_sz = params->burst_size; 539e1884698SFan Zhang pp_nodrop.sym_crypto.n_retries = params->retry; 540e1884698SFan Zhang pp_nodrop.sym_crypto.crypto_op_offset = 541e1884698SFan Zhang params->cryptodev.op_offset; 542e1884698SFan Zhang 543e1884698SFan Zhang if (params->retry == 0) { 544e1884698SFan Zhang p.ops = &rte_port_sym_crypto_writer_ops; 545e1884698SFan Zhang p.arg_create = &pp.sym_crypto; 546e1884698SFan Zhang } else { 547e1884698SFan Zhang p.ops = &rte_port_sym_crypto_writer_nodrop_ops; 548e1884698SFan Zhang p.arg_create = &pp_nodrop.sym_crypto; 549e1884698SFan Zhang } 550e1884698SFan Zhang 551e1884698SFan Zhang break; 552e1884698SFan Zhang } 553e1884698SFan Zhang 554d75c371eSJasvinder Singh default: 555d75c371eSJasvinder Singh return -1; 556d75c371eSJasvinder Singh } 557d75c371eSJasvinder Singh 558d75c371eSJasvinder Singh p.f_action = NULL; 559d75c371eSJasvinder Singh p.arg_ah = NULL; 560d75c371eSJasvinder Singh 561d75c371eSJasvinder Singh /* Resource create */ 562d75c371eSJasvinder Singh status = rte_pipeline_port_out_create(pipeline->p, 563d75c371eSJasvinder Singh &p, 564d75c371eSJasvinder Singh &port_id); 565d75c371eSJasvinder Singh 566d75c371eSJasvinder Singh if (status) 567d75c371eSJasvinder Singh return -1; 568d75c371eSJasvinder Singh 569d75c371eSJasvinder Singh /* Pipeline */ 570d75c371eSJasvinder Singh pipeline->n_ports_out++; 571d75c371eSJasvinder Singh 572d75c371eSJasvinder Singh return 0; 573d75c371eSJasvinder Singh } 574d75c371eSJasvinder Singh 575d75c371eSJasvinder Singh static const struct rte_acl_field_def table_acl_field_format_ipv4[] = { 576d75c371eSJasvinder Singh /* Protocol */ 577d75c371eSJasvinder Singh [0] = { 578d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_BITMASK, 579d75c371eSJasvinder Singh .size = sizeof(uint8_t), 580d75c371eSJasvinder Singh .field_index = 0, 581d75c371eSJasvinder Singh .input_index = 0, 582a7c528e5SOlivier Matz .offset = offsetof(struct rte_ipv4_hdr, next_proto_id), 583d75c371eSJasvinder Singh }, 584d75c371eSJasvinder Singh 585d75c371eSJasvinder Singh /* Source IP address (IPv4) */ 586d75c371eSJasvinder Singh [1] = { 587d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_MASK, 588d75c371eSJasvinder Singh .size = sizeof(uint32_t), 589d75c371eSJasvinder Singh .field_index = 1, 590d75c371eSJasvinder Singh .input_index = 1, 591a7c528e5SOlivier Matz .offset = offsetof(struct rte_ipv4_hdr, src_addr), 592d75c371eSJasvinder Singh }, 593d75c371eSJasvinder Singh 594d75c371eSJasvinder Singh /* Destination IP address (IPv4) */ 595d75c371eSJasvinder Singh [2] = { 596d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_MASK, 597d75c371eSJasvinder Singh .size = sizeof(uint32_t), 598d75c371eSJasvinder Singh .field_index = 2, 599d75c371eSJasvinder Singh .input_index = 2, 600a7c528e5SOlivier Matz .offset = offsetof(struct rte_ipv4_hdr, dst_addr), 601d75c371eSJasvinder Singh }, 602d75c371eSJasvinder Singh 603d75c371eSJasvinder Singh /* Source Port */ 604d75c371eSJasvinder Singh [3] = { 605d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_RANGE, 606d75c371eSJasvinder Singh .size = sizeof(uint16_t), 607d75c371eSJasvinder Singh .field_index = 3, 608d75c371eSJasvinder Singh .input_index = 3, 609a7c528e5SOlivier Matz .offset = sizeof(struct rte_ipv4_hdr) + 610f41b5156SOlivier Matz offsetof(struct rte_tcp_hdr, src_port), 611d75c371eSJasvinder Singh }, 612d75c371eSJasvinder Singh 613d75c371eSJasvinder Singh /* Destination Port */ 614d75c371eSJasvinder Singh [4] = { 615d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_RANGE, 616d75c371eSJasvinder Singh .size = sizeof(uint16_t), 617d75c371eSJasvinder Singh .field_index = 4, 618d75c371eSJasvinder Singh .input_index = 3, 619a7c528e5SOlivier Matz .offset = sizeof(struct rte_ipv4_hdr) + 620f41b5156SOlivier Matz offsetof(struct rte_tcp_hdr, dst_port), 621d75c371eSJasvinder Singh }, 622d75c371eSJasvinder Singh }; 623d75c371eSJasvinder Singh 624d75c371eSJasvinder Singh static const struct rte_acl_field_def table_acl_field_format_ipv6[] = { 625d75c371eSJasvinder Singh /* Protocol */ 626d75c371eSJasvinder Singh [0] = { 627d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_BITMASK, 628d75c371eSJasvinder Singh .size = sizeof(uint8_t), 629d75c371eSJasvinder Singh .field_index = 0, 630d75c371eSJasvinder Singh .input_index = 0, 631a7c528e5SOlivier Matz .offset = offsetof(struct rte_ipv6_hdr, proto), 632d75c371eSJasvinder Singh }, 633d75c371eSJasvinder Singh 634d75c371eSJasvinder Singh /* Source IP address (IPv6) */ 635d75c371eSJasvinder Singh [1] = { 636d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_MASK, 637d75c371eSJasvinder Singh .size = sizeof(uint32_t), 638d75c371eSJasvinder Singh .field_index = 1, 639d75c371eSJasvinder Singh .input_index = 1, 640*89b5642dSRobin Jarry .offset = offsetof(struct rte_ipv6_hdr, src_addr.a[0]), 641d75c371eSJasvinder Singh }, 642d75c371eSJasvinder Singh 643d75c371eSJasvinder Singh [2] = { 644d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_MASK, 645d75c371eSJasvinder Singh .size = sizeof(uint32_t), 646d75c371eSJasvinder Singh .field_index = 2, 647d75c371eSJasvinder Singh .input_index = 2, 648*89b5642dSRobin Jarry .offset = offsetof(struct rte_ipv6_hdr, src_addr.a[4]), 649d75c371eSJasvinder Singh }, 650d75c371eSJasvinder Singh 651d75c371eSJasvinder Singh [3] = { 652d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_MASK, 653d75c371eSJasvinder Singh .size = sizeof(uint32_t), 654d75c371eSJasvinder Singh .field_index = 3, 655d75c371eSJasvinder Singh .input_index = 3, 656*89b5642dSRobin Jarry .offset = offsetof(struct rte_ipv6_hdr, src_addr.a[8]), 657d75c371eSJasvinder Singh }, 658d75c371eSJasvinder Singh 659d75c371eSJasvinder Singh [4] = { 660d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_MASK, 661d75c371eSJasvinder Singh .size = sizeof(uint32_t), 662d75c371eSJasvinder Singh .field_index = 4, 663d75c371eSJasvinder Singh .input_index = 4, 664*89b5642dSRobin Jarry .offset = offsetof(struct rte_ipv6_hdr, src_addr.a[12]), 665d75c371eSJasvinder Singh }, 666d75c371eSJasvinder Singh 667d75c371eSJasvinder Singh /* Destination IP address (IPv6) */ 668d75c371eSJasvinder Singh [5] = { 669d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_MASK, 670d75c371eSJasvinder Singh .size = sizeof(uint32_t), 671d75c371eSJasvinder Singh .field_index = 5, 672d75c371eSJasvinder Singh .input_index = 5, 673*89b5642dSRobin Jarry .offset = offsetof(struct rte_ipv6_hdr, dst_addr.a[0]), 674d75c371eSJasvinder Singh }, 675d75c371eSJasvinder Singh 676d75c371eSJasvinder Singh [6] = { 677d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_MASK, 678d75c371eSJasvinder Singh .size = sizeof(uint32_t), 679d75c371eSJasvinder Singh .field_index = 6, 680d75c371eSJasvinder Singh .input_index = 6, 681*89b5642dSRobin Jarry .offset = offsetof(struct rte_ipv6_hdr, dst_addr.a[4]), 682d75c371eSJasvinder Singh }, 683d75c371eSJasvinder Singh 684d75c371eSJasvinder Singh [7] = { 685d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_MASK, 686d75c371eSJasvinder Singh .size = sizeof(uint32_t), 687d75c371eSJasvinder Singh .field_index = 7, 688d75c371eSJasvinder Singh .input_index = 7, 689*89b5642dSRobin Jarry .offset = offsetof(struct rte_ipv6_hdr, dst_addr.a[8]), 690d75c371eSJasvinder Singh }, 691d75c371eSJasvinder Singh 692d75c371eSJasvinder Singh [8] = { 693d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_MASK, 694d75c371eSJasvinder Singh .size = sizeof(uint32_t), 695d75c371eSJasvinder Singh .field_index = 8, 696d75c371eSJasvinder Singh .input_index = 8, 697*89b5642dSRobin Jarry .offset = offsetof(struct rte_ipv6_hdr, dst_addr.a[12]), 698d75c371eSJasvinder Singh }, 699d75c371eSJasvinder Singh 700d75c371eSJasvinder Singh /* Source Port */ 701d75c371eSJasvinder Singh [9] = { 702d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_RANGE, 703d75c371eSJasvinder Singh .size = sizeof(uint16_t), 704d75c371eSJasvinder Singh .field_index = 9, 705d75c371eSJasvinder Singh .input_index = 9, 706a7c528e5SOlivier Matz .offset = sizeof(struct rte_ipv6_hdr) + 707f41b5156SOlivier Matz offsetof(struct rte_tcp_hdr, src_port), 708d75c371eSJasvinder Singh }, 709d75c371eSJasvinder Singh 710d75c371eSJasvinder Singh /* Destination Port */ 711d75c371eSJasvinder Singh [10] = { 712d75c371eSJasvinder Singh .type = RTE_ACL_FIELD_TYPE_RANGE, 713d75c371eSJasvinder Singh .size = sizeof(uint16_t), 714d75c371eSJasvinder Singh .field_index = 10, 715d75c371eSJasvinder Singh .input_index = 9, 716a7c528e5SOlivier Matz .offset = sizeof(struct rte_ipv6_hdr) + 717f41b5156SOlivier Matz offsetof(struct rte_tcp_hdr, dst_port), 718d75c371eSJasvinder Singh }, 719d75c371eSJasvinder Singh }; 720d75c371eSJasvinder Singh 721d75c371eSJasvinder Singh int 722d75c371eSJasvinder Singh pipeline_table_create(const char *pipeline_name, 723d75c371eSJasvinder Singh struct table_params *params) 724d75c371eSJasvinder Singh { 725d75c371eSJasvinder Singh char name[NAME_MAX]; 726d75c371eSJasvinder Singh struct rte_pipeline_table_params p; 727d75c371eSJasvinder Singh 728d75c371eSJasvinder Singh union { 729d75c371eSJasvinder Singh struct rte_table_acl_params acl; 730d75c371eSJasvinder Singh struct rte_table_array_params array; 731d75c371eSJasvinder Singh struct rte_table_hash_params hash; 732d75c371eSJasvinder Singh struct rte_table_lpm_params lpm; 733d75c371eSJasvinder Singh struct rte_table_lpm_ipv6_params lpm_ipv6; 734d75c371eSJasvinder Singh } pp; 735d75c371eSJasvinder Singh 736d75c371eSJasvinder Singh struct pipeline *pipeline; 737d75c371eSJasvinder Singh struct table *table; 738d75c371eSJasvinder Singh struct table_action_profile *ap; 739d75c371eSJasvinder Singh struct rte_table_action *action; 740d75c371eSJasvinder Singh uint32_t table_id; 741d75c371eSJasvinder Singh int status; 742d75c371eSJasvinder Singh 743d75c371eSJasvinder Singh memset(&p, 0, sizeof(p)); 744d75c371eSJasvinder Singh memset(&pp, 0, sizeof(pp)); 745d75c371eSJasvinder Singh 746d75c371eSJasvinder Singh /* Check input params */ 747d75c371eSJasvinder Singh if ((pipeline_name == NULL) || 748d75c371eSJasvinder Singh (params == NULL)) 749d75c371eSJasvinder Singh return -1; 750d75c371eSJasvinder Singh 751d75c371eSJasvinder Singh pipeline = pipeline_find(pipeline_name); 752d75c371eSJasvinder Singh if ((pipeline == NULL) || 753d75c371eSJasvinder Singh (pipeline->n_tables >= RTE_PIPELINE_TABLE_MAX)) 754d75c371eSJasvinder Singh return -1; 755d75c371eSJasvinder Singh 756d75c371eSJasvinder Singh ap = NULL; 757d75c371eSJasvinder Singh if (params->action_profile_name) { 758d75c371eSJasvinder Singh ap = table_action_profile_find(params->action_profile_name); 759d75c371eSJasvinder Singh if (ap == NULL) 760d75c371eSJasvinder Singh return -1; 761d75c371eSJasvinder Singh } 762d75c371eSJasvinder Singh 763d75c371eSJasvinder Singh snprintf(name, NAME_MAX, "%s_table%u", 764d75c371eSJasvinder Singh pipeline_name, pipeline->n_tables); 765d75c371eSJasvinder Singh 766d75c371eSJasvinder Singh switch (params->match_type) { 767d75c371eSJasvinder Singh case TABLE_ACL: 768d75c371eSJasvinder Singh { 769d75c371eSJasvinder Singh uint32_t ip_header_offset = params->match.acl.ip_header_offset - 770d75c371eSJasvinder Singh (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM); 771d75c371eSJasvinder Singh uint32_t i; 772d75c371eSJasvinder Singh 773d75c371eSJasvinder Singh if (params->match.acl.n_rules == 0) 774d75c371eSJasvinder Singh return -1; 775d75c371eSJasvinder Singh 776d75c371eSJasvinder Singh pp.acl.name = name; 777d75c371eSJasvinder Singh pp.acl.n_rules = params->match.acl.n_rules; 778d75c371eSJasvinder Singh if (params->match.acl.ip_version) { 779d75c371eSJasvinder Singh memcpy(&pp.acl.field_format, 780d75c371eSJasvinder Singh &table_acl_field_format_ipv4, 781d75c371eSJasvinder Singh sizeof(table_acl_field_format_ipv4)); 782d75c371eSJasvinder Singh pp.acl.n_rule_fields = 783d75c371eSJasvinder Singh RTE_DIM(table_acl_field_format_ipv4); 784d75c371eSJasvinder Singh } else { 785d75c371eSJasvinder Singh memcpy(&pp.acl.field_format, 786d75c371eSJasvinder Singh &table_acl_field_format_ipv6, 787d75c371eSJasvinder Singh sizeof(table_acl_field_format_ipv6)); 788d75c371eSJasvinder Singh pp.acl.n_rule_fields = 789d75c371eSJasvinder Singh RTE_DIM(table_acl_field_format_ipv6); 790d75c371eSJasvinder Singh } 791d75c371eSJasvinder Singh 792d75c371eSJasvinder Singh for (i = 0; i < pp.acl.n_rule_fields; i++) 793d75c371eSJasvinder Singh pp.acl.field_format[i].offset += ip_header_offset; 794d75c371eSJasvinder Singh 795d75c371eSJasvinder Singh p.ops = &rte_table_acl_ops; 796d75c371eSJasvinder Singh p.arg_create = &pp.acl; 797d75c371eSJasvinder Singh break; 798d75c371eSJasvinder Singh } 799d75c371eSJasvinder Singh 800d75c371eSJasvinder Singh case TABLE_ARRAY: 801d75c371eSJasvinder Singh { 802d75c371eSJasvinder Singh if (params->match.array.n_keys == 0) 803d75c371eSJasvinder Singh return -1; 804d75c371eSJasvinder Singh 805d75c371eSJasvinder Singh pp.array.n_entries = params->match.array.n_keys; 806d75c371eSJasvinder Singh pp.array.offset = params->match.array.key_offset; 807d75c371eSJasvinder Singh 808d75c371eSJasvinder Singh p.ops = &rte_table_array_ops; 809d75c371eSJasvinder Singh p.arg_create = &pp.array; 810d75c371eSJasvinder Singh break; 811d75c371eSJasvinder Singh } 812d75c371eSJasvinder Singh 813d75c371eSJasvinder Singh case TABLE_HASH: 814d75c371eSJasvinder Singh { 815d75c371eSJasvinder Singh struct rte_table_ops *ops; 816d75c371eSJasvinder Singh rte_table_hash_op_hash f_hash; 817d75c371eSJasvinder Singh 818d75c371eSJasvinder Singh if (params->match.hash.n_keys == 0) 819d75c371eSJasvinder Singh return -1; 820d75c371eSJasvinder Singh 821d75c371eSJasvinder Singh switch (params->match.hash.key_size) { 822d75c371eSJasvinder Singh case 8: 823a5bd3a14SKevin Laatz f_hash = rte_table_hash_crc_key8; 824d75c371eSJasvinder Singh break; 825d75c371eSJasvinder Singh case 16: 826a5bd3a14SKevin Laatz f_hash = rte_table_hash_crc_key16; 827d75c371eSJasvinder Singh break; 828d75c371eSJasvinder Singh case 24: 829a5bd3a14SKevin Laatz f_hash = rte_table_hash_crc_key24; 830d75c371eSJasvinder Singh break; 831d75c371eSJasvinder Singh case 32: 832a5bd3a14SKevin Laatz f_hash = rte_table_hash_crc_key32; 833d75c371eSJasvinder Singh break; 834d75c371eSJasvinder Singh case 40: 835a5bd3a14SKevin Laatz f_hash = rte_table_hash_crc_key40; 836d75c371eSJasvinder Singh break; 837d75c371eSJasvinder Singh case 48: 838a5bd3a14SKevin Laatz f_hash = rte_table_hash_crc_key48; 839d75c371eSJasvinder Singh break; 840d75c371eSJasvinder Singh case 56: 841a5bd3a14SKevin Laatz f_hash = rte_table_hash_crc_key56; 842d75c371eSJasvinder Singh break; 843d75c371eSJasvinder Singh case 64: 844a5bd3a14SKevin Laatz f_hash = rte_table_hash_crc_key64; 845d75c371eSJasvinder Singh break; 846d75c371eSJasvinder Singh default: 847d75c371eSJasvinder Singh return -1; 848d75c371eSJasvinder Singh } 849d75c371eSJasvinder Singh 850d75c371eSJasvinder Singh pp.hash.name = name; 851d75c371eSJasvinder Singh pp.hash.key_size = params->match.hash.key_size; 852d75c371eSJasvinder Singh pp.hash.key_offset = params->match.hash.key_offset; 853d75c371eSJasvinder Singh pp.hash.key_mask = params->match.hash.key_mask; 854d75c371eSJasvinder Singh pp.hash.n_keys = params->match.hash.n_keys; 855d75c371eSJasvinder Singh pp.hash.n_buckets = params->match.hash.n_buckets; 856d75c371eSJasvinder Singh pp.hash.f_hash = f_hash; 857d75c371eSJasvinder Singh pp.hash.seed = 0; 858d75c371eSJasvinder Singh 859d75c371eSJasvinder Singh if (params->match.hash.extendable_bucket) 860d75c371eSJasvinder Singh switch (params->match.hash.key_size) { 861d75c371eSJasvinder Singh case 8: 862d75c371eSJasvinder Singh ops = &rte_table_hash_key8_ext_ops; 863d75c371eSJasvinder Singh break; 864d75c371eSJasvinder Singh case 16: 865d75c371eSJasvinder Singh ops = &rte_table_hash_key16_ext_ops; 866d75c371eSJasvinder Singh break; 867d75c371eSJasvinder Singh default: 868d75c371eSJasvinder Singh ops = &rte_table_hash_ext_ops; 869d75c371eSJasvinder Singh } 870d75c371eSJasvinder Singh else 871d75c371eSJasvinder Singh switch (params->match.hash.key_size) { 872d75c371eSJasvinder Singh case 8: 873d75c371eSJasvinder Singh ops = &rte_table_hash_key8_lru_ops; 874d75c371eSJasvinder Singh break; 875d75c371eSJasvinder Singh case 16: 876d75c371eSJasvinder Singh ops = &rte_table_hash_key16_lru_ops; 877d75c371eSJasvinder Singh break; 878d75c371eSJasvinder Singh default: 879d75c371eSJasvinder Singh ops = &rte_table_hash_lru_ops; 880d75c371eSJasvinder Singh } 881d75c371eSJasvinder Singh 882d75c371eSJasvinder Singh p.ops = ops; 883d75c371eSJasvinder Singh p.arg_create = &pp.hash; 884d75c371eSJasvinder Singh break; 885d75c371eSJasvinder Singh } 886d75c371eSJasvinder Singh 887d75c371eSJasvinder Singh case TABLE_LPM: 888d75c371eSJasvinder Singh { 889d75c371eSJasvinder Singh if (params->match.lpm.n_rules == 0) 890d75c371eSJasvinder Singh return -1; 891d75c371eSJasvinder Singh 892d75c371eSJasvinder Singh switch (params->match.lpm.key_size) { 893d75c371eSJasvinder Singh case 4: 894d75c371eSJasvinder Singh { 895d75c371eSJasvinder Singh pp.lpm.name = name; 896d75c371eSJasvinder Singh pp.lpm.n_rules = params->match.lpm.n_rules; 897d75c371eSJasvinder Singh pp.lpm.number_tbl8s = TABLE_LPM_NUMBER_TBL8; 898d75c371eSJasvinder Singh pp.lpm.flags = 0; 899d75c371eSJasvinder Singh pp.lpm.entry_unique_size = p.action_data_size + 900d75c371eSJasvinder Singh sizeof(struct rte_pipeline_table_entry); 901d75c371eSJasvinder Singh pp.lpm.offset = params->match.lpm.key_offset; 902d75c371eSJasvinder Singh 903d75c371eSJasvinder Singh p.ops = &rte_table_lpm_ops; 904d75c371eSJasvinder Singh p.arg_create = &pp.lpm; 905d75c371eSJasvinder Singh break; 906d75c371eSJasvinder Singh } 907d75c371eSJasvinder Singh 908d75c371eSJasvinder Singh case 16: 909d75c371eSJasvinder Singh { 910d75c371eSJasvinder Singh pp.lpm_ipv6.name = name; 911d75c371eSJasvinder Singh pp.lpm_ipv6.n_rules = params->match.lpm.n_rules; 912d75c371eSJasvinder Singh pp.lpm_ipv6.number_tbl8s = TABLE_LPM_NUMBER_TBL8; 913d75c371eSJasvinder Singh pp.lpm_ipv6.entry_unique_size = p.action_data_size + 914d75c371eSJasvinder Singh sizeof(struct rte_pipeline_table_entry); 915d75c371eSJasvinder Singh pp.lpm_ipv6.offset = params->match.lpm.key_offset; 916d75c371eSJasvinder Singh 917d75c371eSJasvinder Singh p.ops = &rte_table_lpm_ipv6_ops; 918d75c371eSJasvinder Singh p.arg_create = &pp.lpm_ipv6; 919d75c371eSJasvinder Singh break; 920d75c371eSJasvinder Singh } 921d75c371eSJasvinder Singh 922d75c371eSJasvinder Singh default: 923d75c371eSJasvinder Singh return -1; 924d75c371eSJasvinder Singh } 925d75c371eSJasvinder Singh 926d75c371eSJasvinder Singh break; 927d75c371eSJasvinder Singh } 928d75c371eSJasvinder Singh 929d75c371eSJasvinder Singh case TABLE_STUB: 930d75c371eSJasvinder Singh { 931d75c371eSJasvinder Singh p.ops = &rte_table_stub_ops; 932d75c371eSJasvinder Singh p.arg_create = NULL; 933d75c371eSJasvinder Singh break; 934d75c371eSJasvinder Singh } 935d75c371eSJasvinder Singh 936d75c371eSJasvinder Singh default: 937d75c371eSJasvinder Singh return -1; 938d75c371eSJasvinder Singh } 939d75c371eSJasvinder Singh 940d75c371eSJasvinder Singh /* Resource create */ 941d75c371eSJasvinder Singh action = NULL; 942d75c371eSJasvinder Singh p.f_action_hit = NULL; 943d75c371eSJasvinder Singh p.f_action_miss = NULL; 944d75c371eSJasvinder Singh p.arg_ah = NULL; 945d75c371eSJasvinder Singh 946d75c371eSJasvinder Singh if (ap) { 947d75c371eSJasvinder Singh action = rte_table_action_create(ap->ap, 948d75c371eSJasvinder Singh pipeline->cpu_id); 949d75c371eSJasvinder Singh if (action == NULL) 950d75c371eSJasvinder Singh return -1; 951d75c371eSJasvinder Singh 952d75c371eSJasvinder Singh status = rte_table_action_table_params_get( 953d75c371eSJasvinder Singh action, 954d75c371eSJasvinder Singh &p); 955d75c371eSJasvinder Singh if (status || 956d75c371eSJasvinder Singh ((p.action_data_size + 957d75c371eSJasvinder Singh sizeof(struct rte_pipeline_table_entry)) > 958d75c371eSJasvinder Singh TABLE_RULE_ACTION_SIZE_MAX)) { 959d75c371eSJasvinder Singh rte_table_action_free(action); 960d75c371eSJasvinder Singh return -1; 961d75c371eSJasvinder Singh } 962d75c371eSJasvinder Singh } 963d75c371eSJasvinder Singh 964d75c371eSJasvinder Singh if (params->match_type == TABLE_LPM) { 965d75c371eSJasvinder Singh if (params->match.lpm.key_size == 4) 966d75c371eSJasvinder Singh pp.lpm.entry_unique_size = p.action_data_size + 967d75c371eSJasvinder Singh sizeof(struct rte_pipeline_table_entry); 968d75c371eSJasvinder Singh 969d75c371eSJasvinder Singh if (params->match.lpm.key_size == 16) 970d75c371eSJasvinder Singh pp.lpm_ipv6.entry_unique_size = p.action_data_size + 971d75c371eSJasvinder Singh sizeof(struct rte_pipeline_table_entry); 972d75c371eSJasvinder Singh } 973d75c371eSJasvinder Singh 974d75c371eSJasvinder Singh status = rte_pipeline_table_create(pipeline->p, 975d75c371eSJasvinder Singh &p, 976d75c371eSJasvinder Singh &table_id); 977d75c371eSJasvinder Singh if (status) { 978d75c371eSJasvinder Singh rte_table_action_free(action); 979d75c371eSJasvinder Singh return -1; 980d75c371eSJasvinder Singh } 981d75c371eSJasvinder Singh 982d75c371eSJasvinder Singh /* Pipeline */ 983d75c371eSJasvinder Singh table = &pipeline->table[pipeline->n_tables]; 984d75c371eSJasvinder Singh memcpy(&table->params, params, sizeof(*params)); 985d75c371eSJasvinder Singh table->ap = ap; 986d75c371eSJasvinder Singh table->a = action; 98735c10b58SCristian Dumitrescu TAILQ_INIT(&table->rules); 98835c10b58SCristian Dumitrescu table->rule_default = NULL; 98935c10b58SCristian Dumitrescu 990d75c371eSJasvinder Singh pipeline->n_tables++; 991d75c371eSJasvinder Singh 992d75c371eSJasvinder Singh return 0; 993d75c371eSJasvinder Singh } 99435c10b58SCristian Dumitrescu 99535c10b58SCristian Dumitrescu struct table_rule * 99635c10b58SCristian Dumitrescu table_rule_find(struct table *table, 99735c10b58SCristian Dumitrescu struct table_rule_match *match) 99835c10b58SCristian Dumitrescu { 99935c10b58SCristian Dumitrescu struct table_rule *rule; 100035c10b58SCristian Dumitrescu 100135c10b58SCristian Dumitrescu TAILQ_FOREACH(rule, &table->rules, node) 100235c10b58SCristian Dumitrescu if (memcmp(&rule->match, match, sizeof(*match)) == 0) 100335c10b58SCristian Dumitrescu return rule; 100435c10b58SCristian Dumitrescu 100535c10b58SCristian Dumitrescu return NULL; 100635c10b58SCristian Dumitrescu } 100735c10b58SCristian Dumitrescu 100835c10b58SCristian Dumitrescu void 100935c10b58SCristian Dumitrescu table_rule_add(struct table *table, 101035c10b58SCristian Dumitrescu struct table_rule *new_rule) 101135c10b58SCristian Dumitrescu { 101235c10b58SCristian Dumitrescu struct table_rule *existing_rule; 101335c10b58SCristian Dumitrescu 101435c10b58SCristian Dumitrescu existing_rule = table_rule_find(table, &new_rule->match); 101535c10b58SCristian Dumitrescu if (existing_rule == NULL) 101635c10b58SCristian Dumitrescu TAILQ_INSERT_TAIL(&table->rules, new_rule, node); 101735c10b58SCristian Dumitrescu else { 101835c10b58SCristian Dumitrescu TAILQ_INSERT_AFTER(&table->rules, existing_rule, new_rule, node); 101935c10b58SCristian Dumitrescu TAILQ_REMOVE(&table->rules, existing_rule, node); 102035c10b58SCristian Dumitrescu free(existing_rule); 102135c10b58SCristian Dumitrescu } 102235c10b58SCristian Dumitrescu } 102335c10b58SCristian Dumitrescu 102435c10b58SCristian Dumitrescu void 102535c10b58SCristian Dumitrescu table_rule_add_bulk(struct table *table, 102635c10b58SCristian Dumitrescu struct table_rule_list *list, 102735c10b58SCristian Dumitrescu uint32_t n_rules) 102835c10b58SCristian Dumitrescu { 102935c10b58SCristian Dumitrescu uint32_t i; 103035c10b58SCristian Dumitrescu 103135c10b58SCristian Dumitrescu for (i = 0; i < n_rules; i++) { 103235c10b58SCristian Dumitrescu struct table_rule *existing_rule, *new_rule; 103335c10b58SCristian Dumitrescu 103435c10b58SCristian Dumitrescu new_rule = TAILQ_FIRST(list); 103535c10b58SCristian Dumitrescu if (new_rule == NULL) 103635c10b58SCristian Dumitrescu break; 103735c10b58SCristian Dumitrescu 103835c10b58SCristian Dumitrescu TAILQ_REMOVE(list, new_rule, node); 103935c10b58SCristian Dumitrescu 104035c10b58SCristian Dumitrescu existing_rule = table_rule_find(table, &new_rule->match); 104135c10b58SCristian Dumitrescu if (existing_rule == NULL) 104235c10b58SCristian Dumitrescu TAILQ_INSERT_TAIL(&table->rules, new_rule, node); 104335c10b58SCristian Dumitrescu else { 104435c10b58SCristian Dumitrescu TAILQ_INSERT_AFTER(&table->rules, existing_rule, new_rule, node); 104535c10b58SCristian Dumitrescu TAILQ_REMOVE(&table->rules, existing_rule, node); 104635c10b58SCristian Dumitrescu free(existing_rule); 104735c10b58SCristian Dumitrescu } 104835c10b58SCristian Dumitrescu } 104935c10b58SCristian Dumitrescu } 105035c10b58SCristian Dumitrescu 105135c10b58SCristian Dumitrescu void 105235c10b58SCristian Dumitrescu table_rule_delete(struct table *table, 105335c10b58SCristian Dumitrescu struct table_rule_match *match) 105435c10b58SCristian Dumitrescu { 105535c10b58SCristian Dumitrescu struct table_rule *rule; 105635c10b58SCristian Dumitrescu 105735c10b58SCristian Dumitrescu rule = table_rule_find(table, match); 105835c10b58SCristian Dumitrescu if (rule == NULL) 105935c10b58SCristian Dumitrescu return; 106035c10b58SCristian Dumitrescu 106135c10b58SCristian Dumitrescu TAILQ_REMOVE(&table->rules, rule, node); 106235c10b58SCristian Dumitrescu free(rule); 106335c10b58SCristian Dumitrescu } 106435c10b58SCristian Dumitrescu 106535c10b58SCristian Dumitrescu void 106635c10b58SCristian Dumitrescu table_rule_default_add(struct table *table, 106735c10b58SCristian Dumitrescu struct table_rule *rule) 106835c10b58SCristian Dumitrescu { 106935c10b58SCristian Dumitrescu free(table->rule_default); 107035c10b58SCristian Dumitrescu table->rule_default = rule; 107135c10b58SCristian Dumitrescu } 107235c10b58SCristian Dumitrescu 107335c10b58SCristian Dumitrescu void 107435c10b58SCristian Dumitrescu table_rule_default_delete(struct table *table) 107535c10b58SCristian Dumitrescu { 107635c10b58SCristian Dumitrescu free(table->rule_default); 107735c10b58SCristian Dumitrescu table->rule_default = NULL; 107835c10b58SCristian Dumitrescu } 1079