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