1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606 * Copyright(c) 2010-2018 Intel Corporation
3a9643ea8Slogwang */
4a9643ea8Slogwang
5d30ea906Sjfb8856606 #include <stdlib.h>
6d30ea906Sjfb8856606
7a9643ea8Slogwang #include <rte_common.h>
8a9643ea8Slogwang #include <rte_cycles.h>
9d30ea906Sjfb8856606 #include <rte_lcore.h>
10d30ea906Sjfb8856606 #include <rte_ring.h>
11a9643ea8Slogwang
12d30ea906Sjfb8856606 #include <rte_table_acl.h>
13d30ea906Sjfb8856606 #include <rte_table_array.h>
14d30ea906Sjfb8856606 #include <rte_table_hash.h>
15d30ea906Sjfb8856606 #include <rte_table_lpm.h>
16d30ea906Sjfb8856606 #include <rte_table_lpm_ipv6.h>
17d30ea906Sjfb8856606
18d30ea906Sjfb8856606 #include "common.h"
19a9643ea8Slogwang #include "thread.h"
20d30ea906Sjfb8856606 #include "pipeline.h"
21a9643ea8Slogwang
22d30ea906Sjfb8856606 #ifndef THREAD_PIPELINES_MAX
23d30ea906Sjfb8856606 #define THREAD_PIPELINES_MAX 256
24a9643ea8Slogwang #endif
25a9643ea8Slogwang
26d30ea906Sjfb8856606 #ifndef THREAD_MSGQ_SIZE
27d30ea906Sjfb8856606 #define THREAD_MSGQ_SIZE 64
28d30ea906Sjfb8856606 #endif
29d30ea906Sjfb8856606
30d30ea906Sjfb8856606 #ifndef THREAD_TIMER_PERIOD_MS
31d30ea906Sjfb8856606 #define THREAD_TIMER_PERIOD_MS 100
32d30ea906Sjfb8856606 #endif
33d30ea906Sjfb8856606
34d30ea906Sjfb8856606 /**
35*2d9fd380Sjfb8856606 * Main thread: data plane thread context
36d30ea906Sjfb8856606 */
37d30ea906Sjfb8856606 struct thread {
38d30ea906Sjfb8856606 struct rte_ring *msgq_req;
39d30ea906Sjfb8856606 struct rte_ring *msgq_rsp;
40d30ea906Sjfb8856606
41d30ea906Sjfb8856606 uint32_t enabled;
42d30ea906Sjfb8856606 };
43d30ea906Sjfb8856606
44d30ea906Sjfb8856606 static struct thread thread[RTE_MAX_LCORE];
45d30ea906Sjfb8856606
46d30ea906Sjfb8856606 /**
47d30ea906Sjfb8856606 * Data plane threads: context
48d30ea906Sjfb8856606 */
49d30ea906Sjfb8856606 struct table_data {
50d30ea906Sjfb8856606 struct rte_table_action *a;
51d30ea906Sjfb8856606 };
52d30ea906Sjfb8856606
53d30ea906Sjfb8856606 struct pipeline_data {
54d30ea906Sjfb8856606 struct rte_pipeline *p;
55d30ea906Sjfb8856606 struct table_data table_data[RTE_PIPELINE_TABLE_MAX];
56d30ea906Sjfb8856606 uint32_t n_tables;
57d30ea906Sjfb8856606
58d30ea906Sjfb8856606 struct rte_ring *msgq_req;
59d30ea906Sjfb8856606 struct rte_ring *msgq_rsp;
60d30ea906Sjfb8856606 uint64_t timer_period; /* Measured in CPU cycles. */
61d30ea906Sjfb8856606 uint64_t time_next;
62d30ea906Sjfb8856606
63d30ea906Sjfb8856606 uint8_t buffer[TABLE_RULE_ACTION_SIZE_MAX];
64d30ea906Sjfb8856606 };
65d30ea906Sjfb8856606
66d30ea906Sjfb8856606 struct thread_data {
67d30ea906Sjfb8856606 struct rte_pipeline *p[THREAD_PIPELINES_MAX];
68d30ea906Sjfb8856606 uint32_t n_pipelines;
69d30ea906Sjfb8856606
70d30ea906Sjfb8856606 struct pipeline_data pipeline_data[THREAD_PIPELINES_MAX];
71d30ea906Sjfb8856606 struct rte_ring *msgq_req;
72d30ea906Sjfb8856606 struct rte_ring *msgq_rsp;
73d30ea906Sjfb8856606 uint64_t timer_period; /* Measured in CPU cycles. */
74d30ea906Sjfb8856606 uint64_t time_next;
75d30ea906Sjfb8856606 uint64_t time_next_min;
76d30ea906Sjfb8856606 } __rte_cache_aligned;
77d30ea906Sjfb8856606
78d30ea906Sjfb8856606 static struct thread_data thread_data[RTE_MAX_LCORE];
79d30ea906Sjfb8856606
80d30ea906Sjfb8856606 /**
81*2d9fd380Sjfb8856606 * Main thread: data plane thread init
82d30ea906Sjfb8856606 */
83d30ea906Sjfb8856606 static void
thread_free(void)84d30ea906Sjfb8856606 thread_free(void)
85a9643ea8Slogwang {
86d30ea906Sjfb8856606 uint32_t i;
87d30ea906Sjfb8856606
88d30ea906Sjfb8856606 for (i = 0; i < RTE_MAX_LCORE; i++) {
89d30ea906Sjfb8856606 struct thread *t = &thread[i];
90d30ea906Sjfb8856606
91d30ea906Sjfb8856606 if (!rte_lcore_is_enabled(i))
92d30ea906Sjfb8856606 continue;
93d30ea906Sjfb8856606
94d30ea906Sjfb8856606 /* MSGQs */
95d30ea906Sjfb8856606 if (t->msgq_req)
96d30ea906Sjfb8856606 rte_ring_free(t->msgq_req);
97d30ea906Sjfb8856606
98d30ea906Sjfb8856606 if (t->msgq_rsp)
99d30ea906Sjfb8856606 rte_ring_free(t->msgq_rsp);
100d30ea906Sjfb8856606 }
101d30ea906Sjfb8856606 }
102d30ea906Sjfb8856606
103d30ea906Sjfb8856606 int
thread_init(void)104d30ea906Sjfb8856606 thread_init(void)
105d30ea906Sjfb8856606 {
106d30ea906Sjfb8856606 uint32_t i;
107d30ea906Sjfb8856606
108*2d9fd380Sjfb8856606 RTE_LCORE_FOREACH_WORKER(i) {
109d30ea906Sjfb8856606 char name[NAME_MAX];
110d30ea906Sjfb8856606 struct rte_ring *msgq_req, *msgq_rsp;
111d30ea906Sjfb8856606 struct thread *t = &thread[i];
112d30ea906Sjfb8856606 struct thread_data *t_data = &thread_data[i];
113d30ea906Sjfb8856606 uint32_t cpu_id = rte_lcore_to_socket_id(i);
114d30ea906Sjfb8856606
115d30ea906Sjfb8856606 /* MSGQs */
116d30ea906Sjfb8856606 snprintf(name, sizeof(name), "THREAD-%04x-MSGQ-REQ", i);
117d30ea906Sjfb8856606
118d30ea906Sjfb8856606 msgq_req = rte_ring_create(name,
119d30ea906Sjfb8856606 THREAD_MSGQ_SIZE,
120d30ea906Sjfb8856606 cpu_id,
121d30ea906Sjfb8856606 RING_F_SP_ENQ | RING_F_SC_DEQ);
122d30ea906Sjfb8856606
123d30ea906Sjfb8856606 if (msgq_req == NULL) {
124d30ea906Sjfb8856606 thread_free();
125d30ea906Sjfb8856606 return -1;
126d30ea906Sjfb8856606 }
127d30ea906Sjfb8856606
128d30ea906Sjfb8856606 snprintf(name, sizeof(name), "THREAD-%04x-MSGQ-RSP", i);
129d30ea906Sjfb8856606
130d30ea906Sjfb8856606 msgq_rsp = rte_ring_create(name,
131d30ea906Sjfb8856606 THREAD_MSGQ_SIZE,
132d30ea906Sjfb8856606 cpu_id,
133d30ea906Sjfb8856606 RING_F_SP_ENQ | RING_F_SC_DEQ);
134d30ea906Sjfb8856606
135d30ea906Sjfb8856606 if (msgq_rsp == NULL) {
136d30ea906Sjfb8856606 thread_free();
137d30ea906Sjfb8856606 return -1;
138d30ea906Sjfb8856606 }
139d30ea906Sjfb8856606
140*2d9fd380Sjfb8856606 /* Main thread records */
141d30ea906Sjfb8856606 t->msgq_req = msgq_req;
142d30ea906Sjfb8856606 t->msgq_rsp = msgq_rsp;
143d30ea906Sjfb8856606 t->enabled = 1;
144d30ea906Sjfb8856606
145d30ea906Sjfb8856606 /* Data plane thread records */
146d30ea906Sjfb8856606 t_data->n_pipelines = 0;
147d30ea906Sjfb8856606 t_data->msgq_req = msgq_req;
148d30ea906Sjfb8856606 t_data->msgq_rsp = msgq_rsp;
149d30ea906Sjfb8856606 t_data->timer_period =
150d30ea906Sjfb8856606 (rte_get_tsc_hz() * THREAD_TIMER_PERIOD_MS) / 1000;
151d30ea906Sjfb8856606 t_data->time_next = rte_get_tsc_cycles() + t_data->timer_period;
152d30ea906Sjfb8856606 t_data->time_next_min = t_data->time_next;
153d30ea906Sjfb8856606 }
154d30ea906Sjfb8856606
155d30ea906Sjfb8856606 return 0;
156d30ea906Sjfb8856606 }
157d30ea906Sjfb8856606
158d30ea906Sjfb8856606 static inline int
thread_is_running(uint32_t thread_id)159d30ea906Sjfb8856606 thread_is_running(uint32_t thread_id)
160d30ea906Sjfb8856606 {
161d30ea906Sjfb8856606 enum rte_lcore_state_t thread_state;
162d30ea906Sjfb8856606
163d30ea906Sjfb8856606 thread_state = rte_eal_get_lcore_state(thread_id);
164d30ea906Sjfb8856606 return (thread_state == RUNNING) ? 1 : 0;
165d30ea906Sjfb8856606 }
166d30ea906Sjfb8856606
167d30ea906Sjfb8856606 /**
168d30ea906Sjfb8856606 * Pipeline is running when:
169d30ea906Sjfb8856606 * (A) Pipeline is mapped to a data plane thread AND
170d30ea906Sjfb8856606 * (B) Its data plane thread is in RUNNING state.
171d30ea906Sjfb8856606 */
172d30ea906Sjfb8856606 static inline int
pipeline_is_running(struct pipeline * p)173d30ea906Sjfb8856606 pipeline_is_running(struct pipeline *p)
174d30ea906Sjfb8856606 {
175d30ea906Sjfb8856606 if (p->enabled == 0)
176d30ea906Sjfb8856606 return 0;
177d30ea906Sjfb8856606
178d30ea906Sjfb8856606 return thread_is_running(p->thread_id);
179d30ea906Sjfb8856606 }
180d30ea906Sjfb8856606
181d30ea906Sjfb8856606 /**
182*2d9fd380Sjfb8856606 * Main thread & data plane threads: message passing
183d30ea906Sjfb8856606 */
184d30ea906Sjfb8856606 enum thread_req_type {
185d30ea906Sjfb8856606 THREAD_REQ_PIPELINE_ENABLE = 0,
186d30ea906Sjfb8856606 THREAD_REQ_PIPELINE_DISABLE,
187d30ea906Sjfb8856606 THREAD_REQ_MAX
188d30ea906Sjfb8856606 };
189d30ea906Sjfb8856606
190d30ea906Sjfb8856606 struct thread_msg_req {
191d30ea906Sjfb8856606 enum thread_req_type type;
192d30ea906Sjfb8856606
193d30ea906Sjfb8856606 union {
194d30ea906Sjfb8856606 struct {
195d30ea906Sjfb8856606 struct rte_pipeline *p;
196d30ea906Sjfb8856606 struct {
197d30ea906Sjfb8856606 struct rte_table_action *a;
198d30ea906Sjfb8856606 } table[RTE_PIPELINE_TABLE_MAX];
199d30ea906Sjfb8856606 struct rte_ring *msgq_req;
200d30ea906Sjfb8856606 struct rte_ring *msgq_rsp;
201d30ea906Sjfb8856606 uint32_t timer_period_ms;
202d30ea906Sjfb8856606 uint32_t n_tables;
203d30ea906Sjfb8856606 } pipeline_enable;
204d30ea906Sjfb8856606
205d30ea906Sjfb8856606 struct {
206d30ea906Sjfb8856606 struct rte_pipeline *p;
207d30ea906Sjfb8856606 } pipeline_disable;
208d30ea906Sjfb8856606 };
209d30ea906Sjfb8856606 };
210d30ea906Sjfb8856606
211d30ea906Sjfb8856606 struct thread_msg_rsp {
212d30ea906Sjfb8856606 int status;
213d30ea906Sjfb8856606 };
214d30ea906Sjfb8856606
215d30ea906Sjfb8856606 /**
216*2d9fd380Sjfb8856606 * Main thread
217d30ea906Sjfb8856606 */
218d30ea906Sjfb8856606 static struct thread_msg_req *
thread_msg_alloc(void)219d30ea906Sjfb8856606 thread_msg_alloc(void)
220d30ea906Sjfb8856606 {
221d30ea906Sjfb8856606 size_t size = RTE_MAX(sizeof(struct thread_msg_req),
222d30ea906Sjfb8856606 sizeof(struct thread_msg_rsp));
223d30ea906Sjfb8856606
224d30ea906Sjfb8856606 return calloc(1, size);
225d30ea906Sjfb8856606 }
226d30ea906Sjfb8856606
227d30ea906Sjfb8856606 static void
thread_msg_free(struct thread_msg_rsp * rsp)228d30ea906Sjfb8856606 thread_msg_free(struct thread_msg_rsp *rsp)
229d30ea906Sjfb8856606 {
230d30ea906Sjfb8856606 free(rsp);
231d30ea906Sjfb8856606 }
232d30ea906Sjfb8856606
233d30ea906Sjfb8856606 static struct thread_msg_rsp *
thread_msg_send_recv(uint32_t thread_id,struct thread_msg_req * req)234d30ea906Sjfb8856606 thread_msg_send_recv(uint32_t thread_id,
235d30ea906Sjfb8856606 struct thread_msg_req *req)
236d30ea906Sjfb8856606 {
237d30ea906Sjfb8856606 struct thread *t = &thread[thread_id];
238d30ea906Sjfb8856606 struct rte_ring *msgq_req = t->msgq_req;
239d30ea906Sjfb8856606 struct rte_ring *msgq_rsp = t->msgq_rsp;
240d30ea906Sjfb8856606 struct thread_msg_rsp *rsp;
241d30ea906Sjfb8856606 int status;
242d30ea906Sjfb8856606
243d30ea906Sjfb8856606 /* send */
244d30ea906Sjfb8856606 do {
245d30ea906Sjfb8856606 status = rte_ring_sp_enqueue(msgq_req, req);
246d30ea906Sjfb8856606 } while (status == -ENOBUFS);
247d30ea906Sjfb8856606
248d30ea906Sjfb8856606 /* recv */
249d30ea906Sjfb8856606 do {
250d30ea906Sjfb8856606 status = rte_ring_sc_dequeue(msgq_rsp, (void **) &rsp);
251d30ea906Sjfb8856606 } while (status != 0);
252d30ea906Sjfb8856606
253d30ea906Sjfb8856606 return rsp;
254d30ea906Sjfb8856606 }
255d30ea906Sjfb8856606
256d30ea906Sjfb8856606 int
thread_pipeline_enable(uint32_t thread_id,const char * pipeline_name)257d30ea906Sjfb8856606 thread_pipeline_enable(uint32_t thread_id,
258d30ea906Sjfb8856606 const char *pipeline_name)
259d30ea906Sjfb8856606 {
260d30ea906Sjfb8856606 struct pipeline *p = pipeline_find(pipeline_name);
261d30ea906Sjfb8856606 struct thread *t;
262d30ea906Sjfb8856606 struct thread_msg_req *req;
263d30ea906Sjfb8856606 struct thread_msg_rsp *rsp;
264d30ea906Sjfb8856606 uint32_t i;
265d30ea906Sjfb8856606 int status;
266d30ea906Sjfb8856606
267d30ea906Sjfb8856606 /* Check input params */
268d30ea906Sjfb8856606 if ((thread_id >= RTE_MAX_LCORE) ||
269d30ea906Sjfb8856606 (p == NULL) ||
270d30ea906Sjfb8856606 (p->n_ports_in == 0) ||
271d30ea906Sjfb8856606 (p->n_ports_out == 0) ||
272d30ea906Sjfb8856606 (p->n_tables == 0))
273d30ea906Sjfb8856606 return -1;
274d30ea906Sjfb8856606
275d30ea906Sjfb8856606 t = &thread[thread_id];
276d30ea906Sjfb8856606 if ((t->enabled == 0) ||
277d30ea906Sjfb8856606 p->enabled)
278d30ea906Sjfb8856606 return -1;
279d30ea906Sjfb8856606
280d30ea906Sjfb8856606 if (!thread_is_running(thread_id)) {
281d30ea906Sjfb8856606 struct thread_data *td = &thread_data[thread_id];
282d30ea906Sjfb8856606 struct pipeline_data *tdp = &td->pipeline_data[td->n_pipelines];
283d30ea906Sjfb8856606
284d30ea906Sjfb8856606 if (td->n_pipelines >= THREAD_PIPELINES_MAX)
285d30ea906Sjfb8856606 return -1;
286d30ea906Sjfb8856606
287d30ea906Sjfb8856606 /* Data plane thread */
288d30ea906Sjfb8856606 td->p[td->n_pipelines] = p->p;
289d30ea906Sjfb8856606
290d30ea906Sjfb8856606 tdp->p = p->p;
291d30ea906Sjfb8856606 for (i = 0; i < p->n_tables; i++)
292d30ea906Sjfb8856606 tdp->table_data[i].a = p->table[i].a;
293d30ea906Sjfb8856606
294d30ea906Sjfb8856606 tdp->n_tables = p->n_tables;
295d30ea906Sjfb8856606
296d30ea906Sjfb8856606 tdp->msgq_req = p->msgq_req;
297d30ea906Sjfb8856606 tdp->msgq_rsp = p->msgq_rsp;
298d30ea906Sjfb8856606 tdp->timer_period = (rte_get_tsc_hz() * p->timer_period_ms) / 1000;
299d30ea906Sjfb8856606 tdp->time_next = rte_get_tsc_cycles() + tdp->timer_period;
300d30ea906Sjfb8856606
301d30ea906Sjfb8856606 td->n_pipelines++;
302d30ea906Sjfb8856606
303d30ea906Sjfb8856606 /* Pipeline */
304d30ea906Sjfb8856606 p->thread_id = thread_id;
305d30ea906Sjfb8856606 p->enabled = 1;
306d30ea906Sjfb8856606
307d30ea906Sjfb8856606 return 0;
308d30ea906Sjfb8856606 }
309d30ea906Sjfb8856606
310d30ea906Sjfb8856606 /* Allocate request */
311d30ea906Sjfb8856606 req = thread_msg_alloc();
312d30ea906Sjfb8856606 if (req == NULL)
313d30ea906Sjfb8856606 return -1;
314d30ea906Sjfb8856606
315d30ea906Sjfb8856606 /* Write request */
316d30ea906Sjfb8856606 req->type = THREAD_REQ_PIPELINE_ENABLE;
317d30ea906Sjfb8856606 req->pipeline_enable.p = p->p;
318d30ea906Sjfb8856606 for (i = 0; i < p->n_tables; i++)
319d30ea906Sjfb8856606 req->pipeline_enable.table[i].a =
320d30ea906Sjfb8856606 p->table[i].a;
321d30ea906Sjfb8856606 req->pipeline_enable.msgq_req = p->msgq_req;
322d30ea906Sjfb8856606 req->pipeline_enable.msgq_rsp = p->msgq_rsp;
323d30ea906Sjfb8856606 req->pipeline_enable.timer_period_ms = p->timer_period_ms;
324d30ea906Sjfb8856606 req->pipeline_enable.n_tables = p->n_tables;
325d30ea906Sjfb8856606
326d30ea906Sjfb8856606 /* Send request and wait for response */
327d30ea906Sjfb8856606 rsp = thread_msg_send_recv(thread_id, req);
328d30ea906Sjfb8856606
329d30ea906Sjfb8856606 /* Read response */
330d30ea906Sjfb8856606 status = rsp->status;
331d30ea906Sjfb8856606
332d30ea906Sjfb8856606 /* Free response */
333d30ea906Sjfb8856606 thread_msg_free(rsp);
334d30ea906Sjfb8856606
335d30ea906Sjfb8856606 /* Request completion */
336d30ea906Sjfb8856606 if (status)
337d30ea906Sjfb8856606 return status;
338d30ea906Sjfb8856606
339d30ea906Sjfb8856606 p->thread_id = thread_id;
340d30ea906Sjfb8856606 p->enabled = 1;
341d30ea906Sjfb8856606
342d30ea906Sjfb8856606 return 0;
343d30ea906Sjfb8856606 }
344d30ea906Sjfb8856606
345d30ea906Sjfb8856606 int
thread_pipeline_disable(uint32_t thread_id,const char * pipeline_name)346d30ea906Sjfb8856606 thread_pipeline_disable(uint32_t thread_id,
347d30ea906Sjfb8856606 const char *pipeline_name)
348d30ea906Sjfb8856606 {
349d30ea906Sjfb8856606 struct pipeline *p = pipeline_find(pipeline_name);
350d30ea906Sjfb8856606 struct thread *t;
351d30ea906Sjfb8856606 struct thread_msg_req *req;
352d30ea906Sjfb8856606 struct thread_msg_rsp *rsp;
353d30ea906Sjfb8856606 int status;
354d30ea906Sjfb8856606
355d30ea906Sjfb8856606 /* Check input params */
356d30ea906Sjfb8856606 if ((thread_id >= RTE_MAX_LCORE) ||
357d30ea906Sjfb8856606 (p == NULL))
358d30ea906Sjfb8856606 return -1;
359d30ea906Sjfb8856606
360d30ea906Sjfb8856606 t = &thread[thread_id];
361d30ea906Sjfb8856606 if (t->enabled == 0)
362d30ea906Sjfb8856606 return -1;
363d30ea906Sjfb8856606
364d30ea906Sjfb8856606 if (p->enabled == 0)
365d30ea906Sjfb8856606 return 0;
366d30ea906Sjfb8856606
367d30ea906Sjfb8856606 if (p->thread_id != thread_id)
368d30ea906Sjfb8856606 return -1;
369d30ea906Sjfb8856606
370d30ea906Sjfb8856606 if (!thread_is_running(thread_id)) {
371d30ea906Sjfb8856606 struct thread_data *td = &thread_data[thread_id];
372d30ea906Sjfb8856606 uint32_t i;
373d30ea906Sjfb8856606
374d30ea906Sjfb8856606 for (i = 0; i < td->n_pipelines; i++) {
375d30ea906Sjfb8856606 struct pipeline_data *tdp = &td->pipeline_data[i];
376d30ea906Sjfb8856606
377d30ea906Sjfb8856606 if (tdp->p != p->p)
378d30ea906Sjfb8856606 continue;
379d30ea906Sjfb8856606
380d30ea906Sjfb8856606 /* Data plane thread */
381d30ea906Sjfb8856606 if (i < td->n_pipelines - 1) {
382d30ea906Sjfb8856606 struct rte_pipeline *pipeline_last =
383d30ea906Sjfb8856606 td->p[td->n_pipelines - 1];
384d30ea906Sjfb8856606 struct pipeline_data *tdp_last =
385d30ea906Sjfb8856606 &td->pipeline_data[td->n_pipelines - 1];
386d30ea906Sjfb8856606
387d30ea906Sjfb8856606 td->p[i] = pipeline_last;
388d30ea906Sjfb8856606 memcpy(tdp, tdp_last, sizeof(*tdp));
389d30ea906Sjfb8856606 }
390d30ea906Sjfb8856606
391d30ea906Sjfb8856606 td->n_pipelines--;
392d30ea906Sjfb8856606
393d30ea906Sjfb8856606 /* Pipeline */
394d30ea906Sjfb8856606 p->enabled = 0;
395d30ea906Sjfb8856606
396d30ea906Sjfb8856606 break;
397d30ea906Sjfb8856606 }
398d30ea906Sjfb8856606
399d30ea906Sjfb8856606 return 0;
400d30ea906Sjfb8856606 }
401d30ea906Sjfb8856606
402d30ea906Sjfb8856606 /* Allocate request */
403d30ea906Sjfb8856606 req = thread_msg_alloc();
404d30ea906Sjfb8856606 if (req == NULL)
405d30ea906Sjfb8856606 return -1;
406d30ea906Sjfb8856606
407d30ea906Sjfb8856606 /* Write request */
408d30ea906Sjfb8856606 req->type = THREAD_REQ_PIPELINE_DISABLE;
409d30ea906Sjfb8856606 req->pipeline_disable.p = p->p;
410d30ea906Sjfb8856606
411d30ea906Sjfb8856606 /* Send request and wait for response */
412d30ea906Sjfb8856606 rsp = thread_msg_send_recv(thread_id, req);
413d30ea906Sjfb8856606
414d30ea906Sjfb8856606 /* Read response */
415d30ea906Sjfb8856606 status = rsp->status;
416d30ea906Sjfb8856606
417d30ea906Sjfb8856606 /* Free response */
418d30ea906Sjfb8856606 thread_msg_free(rsp);
419d30ea906Sjfb8856606
420d30ea906Sjfb8856606 /* Request completion */
421d30ea906Sjfb8856606 if (status)
422d30ea906Sjfb8856606 return status;
423d30ea906Sjfb8856606
424d30ea906Sjfb8856606 p->enabled = 0;
425d30ea906Sjfb8856606
426d30ea906Sjfb8856606 return 0;
427d30ea906Sjfb8856606 }
428d30ea906Sjfb8856606
429d30ea906Sjfb8856606 /**
430d30ea906Sjfb8856606 * Data plane threads: message handling
431d30ea906Sjfb8856606 */
432d30ea906Sjfb8856606 static inline struct thread_msg_req *
thread_msg_recv(struct rte_ring * msgq_req)433d30ea906Sjfb8856606 thread_msg_recv(struct rte_ring *msgq_req)
434d30ea906Sjfb8856606 {
435d30ea906Sjfb8856606 struct thread_msg_req *req;
436d30ea906Sjfb8856606
437d30ea906Sjfb8856606 int status = rte_ring_sc_dequeue(msgq_req, (void **) &req);
438a9643ea8Slogwang
439a9643ea8Slogwang if (status != 0)
440a9643ea8Slogwang return NULL;
441a9643ea8Slogwang
442d30ea906Sjfb8856606 return req;
443a9643ea8Slogwang }
444a9643ea8Slogwang
445a9643ea8Slogwang static inline void
thread_msg_send(struct rte_ring * msgq_rsp,struct thread_msg_rsp * rsp)446d30ea906Sjfb8856606 thread_msg_send(struct rte_ring *msgq_rsp,
447d30ea906Sjfb8856606 struct thread_msg_rsp *rsp)
448a9643ea8Slogwang {
449a9643ea8Slogwang int status;
450a9643ea8Slogwang
451a9643ea8Slogwang do {
452d30ea906Sjfb8856606 status = rte_ring_sp_enqueue(msgq_rsp, rsp);
453a9643ea8Slogwang } while (status == -ENOBUFS);
454a9643ea8Slogwang }
455a9643ea8Slogwang
456d30ea906Sjfb8856606 static struct thread_msg_rsp *
thread_msg_handle_pipeline_enable(struct thread_data * t,struct thread_msg_req * req)457d30ea906Sjfb8856606 thread_msg_handle_pipeline_enable(struct thread_data *t,
458d30ea906Sjfb8856606 struct thread_msg_req *req)
45928440c50Sjfb8856606 {
460d30ea906Sjfb8856606 struct thread_msg_rsp *rsp = (struct thread_msg_rsp *) req;
461d30ea906Sjfb8856606 struct pipeline_data *p = &t->pipeline_data[t->n_pipelines];
4625af785ecSfengbojiang(姜凤波) uint32_t i;
46328440c50Sjfb8856606
464d30ea906Sjfb8856606 /* Request */
465d30ea906Sjfb8856606 if (t->n_pipelines >= THREAD_PIPELINES_MAX) {
466d30ea906Sjfb8856606 rsp->status = -1;
467d30ea906Sjfb8856606 return rsp;
46828440c50Sjfb8856606 }
46928440c50Sjfb8856606
470d30ea906Sjfb8856606 t->p[t->n_pipelines] = req->pipeline_enable.p;
47128440c50Sjfb8856606
472d30ea906Sjfb8856606 p->p = req->pipeline_enable.p;
473d30ea906Sjfb8856606 for (i = 0; i < req->pipeline_enable.n_tables; i++)
474d30ea906Sjfb8856606 p->table_data[i].a =
475d30ea906Sjfb8856606 req->pipeline_enable.table[i].a;
4765af785ecSfengbojiang(姜凤波)
477d30ea906Sjfb8856606 p->n_tables = req->pipeline_enable.n_tables;
4785af785ecSfengbojiang(姜凤波)
479d30ea906Sjfb8856606 p->msgq_req = req->pipeline_enable.msgq_req;
480d30ea906Sjfb8856606 p->msgq_rsp = req->pipeline_enable.msgq_rsp;
481d30ea906Sjfb8856606 p->timer_period =
482d30ea906Sjfb8856606 (rte_get_tsc_hz() * req->pipeline_enable.timer_period_ms) / 1000;
483d30ea906Sjfb8856606 p->time_next = rte_get_tsc_cycles() + p->timer_period;
48428440c50Sjfb8856606
485d30ea906Sjfb8856606 t->n_pipelines++;
48628440c50Sjfb8856606
487d30ea906Sjfb8856606 /* Response */
4885af785ecSfengbojiang(姜凤波) rsp->status = 0;
489d30ea906Sjfb8856606 return rsp;
49028440c50Sjfb8856606 }
49128440c50Sjfb8856606
492d30ea906Sjfb8856606 static struct thread_msg_rsp *
thread_msg_handle_pipeline_disable(struct thread_data * t,struct thread_msg_req * req)493d30ea906Sjfb8856606 thread_msg_handle_pipeline_disable(struct thread_data *t,
494d30ea906Sjfb8856606 struct thread_msg_req *req)
495d30ea906Sjfb8856606 {
496d30ea906Sjfb8856606 struct thread_msg_rsp *rsp = (struct thread_msg_rsp *) req;
497d30ea906Sjfb8856606 uint32_t n_pipelines = t->n_pipelines;
498d30ea906Sjfb8856606 struct rte_pipeline *pipeline = req->pipeline_disable.p;
499d30ea906Sjfb8856606 uint32_t i;
500d30ea906Sjfb8856606
501d30ea906Sjfb8856606 /* find pipeline */
502d30ea906Sjfb8856606 for (i = 0; i < n_pipelines; i++) {
503d30ea906Sjfb8856606 struct pipeline_data *p = &t->pipeline_data[i];
504d30ea906Sjfb8856606
505d30ea906Sjfb8856606 if (p->p != pipeline)
506d30ea906Sjfb8856606 continue;
507d30ea906Sjfb8856606
508d30ea906Sjfb8856606 if (i < n_pipelines - 1) {
509d30ea906Sjfb8856606 struct rte_pipeline *pipeline_last =
510d30ea906Sjfb8856606 t->p[n_pipelines - 1];
511d30ea906Sjfb8856606 struct pipeline_data *p_last =
512d30ea906Sjfb8856606 &t->pipeline_data[n_pipelines - 1];
513d30ea906Sjfb8856606
514d30ea906Sjfb8856606 t->p[i] = pipeline_last;
515d30ea906Sjfb8856606 memcpy(p, p_last, sizeof(*p));
516d30ea906Sjfb8856606 }
517d30ea906Sjfb8856606
518d30ea906Sjfb8856606 t->n_pipelines--;
519d30ea906Sjfb8856606
520d30ea906Sjfb8856606 rsp->status = 0;
521d30ea906Sjfb8856606 return rsp;
522d30ea906Sjfb8856606 }
523d30ea906Sjfb8856606
524d30ea906Sjfb8856606 /* should not get here */
525d30ea906Sjfb8856606 rsp->status = 0;
526d30ea906Sjfb8856606 return rsp;
52728440c50Sjfb8856606 }
52828440c50Sjfb8856606
52928440c50Sjfb8856606 static void
thread_msg_handle(struct thread_data * t)530d30ea906Sjfb8856606 thread_msg_handle(struct thread_data *t)
53128440c50Sjfb8856606 {
532d30ea906Sjfb8856606 for ( ; ; ) {
533d30ea906Sjfb8856606 struct thread_msg_req *req;
534d30ea906Sjfb8856606 struct thread_msg_rsp *rsp;
53528440c50Sjfb8856606
536d30ea906Sjfb8856606 req = thread_msg_recv(t->msgq_req);
537d30ea906Sjfb8856606 if (req == NULL)
538d30ea906Sjfb8856606 break;
53928440c50Sjfb8856606
540d30ea906Sjfb8856606 switch (req->type) {
541d30ea906Sjfb8856606 case THREAD_REQ_PIPELINE_ENABLE:
542d30ea906Sjfb8856606 rsp = thread_msg_handle_pipeline_enable(t, req);
543d30ea906Sjfb8856606 break;
544d30ea906Sjfb8856606
545d30ea906Sjfb8856606 case THREAD_REQ_PIPELINE_DISABLE:
546d30ea906Sjfb8856606 rsp = thread_msg_handle_pipeline_disable(t, req);
547d30ea906Sjfb8856606 break;
548d30ea906Sjfb8856606
549d30ea906Sjfb8856606 default:
550d30ea906Sjfb8856606 rsp = (struct thread_msg_rsp *) req;
551d30ea906Sjfb8856606 rsp->status = -1;
552d30ea906Sjfb8856606 }
553d30ea906Sjfb8856606
554d30ea906Sjfb8856606 thread_msg_send(t->msgq_rsp, rsp);
555d30ea906Sjfb8856606 }
556d30ea906Sjfb8856606 }
557d30ea906Sjfb8856606
558d30ea906Sjfb8856606 /**
559*2d9fd380Sjfb8856606 * Main thread & data plane threads: message passing
560d30ea906Sjfb8856606 */
561d30ea906Sjfb8856606 enum pipeline_req_type {
562d30ea906Sjfb8856606 /* Port IN */
563d30ea906Sjfb8856606 PIPELINE_REQ_PORT_IN_STATS_READ,
564d30ea906Sjfb8856606 PIPELINE_REQ_PORT_IN_ENABLE,
565d30ea906Sjfb8856606 PIPELINE_REQ_PORT_IN_DISABLE,
566d30ea906Sjfb8856606
567d30ea906Sjfb8856606 /* Port OUT */
568d30ea906Sjfb8856606 PIPELINE_REQ_PORT_OUT_STATS_READ,
569d30ea906Sjfb8856606
570d30ea906Sjfb8856606 /* Table */
571d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_STATS_READ,
572d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_RULE_ADD,
573d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_RULE_ADD_DEFAULT,
574d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_RULE_ADD_BULK,
575d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_RULE_DELETE,
576d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_RULE_DELETE_DEFAULT,
577d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_RULE_STATS_READ,
578d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_MTR_PROFILE_ADD,
579d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_MTR_PROFILE_DELETE,
580d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_RULE_MTR_READ,
581d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_DSCP_TABLE_UPDATE,
582d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_RULE_TTL_READ,
583d30ea906Sjfb8856606 PIPELINE_REQ_TABLE_RULE_TIME_READ,
584d30ea906Sjfb8856606 PIPELINE_REQ_MAX
585d30ea906Sjfb8856606 };
586d30ea906Sjfb8856606
587d30ea906Sjfb8856606 struct pipeline_msg_req_port_in_stats_read {
588d30ea906Sjfb8856606 int clear;
589d30ea906Sjfb8856606 };
590d30ea906Sjfb8856606
591d30ea906Sjfb8856606 struct pipeline_msg_req_port_out_stats_read {
592d30ea906Sjfb8856606 int clear;
593d30ea906Sjfb8856606 };
594d30ea906Sjfb8856606
595d30ea906Sjfb8856606 struct pipeline_msg_req_table_stats_read {
596d30ea906Sjfb8856606 int clear;
597d30ea906Sjfb8856606 };
598d30ea906Sjfb8856606
599d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_add {
600d30ea906Sjfb8856606 struct table_rule_match match;
601d30ea906Sjfb8856606 struct table_rule_action action;
602d30ea906Sjfb8856606 };
603d30ea906Sjfb8856606
604d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_add_default {
605d30ea906Sjfb8856606 struct table_rule_action action;
606d30ea906Sjfb8856606 };
607d30ea906Sjfb8856606
608d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_add_bulk {
609d30ea906Sjfb8856606 struct table_rule_list *list;
610d30ea906Sjfb8856606 int bulk;
611d30ea906Sjfb8856606 };
612d30ea906Sjfb8856606
613d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_delete {
614d30ea906Sjfb8856606 struct table_rule_match match;
615d30ea906Sjfb8856606 };
616d30ea906Sjfb8856606
617d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_stats_read {
618d30ea906Sjfb8856606 void *data;
619d30ea906Sjfb8856606 int clear;
620d30ea906Sjfb8856606 };
621d30ea906Sjfb8856606
622d30ea906Sjfb8856606 struct pipeline_msg_req_table_mtr_profile_add {
623d30ea906Sjfb8856606 uint32_t meter_profile_id;
624d30ea906Sjfb8856606 struct rte_table_action_meter_profile profile;
625d30ea906Sjfb8856606 };
626d30ea906Sjfb8856606
627d30ea906Sjfb8856606 struct pipeline_msg_req_table_mtr_profile_delete {
628d30ea906Sjfb8856606 uint32_t meter_profile_id;
629d30ea906Sjfb8856606 };
630d30ea906Sjfb8856606
631d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_mtr_read {
632d30ea906Sjfb8856606 void *data;
633d30ea906Sjfb8856606 uint32_t tc_mask;
634d30ea906Sjfb8856606 int clear;
635d30ea906Sjfb8856606 };
636d30ea906Sjfb8856606
637d30ea906Sjfb8856606 struct pipeline_msg_req_table_dscp_table_update {
638d30ea906Sjfb8856606 uint64_t dscp_mask;
639d30ea906Sjfb8856606 struct rte_table_action_dscp_table dscp_table;
640d30ea906Sjfb8856606 };
641d30ea906Sjfb8856606
642d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_ttl_read {
643d30ea906Sjfb8856606 void *data;
644d30ea906Sjfb8856606 int clear;
645d30ea906Sjfb8856606 };
646d30ea906Sjfb8856606
647d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_time_read {
648d30ea906Sjfb8856606 void *data;
649d30ea906Sjfb8856606 };
650d30ea906Sjfb8856606
651d30ea906Sjfb8856606 struct pipeline_msg_req {
652d30ea906Sjfb8856606 enum pipeline_req_type type;
653d30ea906Sjfb8856606 uint32_t id; /* Port IN, port OUT or table ID */
654d30ea906Sjfb8856606
655d30ea906Sjfb8856606 RTE_STD_C11
656d30ea906Sjfb8856606 union {
657d30ea906Sjfb8856606 struct pipeline_msg_req_port_in_stats_read port_in_stats_read;
658d30ea906Sjfb8856606 struct pipeline_msg_req_port_out_stats_read port_out_stats_read;
659d30ea906Sjfb8856606 struct pipeline_msg_req_table_stats_read table_stats_read;
660d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_add table_rule_add;
661d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_add_default table_rule_add_default;
662d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_add_bulk table_rule_add_bulk;
663d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_delete table_rule_delete;
664d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_stats_read table_rule_stats_read;
665d30ea906Sjfb8856606 struct pipeline_msg_req_table_mtr_profile_add table_mtr_profile_add;
666d30ea906Sjfb8856606 struct pipeline_msg_req_table_mtr_profile_delete table_mtr_profile_delete;
667d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_mtr_read table_rule_mtr_read;
668d30ea906Sjfb8856606 struct pipeline_msg_req_table_dscp_table_update table_dscp_table_update;
669d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_ttl_read table_rule_ttl_read;
670d30ea906Sjfb8856606 struct pipeline_msg_req_table_rule_time_read table_rule_time_read;
671d30ea906Sjfb8856606 };
672d30ea906Sjfb8856606 };
673d30ea906Sjfb8856606
674d30ea906Sjfb8856606 struct pipeline_msg_rsp_port_in_stats_read {
675d30ea906Sjfb8856606 struct rte_pipeline_port_in_stats stats;
676d30ea906Sjfb8856606 };
677d30ea906Sjfb8856606
678d30ea906Sjfb8856606 struct pipeline_msg_rsp_port_out_stats_read {
679d30ea906Sjfb8856606 struct rte_pipeline_port_out_stats stats;
680d30ea906Sjfb8856606 };
681d30ea906Sjfb8856606
682d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_stats_read {
683d30ea906Sjfb8856606 struct rte_pipeline_table_stats stats;
684d30ea906Sjfb8856606 };
685d30ea906Sjfb8856606
686d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_add {
687d30ea906Sjfb8856606 void *data;
688d30ea906Sjfb8856606 };
689d30ea906Sjfb8856606
690d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_add_default {
691d30ea906Sjfb8856606 void *data;
692d30ea906Sjfb8856606 };
693d30ea906Sjfb8856606
694d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_add_bulk {
695d30ea906Sjfb8856606 uint32_t n_rules;
696d30ea906Sjfb8856606 };
697d30ea906Sjfb8856606
698d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_stats_read {
699d30ea906Sjfb8856606 struct rte_table_action_stats_counters stats;
700d30ea906Sjfb8856606 };
701d30ea906Sjfb8856606
702d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_mtr_read {
703d30ea906Sjfb8856606 struct rte_table_action_mtr_counters stats;
704d30ea906Sjfb8856606 };
705d30ea906Sjfb8856606
706d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_ttl_read {
707d30ea906Sjfb8856606 struct rte_table_action_ttl_counters stats;
708d30ea906Sjfb8856606 };
709d30ea906Sjfb8856606
710d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_time_read {
711d30ea906Sjfb8856606 uint64_t timestamp;
712d30ea906Sjfb8856606 };
713d30ea906Sjfb8856606
714d30ea906Sjfb8856606 struct pipeline_msg_rsp {
715d30ea906Sjfb8856606 int status;
716d30ea906Sjfb8856606
717d30ea906Sjfb8856606 RTE_STD_C11
718d30ea906Sjfb8856606 union {
719d30ea906Sjfb8856606 struct pipeline_msg_rsp_port_in_stats_read port_in_stats_read;
720d30ea906Sjfb8856606 struct pipeline_msg_rsp_port_out_stats_read port_out_stats_read;
721d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_stats_read table_stats_read;
722d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_add table_rule_add;
723d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_add_default table_rule_add_default;
724d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_add_bulk table_rule_add_bulk;
725d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_stats_read table_rule_stats_read;
726d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_mtr_read table_rule_mtr_read;
727d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_ttl_read table_rule_ttl_read;
728d30ea906Sjfb8856606 struct pipeline_msg_rsp_table_rule_time_read table_rule_time_read;
729d30ea906Sjfb8856606 };
730d30ea906Sjfb8856606 };
731d30ea906Sjfb8856606
732d30ea906Sjfb8856606 /**
733*2d9fd380Sjfb8856606 * Main thread
734d30ea906Sjfb8856606 */
735d30ea906Sjfb8856606 static struct pipeline_msg_req *
pipeline_msg_alloc(void)736d30ea906Sjfb8856606 pipeline_msg_alloc(void)
737d30ea906Sjfb8856606 {
738d30ea906Sjfb8856606 size_t size = RTE_MAX(sizeof(struct pipeline_msg_req),
739d30ea906Sjfb8856606 sizeof(struct pipeline_msg_rsp));
740d30ea906Sjfb8856606
741d30ea906Sjfb8856606 return calloc(1, size);
742d30ea906Sjfb8856606 }
743d30ea906Sjfb8856606
744d30ea906Sjfb8856606 static void
pipeline_msg_free(struct pipeline_msg_rsp * rsp)745d30ea906Sjfb8856606 pipeline_msg_free(struct pipeline_msg_rsp *rsp)
746d30ea906Sjfb8856606 {
747d30ea906Sjfb8856606 free(rsp);
748d30ea906Sjfb8856606 }
749d30ea906Sjfb8856606
750d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_send_recv(struct pipeline * p,struct pipeline_msg_req * req)751d30ea906Sjfb8856606 pipeline_msg_send_recv(struct pipeline *p,
752d30ea906Sjfb8856606 struct pipeline_msg_req *req)
753d30ea906Sjfb8856606 {
754d30ea906Sjfb8856606 struct rte_ring *msgq_req = p->msgq_req;
755d30ea906Sjfb8856606 struct rte_ring *msgq_rsp = p->msgq_rsp;
756d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
757d30ea906Sjfb8856606 int status;
758d30ea906Sjfb8856606
759d30ea906Sjfb8856606 /* send */
760d30ea906Sjfb8856606 do {
761d30ea906Sjfb8856606 status = rte_ring_sp_enqueue(msgq_req, req);
762d30ea906Sjfb8856606 } while (status == -ENOBUFS);
763d30ea906Sjfb8856606
764d30ea906Sjfb8856606 /* recv */
765d30ea906Sjfb8856606 do {
766d30ea906Sjfb8856606 status = rte_ring_sc_dequeue(msgq_rsp, (void **) &rsp);
767d30ea906Sjfb8856606 } while (status != 0);
768d30ea906Sjfb8856606
769d30ea906Sjfb8856606 return rsp;
77028440c50Sjfb8856606 }
77128440c50Sjfb8856606
77228440c50Sjfb8856606 int
pipeline_port_in_stats_read(const char * pipeline_name,uint32_t port_id,struct rte_pipeline_port_in_stats * stats,int clear)773d30ea906Sjfb8856606 pipeline_port_in_stats_read(const char *pipeline_name,
774d30ea906Sjfb8856606 uint32_t port_id,
775d30ea906Sjfb8856606 struct rte_pipeline_port_in_stats *stats,
776d30ea906Sjfb8856606 int clear)
77728440c50Sjfb8856606 {
778d30ea906Sjfb8856606 struct pipeline *p;
779d30ea906Sjfb8856606 struct pipeline_msg_req *req;
780d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
781d30ea906Sjfb8856606 int status;
78228440c50Sjfb8856606
783d30ea906Sjfb8856606 /* Check input params */
784d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
785d30ea906Sjfb8856606 (stats == NULL))
786d30ea906Sjfb8856606 return -1;
787d30ea906Sjfb8856606
788d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
789d30ea906Sjfb8856606 if ((p == NULL) ||
790d30ea906Sjfb8856606 (port_id >= p->n_ports_in))
791d30ea906Sjfb8856606 return -1;
792d30ea906Sjfb8856606
793d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
794d30ea906Sjfb8856606 status = rte_pipeline_port_in_stats_read(p->p,
795d30ea906Sjfb8856606 port_id,
796d30ea906Sjfb8856606 stats,
797d30ea906Sjfb8856606 clear);
798d30ea906Sjfb8856606
799d30ea906Sjfb8856606 return status;
800d30ea906Sjfb8856606 }
801d30ea906Sjfb8856606
802d30ea906Sjfb8856606 /* Allocate request */
803d30ea906Sjfb8856606 req = pipeline_msg_alloc();
804d30ea906Sjfb8856606 if (req == NULL)
805d30ea906Sjfb8856606 return -1;
806d30ea906Sjfb8856606
807d30ea906Sjfb8856606 /* Write request */
808d30ea906Sjfb8856606 req->type = PIPELINE_REQ_PORT_IN_STATS_READ;
809d30ea906Sjfb8856606 req->id = port_id;
810d30ea906Sjfb8856606 req->port_in_stats_read.clear = clear;
811d30ea906Sjfb8856606
812d30ea906Sjfb8856606 /* Send request and wait for response */
813d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
814d30ea906Sjfb8856606
815d30ea906Sjfb8856606 /* Read response */
816d30ea906Sjfb8856606 status = rsp->status;
817d30ea906Sjfb8856606 if (status == 0)
818d30ea906Sjfb8856606 memcpy(stats, &rsp->port_in_stats_read.stats, sizeof(*stats));
819d30ea906Sjfb8856606
820d30ea906Sjfb8856606 /* Free response */
821d30ea906Sjfb8856606 pipeline_msg_free(rsp);
822d30ea906Sjfb8856606
823d30ea906Sjfb8856606 return status;
824d30ea906Sjfb8856606 }
825d30ea906Sjfb8856606
826d30ea906Sjfb8856606 int
pipeline_port_in_enable(const char * pipeline_name,uint32_t port_id)827d30ea906Sjfb8856606 pipeline_port_in_enable(const char *pipeline_name,
828d30ea906Sjfb8856606 uint32_t port_id)
829d30ea906Sjfb8856606 {
830d30ea906Sjfb8856606 struct pipeline *p;
831d30ea906Sjfb8856606 struct pipeline_msg_req *req;
832d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
833d30ea906Sjfb8856606 int status;
834d30ea906Sjfb8856606
835d30ea906Sjfb8856606 /* Check input params */
836d30ea906Sjfb8856606 if (pipeline_name == NULL)
837d30ea906Sjfb8856606 return -1;
838d30ea906Sjfb8856606
839d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
840d30ea906Sjfb8856606 if ((p == NULL) ||
841d30ea906Sjfb8856606 (port_id >= p->n_ports_in))
842d30ea906Sjfb8856606 return -1;
843d30ea906Sjfb8856606
844d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
845d30ea906Sjfb8856606 status = rte_pipeline_port_in_enable(p->p, port_id);
846d30ea906Sjfb8856606 return status;
847d30ea906Sjfb8856606 }
848d30ea906Sjfb8856606
849d30ea906Sjfb8856606 /* Allocate request */
850d30ea906Sjfb8856606 req = pipeline_msg_alloc();
851d30ea906Sjfb8856606 if (req == NULL)
852d30ea906Sjfb8856606 return -1;
853d30ea906Sjfb8856606
854d30ea906Sjfb8856606 /* Write request */
855d30ea906Sjfb8856606 req->type = PIPELINE_REQ_PORT_IN_ENABLE;
856d30ea906Sjfb8856606 req->id = port_id;
857d30ea906Sjfb8856606
858d30ea906Sjfb8856606 /* Send request and wait for response */
859d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
860d30ea906Sjfb8856606
861d30ea906Sjfb8856606 /* Read response */
862d30ea906Sjfb8856606 status = rsp->status;
863d30ea906Sjfb8856606
864d30ea906Sjfb8856606 /* Free response */
865d30ea906Sjfb8856606 pipeline_msg_free(rsp);
866d30ea906Sjfb8856606
867d30ea906Sjfb8856606 return status;
868d30ea906Sjfb8856606 }
869d30ea906Sjfb8856606
870d30ea906Sjfb8856606 int
pipeline_port_in_disable(const char * pipeline_name,uint32_t port_id)871d30ea906Sjfb8856606 pipeline_port_in_disable(const char *pipeline_name,
872d30ea906Sjfb8856606 uint32_t port_id)
873d30ea906Sjfb8856606 {
874d30ea906Sjfb8856606 struct pipeline *p;
875d30ea906Sjfb8856606 struct pipeline_msg_req *req;
876d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
877d30ea906Sjfb8856606 int status;
878d30ea906Sjfb8856606
879d30ea906Sjfb8856606 /* Check input params */
880d30ea906Sjfb8856606 if (pipeline_name == NULL)
881d30ea906Sjfb8856606 return -1;
882d30ea906Sjfb8856606
883d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
884d30ea906Sjfb8856606 if ((p == NULL) ||
885d30ea906Sjfb8856606 (port_id >= p->n_ports_in))
886d30ea906Sjfb8856606 return -1;
887d30ea906Sjfb8856606
888d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
889d30ea906Sjfb8856606 status = rte_pipeline_port_in_disable(p->p, port_id);
890d30ea906Sjfb8856606 return status;
891d30ea906Sjfb8856606 }
892d30ea906Sjfb8856606
893d30ea906Sjfb8856606 /* Allocate request */
894d30ea906Sjfb8856606 req = pipeline_msg_alloc();
895d30ea906Sjfb8856606 if (req == NULL)
896d30ea906Sjfb8856606 return -1;
897d30ea906Sjfb8856606
898d30ea906Sjfb8856606 /* Write request */
899d30ea906Sjfb8856606 req->type = PIPELINE_REQ_PORT_IN_DISABLE;
900d30ea906Sjfb8856606 req->id = port_id;
901d30ea906Sjfb8856606
902d30ea906Sjfb8856606 /* Send request and wait for response */
903d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
904d30ea906Sjfb8856606
905d30ea906Sjfb8856606 /* Read response */
906d30ea906Sjfb8856606 status = rsp->status;
907d30ea906Sjfb8856606
908d30ea906Sjfb8856606 /* Free response */
909d30ea906Sjfb8856606 pipeline_msg_free(rsp);
910d30ea906Sjfb8856606
911d30ea906Sjfb8856606 return status;
912d30ea906Sjfb8856606 }
913d30ea906Sjfb8856606
914d30ea906Sjfb8856606 int
pipeline_port_out_stats_read(const char * pipeline_name,uint32_t port_id,struct rte_pipeline_port_out_stats * stats,int clear)915d30ea906Sjfb8856606 pipeline_port_out_stats_read(const char *pipeline_name,
916d30ea906Sjfb8856606 uint32_t port_id,
917d30ea906Sjfb8856606 struct rte_pipeline_port_out_stats *stats,
918d30ea906Sjfb8856606 int clear)
919d30ea906Sjfb8856606 {
920d30ea906Sjfb8856606 struct pipeline *p;
921d30ea906Sjfb8856606 struct pipeline_msg_req *req;
922d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
923d30ea906Sjfb8856606 int status;
924d30ea906Sjfb8856606
925d30ea906Sjfb8856606 /* Check input params */
926d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
927d30ea906Sjfb8856606 (stats == NULL))
928d30ea906Sjfb8856606 return -1;
929d30ea906Sjfb8856606
930d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
931d30ea906Sjfb8856606 if ((p == NULL) ||
932d30ea906Sjfb8856606 (port_id >= p->n_ports_out))
933d30ea906Sjfb8856606 return -1;
934d30ea906Sjfb8856606
935d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
936d30ea906Sjfb8856606 status = rte_pipeline_port_out_stats_read(p->p,
937d30ea906Sjfb8856606 port_id,
938d30ea906Sjfb8856606 stats,
939d30ea906Sjfb8856606 clear);
940d30ea906Sjfb8856606
941d30ea906Sjfb8856606 return status;
942d30ea906Sjfb8856606 }
943d30ea906Sjfb8856606
944d30ea906Sjfb8856606 /* Allocate request */
945d30ea906Sjfb8856606 req = pipeline_msg_alloc();
946d30ea906Sjfb8856606 if (req == NULL)
947d30ea906Sjfb8856606 return -1;
948d30ea906Sjfb8856606
949d30ea906Sjfb8856606 /* Write request */
950d30ea906Sjfb8856606 req->type = PIPELINE_REQ_PORT_OUT_STATS_READ;
951d30ea906Sjfb8856606 req->id = port_id;
952d30ea906Sjfb8856606 req->port_out_stats_read.clear = clear;
953d30ea906Sjfb8856606
954d30ea906Sjfb8856606 /* Send request and wait for response */
955d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
956d30ea906Sjfb8856606
957d30ea906Sjfb8856606 /* Read response */
958d30ea906Sjfb8856606 status = rsp->status;
959d30ea906Sjfb8856606 if (status == 0)
960d30ea906Sjfb8856606 memcpy(stats, &rsp->port_out_stats_read.stats, sizeof(*stats));
961d30ea906Sjfb8856606
962d30ea906Sjfb8856606 /* Free response */
963d30ea906Sjfb8856606 pipeline_msg_free(rsp);
964d30ea906Sjfb8856606
965d30ea906Sjfb8856606 return status;
966d30ea906Sjfb8856606 }
967d30ea906Sjfb8856606
968d30ea906Sjfb8856606 int
pipeline_table_stats_read(const char * pipeline_name,uint32_t table_id,struct rte_pipeline_table_stats * stats,int clear)969d30ea906Sjfb8856606 pipeline_table_stats_read(const char *pipeline_name,
970d30ea906Sjfb8856606 uint32_t table_id,
971d30ea906Sjfb8856606 struct rte_pipeline_table_stats *stats,
972d30ea906Sjfb8856606 int clear)
973d30ea906Sjfb8856606 {
974d30ea906Sjfb8856606 struct pipeline *p;
975d30ea906Sjfb8856606 struct pipeline_msg_req *req;
976d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
977d30ea906Sjfb8856606 int status;
978d30ea906Sjfb8856606
979d30ea906Sjfb8856606 /* Check input params */
980d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
981d30ea906Sjfb8856606 (stats == NULL))
982d30ea906Sjfb8856606 return -1;
983d30ea906Sjfb8856606
984d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
985d30ea906Sjfb8856606 if ((p == NULL) ||
986d30ea906Sjfb8856606 (table_id >= p->n_tables))
987d30ea906Sjfb8856606 return -1;
988d30ea906Sjfb8856606
989d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
990d30ea906Sjfb8856606 status = rte_pipeline_table_stats_read(p->p,
991d30ea906Sjfb8856606 table_id,
992d30ea906Sjfb8856606 stats,
993d30ea906Sjfb8856606 clear);
994d30ea906Sjfb8856606
995d30ea906Sjfb8856606 return status;
996d30ea906Sjfb8856606 }
997d30ea906Sjfb8856606
998d30ea906Sjfb8856606 /* Allocate request */
999d30ea906Sjfb8856606 req = pipeline_msg_alloc();
1000d30ea906Sjfb8856606 if (req == NULL)
1001d30ea906Sjfb8856606 return -1;
1002d30ea906Sjfb8856606
1003d30ea906Sjfb8856606 /* Write request */
1004d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_STATS_READ;
1005d30ea906Sjfb8856606 req->id = table_id;
1006d30ea906Sjfb8856606 req->table_stats_read.clear = clear;
1007d30ea906Sjfb8856606
1008d30ea906Sjfb8856606 /* Send request and wait for response */
1009d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
1010d30ea906Sjfb8856606
1011d30ea906Sjfb8856606 /* Read response */
1012d30ea906Sjfb8856606 status = rsp->status;
1013d30ea906Sjfb8856606 if (status == 0)
1014d30ea906Sjfb8856606 memcpy(stats, &rsp->table_stats_read.stats, sizeof(*stats));
1015d30ea906Sjfb8856606
1016d30ea906Sjfb8856606 /* Free response */
1017d30ea906Sjfb8856606 pipeline_msg_free(rsp);
1018d30ea906Sjfb8856606
1019d30ea906Sjfb8856606 return status;
1020d30ea906Sjfb8856606 }
1021d30ea906Sjfb8856606
1022d30ea906Sjfb8856606 static int
match_check(struct table_rule_match * match,struct pipeline * p,uint32_t table_id)1023d30ea906Sjfb8856606 match_check(struct table_rule_match *match,
1024d30ea906Sjfb8856606 struct pipeline *p,
1025d30ea906Sjfb8856606 uint32_t table_id)
1026d30ea906Sjfb8856606 {
1027d30ea906Sjfb8856606 struct table *table;
1028d30ea906Sjfb8856606
1029d30ea906Sjfb8856606 if ((match == NULL) ||
1030d30ea906Sjfb8856606 (p == NULL) ||
1031d30ea906Sjfb8856606 (table_id >= p->n_tables))
1032d30ea906Sjfb8856606 return -1;
1033d30ea906Sjfb8856606
1034d30ea906Sjfb8856606 table = &p->table[table_id];
1035d30ea906Sjfb8856606 if (match->match_type != table->params.match_type)
1036d30ea906Sjfb8856606 return -1;
1037d30ea906Sjfb8856606
1038d30ea906Sjfb8856606 switch (match->match_type) {
1039d30ea906Sjfb8856606 case TABLE_ACL:
1040d30ea906Sjfb8856606 {
1041d30ea906Sjfb8856606 struct table_acl_params *t = &table->params.match.acl;
1042d30ea906Sjfb8856606 struct table_rule_match_acl *r = &match->match.acl;
1043d30ea906Sjfb8856606
1044d30ea906Sjfb8856606 if ((r->ip_version && (t->ip_version == 0)) ||
1045d30ea906Sjfb8856606 ((r->ip_version == 0) && t->ip_version))
1046d30ea906Sjfb8856606 return -1;
1047d30ea906Sjfb8856606
1048d30ea906Sjfb8856606 if (r->ip_version) {
1049d30ea906Sjfb8856606 if ((r->sa_depth > 32) ||
1050d30ea906Sjfb8856606 (r->da_depth > 32))
1051d30ea906Sjfb8856606 return -1;
1052d30ea906Sjfb8856606 } else {
1053d30ea906Sjfb8856606 if ((r->sa_depth > 128) ||
1054d30ea906Sjfb8856606 (r->da_depth > 128))
1055d30ea906Sjfb8856606 return -1;
1056d30ea906Sjfb8856606 }
1057d30ea906Sjfb8856606 return 0;
1058d30ea906Sjfb8856606 }
1059d30ea906Sjfb8856606
1060d30ea906Sjfb8856606 case TABLE_ARRAY:
1061d30ea906Sjfb8856606 return 0;
1062d30ea906Sjfb8856606
1063d30ea906Sjfb8856606 case TABLE_HASH:
1064d30ea906Sjfb8856606 return 0;
1065d30ea906Sjfb8856606
1066d30ea906Sjfb8856606 case TABLE_LPM:
1067d30ea906Sjfb8856606 {
1068d30ea906Sjfb8856606 struct table_lpm_params *t = &table->params.match.lpm;
1069d30ea906Sjfb8856606 struct table_rule_match_lpm *r = &match->match.lpm;
1070d30ea906Sjfb8856606
1071d30ea906Sjfb8856606 if ((r->ip_version && (t->key_size != 4)) ||
1072d30ea906Sjfb8856606 ((r->ip_version == 0) && (t->key_size != 16)))
1073d30ea906Sjfb8856606 return -1;
1074d30ea906Sjfb8856606
1075d30ea906Sjfb8856606 if (r->ip_version) {
1076d30ea906Sjfb8856606 if (r->depth > 32)
1077d30ea906Sjfb8856606 return -1;
1078d30ea906Sjfb8856606 } else {
1079d30ea906Sjfb8856606 if (r->depth > 128)
1080d30ea906Sjfb8856606 return -1;
1081d30ea906Sjfb8856606 }
1082d30ea906Sjfb8856606 return 0;
1083d30ea906Sjfb8856606 }
1084d30ea906Sjfb8856606
1085d30ea906Sjfb8856606 case TABLE_STUB:
1086d30ea906Sjfb8856606 return -1;
1087d30ea906Sjfb8856606
1088d30ea906Sjfb8856606 default:
1089d30ea906Sjfb8856606 return -1;
1090d30ea906Sjfb8856606 }
1091d30ea906Sjfb8856606 }
1092d30ea906Sjfb8856606
1093d30ea906Sjfb8856606 static int
action_check(struct table_rule_action * action,struct pipeline * p,uint32_t table_id)1094d30ea906Sjfb8856606 action_check(struct table_rule_action *action,
1095d30ea906Sjfb8856606 struct pipeline *p,
1096d30ea906Sjfb8856606 uint32_t table_id)
1097d30ea906Sjfb8856606 {
1098d30ea906Sjfb8856606 struct table_action_profile *ap;
1099d30ea906Sjfb8856606
1100d30ea906Sjfb8856606 if ((action == NULL) ||
1101d30ea906Sjfb8856606 (p == NULL) ||
1102d30ea906Sjfb8856606 (table_id >= p->n_tables))
1103d30ea906Sjfb8856606 return -1;
1104d30ea906Sjfb8856606
1105d30ea906Sjfb8856606 ap = p->table[table_id].ap;
1106d30ea906Sjfb8856606 if (action->action_mask != ap->params.action_mask)
1107d30ea906Sjfb8856606 return -1;
1108d30ea906Sjfb8856606
1109d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_FWD)) {
1110d30ea906Sjfb8856606 if ((action->fwd.action == RTE_PIPELINE_ACTION_PORT) &&
1111d30ea906Sjfb8856606 (action->fwd.id >= p->n_ports_out))
1112d30ea906Sjfb8856606 return -1;
1113d30ea906Sjfb8856606
1114d30ea906Sjfb8856606 if ((action->fwd.action == RTE_PIPELINE_ACTION_TABLE) &&
1115d30ea906Sjfb8856606 (action->fwd.id >= p->n_tables))
1116d30ea906Sjfb8856606 return -1;
1117d30ea906Sjfb8856606 }
1118d30ea906Sjfb8856606
1119d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) {
1120d30ea906Sjfb8856606 uint32_t tc_mask0 = (1 << ap->params.mtr.n_tc) - 1;
1121d30ea906Sjfb8856606 uint32_t tc_mask1 = action->mtr.tc_mask;
1122d30ea906Sjfb8856606
1123d30ea906Sjfb8856606 if (tc_mask1 != tc_mask0)
1124d30ea906Sjfb8856606 return -1;
1125d30ea906Sjfb8856606 }
1126d30ea906Sjfb8856606
1127d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_TM)) {
1128d30ea906Sjfb8856606 uint32_t n_subports_per_port =
1129d30ea906Sjfb8856606 ap->params.tm.n_subports_per_port;
1130d30ea906Sjfb8856606 uint32_t n_pipes_per_subport =
1131d30ea906Sjfb8856606 ap->params.tm.n_pipes_per_subport;
1132d30ea906Sjfb8856606 uint32_t subport_id = action->tm.subport_id;
1133d30ea906Sjfb8856606 uint32_t pipe_id = action->tm.pipe_id;
1134d30ea906Sjfb8856606
1135d30ea906Sjfb8856606 if ((subport_id >= n_subports_per_port) ||
1136d30ea906Sjfb8856606 (pipe_id >= n_pipes_per_subport))
1137d30ea906Sjfb8856606 return -1;
1138d30ea906Sjfb8856606 }
1139d30ea906Sjfb8856606
1140d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_ENCAP)) {
1141d30ea906Sjfb8856606 uint64_t encap_mask = ap->params.encap.encap_mask;
1142d30ea906Sjfb8856606 enum rte_table_action_encap_type type = action->encap.type;
1143d30ea906Sjfb8856606
1144d30ea906Sjfb8856606 if ((encap_mask & (1LLU << type)) == 0)
1145d30ea906Sjfb8856606 return -1;
1146d30ea906Sjfb8856606 }
1147d30ea906Sjfb8856606
1148d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_NAT)) {
1149d30ea906Sjfb8856606 int ip_version0 = ap->params.common.ip_version;
1150d30ea906Sjfb8856606 int ip_version1 = action->nat.ip_version;
1151d30ea906Sjfb8856606
1152d30ea906Sjfb8856606 if ((ip_version1 && (ip_version0 == 0)) ||
1153d30ea906Sjfb8856606 ((ip_version1 == 0) && ip_version0))
1154d30ea906Sjfb8856606 return -1;
1155d30ea906Sjfb8856606 }
1156d30ea906Sjfb8856606
1157d30ea906Sjfb8856606 return 0;
1158d30ea906Sjfb8856606 }
1159d30ea906Sjfb8856606
1160d30ea906Sjfb8856606 static int
action_default_check(struct table_rule_action * action,struct pipeline * p,uint32_t table_id)1161d30ea906Sjfb8856606 action_default_check(struct table_rule_action *action,
1162d30ea906Sjfb8856606 struct pipeline *p,
1163d30ea906Sjfb8856606 uint32_t table_id)
1164d30ea906Sjfb8856606 {
1165d30ea906Sjfb8856606 if ((action == NULL) ||
1166d30ea906Sjfb8856606 (action->action_mask != (1LLU << RTE_TABLE_ACTION_FWD)) ||
1167d30ea906Sjfb8856606 (p == NULL) ||
1168d30ea906Sjfb8856606 (table_id >= p->n_tables))
1169d30ea906Sjfb8856606 return -1;
1170d30ea906Sjfb8856606
1171d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_FWD)) {
1172d30ea906Sjfb8856606 if ((action->fwd.action == RTE_PIPELINE_ACTION_PORT) &&
1173d30ea906Sjfb8856606 (action->fwd.id >= p->n_ports_out))
1174d30ea906Sjfb8856606 return -1;
1175d30ea906Sjfb8856606
1176d30ea906Sjfb8856606 if ((action->fwd.action == RTE_PIPELINE_ACTION_TABLE) &&
1177d30ea906Sjfb8856606 (action->fwd.id >= p->n_tables))
1178d30ea906Sjfb8856606 return -1;
1179d30ea906Sjfb8856606 }
1180d30ea906Sjfb8856606
1181d30ea906Sjfb8856606 return 0;
1182d30ea906Sjfb8856606 }
1183d30ea906Sjfb8856606
1184d30ea906Sjfb8856606 union table_rule_match_low_level {
1185d30ea906Sjfb8856606 struct rte_table_acl_rule_add_params acl_add;
1186d30ea906Sjfb8856606 struct rte_table_acl_rule_delete_params acl_delete;
1187d30ea906Sjfb8856606 struct rte_table_array_key array;
1188d30ea906Sjfb8856606 uint8_t hash[TABLE_RULE_MATCH_SIZE_MAX];
1189d30ea906Sjfb8856606 struct rte_table_lpm_key lpm_ipv4;
1190d30ea906Sjfb8856606 struct rte_table_lpm_ipv6_key lpm_ipv6;
1191d30ea906Sjfb8856606 };
1192d30ea906Sjfb8856606
1193d30ea906Sjfb8856606 static int
1194d30ea906Sjfb8856606 match_convert(struct table_rule_match *mh,
1195d30ea906Sjfb8856606 union table_rule_match_low_level *ml,
1196d30ea906Sjfb8856606 int add);
1197d30ea906Sjfb8856606
1198d30ea906Sjfb8856606 static int
1199d30ea906Sjfb8856606 action_convert(struct rte_table_action *a,
1200d30ea906Sjfb8856606 struct table_rule_action *action,
1201d30ea906Sjfb8856606 struct rte_pipeline_table_entry *data);
1202d30ea906Sjfb8856606
1203d30ea906Sjfb8856606 struct table_ll {
1204d30ea906Sjfb8856606 struct rte_pipeline *p;
1205d30ea906Sjfb8856606 int table_id;
1206d30ea906Sjfb8856606 struct rte_table_action *a;
1207d30ea906Sjfb8856606 int bulk_supported;
1208d30ea906Sjfb8856606 };
1209d30ea906Sjfb8856606
1210d30ea906Sjfb8856606 static int
table_rule_add_bulk_ll(struct table_ll * table,struct table_rule_list * list,uint32_t * n_rules)1211d30ea906Sjfb8856606 table_rule_add_bulk_ll(struct table_ll *table,
1212d30ea906Sjfb8856606 struct table_rule_list *list,
1213d30ea906Sjfb8856606 uint32_t *n_rules)
1214d30ea906Sjfb8856606 {
1215d30ea906Sjfb8856606 union table_rule_match_low_level *match_ll = NULL;
1216d30ea906Sjfb8856606 uint8_t *action_ll = NULL;
1217d30ea906Sjfb8856606 void **match_ll_ptr = NULL;
1218d30ea906Sjfb8856606 struct rte_pipeline_table_entry **action_ll_ptr = NULL;
1219d30ea906Sjfb8856606 struct rte_pipeline_table_entry **entries_ptr = NULL;
1220d30ea906Sjfb8856606 int *found = NULL;
1221d30ea906Sjfb8856606 struct table_rule *rule;
1222d30ea906Sjfb8856606 uint32_t n, i;
1223d30ea906Sjfb8856606 int status = 0;
1224d30ea906Sjfb8856606
1225d30ea906Sjfb8856606 n = 0;
1226d30ea906Sjfb8856606 TAILQ_FOREACH(rule, list, node)
1227d30ea906Sjfb8856606 n++;
1228d30ea906Sjfb8856606
1229d30ea906Sjfb8856606 /* Memory allocation */
1230d30ea906Sjfb8856606 match_ll = calloc(n, sizeof(union table_rule_match_low_level));
1231d30ea906Sjfb8856606 action_ll = calloc(n, TABLE_RULE_ACTION_SIZE_MAX);
1232d30ea906Sjfb8856606
1233d30ea906Sjfb8856606 match_ll_ptr = calloc(n, sizeof(void *));
1234d30ea906Sjfb8856606 action_ll_ptr = calloc(n, sizeof(struct rte_pipeline_table_entry *));
1235d30ea906Sjfb8856606
1236d30ea906Sjfb8856606 entries_ptr = calloc(n, sizeof(struct rte_pipeline_table_entry *));
1237d30ea906Sjfb8856606 found = calloc(n, sizeof(int));
1238d30ea906Sjfb8856606
1239d30ea906Sjfb8856606 if (match_ll == NULL ||
1240d30ea906Sjfb8856606 action_ll == NULL ||
1241d30ea906Sjfb8856606 match_ll_ptr == NULL ||
1242d30ea906Sjfb8856606 action_ll_ptr == NULL ||
1243d30ea906Sjfb8856606 entries_ptr == NULL ||
1244d30ea906Sjfb8856606 found == NULL) {
1245d30ea906Sjfb8856606 status = -ENOMEM;
1246d30ea906Sjfb8856606 goto table_rule_add_bulk_ll_free;
1247d30ea906Sjfb8856606 }
1248d30ea906Sjfb8856606
1249d30ea906Sjfb8856606 /* Init */
1250d30ea906Sjfb8856606 for (i = 0; i < n; i++) {
1251d30ea906Sjfb8856606 match_ll_ptr[i] = (void *)&match_ll[i];
1252d30ea906Sjfb8856606 action_ll_ptr[i] = (struct rte_pipeline_table_entry *)
1253d30ea906Sjfb8856606 &action_ll[i * TABLE_RULE_ACTION_SIZE_MAX];
1254d30ea906Sjfb8856606 }
1255d30ea906Sjfb8856606
1256d30ea906Sjfb8856606 /* Rule (match, action) conversion */
1257d30ea906Sjfb8856606 i = 0;
1258d30ea906Sjfb8856606 TAILQ_FOREACH(rule, list, node) {
1259d30ea906Sjfb8856606 status = match_convert(&rule->match, match_ll_ptr[i], 1);
1260d30ea906Sjfb8856606 if (status)
1261d30ea906Sjfb8856606 goto table_rule_add_bulk_ll_free;
1262d30ea906Sjfb8856606
1263d30ea906Sjfb8856606 status = action_convert(table->a, &rule->action, action_ll_ptr[i]);
1264d30ea906Sjfb8856606 if (status)
1265d30ea906Sjfb8856606 goto table_rule_add_bulk_ll_free;
1266d30ea906Sjfb8856606
1267d30ea906Sjfb8856606 i++;
1268d30ea906Sjfb8856606 }
1269d30ea906Sjfb8856606
1270d30ea906Sjfb8856606 /* Add rule (match, action) to table */
1271d30ea906Sjfb8856606 if (table->bulk_supported) {
1272d30ea906Sjfb8856606 status = rte_pipeline_table_entry_add_bulk(table->p,
1273d30ea906Sjfb8856606 table->table_id,
1274d30ea906Sjfb8856606 match_ll_ptr,
1275d30ea906Sjfb8856606 action_ll_ptr,
1276d30ea906Sjfb8856606 n,
1277d30ea906Sjfb8856606 found,
1278d30ea906Sjfb8856606 entries_ptr);
1279d30ea906Sjfb8856606 if (status)
1280d30ea906Sjfb8856606 goto table_rule_add_bulk_ll_free;
1281d30ea906Sjfb8856606 } else
1282d30ea906Sjfb8856606 for (i = 0; i < n; i++) {
1283d30ea906Sjfb8856606 status = rte_pipeline_table_entry_add(table->p,
1284d30ea906Sjfb8856606 table->table_id,
1285d30ea906Sjfb8856606 match_ll_ptr[i],
1286d30ea906Sjfb8856606 action_ll_ptr[i],
1287d30ea906Sjfb8856606 &found[i],
1288d30ea906Sjfb8856606 &entries_ptr[i]);
1289d30ea906Sjfb8856606 if (status) {
1290d30ea906Sjfb8856606 if (i == 0)
1291d30ea906Sjfb8856606 goto table_rule_add_bulk_ll_free;
1292d30ea906Sjfb8856606
1293d30ea906Sjfb8856606 /* No roll-back. */
1294d30ea906Sjfb8856606 status = 0;
1295d30ea906Sjfb8856606 n = i;
1296d30ea906Sjfb8856606 break;
1297d30ea906Sjfb8856606 }
1298d30ea906Sjfb8856606 }
1299d30ea906Sjfb8856606
1300d30ea906Sjfb8856606 /* Write back to the rule list. */
1301d30ea906Sjfb8856606 i = 0;
1302d30ea906Sjfb8856606 TAILQ_FOREACH(rule, list, node) {
1303d30ea906Sjfb8856606 if (i >= n)
1304d30ea906Sjfb8856606 break;
1305d30ea906Sjfb8856606
1306d30ea906Sjfb8856606 rule->data = entries_ptr[i];
1307d30ea906Sjfb8856606
1308d30ea906Sjfb8856606 i++;
1309d30ea906Sjfb8856606 }
1310d30ea906Sjfb8856606
1311d30ea906Sjfb8856606 *n_rules = n;
1312d30ea906Sjfb8856606
1313d30ea906Sjfb8856606 /* Free */
1314d30ea906Sjfb8856606 table_rule_add_bulk_ll_free:
1315d30ea906Sjfb8856606 free(found);
1316d30ea906Sjfb8856606 free(entries_ptr);
1317d30ea906Sjfb8856606 free(action_ll_ptr);
1318d30ea906Sjfb8856606 free(match_ll_ptr);
1319d30ea906Sjfb8856606 free(action_ll);
1320d30ea906Sjfb8856606 free(match_ll);
1321d30ea906Sjfb8856606
1322d30ea906Sjfb8856606 return status;
1323d30ea906Sjfb8856606 }
1324d30ea906Sjfb8856606
1325d30ea906Sjfb8856606 int
pipeline_table_rule_add(const char * pipeline_name,uint32_t table_id,struct table_rule_match * match,struct table_rule_action * action)1326d30ea906Sjfb8856606 pipeline_table_rule_add(const char *pipeline_name,
1327d30ea906Sjfb8856606 uint32_t table_id,
1328d30ea906Sjfb8856606 struct table_rule_match *match,
1329d30ea906Sjfb8856606 struct table_rule_action *action)
1330d30ea906Sjfb8856606 {
1331d30ea906Sjfb8856606 struct pipeline *p;
1332d30ea906Sjfb8856606 struct table *table;
1333d30ea906Sjfb8856606 struct pipeline_msg_req *req;
1334d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
1335d30ea906Sjfb8856606 struct table_rule *rule;
1336d30ea906Sjfb8856606 int status;
1337d30ea906Sjfb8856606
1338d30ea906Sjfb8856606 /* Check input params */
1339d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
1340d30ea906Sjfb8856606 (match == NULL) ||
1341d30ea906Sjfb8856606 (action == NULL))
1342d30ea906Sjfb8856606 return -1;
1343d30ea906Sjfb8856606
1344d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
1345d30ea906Sjfb8856606 if ((p == NULL) ||
1346d30ea906Sjfb8856606 (table_id >= p->n_tables) ||
1347d30ea906Sjfb8856606 match_check(match, p, table_id) ||
1348d30ea906Sjfb8856606 action_check(action, p, table_id))
1349d30ea906Sjfb8856606 return -1;
1350d30ea906Sjfb8856606
1351d30ea906Sjfb8856606 table = &p->table[table_id];
1352d30ea906Sjfb8856606
1353d30ea906Sjfb8856606 rule = calloc(1, sizeof(struct table_rule));
1354d30ea906Sjfb8856606 if (rule == NULL)
1355d30ea906Sjfb8856606 return -1;
1356d30ea906Sjfb8856606
1357d30ea906Sjfb8856606 memcpy(&rule->match, match, sizeof(*match));
1358d30ea906Sjfb8856606 memcpy(&rule->action, action, sizeof(*action));
1359d30ea906Sjfb8856606
1360d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
1361d30ea906Sjfb8856606 union table_rule_match_low_level match_ll;
1362d30ea906Sjfb8856606 struct rte_pipeline_table_entry *data_in, *data_out;
1363d30ea906Sjfb8856606 int key_found;
1364d30ea906Sjfb8856606 uint8_t *buffer;
1365d30ea906Sjfb8856606
1366d30ea906Sjfb8856606 buffer = calloc(TABLE_RULE_ACTION_SIZE_MAX, sizeof(uint8_t));
1367d30ea906Sjfb8856606 if (buffer == NULL) {
1368d30ea906Sjfb8856606 free(rule);
1369d30ea906Sjfb8856606 return -1;
1370d30ea906Sjfb8856606 }
1371d30ea906Sjfb8856606
1372d30ea906Sjfb8856606 /* Table match-action rule conversion */
1373d30ea906Sjfb8856606 data_in = (struct rte_pipeline_table_entry *)buffer;
1374d30ea906Sjfb8856606
1375d30ea906Sjfb8856606 status = match_convert(match, &match_ll, 1);
1376d30ea906Sjfb8856606 if (status) {
1377d30ea906Sjfb8856606 free(buffer);
1378d30ea906Sjfb8856606 free(rule);
1379d30ea906Sjfb8856606 return -1;
1380d30ea906Sjfb8856606 }
1381d30ea906Sjfb8856606
1382d30ea906Sjfb8856606 status = action_convert(table->a, action, data_in);
1383d30ea906Sjfb8856606 if (status) {
1384d30ea906Sjfb8856606 free(buffer);
1385d30ea906Sjfb8856606 free(rule);
1386d30ea906Sjfb8856606 return -1;
1387d30ea906Sjfb8856606 }
1388d30ea906Sjfb8856606
1389d30ea906Sjfb8856606 /* Add rule (match, action) to table */
1390d30ea906Sjfb8856606 status = rte_pipeline_table_entry_add(p->p,
1391d30ea906Sjfb8856606 table_id,
1392d30ea906Sjfb8856606 &match_ll,
1393d30ea906Sjfb8856606 data_in,
1394d30ea906Sjfb8856606 &key_found,
1395d30ea906Sjfb8856606 &data_out);
1396d30ea906Sjfb8856606 if (status) {
1397d30ea906Sjfb8856606 free(buffer);
1398d30ea906Sjfb8856606 free(rule);
1399d30ea906Sjfb8856606 return -1;
1400d30ea906Sjfb8856606 }
1401d30ea906Sjfb8856606
1402d30ea906Sjfb8856606 /* Write Response */
1403d30ea906Sjfb8856606 rule->data = data_out;
1404d30ea906Sjfb8856606 table_rule_add(table, rule);
1405d30ea906Sjfb8856606
1406d30ea906Sjfb8856606 free(buffer);
1407d30ea906Sjfb8856606 return 0;
1408d30ea906Sjfb8856606 }
1409d30ea906Sjfb8856606
1410d30ea906Sjfb8856606 /* Allocate request */
1411d30ea906Sjfb8856606 req = pipeline_msg_alloc();
1412d30ea906Sjfb8856606 if (req == NULL) {
1413d30ea906Sjfb8856606 free(rule);
1414d30ea906Sjfb8856606 return -1;
1415d30ea906Sjfb8856606 }
1416d30ea906Sjfb8856606
1417d30ea906Sjfb8856606 /* Write request */
1418d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_RULE_ADD;
1419d30ea906Sjfb8856606 req->id = table_id;
1420d30ea906Sjfb8856606 memcpy(&req->table_rule_add.match, match, sizeof(*match));
1421d30ea906Sjfb8856606 memcpy(&req->table_rule_add.action, action, sizeof(*action));
1422d30ea906Sjfb8856606
1423d30ea906Sjfb8856606 /* Send request and wait for response */
1424d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
1425d30ea906Sjfb8856606
1426d30ea906Sjfb8856606 /* Read response */
1427d30ea906Sjfb8856606 status = rsp->status;
1428d30ea906Sjfb8856606 if (status == 0) {
1429d30ea906Sjfb8856606 rule->data = rsp->table_rule_add.data;
1430d30ea906Sjfb8856606 table_rule_add(table, rule);
1431d30ea906Sjfb8856606 } else
1432d30ea906Sjfb8856606 free(rule);
1433d30ea906Sjfb8856606
1434d30ea906Sjfb8856606 /* Free response */
1435d30ea906Sjfb8856606 pipeline_msg_free(rsp);
1436d30ea906Sjfb8856606
1437d30ea906Sjfb8856606 return status;
1438d30ea906Sjfb8856606 }
1439d30ea906Sjfb8856606
1440d30ea906Sjfb8856606 int
pipeline_table_rule_add_default(const char * pipeline_name,uint32_t table_id,struct table_rule_action * action)1441d30ea906Sjfb8856606 pipeline_table_rule_add_default(const char *pipeline_name,
1442d30ea906Sjfb8856606 uint32_t table_id,
1443d30ea906Sjfb8856606 struct table_rule_action *action)
1444d30ea906Sjfb8856606 {
1445d30ea906Sjfb8856606 struct pipeline *p;
1446d30ea906Sjfb8856606 struct table *table;
1447d30ea906Sjfb8856606 struct pipeline_msg_req *req;
1448d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
1449d30ea906Sjfb8856606 struct table_rule *rule;
1450d30ea906Sjfb8856606 int status;
1451d30ea906Sjfb8856606
1452d30ea906Sjfb8856606 /* Check input params */
1453d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
1454d30ea906Sjfb8856606 (action == NULL))
1455d30ea906Sjfb8856606 return -1;
1456d30ea906Sjfb8856606
1457d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
1458d30ea906Sjfb8856606 if ((p == NULL) ||
1459d30ea906Sjfb8856606 (table_id >= p->n_tables) ||
1460d30ea906Sjfb8856606 action_default_check(action, p, table_id))
1461d30ea906Sjfb8856606 return -1;
1462d30ea906Sjfb8856606
1463d30ea906Sjfb8856606 table = &p->table[table_id];
1464d30ea906Sjfb8856606
1465d30ea906Sjfb8856606 rule = calloc(1, sizeof(struct table_rule));
1466d30ea906Sjfb8856606 if (rule == NULL)
1467d30ea906Sjfb8856606 return -1;
1468d30ea906Sjfb8856606
1469d30ea906Sjfb8856606 memcpy(&rule->action, action, sizeof(*action));
1470d30ea906Sjfb8856606
1471d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
1472d30ea906Sjfb8856606 struct rte_pipeline_table_entry *data_in, *data_out;
1473d30ea906Sjfb8856606 uint8_t *buffer;
1474d30ea906Sjfb8856606
1475d30ea906Sjfb8856606 buffer = calloc(TABLE_RULE_ACTION_SIZE_MAX, sizeof(uint8_t));
1476d30ea906Sjfb8856606 if (buffer == NULL) {
1477d30ea906Sjfb8856606 free(rule);
1478d30ea906Sjfb8856606 return -1;
1479d30ea906Sjfb8856606 }
1480d30ea906Sjfb8856606
1481d30ea906Sjfb8856606 /* Apply actions */
1482d30ea906Sjfb8856606 data_in = (struct rte_pipeline_table_entry *)buffer;
1483d30ea906Sjfb8856606
1484d30ea906Sjfb8856606 data_in->action = action->fwd.action;
1485d30ea906Sjfb8856606 if (action->fwd.action == RTE_PIPELINE_ACTION_PORT)
1486d30ea906Sjfb8856606 data_in->port_id = action->fwd.id;
1487d30ea906Sjfb8856606 if (action->fwd.action == RTE_PIPELINE_ACTION_TABLE)
1488d30ea906Sjfb8856606 data_in->table_id = action->fwd.id;
1489d30ea906Sjfb8856606
1490d30ea906Sjfb8856606 /* Add default rule to table */
1491d30ea906Sjfb8856606 status = rte_pipeline_table_default_entry_add(p->p,
1492d30ea906Sjfb8856606 table_id,
1493d30ea906Sjfb8856606 data_in,
1494d30ea906Sjfb8856606 &data_out);
1495d30ea906Sjfb8856606 if (status) {
1496d30ea906Sjfb8856606 free(buffer);
1497d30ea906Sjfb8856606 free(rule);
1498d30ea906Sjfb8856606 return -1;
1499d30ea906Sjfb8856606 }
1500d30ea906Sjfb8856606
1501d30ea906Sjfb8856606 /* Write Response */
1502d30ea906Sjfb8856606 rule->data = data_out;
1503d30ea906Sjfb8856606 table_rule_default_add(table, rule);
1504d30ea906Sjfb8856606
1505d30ea906Sjfb8856606 free(buffer);
1506d30ea906Sjfb8856606 return 0;
1507d30ea906Sjfb8856606 }
1508d30ea906Sjfb8856606
1509d30ea906Sjfb8856606 /* Allocate request */
1510d30ea906Sjfb8856606 req = pipeline_msg_alloc();
1511d30ea906Sjfb8856606 if (req == NULL) {
1512d30ea906Sjfb8856606 free(rule);
1513d30ea906Sjfb8856606 return -1;
1514d30ea906Sjfb8856606 }
1515d30ea906Sjfb8856606
1516d30ea906Sjfb8856606 /* Write request */
1517d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_RULE_ADD_DEFAULT;
1518d30ea906Sjfb8856606 req->id = table_id;
1519d30ea906Sjfb8856606 memcpy(&req->table_rule_add_default.action, action, sizeof(*action));
1520d30ea906Sjfb8856606
1521d30ea906Sjfb8856606 /* Send request and wait for response */
1522d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
1523d30ea906Sjfb8856606
1524d30ea906Sjfb8856606 /* Read response */
1525d30ea906Sjfb8856606 status = rsp->status;
1526d30ea906Sjfb8856606 if (status == 0) {
1527d30ea906Sjfb8856606 rule->data = rsp->table_rule_add_default.data;
1528d30ea906Sjfb8856606 table_rule_default_add(table, rule);
1529d30ea906Sjfb8856606 } else
1530d30ea906Sjfb8856606 free(rule);
1531d30ea906Sjfb8856606
1532d30ea906Sjfb8856606 /* Free response */
1533d30ea906Sjfb8856606 pipeline_msg_free(rsp);
1534d30ea906Sjfb8856606
1535d30ea906Sjfb8856606 return status;
1536d30ea906Sjfb8856606 }
1537d30ea906Sjfb8856606
1538d30ea906Sjfb8856606 static uint32_t
table_rule_list_free(struct table_rule_list * list)1539d30ea906Sjfb8856606 table_rule_list_free(struct table_rule_list *list)
1540d30ea906Sjfb8856606 {
1541d30ea906Sjfb8856606 uint32_t n = 0;
1542d30ea906Sjfb8856606
1543d30ea906Sjfb8856606 if (!list)
1544d30ea906Sjfb8856606 return 0;
1545d30ea906Sjfb8856606
1546d30ea906Sjfb8856606 for ( ; ; ) {
1547d30ea906Sjfb8856606 struct table_rule *rule;
1548d30ea906Sjfb8856606
1549d30ea906Sjfb8856606 rule = TAILQ_FIRST(list);
1550d30ea906Sjfb8856606 if (rule == NULL)
1551d30ea906Sjfb8856606 break;
1552d30ea906Sjfb8856606
1553d30ea906Sjfb8856606 TAILQ_REMOVE(list, rule, node);
1554d30ea906Sjfb8856606 free(rule);
1555d30ea906Sjfb8856606 n++;
1556d30ea906Sjfb8856606 }
1557d30ea906Sjfb8856606
1558d30ea906Sjfb8856606 free(list);
1559d30ea906Sjfb8856606 return n;
1560d30ea906Sjfb8856606 }
1561d30ea906Sjfb8856606
1562d30ea906Sjfb8856606 int
pipeline_table_rule_add_bulk(const char * pipeline_name,uint32_t table_id,struct table_rule_list * list,uint32_t * n_rules_added,uint32_t * n_rules_not_added)1563d30ea906Sjfb8856606 pipeline_table_rule_add_bulk(const char *pipeline_name,
1564d30ea906Sjfb8856606 uint32_t table_id,
1565d30ea906Sjfb8856606 struct table_rule_list *list,
1566d30ea906Sjfb8856606 uint32_t *n_rules_added,
1567d30ea906Sjfb8856606 uint32_t *n_rules_not_added)
1568d30ea906Sjfb8856606 {
1569d30ea906Sjfb8856606 struct pipeline *p;
1570d30ea906Sjfb8856606 struct table *table;
1571d30ea906Sjfb8856606 struct pipeline_msg_req *req;
1572d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
1573d30ea906Sjfb8856606 struct table_rule *rule;
1574d30ea906Sjfb8856606 int status = 0;
1575d30ea906Sjfb8856606
1576d30ea906Sjfb8856606 /* Check input params */
1577d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
1578d30ea906Sjfb8856606 (list == NULL) ||
1579d30ea906Sjfb8856606 TAILQ_EMPTY(list) ||
1580d30ea906Sjfb8856606 (n_rules_added == NULL) ||
1581d30ea906Sjfb8856606 (n_rules_not_added == NULL)) {
1582d30ea906Sjfb8856606 table_rule_list_free(list);
1583d30ea906Sjfb8856606 return -EINVAL;
1584d30ea906Sjfb8856606 }
1585d30ea906Sjfb8856606
1586d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
1587d30ea906Sjfb8856606 if ((p == NULL) ||
1588d30ea906Sjfb8856606 (table_id >= p->n_tables)) {
1589d30ea906Sjfb8856606 table_rule_list_free(list);
1590d30ea906Sjfb8856606 return -EINVAL;
1591d30ea906Sjfb8856606 }
1592d30ea906Sjfb8856606
1593d30ea906Sjfb8856606 table = &p->table[table_id];
1594d30ea906Sjfb8856606
1595d30ea906Sjfb8856606 TAILQ_FOREACH(rule, list, node)
1596d30ea906Sjfb8856606 if (match_check(&rule->match, p, table_id) ||
1597d30ea906Sjfb8856606 action_check(&rule->action, p, table_id)) {
1598d30ea906Sjfb8856606 table_rule_list_free(list);
1599d30ea906Sjfb8856606 return -EINVAL;
1600d30ea906Sjfb8856606 }
1601d30ea906Sjfb8856606
1602d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
1603d30ea906Sjfb8856606 struct table_ll table_ll = {
1604d30ea906Sjfb8856606 .p = p->p,
1605d30ea906Sjfb8856606 .table_id = table_id,
1606d30ea906Sjfb8856606 .a = table->a,
1607d30ea906Sjfb8856606 .bulk_supported = table->params.match_type == TABLE_ACL,
1608d30ea906Sjfb8856606 };
1609d30ea906Sjfb8856606
1610d30ea906Sjfb8856606 status = table_rule_add_bulk_ll(&table_ll, list, n_rules_added);
1611d30ea906Sjfb8856606 if (status) {
1612d30ea906Sjfb8856606 table_rule_list_free(list);
1613d30ea906Sjfb8856606 return status;
1614d30ea906Sjfb8856606 }
1615d30ea906Sjfb8856606
1616d30ea906Sjfb8856606 table_rule_add_bulk(table, list, *n_rules_added);
1617d30ea906Sjfb8856606 *n_rules_not_added = table_rule_list_free(list);
1618d30ea906Sjfb8856606 return 0;
1619d30ea906Sjfb8856606 }
1620d30ea906Sjfb8856606
1621d30ea906Sjfb8856606 /* Allocate request */
1622d30ea906Sjfb8856606 req = pipeline_msg_alloc();
1623d30ea906Sjfb8856606 if (req == NULL) {
1624d30ea906Sjfb8856606 table_rule_list_free(list);
1625d30ea906Sjfb8856606 return -ENOMEM;
1626d30ea906Sjfb8856606 }
1627d30ea906Sjfb8856606
1628d30ea906Sjfb8856606 /* Write request */
1629d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_RULE_ADD_BULK;
1630d30ea906Sjfb8856606 req->id = table_id;
1631d30ea906Sjfb8856606 req->table_rule_add_bulk.list = list;
1632d30ea906Sjfb8856606 req->table_rule_add_bulk.bulk = table->params.match_type == TABLE_ACL;
1633d30ea906Sjfb8856606
1634d30ea906Sjfb8856606 /* Send request and wait for response */
1635d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
1636d30ea906Sjfb8856606
1637d30ea906Sjfb8856606 /* Read response */
1638d30ea906Sjfb8856606 status = rsp->status;
1639d30ea906Sjfb8856606 if (status == 0) {
1640d30ea906Sjfb8856606 *n_rules_added = rsp->table_rule_add_bulk.n_rules;
1641d30ea906Sjfb8856606
1642d30ea906Sjfb8856606 table_rule_add_bulk(table, list, *n_rules_added);
1643d30ea906Sjfb8856606 *n_rules_not_added = table_rule_list_free(list);
1644d30ea906Sjfb8856606 } else
1645d30ea906Sjfb8856606 table_rule_list_free(list);
1646d30ea906Sjfb8856606
1647d30ea906Sjfb8856606
1648d30ea906Sjfb8856606 /* Free response */
1649d30ea906Sjfb8856606 pipeline_msg_free(rsp);
1650d30ea906Sjfb8856606
1651d30ea906Sjfb8856606 return status;
1652d30ea906Sjfb8856606 }
1653d30ea906Sjfb8856606
1654d30ea906Sjfb8856606 int
pipeline_table_rule_delete(const char * pipeline_name,uint32_t table_id,struct table_rule_match * match)1655d30ea906Sjfb8856606 pipeline_table_rule_delete(const char *pipeline_name,
1656d30ea906Sjfb8856606 uint32_t table_id,
1657d30ea906Sjfb8856606 struct table_rule_match *match)
1658d30ea906Sjfb8856606 {
1659d30ea906Sjfb8856606 struct pipeline *p;
1660d30ea906Sjfb8856606 struct table *table;
1661d30ea906Sjfb8856606 struct pipeline_msg_req *req;
1662d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
1663d30ea906Sjfb8856606 int status;
1664d30ea906Sjfb8856606
1665d30ea906Sjfb8856606 /* Check input params */
1666d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
1667d30ea906Sjfb8856606 (match == NULL))
1668d30ea906Sjfb8856606 return -1;
1669d30ea906Sjfb8856606
1670d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
1671d30ea906Sjfb8856606 if ((p == NULL) ||
1672d30ea906Sjfb8856606 (table_id >= p->n_tables) ||
1673d30ea906Sjfb8856606 match_check(match, p, table_id))
1674d30ea906Sjfb8856606 return -1;
1675d30ea906Sjfb8856606
1676d30ea906Sjfb8856606 table = &p->table[table_id];
1677d30ea906Sjfb8856606
1678d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
1679d30ea906Sjfb8856606 union table_rule_match_low_level match_ll;
1680d30ea906Sjfb8856606 int key_found;
1681d30ea906Sjfb8856606
1682d30ea906Sjfb8856606 status = match_convert(match, &match_ll, 0);
1683d30ea906Sjfb8856606 if (status)
1684d30ea906Sjfb8856606 return -1;
1685d30ea906Sjfb8856606
1686d30ea906Sjfb8856606 status = rte_pipeline_table_entry_delete(p->p,
1687d30ea906Sjfb8856606 table_id,
1688d30ea906Sjfb8856606 &match_ll,
1689d30ea906Sjfb8856606 &key_found,
1690d30ea906Sjfb8856606 NULL);
1691d30ea906Sjfb8856606
1692d30ea906Sjfb8856606 if (status == 0)
1693d30ea906Sjfb8856606 table_rule_delete(table, match);
1694d30ea906Sjfb8856606
1695d30ea906Sjfb8856606 return status;
1696d30ea906Sjfb8856606 }
1697d30ea906Sjfb8856606
1698d30ea906Sjfb8856606 /* Allocate request */
1699d30ea906Sjfb8856606 req = pipeline_msg_alloc();
1700d30ea906Sjfb8856606 if (req == NULL)
1701d30ea906Sjfb8856606 return -1;
1702d30ea906Sjfb8856606
1703d30ea906Sjfb8856606 /* Write request */
1704d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_RULE_DELETE;
1705d30ea906Sjfb8856606 req->id = table_id;
1706d30ea906Sjfb8856606 memcpy(&req->table_rule_delete.match, match, sizeof(*match));
1707d30ea906Sjfb8856606
1708d30ea906Sjfb8856606 /* Send request and wait for response */
1709d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
1710d30ea906Sjfb8856606
1711d30ea906Sjfb8856606 /* Read response */
1712d30ea906Sjfb8856606 status = rsp->status;
1713d30ea906Sjfb8856606 if (status == 0)
1714d30ea906Sjfb8856606 table_rule_delete(table, match);
1715d30ea906Sjfb8856606
1716d30ea906Sjfb8856606 /* Free response */
1717d30ea906Sjfb8856606 pipeline_msg_free(rsp);
1718d30ea906Sjfb8856606
1719d30ea906Sjfb8856606 return status;
1720d30ea906Sjfb8856606 }
1721d30ea906Sjfb8856606
1722d30ea906Sjfb8856606 int
pipeline_table_rule_delete_default(const char * pipeline_name,uint32_t table_id)1723d30ea906Sjfb8856606 pipeline_table_rule_delete_default(const char *pipeline_name,
1724d30ea906Sjfb8856606 uint32_t table_id)
1725d30ea906Sjfb8856606 {
1726d30ea906Sjfb8856606 struct pipeline *p;
1727d30ea906Sjfb8856606 struct table *table;
1728d30ea906Sjfb8856606 struct pipeline_msg_req *req;
1729d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
1730d30ea906Sjfb8856606 int status;
1731d30ea906Sjfb8856606
1732d30ea906Sjfb8856606 /* Check input params */
1733d30ea906Sjfb8856606 if (pipeline_name == NULL)
1734d30ea906Sjfb8856606 return -1;
1735d30ea906Sjfb8856606
1736d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
1737d30ea906Sjfb8856606 if ((p == NULL) ||
1738d30ea906Sjfb8856606 (table_id >= p->n_tables))
1739d30ea906Sjfb8856606 return -1;
1740d30ea906Sjfb8856606
1741d30ea906Sjfb8856606 table = &p->table[table_id];
1742d30ea906Sjfb8856606
1743d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
1744d30ea906Sjfb8856606 status = rte_pipeline_table_default_entry_delete(p->p,
1745d30ea906Sjfb8856606 table_id,
1746d30ea906Sjfb8856606 NULL);
1747d30ea906Sjfb8856606
1748d30ea906Sjfb8856606 if (status == 0)
1749d30ea906Sjfb8856606 table_rule_default_delete(table);
1750d30ea906Sjfb8856606
1751d30ea906Sjfb8856606 return status;
1752d30ea906Sjfb8856606 }
1753d30ea906Sjfb8856606
1754d30ea906Sjfb8856606 /* Allocate request */
1755d30ea906Sjfb8856606 req = pipeline_msg_alloc();
1756d30ea906Sjfb8856606 if (req == NULL)
1757d30ea906Sjfb8856606 return -1;
1758d30ea906Sjfb8856606
1759d30ea906Sjfb8856606 /* Write request */
1760d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_RULE_DELETE_DEFAULT;
1761d30ea906Sjfb8856606 req->id = table_id;
1762d30ea906Sjfb8856606
1763d30ea906Sjfb8856606 /* Send request and wait for response */
1764d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
1765d30ea906Sjfb8856606
1766d30ea906Sjfb8856606 /* Read response */
1767d30ea906Sjfb8856606 status = rsp->status;
1768d30ea906Sjfb8856606 if (status == 0)
1769d30ea906Sjfb8856606 table_rule_default_delete(table);
1770d30ea906Sjfb8856606
1771d30ea906Sjfb8856606 /* Free response */
1772d30ea906Sjfb8856606 pipeline_msg_free(rsp);
1773d30ea906Sjfb8856606
1774d30ea906Sjfb8856606 return status;
1775d30ea906Sjfb8856606 }
1776d30ea906Sjfb8856606
1777d30ea906Sjfb8856606 int
pipeline_table_rule_stats_read(const char * pipeline_name,uint32_t table_id,struct table_rule_match * match,struct rte_table_action_stats_counters * stats,int clear)1778d30ea906Sjfb8856606 pipeline_table_rule_stats_read(const char *pipeline_name,
1779d30ea906Sjfb8856606 uint32_t table_id,
1780d30ea906Sjfb8856606 struct table_rule_match *match,
1781d30ea906Sjfb8856606 struct rte_table_action_stats_counters *stats,
1782d30ea906Sjfb8856606 int clear)
1783d30ea906Sjfb8856606 {
1784d30ea906Sjfb8856606 struct pipeline *p;
1785d30ea906Sjfb8856606 struct table *table;
1786d30ea906Sjfb8856606 struct pipeline_msg_req *req;
1787d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
1788d30ea906Sjfb8856606 struct table_rule *rule;
1789d30ea906Sjfb8856606 int status;
1790d30ea906Sjfb8856606
1791d30ea906Sjfb8856606 /* Check input params */
1792d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
1793d30ea906Sjfb8856606 (match == NULL) ||
1794d30ea906Sjfb8856606 (stats == NULL))
1795d30ea906Sjfb8856606 return -1;
1796d30ea906Sjfb8856606
1797d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
1798d30ea906Sjfb8856606 if ((p == NULL) ||
1799d30ea906Sjfb8856606 (table_id >= p->n_tables) ||
1800d30ea906Sjfb8856606 match_check(match, p, table_id))
1801d30ea906Sjfb8856606 return -1;
1802d30ea906Sjfb8856606
1803d30ea906Sjfb8856606 table = &p->table[table_id];
1804d30ea906Sjfb8856606 rule = table_rule_find(table, match);
1805d30ea906Sjfb8856606 if (rule == NULL)
1806d30ea906Sjfb8856606 return -1;
1807d30ea906Sjfb8856606
1808d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
1809d30ea906Sjfb8856606 status = rte_table_action_stats_read(table->a,
1810d30ea906Sjfb8856606 rule->data,
1811d30ea906Sjfb8856606 stats,
1812d30ea906Sjfb8856606 clear);
1813d30ea906Sjfb8856606
1814d30ea906Sjfb8856606 return status;
1815d30ea906Sjfb8856606 }
1816d30ea906Sjfb8856606
1817d30ea906Sjfb8856606 /* Allocate request */
1818d30ea906Sjfb8856606 req = pipeline_msg_alloc();
1819d30ea906Sjfb8856606 if (req == NULL)
1820d30ea906Sjfb8856606 return -1;
1821d30ea906Sjfb8856606
1822d30ea906Sjfb8856606 /* Write request */
1823d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_RULE_STATS_READ;
1824d30ea906Sjfb8856606 req->id = table_id;
1825d30ea906Sjfb8856606 req->table_rule_stats_read.data = rule->data;
1826d30ea906Sjfb8856606 req->table_rule_stats_read.clear = clear;
1827d30ea906Sjfb8856606
1828d30ea906Sjfb8856606 /* Send request and wait for response */
1829d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
1830d30ea906Sjfb8856606
1831d30ea906Sjfb8856606 /* Read response */
1832d30ea906Sjfb8856606 status = rsp->status;
1833d30ea906Sjfb8856606 if (status == 0)
1834d30ea906Sjfb8856606 memcpy(stats, &rsp->table_rule_stats_read.stats, sizeof(*stats));
1835d30ea906Sjfb8856606
1836d30ea906Sjfb8856606 /* Free response */
1837d30ea906Sjfb8856606 pipeline_msg_free(rsp);
1838d30ea906Sjfb8856606
1839d30ea906Sjfb8856606 return status;
1840d30ea906Sjfb8856606 }
1841d30ea906Sjfb8856606
1842d30ea906Sjfb8856606 int
pipeline_table_mtr_profile_add(const char * pipeline_name,uint32_t table_id,uint32_t meter_profile_id,struct rte_table_action_meter_profile * profile)1843d30ea906Sjfb8856606 pipeline_table_mtr_profile_add(const char *pipeline_name,
1844d30ea906Sjfb8856606 uint32_t table_id,
1845d30ea906Sjfb8856606 uint32_t meter_profile_id,
1846d30ea906Sjfb8856606 struct rte_table_action_meter_profile *profile)
1847d30ea906Sjfb8856606 {
1848d30ea906Sjfb8856606 struct pipeline *p;
1849d30ea906Sjfb8856606 struct pipeline_msg_req *req;
1850d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
1851d30ea906Sjfb8856606 int status;
1852d30ea906Sjfb8856606
1853d30ea906Sjfb8856606 /* Check input params */
1854d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
1855d30ea906Sjfb8856606 (profile == NULL))
1856d30ea906Sjfb8856606 return -1;
1857d30ea906Sjfb8856606
1858d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
1859d30ea906Sjfb8856606 if ((p == NULL) ||
1860d30ea906Sjfb8856606 (table_id >= p->n_tables))
1861d30ea906Sjfb8856606 return -1;
1862d30ea906Sjfb8856606
1863d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
1864d30ea906Sjfb8856606 struct rte_table_action *a = p->table[table_id].a;
1865d30ea906Sjfb8856606
1866d30ea906Sjfb8856606 status = rte_table_action_meter_profile_add(a,
1867d30ea906Sjfb8856606 meter_profile_id,
1868d30ea906Sjfb8856606 profile);
1869d30ea906Sjfb8856606
1870d30ea906Sjfb8856606 return status;
1871d30ea906Sjfb8856606 }
1872d30ea906Sjfb8856606
1873d30ea906Sjfb8856606 /* Allocate request */
1874d30ea906Sjfb8856606 req = pipeline_msg_alloc();
1875d30ea906Sjfb8856606 if (req == NULL)
1876d30ea906Sjfb8856606 return -1;
1877d30ea906Sjfb8856606
1878d30ea906Sjfb8856606 /* Write request */
1879d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_MTR_PROFILE_ADD;
1880d30ea906Sjfb8856606 req->id = table_id;
1881d30ea906Sjfb8856606 req->table_mtr_profile_add.meter_profile_id = meter_profile_id;
1882d30ea906Sjfb8856606 memcpy(&req->table_mtr_profile_add.profile, profile, sizeof(*profile));
1883d30ea906Sjfb8856606
1884d30ea906Sjfb8856606 /* Send request and wait for response */
1885d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
1886d30ea906Sjfb8856606
1887d30ea906Sjfb8856606 /* Read response */
1888d30ea906Sjfb8856606 status = rsp->status;
1889d30ea906Sjfb8856606
1890d30ea906Sjfb8856606 /* Free response */
1891d30ea906Sjfb8856606 pipeline_msg_free(rsp);
1892d30ea906Sjfb8856606
1893d30ea906Sjfb8856606 return status;
1894d30ea906Sjfb8856606 }
1895d30ea906Sjfb8856606
1896d30ea906Sjfb8856606 int
pipeline_table_mtr_profile_delete(const char * pipeline_name,uint32_t table_id,uint32_t meter_profile_id)1897d30ea906Sjfb8856606 pipeline_table_mtr_profile_delete(const char *pipeline_name,
1898d30ea906Sjfb8856606 uint32_t table_id,
1899d30ea906Sjfb8856606 uint32_t meter_profile_id)
1900d30ea906Sjfb8856606 {
1901d30ea906Sjfb8856606 struct pipeline *p;
1902d30ea906Sjfb8856606 struct pipeline_msg_req *req;
1903d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
1904d30ea906Sjfb8856606 int status;
1905d30ea906Sjfb8856606
1906d30ea906Sjfb8856606 /* Check input params */
1907d30ea906Sjfb8856606 if (pipeline_name == NULL)
1908d30ea906Sjfb8856606 return -1;
1909d30ea906Sjfb8856606
1910d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
1911d30ea906Sjfb8856606 if ((p == NULL) ||
1912d30ea906Sjfb8856606 (table_id >= p->n_tables))
1913d30ea906Sjfb8856606 return -1;
1914d30ea906Sjfb8856606
1915d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
1916d30ea906Sjfb8856606 struct rte_table_action *a = p->table[table_id].a;
1917d30ea906Sjfb8856606
1918d30ea906Sjfb8856606 status = rte_table_action_meter_profile_delete(a,
1919d30ea906Sjfb8856606 meter_profile_id);
1920d30ea906Sjfb8856606
1921d30ea906Sjfb8856606 return status;
1922d30ea906Sjfb8856606 }
1923d30ea906Sjfb8856606
1924d30ea906Sjfb8856606 /* Allocate request */
1925d30ea906Sjfb8856606 req = pipeline_msg_alloc();
1926d30ea906Sjfb8856606 if (req == NULL)
1927d30ea906Sjfb8856606 return -1;
1928d30ea906Sjfb8856606
1929d30ea906Sjfb8856606 /* Write request */
1930d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_MTR_PROFILE_DELETE;
1931d30ea906Sjfb8856606 req->id = table_id;
1932d30ea906Sjfb8856606 req->table_mtr_profile_delete.meter_profile_id = meter_profile_id;
1933d30ea906Sjfb8856606
1934d30ea906Sjfb8856606 /* Send request and wait for response */
1935d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
1936d30ea906Sjfb8856606
1937d30ea906Sjfb8856606 /* Read response */
1938d30ea906Sjfb8856606 status = rsp->status;
1939d30ea906Sjfb8856606
1940d30ea906Sjfb8856606 /* Free response */
1941d30ea906Sjfb8856606 pipeline_msg_free(rsp);
1942d30ea906Sjfb8856606
1943d30ea906Sjfb8856606 return status;
1944d30ea906Sjfb8856606 }
1945d30ea906Sjfb8856606
1946d30ea906Sjfb8856606 int
pipeline_table_rule_mtr_read(const char * pipeline_name,uint32_t table_id,struct table_rule_match * match,struct rte_table_action_mtr_counters * stats,int clear)1947d30ea906Sjfb8856606 pipeline_table_rule_mtr_read(const char *pipeline_name,
1948d30ea906Sjfb8856606 uint32_t table_id,
1949d30ea906Sjfb8856606 struct table_rule_match *match,
1950d30ea906Sjfb8856606 struct rte_table_action_mtr_counters *stats,
1951d30ea906Sjfb8856606 int clear)
1952d30ea906Sjfb8856606 {
1953d30ea906Sjfb8856606 struct pipeline *p;
1954d30ea906Sjfb8856606 struct table *table;
1955d30ea906Sjfb8856606 struct pipeline_msg_req *req;
1956d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
1957d30ea906Sjfb8856606 struct table_rule *rule;
1958d30ea906Sjfb8856606 uint32_t tc_mask;
1959d30ea906Sjfb8856606 int status;
1960d30ea906Sjfb8856606
1961d30ea906Sjfb8856606 /* Check input params */
1962d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
1963d30ea906Sjfb8856606 (match == NULL) ||
1964d30ea906Sjfb8856606 (stats == NULL))
1965d30ea906Sjfb8856606 return -1;
1966d30ea906Sjfb8856606
1967d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
1968d30ea906Sjfb8856606 if ((p == NULL) ||
1969d30ea906Sjfb8856606 (table_id >= p->n_tables) ||
1970d30ea906Sjfb8856606 match_check(match, p, table_id))
1971d30ea906Sjfb8856606 return -1;
1972d30ea906Sjfb8856606
1973d30ea906Sjfb8856606 table = &p->table[table_id];
1974d30ea906Sjfb8856606 tc_mask = (1 << table->ap->params.mtr.n_tc) - 1;
1975d30ea906Sjfb8856606
1976d30ea906Sjfb8856606 rule = table_rule_find(table, match);
1977d30ea906Sjfb8856606 if (rule == NULL)
1978d30ea906Sjfb8856606 return -1;
1979d30ea906Sjfb8856606
1980d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
1981d30ea906Sjfb8856606 status = rte_table_action_meter_read(table->a,
1982d30ea906Sjfb8856606 rule->data,
1983d30ea906Sjfb8856606 tc_mask,
1984d30ea906Sjfb8856606 stats,
1985d30ea906Sjfb8856606 clear);
1986d30ea906Sjfb8856606
1987d30ea906Sjfb8856606 return status;
1988d30ea906Sjfb8856606 }
1989d30ea906Sjfb8856606
1990d30ea906Sjfb8856606 /* Allocate request */
1991d30ea906Sjfb8856606 req = pipeline_msg_alloc();
1992d30ea906Sjfb8856606 if (req == NULL)
1993d30ea906Sjfb8856606 return -1;
1994d30ea906Sjfb8856606
1995d30ea906Sjfb8856606 /* Write request */
1996d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_RULE_MTR_READ;
1997d30ea906Sjfb8856606 req->id = table_id;
1998d30ea906Sjfb8856606 req->table_rule_mtr_read.data = rule->data;
1999d30ea906Sjfb8856606 req->table_rule_mtr_read.tc_mask = tc_mask;
2000d30ea906Sjfb8856606 req->table_rule_mtr_read.clear = clear;
2001d30ea906Sjfb8856606
2002d30ea906Sjfb8856606 /* Send request and wait for response */
2003d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
2004d30ea906Sjfb8856606
2005d30ea906Sjfb8856606 /* Read response */
2006d30ea906Sjfb8856606 status = rsp->status;
2007d30ea906Sjfb8856606 if (status == 0)
2008d30ea906Sjfb8856606 memcpy(stats, &rsp->table_rule_mtr_read.stats, sizeof(*stats));
2009d30ea906Sjfb8856606
2010d30ea906Sjfb8856606 /* Free response */
2011d30ea906Sjfb8856606 pipeline_msg_free(rsp);
2012d30ea906Sjfb8856606
2013d30ea906Sjfb8856606 return status;
2014d30ea906Sjfb8856606 }
2015d30ea906Sjfb8856606
2016d30ea906Sjfb8856606 int
pipeline_table_dscp_table_update(const char * pipeline_name,uint32_t table_id,uint64_t dscp_mask,struct rte_table_action_dscp_table * dscp_table)2017d30ea906Sjfb8856606 pipeline_table_dscp_table_update(const char *pipeline_name,
2018d30ea906Sjfb8856606 uint32_t table_id,
2019d30ea906Sjfb8856606 uint64_t dscp_mask,
2020d30ea906Sjfb8856606 struct rte_table_action_dscp_table *dscp_table)
2021d30ea906Sjfb8856606 {
2022d30ea906Sjfb8856606 struct pipeline *p;
2023d30ea906Sjfb8856606 struct pipeline_msg_req *req;
2024d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
2025d30ea906Sjfb8856606 int status;
2026d30ea906Sjfb8856606
2027d30ea906Sjfb8856606 /* Check input params */
2028d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
2029d30ea906Sjfb8856606 (dscp_table == NULL))
2030d30ea906Sjfb8856606 return -1;
2031d30ea906Sjfb8856606
2032d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
2033d30ea906Sjfb8856606 if ((p == NULL) ||
2034d30ea906Sjfb8856606 (table_id >= p->n_tables))
2035d30ea906Sjfb8856606 return -1;
2036d30ea906Sjfb8856606
2037d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
2038d30ea906Sjfb8856606 struct rte_table_action *a = p->table[table_id].a;
2039d30ea906Sjfb8856606
2040d30ea906Sjfb8856606 status = rte_table_action_dscp_table_update(a,
2041d30ea906Sjfb8856606 dscp_mask,
2042d30ea906Sjfb8856606 dscp_table);
2043d30ea906Sjfb8856606
2044d30ea906Sjfb8856606 return status;
2045d30ea906Sjfb8856606 }
2046d30ea906Sjfb8856606
2047d30ea906Sjfb8856606 /* Allocate request */
2048d30ea906Sjfb8856606 req = pipeline_msg_alloc();
2049d30ea906Sjfb8856606 if (req == NULL)
2050d30ea906Sjfb8856606 return -1;
2051d30ea906Sjfb8856606
2052d30ea906Sjfb8856606 /* Write request */
2053d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_DSCP_TABLE_UPDATE;
2054d30ea906Sjfb8856606 req->id = table_id;
2055d30ea906Sjfb8856606 req->table_dscp_table_update.dscp_mask = dscp_mask;
2056d30ea906Sjfb8856606 memcpy(&req->table_dscp_table_update.dscp_table,
2057d30ea906Sjfb8856606 dscp_table, sizeof(*dscp_table));
2058d30ea906Sjfb8856606
2059d30ea906Sjfb8856606 /* Send request and wait for response */
2060d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
2061d30ea906Sjfb8856606
2062d30ea906Sjfb8856606 /* Read response */
2063d30ea906Sjfb8856606 status = rsp->status;
2064d30ea906Sjfb8856606
2065d30ea906Sjfb8856606 /* Free response */
2066d30ea906Sjfb8856606 pipeline_msg_free(rsp);
2067d30ea906Sjfb8856606
2068d30ea906Sjfb8856606 return status;
2069d30ea906Sjfb8856606 }
2070d30ea906Sjfb8856606
2071d30ea906Sjfb8856606 int
pipeline_table_rule_ttl_read(const char * pipeline_name,uint32_t table_id,struct table_rule_match * match,struct rte_table_action_ttl_counters * stats,int clear)2072d30ea906Sjfb8856606 pipeline_table_rule_ttl_read(const char *pipeline_name,
2073d30ea906Sjfb8856606 uint32_t table_id,
2074d30ea906Sjfb8856606 struct table_rule_match *match,
2075d30ea906Sjfb8856606 struct rte_table_action_ttl_counters *stats,
2076d30ea906Sjfb8856606 int clear)
2077d30ea906Sjfb8856606 {
2078d30ea906Sjfb8856606 struct pipeline *p;
2079d30ea906Sjfb8856606 struct table *table;
2080d30ea906Sjfb8856606 struct pipeline_msg_req *req;
2081d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
2082d30ea906Sjfb8856606 struct table_rule *rule;
2083d30ea906Sjfb8856606 int status;
2084d30ea906Sjfb8856606
2085d30ea906Sjfb8856606 /* Check input params */
2086d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
2087d30ea906Sjfb8856606 (match == NULL) ||
2088d30ea906Sjfb8856606 (stats == NULL))
2089d30ea906Sjfb8856606 return -1;
2090d30ea906Sjfb8856606
2091d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
2092d30ea906Sjfb8856606 if ((p == NULL) ||
2093d30ea906Sjfb8856606 (table_id >= p->n_tables) ||
2094d30ea906Sjfb8856606 match_check(match, p, table_id))
2095d30ea906Sjfb8856606 return -1;
2096d30ea906Sjfb8856606
2097d30ea906Sjfb8856606 table = &p->table[table_id];
2098d30ea906Sjfb8856606 if (!table->ap->params.ttl.n_packets_enabled)
2099d30ea906Sjfb8856606 return -1;
2100d30ea906Sjfb8856606
2101d30ea906Sjfb8856606 rule = table_rule_find(table, match);
2102d30ea906Sjfb8856606 if (rule == NULL)
2103d30ea906Sjfb8856606 return -1;
2104d30ea906Sjfb8856606
2105d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
2106d30ea906Sjfb8856606 status = rte_table_action_ttl_read(table->a,
2107d30ea906Sjfb8856606 rule->data,
2108d30ea906Sjfb8856606 stats,
2109d30ea906Sjfb8856606 clear);
2110d30ea906Sjfb8856606
2111d30ea906Sjfb8856606 return status;
2112d30ea906Sjfb8856606 }
2113d30ea906Sjfb8856606
2114d30ea906Sjfb8856606 /* Allocate request */
2115d30ea906Sjfb8856606 req = pipeline_msg_alloc();
2116d30ea906Sjfb8856606 if (req == NULL)
2117d30ea906Sjfb8856606 return -1;
2118d30ea906Sjfb8856606
2119d30ea906Sjfb8856606 /* Write request */
2120d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_RULE_TTL_READ;
2121d30ea906Sjfb8856606 req->id = table_id;
2122d30ea906Sjfb8856606 req->table_rule_ttl_read.data = rule->data;
2123d30ea906Sjfb8856606 req->table_rule_ttl_read.clear = clear;
2124d30ea906Sjfb8856606
2125d30ea906Sjfb8856606 /* Send request and wait for response */
2126d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
2127d30ea906Sjfb8856606
2128d30ea906Sjfb8856606 /* Read response */
2129d30ea906Sjfb8856606 status = rsp->status;
2130d30ea906Sjfb8856606 if (status == 0)
2131d30ea906Sjfb8856606 memcpy(stats, &rsp->table_rule_ttl_read.stats, sizeof(*stats));
2132d30ea906Sjfb8856606
2133d30ea906Sjfb8856606 /* Free response */
2134d30ea906Sjfb8856606 pipeline_msg_free(rsp);
2135d30ea906Sjfb8856606
2136d30ea906Sjfb8856606 return status;
2137d30ea906Sjfb8856606 }
2138d30ea906Sjfb8856606
2139d30ea906Sjfb8856606 int
pipeline_table_rule_time_read(const char * pipeline_name,uint32_t table_id,struct table_rule_match * match,uint64_t * timestamp)2140d30ea906Sjfb8856606 pipeline_table_rule_time_read(const char *pipeline_name,
2141d30ea906Sjfb8856606 uint32_t table_id,
2142d30ea906Sjfb8856606 struct table_rule_match *match,
2143d30ea906Sjfb8856606 uint64_t *timestamp)
2144d30ea906Sjfb8856606 {
2145d30ea906Sjfb8856606 struct pipeline *p;
2146d30ea906Sjfb8856606 struct table *table;
2147d30ea906Sjfb8856606 struct pipeline_msg_req *req;
2148d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
2149d30ea906Sjfb8856606 struct table_rule *rule;
2150d30ea906Sjfb8856606 int status;
2151d30ea906Sjfb8856606
2152d30ea906Sjfb8856606 /* Check input params */
2153d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
2154d30ea906Sjfb8856606 (match == NULL) ||
2155d30ea906Sjfb8856606 (timestamp == NULL))
2156d30ea906Sjfb8856606 return -1;
2157d30ea906Sjfb8856606
2158d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
2159d30ea906Sjfb8856606 if ((p == NULL) ||
2160d30ea906Sjfb8856606 (table_id >= p->n_tables) ||
2161d30ea906Sjfb8856606 match_check(match, p, table_id))
2162d30ea906Sjfb8856606 return -1;
2163d30ea906Sjfb8856606
2164d30ea906Sjfb8856606 table = &p->table[table_id];
2165d30ea906Sjfb8856606
2166d30ea906Sjfb8856606 rule = table_rule_find(table, match);
2167d30ea906Sjfb8856606 if (rule == NULL)
2168d30ea906Sjfb8856606 return -1;
2169d30ea906Sjfb8856606
2170d30ea906Sjfb8856606 if (!pipeline_is_running(p)) {
2171d30ea906Sjfb8856606 status = rte_table_action_time_read(table->a,
2172d30ea906Sjfb8856606 rule->data,
2173d30ea906Sjfb8856606 timestamp);
2174d30ea906Sjfb8856606
2175d30ea906Sjfb8856606 return status;
2176d30ea906Sjfb8856606 }
2177d30ea906Sjfb8856606
2178d30ea906Sjfb8856606 /* Allocate request */
2179d30ea906Sjfb8856606 req = pipeline_msg_alloc();
2180d30ea906Sjfb8856606 if (req == NULL)
2181d30ea906Sjfb8856606 return -1;
2182d30ea906Sjfb8856606
2183d30ea906Sjfb8856606 /* Write request */
2184d30ea906Sjfb8856606 req->type = PIPELINE_REQ_TABLE_RULE_TIME_READ;
2185d30ea906Sjfb8856606 req->id = table_id;
2186d30ea906Sjfb8856606 req->table_rule_time_read.data = rule->data;
2187d30ea906Sjfb8856606
2188d30ea906Sjfb8856606 /* Send request and wait for response */
2189d30ea906Sjfb8856606 rsp = pipeline_msg_send_recv(p, req);
2190d30ea906Sjfb8856606
2191d30ea906Sjfb8856606 /* Read response */
2192d30ea906Sjfb8856606 status = rsp->status;
2193d30ea906Sjfb8856606 if (status == 0)
2194d30ea906Sjfb8856606 *timestamp = rsp->table_rule_time_read.timestamp;
2195d30ea906Sjfb8856606
2196d30ea906Sjfb8856606 /* Free response */
2197d30ea906Sjfb8856606 pipeline_msg_free(rsp);
2198d30ea906Sjfb8856606
2199d30ea906Sjfb8856606 return status;
2200d30ea906Sjfb8856606 }
2201d30ea906Sjfb8856606
2202d30ea906Sjfb8856606 /**
2203d30ea906Sjfb8856606 * Data plane threads: message handling
2204d30ea906Sjfb8856606 */
2205d30ea906Sjfb8856606 static inline struct pipeline_msg_req *
pipeline_msg_recv(struct rte_ring * msgq_req)2206d30ea906Sjfb8856606 pipeline_msg_recv(struct rte_ring *msgq_req)
2207d30ea906Sjfb8856606 {
2208d30ea906Sjfb8856606 struct pipeline_msg_req *req;
2209d30ea906Sjfb8856606
2210d30ea906Sjfb8856606 int status = rte_ring_sc_dequeue(msgq_req, (void **) &req);
2211d30ea906Sjfb8856606
2212d30ea906Sjfb8856606 if (status != 0)
2213d30ea906Sjfb8856606 return NULL;
2214d30ea906Sjfb8856606
2215d30ea906Sjfb8856606 return req;
2216d30ea906Sjfb8856606 }
2217d30ea906Sjfb8856606
2218d30ea906Sjfb8856606 static inline void
pipeline_msg_send(struct rte_ring * msgq_rsp,struct pipeline_msg_rsp * rsp)2219d30ea906Sjfb8856606 pipeline_msg_send(struct rte_ring *msgq_rsp,
2220d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp)
2221d30ea906Sjfb8856606 {
2222d30ea906Sjfb8856606 int status;
2223d30ea906Sjfb8856606
2224d30ea906Sjfb8856606 do {
2225d30ea906Sjfb8856606 status = rte_ring_sp_enqueue(msgq_rsp, rsp);
2226d30ea906Sjfb8856606 } while (status == -ENOBUFS);
2227d30ea906Sjfb8856606 }
2228d30ea906Sjfb8856606
2229d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_port_in_stats_read(struct pipeline_data * p,struct pipeline_msg_req * req)2230d30ea906Sjfb8856606 pipeline_msg_handle_port_in_stats_read(struct pipeline_data *p,
2231d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2232d30ea906Sjfb8856606 {
2233d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2234d30ea906Sjfb8856606 uint32_t port_id = req->id;
2235d30ea906Sjfb8856606 int clear = req->port_in_stats_read.clear;
2236d30ea906Sjfb8856606
2237d30ea906Sjfb8856606 rsp->status = rte_pipeline_port_in_stats_read(p->p,
2238d30ea906Sjfb8856606 port_id,
2239d30ea906Sjfb8856606 &rsp->port_in_stats_read.stats,
2240d30ea906Sjfb8856606 clear);
2241d30ea906Sjfb8856606
2242d30ea906Sjfb8856606 return rsp;
2243d30ea906Sjfb8856606 }
2244d30ea906Sjfb8856606
2245d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_port_in_enable(struct pipeline_data * p,struct pipeline_msg_req * req)2246d30ea906Sjfb8856606 pipeline_msg_handle_port_in_enable(struct pipeline_data *p,
2247d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2248d30ea906Sjfb8856606 {
2249d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2250d30ea906Sjfb8856606 uint32_t port_id = req->id;
2251d30ea906Sjfb8856606
2252d30ea906Sjfb8856606 rsp->status = rte_pipeline_port_in_enable(p->p,
2253d30ea906Sjfb8856606 port_id);
2254d30ea906Sjfb8856606
2255d30ea906Sjfb8856606 return rsp;
2256d30ea906Sjfb8856606 }
2257d30ea906Sjfb8856606
2258d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_port_in_disable(struct pipeline_data * p,struct pipeline_msg_req * req)2259d30ea906Sjfb8856606 pipeline_msg_handle_port_in_disable(struct pipeline_data *p,
2260d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2261d30ea906Sjfb8856606 {
2262d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2263d30ea906Sjfb8856606 uint32_t port_id = req->id;
2264d30ea906Sjfb8856606
2265d30ea906Sjfb8856606 rsp->status = rte_pipeline_port_in_disable(p->p,
2266d30ea906Sjfb8856606 port_id);
2267d30ea906Sjfb8856606
2268d30ea906Sjfb8856606 return rsp;
2269d30ea906Sjfb8856606 }
2270d30ea906Sjfb8856606
2271d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_port_out_stats_read(struct pipeline_data * p,struct pipeline_msg_req * req)2272d30ea906Sjfb8856606 pipeline_msg_handle_port_out_stats_read(struct pipeline_data *p,
2273d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2274d30ea906Sjfb8856606 {
2275d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2276d30ea906Sjfb8856606 uint32_t port_id = req->id;
2277d30ea906Sjfb8856606 int clear = req->port_out_stats_read.clear;
2278d30ea906Sjfb8856606
2279d30ea906Sjfb8856606 rsp->status = rte_pipeline_port_out_stats_read(p->p,
2280d30ea906Sjfb8856606 port_id,
2281d30ea906Sjfb8856606 &rsp->port_out_stats_read.stats,
2282d30ea906Sjfb8856606 clear);
2283d30ea906Sjfb8856606
2284d30ea906Sjfb8856606 return rsp;
2285d30ea906Sjfb8856606 }
2286d30ea906Sjfb8856606
2287d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_stats_read(struct pipeline_data * p,struct pipeline_msg_req * req)2288d30ea906Sjfb8856606 pipeline_msg_handle_table_stats_read(struct pipeline_data *p,
2289d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2290d30ea906Sjfb8856606 {
2291d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2292d30ea906Sjfb8856606 uint32_t port_id = req->id;
2293d30ea906Sjfb8856606 int clear = req->table_stats_read.clear;
2294d30ea906Sjfb8856606
2295d30ea906Sjfb8856606 rsp->status = rte_pipeline_table_stats_read(p->p,
2296d30ea906Sjfb8856606 port_id,
2297d30ea906Sjfb8856606 &rsp->table_stats_read.stats,
2298d30ea906Sjfb8856606 clear);
2299d30ea906Sjfb8856606
2300d30ea906Sjfb8856606 return rsp;
2301d30ea906Sjfb8856606 }
2302d30ea906Sjfb8856606
2303d30ea906Sjfb8856606 static int
match_convert_ipv6_depth(uint32_t depth,uint32_t * depth32)2304d30ea906Sjfb8856606 match_convert_ipv6_depth(uint32_t depth, uint32_t *depth32)
2305d30ea906Sjfb8856606 {
2306d30ea906Sjfb8856606 if (depth > 128)
2307d30ea906Sjfb8856606 return -1;
2308d30ea906Sjfb8856606
2309d30ea906Sjfb8856606 switch (depth / 32) {
2310d30ea906Sjfb8856606 case 0:
2311d30ea906Sjfb8856606 depth32[0] = depth;
2312d30ea906Sjfb8856606 depth32[1] = 0;
2313d30ea906Sjfb8856606 depth32[2] = 0;
2314d30ea906Sjfb8856606 depth32[3] = 0;
2315d30ea906Sjfb8856606 return 0;
2316d30ea906Sjfb8856606
2317d30ea906Sjfb8856606 case 1:
2318d30ea906Sjfb8856606 depth32[0] = 32;
2319d30ea906Sjfb8856606 depth32[1] = depth - 32;
2320d30ea906Sjfb8856606 depth32[2] = 0;
2321d30ea906Sjfb8856606 depth32[3] = 0;
2322d30ea906Sjfb8856606 return 0;
2323d30ea906Sjfb8856606
2324d30ea906Sjfb8856606 case 2:
2325d30ea906Sjfb8856606 depth32[0] = 32;
2326d30ea906Sjfb8856606 depth32[1] = 32;
2327d30ea906Sjfb8856606 depth32[2] = depth - 64;
2328d30ea906Sjfb8856606 depth32[3] = 0;
2329d30ea906Sjfb8856606 return 0;
2330d30ea906Sjfb8856606
2331d30ea906Sjfb8856606 case 3:
2332d30ea906Sjfb8856606 depth32[0] = 32;
2333d30ea906Sjfb8856606 depth32[1] = 32;
2334d30ea906Sjfb8856606 depth32[2] = 32;
2335d30ea906Sjfb8856606 depth32[3] = depth - 96;
2336d30ea906Sjfb8856606 return 0;
2337d30ea906Sjfb8856606
2338d30ea906Sjfb8856606 case 4:
2339d30ea906Sjfb8856606 depth32[0] = 32;
2340d30ea906Sjfb8856606 depth32[1] = 32;
2341d30ea906Sjfb8856606 depth32[2] = 32;
2342d30ea906Sjfb8856606 depth32[3] = 32;
2343d30ea906Sjfb8856606 return 0;
2344d30ea906Sjfb8856606
2345d30ea906Sjfb8856606 default:
2346d30ea906Sjfb8856606 return -1;
2347d30ea906Sjfb8856606 }
2348d30ea906Sjfb8856606 }
2349d30ea906Sjfb8856606
2350d30ea906Sjfb8856606 static int
match_convert(struct table_rule_match * mh,union table_rule_match_low_level * ml,int add)2351d30ea906Sjfb8856606 match_convert(struct table_rule_match *mh,
2352d30ea906Sjfb8856606 union table_rule_match_low_level *ml,
2353d30ea906Sjfb8856606 int add)
2354d30ea906Sjfb8856606 {
2355d30ea906Sjfb8856606 memset(ml, 0, sizeof(*ml));
2356d30ea906Sjfb8856606
2357d30ea906Sjfb8856606 switch (mh->match_type) {
2358d30ea906Sjfb8856606 case TABLE_ACL:
2359d30ea906Sjfb8856606 if (mh->match.acl.ip_version)
2360d30ea906Sjfb8856606 if (add) {
2361d30ea906Sjfb8856606 ml->acl_add.field_value[0].value.u8 =
2362d30ea906Sjfb8856606 mh->match.acl.proto;
2363d30ea906Sjfb8856606 ml->acl_add.field_value[0].mask_range.u8 =
2364d30ea906Sjfb8856606 mh->match.acl.proto_mask;
2365d30ea906Sjfb8856606
2366d30ea906Sjfb8856606 ml->acl_add.field_value[1].value.u32 =
2367d30ea906Sjfb8856606 mh->match.acl.ipv4.sa;
2368d30ea906Sjfb8856606 ml->acl_add.field_value[1].mask_range.u32 =
2369d30ea906Sjfb8856606 mh->match.acl.sa_depth;
2370d30ea906Sjfb8856606
2371d30ea906Sjfb8856606 ml->acl_add.field_value[2].value.u32 =
2372d30ea906Sjfb8856606 mh->match.acl.ipv4.da;
2373d30ea906Sjfb8856606 ml->acl_add.field_value[2].mask_range.u32 =
2374d30ea906Sjfb8856606 mh->match.acl.da_depth;
2375d30ea906Sjfb8856606
2376d30ea906Sjfb8856606 ml->acl_add.field_value[3].value.u16 =
2377d30ea906Sjfb8856606 mh->match.acl.sp0;
2378d30ea906Sjfb8856606 ml->acl_add.field_value[3].mask_range.u16 =
2379d30ea906Sjfb8856606 mh->match.acl.sp1;
2380d30ea906Sjfb8856606
2381d30ea906Sjfb8856606 ml->acl_add.field_value[4].value.u16 =
2382d30ea906Sjfb8856606 mh->match.acl.dp0;
2383d30ea906Sjfb8856606 ml->acl_add.field_value[4].mask_range.u16 =
2384d30ea906Sjfb8856606 mh->match.acl.dp1;
2385d30ea906Sjfb8856606
2386d30ea906Sjfb8856606 ml->acl_add.priority =
2387d30ea906Sjfb8856606 (int32_t) mh->match.acl.priority;
2388d30ea906Sjfb8856606 } else {
2389d30ea906Sjfb8856606 ml->acl_delete.field_value[0].value.u8 =
2390d30ea906Sjfb8856606 mh->match.acl.proto;
2391d30ea906Sjfb8856606 ml->acl_delete.field_value[0].mask_range.u8 =
2392d30ea906Sjfb8856606 mh->match.acl.proto_mask;
2393d30ea906Sjfb8856606
2394d30ea906Sjfb8856606 ml->acl_delete.field_value[1].value.u32 =
2395d30ea906Sjfb8856606 mh->match.acl.ipv4.sa;
2396d30ea906Sjfb8856606 ml->acl_delete.field_value[1].mask_range.u32 =
2397d30ea906Sjfb8856606 mh->match.acl.sa_depth;
2398d30ea906Sjfb8856606
2399d30ea906Sjfb8856606 ml->acl_delete.field_value[2].value.u32 =
2400d30ea906Sjfb8856606 mh->match.acl.ipv4.da;
2401d30ea906Sjfb8856606 ml->acl_delete.field_value[2].mask_range.u32 =
2402d30ea906Sjfb8856606 mh->match.acl.da_depth;
2403d30ea906Sjfb8856606
2404d30ea906Sjfb8856606 ml->acl_delete.field_value[3].value.u16 =
2405d30ea906Sjfb8856606 mh->match.acl.sp0;
2406d30ea906Sjfb8856606 ml->acl_delete.field_value[3].mask_range.u16 =
2407d30ea906Sjfb8856606 mh->match.acl.sp1;
2408d30ea906Sjfb8856606
2409d30ea906Sjfb8856606 ml->acl_delete.field_value[4].value.u16 =
2410d30ea906Sjfb8856606 mh->match.acl.dp0;
2411d30ea906Sjfb8856606 ml->acl_delete.field_value[4].mask_range.u16 =
2412d30ea906Sjfb8856606 mh->match.acl.dp1;
2413d30ea906Sjfb8856606 }
2414d30ea906Sjfb8856606 else
2415d30ea906Sjfb8856606 if (add) {
2416d30ea906Sjfb8856606 uint32_t *sa32 =
2417d30ea906Sjfb8856606 (uint32_t *) mh->match.acl.ipv6.sa;
2418d30ea906Sjfb8856606 uint32_t *da32 =
2419d30ea906Sjfb8856606 (uint32_t *) mh->match.acl.ipv6.da;
2420d30ea906Sjfb8856606 uint32_t sa32_depth[4], da32_depth[4];
2421d30ea906Sjfb8856606 int status;
2422d30ea906Sjfb8856606
2423d30ea906Sjfb8856606 status = match_convert_ipv6_depth(
2424d30ea906Sjfb8856606 mh->match.acl.sa_depth,
2425d30ea906Sjfb8856606 sa32_depth);
2426d30ea906Sjfb8856606 if (status)
2427d30ea906Sjfb8856606 return status;
2428d30ea906Sjfb8856606
2429d30ea906Sjfb8856606 status = match_convert_ipv6_depth(
2430d30ea906Sjfb8856606 mh->match.acl.da_depth,
2431d30ea906Sjfb8856606 da32_depth);
2432d30ea906Sjfb8856606 if (status)
2433d30ea906Sjfb8856606 return status;
2434d30ea906Sjfb8856606
2435d30ea906Sjfb8856606 ml->acl_add.field_value[0].value.u8 =
2436d30ea906Sjfb8856606 mh->match.acl.proto;
2437d30ea906Sjfb8856606 ml->acl_add.field_value[0].mask_range.u8 =
2438d30ea906Sjfb8856606 mh->match.acl.proto_mask;
2439d30ea906Sjfb8856606
2440d30ea906Sjfb8856606 ml->acl_add.field_value[1].value.u32 =
2441d30ea906Sjfb8856606 rte_be_to_cpu_32(sa32[0]);
2442d30ea906Sjfb8856606 ml->acl_add.field_value[1].mask_range.u32 =
2443d30ea906Sjfb8856606 sa32_depth[0];
2444d30ea906Sjfb8856606 ml->acl_add.field_value[2].value.u32 =
2445d30ea906Sjfb8856606 rte_be_to_cpu_32(sa32[1]);
2446d30ea906Sjfb8856606 ml->acl_add.field_value[2].mask_range.u32 =
2447d30ea906Sjfb8856606 sa32_depth[1];
2448d30ea906Sjfb8856606 ml->acl_add.field_value[3].value.u32 =
2449d30ea906Sjfb8856606 rte_be_to_cpu_32(sa32[2]);
2450d30ea906Sjfb8856606 ml->acl_add.field_value[3].mask_range.u32 =
2451d30ea906Sjfb8856606 sa32_depth[2];
2452d30ea906Sjfb8856606 ml->acl_add.field_value[4].value.u32 =
2453d30ea906Sjfb8856606 rte_be_to_cpu_32(sa32[3]);
2454d30ea906Sjfb8856606 ml->acl_add.field_value[4].mask_range.u32 =
2455d30ea906Sjfb8856606 sa32_depth[3];
2456d30ea906Sjfb8856606
2457d30ea906Sjfb8856606 ml->acl_add.field_value[5].value.u32 =
2458d30ea906Sjfb8856606 rte_be_to_cpu_32(da32[0]);
2459d30ea906Sjfb8856606 ml->acl_add.field_value[5].mask_range.u32 =
2460d30ea906Sjfb8856606 da32_depth[0];
2461d30ea906Sjfb8856606 ml->acl_add.field_value[6].value.u32 =
2462d30ea906Sjfb8856606 rte_be_to_cpu_32(da32[1]);
2463d30ea906Sjfb8856606 ml->acl_add.field_value[6].mask_range.u32 =
2464d30ea906Sjfb8856606 da32_depth[1];
2465d30ea906Sjfb8856606 ml->acl_add.field_value[7].value.u32 =
2466d30ea906Sjfb8856606 rte_be_to_cpu_32(da32[2]);
2467d30ea906Sjfb8856606 ml->acl_add.field_value[7].mask_range.u32 =
2468d30ea906Sjfb8856606 da32_depth[2];
2469d30ea906Sjfb8856606 ml->acl_add.field_value[8].value.u32 =
2470d30ea906Sjfb8856606 rte_be_to_cpu_32(da32[3]);
2471d30ea906Sjfb8856606 ml->acl_add.field_value[8].mask_range.u32 =
2472d30ea906Sjfb8856606 da32_depth[3];
2473d30ea906Sjfb8856606
2474d30ea906Sjfb8856606 ml->acl_add.field_value[9].value.u16 =
2475d30ea906Sjfb8856606 mh->match.acl.sp0;
2476d30ea906Sjfb8856606 ml->acl_add.field_value[9].mask_range.u16 =
2477d30ea906Sjfb8856606 mh->match.acl.sp1;
2478d30ea906Sjfb8856606
2479d30ea906Sjfb8856606 ml->acl_add.field_value[10].value.u16 =
2480d30ea906Sjfb8856606 mh->match.acl.dp0;
2481d30ea906Sjfb8856606 ml->acl_add.field_value[10].mask_range.u16 =
2482d30ea906Sjfb8856606 mh->match.acl.dp1;
2483d30ea906Sjfb8856606
2484d30ea906Sjfb8856606 ml->acl_add.priority =
2485d30ea906Sjfb8856606 (int32_t) mh->match.acl.priority;
2486d30ea906Sjfb8856606 } else {
2487d30ea906Sjfb8856606 uint32_t *sa32 =
2488d30ea906Sjfb8856606 (uint32_t *) mh->match.acl.ipv6.sa;
2489d30ea906Sjfb8856606 uint32_t *da32 =
2490d30ea906Sjfb8856606 (uint32_t *) mh->match.acl.ipv6.da;
2491d30ea906Sjfb8856606 uint32_t sa32_depth[4], da32_depth[4];
2492d30ea906Sjfb8856606 int status;
2493d30ea906Sjfb8856606
2494d30ea906Sjfb8856606 status = match_convert_ipv6_depth(
2495d30ea906Sjfb8856606 mh->match.acl.sa_depth,
2496d30ea906Sjfb8856606 sa32_depth);
2497d30ea906Sjfb8856606 if (status)
2498d30ea906Sjfb8856606 return status;
2499d30ea906Sjfb8856606
2500d30ea906Sjfb8856606 status = match_convert_ipv6_depth(
2501d30ea906Sjfb8856606 mh->match.acl.da_depth,
2502d30ea906Sjfb8856606 da32_depth);
2503d30ea906Sjfb8856606 if (status)
2504d30ea906Sjfb8856606 return status;
2505d30ea906Sjfb8856606
2506d30ea906Sjfb8856606 ml->acl_delete.field_value[0].value.u8 =
2507d30ea906Sjfb8856606 mh->match.acl.proto;
2508d30ea906Sjfb8856606 ml->acl_delete.field_value[0].mask_range.u8 =
2509d30ea906Sjfb8856606 mh->match.acl.proto_mask;
2510d30ea906Sjfb8856606
2511d30ea906Sjfb8856606 ml->acl_delete.field_value[1].value.u32 =
2512d30ea906Sjfb8856606 rte_be_to_cpu_32(sa32[0]);
2513d30ea906Sjfb8856606 ml->acl_delete.field_value[1].mask_range.u32 =
2514d30ea906Sjfb8856606 sa32_depth[0];
2515d30ea906Sjfb8856606 ml->acl_delete.field_value[2].value.u32 =
2516d30ea906Sjfb8856606 rte_be_to_cpu_32(sa32[1]);
2517d30ea906Sjfb8856606 ml->acl_delete.field_value[2].mask_range.u32 =
2518d30ea906Sjfb8856606 sa32_depth[1];
2519d30ea906Sjfb8856606 ml->acl_delete.field_value[3].value.u32 =
2520d30ea906Sjfb8856606 rte_be_to_cpu_32(sa32[2]);
2521d30ea906Sjfb8856606 ml->acl_delete.field_value[3].mask_range.u32 =
2522d30ea906Sjfb8856606 sa32_depth[2];
2523d30ea906Sjfb8856606 ml->acl_delete.field_value[4].value.u32 =
2524d30ea906Sjfb8856606 rte_be_to_cpu_32(sa32[3]);
2525d30ea906Sjfb8856606 ml->acl_delete.field_value[4].mask_range.u32 =
2526d30ea906Sjfb8856606 sa32_depth[3];
2527d30ea906Sjfb8856606
2528d30ea906Sjfb8856606 ml->acl_delete.field_value[5].value.u32 =
2529d30ea906Sjfb8856606 rte_be_to_cpu_32(da32[0]);
2530d30ea906Sjfb8856606 ml->acl_delete.field_value[5].mask_range.u32 =
2531d30ea906Sjfb8856606 da32_depth[0];
2532d30ea906Sjfb8856606 ml->acl_delete.field_value[6].value.u32 =
2533d30ea906Sjfb8856606 rte_be_to_cpu_32(da32[1]);
2534d30ea906Sjfb8856606 ml->acl_delete.field_value[6].mask_range.u32 =
2535d30ea906Sjfb8856606 da32_depth[1];
2536d30ea906Sjfb8856606 ml->acl_delete.field_value[7].value.u32 =
2537d30ea906Sjfb8856606 rte_be_to_cpu_32(da32[2]);
2538d30ea906Sjfb8856606 ml->acl_delete.field_value[7].mask_range.u32 =
2539d30ea906Sjfb8856606 da32_depth[2];
2540d30ea906Sjfb8856606 ml->acl_delete.field_value[8].value.u32 =
2541d30ea906Sjfb8856606 rte_be_to_cpu_32(da32[3]);
2542d30ea906Sjfb8856606 ml->acl_delete.field_value[8].mask_range.u32 =
2543d30ea906Sjfb8856606 da32_depth[3];
2544d30ea906Sjfb8856606
2545d30ea906Sjfb8856606 ml->acl_delete.field_value[9].value.u16 =
2546d30ea906Sjfb8856606 mh->match.acl.sp0;
2547d30ea906Sjfb8856606 ml->acl_delete.field_value[9].mask_range.u16 =
2548d30ea906Sjfb8856606 mh->match.acl.sp1;
2549d30ea906Sjfb8856606
2550d30ea906Sjfb8856606 ml->acl_delete.field_value[10].value.u16 =
2551d30ea906Sjfb8856606 mh->match.acl.dp0;
2552d30ea906Sjfb8856606 ml->acl_delete.field_value[10].mask_range.u16 =
2553d30ea906Sjfb8856606 mh->match.acl.dp1;
2554d30ea906Sjfb8856606 }
2555d30ea906Sjfb8856606 return 0;
2556d30ea906Sjfb8856606
2557d30ea906Sjfb8856606 case TABLE_ARRAY:
2558d30ea906Sjfb8856606 ml->array.pos = mh->match.array.pos;
2559d30ea906Sjfb8856606 return 0;
2560d30ea906Sjfb8856606
2561d30ea906Sjfb8856606 case TABLE_HASH:
2562d30ea906Sjfb8856606 memcpy(ml->hash, mh->match.hash.key, sizeof(ml->hash));
2563d30ea906Sjfb8856606 return 0;
2564d30ea906Sjfb8856606
2565d30ea906Sjfb8856606 case TABLE_LPM:
2566d30ea906Sjfb8856606 if (mh->match.lpm.ip_version) {
2567d30ea906Sjfb8856606 ml->lpm_ipv4.ip = mh->match.lpm.ipv4;
2568d30ea906Sjfb8856606 ml->lpm_ipv4.depth = mh->match.lpm.depth;
2569d30ea906Sjfb8856606 } else {
2570d30ea906Sjfb8856606 memcpy(ml->lpm_ipv6.ip,
2571d30ea906Sjfb8856606 mh->match.lpm.ipv6, sizeof(ml->lpm_ipv6.ip));
2572d30ea906Sjfb8856606 ml->lpm_ipv6.depth = mh->match.lpm.depth;
2573d30ea906Sjfb8856606 }
2574d30ea906Sjfb8856606
2575d30ea906Sjfb8856606 return 0;
2576d30ea906Sjfb8856606
2577d30ea906Sjfb8856606 default:
2578d30ea906Sjfb8856606 return -1;
2579d30ea906Sjfb8856606 }
2580d30ea906Sjfb8856606 }
2581d30ea906Sjfb8856606
2582d30ea906Sjfb8856606 static int
action_convert(struct rte_table_action * a,struct table_rule_action * action,struct rte_pipeline_table_entry * data)2583d30ea906Sjfb8856606 action_convert(struct rte_table_action *a,
2584d30ea906Sjfb8856606 struct table_rule_action *action,
2585d30ea906Sjfb8856606 struct rte_pipeline_table_entry *data)
2586d30ea906Sjfb8856606 {
2587d30ea906Sjfb8856606 int status;
2588d30ea906Sjfb8856606
2589d30ea906Sjfb8856606 /* Apply actions */
2590d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_FWD)) {
2591d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2592d30ea906Sjfb8856606 data,
2593d30ea906Sjfb8856606 RTE_TABLE_ACTION_FWD,
2594d30ea906Sjfb8856606 &action->fwd);
2595d30ea906Sjfb8856606
2596d30ea906Sjfb8856606 if (status)
2597d30ea906Sjfb8856606 return status;
2598d30ea906Sjfb8856606 }
2599d30ea906Sjfb8856606
2600d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_LB)) {
2601d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2602d30ea906Sjfb8856606 data,
2603d30ea906Sjfb8856606 RTE_TABLE_ACTION_LB,
2604d30ea906Sjfb8856606 &action->lb);
2605d30ea906Sjfb8856606
2606d30ea906Sjfb8856606 if (status)
2607d30ea906Sjfb8856606 return status;
2608d30ea906Sjfb8856606 }
2609d30ea906Sjfb8856606
2610d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) {
2611d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2612d30ea906Sjfb8856606 data,
2613d30ea906Sjfb8856606 RTE_TABLE_ACTION_MTR,
2614d30ea906Sjfb8856606 &action->mtr);
2615d30ea906Sjfb8856606
2616d30ea906Sjfb8856606 if (status)
2617d30ea906Sjfb8856606 return status;
2618d30ea906Sjfb8856606 }
2619d30ea906Sjfb8856606
2620d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_TM)) {
2621d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2622d30ea906Sjfb8856606 data,
2623d30ea906Sjfb8856606 RTE_TABLE_ACTION_TM,
2624d30ea906Sjfb8856606 &action->tm);
2625d30ea906Sjfb8856606
2626d30ea906Sjfb8856606 if (status)
2627d30ea906Sjfb8856606 return status;
2628d30ea906Sjfb8856606 }
2629d30ea906Sjfb8856606
2630d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_ENCAP)) {
2631d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2632d30ea906Sjfb8856606 data,
2633d30ea906Sjfb8856606 RTE_TABLE_ACTION_ENCAP,
2634d30ea906Sjfb8856606 &action->encap);
2635d30ea906Sjfb8856606
2636d30ea906Sjfb8856606 if (status)
2637d30ea906Sjfb8856606 return status;
2638d30ea906Sjfb8856606 }
2639d30ea906Sjfb8856606
2640d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_NAT)) {
2641d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2642d30ea906Sjfb8856606 data,
2643d30ea906Sjfb8856606 RTE_TABLE_ACTION_NAT,
2644d30ea906Sjfb8856606 &action->nat);
2645d30ea906Sjfb8856606
2646d30ea906Sjfb8856606 if (status)
2647d30ea906Sjfb8856606 return status;
2648d30ea906Sjfb8856606 }
2649d30ea906Sjfb8856606
2650d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_TTL)) {
2651d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2652d30ea906Sjfb8856606 data,
2653d30ea906Sjfb8856606 RTE_TABLE_ACTION_TTL,
2654d30ea906Sjfb8856606 &action->ttl);
2655d30ea906Sjfb8856606
2656d30ea906Sjfb8856606 if (status)
2657d30ea906Sjfb8856606 return status;
2658d30ea906Sjfb8856606 }
2659d30ea906Sjfb8856606
2660d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_STATS)) {
2661d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2662d30ea906Sjfb8856606 data,
2663d30ea906Sjfb8856606 RTE_TABLE_ACTION_STATS,
2664d30ea906Sjfb8856606 &action->stats);
2665d30ea906Sjfb8856606
2666d30ea906Sjfb8856606 if (status)
2667d30ea906Sjfb8856606 return status;
2668d30ea906Sjfb8856606 }
2669d30ea906Sjfb8856606
2670d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_TIME)) {
2671d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2672d30ea906Sjfb8856606 data,
2673d30ea906Sjfb8856606 RTE_TABLE_ACTION_TIME,
2674d30ea906Sjfb8856606 &action->time);
2675d30ea906Sjfb8856606
2676d30ea906Sjfb8856606 if (status)
2677d30ea906Sjfb8856606 return status;
2678d30ea906Sjfb8856606 }
2679d30ea906Sjfb8856606
2680d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_SYM_CRYPTO)) {
2681d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2682d30ea906Sjfb8856606 data,
2683d30ea906Sjfb8856606 RTE_TABLE_ACTION_SYM_CRYPTO,
2684d30ea906Sjfb8856606 &action->sym_crypto);
2685d30ea906Sjfb8856606
2686d30ea906Sjfb8856606 if (status)
2687d30ea906Sjfb8856606 return status;
2688d30ea906Sjfb8856606 }
2689d30ea906Sjfb8856606
2690d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_TAG)) {
2691d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2692d30ea906Sjfb8856606 data,
2693d30ea906Sjfb8856606 RTE_TABLE_ACTION_TAG,
2694d30ea906Sjfb8856606 &action->tag);
2695d30ea906Sjfb8856606
2696d30ea906Sjfb8856606 if (status)
2697d30ea906Sjfb8856606 return status;
2698d30ea906Sjfb8856606 }
2699d30ea906Sjfb8856606
2700d30ea906Sjfb8856606 if (action->action_mask & (1LLU << RTE_TABLE_ACTION_DECAP)) {
2701d30ea906Sjfb8856606 status = rte_table_action_apply(a,
2702d30ea906Sjfb8856606 data,
2703d30ea906Sjfb8856606 RTE_TABLE_ACTION_DECAP,
2704d30ea906Sjfb8856606 &action->decap);
2705d30ea906Sjfb8856606
2706d30ea906Sjfb8856606 if (status)
2707d30ea906Sjfb8856606 return status;
2708d30ea906Sjfb8856606 }
2709d30ea906Sjfb8856606
2710d30ea906Sjfb8856606 return 0;
2711d30ea906Sjfb8856606 }
2712d30ea906Sjfb8856606
2713d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_rule_add(struct pipeline_data * p,struct pipeline_msg_req * req)2714d30ea906Sjfb8856606 pipeline_msg_handle_table_rule_add(struct pipeline_data *p,
2715d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2716d30ea906Sjfb8856606 {
2717d30ea906Sjfb8856606 union table_rule_match_low_level match_ll;
2718d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2719d30ea906Sjfb8856606 struct table_rule_match *match = &req->table_rule_add.match;
2720d30ea906Sjfb8856606 struct table_rule_action *action = &req->table_rule_add.action;
2721d30ea906Sjfb8856606 struct rte_pipeline_table_entry *data_in, *data_out;
2722d30ea906Sjfb8856606 uint32_t table_id = req->id;
2723d30ea906Sjfb8856606 int key_found, status;
2724d30ea906Sjfb8856606 struct rte_table_action *a = p->table_data[table_id].a;
2725d30ea906Sjfb8856606
2726d30ea906Sjfb8856606 /* Apply actions */
2727d30ea906Sjfb8856606 memset(p->buffer, 0, sizeof(p->buffer));
2728d30ea906Sjfb8856606 data_in = (struct rte_pipeline_table_entry *) p->buffer;
2729d30ea906Sjfb8856606
2730d30ea906Sjfb8856606 status = match_convert(match, &match_ll, 1);
2731d30ea906Sjfb8856606 if (status) {
2732d30ea906Sjfb8856606 rsp->status = -1;
2733d30ea906Sjfb8856606 return rsp;
2734d30ea906Sjfb8856606 }
2735d30ea906Sjfb8856606
2736d30ea906Sjfb8856606 status = action_convert(a, action, data_in);
2737d30ea906Sjfb8856606 if (status) {
2738d30ea906Sjfb8856606 rsp->status = -1;
2739d30ea906Sjfb8856606 return rsp;
2740d30ea906Sjfb8856606 }
2741d30ea906Sjfb8856606
2742d30ea906Sjfb8856606 status = rte_pipeline_table_entry_add(p->p,
2743d30ea906Sjfb8856606 table_id,
2744d30ea906Sjfb8856606 &match_ll,
2745d30ea906Sjfb8856606 data_in,
2746d30ea906Sjfb8856606 &key_found,
2747d30ea906Sjfb8856606 &data_out);
2748d30ea906Sjfb8856606 if (status) {
2749d30ea906Sjfb8856606 rsp->status = -1;
2750d30ea906Sjfb8856606 return rsp;
2751d30ea906Sjfb8856606 }
2752d30ea906Sjfb8856606
2753d30ea906Sjfb8856606 /* Write response */
2754d30ea906Sjfb8856606 rsp->status = 0;
2755d30ea906Sjfb8856606 rsp->table_rule_add.data = data_out;
2756d30ea906Sjfb8856606
2757d30ea906Sjfb8856606 return rsp;
2758d30ea906Sjfb8856606 }
2759d30ea906Sjfb8856606
2760d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_rule_add_default(struct pipeline_data * p,struct pipeline_msg_req * req)2761d30ea906Sjfb8856606 pipeline_msg_handle_table_rule_add_default(struct pipeline_data *p,
2762d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2763d30ea906Sjfb8856606 {
2764d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2765d30ea906Sjfb8856606 struct table_rule_action *action = &req->table_rule_add_default.action;
2766d30ea906Sjfb8856606 struct rte_pipeline_table_entry *data_in, *data_out;
2767d30ea906Sjfb8856606 uint32_t table_id = req->id;
2768d30ea906Sjfb8856606 int status;
2769d30ea906Sjfb8856606
2770d30ea906Sjfb8856606 /* Apply actions */
2771d30ea906Sjfb8856606 memset(p->buffer, 0, sizeof(p->buffer));
2772d30ea906Sjfb8856606 data_in = (struct rte_pipeline_table_entry *) p->buffer;
2773d30ea906Sjfb8856606
2774d30ea906Sjfb8856606 data_in->action = action->fwd.action;
2775d30ea906Sjfb8856606 if (action->fwd.action == RTE_PIPELINE_ACTION_PORT)
2776d30ea906Sjfb8856606 data_in->port_id = action->fwd.id;
2777d30ea906Sjfb8856606 if (action->fwd.action == RTE_PIPELINE_ACTION_TABLE)
2778d30ea906Sjfb8856606 data_in->table_id = action->fwd.id;
2779d30ea906Sjfb8856606
2780d30ea906Sjfb8856606 /* Add default rule to table */
2781d30ea906Sjfb8856606 status = rte_pipeline_table_default_entry_add(p->p,
2782d30ea906Sjfb8856606 table_id,
2783d30ea906Sjfb8856606 data_in,
2784d30ea906Sjfb8856606 &data_out);
2785d30ea906Sjfb8856606 if (status) {
2786d30ea906Sjfb8856606 rsp->status = -1;
2787d30ea906Sjfb8856606 return rsp;
2788d30ea906Sjfb8856606 }
2789d30ea906Sjfb8856606
2790d30ea906Sjfb8856606 /* Write response */
2791d30ea906Sjfb8856606 rsp->status = 0;
2792d30ea906Sjfb8856606 rsp->table_rule_add_default.data = data_out;
2793d30ea906Sjfb8856606
2794d30ea906Sjfb8856606 return rsp;
2795d30ea906Sjfb8856606 }
2796d30ea906Sjfb8856606
2797d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_rule_add_bulk(struct pipeline_data * p,struct pipeline_msg_req * req)2798d30ea906Sjfb8856606 pipeline_msg_handle_table_rule_add_bulk(struct pipeline_data *p,
2799d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2800d30ea906Sjfb8856606 {
2801d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2802d30ea906Sjfb8856606
2803d30ea906Sjfb8856606 uint32_t table_id = req->id;
2804d30ea906Sjfb8856606 struct table_rule_list *list = req->table_rule_add_bulk.list;
2805d30ea906Sjfb8856606 uint32_t bulk = req->table_rule_add_bulk.bulk;
2806d30ea906Sjfb8856606
2807d30ea906Sjfb8856606 uint32_t n_rules_added;
2808d30ea906Sjfb8856606 int status;
2809d30ea906Sjfb8856606
2810d30ea906Sjfb8856606 struct table_ll table_ll = {
2811d30ea906Sjfb8856606 .p = p->p,
2812d30ea906Sjfb8856606 .table_id = table_id,
2813d30ea906Sjfb8856606 .a = p->table_data[table_id].a,
2814d30ea906Sjfb8856606 .bulk_supported = bulk,
2815d30ea906Sjfb8856606 };
2816d30ea906Sjfb8856606
2817d30ea906Sjfb8856606 status = table_rule_add_bulk_ll(&table_ll, list, &n_rules_added);
2818d30ea906Sjfb8856606 if (status) {
2819d30ea906Sjfb8856606 rsp->status = -1;
2820d30ea906Sjfb8856606 rsp->table_rule_add_bulk.n_rules = 0;
2821d30ea906Sjfb8856606 return rsp;
2822d30ea906Sjfb8856606 }
2823d30ea906Sjfb8856606
2824d30ea906Sjfb8856606 /* Write response */
2825d30ea906Sjfb8856606 rsp->status = 0;
2826d30ea906Sjfb8856606 rsp->table_rule_add_bulk.n_rules = n_rules_added;
2827d30ea906Sjfb8856606 return rsp;
2828d30ea906Sjfb8856606 }
2829d30ea906Sjfb8856606
2830d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_rule_delete(struct pipeline_data * p,struct pipeline_msg_req * req)2831d30ea906Sjfb8856606 pipeline_msg_handle_table_rule_delete(struct pipeline_data *p,
2832d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2833d30ea906Sjfb8856606 {
2834d30ea906Sjfb8856606 union table_rule_match_low_level match_ll;
2835d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2836d30ea906Sjfb8856606 struct table_rule_match *match = &req->table_rule_delete.match;
2837d30ea906Sjfb8856606 uint32_t table_id = req->id;
2838d30ea906Sjfb8856606 int key_found, status;
2839d30ea906Sjfb8856606
2840d30ea906Sjfb8856606 status = match_convert(match, &match_ll, 0);
2841d30ea906Sjfb8856606 if (status) {
2842d30ea906Sjfb8856606 rsp->status = -1;
2843d30ea906Sjfb8856606 return rsp;
2844d30ea906Sjfb8856606 }
2845d30ea906Sjfb8856606
2846d30ea906Sjfb8856606 rsp->status = rte_pipeline_table_entry_delete(p->p,
2847d30ea906Sjfb8856606 table_id,
2848d30ea906Sjfb8856606 &match_ll,
2849d30ea906Sjfb8856606 &key_found,
2850d30ea906Sjfb8856606 NULL);
2851d30ea906Sjfb8856606
2852d30ea906Sjfb8856606 return rsp;
2853d30ea906Sjfb8856606 }
2854d30ea906Sjfb8856606
2855d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_rule_delete_default(struct pipeline_data * p,struct pipeline_msg_req * req)2856d30ea906Sjfb8856606 pipeline_msg_handle_table_rule_delete_default(struct pipeline_data *p,
2857d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2858d30ea906Sjfb8856606 {
2859d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2860d30ea906Sjfb8856606 uint32_t table_id = req->id;
2861d30ea906Sjfb8856606
2862d30ea906Sjfb8856606 rsp->status = rte_pipeline_table_default_entry_delete(p->p,
2863d30ea906Sjfb8856606 table_id,
2864d30ea906Sjfb8856606 NULL);
2865d30ea906Sjfb8856606
2866d30ea906Sjfb8856606 return rsp;
2867d30ea906Sjfb8856606 }
2868d30ea906Sjfb8856606
2869d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_rule_stats_read(struct pipeline_data * p,struct pipeline_msg_req * req)2870d30ea906Sjfb8856606 pipeline_msg_handle_table_rule_stats_read(struct pipeline_data *p,
2871d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2872d30ea906Sjfb8856606 {
2873d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2874d30ea906Sjfb8856606 uint32_t table_id = req->id;
2875d30ea906Sjfb8856606 void *data = req->table_rule_stats_read.data;
2876d30ea906Sjfb8856606 int clear = req->table_rule_stats_read.clear;
2877d30ea906Sjfb8856606 struct rte_table_action *a = p->table_data[table_id].a;
2878d30ea906Sjfb8856606
2879d30ea906Sjfb8856606 rsp->status = rte_table_action_stats_read(a,
2880d30ea906Sjfb8856606 data,
2881d30ea906Sjfb8856606 &rsp->table_rule_stats_read.stats,
2882d30ea906Sjfb8856606 clear);
2883d30ea906Sjfb8856606
2884d30ea906Sjfb8856606 return rsp;
2885d30ea906Sjfb8856606 }
2886d30ea906Sjfb8856606
2887d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_mtr_profile_add(struct pipeline_data * p,struct pipeline_msg_req * req)2888d30ea906Sjfb8856606 pipeline_msg_handle_table_mtr_profile_add(struct pipeline_data *p,
2889d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2890d30ea906Sjfb8856606 {
2891d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2892d30ea906Sjfb8856606 uint32_t table_id = req->id;
2893d30ea906Sjfb8856606 uint32_t meter_profile_id = req->table_mtr_profile_add.meter_profile_id;
2894d30ea906Sjfb8856606 struct rte_table_action_meter_profile *profile =
2895d30ea906Sjfb8856606 &req->table_mtr_profile_add.profile;
2896d30ea906Sjfb8856606 struct rte_table_action *a = p->table_data[table_id].a;
2897d30ea906Sjfb8856606
2898d30ea906Sjfb8856606 rsp->status = rte_table_action_meter_profile_add(a,
2899d30ea906Sjfb8856606 meter_profile_id,
2900d30ea906Sjfb8856606 profile);
2901d30ea906Sjfb8856606
2902d30ea906Sjfb8856606 return rsp;
2903d30ea906Sjfb8856606 }
2904d30ea906Sjfb8856606
2905d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_mtr_profile_delete(struct pipeline_data * p,struct pipeline_msg_req * req)2906d30ea906Sjfb8856606 pipeline_msg_handle_table_mtr_profile_delete(struct pipeline_data *p,
2907d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2908d30ea906Sjfb8856606 {
2909d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2910d30ea906Sjfb8856606 uint32_t table_id = req->id;
2911d30ea906Sjfb8856606 uint32_t meter_profile_id =
2912d30ea906Sjfb8856606 req->table_mtr_profile_delete.meter_profile_id;
2913d30ea906Sjfb8856606 struct rte_table_action *a = p->table_data[table_id].a;
2914d30ea906Sjfb8856606
2915d30ea906Sjfb8856606 rsp->status = rte_table_action_meter_profile_delete(a,
2916d30ea906Sjfb8856606 meter_profile_id);
2917d30ea906Sjfb8856606
2918d30ea906Sjfb8856606 return rsp;
2919d30ea906Sjfb8856606 }
2920d30ea906Sjfb8856606
2921d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_rule_mtr_read(struct pipeline_data * p,struct pipeline_msg_req * req)2922d30ea906Sjfb8856606 pipeline_msg_handle_table_rule_mtr_read(struct pipeline_data *p,
2923d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2924d30ea906Sjfb8856606 {
2925d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2926d30ea906Sjfb8856606 uint32_t table_id = req->id;
2927d30ea906Sjfb8856606 void *data = req->table_rule_mtr_read.data;
2928d30ea906Sjfb8856606 uint32_t tc_mask = req->table_rule_mtr_read.tc_mask;
2929d30ea906Sjfb8856606 int clear = req->table_rule_mtr_read.clear;
2930d30ea906Sjfb8856606 struct rte_table_action *a = p->table_data[table_id].a;
2931d30ea906Sjfb8856606
2932d30ea906Sjfb8856606 rsp->status = rte_table_action_meter_read(a,
2933d30ea906Sjfb8856606 data,
2934d30ea906Sjfb8856606 tc_mask,
2935d30ea906Sjfb8856606 &rsp->table_rule_mtr_read.stats,
2936d30ea906Sjfb8856606 clear);
2937d30ea906Sjfb8856606
2938d30ea906Sjfb8856606 return rsp;
2939d30ea906Sjfb8856606 }
2940d30ea906Sjfb8856606
2941d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_dscp_table_update(struct pipeline_data * p,struct pipeline_msg_req * req)2942d30ea906Sjfb8856606 pipeline_msg_handle_table_dscp_table_update(struct pipeline_data *p,
2943d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2944d30ea906Sjfb8856606 {
2945d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2946d30ea906Sjfb8856606 uint32_t table_id = req->id;
2947d30ea906Sjfb8856606 uint64_t dscp_mask = req->table_dscp_table_update.dscp_mask;
2948d30ea906Sjfb8856606 struct rte_table_action_dscp_table *dscp_table =
2949d30ea906Sjfb8856606 &req->table_dscp_table_update.dscp_table;
2950d30ea906Sjfb8856606 struct rte_table_action *a = p->table_data[table_id].a;
2951d30ea906Sjfb8856606
2952d30ea906Sjfb8856606 rsp->status = rte_table_action_dscp_table_update(a,
2953d30ea906Sjfb8856606 dscp_mask,
2954d30ea906Sjfb8856606 dscp_table);
2955d30ea906Sjfb8856606
2956d30ea906Sjfb8856606 return rsp;
2957d30ea906Sjfb8856606 }
2958d30ea906Sjfb8856606
2959d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_rule_ttl_read(struct pipeline_data * p,struct pipeline_msg_req * req)2960d30ea906Sjfb8856606 pipeline_msg_handle_table_rule_ttl_read(struct pipeline_data *p,
2961d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2962d30ea906Sjfb8856606 {
2963d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2964d30ea906Sjfb8856606 uint32_t table_id = req->id;
2965d30ea906Sjfb8856606 void *data = req->table_rule_ttl_read.data;
2966d30ea906Sjfb8856606 int clear = req->table_rule_ttl_read.clear;
2967d30ea906Sjfb8856606 struct rte_table_action *a = p->table_data[table_id].a;
2968d30ea906Sjfb8856606
2969d30ea906Sjfb8856606 rsp->status = rte_table_action_ttl_read(a,
2970d30ea906Sjfb8856606 data,
2971d30ea906Sjfb8856606 &rsp->table_rule_ttl_read.stats,
2972d30ea906Sjfb8856606 clear);
2973d30ea906Sjfb8856606
2974d30ea906Sjfb8856606 return rsp;
2975d30ea906Sjfb8856606 }
2976d30ea906Sjfb8856606
2977d30ea906Sjfb8856606 static struct pipeline_msg_rsp *
pipeline_msg_handle_table_rule_time_read(struct pipeline_data * p,struct pipeline_msg_req * req)2978d30ea906Sjfb8856606 pipeline_msg_handle_table_rule_time_read(struct pipeline_data *p,
2979d30ea906Sjfb8856606 struct pipeline_msg_req *req)
2980d30ea906Sjfb8856606 {
2981d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
2982d30ea906Sjfb8856606 uint32_t table_id = req->id;
2983d30ea906Sjfb8856606 void *data = req->table_rule_time_read.data;
2984d30ea906Sjfb8856606 struct rte_table_action *a = p->table_data[table_id].a;
2985d30ea906Sjfb8856606
2986d30ea906Sjfb8856606 rsp->status = rte_table_action_time_read(a,
2987d30ea906Sjfb8856606 data,
2988d30ea906Sjfb8856606 &rsp->table_rule_time_read.timestamp);
2989d30ea906Sjfb8856606
2990d30ea906Sjfb8856606 return rsp;
2991d30ea906Sjfb8856606 }
2992d30ea906Sjfb8856606
2993d30ea906Sjfb8856606 static void
pipeline_msg_handle(struct pipeline_data * p)2994d30ea906Sjfb8856606 pipeline_msg_handle(struct pipeline_data *p)
2995d30ea906Sjfb8856606 {
2996d30ea906Sjfb8856606 for ( ; ; ) {
2997d30ea906Sjfb8856606 struct pipeline_msg_req *req;
2998d30ea906Sjfb8856606 struct pipeline_msg_rsp *rsp;
2999d30ea906Sjfb8856606
3000d30ea906Sjfb8856606 req = pipeline_msg_recv(p->msgq_req);
3001d30ea906Sjfb8856606 if (req == NULL)
3002d30ea906Sjfb8856606 break;
3003d30ea906Sjfb8856606
3004d30ea906Sjfb8856606 switch (req->type) {
3005d30ea906Sjfb8856606 case PIPELINE_REQ_PORT_IN_STATS_READ:
3006d30ea906Sjfb8856606 rsp = pipeline_msg_handle_port_in_stats_read(p, req);
3007d30ea906Sjfb8856606 break;
3008d30ea906Sjfb8856606
3009d30ea906Sjfb8856606 case PIPELINE_REQ_PORT_IN_ENABLE:
3010d30ea906Sjfb8856606 rsp = pipeline_msg_handle_port_in_enable(p, req);
3011d30ea906Sjfb8856606 break;
3012d30ea906Sjfb8856606
3013d30ea906Sjfb8856606 case PIPELINE_REQ_PORT_IN_DISABLE:
3014d30ea906Sjfb8856606 rsp = pipeline_msg_handle_port_in_disable(p, req);
3015d30ea906Sjfb8856606 break;
3016d30ea906Sjfb8856606
3017d30ea906Sjfb8856606 case PIPELINE_REQ_PORT_OUT_STATS_READ:
3018d30ea906Sjfb8856606 rsp = pipeline_msg_handle_port_out_stats_read(p, req);
3019d30ea906Sjfb8856606 break;
3020d30ea906Sjfb8856606
3021d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_STATS_READ:
3022d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_stats_read(p, req);
3023d30ea906Sjfb8856606 break;
3024d30ea906Sjfb8856606
3025d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_RULE_ADD:
3026d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_rule_add(p, req);
3027d30ea906Sjfb8856606 break;
3028d30ea906Sjfb8856606
3029d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_RULE_ADD_DEFAULT:
3030d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_rule_add_default(p, req);
3031d30ea906Sjfb8856606 break;
3032d30ea906Sjfb8856606
3033d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_RULE_ADD_BULK:
3034d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_rule_add_bulk(p, req);
3035d30ea906Sjfb8856606 break;
3036d30ea906Sjfb8856606
3037d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_RULE_DELETE:
3038d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_rule_delete(p, req);
3039d30ea906Sjfb8856606 break;
3040d30ea906Sjfb8856606
3041d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_RULE_DELETE_DEFAULT:
3042d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_rule_delete_default(p, req);
3043d30ea906Sjfb8856606 break;
3044d30ea906Sjfb8856606
3045d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_RULE_STATS_READ:
3046d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_rule_stats_read(p, req);
3047d30ea906Sjfb8856606 break;
3048d30ea906Sjfb8856606
3049d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_MTR_PROFILE_ADD:
3050d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_mtr_profile_add(p, req);
3051d30ea906Sjfb8856606 break;
3052d30ea906Sjfb8856606
3053d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_MTR_PROFILE_DELETE:
3054d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_mtr_profile_delete(p, req);
3055d30ea906Sjfb8856606 break;
3056d30ea906Sjfb8856606
3057d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_RULE_MTR_READ:
3058d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_rule_mtr_read(p, req);
3059d30ea906Sjfb8856606 break;
3060d30ea906Sjfb8856606
3061d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_DSCP_TABLE_UPDATE:
3062d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_dscp_table_update(p, req);
3063d30ea906Sjfb8856606 break;
3064d30ea906Sjfb8856606
3065d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_RULE_TTL_READ:
3066d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_rule_ttl_read(p, req);
3067d30ea906Sjfb8856606 break;
3068d30ea906Sjfb8856606
3069d30ea906Sjfb8856606 case PIPELINE_REQ_TABLE_RULE_TIME_READ:
3070d30ea906Sjfb8856606 rsp = pipeline_msg_handle_table_rule_time_read(p, req);
3071d30ea906Sjfb8856606 break;
3072d30ea906Sjfb8856606
3073d30ea906Sjfb8856606 default:
3074d30ea906Sjfb8856606 rsp = (struct pipeline_msg_rsp *) req;
3075d30ea906Sjfb8856606 rsp->status = -1;
3076d30ea906Sjfb8856606 }
3077d30ea906Sjfb8856606
3078d30ea906Sjfb8856606 pipeline_msg_send(p->msgq_rsp, rsp);
3079d30ea906Sjfb8856606 }
3080d30ea906Sjfb8856606 }
3081d30ea906Sjfb8856606
3082d30ea906Sjfb8856606 /**
3083d30ea906Sjfb8856606 * Data plane threads: main
3084d30ea906Sjfb8856606 */
3085d30ea906Sjfb8856606 int
thread_main(void * arg __rte_unused)3086d30ea906Sjfb8856606 thread_main(void *arg __rte_unused)
3087d30ea906Sjfb8856606 {
3088d30ea906Sjfb8856606 struct thread_data *t;
3089d30ea906Sjfb8856606 uint32_t thread_id, i;
3090d30ea906Sjfb8856606
3091d30ea906Sjfb8856606 thread_id = rte_lcore_id();
3092d30ea906Sjfb8856606 t = &thread_data[thread_id];
3093d30ea906Sjfb8856606
3094d30ea906Sjfb8856606 /* Dispatch loop */
3095a9643ea8Slogwang for (i = 0; ; i++) {
3096d30ea906Sjfb8856606 uint32_t j;
3097a9643ea8Slogwang
3098d30ea906Sjfb8856606 /* Data Plane */
3099d30ea906Sjfb8856606 for (j = 0; j < t->n_pipelines; j++)
3100d30ea906Sjfb8856606 rte_pipeline_run(t->p[j]);
3101a9643ea8Slogwang
3102d30ea906Sjfb8856606 /* Control Plane */
3103a9643ea8Slogwang if ((i & 0xF) == 0) {
3104a9643ea8Slogwang uint64_t time = rte_get_tsc_cycles();
3105d30ea906Sjfb8856606 uint64_t time_next_min = UINT64_MAX;
3106a9643ea8Slogwang
3107d30ea906Sjfb8856606 if (time < t->time_next_min)
3108a9643ea8Slogwang continue;
3109a9643ea8Slogwang
3110d30ea906Sjfb8856606 /* Pipeline message queues */
3111d30ea906Sjfb8856606 for (j = 0; j < t->n_pipelines; j++) {
3112d30ea906Sjfb8856606 struct pipeline_data *p =
3113d30ea906Sjfb8856606 &t->pipeline_data[j];
3114d30ea906Sjfb8856606 uint64_t time_next = p->time_next;
3115a9643ea8Slogwang
3116d30ea906Sjfb8856606 if (time_next <= time) {
3117d30ea906Sjfb8856606 pipeline_msg_handle(p);
3118d30ea906Sjfb8856606 rte_pipeline_flush(p->p);
3119d30ea906Sjfb8856606 time_next = time + p->timer_period;
3120d30ea906Sjfb8856606 p->time_next = time_next;
3121a9643ea8Slogwang }
3122a9643ea8Slogwang
3123d30ea906Sjfb8856606 if (time_next < time_next_min)
3124d30ea906Sjfb8856606 time_next_min = time_next;
3125a9643ea8Slogwang }
3126a9643ea8Slogwang
3127d30ea906Sjfb8856606 /* Thread message queues */
3128a9643ea8Slogwang {
3129d30ea906Sjfb8856606 uint64_t time_next = t->time_next;
3130a9643ea8Slogwang
3131d30ea906Sjfb8856606 if (time_next <= time) {
3132d30ea906Sjfb8856606 thread_msg_handle(t);
3133d30ea906Sjfb8856606 time_next = time + t->timer_period;
3134d30ea906Sjfb8856606 t->time_next = time_next;
3135a9643ea8Slogwang }
3136a9643ea8Slogwang
3137d30ea906Sjfb8856606 if (time_next < time_next_min)
3138d30ea906Sjfb8856606 time_next_min = time_next;
3139a9643ea8Slogwang }
3140a9643ea8Slogwang
3141d30ea906Sjfb8856606 t->time_next_min = time_next_min;
3142a9643ea8Slogwang }
3143a9643ea8Slogwang }
3144a9643ea8Slogwang
3145a9643ea8Slogwang return 0;
3146a9643ea8Slogwang }
3147