1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606 * Copyright(c) 2020 Intel Corporation
3*2d9fd380Sjfb8856606 */
4*2d9fd380Sjfb8856606
5*2d9fd380Sjfb8856606 #include <stdlib.h>
6*2d9fd380Sjfb8856606 #include <string.h>
7*2d9fd380Sjfb8856606
8*2d9fd380Sjfb8856606 #include <rte_mempool.h>
9*2d9fd380Sjfb8856606 #include <rte_mbuf.h>
10*2d9fd380Sjfb8856606 #include <rte_ethdev.h>
11*2d9fd380Sjfb8856606 #include <rte_swx_port_ethdev.h>
12*2d9fd380Sjfb8856606 #include <rte_swx_port_source_sink.h>
13*2d9fd380Sjfb8856606 #include <rte_swx_table_em.h>
14*2d9fd380Sjfb8856606 #include <rte_swx_pipeline.h>
15*2d9fd380Sjfb8856606 #include <rte_swx_ctl.h>
16*2d9fd380Sjfb8856606
17*2d9fd380Sjfb8856606 #include "obj.h"
18*2d9fd380Sjfb8856606
19*2d9fd380Sjfb8856606 /*
20*2d9fd380Sjfb8856606 * mempool
21*2d9fd380Sjfb8856606 */
22*2d9fd380Sjfb8856606 TAILQ_HEAD(mempool_list, mempool);
23*2d9fd380Sjfb8856606
24*2d9fd380Sjfb8856606 /*
25*2d9fd380Sjfb8856606 * link
26*2d9fd380Sjfb8856606 */
27*2d9fd380Sjfb8856606 TAILQ_HEAD(link_list, link);
28*2d9fd380Sjfb8856606
29*2d9fd380Sjfb8856606 /*
30*2d9fd380Sjfb8856606 * pipeline
31*2d9fd380Sjfb8856606 */
32*2d9fd380Sjfb8856606 TAILQ_HEAD(pipeline_list, pipeline);
33*2d9fd380Sjfb8856606
34*2d9fd380Sjfb8856606 /*
35*2d9fd380Sjfb8856606 * obj
36*2d9fd380Sjfb8856606 */
37*2d9fd380Sjfb8856606 struct obj {
38*2d9fd380Sjfb8856606 struct mempool_list mempool_list;
39*2d9fd380Sjfb8856606 struct link_list link_list;
40*2d9fd380Sjfb8856606 struct pipeline_list pipeline_list;
41*2d9fd380Sjfb8856606 };
42*2d9fd380Sjfb8856606
43*2d9fd380Sjfb8856606 /*
44*2d9fd380Sjfb8856606 * mempool
45*2d9fd380Sjfb8856606 */
46*2d9fd380Sjfb8856606 #define BUFFER_SIZE_MIN (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
47*2d9fd380Sjfb8856606
48*2d9fd380Sjfb8856606 struct mempool *
mempool_create(struct obj * obj,const char * name,struct mempool_params * params)49*2d9fd380Sjfb8856606 mempool_create(struct obj *obj, const char *name, struct mempool_params *params)
50*2d9fd380Sjfb8856606 {
51*2d9fd380Sjfb8856606 struct mempool *mempool;
52*2d9fd380Sjfb8856606 struct rte_mempool *m;
53*2d9fd380Sjfb8856606
54*2d9fd380Sjfb8856606 /* Check input params */
55*2d9fd380Sjfb8856606 if ((name == NULL) ||
56*2d9fd380Sjfb8856606 mempool_find(obj, name) ||
57*2d9fd380Sjfb8856606 (params == NULL) ||
58*2d9fd380Sjfb8856606 (params->buffer_size < BUFFER_SIZE_MIN) ||
59*2d9fd380Sjfb8856606 (params->pool_size == 0))
60*2d9fd380Sjfb8856606 return NULL;
61*2d9fd380Sjfb8856606
62*2d9fd380Sjfb8856606 /* Resource create */
63*2d9fd380Sjfb8856606 m = rte_pktmbuf_pool_create(
64*2d9fd380Sjfb8856606 name,
65*2d9fd380Sjfb8856606 params->pool_size,
66*2d9fd380Sjfb8856606 params->cache_size,
67*2d9fd380Sjfb8856606 0,
68*2d9fd380Sjfb8856606 params->buffer_size - sizeof(struct rte_mbuf),
69*2d9fd380Sjfb8856606 params->cpu_id);
70*2d9fd380Sjfb8856606
71*2d9fd380Sjfb8856606 if (m == NULL)
72*2d9fd380Sjfb8856606 return NULL;
73*2d9fd380Sjfb8856606
74*2d9fd380Sjfb8856606 /* Node allocation */
75*2d9fd380Sjfb8856606 mempool = calloc(1, sizeof(struct mempool));
76*2d9fd380Sjfb8856606 if (mempool == NULL) {
77*2d9fd380Sjfb8856606 rte_mempool_free(m);
78*2d9fd380Sjfb8856606 return NULL;
79*2d9fd380Sjfb8856606 }
80*2d9fd380Sjfb8856606
81*2d9fd380Sjfb8856606 /* Node fill in */
82*2d9fd380Sjfb8856606 strlcpy(mempool->name, name, sizeof(mempool->name));
83*2d9fd380Sjfb8856606 mempool->m = m;
84*2d9fd380Sjfb8856606 mempool->buffer_size = params->buffer_size;
85*2d9fd380Sjfb8856606
86*2d9fd380Sjfb8856606 /* Node add to list */
87*2d9fd380Sjfb8856606 TAILQ_INSERT_TAIL(&obj->mempool_list, mempool, node);
88*2d9fd380Sjfb8856606
89*2d9fd380Sjfb8856606 return mempool;
90*2d9fd380Sjfb8856606 }
91*2d9fd380Sjfb8856606
92*2d9fd380Sjfb8856606 struct mempool *
mempool_find(struct obj * obj,const char * name)93*2d9fd380Sjfb8856606 mempool_find(struct obj *obj, const char *name)
94*2d9fd380Sjfb8856606 {
95*2d9fd380Sjfb8856606 struct mempool *mempool;
96*2d9fd380Sjfb8856606
97*2d9fd380Sjfb8856606 if (!obj || !name)
98*2d9fd380Sjfb8856606 return NULL;
99*2d9fd380Sjfb8856606
100*2d9fd380Sjfb8856606 TAILQ_FOREACH(mempool, &obj->mempool_list, node)
101*2d9fd380Sjfb8856606 if (strcmp(mempool->name, name) == 0)
102*2d9fd380Sjfb8856606 return mempool;
103*2d9fd380Sjfb8856606
104*2d9fd380Sjfb8856606 return NULL;
105*2d9fd380Sjfb8856606 }
106*2d9fd380Sjfb8856606
107*2d9fd380Sjfb8856606 /*
108*2d9fd380Sjfb8856606 * link
109*2d9fd380Sjfb8856606 */
110*2d9fd380Sjfb8856606 static struct rte_eth_conf port_conf_default = {
111*2d9fd380Sjfb8856606 .link_speeds = 0,
112*2d9fd380Sjfb8856606 .rxmode = {
113*2d9fd380Sjfb8856606 .mq_mode = ETH_MQ_RX_NONE,
114*2d9fd380Sjfb8856606 .max_rx_pkt_len = 9000, /* Jumbo frame max packet len */
115*2d9fd380Sjfb8856606 .split_hdr_size = 0, /* Header split buffer size */
116*2d9fd380Sjfb8856606 },
117*2d9fd380Sjfb8856606 .rx_adv_conf = {
118*2d9fd380Sjfb8856606 .rss_conf = {
119*2d9fd380Sjfb8856606 .rss_key = NULL,
120*2d9fd380Sjfb8856606 .rss_key_len = 40,
121*2d9fd380Sjfb8856606 .rss_hf = 0,
122*2d9fd380Sjfb8856606 },
123*2d9fd380Sjfb8856606 },
124*2d9fd380Sjfb8856606 .txmode = {
125*2d9fd380Sjfb8856606 .mq_mode = ETH_MQ_TX_NONE,
126*2d9fd380Sjfb8856606 },
127*2d9fd380Sjfb8856606 .lpbk_mode = 0,
128*2d9fd380Sjfb8856606 };
129*2d9fd380Sjfb8856606
130*2d9fd380Sjfb8856606 #define RETA_CONF_SIZE (ETH_RSS_RETA_SIZE_512 / RTE_RETA_GROUP_SIZE)
131*2d9fd380Sjfb8856606
132*2d9fd380Sjfb8856606 static int
rss_setup(uint16_t port_id,uint16_t reta_size,struct link_params_rss * rss)133*2d9fd380Sjfb8856606 rss_setup(uint16_t port_id,
134*2d9fd380Sjfb8856606 uint16_t reta_size,
135*2d9fd380Sjfb8856606 struct link_params_rss *rss)
136*2d9fd380Sjfb8856606 {
137*2d9fd380Sjfb8856606 struct rte_eth_rss_reta_entry64 reta_conf[RETA_CONF_SIZE];
138*2d9fd380Sjfb8856606 uint32_t i;
139*2d9fd380Sjfb8856606 int status;
140*2d9fd380Sjfb8856606
141*2d9fd380Sjfb8856606 /* RETA setting */
142*2d9fd380Sjfb8856606 memset(reta_conf, 0, sizeof(reta_conf));
143*2d9fd380Sjfb8856606
144*2d9fd380Sjfb8856606 for (i = 0; i < reta_size; i++)
145*2d9fd380Sjfb8856606 reta_conf[i / RTE_RETA_GROUP_SIZE].mask = UINT64_MAX;
146*2d9fd380Sjfb8856606
147*2d9fd380Sjfb8856606 for (i = 0; i < reta_size; i++) {
148*2d9fd380Sjfb8856606 uint32_t reta_id = i / RTE_RETA_GROUP_SIZE;
149*2d9fd380Sjfb8856606 uint32_t reta_pos = i % RTE_RETA_GROUP_SIZE;
150*2d9fd380Sjfb8856606 uint32_t rss_qs_pos = i % rss->n_queues;
151*2d9fd380Sjfb8856606
152*2d9fd380Sjfb8856606 reta_conf[reta_id].reta[reta_pos] =
153*2d9fd380Sjfb8856606 (uint16_t) rss->queue_id[rss_qs_pos];
154*2d9fd380Sjfb8856606 }
155*2d9fd380Sjfb8856606
156*2d9fd380Sjfb8856606 /* RETA update */
157*2d9fd380Sjfb8856606 status = rte_eth_dev_rss_reta_update(port_id,
158*2d9fd380Sjfb8856606 reta_conf,
159*2d9fd380Sjfb8856606 reta_size);
160*2d9fd380Sjfb8856606
161*2d9fd380Sjfb8856606 return status;
162*2d9fd380Sjfb8856606 }
163*2d9fd380Sjfb8856606
164*2d9fd380Sjfb8856606 struct link *
link_create(struct obj * obj,const char * name,struct link_params * params)165*2d9fd380Sjfb8856606 link_create(struct obj *obj, const char *name, struct link_params *params)
166*2d9fd380Sjfb8856606 {
167*2d9fd380Sjfb8856606 struct rte_eth_dev_info port_info;
168*2d9fd380Sjfb8856606 struct rte_eth_conf port_conf;
169*2d9fd380Sjfb8856606 struct link *link;
170*2d9fd380Sjfb8856606 struct link_params_rss *rss;
171*2d9fd380Sjfb8856606 struct mempool *mempool;
172*2d9fd380Sjfb8856606 uint32_t cpu_id, i;
173*2d9fd380Sjfb8856606 int status;
174*2d9fd380Sjfb8856606 uint16_t port_id;
175*2d9fd380Sjfb8856606
176*2d9fd380Sjfb8856606 /* Check input params */
177*2d9fd380Sjfb8856606 if ((name == NULL) ||
178*2d9fd380Sjfb8856606 link_find(obj, name) ||
179*2d9fd380Sjfb8856606 (params == NULL) ||
180*2d9fd380Sjfb8856606 (params->rx.n_queues == 0) ||
181*2d9fd380Sjfb8856606 (params->rx.queue_size == 0) ||
182*2d9fd380Sjfb8856606 (params->tx.n_queues == 0) ||
183*2d9fd380Sjfb8856606 (params->tx.queue_size == 0))
184*2d9fd380Sjfb8856606 return NULL;
185*2d9fd380Sjfb8856606
186*2d9fd380Sjfb8856606 port_id = params->port_id;
187*2d9fd380Sjfb8856606 if (params->dev_name) {
188*2d9fd380Sjfb8856606 status = rte_eth_dev_get_port_by_name(params->dev_name,
189*2d9fd380Sjfb8856606 &port_id);
190*2d9fd380Sjfb8856606
191*2d9fd380Sjfb8856606 if (status)
192*2d9fd380Sjfb8856606 return NULL;
193*2d9fd380Sjfb8856606 } else
194*2d9fd380Sjfb8856606 if (!rte_eth_dev_is_valid_port(port_id))
195*2d9fd380Sjfb8856606 return NULL;
196*2d9fd380Sjfb8856606
197*2d9fd380Sjfb8856606 if (rte_eth_dev_info_get(port_id, &port_info) != 0)
198*2d9fd380Sjfb8856606 return NULL;
199*2d9fd380Sjfb8856606
200*2d9fd380Sjfb8856606 mempool = mempool_find(obj, params->rx.mempool_name);
201*2d9fd380Sjfb8856606 if (mempool == NULL)
202*2d9fd380Sjfb8856606 return NULL;
203*2d9fd380Sjfb8856606
204*2d9fd380Sjfb8856606 rss = params->rx.rss;
205*2d9fd380Sjfb8856606 if (rss) {
206*2d9fd380Sjfb8856606 if ((port_info.reta_size == 0) ||
207*2d9fd380Sjfb8856606 (port_info.reta_size > ETH_RSS_RETA_SIZE_512))
208*2d9fd380Sjfb8856606 return NULL;
209*2d9fd380Sjfb8856606
210*2d9fd380Sjfb8856606 if ((rss->n_queues == 0) ||
211*2d9fd380Sjfb8856606 (rss->n_queues >= LINK_RXQ_RSS_MAX))
212*2d9fd380Sjfb8856606 return NULL;
213*2d9fd380Sjfb8856606
214*2d9fd380Sjfb8856606 for (i = 0; i < rss->n_queues; i++)
215*2d9fd380Sjfb8856606 if (rss->queue_id[i] >= port_info.max_rx_queues)
216*2d9fd380Sjfb8856606 return NULL;
217*2d9fd380Sjfb8856606 }
218*2d9fd380Sjfb8856606
219*2d9fd380Sjfb8856606 /**
220*2d9fd380Sjfb8856606 * Resource create
221*2d9fd380Sjfb8856606 */
222*2d9fd380Sjfb8856606 /* Port */
223*2d9fd380Sjfb8856606 memcpy(&port_conf, &port_conf_default, sizeof(port_conf));
224*2d9fd380Sjfb8856606 if (rss) {
225*2d9fd380Sjfb8856606 port_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;
226*2d9fd380Sjfb8856606 port_conf.rx_adv_conf.rss_conf.rss_hf =
227*2d9fd380Sjfb8856606 (ETH_RSS_IP | ETH_RSS_TCP | ETH_RSS_UDP) &
228*2d9fd380Sjfb8856606 port_info.flow_type_rss_offloads;
229*2d9fd380Sjfb8856606 }
230*2d9fd380Sjfb8856606
231*2d9fd380Sjfb8856606 cpu_id = (uint32_t) rte_eth_dev_socket_id(port_id);
232*2d9fd380Sjfb8856606 if (cpu_id == (uint32_t) SOCKET_ID_ANY)
233*2d9fd380Sjfb8856606 cpu_id = 0;
234*2d9fd380Sjfb8856606
235*2d9fd380Sjfb8856606 status = rte_eth_dev_configure(
236*2d9fd380Sjfb8856606 port_id,
237*2d9fd380Sjfb8856606 params->rx.n_queues,
238*2d9fd380Sjfb8856606 params->tx.n_queues,
239*2d9fd380Sjfb8856606 &port_conf);
240*2d9fd380Sjfb8856606
241*2d9fd380Sjfb8856606 if (status < 0)
242*2d9fd380Sjfb8856606 return NULL;
243*2d9fd380Sjfb8856606
244*2d9fd380Sjfb8856606 if (params->promiscuous) {
245*2d9fd380Sjfb8856606 status = rte_eth_promiscuous_enable(port_id);
246*2d9fd380Sjfb8856606 if (status != 0)
247*2d9fd380Sjfb8856606 return NULL;
248*2d9fd380Sjfb8856606 }
249*2d9fd380Sjfb8856606
250*2d9fd380Sjfb8856606 /* Port RX */
251*2d9fd380Sjfb8856606 for (i = 0; i < params->rx.n_queues; i++) {
252*2d9fd380Sjfb8856606 status = rte_eth_rx_queue_setup(
253*2d9fd380Sjfb8856606 port_id,
254*2d9fd380Sjfb8856606 i,
255*2d9fd380Sjfb8856606 params->rx.queue_size,
256*2d9fd380Sjfb8856606 cpu_id,
257*2d9fd380Sjfb8856606 NULL,
258*2d9fd380Sjfb8856606 mempool->m);
259*2d9fd380Sjfb8856606
260*2d9fd380Sjfb8856606 if (status < 0)
261*2d9fd380Sjfb8856606 return NULL;
262*2d9fd380Sjfb8856606 }
263*2d9fd380Sjfb8856606
264*2d9fd380Sjfb8856606 /* Port TX */
265*2d9fd380Sjfb8856606 for (i = 0; i < params->tx.n_queues; i++) {
266*2d9fd380Sjfb8856606 status = rte_eth_tx_queue_setup(
267*2d9fd380Sjfb8856606 port_id,
268*2d9fd380Sjfb8856606 i,
269*2d9fd380Sjfb8856606 params->tx.queue_size,
270*2d9fd380Sjfb8856606 cpu_id,
271*2d9fd380Sjfb8856606 NULL);
272*2d9fd380Sjfb8856606
273*2d9fd380Sjfb8856606 if (status < 0)
274*2d9fd380Sjfb8856606 return NULL;
275*2d9fd380Sjfb8856606 }
276*2d9fd380Sjfb8856606
277*2d9fd380Sjfb8856606 /* Port start */
278*2d9fd380Sjfb8856606 status = rte_eth_dev_start(port_id);
279*2d9fd380Sjfb8856606 if (status < 0)
280*2d9fd380Sjfb8856606 return NULL;
281*2d9fd380Sjfb8856606
282*2d9fd380Sjfb8856606 if (rss) {
283*2d9fd380Sjfb8856606 status = rss_setup(port_id, port_info.reta_size, rss);
284*2d9fd380Sjfb8856606
285*2d9fd380Sjfb8856606 if (status) {
286*2d9fd380Sjfb8856606 rte_eth_dev_stop(port_id);
287*2d9fd380Sjfb8856606 return NULL;
288*2d9fd380Sjfb8856606 }
289*2d9fd380Sjfb8856606 }
290*2d9fd380Sjfb8856606
291*2d9fd380Sjfb8856606 /* Port link up */
292*2d9fd380Sjfb8856606 status = rte_eth_dev_set_link_up(port_id);
293*2d9fd380Sjfb8856606 if ((status < 0) && (status != -ENOTSUP)) {
294*2d9fd380Sjfb8856606 rte_eth_dev_stop(port_id);
295*2d9fd380Sjfb8856606 return NULL;
296*2d9fd380Sjfb8856606 }
297*2d9fd380Sjfb8856606
298*2d9fd380Sjfb8856606 /* Node allocation */
299*2d9fd380Sjfb8856606 link = calloc(1, sizeof(struct link));
300*2d9fd380Sjfb8856606 if (link == NULL) {
301*2d9fd380Sjfb8856606 rte_eth_dev_stop(port_id);
302*2d9fd380Sjfb8856606 return NULL;
303*2d9fd380Sjfb8856606 }
304*2d9fd380Sjfb8856606
305*2d9fd380Sjfb8856606 /* Node fill in */
306*2d9fd380Sjfb8856606 strlcpy(link->name, name, sizeof(link->name));
307*2d9fd380Sjfb8856606 link->port_id = port_id;
308*2d9fd380Sjfb8856606 rte_eth_dev_get_name_by_port(port_id, link->dev_name);
309*2d9fd380Sjfb8856606 link->n_rxq = params->rx.n_queues;
310*2d9fd380Sjfb8856606 link->n_txq = params->tx.n_queues;
311*2d9fd380Sjfb8856606
312*2d9fd380Sjfb8856606 /* Node add to list */
313*2d9fd380Sjfb8856606 TAILQ_INSERT_TAIL(&obj->link_list, link, node);
314*2d9fd380Sjfb8856606
315*2d9fd380Sjfb8856606 return link;
316*2d9fd380Sjfb8856606 }
317*2d9fd380Sjfb8856606
318*2d9fd380Sjfb8856606 int
link_is_up(struct obj * obj,const char * name)319*2d9fd380Sjfb8856606 link_is_up(struct obj *obj, const char *name)
320*2d9fd380Sjfb8856606 {
321*2d9fd380Sjfb8856606 struct rte_eth_link link_params;
322*2d9fd380Sjfb8856606 struct link *link;
323*2d9fd380Sjfb8856606
324*2d9fd380Sjfb8856606 /* Check input params */
325*2d9fd380Sjfb8856606 if (!obj || !name)
326*2d9fd380Sjfb8856606 return 0;
327*2d9fd380Sjfb8856606
328*2d9fd380Sjfb8856606 link = link_find(obj, name);
329*2d9fd380Sjfb8856606 if (link == NULL)
330*2d9fd380Sjfb8856606 return 0;
331*2d9fd380Sjfb8856606
332*2d9fd380Sjfb8856606 /* Resource */
333*2d9fd380Sjfb8856606 if (rte_eth_link_get(link->port_id, &link_params) < 0)
334*2d9fd380Sjfb8856606 return 0;
335*2d9fd380Sjfb8856606
336*2d9fd380Sjfb8856606 return (link_params.link_status == ETH_LINK_DOWN) ? 0 : 1;
337*2d9fd380Sjfb8856606 }
338*2d9fd380Sjfb8856606
339*2d9fd380Sjfb8856606 struct link *
link_find(struct obj * obj,const char * name)340*2d9fd380Sjfb8856606 link_find(struct obj *obj, const char *name)
341*2d9fd380Sjfb8856606 {
342*2d9fd380Sjfb8856606 struct link *link;
343*2d9fd380Sjfb8856606
344*2d9fd380Sjfb8856606 if (!obj || !name)
345*2d9fd380Sjfb8856606 return NULL;
346*2d9fd380Sjfb8856606
347*2d9fd380Sjfb8856606 TAILQ_FOREACH(link, &obj->link_list, node)
348*2d9fd380Sjfb8856606 if (strcmp(link->name, name) == 0)
349*2d9fd380Sjfb8856606 return link;
350*2d9fd380Sjfb8856606
351*2d9fd380Sjfb8856606 return NULL;
352*2d9fd380Sjfb8856606 }
353*2d9fd380Sjfb8856606
354*2d9fd380Sjfb8856606 struct link *
link_next(struct obj * obj,struct link * link)355*2d9fd380Sjfb8856606 link_next(struct obj *obj, struct link *link)
356*2d9fd380Sjfb8856606 {
357*2d9fd380Sjfb8856606 return (link == NULL) ?
358*2d9fd380Sjfb8856606 TAILQ_FIRST(&obj->link_list) : TAILQ_NEXT(link, node);
359*2d9fd380Sjfb8856606 }
360*2d9fd380Sjfb8856606
361*2d9fd380Sjfb8856606 /*
362*2d9fd380Sjfb8856606 * pipeline
363*2d9fd380Sjfb8856606 */
364*2d9fd380Sjfb8856606 #ifndef PIPELINE_MSGQ_SIZE
365*2d9fd380Sjfb8856606 #define PIPELINE_MSGQ_SIZE 64
366*2d9fd380Sjfb8856606 #endif
367*2d9fd380Sjfb8856606
368*2d9fd380Sjfb8856606 struct pipeline *
pipeline_create(struct obj * obj,const char * name,int numa_node)369*2d9fd380Sjfb8856606 pipeline_create(struct obj *obj, const char *name, int numa_node)
370*2d9fd380Sjfb8856606 {
371*2d9fd380Sjfb8856606 struct pipeline *pipeline;
372*2d9fd380Sjfb8856606 struct rte_swx_pipeline *p = NULL;
373*2d9fd380Sjfb8856606 int status;
374*2d9fd380Sjfb8856606
375*2d9fd380Sjfb8856606 /* Check input params */
376*2d9fd380Sjfb8856606 if ((name == NULL) ||
377*2d9fd380Sjfb8856606 pipeline_find(obj, name))
378*2d9fd380Sjfb8856606 return NULL;
379*2d9fd380Sjfb8856606
380*2d9fd380Sjfb8856606 /* Resource create */
381*2d9fd380Sjfb8856606 status = rte_swx_pipeline_config(&p, numa_node);
382*2d9fd380Sjfb8856606 if (status)
383*2d9fd380Sjfb8856606 goto error;
384*2d9fd380Sjfb8856606
385*2d9fd380Sjfb8856606 status = rte_swx_pipeline_port_in_type_register(p,
386*2d9fd380Sjfb8856606 "ethdev",
387*2d9fd380Sjfb8856606 &rte_swx_port_ethdev_reader_ops);
388*2d9fd380Sjfb8856606 if (status)
389*2d9fd380Sjfb8856606 goto error;
390*2d9fd380Sjfb8856606
391*2d9fd380Sjfb8856606 status = rte_swx_pipeline_port_out_type_register(p,
392*2d9fd380Sjfb8856606 "ethdev",
393*2d9fd380Sjfb8856606 &rte_swx_port_ethdev_writer_ops);
394*2d9fd380Sjfb8856606 if (status)
395*2d9fd380Sjfb8856606 goto error;
396*2d9fd380Sjfb8856606
397*2d9fd380Sjfb8856606 #ifdef RTE_PORT_PCAP
398*2d9fd380Sjfb8856606 status = rte_swx_pipeline_port_in_type_register(p,
399*2d9fd380Sjfb8856606 "source",
400*2d9fd380Sjfb8856606 &rte_swx_port_source_ops);
401*2d9fd380Sjfb8856606 if (status)
402*2d9fd380Sjfb8856606 goto error;
403*2d9fd380Sjfb8856606 #endif
404*2d9fd380Sjfb8856606
405*2d9fd380Sjfb8856606 status = rte_swx_pipeline_port_out_type_register(p,
406*2d9fd380Sjfb8856606 "sink",
407*2d9fd380Sjfb8856606 &rte_swx_port_sink_ops);
408*2d9fd380Sjfb8856606 if (status)
409*2d9fd380Sjfb8856606 goto error;
410*2d9fd380Sjfb8856606
411*2d9fd380Sjfb8856606 status = rte_swx_pipeline_table_type_register(p,
412*2d9fd380Sjfb8856606 "exact",
413*2d9fd380Sjfb8856606 RTE_SWX_TABLE_MATCH_EXACT,
414*2d9fd380Sjfb8856606 &rte_swx_table_exact_match_ops);
415*2d9fd380Sjfb8856606 if (status)
416*2d9fd380Sjfb8856606 goto error;
417*2d9fd380Sjfb8856606
418*2d9fd380Sjfb8856606 /* Node allocation */
419*2d9fd380Sjfb8856606 pipeline = calloc(1, sizeof(struct pipeline));
420*2d9fd380Sjfb8856606 if (pipeline == NULL)
421*2d9fd380Sjfb8856606 goto error;
422*2d9fd380Sjfb8856606
423*2d9fd380Sjfb8856606 /* Node fill in */
424*2d9fd380Sjfb8856606 strlcpy(pipeline->name, name, sizeof(pipeline->name));
425*2d9fd380Sjfb8856606 pipeline->p = p;
426*2d9fd380Sjfb8856606 pipeline->timer_period_ms = 10;
427*2d9fd380Sjfb8856606
428*2d9fd380Sjfb8856606 /* Node add to list */
429*2d9fd380Sjfb8856606 TAILQ_INSERT_TAIL(&obj->pipeline_list, pipeline, node);
430*2d9fd380Sjfb8856606
431*2d9fd380Sjfb8856606 return pipeline;
432*2d9fd380Sjfb8856606
433*2d9fd380Sjfb8856606 error:
434*2d9fd380Sjfb8856606 rte_swx_pipeline_free(p);
435*2d9fd380Sjfb8856606 return NULL;
436*2d9fd380Sjfb8856606 }
437*2d9fd380Sjfb8856606
438*2d9fd380Sjfb8856606 struct pipeline *
pipeline_find(struct obj * obj,const char * name)439*2d9fd380Sjfb8856606 pipeline_find(struct obj *obj, const char *name)
440*2d9fd380Sjfb8856606 {
441*2d9fd380Sjfb8856606 struct pipeline *pipeline;
442*2d9fd380Sjfb8856606
443*2d9fd380Sjfb8856606 if (!obj || !name)
444*2d9fd380Sjfb8856606 return NULL;
445*2d9fd380Sjfb8856606
446*2d9fd380Sjfb8856606 TAILQ_FOREACH(pipeline, &obj->pipeline_list, node)
447*2d9fd380Sjfb8856606 if (strcmp(name, pipeline->name) == 0)
448*2d9fd380Sjfb8856606 return pipeline;
449*2d9fd380Sjfb8856606
450*2d9fd380Sjfb8856606 return NULL;
451*2d9fd380Sjfb8856606 }
452*2d9fd380Sjfb8856606
453*2d9fd380Sjfb8856606 /*
454*2d9fd380Sjfb8856606 * obj
455*2d9fd380Sjfb8856606 */
456*2d9fd380Sjfb8856606 struct obj *
obj_init(void)457*2d9fd380Sjfb8856606 obj_init(void)
458*2d9fd380Sjfb8856606 {
459*2d9fd380Sjfb8856606 struct obj *obj;
460*2d9fd380Sjfb8856606
461*2d9fd380Sjfb8856606 obj = calloc(1, sizeof(struct obj));
462*2d9fd380Sjfb8856606 if (!obj)
463*2d9fd380Sjfb8856606 return NULL;
464*2d9fd380Sjfb8856606
465*2d9fd380Sjfb8856606 TAILQ_INIT(&obj->mempool_list);
466*2d9fd380Sjfb8856606 TAILQ_INIT(&obj->link_list);
467*2d9fd380Sjfb8856606 TAILQ_INIT(&obj->pipeline_list);
468*2d9fd380Sjfb8856606
469*2d9fd380Sjfb8856606 return obj;
470*2d9fd380Sjfb8856606 }
471