1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606 * Copyright(c) 2010-2018 Intel Corporation
3d30ea906Sjfb8856606 */
4d30ea906Sjfb8856606
5d30ea906Sjfb8856606 #include <stdio.h>
6d30ea906Sjfb8856606 #include <stdint.h>
7d30ea906Sjfb8856606 #include <stdlib.h>
8d30ea906Sjfb8856606 #include <string.h>
9d30ea906Sjfb8856606
10d30ea906Sjfb8856606 #include <rte_common.h>
11d30ea906Sjfb8856606 #include <rte_cycles.h>
12d30ea906Sjfb8856606 #include <rte_ethdev.h>
13d30ea906Sjfb8856606
14d30ea906Sjfb8856606 #include "cli.h"
15d30ea906Sjfb8856606
16d30ea906Sjfb8856606 #include "cryptodev.h"
17d30ea906Sjfb8856606 #include "kni.h"
18d30ea906Sjfb8856606 #include "link.h"
19d30ea906Sjfb8856606 #include "mempool.h"
20d30ea906Sjfb8856606 #include "parser.h"
21d30ea906Sjfb8856606 #include "pipeline.h"
22d30ea906Sjfb8856606 #include "swq.h"
23d30ea906Sjfb8856606 #include "tap.h"
24d30ea906Sjfb8856606 #include "thread.h"
25d30ea906Sjfb8856606 #include "tmgr.h"
26d30ea906Sjfb8856606
27d30ea906Sjfb8856606 #ifndef CMD_MAX_TOKENS
28d30ea906Sjfb8856606 #define CMD_MAX_TOKENS 256
29d30ea906Sjfb8856606 #endif
30d30ea906Sjfb8856606
31d30ea906Sjfb8856606 #define MSG_OUT_OF_MEMORY "Not enough memory.\n"
32d30ea906Sjfb8856606 #define MSG_CMD_UNKNOWN "Unknown command \"%s\".\n"
33d30ea906Sjfb8856606 #define MSG_CMD_UNIMPLEM "Command \"%s\" not implemented.\n"
34d30ea906Sjfb8856606 #define MSG_ARG_NOT_ENOUGH "Not enough arguments for command \"%s\".\n"
35d30ea906Sjfb8856606 #define MSG_ARG_TOO_MANY "Too many arguments for command \"%s\".\n"
36d30ea906Sjfb8856606 #define MSG_ARG_MISMATCH "Wrong number of arguments for command \"%s\".\n"
37d30ea906Sjfb8856606 #define MSG_ARG_NOT_FOUND "Argument \"%s\" not found.\n"
38d30ea906Sjfb8856606 #define MSG_ARG_INVALID "Invalid value for argument \"%s\".\n"
39d30ea906Sjfb8856606 #define MSG_FILE_ERR "Error in file \"%s\" at line %u.\n"
40d30ea906Sjfb8856606 #define MSG_FILE_NOT_ENOUGH "Not enough rules in file \"%s\".\n"
41d30ea906Sjfb8856606 #define MSG_CMD_FAIL "Command \"%s\" failed.\n"
42d30ea906Sjfb8856606
43d30ea906Sjfb8856606 static int
is_comment(char * in)44d30ea906Sjfb8856606 is_comment(char *in)
45d30ea906Sjfb8856606 {
46d30ea906Sjfb8856606 if ((strlen(in) && index("!#%;", in[0])) ||
47d30ea906Sjfb8856606 (strncmp(in, "//", 2) == 0) ||
48d30ea906Sjfb8856606 (strncmp(in, "--", 2) == 0))
49d30ea906Sjfb8856606 return 1;
50d30ea906Sjfb8856606
51d30ea906Sjfb8856606 return 0;
52d30ea906Sjfb8856606 }
53d30ea906Sjfb8856606
54d30ea906Sjfb8856606 static const char cmd_mempool_help[] =
55d30ea906Sjfb8856606 "mempool <mempool_name>\n"
56d30ea906Sjfb8856606 " buffer <buffer_size>\n"
57d30ea906Sjfb8856606 " pool <pool_size>\n"
58d30ea906Sjfb8856606 " cache <cache_size>\n"
59d30ea906Sjfb8856606 " cpu <cpu_id>\n";
60d30ea906Sjfb8856606
61d30ea906Sjfb8856606 static void
cmd_mempool(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)62d30ea906Sjfb8856606 cmd_mempool(char **tokens,
63d30ea906Sjfb8856606 uint32_t n_tokens,
64d30ea906Sjfb8856606 char *out,
65d30ea906Sjfb8856606 size_t out_size)
66d30ea906Sjfb8856606 {
67d30ea906Sjfb8856606 struct mempool_params p;
68d30ea906Sjfb8856606 char *name;
69d30ea906Sjfb8856606 struct mempool *mempool;
70d30ea906Sjfb8856606
71d30ea906Sjfb8856606 if (n_tokens != 10) {
72d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
73d30ea906Sjfb8856606 return;
74d30ea906Sjfb8856606 }
75d30ea906Sjfb8856606
76d30ea906Sjfb8856606 name = tokens[1];
77d30ea906Sjfb8856606
78d30ea906Sjfb8856606 if (strcmp(tokens[2], "buffer") != 0) {
79d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "buffer");
80d30ea906Sjfb8856606 return;
81d30ea906Sjfb8856606 }
82d30ea906Sjfb8856606
83d30ea906Sjfb8856606 if (parser_read_uint32(&p.buffer_size, tokens[3]) != 0) {
84d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "buffer_size");
85d30ea906Sjfb8856606 return;
86d30ea906Sjfb8856606 }
87d30ea906Sjfb8856606
88d30ea906Sjfb8856606 if (strcmp(tokens[4], "pool") != 0) {
89d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pool");
90d30ea906Sjfb8856606 return;
91d30ea906Sjfb8856606 }
92d30ea906Sjfb8856606
93d30ea906Sjfb8856606 if (parser_read_uint32(&p.pool_size, tokens[5]) != 0) {
94d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "pool_size");
95d30ea906Sjfb8856606 return;
96d30ea906Sjfb8856606 }
97d30ea906Sjfb8856606
98d30ea906Sjfb8856606 if (strcmp(tokens[6], "cache") != 0) {
99d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cache");
100d30ea906Sjfb8856606 return;
101d30ea906Sjfb8856606 }
102d30ea906Sjfb8856606
103d30ea906Sjfb8856606 if (parser_read_uint32(&p.cache_size, tokens[7]) != 0) {
104d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "cache_size");
105d30ea906Sjfb8856606 return;
106d30ea906Sjfb8856606 }
107d30ea906Sjfb8856606
108d30ea906Sjfb8856606 if (strcmp(tokens[8], "cpu") != 0) {
109d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
110d30ea906Sjfb8856606 return;
111d30ea906Sjfb8856606 }
112d30ea906Sjfb8856606
113d30ea906Sjfb8856606 if (parser_read_uint32(&p.cpu_id, tokens[9]) != 0) {
114d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
115d30ea906Sjfb8856606 return;
116d30ea906Sjfb8856606 }
117d30ea906Sjfb8856606
118d30ea906Sjfb8856606 mempool = mempool_create(name, &p);
119d30ea906Sjfb8856606 if (mempool == NULL) {
120d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
121d30ea906Sjfb8856606 return;
122d30ea906Sjfb8856606 }
123d30ea906Sjfb8856606 }
124d30ea906Sjfb8856606
125d30ea906Sjfb8856606 static const char cmd_link_help[] =
126d30ea906Sjfb8856606 "link <link_name>\n"
127d30ea906Sjfb8856606 " dev <device_name> | port <port_id>\n"
128d30ea906Sjfb8856606 " rxq <n_queues> <queue_size> <mempool_name>\n"
129d30ea906Sjfb8856606 " txq <n_queues> <queue_size>\n"
130d30ea906Sjfb8856606 " promiscuous on | off\n"
131d30ea906Sjfb8856606 " [rss <qid_0> ... <qid_n>]\n";
132d30ea906Sjfb8856606
133d30ea906Sjfb8856606 static void
cmd_link(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)134d30ea906Sjfb8856606 cmd_link(char **tokens,
135d30ea906Sjfb8856606 uint32_t n_tokens,
136d30ea906Sjfb8856606 char *out,
137d30ea906Sjfb8856606 size_t out_size)
138d30ea906Sjfb8856606 {
139d30ea906Sjfb8856606 struct link_params p;
140d30ea906Sjfb8856606 struct link_params_rss rss;
141d30ea906Sjfb8856606 struct link *link;
142d30ea906Sjfb8856606 char *name;
143d30ea906Sjfb8856606
144d30ea906Sjfb8856606 memset(&p, 0, sizeof(p));
145d30ea906Sjfb8856606
146d30ea906Sjfb8856606 if ((n_tokens < 13) || (n_tokens > 14 + LINK_RXQ_RSS_MAX)) {
147d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
148d30ea906Sjfb8856606 return;
149d30ea906Sjfb8856606 }
150d30ea906Sjfb8856606 name = tokens[1];
151d30ea906Sjfb8856606
152d30ea906Sjfb8856606 if (strcmp(tokens[2], "dev") == 0)
153d30ea906Sjfb8856606 p.dev_name = tokens[3];
154d30ea906Sjfb8856606 else if (strcmp(tokens[2], "port") == 0) {
155d30ea906Sjfb8856606 p.dev_name = NULL;
156d30ea906Sjfb8856606
157d30ea906Sjfb8856606 if (parser_read_uint16(&p.port_id, tokens[3]) != 0) {
158d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
159d30ea906Sjfb8856606 return;
160d30ea906Sjfb8856606 }
161d30ea906Sjfb8856606 } else {
162d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "dev or port");
163d30ea906Sjfb8856606 return;
164d30ea906Sjfb8856606 }
165d30ea906Sjfb8856606
166d30ea906Sjfb8856606 if (strcmp(tokens[4], "rxq") != 0) {
167d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rxq");
168d30ea906Sjfb8856606 return;
169d30ea906Sjfb8856606 }
170d30ea906Sjfb8856606
171d30ea906Sjfb8856606 if (parser_read_uint32(&p.rx.n_queues, tokens[5]) != 0) {
172d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "n_queues");
173d30ea906Sjfb8856606 return;
174d30ea906Sjfb8856606 }
175d30ea906Sjfb8856606 if (parser_read_uint32(&p.rx.queue_size, tokens[6]) != 0) {
176d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "queue_size");
177d30ea906Sjfb8856606 return;
178d30ea906Sjfb8856606 }
179d30ea906Sjfb8856606
180d30ea906Sjfb8856606 p.rx.mempool_name = tokens[7];
181d30ea906Sjfb8856606
182d30ea906Sjfb8856606 if (strcmp(tokens[8], "txq") != 0) {
183d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "txq");
184d30ea906Sjfb8856606 return;
185d30ea906Sjfb8856606 }
186d30ea906Sjfb8856606
187d30ea906Sjfb8856606 if (parser_read_uint32(&p.tx.n_queues, tokens[9]) != 0) {
188d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "n_queues");
189d30ea906Sjfb8856606 return;
190d30ea906Sjfb8856606 }
191d30ea906Sjfb8856606
192d30ea906Sjfb8856606 if (parser_read_uint32(&p.tx.queue_size, tokens[10]) != 0) {
193d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "queue_size");
194d30ea906Sjfb8856606 return;
195d30ea906Sjfb8856606 }
196d30ea906Sjfb8856606
197d30ea906Sjfb8856606 if (strcmp(tokens[11], "promiscuous") != 0) {
198d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "promiscuous");
199d30ea906Sjfb8856606 return;
200d30ea906Sjfb8856606 }
201d30ea906Sjfb8856606
202d30ea906Sjfb8856606 if (strcmp(tokens[12], "on") == 0)
203d30ea906Sjfb8856606 p.promiscuous = 1;
204d30ea906Sjfb8856606 else if (strcmp(tokens[12], "off") == 0)
205d30ea906Sjfb8856606 p.promiscuous = 0;
206d30ea906Sjfb8856606 else {
207d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "on or off");
208d30ea906Sjfb8856606 return;
209d30ea906Sjfb8856606 }
210d30ea906Sjfb8856606
211d30ea906Sjfb8856606 /* RSS */
212d30ea906Sjfb8856606 p.rx.rss = NULL;
213d30ea906Sjfb8856606 if (n_tokens > 13) {
214d30ea906Sjfb8856606 uint32_t queue_id, i;
215d30ea906Sjfb8856606
216d30ea906Sjfb8856606 if (strcmp(tokens[13], "rss") != 0) {
217d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rss");
218d30ea906Sjfb8856606 return;
219d30ea906Sjfb8856606 }
220d30ea906Sjfb8856606
221d30ea906Sjfb8856606 p.rx.rss = &rss;
222d30ea906Sjfb8856606
223d30ea906Sjfb8856606 rss.n_queues = 0;
224d30ea906Sjfb8856606 for (i = 14; i < n_tokens; i++) {
225d30ea906Sjfb8856606 if (parser_read_uint32(&queue_id, tokens[i]) != 0) {
226d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
227d30ea906Sjfb8856606 "queue_id");
228d30ea906Sjfb8856606 return;
229d30ea906Sjfb8856606 }
230d30ea906Sjfb8856606
231d30ea906Sjfb8856606 rss.queue_id[rss.n_queues] = queue_id;
232d30ea906Sjfb8856606 rss.n_queues++;
233d30ea906Sjfb8856606 }
234d30ea906Sjfb8856606 }
235d30ea906Sjfb8856606
236d30ea906Sjfb8856606 link = link_create(name, &p);
237d30ea906Sjfb8856606 if (link == NULL) {
238d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
239d30ea906Sjfb8856606 return;
240d30ea906Sjfb8856606 }
241d30ea906Sjfb8856606 }
242d30ea906Sjfb8856606
243d30ea906Sjfb8856606 /* Print the link stats and info */
244d30ea906Sjfb8856606 static void
print_link_info(struct link * link,char * out,size_t out_size)245d30ea906Sjfb8856606 print_link_info(struct link *link, char *out, size_t out_size)
246d30ea906Sjfb8856606 {
247d30ea906Sjfb8856606 struct rte_eth_stats stats;
2484418919fSjohnjiang struct rte_ether_addr mac_addr;
249d30ea906Sjfb8856606 struct rte_eth_link eth_link;
250d30ea906Sjfb8856606 uint16_t mtu;
2514418919fSjohnjiang int ret;
252d30ea906Sjfb8856606
253d30ea906Sjfb8856606 memset(&stats, 0, sizeof(stats));
254d30ea906Sjfb8856606 rte_eth_stats_get(link->port_id, &stats);
255d30ea906Sjfb8856606
2564418919fSjohnjiang ret = rte_eth_macaddr_get(link->port_id, &mac_addr);
2574418919fSjohnjiang if (ret != 0) {
2584418919fSjohnjiang snprintf(out, out_size, "\n%s: MAC address get failed: %s",
2594418919fSjohnjiang link->name, rte_strerror(-ret));
2604418919fSjohnjiang return;
2614418919fSjohnjiang }
2624418919fSjohnjiang
2634418919fSjohnjiang ret = rte_eth_link_get(link->port_id, ð_link);
2644418919fSjohnjiang if (ret < 0) {
2654418919fSjohnjiang snprintf(out, out_size, "\n%s: link get failed: %s",
2664418919fSjohnjiang link->name, rte_strerror(-ret));
2674418919fSjohnjiang return;
2684418919fSjohnjiang }
2694418919fSjohnjiang
270d30ea906Sjfb8856606 rte_eth_dev_get_mtu(link->port_id, &mtu);
271d30ea906Sjfb8856606
272d30ea906Sjfb8856606 snprintf(out, out_size,
273d30ea906Sjfb8856606 "\n"
274d30ea906Sjfb8856606 "%s: flags=<%s> mtu %u\n"
275d30ea906Sjfb8856606 "\tether %02X:%02X:%02X:%02X:%02X:%02X rxqueues %u txqueues %u\n"
276*2d9fd380Sjfb8856606 "\tport# %u speed %s\n"
277d30ea906Sjfb8856606 "\tRX packets %" PRIu64" bytes %" PRIu64"\n"
278d30ea906Sjfb8856606 "\tRX errors %" PRIu64" missed %" PRIu64" no-mbuf %" PRIu64"\n"
279d30ea906Sjfb8856606 "\tTX packets %" PRIu64" bytes %" PRIu64"\n"
280d30ea906Sjfb8856606 "\tTX errors %" PRIu64"\n",
281d30ea906Sjfb8856606 link->name,
282d30ea906Sjfb8856606 eth_link.link_status == 0 ? "DOWN" : "UP",
283d30ea906Sjfb8856606 mtu,
284d30ea906Sjfb8856606 mac_addr.addr_bytes[0], mac_addr.addr_bytes[1],
285d30ea906Sjfb8856606 mac_addr.addr_bytes[2], mac_addr.addr_bytes[3],
286d30ea906Sjfb8856606 mac_addr.addr_bytes[4], mac_addr.addr_bytes[5],
287d30ea906Sjfb8856606 link->n_rxq,
288d30ea906Sjfb8856606 link->n_txq,
289d30ea906Sjfb8856606 link->port_id,
290*2d9fd380Sjfb8856606 rte_eth_link_speed_to_str(eth_link.link_speed),
291d30ea906Sjfb8856606 stats.ipackets,
292d30ea906Sjfb8856606 stats.ibytes,
293d30ea906Sjfb8856606 stats.ierrors,
294d30ea906Sjfb8856606 stats.imissed,
295d30ea906Sjfb8856606 stats.rx_nombuf,
296d30ea906Sjfb8856606 stats.opackets,
297d30ea906Sjfb8856606 stats.obytes,
298d30ea906Sjfb8856606 stats.oerrors);
299d30ea906Sjfb8856606 }
300d30ea906Sjfb8856606
301d30ea906Sjfb8856606 /*
302d30ea906Sjfb8856606 * link show [<link_name>]
303d30ea906Sjfb8856606 */
304d30ea906Sjfb8856606 static void
cmd_link_show(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)305d30ea906Sjfb8856606 cmd_link_show(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
306d30ea906Sjfb8856606 {
307d30ea906Sjfb8856606 struct link *link;
308d30ea906Sjfb8856606 char *link_name;
309d30ea906Sjfb8856606
310d30ea906Sjfb8856606 if (n_tokens != 2 && n_tokens != 3) {
311d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
312d30ea906Sjfb8856606 return;
313d30ea906Sjfb8856606 }
314d30ea906Sjfb8856606
315d30ea906Sjfb8856606 if (n_tokens == 2) {
316d30ea906Sjfb8856606 link = link_next(NULL);
317d30ea906Sjfb8856606
318d30ea906Sjfb8856606 while (link != NULL) {
319d30ea906Sjfb8856606 out_size = out_size - strlen(out);
320d30ea906Sjfb8856606 out = &out[strlen(out)];
321d30ea906Sjfb8856606
322d30ea906Sjfb8856606 print_link_info(link, out, out_size);
323d30ea906Sjfb8856606 link = link_next(link);
324d30ea906Sjfb8856606 }
325d30ea906Sjfb8856606 } else {
326d30ea906Sjfb8856606 out_size = out_size - strlen(out);
327d30ea906Sjfb8856606 out = &out[strlen(out)];
328d30ea906Sjfb8856606
329d30ea906Sjfb8856606 link_name = tokens[2];
330d30ea906Sjfb8856606 link = link_find(link_name);
331d30ea906Sjfb8856606
332d30ea906Sjfb8856606 if (link == NULL) {
333d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
334d30ea906Sjfb8856606 "Link does not exist");
335d30ea906Sjfb8856606 return;
336d30ea906Sjfb8856606 }
337d30ea906Sjfb8856606 print_link_info(link, out, out_size);
338d30ea906Sjfb8856606 }
339d30ea906Sjfb8856606 }
340d30ea906Sjfb8856606
341d30ea906Sjfb8856606 static const char cmd_swq_help[] =
342d30ea906Sjfb8856606 "swq <swq_name>\n"
343d30ea906Sjfb8856606 " size <size>\n"
344d30ea906Sjfb8856606 " cpu <cpu_id>\n";
345d30ea906Sjfb8856606
346d30ea906Sjfb8856606 static void
cmd_swq(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)347d30ea906Sjfb8856606 cmd_swq(char **tokens,
348d30ea906Sjfb8856606 uint32_t n_tokens,
349d30ea906Sjfb8856606 char *out,
350d30ea906Sjfb8856606 size_t out_size)
351d30ea906Sjfb8856606 {
352d30ea906Sjfb8856606 struct swq_params p;
353d30ea906Sjfb8856606 char *name;
354d30ea906Sjfb8856606 struct swq *swq;
355d30ea906Sjfb8856606
356d30ea906Sjfb8856606 if (n_tokens != 6) {
357d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
358d30ea906Sjfb8856606 return;
359d30ea906Sjfb8856606 }
360d30ea906Sjfb8856606
361d30ea906Sjfb8856606 name = tokens[1];
362d30ea906Sjfb8856606
363d30ea906Sjfb8856606 if (strcmp(tokens[2], "size") != 0) {
364d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
365d30ea906Sjfb8856606 return;
366d30ea906Sjfb8856606 }
367d30ea906Sjfb8856606
368d30ea906Sjfb8856606 if (parser_read_uint32(&p.size, tokens[3]) != 0) {
369d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "size");
370d30ea906Sjfb8856606 return;
371d30ea906Sjfb8856606 }
372d30ea906Sjfb8856606
373d30ea906Sjfb8856606 if (strcmp(tokens[4], "cpu") != 0) {
374d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
375d30ea906Sjfb8856606 return;
376d30ea906Sjfb8856606 }
377d30ea906Sjfb8856606
378d30ea906Sjfb8856606 if (parser_read_uint32(&p.cpu_id, tokens[5]) != 0) {
379d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
380d30ea906Sjfb8856606 return;
381d30ea906Sjfb8856606 }
382d30ea906Sjfb8856606
383d30ea906Sjfb8856606 swq = swq_create(name, &p);
384d30ea906Sjfb8856606 if (swq == NULL) {
385d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
386d30ea906Sjfb8856606 return;
387d30ea906Sjfb8856606 }
388d30ea906Sjfb8856606 }
389d30ea906Sjfb8856606
390d30ea906Sjfb8856606 static const char cmd_tmgr_subport_profile_help[] =
391d30ea906Sjfb8856606 "tmgr subport profile\n"
392d30ea906Sjfb8856606 " <tb_rate> <tb_size>\n"
3934418919fSjohnjiang " <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate> <tc4_rate>"
3944418919fSjohnjiang " <tc5_rate> <tc6_rate> <tc7_rate> <tc8_rate>"
3954418919fSjohnjiang " <tc9_rate> <tc10_rate> <tc11_rate> <tc12_rate>\n"
396*2d9fd380Sjfb8856606 " <tc_period>\n";
397d30ea906Sjfb8856606
398d30ea906Sjfb8856606 static void
cmd_tmgr_subport_profile(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)399d30ea906Sjfb8856606 cmd_tmgr_subport_profile(char **tokens,
400d30ea906Sjfb8856606 uint32_t n_tokens,
401d30ea906Sjfb8856606 char *out,
402d30ea906Sjfb8856606 size_t out_size)
403d30ea906Sjfb8856606 {
404*2d9fd380Sjfb8856606 struct rte_sched_subport_profile_params subport_profile;
405d30ea906Sjfb8856606 int status, i;
406d30ea906Sjfb8856606
407*2d9fd380Sjfb8856606 if (n_tokens != 19) {
408d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
409d30ea906Sjfb8856606 return;
410d30ea906Sjfb8856606 }
411d30ea906Sjfb8856606
412*2d9fd380Sjfb8856606 if (parser_read_uint64(&subport_profile.tb_rate, tokens[3]) != 0) {
413d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "tb_rate");
414d30ea906Sjfb8856606 return;
415d30ea906Sjfb8856606 }
416d30ea906Sjfb8856606
417*2d9fd380Sjfb8856606 if (parser_read_uint64(&subport_profile.tb_size, tokens[4]) != 0) {
418d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "tb_size");
419d30ea906Sjfb8856606 return;
420d30ea906Sjfb8856606 }
421d30ea906Sjfb8856606
422d30ea906Sjfb8856606 for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
423*2d9fd380Sjfb8856606 if (parser_read_uint64(&subport_profile.tc_rate[i],
424*2d9fd380Sjfb8856606 tokens[5 + i]) != 0) {
425d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "tc_rate");
426d30ea906Sjfb8856606 return;
427d30ea906Sjfb8856606 }
428d30ea906Sjfb8856606
429*2d9fd380Sjfb8856606 if (parser_read_uint64(&subport_profile.tc_period, tokens[18]) != 0) {
430d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "tc_period");
431d30ea906Sjfb8856606 return;
432d30ea906Sjfb8856606 }
433d30ea906Sjfb8856606
434*2d9fd380Sjfb8856606 status = tmgr_subport_profile_add(&subport_profile);
435d30ea906Sjfb8856606 if (status != 0) {
436d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
437d30ea906Sjfb8856606 return;
438d30ea906Sjfb8856606 }
439d30ea906Sjfb8856606 }
440d30ea906Sjfb8856606
441d30ea906Sjfb8856606 static const char cmd_tmgr_pipe_profile_help[] =
442d30ea906Sjfb8856606 "tmgr pipe profile\n"
443d30ea906Sjfb8856606 " <tb_rate> <tb_size>\n"
4444418919fSjohnjiang " <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate> <tc4_rate>"
4454418919fSjohnjiang " <tc5_rate> <tc6_rate> <tc7_rate> <tc8_rate>"
4464418919fSjohnjiang " <tc9_rate> <tc10_rate> <tc11_rate> <tc12_rate>\n"
447d30ea906Sjfb8856606 " <tc_period>\n"
448d30ea906Sjfb8856606 " <tc_ov_weight>\n"
4494418919fSjohnjiang " <wrr_weight0..3>\n";
450d30ea906Sjfb8856606
451d30ea906Sjfb8856606 static void
cmd_tmgr_pipe_profile(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)452d30ea906Sjfb8856606 cmd_tmgr_pipe_profile(char **tokens,
453d30ea906Sjfb8856606 uint32_t n_tokens,
454d30ea906Sjfb8856606 char *out,
455d30ea906Sjfb8856606 size_t out_size)
456d30ea906Sjfb8856606 {
457d30ea906Sjfb8856606 struct rte_sched_pipe_params p;
458d30ea906Sjfb8856606 int status, i;
459d30ea906Sjfb8856606
4604418919fSjohnjiang if (n_tokens != 24) {
461d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
462d30ea906Sjfb8856606 return;
463d30ea906Sjfb8856606 }
464d30ea906Sjfb8856606
4654418919fSjohnjiang if (parser_read_uint64(&p.tb_rate, tokens[3]) != 0) {
466d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "tb_rate");
467d30ea906Sjfb8856606 return;
468d30ea906Sjfb8856606 }
469d30ea906Sjfb8856606
4704418919fSjohnjiang if (parser_read_uint64(&p.tb_size, tokens[4]) != 0) {
471d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "tb_size");
472d30ea906Sjfb8856606 return;
473d30ea906Sjfb8856606 }
474d30ea906Sjfb8856606
475d30ea906Sjfb8856606 for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
4764418919fSjohnjiang if (parser_read_uint64(&p.tc_rate[i], tokens[5 + i]) != 0) {
477d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "tc_rate");
478d30ea906Sjfb8856606 return;
479d30ea906Sjfb8856606 }
480d30ea906Sjfb8856606
4814418919fSjohnjiang if (parser_read_uint64(&p.tc_period, tokens[18]) != 0) {
482d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "tc_period");
483d30ea906Sjfb8856606 return;
484d30ea906Sjfb8856606 }
485d30ea906Sjfb8856606
4864418919fSjohnjiang if (parser_read_uint8(&p.tc_ov_weight, tokens[19]) != 0) {
487d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "tc_ov_weight");
488d30ea906Sjfb8856606 return;
489d30ea906Sjfb8856606 }
490d30ea906Sjfb8856606
4914418919fSjohnjiang for (i = 0; i < RTE_SCHED_BE_QUEUES_PER_PIPE; i++)
4924418919fSjohnjiang if (parser_read_uint8(&p.wrr_weights[i], tokens[20 + i]) != 0) {
493d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "wrr_weights");
494d30ea906Sjfb8856606 return;
495d30ea906Sjfb8856606 }
496d30ea906Sjfb8856606
497d30ea906Sjfb8856606 status = tmgr_pipe_profile_add(&p);
498d30ea906Sjfb8856606 if (status != 0) {
499d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
500d30ea906Sjfb8856606 return;
501d30ea906Sjfb8856606 }
502d30ea906Sjfb8856606 }
503d30ea906Sjfb8856606
504d30ea906Sjfb8856606 static const char cmd_tmgr_help[] =
505d30ea906Sjfb8856606 "tmgr <tmgr_name>\n"
506d30ea906Sjfb8856606 " rate <rate>\n"
507d30ea906Sjfb8856606 " spp <n_subports_per_port>\n"
508*2d9fd380Sjfb8856606 " pps <n_pipes_per_subport>\n"
509d30ea906Sjfb8856606 " fo <frame_overhead>\n"
510d30ea906Sjfb8856606 " mtu <mtu>\n"
511d30ea906Sjfb8856606 " cpu <cpu_id>\n";
512d30ea906Sjfb8856606
513d30ea906Sjfb8856606 static void
cmd_tmgr(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)514d30ea906Sjfb8856606 cmd_tmgr(char **tokens,
515d30ea906Sjfb8856606 uint32_t n_tokens,
516d30ea906Sjfb8856606 char *out,
517d30ea906Sjfb8856606 size_t out_size)
518d30ea906Sjfb8856606 {
519d30ea906Sjfb8856606 struct tmgr_port_params p;
520d30ea906Sjfb8856606 char *name;
521d30ea906Sjfb8856606 struct tmgr_port *tmgr_port;
522d30ea906Sjfb8856606
523*2d9fd380Sjfb8856606 if (n_tokens != 14) {
524d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
525d30ea906Sjfb8856606 return;
526d30ea906Sjfb8856606 }
527d30ea906Sjfb8856606
528d30ea906Sjfb8856606 name = tokens[1];
529d30ea906Sjfb8856606
530d30ea906Sjfb8856606 if (strcmp(tokens[2], "rate") != 0) {
531d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rate");
532d30ea906Sjfb8856606 return;
533d30ea906Sjfb8856606 }
534d30ea906Sjfb8856606
5354418919fSjohnjiang if (parser_read_uint64(&p.rate, tokens[3]) != 0) {
536d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "rate");
537d30ea906Sjfb8856606 return;
538d30ea906Sjfb8856606 }
539d30ea906Sjfb8856606
540d30ea906Sjfb8856606 if (strcmp(tokens[4], "spp") != 0) {
541d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "spp");
542d30ea906Sjfb8856606 return;
543d30ea906Sjfb8856606 }
544d30ea906Sjfb8856606
545d30ea906Sjfb8856606 if (parser_read_uint32(&p.n_subports_per_port, tokens[5]) != 0) {
546d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "n_subports_per_port");
547d30ea906Sjfb8856606 return;
548d30ea906Sjfb8856606 }
549d30ea906Sjfb8856606
550*2d9fd380Sjfb8856606 if (strcmp(tokens[6], "pps") != 0) {
551*2d9fd380Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "spp");
552*2d9fd380Sjfb8856606 return;
553*2d9fd380Sjfb8856606 }
554*2d9fd380Sjfb8856606
555*2d9fd380Sjfb8856606 if (parser_read_uint32(&p.n_pipes_per_subport, tokens[7]) != 0) {
556*2d9fd380Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "n_pipes_per_subport");
557*2d9fd380Sjfb8856606 return;
558*2d9fd380Sjfb8856606 }
559*2d9fd380Sjfb8856606
560*2d9fd380Sjfb8856606 if (strcmp(tokens[8], "fo") != 0) {
561d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "fo");
562d30ea906Sjfb8856606 return;
563d30ea906Sjfb8856606 }
564d30ea906Sjfb8856606
565*2d9fd380Sjfb8856606 if (parser_read_uint32(&p.frame_overhead, tokens[9]) != 0) {
566d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "frame_overhead");
567d30ea906Sjfb8856606 return;
568d30ea906Sjfb8856606 }
569d30ea906Sjfb8856606
570*2d9fd380Sjfb8856606 if (strcmp(tokens[10], "mtu") != 0) {
571d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mtu");
572d30ea906Sjfb8856606 return;
573d30ea906Sjfb8856606 }
574d30ea906Sjfb8856606
575*2d9fd380Sjfb8856606 if (parser_read_uint32(&p.mtu, tokens[11]) != 0) {
576d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "mtu");
577d30ea906Sjfb8856606 return;
578d30ea906Sjfb8856606 }
579d30ea906Sjfb8856606
580*2d9fd380Sjfb8856606 if (strcmp(tokens[12], "cpu") != 0) {
581d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
582d30ea906Sjfb8856606 return;
583d30ea906Sjfb8856606 }
584d30ea906Sjfb8856606
585*2d9fd380Sjfb8856606 if (parser_read_uint32(&p.cpu_id, tokens[13]) != 0) {
586d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
587d30ea906Sjfb8856606 return;
588d30ea906Sjfb8856606 }
589d30ea906Sjfb8856606
590d30ea906Sjfb8856606 tmgr_port = tmgr_port_create(name, &p);
591d30ea906Sjfb8856606 if (tmgr_port == NULL) {
592d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
593d30ea906Sjfb8856606 return;
594d30ea906Sjfb8856606 }
595d30ea906Sjfb8856606 }
596d30ea906Sjfb8856606
597d30ea906Sjfb8856606 static const char cmd_tmgr_subport_help[] =
598d30ea906Sjfb8856606 "tmgr <tmgr_name> subport <subport_id>\n"
599d30ea906Sjfb8856606 " profile <subport_profile_id>\n";
600d30ea906Sjfb8856606
601d30ea906Sjfb8856606 static void
cmd_tmgr_subport(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)602d30ea906Sjfb8856606 cmd_tmgr_subport(char **tokens,
603d30ea906Sjfb8856606 uint32_t n_tokens,
604d30ea906Sjfb8856606 char *out,
605d30ea906Sjfb8856606 size_t out_size)
606d30ea906Sjfb8856606 {
607d30ea906Sjfb8856606 uint32_t subport_id, subport_profile_id;
608d30ea906Sjfb8856606 int status;
609d30ea906Sjfb8856606 char *name;
610d30ea906Sjfb8856606
611d30ea906Sjfb8856606 if (n_tokens != 6) {
612d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
613d30ea906Sjfb8856606 return;
614d30ea906Sjfb8856606 }
615d30ea906Sjfb8856606
616d30ea906Sjfb8856606 name = tokens[1];
617d30ea906Sjfb8856606
618d30ea906Sjfb8856606 if (parser_read_uint32(&subport_id, tokens[3]) != 0) {
619d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "subport_id");
620d30ea906Sjfb8856606 return;
621d30ea906Sjfb8856606 }
622d30ea906Sjfb8856606
623d30ea906Sjfb8856606 if (parser_read_uint32(&subport_profile_id, tokens[5]) != 0) {
624d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "subport_profile_id");
625d30ea906Sjfb8856606 return;
626d30ea906Sjfb8856606 }
627d30ea906Sjfb8856606
628d30ea906Sjfb8856606 status = tmgr_subport_config(name, subport_id, subport_profile_id);
629d30ea906Sjfb8856606 if (status) {
630d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
631d30ea906Sjfb8856606 return;
632d30ea906Sjfb8856606 }
633d30ea906Sjfb8856606 }
634d30ea906Sjfb8856606
635d30ea906Sjfb8856606
636d30ea906Sjfb8856606 static const char cmd_tmgr_subport_pipe_help[] =
637d30ea906Sjfb8856606 "tmgr <tmgr_name> subport <subport_id> pipe\n"
638d30ea906Sjfb8856606 " from <pipe_id_first> to <pipe_id_last>\n"
639d30ea906Sjfb8856606 " profile <pipe_profile_id>\n";
640d30ea906Sjfb8856606
641d30ea906Sjfb8856606 static void
cmd_tmgr_subport_pipe(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)642d30ea906Sjfb8856606 cmd_tmgr_subport_pipe(char **tokens,
643d30ea906Sjfb8856606 uint32_t n_tokens,
644d30ea906Sjfb8856606 char *out,
645d30ea906Sjfb8856606 size_t out_size)
646d30ea906Sjfb8856606 {
647d30ea906Sjfb8856606 uint32_t subport_id, pipe_id_first, pipe_id_last, pipe_profile_id;
648d30ea906Sjfb8856606 int status;
649d30ea906Sjfb8856606 char *name;
650d30ea906Sjfb8856606
651d30ea906Sjfb8856606 if (n_tokens != 11) {
652d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
653d30ea906Sjfb8856606 return;
654d30ea906Sjfb8856606 }
655d30ea906Sjfb8856606
656d30ea906Sjfb8856606 name = tokens[1];
657d30ea906Sjfb8856606
658d30ea906Sjfb8856606 if (parser_read_uint32(&subport_id, tokens[3]) != 0) {
659d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "subport_id");
660d30ea906Sjfb8856606 return;
661d30ea906Sjfb8856606 }
662d30ea906Sjfb8856606
663d30ea906Sjfb8856606 if (strcmp(tokens[4], "pipe") != 0) {
664d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipe");
665d30ea906Sjfb8856606 return;
666d30ea906Sjfb8856606 }
667d30ea906Sjfb8856606
668d30ea906Sjfb8856606 if (strcmp(tokens[5], "from") != 0) {
669d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "from");
670d30ea906Sjfb8856606 return;
671d30ea906Sjfb8856606 }
672d30ea906Sjfb8856606
673d30ea906Sjfb8856606 if (parser_read_uint32(&pipe_id_first, tokens[6]) != 0) {
674d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "pipe_id_first");
675d30ea906Sjfb8856606 return;
676d30ea906Sjfb8856606 }
677d30ea906Sjfb8856606
678d30ea906Sjfb8856606 if (strcmp(tokens[7], "to") != 0) {
679d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "to");
680d30ea906Sjfb8856606 return;
681d30ea906Sjfb8856606 }
682d30ea906Sjfb8856606
683d30ea906Sjfb8856606 if (parser_read_uint32(&pipe_id_last, tokens[8]) != 0) {
684d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "pipe_id_last");
685d30ea906Sjfb8856606 return;
686d30ea906Sjfb8856606 }
687d30ea906Sjfb8856606
688d30ea906Sjfb8856606 if (strcmp(tokens[9], "profile") != 0) {
689d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
690d30ea906Sjfb8856606 return;
691d30ea906Sjfb8856606 }
692d30ea906Sjfb8856606
693d30ea906Sjfb8856606 if (parser_read_uint32(&pipe_profile_id, tokens[10]) != 0) {
694d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "pipe_profile_id");
695d30ea906Sjfb8856606 return;
696d30ea906Sjfb8856606 }
697d30ea906Sjfb8856606
698d30ea906Sjfb8856606 status = tmgr_pipe_config(name, subport_id, pipe_id_first,
699d30ea906Sjfb8856606 pipe_id_last, pipe_profile_id);
700d30ea906Sjfb8856606 if (status) {
701d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
702d30ea906Sjfb8856606 return;
703d30ea906Sjfb8856606 }
704d30ea906Sjfb8856606 }
705d30ea906Sjfb8856606
706d30ea906Sjfb8856606
707d30ea906Sjfb8856606 static const char cmd_tap_help[] =
708d30ea906Sjfb8856606 "tap <tap_name>\n";
709d30ea906Sjfb8856606
710d30ea906Sjfb8856606 static void
cmd_tap(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)711d30ea906Sjfb8856606 cmd_tap(char **tokens,
712d30ea906Sjfb8856606 uint32_t n_tokens,
713d30ea906Sjfb8856606 char *out,
714d30ea906Sjfb8856606 size_t out_size)
715d30ea906Sjfb8856606 {
716d30ea906Sjfb8856606 char *name;
717d30ea906Sjfb8856606 struct tap *tap;
718d30ea906Sjfb8856606
719d30ea906Sjfb8856606 if (n_tokens != 2) {
720d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
721d30ea906Sjfb8856606 return;
722d30ea906Sjfb8856606 }
723d30ea906Sjfb8856606
724d30ea906Sjfb8856606 name = tokens[1];
725d30ea906Sjfb8856606
726d30ea906Sjfb8856606 tap = tap_create(name);
727d30ea906Sjfb8856606 if (tap == NULL) {
728d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
729d30ea906Sjfb8856606 return;
730d30ea906Sjfb8856606 }
731d30ea906Sjfb8856606 }
732d30ea906Sjfb8856606
733d30ea906Sjfb8856606 static const char cmd_kni_help[] =
734d30ea906Sjfb8856606 "kni <kni_name>\n"
735d30ea906Sjfb8856606 " link <link_name>\n"
736d30ea906Sjfb8856606 " mempool <mempool_name>\n"
737d30ea906Sjfb8856606 " [thread <thread_id>]\n";
738d30ea906Sjfb8856606
739d30ea906Sjfb8856606 static void
cmd_kni(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)740d30ea906Sjfb8856606 cmd_kni(char **tokens,
741d30ea906Sjfb8856606 uint32_t n_tokens,
742d30ea906Sjfb8856606 char *out,
743d30ea906Sjfb8856606 size_t out_size)
744d30ea906Sjfb8856606 {
745d30ea906Sjfb8856606 struct kni_params p;
746d30ea906Sjfb8856606 char *name;
747d30ea906Sjfb8856606 struct kni *kni;
748d30ea906Sjfb8856606
749d30ea906Sjfb8856606 memset(&p, 0, sizeof(p));
750d30ea906Sjfb8856606 if ((n_tokens != 6) && (n_tokens != 8)) {
751d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
752d30ea906Sjfb8856606 return;
753d30ea906Sjfb8856606 }
754d30ea906Sjfb8856606
755d30ea906Sjfb8856606 name = tokens[1];
756d30ea906Sjfb8856606
757d30ea906Sjfb8856606 if (strcmp(tokens[2], "link") != 0) {
758d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "link");
759d30ea906Sjfb8856606 return;
760d30ea906Sjfb8856606 }
761d30ea906Sjfb8856606
762d30ea906Sjfb8856606 p.link_name = tokens[3];
763d30ea906Sjfb8856606
764d30ea906Sjfb8856606 if (strcmp(tokens[4], "mempool") != 0) {
765d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mempool");
766d30ea906Sjfb8856606 return;
767d30ea906Sjfb8856606 }
768d30ea906Sjfb8856606
769d30ea906Sjfb8856606 p.mempool_name = tokens[5];
770d30ea906Sjfb8856606
771d30ea906Sjfb8856606 if (n_tokens == 8) {
772d30ea906Sjfb8856606 if (strcmp(tokens[6], "thread") != 0) {
773d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "thread");
774d30ea906Sjfb8856606 return;
775d30ea906Sjfb8856606 }
776d30ea906Sjfb8856606
777d30ea906Sjfb8856606 if (parser_read_uint32(&p.thread_id, tokens[7]) != 0) {
778d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
779d30ea906Sjfb8856606 return;
780d30ea906Sjfb8856606 }
781d30ea906Sjfb8856606
782d30ea906Sjfb8856606 p.force_bind = 1;
783d30ea906Sjfb8856606 } else
784d30ea906Sjfb8856606 p.force_bind = 0;
785d30ea906Sjfb8856606
786d30ea906Sjfb8856606 kni = kni_create(name, &p);
787d30ea906Sjfb8856606 if (kni == NULL) {
788d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
789d30ea906Sjfb8856606 return;
790d30ea906Sjfb8856606 }
791d30ea906Sjfb8856606 }
792d30ea906Sjfb8856606
793d30ea906Sjfb8856606 static const char cmd_cryptodev_help[] =
794d30ea906Sjfb8856606 "cryptodev <cryptodev_name>\n"
795d30ea906Sjfb8856606 " dev <device_name> | dev_id <device_id>\n"
7964418919fSjohnjiang " queue <n_queues> <queue_size>\n"
7974418919fSjohnjiang " max_sessions <n_sessions>";
798d30ea906Sjfb8856606
799d30ea906Sjfb8856606 static void
cmd_cryptodev(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)800d30ea906Sjfb8856606 cmd_cryptodev(char **tokens,
801d30ea906Sjfb8856606 uint32_t n_tokens,
802d30ea906Sjfb8856606 char *out,
803d30ea906Sjfb8856606 size_t out_size)
804d30ea906Sjfb8856606 {
805d30ea906Sjfb8856606 struct cryptodev_params params;
806d30ea906Sjfb8856606 char *name;
807d30ea906Sjfb8856606
808d30ea906Sjfb8856606 memset(¶ms, 0, sizeof(params));
8094418919fSjohnjiang if (n_tokens != 9) {
810d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
811d30ea906Sjfb8856606 return;
812d30ea906Sjfb8856606 }
813d30ea906Sjfb8856606
814d30ea906Sjfb8856606 name = tokens[1];
815d30ea906Sjfb8856606
816d30ea906Sjfb8856606 if (strcmp(tokens[2], "dev") == 0)
817d30ea906Sjfb8856606 params.dev_name = tokens[3];
818d30ea906Sjfb8856606 else if (strcmp(tokens[2], "dev_id") == 0) {
819d30ea906Sjfb8856606 if (parser_read_uint32(¶ms.dev_id, tokens[3]) < 0) {
820d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
821d30ea906Sjfb8856606 "dev_id");
822d30ea906Sjfb8856606 return;
823d30ea906Sjfb8856606 }
824d30ea906Sjfb8856606 } else {
825d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
826d30ea906Sjfb8856606 "cryptodev");
827d30ea906Sjfb8856606 return;
828d30ea906Sjfb8856606 }
829d30ea906Sjfb8856606
830d30ea906Sjfb8856606 if (strcmp(tokens[4], "queue")) {
831d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
8324418919fSjohnjiang "queue");
833d30ea906Sjfb8856606 return;
834d30ea906Sjfb8856606 }
835d30ea906Sjfb8856606
836d30ea906Sjfb8856606 if (parser_read_uint32(¶ms.n_queues, tokens[5]) < 0) {
837d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
838d30ea906Sjfb8856606 "q");
839d30ea906Sjfb8856606 return;
840d30ea906Sjfb8856606 }
841d30ea906Sjfb8856606
842d30ea906Sjfb8856606 if (parser_read_uint32(¶ms.queue_size, tokens[6]) < 0) {
843d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
844d30ea906Sjfb8856606 "queue_size");
845d30ea906Sjfb8856606 return;
846d30ea906Sjfb8856606 }
847d30ea906Sjfb8856606
8484418919fSjohnjiang if (strcmp(tokens[7], "max_sessions")) {
8494418919fSjohnjiang snprintf(out, out_size, MSG_ARG_NOT_FOUND,
8504418919fSjohnjiang "max_sessions");
8514418919fSjohnjiang return;
8524418919fSjohnjiang }
8534418919fSjohnjiang
8544418919fSjohnjiang if (parser_read_uint32(¶ms.session_pool_size, tokens[8]) < 0) {
8554418919fSjohnjiang snprintf(out, out_size, MSG_ARG_INVALID,
8564418919fSjohnjiang "queue_size");
8574418919fSjohnjiang return;
8584418919fSjohnjiang }
8594418919fSjohnjiang
860d30ea906Sjfb8856606 if (cryptodev_create(name, ¶ms) == NULL) {
861d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
862d30ea906Sjfb8856606 return;
863d30ea906Sjfb8856606 }
864d30ea906Sjfb8856606 }
865d30ea906Sjfb8856606
866d30ea906Sjfb8856606 static const char cmd_port_in_action_profile_help[] =
867d30ea906Sjfb8856606 "port in action profile <profile_name>\n"
868d30ea906Sjfb8856606 " [filter match | mismatch offset <key_offset> mask <key_mask> key <key_value> port <port_id>]\n"
869d30ea906Sjfb8856606 " [balance offset <key_offset> mask <key_mask> port <port_id0> ... <port_id15>]\n";
870d30ea906Sjfb8856606
871d30ea906Sjfb8856606 static void
cmd_port_in_action_profile(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)872d30ea906Sjfb8856606 cmd_port_in_action_profile(char **tokens,
873d30ea906Sjfb8856606 uint32_t n_tokens,
874d30ea906Sjfb8856606 char *out,
875d30ea906Sjfb8856606 size_t out_size)
876d30ea906Sjfb8856606 {
877d30ea906Sjfb8856606 struct port_in_action_profile_params p;
878d30ea906Sjfb8856606 struct port_in_action_profile *ap;
879d30ea906Sjfb8856606 char *name;
880d30ea906Sjfb8856606 uint32_t t0;
881d30ea906Sjfb8856606
882d30ea906Sjfb8856606 memset(&p, 0, sizeof(p));
883d30ea906Sjfb8856606
884d30ea906Sjfb8856606 if (n_tokens < 5) {
885d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
886d30ea906Sjfb8856606 return;
887d30ea906Sjfb8856606 }
888d30ea906Sjfb8856606
889d30ea906Sjfb8856606 if (strcmp(tokens[1], "in") != 0) {
890d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
891d30ea906Sjfb8856606 return;
892d30ea906Sjfb8856606 }
893d30ea906Sjfb8856606
894d30ea906Sjfb8856606 if (strcmp(tokens[2], "action") != 0) {
895d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "action");
896d30ea906Sjfb8856606 return;
897d30ea906Sjfb8856606 }
898d30ea906Sjfb8856606
899d30ea906Sjfb8856606 if (strcmp(tokens[3], "profile") != 0) {
900d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
901d30ea906Sjfb8856606 return;
902d30ea906Sjfb8856606 }
903d30ea906Sjfb8856606
904d30ea906Sjfb8856606 name = tokens[4];
905d30ea906Sjfb8856606
906d30ea906Sjfb8856606 t0 = 5;
907d30ea906Sjfb8856606
908d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "filter") == 0)) {
909d30ea906Sjfb8856606 uint32_t size;
910d30ea906Sjfb8856606
911d30ea906Sjfb8856606 if (n_tokens < t0 + 10) {
912d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, "port in action profile filter");
913d30ea906Sjfb8856606 return;
914d30ea906Sjfb8856606 }
915d30ea906Sjfb8856606
916d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "match") == 0)
917d30ea906Sjfb8856606 p.fltr.filter_on_match = 1;
918d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "mismatch") == 0)
919d30ea906Sjfb8856606 p.fltr.filter_on_match = 0;
920d30ea906Sjfb8856606 else {
921d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "match or mismatch");
922d30ea906Sjfb8856606 return;
923d30ea906Sjfb8856606 }
924d30ea906Sjfb8856606
925d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2], "offset") != 0) {
926d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
927d30ea906Sjfb8856606 return;
928d30ea906Sjfb8856606 }
929d30ea906Sjfb8856606
930d30ea906Sjfb8856606 if (parser_read_uint32(&p.fltr.key_offset, tokens[t0 + 3]) != 0) {
931d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
932d30ea906Sjfb8856606 return;
933d30ea906Sjfb8856606 }
934d30ea906Sjfb8856606
935d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 4], "mask") != 0) {
936d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
937d30ea906Sjfb8856606 return;
938d30ea906Sjfb8856606 }
939d30ea906Sjfb8856606
940d30ea906Sjfb8856606 size = RTE_PORT_IN_ACTION_FLTR_KEY_SIZE;
941d30ea906Sjfb8856606 if ((parse_hex_string(tokens[t0 + 5], p.fltr.key_mask, &size) != 0) ||
942d30ea906Sjfb8856606 (size != RTE_PORT_IN_ACTION_FLTR_KEY_SIZE)) {
943d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
944d30ea906Sjfb8856606 return;
945d30ea906Sjfb8856606 }
946d30ea906Sjfb8856606
947d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 6], "key") != 0) {
948d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "key");
949d30ea906Sjfb8856606 return;
950d30ea906Sjfb8856606 }
951d30ea906Sjfb8856606
952d30ea906Sjfb8856606 size = RTE_PORT_IN_ACTION_FLTR_KEY_SIZE;
953d30ea906Sjfb8856606 if ((parse_hex_string(tokens[t0 + 7], p.fltr.key, &size) != 0) ||
954d30ea906Sjfb8856606 (size != RTE_PORT_IN_ACTION_FLTR_KEY_SIZE)) {
955d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_value");
956d30ea906Sjfb8856606 return;
957d30ea906Sjfb8856606 }
958d30ea906Sjfb8856606
959d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 8], "port") != 0) {
960d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
961d30ea906Sjfb8856606 return;
962d30ea906Sjfb8856606 }
963d30ea906Sjfb8856606
964d30ea906Sjfb8856606 if (parser_read_uint32(&p.fltr.port_id, tokens[t0 + 9]) != 0) {
965d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
966d30ea906Sjfb8856606 return;
967d30ea906Sjfb8856606 }
968d30ea906Sjfb8856606
969d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_PORT_IN_ACTION_FLTR;
970d30ea906Sjfb8856606 t0 += 10;
971d30ea906Sjfb8856606 } /* filter */
972d30ea906Sjfb8856606
973d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "balance") == 0)) {
974d30ea906Sjfb8856606 uint32_t i;
975d30ea906Sjfb8856606
976d30ea906Sjfb8856606 if (n_tokens < t0 + 22) {
977d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
978d30ea906Sjfb8856606 "port in action profile balance");
979d30ea906Sjfb8856606 return;
980d30ea906Sjfb8856606 }
981d30ea906Sjfb8856606
982d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "offset") != 0) {
983d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
984d30ea906Sjfb8856606 return;
985d30ea906Sjfb8856606 }
986d30ea906Sjfb8856606
987d30ea906Sjfb8856606 if (parser_read_uint32(&p.lb.key_offset, tokens[t0 + 2]) != 0) {
988d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
989d30ea906Sjfb8856606 return;
990d30ea906Sjfb8856606 }
991d30ea906Sjfb8856606
992d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 3], "mask") != 0) {
993d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
994d30ea906Sjfb8856606 return;
995d30ea906Sjfb8856606 }
996d30ea906Sjfb8856606
997d30ea906Sjfb8856606 p.lb.key_size = RTE_PORT_IN_ACTION_LB_KEY_SIZE_MAX;
998d30ea906Sjfb8856606 if (parse_hex_string(tokens[t0 + 4], p.lb.key_mask, &p.lb.key_size) != 0) {
999d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
1000d30ea906Sjfb8856606 return;
1001d30ea906Sjfb8856606 }
1002d30ea906Sjfb8856606
1003d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 5], "port") != 0) {
1004d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
1005d30ea906Sjfb8856606 return;
1006d30ea906Sjfb8856606 }
1007d30ea906Sjfb8856606
1008d30ea906Sjfb8856606 for (i = 0; i < 16; i++)
1009d30ea906Sjfb8856606 if (parser_read_uint32(&p.lb.port_id[i], tokens[t0 + 6 + i]) != 0) {
1010d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
1011d30ea906Sjfb8856606 return;
1012d30ea906Sjfb8856606 }
1013d30ea906Sjfb8856606
1014d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_PORT_IN_ACTION_LB;
1015d30ea906Sjfb8856606 t0 += 22;
1016d30ea906Sjfb8856606 } /* balance */
1017d30ea906Sjfb8856606
1018d30ea906Sjfb8856606 if (t0 < n_tokens) {
1019d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1020d30ea906Sjfb8856606 return;
1021d30ea906Sjfb8856606 }
1022d30ea906Sjfb8856606
1023d30ea906Sjfb8856606 ap = port_in_action_profile_create(name, &p);
1024d30ea906Sjfb8856606 if (ap == NULL) {
1025d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1026d30ea906Sjfb8856606 return;
1027d30ea906Sjfb8856606 }
1028d30ea906Sjfb8856606 }
1029d30ea906Sjfb8856606
1030d30ea906Sjfb8856606
1031d30ea906Sjfb8856606 static const char cmd_table_action_profile_help[] =
1032d30ea906Sjfb8856606 "table action profile <profile_name>\n"
1033d30ea906Sjfb8856606 " ipv4 | ipv6\n"
1034d30ea906Sjfb8856606 " offset <ip_offset>\n"
1035d30ea906Sjfb8856606 " fwd\n"
1036d30ea906Sjfb8856606 " [balance offset <key_offset> mask <key_mask> outoffset <out_offset>]\n"
1037d30ea906Sjfb8856606 " [meter srtcm | trtcm\n"
1038d30ea906Sjfb8856606 " tc <n_tc>\n"
1039d30ea906Sjfb8856606 " stats none | pkts | bytes | both]\n"
1040d30ea906Sjfb8856606 " [tm spp <n_subports_per_port> pps <n_pipes_per_subport>]\n"
10414418919fSjohnjiang " [encap ether | vlan | qinq | mpls | pppoe | qinq_pppoe \n"
1042d30ea906Sjfb8856606 " vxlan offset <ether_offset> ipv4 | ipv6 vlan on | off]\n"
1043d30ea906Sjfb8856606 " [nat src | dst\n"
1044d30ea906Sjfb8856606 " proto udp | tcp]\n"
1045d30ea906Sjfb8856606 " [ttl drop | fwd\n"
1046d30ea906Sjfb8856606 " stats none | pkts]\n"
1047d30ea906Sjfb8856606 " [stats pkts | bytes | both]\n"
1048d30ea906Sjfb8856606 " [time]\n"
10494418919fSjohnjiang " [sym_crypto dev <CRYPTODEV_NAME> offset <op_offset>]\n"
1050d30ea906Sjfb8856606 " [tag]\n"
1051d30ea906Sjfb8856606 " [decap]\n";
1052d30ea906Sjfb8856606
1053d30ea906Sjfb8856606 static void
cmd_table_action_profile(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)1054d30ea906Sjfb8856606 cmd_table_action_profile(char **tokens,
1055d30ea906Sjfb8856606 uint32_t n_tokens,
1056d30ea906Sjfb8856606 char *out,
1057d30ea906Sjfb8856606 size_t out_size)
1058d30ea906Sjfb8856606 {
1059d30ea906Sjfb8856606 struct table_action_profile_params p;
1060d30ea906Sjfb8856606 struct table_action_profile *ap;
1061d30ea906Sjfb8856606 char *name;
1062d30ea906Sjfb8856606 uint32_t t0;
1063d30ea906Sjfb8856606
1064d30ea906Sjfb8856606 memset(&p, 0, sizeof(p));
1065d30ea906Sjfb8856606
1066d30ea906Sjfb8856606 if (n_tokens < 8) {
1067d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1068d30ea906Sjfb8856606 return;
1069d30ea906Sjfb8856606 }
1070d30ea906Sjfb8856606
1071d30ea906Sjfb8856606 if (strcmp(tokens[1], "action") != 0) {
1072d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "action");
1073d30ea906Sjfb8856606 return;
1074d30ea906Sjfb8856606 }
1075d30ea906Sjfb8856606
1076d30ea906Sjfb8856606 if (strcmp(tokens[2], "profile") != 0) {
1077d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
1078d30ea906Sjfb8856606 return;
1079d30ea906Sjfb8856606 }
1080d30ea906Sjfb8856606
1081d30ea906Sjfb8856606 name = tokens[3];
1082d30ea906Sjfb8856606
1083d30ea906Sjfb8856606 if (strcmp(tokens[4], "ipv4") == 0)
1084d30ea906Sjfb8856606 p.common.ip_version = 1;
1085d30ea906Sjfb8856606 else if (strcmp(tokens[4], "ipv6") == 0)
1086d30ea906Sjfb8856606 p.common.ip_version = 0;
1087d30ea906Sjfb8856606 else {
1088d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "ipv4 or ipv6");
1089d30ea906Sjfb8856606 return;
1090d30ea906Sjfb8856606 }
1091d30ea906Sjfb8856606
1092d30ea906Sjfb8856606 if (strcmp(tokens[5], "offset") != 0) {
1093d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
1094d30ea906Sjfb8856606 return;
1095d30ea906Sjfb8856606 }
1096d30ea906Sjfb8856606
1097d30ea906Sjfb8856606 if (parser_read_uint32(&p.common.ip_offset, tokens[6]) != 0) {
1098d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "ip_offset");
1099d30ea906Sjfb8856606 return;
1100d30ea906Sjfb8856606 }
1101d30ea906Sjfb8856606
1102d30ea906Sjfb8856606 if (strcmp(tokens[7], "fwd") != 0) {
1103d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "fwd");
1104d30ea906Sjfb8856606 return;
1105d30ea906Sjfb8856606 }
1106d30ea906Sjfb8856606
1107d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_FWD;
1108d30ea906Sjfb8856606
1109d30ea906Sjfb8856606 t0 = 8;
1110d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "balance") == 0)) {
1111d30ea906Sjfb8856606 if (n_tokens < t0 + 7) {
1112d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, "table action profile balance");
1113d30ea906Sjfb8856606 return;
1114d30ea906Sjfb8856606 }
1115d30ea906Sjfb8856606
1116d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "offset") != 0) {
1117d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
1118d30ea906Sjfb8856606 return;
1119d30ea906Sjfb8856606 }
1120d30ea906Sjfb8856606
1121d30ea906Sjfb8856606 if (parser_read_uint32(&p.lb.key_offset, tokens[t0 + 2]) != 0) {
1122d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
1123d30ea906Sjfb8856606 return;
1124d30ea906Sjfb8856606 }
1125d30ea906Sjfb8856606
1126d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 3], "mask") != 0) {
1127d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
1128d30ea906Sjfb8856606 return;
1129d30ea906Sjfb8856606 }
1130d30ea906Sjfb8856606
1131d30ea906Sjfb8856606 p.lb.key_size = RTE_PORT_IN_ACTION_LB_KEY_SIZE_MAX;
1132d30ea906Sjfb8856606 if (parse_hex_string(tokens[t0 + 4], p.lb.key_mask, &p.lb.key_size) != 0) {
1133d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
1134d30ea906Sjfb8856606 return;
1135d30ea906Sjfb8856606 }
1136d30ea906Sjfb8856606
1137d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 5], "outoffset") != 0) {
1138d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "outoffset");
1139d30ea906Sjfb8856606 return;
1140d30ea906Sjfb8856606 }
1141d30ea906Sjfb8856606
1142d30ea906Sjfb8856606 if (parser_read_uint32(&p.lb.out_offset, tokens[t0 + 6]) != 0) {
1143d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "out_offset");
1144d30ea906Sjfb8856606 return;
1145d30ea906Sjfb8856606 }
1146d30ea906Sjfb8856606
1147d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_LB;
1148d30ea906Sjfb8856606 t0 += 7;
1149d30ea906Sjfb8856606 } /* balance */
1150d30ea906Sjfb8856606
1151d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "meter") == 0)) {
1152d30ea906Sjfb8856606 if (n_tokens < t0 + 6) {
1153d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1154d30ea906Sjfb8856606 "table action profile meter");
1155d30ea906Sjfb8856606 return;
1156d30ea906Sjfb8856606 }
1157d30ea906Sjfb8856606
1158d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "srtcm") == 0)
1159d30ea906Sjfb8856606 p.mtr.alg = RTE_TABLE_ACTION_METER_SRTCM;
1160d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "trtcm") == 0)
1161d30ea906Sjfb8856606 p.mtr.alg = RTE_TABLE_ACTION_METER_TRTCM;
1162d30ea906Sjfb8856606 else {
1163d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1164d30ea906Sjfb8856606 "srtcm or trtcm");
1165d30ea906Sjfb8856606 return;
1166d30ea906Sjfb8856606 }
1167d30ea906Sjfb8856606
1168d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2], "tc") != 0) {
1169d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc");
1170d30ea906Sjfb8856606 return;
1171d30ea906Sjfb8856606 }
1172d30ea906Sjfb8856606
1173d30ea906Sjfb8856606 if (parser_read_uint32(&p.mtr.n_tc, tokens[t0 + 3]) != 0) {
1174d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "n_tc");
1175d30ea906Sjfb8856606 return;
1176d30ea906Sjfb8856606 }
1177d30ea906Sjfb8856606
1178d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 4], "stats") != 0) {
1179d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
1180d30ea906Sjfb8856606 return;
1181d30ea906Sjfb8856606 }
1182d30ea906Sjfb8856606
1183d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 5], "none") == 0) {
1184d30ea906Sjfb8856606 p.mtr.n_packets_enabled = 0;
1185d30ea906Sjfb8856606 p.mtr.n_bytes_enabled = 0;
1186d30ea906Sjfb8856606 } else if (strcmp(tokens[t0 + 5], "pkts") == 0) {
1187d30ea906Sjfb8856606 p.mtr.n_packets_enabled = 1;
1188d30ea906Sjfb8856606 p.mtr.n_bytes_enabled = 0;
1189d30ea906Sjfb8856606 } else if (strcmp(tokens[t0 + 5], "bytes") == 0) {
1190d30ea906Sjfb8856606 p.mtr.n_packets_enabled = 0;
1191d30ea906Sjfb8856606 p.mtr.n_bytes_enabled = 1;
1192d30ea906Sjfb8856606 } else if (strcmp(tokens[t0 + 5], "both") == 0) {
1193d30ea906Sjfb8856606 p.mtr.n_packets_enabled = 1;
1194d30ea906Sjfb8856606 p.mtr.n_bytes_enabled = 1;
1195d30ea906Sjfb8856606 } else {
1196d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1197d30ea906Sjfb8856606 "none or pkts or bytes or both");
1198d30ea906Sjfb8856606 return;
1199d30ea906Sjfb8856606 }
1200d30ea906Sjfb8856606
1201d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_MTR;
1202d30ea906Sjfb8856606 t0 += 6;
1203d30ea906Sjfb8856606 } /* meter */
1204d30ea906Sjfb8856606
1205d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "tm") == 0)) {
1206d30ea906Sjfb8856606 if (n_tokens < t0 + 5) {
1207d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1208d30ea906Sjfb8856606 "table action profile tm");
1209d30ea906Sjfb8856606 return;
1210d30ea906Sjfb8856606 }
1211d30ea906Sjfb8856606
1212d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "spp") != 0) {
1213d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "spp");
1214d30ea906Sjfb8856606 return;
1215d30ea906Sjfb8856606 }
1216d30ea906Sjfb8856606
1217d30ea906Sjfb8856606 if (parser_read_uint32(&p.tm.n_subports_per_port,
1218d30ea906Sjfb8856606 tokens[t0 + 2]) != 0) {
1219d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
1220d30ea906Sjfb8856606 "n_subports_per_port");
1221d30ea906Sjfb8856606 return;
1222d30ea906Sjfb8856606 }
1223d30ea906Sjfb8856606
1224d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 3], "pps") != 0) {
1225d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pps");
1226d30ea906Sjfb8856606 return;
1227d30ea906Sjfb8856606 }
1228d30ea906Sjfb8856606
1229d30ea906Sjfb8856606 if (parser_read_uint32(&p.tm.n_pipes_per_subport,
1230d30ea906Sjfb8856606 tokens[t0 + 4]) != 0) {
1231d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
1232d30ea906Sjfb8856606 "n_pipes_per_subport");
1233d30ea906Sjfb8856606 return;
1234d30ea906Sjfb8856606 }
1235d30ea906Sjfb8856606
1236d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_TM;
1237d30ea906Sjfb8856606 t0 += 5;
1238d30ea906Sjfb8856606 } /* tm */
1239d30ea906Sjfb8856606
1240d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "encap") == 0)) {
1241d30ea906Sjfb8856606 uint32_t n_extra_tokens = 0;
1242d30ea906Sjfb8856606
1243d30ea906Sjfb8856606 if (n_tokens < t0 + 2) {
1244d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1245d30ea906Sjfb8856606 "action profile encap");
1246d30ea906Sjfb8856606 return;
1247d30ea906Sjfb8856606 }
1248d30ea906Sjfb8856606
1249d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "ether") == 0)
1250d30ea906Sjfb8856606 p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_ETHER;
1251d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "vlan") == 0)
1252d30ea906Sjfb8856606 p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_VLAN;
1253d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "qinq") == 0)
1254d30ea906Sjfb8856606 p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_QINQ;
1255d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "mpls") == 0)
1256d30ea906Sjfb8856606 p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_MPLS;
1257d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "pppoe") == 0)
1258d30ea906Sjfb8856606 p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_PPPOE;
1259d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "vxlan") == 0) {
1260d30ea906Sjfb8856606 if (n_tokens < t0 + 2 + 5) {
1261d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1262d30ea906Sjfb8856606 "action profile encap vxlan");
1263d30ea906Sjfb8856606 return;
1264d30ea906Sjfb8856606 }
1265d30ea906Sjfb8856606
1266d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2], "offset") != 0) {
1267d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1268d30ea906Sjfb8856606 "vxlan: offset");
1269d30ea906Sjfb8856606 return;
1270d30ea906Sjfb8856606 }
1271d30ea906Sjfb8856606
1272d30ea906Sjfb8856606 if (parser_read_uint32(&p.encap.vxlan.data_offset,
1273d30ea906Sjfb8856606 tokens[t0 + 2 + 1]) != 0) {
1274d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
1275d30ea906Sjfb8856606 "vxlan: ether_offset");
1276d30ea906Sjfb8856606 return;
1277d30ea906Sjfb8856606 }
1278d30ea906Sjfb8856606
1279d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2 + 2], "ipv4") == 0)
1280d30ea906Sjfb8856606 p.encap.vxlan.ip_version = 1;
1281d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 2 + 2], "ipv6") == 0)
1282d30ea906Sjfb8856606 p.encap.vxlan.ip_version = 0;
1283d30ea906Sjfb8856606 else {
1284d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
1285d30ea906Sjfb8856606 "vxlan: ipv4 or ipv6");
1286d30ea906Sjfb8856606 return;
1287d30ea906Sjfb8856606 }
1288d30ea906Sjfb8856606
1289d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2 + 3], "vlan") != 0) {
1290d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1291d30ea906Sjfb8856606 "vxlan: vlan");
1292d30ea906Sjfb8856606 return;
1293d30ea906Sjfb8856606 }
1294d30ea906Sjfb8856606
1295d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2 + 4], "on") == 0)
1296d30ea906Sjfb8856606 p.encap.vxlan.vlan = 1;
1297d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 2 + 4], "off") == 0)
1298d30ea906Sjfb8856606 p.encap.vxlan.vlan = 0;
1299d30ea906Sjfb8856606 else {
1300d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
1301d30ea906Sjfb8856606 "vxlan: on or off");
1302d30ea906Sjfb8856606 return;
1303d30ea906Sjfb8856606 }
1304d30ea906Sjfb8856606
1305d30ea906Sjfb8856606 p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_VXLAN;
1306d30ea906Sjfb8856606 n_extra_tokens = 5;
13074418919fSjohnjiang } else if (strcmp(tokens[t0 + 1], "qinq_pppoe") == 0)
13084418919fSjohnjiang p.encap.encap_mask =
13094418919fSjohnjiang 1LLU << RTE_TABLE_ACTION_ENCAP_QINQ_PPPOE;
13104418919fSjohnjiang else {
1311d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, "encap");
1312d30ea906Sjfb8856606 return;
1313d30ea906Sjfb8856606 }
1314d30ea906Sjfb8856606
1315d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_ENCAP;
1316d30ea906Sjfb8856606 t0 += 2 + n_extra_tokens;
1317d30ea906Sjfb8856606 } /* encap */
1318d30ea906Sjfb8856606
1319d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "nat") == 0)) {
1320d30ea906Sjfb8856606 if (n_tokens < t0 + 4) {
1321d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1322d30ea906Sjfb8856606 "table action profile nat");
1323d30ea906Sjfb8856606 return;
1324d30ea906Sjfb8856606 }
1325d30ea906Sjfb8856606
1326d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "src") == 0)
1327d30ea906Sjfb8856606 p.nat.source_nat = 1;
1328d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "dst") == 0)
1329d30ea906Sjfb8856606 p.nat.source_nat = 0;
1330d30ea906Sjfb8856606 else {
1331d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1332d30ea906Sjfb8856606 "src or dst");
1333d30ea906Sjfb8856606 return;
1334d30ea906Sjfb8856606 }
1335d30ea906Sjfb8856606
1336d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2], "proto") != 0) {
1337d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "proto");
1338d30ea906Sjfb8856606 return;
1339d30ea906Sjfb8856606 }
1340d30ea906Sjfb8856606
1341d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 3], "tcp") == 0)
1342d30ea906Sjfb8856606 p.nat.proto = 0x06;
1343d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 3], "udp") == 0)
1344d30ea906Sjfb8856606 p.nat.proto = 0x11;
1345d30ea906Sjfb8856606 else {
1346d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1347d30ea906Sjfb8856606 "tcp or udp");
1348d30ea906Sjfb8856606 return;
1349d30ea906Sjfb8856606 }
1350d30ea906Sjfb8856606
1351d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_NAT;
1352d30ea906Sjfb8856606 t0 += 4;
1353d30ea906Sjfb8856606 } /* nat */
1354d30ea906Sjfb8856606
1355d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "ttl") == 0)) {
1356d30ea906Sjfb8856606 if (n_tokens < t0 + 4) {
1357d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1358d30ea906Sjfb8856606 "table action profile ttl");
1359d30ea906Sjfb8856606 return;
1360d30ea906Sjfb8856606 }
1361d30ea906Sjfb8856606
1362d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "drop") == 0)
1363d30ea906Sjfb8856606 p.ttl.drop = 1;
1364d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "fwd") == 0)
1365d30ea906Sjfb8856606 p.ttl.drop = 0;
1366d30ea906Sjfb8856606 else {
1367d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1368d30ea906Sjfb8856606 "drop or fwd");
1369d30ea906Sjfb8856606 return;
1370d30ea906Sjfb8856606 }
1371d30ea906Sjfb8856606
1372d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2], "stats") != 0) {
1373d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
1374d30ea906Sjfb8856606 return;
1375d30ea906Sjfb8856606 }
1376d30ea906Sjfb8856606
1377d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 3], "none") == 0)
1378d30ea906Sjfb8856606 p.ttl.n_packets_enabled = 0;
1379d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 3], "pkts") == 0)
1380d30ea906Sjfb8856606 p.ttl.n_packets_enabled = 1;
1381d30ea906Sjfb8856606 else {
1382d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1383d30ea906Sjfb8856606 "none or pkts");
1384d30ea906Sjfb8856606 return;
1385d30ea906Sjfb8856606 }
1386d30ea906Sjfb8856606
1387d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_TTL;
1388d30ea906Sjfb8856606 t0 += 4;
1389d30ea906Sjfb8856606 } /* ttl */
1390d30ea906Sjfb8856606
1391d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "stats") == 0)) {
1392d30ea906Sjfb8856606 if (n_tokens < t0 + 2) {
1393d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1394d30ea906Sjfb8856606 "table action profile stats");
1395d30ea906Sjfb8856606 return;
1396d30ea906Sjfb8856606 }
1397d30ea906Sjfb8856606
1398d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "pkts") == 0) {
1399d30ea906Sjfb8856606 p.stats.n_packets_enabled = 1;
1400d30ea906Sjfb8856606 p.stats.n_bytes_enabled = 0;
1401d30ea906Sjfb8856606 } else if (strcmp(tokens[t0 + 1], "bytes") == 0) {
1402d30ea906Sjfb8856606 p.stats.n_packets_enabled = 0;
1403d30ea906Sjfb8856606 p.stats.n_bytes_enabled = 1;
1404d30ea906Sjfb8856606 } else if (strcmp(tokens[t0 + 1], "both") == 0) {
1405d30ea906Sjfb8856606 p.stats.n_packets_enabled = 1;
1406d30ea906Sjfb8856606 p.stats.n_bytes_enabled = 1;
1407d30ea906Sjfb8856606 } else {
1408d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1409d30ea906Sjfb8856606 "pkts or bytes or both");
1410d30ea906Sjfb8856606 return;
1411d30ea906Sjfb8856606 }
1412d30ea906Sjfb8856606
1413d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_STATS;
1414d30ea906Sjfb8856606 t0 += 2;
1415d30ea906Sjfb8856606 } /* stats */
1416d30ea906Sjfb8856606
1417d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "time") == 0)) {
1418d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_TIME;
1419d30ea906Sjfb8856606 t0 += 1;
1420d30ea906Sjfb8856606 } /* time */
1421d30ea906Sjfb8856606
1422d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "sym_crypto") == 0)) {
1423d30ea906Sjfb8856606 struct cryptodev *cryptodev;
1424d30ea906Sjfb8856606
14254418919fSjohnjiang if (n_tokens < t0 + 5 ||
1426d30ea906Sjfb8856606 strcmp(tokens[t0 + 1], "dev") ||
14274418919fSjohnjiang strcmp(tokens[t0 + 3], "offset")) {
1428d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1429d30ea906Sjfb8856606 "table action profile sym_crypto");
1430d30ea906Sjfb8856606 return;
1431d30ea906Sjfb8856606 }
1432d30ea906Sjfb8856606
1433d30ea906Sjfb8856606 cryptodev = cryptodev_find(tokens[t0 + 2]);
1434d30ea906Sjfb8856606 if (cryptodev == NULL) {
1435d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
1436d30ea906Sjfb8856606 "table action profile sym_crypto");
1437d30ea906Sjfb8856606 return;
1438d30ea906Sjfb8856606 }
1439d30ea906Sjfb8856606
1440d30ea906Sjfb8856606 p.sym_crypto.cryptodev_id = cryptodev->dev_id;
1441d30ea906Sjfb8856606
1442d30ea906Sjfb8856606 if (parser_read_uint32(&p.sym_crypto.op_offset,
1443d30ea906Sjfb8856606 tokens[t0 + 4]) != 0) {
1444d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
1445d30ea906Sjfb8856606 "table action profile sym_crypto");
1446d30ea906Sjfb8856606 return;
1447d30ea906Sjfb8856606 }
1448d30ea906Sjfb8856606
14494418919fSjohnjiang p.sym_crypto.mp_create = cryptodev->mp_create;
14504418919fSjohnjiang p.sym_crypto.mp_init = cryptodev->mp_init;
1451d30ea906Sjfb8856606
1452d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_SYM_CRYPTO;
1453d30ea906Sjfb8856606
14544418919fSjohnjiang t0 += 5;
1455d30ea906Sjfb8856606 } /* sym_crypto */
1456d30ea906Sjfb8856606
1457d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "tag") == 0)) {
1458d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_TAG;
1459d30ea906Sjfb8856606 t0 += 1;
1460d30ea906Sjfb8856606 } /* tag */
1461d30ea906Sjfb8856606
1462d30ea906Sjfb8856606 if ((t0 < n_tokens) && (strcmp(tokens[t0], "decap") == 0)) {
1463d30ea906Sjfb8856606 p.action_mask |= 1LLU << RTE_TABLE_ACTION_DECAP;
1464d30ea906Sjfb8856606 t0 += 1;
1465d30ea906Sjfb8856606 } /* decap */
1466d30ea906Sjfb8856606
1467d30ea906Sjfb8856606 if (t0 < n_tokens) {
1468d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1469d30ea906Sjfb8856606 return;
1470d30ea906Sjfb8856606 }
1471d30ea906Sjfb8856606
1472d30ea906Sjfb8856606 ap = table_action_profile_create(name, &p);
1473d30ea906Sjfb8856606 if (ap == NULL) {
1474d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1475d30ea906Sjfb8856606 return;
1476d30ea906Sjfb8856606 }
1477d30ea906Sjfb8856606 }
1478d30ea906Sjfb8856606
1479d30ea906Sjfb8856606 static const char cmd_pipeline_help[] =
1480d30ea906Sjfb8856606 "pipeline <pipeline_name>\n"
1481d30ea906Sjfb8856606 " period <timer_period_ms>\n"
1482d30ea906Sjfb8856606 " offset_port_id <offset_port_id>\n"
1483d30ea906Sjfb8856606 " cpu <cpu_id>\n";
1484d30ea906Sjfb8856606
1485d30ea906Sjfb8856606 static void
cmd_pipeline(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)1486d30ea906Sjfb8856606 cmd_pipeline(char **tokens,
1487d30ea906Sjfb8856606 uint32_t n_tokens,
1488d30ea906Sjfb8856606 char *out,
1489d30ea906Sjfb8856606 size_t out_size)
1490d30ea906Sjfb8856606 {
1491d30ea906Sjfb8856606 struct pipeline_params p;
1492d30ea906Sjfb8856606 char *name;
1493d30ea906Sjfb8856606 struct pipeline *pipeline;
1494d30ea906Sjfb8856606
1495d30ea906Sjfb8856606 if (n_tokens != 8) {
1496d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1497d30ea906Sjfb8856606 return;
1498d30ea906Sjfb8856606 }
1499d30ea906Sjfb8856606
1500d30ea906Sjfb8856606 name = tokens[1];
1501d30ea906Sjfb8856606
1502d30ea906Sjfb8856606 if (strcmp(tokens[2], "period") != 0) {
1503d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "period");
1504d30ea906Sjfb8856606 return;
1505d30ea906Sjfb8856606 }
1506d30ea906Sjfb8856606
1507d30ea906Sjfb8856606 if (parser_read_uint32(&p.timer_period_ms, tokens[3]) != 0) {
1508d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "timer_period_ms");
1509d30ea906Sjfb8856606 return;
1510d30ea906Sjfb8856606 }
1511d30ea906Sjfb8856606
1512d30ea906Sjfb8856606 if (strcmp(tokens[4], "offset_port_id") != 0) {
1513d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset_port_id");
1514d30ea906Sjfb8856606 return;
1515d30ea906Sjfb8856606 }
1516d30ea906Sjfb8856606
1517d30ea906Sjfb8856606 if (parser_read_uint32(&p.offset_port_id, tokens[5]) != 0) {
1518d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "offset_port_id");
1519d30ea906Sjfb8856606 return;
1520d30ea906Sjfb8856606 }
1521d30ea906Sjfb8856606
1522d30ea906Sjfb8856606 if (strcmp(tokens[6], "cpu") != 0) {
1523d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
1524d30ea906Sjfb8856606 return;
1525d30ea906Sjfb8856606 }
1526d30ea906Sjfb8856606
1527d30ea906Sjfb8856606 if (parser_read_uint32(&p.cpu_id, tokens[7]) != 0) {
1528d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
1529d30ea906Sjfb8856606 return;
1530d30ea906Sjfb8856606 }
1531d30ea906Sjfb8856606
1532d30ea906Sjfb8856606 pipeline = pipeline_create(name, &p);
1533d30ea906Sjfb8856606 if (pipeline == NULL) {
1534d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1535d30ea906Sjfb8856606 return;
1536d30ea906Sjfb8856606 }
1537d30ea906Sjfb8856606 }
1538d30ea906Sjfb8856606
1539d30ea906Sjfb8856606 static const char cmd_pipeline_port_in_help[] =
1540d30ea906Sjfb8856606 "pipeline <pipeline_name> port in\n"
1541d30ea906Sjfb8856606 " bsz <burst_size>\n"
1542d30ea906Sjfb8856606 " link <link_name> rxq <queue_id>\n"
1543d30ea906Sjfb8856606 " | swq <swq_name>\n"
1544d30ea906Sjfb8856606 " | tmgr <tmgr_name>\n"
1545d30ea906Sjfb8856606 " | tap <tap_name> mempool <mempool_name> mtu <mtu>\n"
1546d30ea906Sjfb8856606 " | kni <kni_name>\n"
1547d30ea906Sjfb8856606 " | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>\n"
1548d30ea906Sjfb8856606 " | cryptodev <cryptodev_name> rxq <queue_id>\n"
1549d30ea906Sjfb8856606 " [action <port_in_action_profile_name>]\n"
1550d30ea906Sjfb8856606 " [disabled]\n";
1551d30ea906Sjfb8856606
1552d30ea906Sjfb8856606 static void
cmd_pipeline_port_in(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)1553d30ea906Sjfb8856606 cmd_pipeline_port_in(char **tokens,
1554d30ea906Sjfb8856606 uint32_t n_tokens,
1555d30ea906Sjfb8856606 char *out,
1556d30ea906Sjfb8856606 size_t out_size)
1557d30ea906Sjfb8856606 {
1558d30ea906Sjfb8856606 struct port_in_params p;
1559d30ea906Sjfb8856606 char *pipeline_name;
1560d30ea906Sjfb8856606 uint32_t t0;
1561d30ea906Sjfb8856606 int enabled, status;
1562d30ea906Sjfb8856606
1563d30ea906Sjfb8856606 if (n_tokens < 7) {
1564d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1565d30ea906Sjfb8856606 return;
1566d30ea906Sjfb8856606 }
1567d30ea906Sjfb8856606
1568d30ea906Sjfb8856606 pipeline_name = tokens[1];
1569d30ea906Sjfb8856606
1570d30ea906Sjfb8856606 if (strcmp(tokens[2], "port") != 0) {
1571d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
1572d30ea906Sjfb8856606 return;
1573d30ea906Sjfb8856606 }
1574d30ea906Sjfb8856606
1575d30ea906Sjfb8856606 if (strcmp(tokens[3], "in") != 0) {
1576d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
1577d30ea906Sjfb8856606 return;
1578d30ea906Sjfb8856606 }
1579d30ea906Sjfb8856606
1580d30ea906Sjfb8856606 if (strcmp(tokens[4], "bsz") != 0) {
1581d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "bsz");
1582d30ea906Sjfb8856606 return;
1583d30ea906Sjfb8856606 }
1584d30ea906Sjfb8856606
1585d30ea906Sjfb8856606 if (parser_read_uint32(&p.burst_size, tokens[5]) != 0) {
1586d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "burst_size");
1587d30ea906Sjfb8856606 return;
1588d30ea906Sjfb8856606 }
1589d30ea906Sjfb8856606
1590d30ea906Sjfb8856606 t0 = 6;
1591d30ea906Sjfb8856606
1592d30ea906Sjfb8856606 if (strcmp(tokens[t0], "link") == 0) {
1593d30ea906Sjfb8856606 if (n_tokens < t0 + 4) {
1594d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1595d30ea906Sjfb8856606 "pipeline port in link");
1596d30ea906Sjfb8856606 return;
1597d30ea906Sjfb8856606 }
1598d30ea906Sjfb8856606
1599d30ea906Sjfb8856606 p.type = PORT_IN_RXQ;
1600d30ea906Sjfb8856606
1601d30ea906Sjfb8856606 p.dev_name = tokens[t0 + 1];
1602d30ea906Sjfb8856606
1603d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2], "rxq") != 0) {
1604d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rxq");
1605d30ea906Sjfb8856606 return;
1606d30ea906Sjfb8856606 }
1607d30ea906Sjfb8856606
1608d30ea906Sjfb8856606 if (parser_read_uint16(&p.rxq.queue_id, tokens[t0 + 3]) != 0) {
1609d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
1610d30ea906Sjfb8856606 "queue_id");
1611d30ea906Sjfb8856606 return;
1612d30ea906Sjfb8856606 }
1613d30ea906Sjfb8856606 t0 += 4;
1614d30ea906Sjfb8856606 } else if (strcmp(tokens[t0], "swq") == 0) {
1615d30ea906Sjfb8856606 if (n_tokens < t0 + 2) {
1616d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1617d30ea906Sjfb8856606 "pipeline port in swq");
1618d30ea906Sjfb8856606 return;
1619d30ea906Sjfb8856606 }
1620d30ea906Sjfb8856606
1621d30ea906Sjfb8856606 p.type = PORT_IN_SWQ;
1622d30ea906Sjfb8856606
1623d30ea906Sjfb8856606 p.dev_name = tokens[t0 + 1];
1624d30ea906Sjfb8856606
1625d30ea906Sjfb8856606 t0 += 2;
1626d30ea906Sjfb8856606 } else if (strcmp(tokens[t0], "tmgr") == 0) {
1627d30ea906Sjfb8856606 if (n_tokens < t0 + 2) {
1628d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1629d30ea906Sjfb8856606 "pipeline port in tmgr");
1630d30ea906Sjfb8856606 return;
1631d30ea906Sjfb8856606 }
1632d30ea906Sjfb8856606
1633d30ea906Sjfb8856606 p.type = PORT_IN_TMGR;
1634d30ea906Sjfb8856606
1635d30ea906Sjfb8856606 p.dev_name = tokens[t0 + 1];
1636d30ea906Sjfb8856606
1637d30ea906Sjfb8856606 t0 += 2;
1638d30ea906Sjfb8856606 } else if (strcmp(tokens[t0], "tap") == 0) {
1639d30ea906Sjfb8856606 if (n_tokens < t0 + 6) {
1640d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1641d30ea906Sjfb8856606 "pipeline port in tap");
1642d30ea906Sjfb8856606 return;
1643d30ea906Sjfb8856606 }
1644d30ea906Sjfb8856606
1645d30ea906Sjfb8856606 p.type = PORT_IN_TAP;
1646d30ea906Sjfb8856606
1647d30ea906Sjfb8856606 p.dev_name = tokens[t0 + 1];
1648d30ea906Sjfb8856606
1649d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2], "mempool") != 0) {
1650d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1651d30ea906Sjfb8856606 "mempool");
1652d30ea906Sjfb8856606 return;
1653d30ea906Sjfb8856606 }
1654d30ea906Sjfb8856606
1655d30ea906Sjfb8856606 p.tap.mempool_name = tokens[t0 + 3];
1656d30ea906Sjfb8856606
1657d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 4], "mtu") != 0) {
1658d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1659d30ea906Sjfb8856606 "mtu");
1660d30ea906Sjfb8856606 return;
1661d30ea906Sjfb8856606 }
1662d30ea906Sjfb8856606
1663d30ea906Sjfb8856606 if (parser_read_uint32(&p.tap.mtu, tokens[t0 + 5]) != 0) {
1664d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "mtu");
1665d30ea906Sjfb8856606 return;
1666d30ea906Sjfb8856606 }
1667d30ea906Sjfb8856606
1668d30ea906Sjfb8856606 t0 += 6;
1669d30ea906Sjfb8856606 } else if (strcmp(tokens[t0], "kni") == 0) {
1670d30ea906Sjfb8856606 if (n_tokens < t0 + 2) {
1671d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1672d30ea906Sjfb8856606 "pipeline port in kni");
1673d30ea906Sjfb8856606 return;
1674d30ea906Sjfb8856606 }
1675d30ea906Sjfb8856606
1676d30ea906Sjfb8856606 p.type = PORT_IN_KNI;
1677d30ea906Sjfb8856606
1678d30ea906Sjfb8856606 p.dev_name = tokens[t0 + 1];
1679d30ea906Sjfb8856606
1680d30ea906Sjfb8856606 t0 += 2;
1681d30ea906Sjfb8856606 } else if (strcmp(tokens[t0], "source") == 0) {
1682d30ea906Sjfb8856606 if (n_tokens < t0 + 6) {
1683d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1684d30ea906Sjfb8856606 "pipeline port in source");
1685d30ea906Sjfb8856606 return;
1686d30ea906Sjfb8856606 }
1687d30ea906Sjfb8856606
1688d30ea906Sjfb8856606 p.type = PORT_IN_SOURCE;
1689d30ea906Sjfb8856606
1690d30ea906Sjfb8856606 p.dev_name = NULL;
1691d30ea906Sjfb8856606
1692d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "mempool") != 0) {
1693d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1694d30ea906Sjfb8856606 "mempool");
1695d30ea906Sjfb8856606 return;
1696d30ea906Sjfb8856606 }
1697d30ea906Sjfb8856606
1698d30ea906Sjfb8856606 p.source.mempool_name = tokens[t0 + 2];
1699d30ea906Sjfb8856606
1700d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 3], "file") != 0) {
1701d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1702d30ea906Sjfb8856606 "file");
1703d30ea906Sjfb8856606 return;
1704d30ea906Sjfb8856606 }
1705d30ea906Sjfb8856606
1706d30ea906Sjfb8856606 p.source.file_name = tokens[t0 + 4];
1707d30ea906Sjfb8856606
1708d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 5], "bpp") != 0) {
1709d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1710d30ea906Sjfb8856606 "bpp");
1711d30ea906Sjfb8856606 return;
1712d30ea906Sjfb8856606 }
1713d30ea906Sjfb8856606
1714d30ea906Sjfb8856606 if (parser_read_uint32(&p.source.n_bytes_per_pkt, tokens[t0 + 6]) != 0) {
1715d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
1716d30ea906Sjfb8856606 "n_bytes_per_pkt");
1717d30ea906Sjfb8856606 return;
1718d30ea906Sjfb8856606 }
1719d30ea906Sjfb8856606
1720d30ea906Sjfb8856606 t0 += 7;
1721d30ea906Sjfb8856606 } else if (strcmp(tokens[t0], "cryptodev") == 0) {
1722d30ea906Sjfb8856606 if (n_tokens < t0 + 3) {
1723d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1724d30ea906Sjfb8856606 "pipeline port in cryptodev");
1725d30ea906Sjfb8856606 return;
1726d30ea906Sjfb8856606 }
1727d30ea906Sjfb8856606
1728d30ea906Sjfb8856606 p.type = PORT_IN_CRYPTODEV;
1729d30ea906Sjfb8856606
1730d30ea906Sjfb8856606 p.dev_name = tokens[t0 + 1];
1731d30ea906Sjfb8856606 if (parser_read_uint16(&p.rxq.queue_id, tokens[t0 + 3]) != 0) {
1732d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
1733d30ea906Sjfb8856606 "rxq");
1734d30ea906Sjfb8856606 return;
1735d30ea906Sjfb8856606 }
1736d30ea906Sjfb8856606
1737d30ea906Sjfb8856606 p.cryptodev.arg_callback = NULL;
1738d30ea906Sjfb8856606 p.cryptodev.f_callback = NULL;
1739d30ea906Sjfb8856606
1740d30ea906Sjfb8856606 t0 += 4;
1741d30ea906Sjfb8856606 } else {
1742d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
1743d30ea906Sjfb8856606 return;
1744d30ea906Sjfb8856606 }
1745d30ea906Sjfb8856606
1746d30ea906Sjfb8856606 p.action_profile_name = NULL;
1747d30ea906Sjfb8856606 if ((n_tokens > t0) && (strcmp(tokens[t0], "action") == 0)) {
1748d30ea906Sjfb8856606 if (n_tokens < t0 + 2) {
1749d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, "action");
1750d30ea906Sjfb8856606 return;
1751d30ea906Sjfb8856606 }
1752d30ea906Sjfb8856606
1753d30ea906Sjfb8856606 p.action_profile_name = tokens[t0 + 1];
1754d30ea906Sjfb8856606
1755d30ea906Sjfb8856606 t0 += 2;
1756d30ea906Sjfb8856606 }
1757d30ea906Sjfb8856606
1758d30ea906Sjfb8856606 enabled = 1;
1759d30ea906Sjfb8856606 if ((n_tokens > t0) &&
1760d30ea906Sjfb8856606 (strcmp(tokens[t0], "disabled") == 0)) {
1761d30ea906Sjfb8856606 enabled = 0;
1762d30ea906Sjfb8856606
1763d30ea906Sjfb8856606 t0 += 1;
1764d30ea906Sjfb8856606 }
1765d30ea906Sjfb8856606
1766d30ea906Sjfb8856606 if (n_tokens != t0) {
1767d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1768d30ea906Sjfb8856606 return;
1769d30ea906Sjfb8856606 }
1770d30ea906Sjfb8856606
1771d30ea906Sjfb8856606 status = pipeline_port_in_create(pipeline_name,
1772d30ea906Sjfb8856606 &p, enabled);
1773d30ea906Sjfb8856606 if (status) {
1774d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1775d30ea906Sjfb8856606 return;
1776d30ea906Sjfb8856606 }
1777d30ea906Sjfb8856606 }
1778d30ea906Sjfb8856606
1779d30ea906Sjfb8856606 static const char cmd_pipeline_port_out_help[] =
1780d30ea906Sjfb8856606 "pipeline <pipeline_name> port out\n"
1781d30ea906Sjfb8856606 " bsz <burst_size>\n"
1782d30ea906Sjfb8856606 " link <link_name> txq <txq_id>\n"
1783d30ea906Sjfb8856606 " | swq <swq_name>\n"
1784d30ea906Sjfb8856606 " | tmgr <tmgr_name>\n"
1785d30ea906Sjfb8856606 " | tap <tap_name>\n"
1786d30ea906Sjfb8856606 " | kni <kni_name>\n"
1787d30ea906Sjfb8856606 " | sink [file <file_name> pkts <max_n_pkts>]\n"
1788d30ea906Sjfb8856606 " | cryptodev <cryptodev_name> txq <txq_id> offset <crypto_op_offset>\n";
1789d30ea906Sjfb8856606
1790d30ea906Sjfb8856606 static void
cmd_pipeline_port_out(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)1791d30ea906Sjfb8856606 cmd_pipeline_port_out(char **tokens,
1792d30ea906Sjfb8856606 uint32_t n_tokens,
1793d30ea906Sjfb8856606 char *out,
1794d30ea906Sjfb8856606 size_t out_size)
1795d30ea906Sjfb8856606 {
1796d30ea906Sjfb8856606 struct port_out_params p;
1797d30ea906Sjfb8856606 char *pipeline_name;
1798d30ea906Sjfb8856606 int status;
1799d30ea906Sjfb8856606
1800d30ea906Sjfb8856606 memset(&p, 0, sizeof(p));
1801d30ea906Sjfb8856606
1802d30ea906Sjfb8856606 if (n_tokens < 7) {
1803d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1804d30ea906Sjfb8856606 return;
1805d30ea906Sjfb8856606 }
1806d30ea906Sjfb8856606
1807d30ea906Sjfb8856606 pipeline_name = tokens[1];
1808d30ea906Sjfb8856606
1809d30ea906Sjfb8856606 if (strcmp(tokens[2], "port") != 0) {
1810d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
1811d30ea906Sjfb8856606 return;
1812d30ea906Sjfb8856606 }
1813d30ea906Sjfb8856606
1814d30ea906Sjfb8856606 if (strcmp(tokens[3], "out") != 0) {
1815d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "out");
1816d30ea906Sjfb8856606 return;
1817d30ea906Sjfb8856606 }
1818d30ea906Sjfb8856606
1819d30ea906Sjfb8856606 if (strcmp(tokens[4], "bsz") != 0) {
1820d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "bsz");
1821d30ea906Sjfb8856606 return;
1822d30ea906Sjfb8856606 }
1823d30ea906Sjfb8856606
1824d30ea906Sjfb8856606 if (parser_read_uint32(&p.burst_size, tokens[5]) != 0) {
1825d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "burst_size");
1826d30ea906Sjfb8856606 return;
1827d30ea906Sjfb8856606 }
1828d30ea906Sjfb8856606
1829d30ea906Sjfb8856606 if (strcmp(tokens[6], "link") == 0) {
1830d30ea906Sjfb8856606 if (n_tokens != 10) {
1831d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1832d30ea906Sjfb8856606 "pipeline port out link");
1833d30ea906Sjfb8856606 return;
1834d30ea906Sjfb8856606 }
1835d30ea906Sjfb8856606
1836d30ea906Sjfb8856606 p.type = PORT_OUT_TXQ;
1837d30ea906Sjfb8856606
1838d30ea906Sjfb8856606 p.dev_name = tokens[7];
1839d30ea906Sjfb8856606
1840d30ea906Sjfb8856606 if (strcmp(tokens[8], "txq") != 0) {
1841d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "txq");
1842d30ea906Sjfb8856606 return;
1843d30ea906Sjfb8856606 }
1844d30ea906Sjfb8856606
1845d30ea906Sjfb8856606 if (parser_read_uint16(&p.txq.queue_id, tokens[9]) != 0) {
1846d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "queue_id");
1847d30ea906Sjfb8856606 return;
1848d30ea906Sjfb8856606 }
1849d30ea906Sjfb8856606 } else if (strcmp(tokens[6], "swq") == 0) {
1850d30ea906Sjfb8856606 if (n_tokens != 8) {
1851d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1852d30ea906Sjfb8856606 "pipeline port out swq");
1853d30ea906Sjfb8856606 return;
1854d30ea906Sjfb8856606 }
1855d30ea906Sjfb8856606
1856d30ea906Sjfb8856606 p.type = PORT_OUT_SWQ;
1857d30ea906Sjfb8856606
1858d30ea906Sjfb8856606 p.dev_name = tokens[7];
1859d30ea906Sjfb8856606 } else if (strcmp(tokens[6], "tmgr") == 0) {
1860d30ea906Sjfb8856606 if (n_tokens != 8) {
1861d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1862d30ea906Sjfb8856606 "pipeline port out tmgr");
1863d30ea906Sjfb8856606 return;
1864d30ea906Sjfb8856606 }
1865d30ea906Sjfb8856606
1866d30ea906Sjfb8856606 p.type = PORT_OUT_TMGR;
1867d30ea906Sjfb8856606
1868d30ea906Sjfb8856606 p.dev_name = tokens[7];
1869d30ea906Sjfb8856606 } else if (strcmp(tokens[6], "tap") == 0) {
1870d30ea906Sjfb8856606 if (n_tokens != 8) {
1871d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1872d30ea906Sjfb8856606 "pipeline port out tap");
1873d30ea906Sjfb8856606 return;
1874d30ea906Sjfb8856606 }
1875d30ea906Sjfb8856606
1876d30ea906Sjfb8856606 p.type = PORT_OUT_TAP;
1877d30ea906Sjfb8856606
1878d30ea906Sjfb8856606 p.dev_name = tokens[7];
1879d30ea906Sjfb8856606 } else if (strcmp(tokens[6], "kni") == 0) {
1880d30ea906Sjfb8856606 if (n_tokens != 8) {
1881d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1882d30ea906Sjfb8856606 "pipeline port out kni");
1883d30ea906Sjfb8856606 return;
1884d30ea906Sjfb8856606 }
1885d30ea906Sjfb8856606
1886d30ea906Sjfb8856606 p.type = PORT_OUT_KNI;
1887d30ea906Sjfb8856606
1888d30ea906Sjfb8856606 p.dev_name = tokens[7];
1889d30ea906Sjfb8856606 } else if (strcmp(tokens[6], "sink") == 0) {
1890d30ea906Sjfb8856606 if ((n_tokens != 7) && (n_tokens != 11)) {
1891d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1892d30ea906Sjfb8856606 "pipeline port out sink");
1893d30ea906Sjfb8856606 return;
1894d30ea906Sjfb8856606 }
1895d30ea906Sjfb8856606
1896d30ea906Sjfb8856606 p.type = PORT_OUT_SINK;
1897d30ea906Sjfb8856606
1898d30ea906Sjfb8856606 p.dev_name = NULL;
1899d30ea906Sjfb8856606
1900d30ea906Sjfb8856606 if (n_tokens == 7) {
1901d30ea906Sjfb8856606 p.sink.file_name = NULL;
1902d30ea906Sjfb8856606 p.sink.max_n_pkts = 0;
1903d30ea906Sjfb8856606 } else {
1904d30ea906Sjfb8856606 if (strcmp(tokens[7], "file") != 0) {
1905d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1906d30ea906Sjfb8856606 "file");
1907d30ea906Sjfb8856606 return;
1908d30ea906Sjfb8856606 }
1909d30ea906Sjfb8856606
1910d30ea906Sjfb8856606 p.sink.file_name = tokens[8];
1911d30ea906Sjfb8856606
1912d30ea906Sjfb8856606 if (strcmp(tokens[9], "pkts") != 0) {
1913d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pkts");
1914d30ea906Sjfb8856606 return;
1915d30ea906Sjfb8856606 }
1916d30ea906Sjfb8856606
1917d30ea906Sjfb8856606 if (parser_read_uint32(&p.sink.max_n_pkts, tokens[10]) != 0) {
1918d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "max_n_pkts");
1919d30ea906Sjfb8856606 return;
1920d30ea906Sjfb8856606 }
1921d30ea906Sjfb8856606 }
1922d30ea906Sjfb8856606
1923d30ea906Sjfb8856606 } else if (strcmp(tokens[6], "cryptodev") == 0) {
1924d30ea906Sjfb8856606 if (n_tokens != 12) {
1925d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1926d30ea906Sjfb8856606 "pipeline port out cryptodev");
1927d30ea906Sjfb8856606 return;
1928d30ea906Sjfb8856606 }
1929d30ea906Sjfb8856606
1930d30ea906Sjfb8856606 p.type = PORT_OUT_CRYPTODEV;
1931d30ea906Sjfb8856606
1932d30ea906Sjfb8856606 p.dev_name = tokens[7];
1933d30ea906Sjfb8856606
1934d30ea906Sjfb8856606 if (strcmp(tokens[8], "txq")) {
1935d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1936d30ea906Sjfb8856606 "pipeline port out cryptodev");
1937d30ea906Sjfb8856606 return;
1938d30ea906Sjfb8856606 }
1939d30ea906Sjfb8856606
1940d30ea906Sjfb8856606 if (parser_read_uint16(&p.cryptodev.queue_id, tokens[9])
1941d30ea906Sjfb8856606 != 0) {
1942d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "queue_id");
1943d30ea906Sjfb8856606 return;
1944d30ea906Sjfb8856606 }
1945d30ea906Sjfb8856606
1946d30ea906Sjfb8856606 if (strcmp(tokens[10], "offset")) {
1947d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
1948d30ea906Sjfb8856606 "pipeline port out cryptodev");
1949d30ea906Sjfb8856606 return;
1950d30ea906Sjfb8856606 }
1951d30ea906Sjfb8856606
1952d30ea906Sjfb8856606 if (parser_read_uint32(&p.cryptodev.op_offset, tokens[11])
1953d30ea906Sjfb8856606 != 0) {
1954d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "queue_id");
1955d30ea906Sjfb8856606 return;
1956d30ea906Sjfb8856606 }
1957d30ea906Sjfb8856606 } else {
1958d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
1959d30ea906Sjfb8856606 return;
1960d30ea906Sjfb8856606 }
1961d30ea906Sjfb8856606
1962d30ea906Sjfb8856606 status = pipeline_port_out_create(pipeline_name, &p);
1963d30ea906Sjfb8856606 if (status) {
1964d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1965d30ea906Sjfb8856606 return;
1966d30ea906Sjfb8856606 }
1967d30ea906Sjfb8856606 }
1968d30ea906Sjfb8856606
1969d30ea906Sjfb8856606 static const char cmd_pipeline_table_help[] =
1970d30ea906Sjfb8856606 "pipeline <pipeline_name> table\n"
1971d30ea906Sjfb8856606 " match\n"
1972d30ea906Sjfb8856606 " acl\n"
1973d30ea906Sjfb8856606 " ipv4 | ipv6\n"
1974d30ea906Sjfb8856606 " offset <ip_header_offset>\n"
1975d30ea906Sjfb8856606 " size <n_rules>\n"
1976d30ea906Sjfb8856606 " | array\n"
1977d30ea906Sjfb8856606 " offset <key_offset>\n"
1978d30ea906Sjfb8856606 " size <n_keys>\n"
1979d30ea906Sjfb8856606 " | hash\n"
1980d30ea906Sjfb8856606 " ext | lru\n"
1981d30ea906Sjfb8856606 " key <key_size>\n"
1982d30ea906Sjfb8856606 " mask <key_mask>\n"
1983d30ea906Sjfb8856606 " offset <key_offset>\n"
1984d30ea906Sjfb8856606 " buckets <n_buckets>\n"
1985d30ea906Sjfb8856606 " size <n_keys>\n"
1986d30ea906Sjfb8856606 " | lpm\n"
1987d30ea906Sjfb8856606 " ipv4 | ipv6\n"
1988d30ea906Sjfb8856606 " offset <ip_header_offset>\n"
1989d30ea906Sjfb8856606 " size <n_rules>\n"
1990d30ea906Sjfb8856606 " | stub\n"
1991d30ea906Sjfb8856606 " [action <table_action_profile_name>]\n";
1992d30ea906Sjfb8856606
1993d30ea906Sjfb8856606 static void
cmd_pipeline_table(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)1994d30ea906Sjfb8856606 cmd_pipeline_table(char **tokens,
1995d30ea906Sjfb8856606 uint32_t n_tokens,
1996d30ea906Sjfb8856606 char *out,
1997d30ea906Sjfb8856606 size_t out_size)
1998d30ea906Sjfb8856606 {
1999d30ea906Sjfb8856606 uint8_t key_mask[TABLE_RULE_MATCH_SIZE_MAX];
2000d30ea906Sjfb8856606 struct table_params p;
2001d30ea906Sjfb8856606 char *pipeline_name;
2002d30ea906Sjfb8856606 uint32_t t0;
2003d30ea906Sjfb8856606 int status;
2004d30ea906Sjfb8856606
2005d30ea906Sjfb8856606 if (n_tokens < 5) {
2006d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2007d30ea906Sjfb8856606 return;
2008d30ea906Sjfb8856606 }
2009d30ea906Sjfb8856606
2010d30ea906Sjfb8856606 pipeline_name = tokens[1];
2011d30ea906Sjfb8856606
2012d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
2013d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
2014d30ea906Sjfb8856606 return;
2015d30ea906Sjfb8856606 }
2016d30ea906Sjfb8856606
2017d30ea906Sjfb8856606 if (strcmp(tokens[3], "match") != 0) {
2018d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
2019d30ea906Sjfb8856606 return;
2020d30ea906Sjfb8856606 }
2021d30ea906Sjfb8856606
2022d30ea906Sjfb8856606 t0 = 4;
2023d30ea906Sjfb8856606 if (strcmp(tokens[t0], "acl") == 0) {
2024d30ea906Sjfb8856606 if (n_tokens < t0 + 6) {
2025d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
2026d30ea906Sjfb8856606 "pipeline table acl");
2027d30ea906Sjfb8856606 return;
2028d30ea906Sjfb8856606 }
2029d30ea906Sjfb8856606
2030d30ea906Sjfb8856606 p.match_type = TABLE_ACL;
2031d30ea906Sjfb8856606
2032d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "ipv4") == 0)
2033d30ea906Sjfb8856606 p.match.acl.ip_version = 1;
2034d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "ipv6") == 0)
2035d30ea906Sjfb8856606 p.match.acl.ip_version = 0;
2036d30ea906Sjfb8856606 else {
2037d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
2038d30ea906Sjfb8856606 "ipv4 or ipv6");
2039d30ea906Sjfb8856606 return;
2040d30ea906Sjfb8856606 }
2041d30ea906Sjfb8856606
2042d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2], "offset") != 0) {
2043d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
2044d30ea906Sjfb8856606 return;
2045d30ea906Sjfb8856606 }
2046d30ea906Sjfb8856606
2047d30ea906Sjfb8856606 if (parser_read_uint32(&p.match.acl.ip_header_offset,
2048d30ea906Sjfb8856606 tokens[t0 + 3]) != 0) {
2049d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
2050d30ea906Sjfb8856606 "ip_header_offset");
2051d30ea906Sjfb8856606 return;
2052d30ea906Sjfb8856606 }
2053d30ea906Sjfb8856606
2054d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 4], "size") != 0) {
2055d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
2056d30ea906Sjfb8856606 return;
2057d30ea906Sjfb8856606 }
2058d30ea906Sjfb8856606
2059d30ea906Sjfb8856606 if (parser_read_uint32(&p.match.acl.n_rules,
2060d30ea906Sjfb8856606 tokens[t0 + 5]) != 0) {
2061d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "n_rules");
2062d30ea906Sjfb8856606 return;
2063d30ea906Sjfb8856606 }
2064d30ea906Sjfb8856606
2065d30ea906Sjfb8856606 t0 += 6;
2066d30ea906Sjfb8856606 } else if (strcmp(tokens[t0], "array") == 0) {
2067d30ea906Sjfb8856606 if (n_tokens < t0 + 5) {
2068d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
2069d30ea906Sjfb8856606 "pipeline table array");
2070d30ea906Sjfb8856606 return;
2071d30ea906Sjfb8856606 }
2072d30ea906Sjfb8856606
2073d30ea906Sjfb8856606 p.match_type = TABLE_ARRAY;
2074d30ea906Sjfb8856606
2075d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "offset") != 0) {
2076d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
2077d30ea906Sjfb8856606 return;
2078d30ea906Sjfb8856606 }
2079d30ea906Sjfb8856606
2080d30ea906Sjfb8856606 if (parser_read_uint32(&p.match.array.key_offset,
2081d30ea906Sjfb8856606 tokens[t0 + 2]) != 0) {
2082d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
2083d30ea906Sjfb8856606 return;
2084d30ea906Sjfb8856606 }
2085d30ea906Sjfb8856606
2086d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 3], "size") != 0) {
2087d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
2088d30ea906Sjfb8856606 return;
2089d30ea906Sjfb8856606 }
2090d30ea906Sjfb8856606
2091d30ea906Sjfb8856606 if (parser_read_uint32(&p.match.array.n_keys,
2092d30ea906Sjfb8856606 tokens[t0 + 4]) != 0) {
2093d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "n_keys");
2094d30ea906Sjfb8856606 return;
2095d30ea906Sjfb8856606 }
2096d30ea906Sjfb8856606
2097d30ea906Sjfb8856606 t0 += 5;
2098d30ea906Sjfb8856606 } else if (strcmp(tokens[t0], "hash") == 0) {
2099d30ea906Sjfb8856606 uint32_t key_mask_size = TABLE_RULE_MATCH_SIZE_MAX;
2100d30ea906Sjfb8856606
2101d30ea906Sjfb8856606 if (n_tokens < t0 + 12) {
2102d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
2103d30ea906Sjfb8856606 "pipeline table hash");
2104d30ea906Sjfb8856606 return;
2105d30ea906Sjfb8856606 }
2106d30ea906Sjfb8856606
2107d30ea906Sjfb8856606 p.match_type = TABLE_HASH;
2108d30ea906Sjfb8856606
2109d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "ext") == 0)
2110d30ea906Sjfb8856606 p.match.hash.extendable_bucket = 1;
2111d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "lru") == 0)
2112d30ea906Sjfb8856606 p.match.hash.extendable_bucket = 0;
2113d30ea906Sjfb8856606 else {
2114d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
2115d30ea906Sjfb8856606 "ext or lru");
2116d30ea906Sjfb8856606 return;
2117d30ea906Sjfb8856606 }
2118d30ea906Sjfb8856606
2119d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2], "key") != 0) {
2120d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "key");
2121d30ea906Sjfb8856606 return;
2122d30ea906Sjfb8856606 }
2123d30ea906Sjfb8856606
2124d30ea906Sjfb8856606 if ((parser_read_uint32(&p.match.hash.key_size,
2125d30ea906Sjfb8856606 tokens[t0 + 3]) != 0) ||
2126d30ea906Sjfb8856606 (p.match.hash.key_size == 0) ||
2127d30ea906Sjfb8856606 (p.match.hash.key_size > TABLE_RULE_MATCH_SIZE_MAX)) {
2128d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_size");
2129d30ea906Sjfb8856606 return;
2130d30ea906Sjfb8856606 }
2131d30ea906Sjfb8856606
2132d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 4], "mask") != 0) {
2133d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
2134d30ea906Sjfb8856606 return;
2135d30ea906Sjfb8856606 }
2136d30ea906Sjfb8856606
2137d30ea906Sjfb8856606 if ((parse_hex_string(tokens[t0 + 5],
2138d30ea906Sjfb8856606 key_mask, &key_mask_size) != 0) ||
2139d30ea906Sjfb8856606 (key_mask_size != p.match.hash.key_size)) {
2140d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
2141d30ea906Sjfb8856606 return;
2142d30ea906Sjfb8856606 }
2143d30ea906Sjfb8856606 p.match.hash.key_mask = key_mask;
2144d30ea906Sjfb8856606
2145d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 6], "offset") != 0) {
2146d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
2147d30ea906Sjfb8856606 return;
2148d30ea906Sjfb8856606 }
2149d30ea906Sjfb8856606
2150d30ea906Sjfb8856606 if (parser_read_uint32(&p.match.hash.key_offset,
2151d30ea906Sjfb8856606 tokens[t0 + 7]) != 0) {
2152d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
2153d30ea906Sjfb8856606 return;
2154d30ea906Sjfb8856606 }
2155d30ea906Sjfb8856606
2156d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 8], "buckets") != 0) {
2157d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "buckets");
2158d30ea906Sjfb8856606 return;
2159d30ea906Sjfb8856606 }
2160d30ea906Sjfb8856606
2161d30ea906Sjfb8856606 if (parser_read_uint32(&p.match.hash.n_buckets,
2162d30ea906Sjfb8856606 tokens[t0 + 9]) != 0) {
2163d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "n_buckets");
2164d30ea906Sjfb8856606 return;
2165d30ea906Sjfb8856606 }
2166d30ea906Sjfb8856606
2167d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 10], "size") != 0) {
2168d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
2169d30ea906Sjfb8856606 return;
2170d30ea906Sjfb8856606 }
2171d30ea906Sjfb8856606
2172d30ea906Sjfb8856606 if (parser_read_uint32(&p.match.hash.n_keys,
2173d30ea906Sjfb8856606 tokens[t0 + 11]) != 0) {
2174d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "n_keys");
2175d30ea906Sjfb8856606 return;
2176d30ea906Sjfb8856606 }
2177d30ea906Sjfb8856606
2178d30ea906Sjfb8856606 t0 += 12;
2179d30ea906Sjfb8856606 } else if (strcmp(tokens[t0], "lpm") == 0) {
2180d30ea906Sjfb8856606 if (n_tokens < t0 + 6) {
2181d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
2182d30ea906Sjfb8856606 "pipeline table lpm");
2183d30ea906Sjfb8856606 return;
2184d30ea906Sjfb8856606 }
2185d30ea906Sjfb8856606
2186d30ea906Sjfb8856606 p.match_type = TABLE_LPM;
2187d30ea906Sjfb8856606
2188d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 1], "ipv4") == 0)
2189d30ea906Sjfb8856606 p.match.lpm.key_size = 4;
2190d30ea906Sjfb8856606 else if (strcmp(tokens[t0 + 1], "ipv6") == 0)
2191d30ea906Sjfb8856606 p.match.lpm.key_size = 16;
2192d30ea906Sjfb8856606 else {
2193d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
2194d30ea906Sjfb8856606 "ipv4 or ipv6");
2195d30ea906Sjfb8856606 return;
2196d30ea906Sjfb8856606 }
2197d30ea906Sjfb8856606
2198d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 2], "offset") != 0) {
2199d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
2200d30ea906Sjfb8856606 return;
2201d30ea906Sjfb8856606 }
2202d30ea906Sjfb8856606
2203d30ea906Sjfb8856606 if (parser_read_uint32(&p.match.lpm.key_offset,
2204d30ea906Sjfb8856606 tokens[t0 + 3]) != 0) {
2205d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
2206d30ea906Sjfb8856606 return;
2207d30ea906Sjfb8856606 }
2208d30ea906Sjfb8856606
2209d30ea906Sjfb8856606 if (strcmp(tokens[t0 + 4], "size") != 0) {
2210d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
2211d30ea906Sjfb8856606 return;
2212d30ea906Sjfb8856606 }
2213d30ea906Sjfb8856606
2214d30ea906Sjfb8856606 if (parser_read_uint32(&p.match.lpm.n_rules,
2215d30ea906Sjfb8856606 tokens[t0 + 5]) != 0) {
2216d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "n_rules");
2217d30ea906Sjfb8856606 return;
2218d30ea906Sjfb8856606 }
2219d30ea906Sjfb8856606
2220d30ea906Sjfb8856606 t0 += 6;
2221d30ea906Sjfb8856606 } else if (strcmp(tokens[t0], "stub") == 0) {
2222d30ea906Sjfb8856606 p.match_type = TABLE_STUB;
2223d30ea906Sjfb8856606
2224d30ea906Sjfb8856606 t0 += 1;
2225d30ea906Sjfb8856606 } else {
2226d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
2227d30ea906Sjfb8856606 return;
2228d30ea906Sjfb8856606 }
2229d30ea906Sjfb8856606
2230d30ea906Sjfb8856606 p.action_profile_name = NULL;
2231d30ea906Sjfb8856606 if ((n_tokens > t0) && (strcmp(tokens[t0], "action") == 0)) {
2232d30ea906Sjfb8856606 if (n_tokens < t0 + 2) {
2233d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, "action");
2234d30ea906Sjfb8856606 return;
2235d30ea906Sjfb8856606 }
2236d30ea906Sjfb8856606
2237d30ea906Sjfb8856606 p.action_profile_name = tokens[t0 + 1];
2238d30ea906Sjfb8856606
2239d30ea906Sjfb8856606 t0 += 2;
2240d30ea906Sjfb8856606 }
2241d30ea906Sjfb8856606
2242d30ea906Sjfb8856606 if (n_tokens > t0) {
2243d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2244d30ea906Sjfb8856606 return;
2245d30ea906Sjfb8856606 }
2246d30ea906Sjfb8856606
2247d30ea906Sjfb8856606 status = pipeline_table_create(pipeline_name, &p);
2248d30ea906Sjfb8856606 if (status) {
2249d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2250d30ea906Sjfb8856606 return;
2251d30ea906Sjfb8856606 }
2252d30ea906Sjfb8856606 }
2253d30ea906Sjfb8856606
2254d30ea906Sjfb8856606 static const char cmd_pipeline_port_in_table_help[] =
2255d30ea906Sjfb8856606 "pipeline <pipeline_name> port in <port_id> table <table_id>\n";
2256d30ea906Sjfb8856606
2257d30ea906Sjfb8856606 static void
cmd_pipeline_port_in_table(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)2258d30ea906Sjfb8856606 cmd_pipeline_port_in_table(char **tokens,
2259d30ea906Sjfb8856606 uint32_t n_tokens,
2260d30ea906Sjfb8856606 char *out,
2261d30ea906Sjfb8856606 size_t out_size)
2262d30ea906Sjfb8856606 {
2263d30ea906Sjfb8856606 char *pipeline_name;
2264d30ea906Sjfb8856606 uint32_t port_id, table_id;
2265d30ea906Sjfb8856606 int status;
2266d30ea906Sjfb8856606
2267d30ea906Sjfb8856606 if (n_tokens != 7) {
2268d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2269d30ea906Sjfb8856606 return;
2270d30ea906Sjfb8856606 }
2271d30ea906Sjfb8856606
2272d30ea906Sjfb8856606 pipeline_name = tokens[1];
2273d30ea906Sjfb8856606
2274d30ea906Sjfb8856606 if (strcmp(tokens[2], "port") != 0) {
2275d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2276d30ea906Sjfb8856606 return;
2277d30ea906Sjfb8856606 }
2278d30ea906Sjfb8856606
2279d30ea906Sjfb8856606 if (strcmp(tokens[3], "in") != 0) {
2280d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
2281d30ea906Sjfb8856606 return;
2282d30ea906Sjfb8856606 }
2283d30ea906Sjfb8856606
2284d30ea906Sjfb8856606 if (parser_read_uint32(&port_id, tokens[4]) != 0) {
2285d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
2286d30ea906Sjfb8856606 return;
2287d30ea906Sjfb8856606 }
2288d30ea906Sjfb8856606
2289d30ea906Sjfb8856606 if (strcmp(tokens[5], "table") != 0) {
2290d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
2291d30ea906Sjfb8856606 return;
2292d30ea906Sjfb8856606 }
2293d30ea906Sjfb8856606
2294d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[6]) != 0) {
2295d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
2296d30ea906Sjfb8856606 return;
2297d30ea906Sjfb8856606 }
2298d30ea906Sjfb8856606
2299d30ea906Sjfb8856606 status = pipeline_port_in_connect_to_table(pipeline_name,
2300d30ea906Sjfb8856606 port_id,
2301d30ea906Sjfb8856606 table_id);
2302d30ea906Sjfb8856606 if (status) {
2303d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2304d30ea906Sjfb8856606 return;
2305d30ea906Sjfb8856606 }
2306d30ea906Sjfb8856606 }
2307d30ea906Sjfb8856606
2308d30ea906Sjfb8856606
2309d30ea906Sjfb8856606 static const char cmd_pipeline_port_in_stats_help[] =
2310d30ea906Sjfb8856606 "pipeline <pipeline_name> port in <port_id> stats read [clear]\n";
2311d30ea906Sjfb8856606
2312d30ea906Sjfb8856606 #define MSG_PIPELINE_PORT_IN_STATS \
2313d30ea906Sjfb8856606 "Pkts in: %" PRIu64 "\n" \
2314d30ea906Sjfb8856606 "Pkts dropped by AH: %" PRIu64 "\n" \
2315d30ea906Sjfb8856606 "Pkts dropped by other: %" PRIu64 "\n"
2316d30ea906Sjfb8856606
2317d30ea906Sjfb8856606 static void
cmd_pipeline_port_in_stats(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)2318d30ea906Sjfb8856606 cmd_pipeline_port_in_stats(char **tokens,
2319d30ea906Sjfb8856606 uint32_t n_tokens,
2320d30ea906Sjfb8856606 char *out,
2321d30ea906Sjfb8856606 size_t out_size)
2322d30ea906Sjfb8856606 {
2323d30ea906Sjfb8856606 struct rte_pipeline_port_in_stats stats;
2324d30ea906Sjfb8856606 char *pipeline_name;
2325d30ea906Sjfb8856606 uint32_t port_id;
2326d30ea906Sjfb8856606 int clear, status;
2327d30ea906Sjfb8856606
2328d30ea906Sjfb8856606 if ((n_tokens != 7) && (n_tokens != 8)) {
2329d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2330d30ea906Sjfb8856606 return;
2331d30ea906Sjfb8856606 }
2332d30ea906Sjfb8856606
2333d30ea906Sjfb8856606 pipeline_name = tokens[1];
2334d30ea906Sjfb8856606
2335d30ea906Sjfb8856606 if (strcmp(tokens[2], "port") != 0) {
2336d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2337d30ea906Sjfb8856606 return;
2338d30ea906Sjfb8856606 }
2339d30ea906Sjfb8856606
2340d30ea906Sjfb8856606 if (strcmp(tokens[3], "in") != 0) {
2341d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
2342d30ea906Sjfb8856606 return;
2343d30ea906Sjfb8856606 }
2344d30ea906Sjfb8856606
2345d30ea906Sjfb8856606 if (parser_read_uint32(&port_id, tokens[4]) != 0) {
2346d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
2347d30ea906Sjfb8856606 return;
2348d30ea906Sjfb8856606 }
2349d30ea906Sjfb8856606
2350d30ea906Sjfb8856606 if (strcmp(tokens[5], "stats") != 0) {
2351d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
2352d30ea906Sjfb8856606 return;
2353d30ea906Sjfb8856606 }
2354d30ea906Sjfb8856606
2355d30ea906Sjfb8856606 if (strcmp(tokens[6], "read") != 0) {
2356d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
2357d30ea906Sjfb8856606 return;
2358d30ea906Sjfb8856606 }
2359d30ea906Sjfb8856606
2360d30ea906Sjfb8856606 clear = 0;
2361d30ea906Sjfb8856606 if (n_tokens == 8) {
2362d30ea906Sjfb8856606 if (strcmp(tokens[7], "clear") != 0) {
2363d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "clear");
2364d30ea906Sjfb8856606 return;
2365d30ea906Sjfb8856606 }
2366d30ea906Sjfb8856606
2367d30ea906Sjfb8856606 clear = 1;
2368d30ea906Sjfb8856606 }
2369d30ea906Sjfb8856606
2370d30ea906Sjfb8856606 status = pipeline_port_in_stats_read(pipeline_name,
2371d30ea906Sjfb8856606 port_id,
2372d30ea906Sjfb8856606 &stats,
2373d30ea906Sjfb8856606 clear);
2374d30ea906Sjfb8856606 if (status) {
2375d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2376d30ea906Sjfb8856606 return;
2377d30ea906Sjfb8856606 }
2378d30ea906Sjfb8856606
2379d30ea906Sjfb8856606 snprintf(out, out_size, MSG_PIPELINE_PORT_IN_STATS,
2380d30ea906Sjfb8856606 stats.stats.n_pkts_in,
2381d30ea906Sjfb8856606 stats.n_pkts_dropped_by_ah,
2382d30ea906Sjfb8856606 stats.stats.n_pkts_drop);
2383d30ea906Sjfb8856606 }
2384d30ea906Sjfb8856606
2385d30ea906Sjfb8856606
2386d30ea906Sjfb8856606 static const char cmd_pipeline_port_in_enable_help[] =
2387d30ea906Sjfb8856606 "pipeline <pipeline_name> port in <port_id> enable\n";
2388d30ea906Sjfb8856606
2389d30ea906Sjfb8856606 static void
cmd_pipeline_port_in_enable(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)2390d30ea906Sjfb8856606 cmd_pipeline_port_in_enable(char **tokens,
2391d30ea906Sjfb8856606 uint32_t n_tokens,
2392d30ea906Sjfb8856606 char *out,
2393d30ea906Sjfb8856606 size_t out_size)
2394d30ea906Sjfb8856606 {
2395d30ea906Sjfb8856606 char *pipeline_name;
2396d30ea906Sjfb8856606 uint32_t port_id;
2397d30ea906Sjfb8856606 int status;
2398d30ea906Sjfb8856606
2399d30ea906Sjfb8856606 if (n_tokens != 6) {
2400d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2401d30ea906Sjfb8856606 return;
2402d30ea906Sjfb8856606 }
2403d30ea906Sjfb8856606
2404d30ea906Sjfb8856606 pipeline_name = tokens[1];
2405d30ea906Sjfb8856606
2406d30ea906Sjfb8856606 if (strcmp(tokens[2], "port") != 0) {
2407d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2408d30ea906Sjfb8856606 return;
2409d30ea906Sjfb8856606 }
2410d30ea906Sjfb8856606
2411d30ea906Sjfb8856606 if (strcmp(tokens[3], "in") != 0) {
2412d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
2413d30ea906Sjfb8856606 return;
2414d30ea906Sjfb8856606 }
2415d30ea906Sjfb8856606
2416d30ea906Sjfb8856606 if (parser_read_uint32(&port_id, tokens[4]) != 0) {
2417d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
2418d30ea906Sjfb8856606 return;
2419d30ea906Sjfb8856606 }
2420d30ea906Sjfb8856606
2421d30ea906Sjfb8856606 if (strcmp(tokens[5], "enable") != 0) {
2422d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "enable");
2423d30ea906Sjfb8856606 return;
2424d30ea906Sjfb8856606 }
2425d30ea906Sjfb8856606
2426d30ea906Sjfb8856606 status = pipeline_port_in_enable(pipeline_name, port_id);
2427d30ea906Sjfb8856606 if (status) {
2428d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2429d30ea906Sjfb8856606 return;
2430d30ea906Sjfb8856606 }
2431d30ea906Sjfb8856606 }
2432d30ea906Sjfb8856606
2433d30ea906Sjfb8856606
2434d30ea906Sjfb8856606 static const char cmd_pipeline_port_in_disable_help[] =
2435d30ea906Sjfb8856606 "pipeline <pipeline_name> port in <port_id> disable\n";
2436d30ea906Sjfb8856606
2437d30ea906Sjfb8856606 static void
cmd_pipeline_port_in_disable(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)2438d30ea906Sjfb8856606 cmd_pipeline_port_in_disable(char **tokens,
2439d30ea906Sjfb8856606 uint32_t n_tokens,
2440d30ea906Sjfb8856606 char *out,
2441d30ea906Sjfb8856606 size_t out_size)
2442d30ea906Sjfb8856606 {
2443d30ea906Sjfb8856606 char *pipeline_name;
2444d30ea906Sjfb8856606 uint32_t port_id;
2445d30ea906Sjfb8856606 int status;
2446d30ea906Sjfb8856606
2447d30ea906Sjfb8856606 if (n_tokens != 6) {
2448d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2449d30ea906Sjfb8856606 return;
2450d30ea906Sjfb8856606 }
2451d30ea906Sjfb8856606
2452d30ea906Sjfb8856606 pipeline_name = tokens[1];
2453d30ea906Sjfb8856606
2454d30ea906Sjfb8856606 if (strcmp(tokens[2], "port") != 0) {
2455d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2456d30ea906Sjfb8856606 return;
2457d30ea906Sjfb8856606 }
2458d30ea906Sjfb8856606
2459d30ea906Sjfb8856606 if (strcmp(tokens[3], "in") != 0) {
2460d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
2461d30ea906Sjfb8856606 return;
2462d30ea906Sjfb8856606 }
2463d30ea906Sjfb8856606
2464d30ea906Sjfb8856606 if (parser_read_uint32(&port_id, tokens[4]) != 0) {
2465d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
2466d30ea906Sjfb8856606 return;
2467d30ea906Sjfb8856606 }
2468d30ea906Sjfb8856606
2469d30ea906Sjfb8856606 if (strcmp(tokens[5], "disable") != 0) {
2470d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "disable");
2471d30ea906Sjfb8856606 return;
2472d30ea906Sjfb8856606 }
2473d30ea906Sjfb8856606
2474d30ea906Sjfb8856606 status = pipeline_port_in_disable(pipeline_name, port_id);
2475d30ea906Sjfb8856606 if (status) {
2476d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2477d30ea906Sjfb8856606 return;
2478d30ea906Sjfb8856606 }
2479d30ea906Sjfb8856606 }
2480d30ea906Sjfb8856606
2481d30ea906Sjfb8856606
2482d30ea906Sjfb8856606 static const char cmd_pipeline_port_out_stats_help[] =
2483d30ea906Sjfb8856606 "pipeline <pipeline_name> port out <port_id> stats read [clear]\n";
2484d30ea906Sjfb8856606
2485d30ea906Sjfb8856606 #define MSG_PIPELINE_PORT_OUT_STATS \
2486d30ea906Sjfb8856606 "Pkts in: %" PRIu64 "\n" \
2487d30ea906Sjfb8856606 "Pkts dropped by AH: %" PRIu64 "\n" \
2488d30ea906Sjfb8856606 "Pkts dropped by other: %" PRIu64 "\n"
2489d30ea906Sjfb8856606
2490d30ea906Sjfb8856606 static void
cmd_pipeline_port_out_stats(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)2491d30ea906Sjfb8856606 cmd_pipeline_port_out_stats(char **tokens,
2492d30ea906Sjfb8856606 uint32_t n_tokens,
2493d30ea906Sjfb8856606 char *out,
2494d30ea906Sjfb8856606 size_t out_size)
2495d30ea906Sjfb8856606 {
2496d30ea906Sjfb8856606 struct rte_pipeline_port_out_stats stats;
2497d30ea906Sjfb8856606 char *pipeline_name;
2498d30ea906Sjfb8856606 uint32_t port_id;
2499d30ea906Sjfb8856606 int clear, status;
2500d30ea906Sjfb8856606
2501d30ea906Sjfb8856606 if ((n_tokens != 7) && (n_tokens != 8)) {
2502d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2503d30ea906Sjfb8856606 return;
2504d30ea906Sjfb8856606 }
2505d30ea906Sjfb8856606
2506d30ea906Sjfb8856606 pipeline_name = tokens[1];
2507d30ea906Sjfb8856606
2508d30ea906Sjfb8856606 if (strcmp(tokens[2], "port") != 0) {
2509d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2510d30ea906Sjfb8856606 return;
2511d30ea906Sjfb8856606 }
2512d30ea906Sjfb8856606
2513d30ea906Sjfb8856606 if (strcmp(tokens[3], "out") != 0) {
2514d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "out");
2515d30ea906Sjfb8856606 return;
2516d30ea906Sjfb8856606 }
2517d30ea906Sjfb8856606
2518d30ea906Sjfb8856606 if (parser_read_uint32(&port_id, tokens[4]) != 0) {
2519d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
2520d30ea906Sjfb8856606 return;
2521d30ea906Sjfb8856606 }
2522d30ea906Sjfb8856606
2523d30ea906Sjfb8856606 if (strcmp(tokens[5], "stats") != 0) {
2524d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
2525d30ea906Sjfb8856606 return;
2526d30ea906Sjfb8856606 }
2527d30ea906Sjfb8856606
2528d30ea906Sjfb8856606 if (strcmp(tokens[6], "read") != 0) {
2529d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
2530d30ea906Sjfb8856606 return;
2531d30ea906Sjfb8856606 }
2532d30ea906Sjfb8856606
2533d30ea906Sjfb8856606 clear = 0;
2534d30ea906Sjfb8856606 if (n_tokens == 8) {
2535d30ea906Sjfb8856606 if (strcmp(tokens[7], "clear") != 0) {
2536d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "clear");
2537d30ea906Sjfb8856606 return;
2538d30ea906Sjfb8856606 }
2539d30ea906Sjfb8856606
2540d30ea906Sjfb8856606 clear = 1;
2541d30ea906Sjfb8856606 }
2542d30ea906Sjfb8856606
2543d30ea906Sjfb8856606 status = pipeline_port_out_stats_read(pipeline_name,
2544d30ea906Sjfb8856606 port_id,
2545d30ea906Sjfb8856606 &stats,
2546d30ea906Sjfb8856606 clear);
2547d30ea906Sjfb8856606 if (status) {
2548d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2549d30ea906Sjfb8856606 return;
2550d30ea906Sjfb8856606 }
2551d30ea906Sjfb8856606
2552d30ea906Sjfb8856606 snprintf(out, out_size, MSG_PIPELINE_PORT_OUT_STATS,
2553d30ea906Sjfb8856606 stats.stats.n_pkts_in,
2554d30ea906Sjfb8856606 stats.n_pkts_dropped_by_ah,
2555d30ea906Sjfb8856606 stats.stats.n_pkts_drop);
2556d30ea906Sjfb8856606 }
2557d30ea906Sjfb8856606
2558d30ea906Sjfb8856606
2559d30ea906Sjfb8856606 static const char cmd_pipeline_table_stats_help[] =
2560d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> stats read [clear]\n";
2561d30ea906Sjfb8856606
2562d30ea906Sjfb8856606 #define MSG_PIPELINE_TABLE_STATS \
2563d30ea906Sjfb8856606 "Pkts in: %" PRIu64 "\n" \
2564d30ea906Sjfb8856606 "Pkts in with lookup miss: %" PRIu64 "\n" \
2565d30ea906Sjfb8856606 "Pkts in with lookup hit dropped by AH: %" PRIu64 "\n" \
2566d30ea906Sjfb8856606 "Pkts in with lookup hit dropped by others: %" PRIu64 "\n" \
2567d30ea906Sjfb8856606 "Pkts in with lookup miss dropped by AH: %" PRIu64 "\n" \
2568d30ea906Sjfb8856606 "Pkts in with lookup miss dropped by others: %" PRIu64 "\n"
2569d30ea906Sjfb8856606
2570d30ea906Sjfb8856606 static void
cmd_pipeline_table_stats(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)2571d30ea906Sjfb8856606 cmd_pipeline_table_stats(char **tokens,
2572d30ea906Sjfb8856606 uint32_t n_tokens,
2573d30ea906Sjfb8856606 char *out,
2574d30ea906Sjfb8856606 size_t out_size)
2575d30ea906Sjfb8856606 {
2576d30ea906Sjfb8856606 struct rte_pipeline_table_stats stats;
2577d30ea906Sjfb8856606 char *pipeline_name;
2578d30ea906Sjfb8856606 uint32_t table_id;
2579d30ea906Sjfb8856606 int clear, status;
2580d30ea906Sjfb8856606
2581d30ea906Sjfb8856606 if ((n_tokens != 6) && (n_tokens != 7)) {
2582d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2583d30ea906Sjfb8856606 return;
2584d30ea906Sjfb8856606 }
2585d30ea906Sjfb8856606
2586d30ea906Sjfb8856606 pipeline_name = tokens[1];
2587d30ea906Sjfb8856606
2588d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
2589d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2590d30ea906Sjfb8856606 return;
2591d30ea906Sjfb8856606 }
2592d30ea906Sjfb8856606
2593d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
2594d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
2595d30ea906Sjfb8856606 return;
2596d30ea906Sjfb8856606 }
2597d30ea906Sjfb8856606
2598d30ea906Sjfb8856606 if (strcmp(tokens[4], "stats") != 0) {
2599d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
2600d30ea906Sjfb8856606 return;
2601d30ea906Sjfb8856606 }
2602d30ea906Sjfb8856606
2603d30ea906Sjfb8856606 if (strcmp(tokens[5], "read") != 0) {
2604d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
2605d30ea906Sjfb8856606 return;
2606d30ea906Sjfb8856606 }
2607d30ea906Sjfb8856606
2608d30ea906Sjfb8856606 clear = 0;
2609d30ea906Sjfb8856606 if (n_tokens == 7) {
2610d30ea906Sjfb8856606 if (strcmp(tokens[6], "clear") != 0) {
2611d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "clear");
2612d30ea906Sjfb8856606 return;
2613d30ea906Sjfb8856606 }
2614d30ea906Sjfb8856606
2615d30ea906Sjfb8856606 clear = 1;
2616d30ea906Sjfb8856606 }
2617d30ea906Sjfb8856606
2618d30ea906Sjfb8856606 status = pipeline_table_stats_read(pipeline_name,
2619d30ea906Sjfb8856606 table_id,
2620d30ea906Sjfb8856606 &stats,
2621d30ea906Sjfb8856606 clear);
2622d30ea906Sjfb8856606 if (status) {
2623d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2624d30ea906Sjfb8856606 return;
2625d30ea906Sjfb8856606 }
2626d30ea906Sjfb8856606
2627d30ea906Sjfb8856606 snprintf(out, out_size, MSG_PIPELINE_TABLE_STATS,
2628d30ea906Sjfb8856606 stats.stats.n_pkts_in,
2629d30ea906Sjfb8856606 stats.stats.n_pkts_lookup_miss,
2630d30ea906Sjfb8856606 stats.n_pkts_dropped_by_lkp_hit_ah,
2631d30ea906Sjfb8856606 stats.n_pkts_dropped_lkp_hit,
2632d30ea906Sjfb8856606 stats.n_pkts_dropped_by_lkp_miss_ah,
2633d30ea906Sjfb8856606 stats.n_pkts_dropped_lkp_miss);
2634d30ea906Sjfb8856606 }
2635d30ea906Sjfb8856606
2636d30ea906Sjfb8856606 /**
2637d30ea906Sjfb8856606 * <match> ::=
2638d30ea906Sjfb8856606 *
2639d30ea906Sjfb8856606 * match
2640d30ea906Sjfb8856606 * acl
2641d30ea906Sjfb8856606 * priority <priority>
2642d30ea906Sjfb8856606 * ipv4 | ipv6 <sa> <sa_depth> <da> <da_depth>
2643d30ea906Sjfb8856606 * <sp0> <sp1> <dp0> <dp1> <proto>
2644d30ea906Sjfb8856606 * | array <pos>
2645d30ea906Sjfb8856606 * | hash
2646d30ea906Sjfb8856606 * raw <key>
2647d30ea906Sjfb8856606 * | ipv4_5tuple <sa> <da> <sp> <dp> <proto>
2648d30ea906Sjfb8856606 * | ipv6_5tuple <sa> <da> <sp> <dp> <proto>
2649d30ea906Sjfb8856606 * | ipv4_addr <addr>
2650d30ea906Sjfb8856606 * | ipv6_addr <addr>
2651d30ea906Sjfb8856606 * | qinq <svlan> <cvlan>
2652d30ea906Sjfb8856606 * | lpm
2653d30ea906Sjfb8856606 * ipv4 | ipv6 <addr> <depth>
2654d30ea906Sjfb8856606 */
2655d30ea906Sjfb8856606 struct pkt_key_qinq {
2656d30ea906Sjfb8856606 uint16_t ethertype_svlan;
2657d30ea906Sjfb8856606 uint16_t svlan;
2658d30ea906Sjfb8856606 uint16_t ethertype_cvlan;
2659d30ea906Sjfb8856606 uint16_t cvlan;
2660*2d9fd380Sjfb8856606 } __rte_packed;
2661d30ea906Sjfb8856606
2662d30ea906Sjfb8856606 struct pkt_key_ipv4_5tuple {
2663d30ea906Sjfb8856606 uint8_t time_to_live;
2664d30ea906Sjfb8856606 uint8_t proto;
2665d30ea906Sjfb8856606 uint16_t hdr_checksum;
2666d30ea906Sjfb8856606 uint32_t sa;
2667d30ea906Sjfb8856606 uint32_t da;
2668d30ea906Sjfb8856606 uint16_t sp;
2669d30ea906Sjfb8856606 uint16_t dp;
2670*2d9fd380Sjfb8856606 } __rte_packed;
2671d30ea906Sjfb8856606
2672d30ea906Sjfb8856606 struct pkt_key_ipv6_5tuple {
2673d30ea906Sjfb8856606 uint16_t payload_length;
2674d30ea906Sjfb8856606 uint8_t proto;
2675d30ea906Sjfb8856606 uint8_t hop_limit;
2676d30ea906Sjfb8856606 uint8_t sa[16];
2677d30ea906Sjfb8856606 uint8_t da[16];
2678d30ea906Sjfb8856606 uint16_t sp;
2679d30ea906Sjfb8856606 uint16_t dp;
2680*2d9fd380Sjfb8856606 } __rte_packed;
2681d30ea906Sjfb8856606
2682d30ea906Sjfb8856606 struct pkt_key_ipv4_addr {
2683d30ea906Sjfb8856606 uint32_t addr;
2684*2d9fd380Sjfb8856606 } __rte_packed;
2685d30ea906Sjfb8856606
2686d30ea906Sjfb8856606 struct pkt_key_ipv6_addr {
2687d30ea906Sjfb8856606 uint8_t addr[16];
2688*2d9fd380Sjfb8856606 } __rte_packed;
2689d30ea906Sjfb8856606
2690d30ea906Sjfb8856606 static uint32_t
parse_match(char ** tokens,uint32_t n_tokens,char * out,size_t out_size,struct table_rule_match * m)2691d30ea906Sjfb8856606 parse_match(char **tokens,
2692d30ea906Sjfb8856606 uint32_t n_tokens,
2693d30ea906Sjfb8856606 char *out,
2694d30ea906Sjfb8856606 size_t out_size,
2695d30ea906Sjfb8856606 struct table_rule_match *m)
2696d30ea906Sjfb8856606 {
2697d30ea906Sjfb8856606 memset(m, 0, sizeof(*m));
2698d30ea906Sjfb8856606
2699d30ea906Sjfb8856606 if (n_tokens < 2)
2700d30ea906Sjfb8856606 return 0;
2701d30ea906Sjfb8856606
2702d30ea906Sjfb8856606 if (strcmp(tokens[0], "match") != 0) {
2703d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
2704d30ea906Sjfb8856606 return 0;
2705d30ea906Sjfb8856606 }
2706d30ea906Sjfb8856606
2707d30ea906Sjfb8856606 if (strcmp(tokens[1], "acl") == 0) {
2708d30ea906Sjfb8856606 if (n_tokens < 14) {
2709d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2710d30ea906Sjfb8856606 return 0;
2711d30ea906Sjfb8856606 }
2712d30ea906Sjfb8856606
2713d30ea906Sjfb8856606 m->match_type = TABLE_ACL;
2714d30ea906Sjfb8856606
2715d30ea906Sjfb8856606 if (strcmp(tokens[2], "priority") != 0) {
2716d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "priority");
2717d30ea906Sjfb8856606 return 0;
2718d30ea906Sjfb8856606 }
2719d30ea906Sjfb8856606
2720d30ea906Sjfb8856606 if (parser_read_uint32(&m->match.acl.priority,
2721d30ea906Sjfb8856606 tokens[3]) != 0) {
2722d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "priority");
2723d30ea906Sjfb8856606 return 0;
2724d30ea906Sjfb8856606 }
2725d30ea906Sjfb8856606
2726d30ea906Sjfb8856606 if (strcmp(tokens[4], "ipv4") == 0) {
2727d30ea906Sjfb8856606 struct in_addr saddr, daddr;
2728d30ea906Sjfb8856606
2729d30ea906Sjfb8856606 m->match.acl.ip_version = 1;
2730d30ea906Sjfb8856606
2731d30ea906Sjfb8856606 if (parse_ipv4_addr(tokens[5], &saddr) != 0) {
2732d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2733d30ea906Sjfb8856606 return 0;
2734d30ea906Sjfb8856606 }
2735d30ea906Sjfb8856606 m->match.acl.ipv4.sa = rte_be_to_cpu_32(saddr.s_addr);
2736d30ea906Sjfb8856606
2737d30ea906Sjfb8856606 if (parse_ipv4_addr(tokens[7], &daddr) != 0) {
2738d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "da");
2739d30ea906Sjfb8856606 return 0;
2740d30ea906Sjfb8856606 }
2741d30ea906Sjfb8856606 m->match.acl.ipv4.da = rte_be_to_cpu_32(daddr.s_addr);
2742d30ea906Sjfb8856606 } else if (strcmp(tokens[4], "ipv6") == 0) {
2743d30ea906Sjfb8856606 struct in6_addr saddr, daddr;
2744d30ea906Sjfb8856606
2745d30ea906Sjfb8856606 m->match.acl.ip_version = 0;
2746d30ea906Sjfb8856606
2747d30ea906Sjfb8856606 if (parse_ipv6_addr(tokens[5], &saddr) != 0) {
2748d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2749d30ea906Sjfb8856606 return 0;
2750d30ea906Sjfb8856606 }
2751d30ea906Sjfb8856606 memcpy(m->match.acl.ipv6.sa, saddr.s6_addr, 16);
2752d30ea906Sjfb8856606
2753d30ea906Sjfb8856606 if (parse_ipv6_addr(tokens[7], &daddr) != 0) {
2754d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "da");
2755d30ea906Sjfb8856606 return 0;
2756d30ea906Sjfb8856606 }
2757d30ea906Sjfb8856606 memcpy(m->match.acl.ipv6.da, daddr.s6_addr, 16);
2758d30ea906Sjfb8856606 } else {
2759d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
2760d30ea906Sjfb8856606 "ipv4 or ipv6");
2761d30ea906Sjfb8856606 return 0;
2762d30ea906Sjfb8856606 }
2763d30ea906Sjfb8856606
2764d30ea906Sjfb8856606 if (parser_read_uint32(&m->match.acl.sa_depth,
2765d30ea906Sjfb8856606 tokens[6]) != 0) {
2766d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "sa_depth");
2767d30ea906Sjfb8856606 return 0;
2768d30ea906Sjfb8856606 }
2769d30ea906Sjfb8856606
2770d30ea906Sjfb8856606 if (parser_read_uint32(&m->match.acl.da_depth,
2771d30ea906Sjfb8856606 tokens[8]) != 0) {
2772d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "da_depth");
2773d30ea906Sjfb8856606 return 0;
2774d30ea906Sjfb8856606 }
2775d30ea906Sjfb8856606
2776d30ea906Sjfb8856606 if (parser_read_uint16(&m->match.acl.sp0, tokens[9]) != 0) {
2777d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "sp0");
2778d30ea906Sjfb8856606 return 0;
2779d30ea906Sjfb8856606 }
2780d30ea906Sjfb8856606
2781d30ea906Sjfb8856606 if (parser_read_uint16(&m->match.acl.sp1, tokens[10]) != 0) {
2782d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "sp1");
2783d30ea906Sjfb8856606 return 0;
2784d30ea906Sjfb8856606 }
2785d30ea906Sjfb8856606
2786d30ea906Sjfb8856606 if (parser_read_uint16(&m->match.acl.dp0, tokens[11]) != 0) {
2787d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "dp0");
2788d30ea906Sjfb8856606 return 0;
2789d30ea906Sjfb8856606 }
2790d30ea906Sjfb8856606
2791d30ea906Sjfb8856606 if (parser_read_uint16(&m->match.acl.dp1, tokens[12]) != 0) {
2792d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "dp1");
2793d30ea906Sjfb8856606 return 0;
2794d30ea906Sjfb8856606 }
2795d30ea906Sjfb8856606
2796d30ea906Sjfb8856606 if (parser_read_uint8(&m->match.acl.proto, tokens[13]) != 0) {
2797d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "proto");
2798d30ea906Sjfb8856606 return 0;
2799d30ea906Sjfb8856606 }
2800d30ea906Sjfb8856606
2801d30ea906Sjfb8856606 m->match.acl.proto_mask = 0xff;
2802d30ea906Sjfb8856606
2803d30ea906Sjfb8856606 return 14;
2804d30ea906Sjfb8856606 } /* acl */
2805d30ea906Sjfb8856606
2806d30ea906Sjfb8856606 if (strcmp(tokens[1], "array") == 0) {
2807d30ea906Sjfb8856606 if (n_tokens < 3) {
2808d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2809d30ea906Sjfb8856606 return 0;
2810d30ea906Sjfb8856606 }
2811d30ea906Sjfb8856606
2812d30ea906Sjfb8856606 m->match_type = TABLE_ARRAY;
2813d30ea906Sjfb8856606
2814d30ea906Sjfb8856606 if (parser_read_uint32(&m->match.array.pos, tokens[2]) != 0) {
2815d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "pos");
2816d30ea906Sjfb8856606 return 0;
2817d30ea906Sjfb8856606 }
2818d30ea906Sjfb8856606
2819d30ea906Sjfb8856606 return 3;
2820d30ea906Sjfb8856606 } /* array */
2821d30ea906Sjfb8856606
2822d30ea906Sjfb8856606 if (strcmp(tokens[1], "hash") == 0) {
2823d30ea906Sjfb8856606 if (n_tokens < 3) {
2824d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2825d30ea906Sjfb8856606 return 0;
2826d30ea906Sjfb8856606 }
2827d30ea906Sjfb8856606
2828d30ea906Sjfb8856606 m->match_type = TABLE_HASH;
2829d30ea906Sjfb8856606
2830d30ea906Sjfb8856606 if (strcmp(tokens[2], "raw") == 0) {
2831d30ea906Sjfb8856606 uint32_t key_size = TABLE_RULE_MATCH_SIZE_MAX;
2832d30ea906Sjfb8856606
2833d30ea906Sjfb8856606 if (n_tokens < 4) {
2834d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
2835d30ea906Sjfb8856606 tokens[0]);
2836d30ea906Sjfb8856606 return 0;
2837d30ea906Sjfb8856606 }
2838d30ea906Sjfb8856606
2839d30ea906Sjfb8856606 if (parse_hex_string(tokens[3],
2840d30ea906Sjfb8856606 m->match.hash.key, &key_size) != 0) {
2841d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "key");
2842d30ea906Sjfb8856606 return 0;
2843d30ea906Sjfb8856606 }
2844d30ea906Sjfb8856606
2845d30ea906Sjfb8856606 return 4;
2846d30ea906Sjfb8856606 } /* hash raw */
2847d30ea906Sjfb8856606
2848d30ea906Sjfb8856606 if (strcmp(tokens[2], "ipv4_5tuple") == 0) {
2849d30ea906Sjfb8856606 struct pkt_key_ipv4_5tuple *ipv4 =
2850d30ea906Sjfb8856606 (struct pkt_key_ipv4_5tuple *) m->match.hash.key;
2851d30ea906Sjfb8856606 struct in_addr saddr, daddr;
2852d30ea906Sjfb8856606 uint16_t sp, dp;
2853d30ea906Sjfb8856606 uint8_t proto;
2854d30ea906Sjfb8856606
2855d30ea906Sjfb8856606 if (n_tokens < 8) {
2856d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
2857d30ea906Sjfb8856606 tokens[0]);
2858d30ea906Sjfb8856606 return 0;
2859d30ea906Sjfb8856606 }
2860d30ea906Sjfb8856606
2861d30ea906Sjfb8856606 if (parse_ipv4_addr(tokens[3], &saddr) != 0) {
2862d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2863d30ea906Sjfb8856606 return 0;
2864d30ea906Sjfb8856606 }
2865d30ea906Sjfb8856606
2866d30ea906Sjfb8856606 if (parse_ipv4_addr(tokens[4], &daddr) != 0) {
2867d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "da");
2868d30ea906Sjfb8856606 return 0;
2869d30ea906Sjfb8856606 }
2870d30ea906Sjfb8856606
2871d30ea906Sjfb8856606 if (parser_read_uint16(&sp, tokens[5]) != 0) {
2872d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "sp");
2873d30ea906Sjfb8856606 return 0;
2874d30ea906Sjfb8856606 }
2875d30ea906Sjfb8856606
2876d30ea906Sjfb8856606 if (parser_read_uint16(&dp, tokens[6]) != 0) {
2877d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "dp");
2878d30ea906Sjfb8856606 return 0;
2879d30ea906Sjfb8856606 }
2880d30ea906Sjfb8856606
2881d30ea906Sjfb8856606 if (parser_read_uint8(&proto, tokens[7]) != 0) {
2882d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
2883d30ea906Sjfb8856606 "proto");
2884d30ea906Sjfb8856606 return 0;
2885d30ea906Sjfb8856606 }
2886d30ea906Sjfb8856606
2887d30ea906Sjfb8856606 ipv4->sa = saddr.s_addr;
2888d30ea906Sjfb8856606 ipv4->da = daddr.s_addr;
2889d30ea906Sjfb8856606 ipv4->sp = rte_cpu_to_be_16(sp);
2890d30ea906Sjfb8856606 ipv4->dp = rte_cpu_to_be_16(dp);
2891d30ea906Sjfb8856606 ipv4->proto = proto;
2892d30ea906Sjfb8856606
2893d30ea906Sjfb8856606 return 8;
2894d30ea906Sjfb8856606 } /* hash ipv4_5tuple */
2895d30ea906Sjfb8856606
2896d30ea906Sjfb8856606 if (strcmp(tokens[2], "ipv6_5tuple") == 0) {
2897d30ea906Sjfb8856606 struct pkt_key_ipv6_5tuple *ipv6 =
2898d30ea906Sjfb8856606 (struct pkt_key_ipv6_5tuple *) m->match.hash.key;
2899d30ea906Sjfb8856606 struct in6_addr saddr, daddr;
2900d30ea906Sjfb8856606 uint16_t sp, dp;
2901d30ea906Sjfb8856606 uint8_t proto;
2902d30ea906Sjfb8856606
2903d30ea906Sjfb8856606 if (n_tokens < 8) {
2904d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
2905d30ea906Sjfb8856606 tokens[0]);
2906d30ea906Sjfb8856606 return 0;
2907d30ea906Sjfb8856606 }
2908d30ea906Sjfb8856606
2909d30ea906Sjfb8856606 if (parse_ipv6_addr(tokens[3], &saddr) != 0) {
2910d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2911d30ea906Sjfb8856606 return 0;
2912d30ea906Sjfb8856606 }
2913d30ea906Sjfb8856606
2914d30ea906Sjfb8856606 if (parse_ipv6_addr(tokens[4], &daddr) != 0) {
2915d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "da");
2916d30ea906Sjfb8856606 return 0;
2917d30ea906Sjfb8856606 }
2918d30ea906Sjfb8856606
2919d30ea906Sjfb8856606 if (parser_read_uint16(&sp, tokens[5]) != 0) {
2920d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "sp");
2921d30ea906Sjfb8856606 return 0;
2922d30ea906Sjfb8856606 }
2923d30ea906Sjfb8856606
2924d30ea906Sjfb8856606 if (parser_read_uint16(&dp, tokens[6]) != 0) {
2925d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "dp");
2926d30ea906Sjfb8856606 return 0;
2927d30ea906Sjfb8856606 }
2928d30ea906Sjfb8856606
2929d30ea906Sjfb8856606 if (parser_read_uint8(&proto, tokens[7]) != 0) {
2930d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
2931d30ea906Sjfb8856606 "proto");
2932d30ea906Sjfb8856606 return 0;
2933d30ea906Sjfb8856606 }
2934d30ea906Sjfb8856606
2935d30ea906Sjfb8856606 memcpy(ipv6->sa, saddr.s6_addr, 16);
2936d30ea906Sjfb8856606 memcpy(ipv6->da, daddr.s6_addr, 16);
2937d30ea906Sjfb8856606 ipv6->sp = rte_cpu_to_be_16(sp);
2938d30ea906Sjfb8856606 ipv6->dp = rte_cpu_to_be_16(dp);
2939d30ea906Sjfb8856606 ipv6->proto = proto;
2940d30ea906Sjfb8856606
2941d30ea906Sjfb8856606 return 8;
2942d30ea906Sjfb8856606 } /* hash ipv6_5tuple */
2943d30ea906Sjfb8856606
2944d30ea906Sjfb8856606 if (strcmp(tokens[2], "ipv4_addr") == 0) {
2945d30ea906Sjfb8856606 struct pkt_key_ipv4_addr *ipv4_addr =
2946d30ea906Sjfb8856606 (struct pkt_key_ipv4_addr *) m->match.hash.key;
2947d30ea906Sjfb8856606 struct in_addr addr;
2948d30ea906Sjfb8856606
2949d30ea906Sjfb8856606 if (n_tokens < 4) {
2950d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
2951d30ea906Sjfb8856606 tokens[0]);
2952d30ea906Sjfb8856606 return 0;
2953d30ea906Sjfb8856606 }
2954d30ea906Sjfb8856606
2955d30ea906Sjfb8856606 if (parse_ipv4_addr(tokens[3], &addr) != 0) {
2956d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
2957d30ea906Sjfb8856606 "addr");
2958d30ea906Sjfb8856606 return 0;
2959d30ea906Sjfb8856606 }
2960d30ea906Sjfb8856606
2961d30ea906Sjfb8856606 ipv4_addr->addr = addr.s_addr;
2962d30ea906Sjfb8856606
2963d30ea906Sjfb8856606 return 4;
2964d30ea906Sjfb8856606 } /* hash ipv4_addr */
2965d30ea906Sjfb8856606
2966d30ea906Sjfb8856606 if (strcmp(tokens[2], "ipv6_addr") == 0) {
2967d30ea906Sjfb8856606 struct pkt_key_ipv6_addr *ipv6_addr =
2968d30ea906Sjfb8856606 (struct pkt_key_ipv6_addr *) m->match.hash.key;
2969d30ea906Sjfb8856606 struct in6_addr addr;
2970d30ea906Sjfb8856606
2971d30ea906Sjfb8856606 if (n_tokens < 4) {
2972d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
2973d30ea906Sjfb8856606 tokens[0]);
2974d30ea906Sjfb8856606 return 0;
2975d30ea906Sjfb8856606 }
2976d30ea906Sjfb8856606
2977d30ea906Sjfb8856606 if (parse_ipv6_addr(tokens[3], &addr) != 0) {
2978d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
2979d30ea906Sjfb8856606 "addr");
2980d30ea906Sjfb8856606 return 0;
2981d30ea906Sjfb8856606 }
2982d30ea906Sjfb8856606
2983d30ea906Sjfb8856606 memcpy(ipv6_addr->addr, addr.s6_addr, 16);
2984d30ea906Sjfb8856606
2985d30ea906Sjfb8856606 return 4;
2986d30ea906Sjfb8856606 } /* hash ipv6_5tuple */
2987d30ea906Sjfb8856606
2988d30ea906Sjfb8856606 if (strcmp(tokens[2], "qinq") == 0) {
2989d30ea906Sjfb8856606 struct pkt_key_qinq *qinq =
2990d30ea906Sjfb8856606 (struct pkt_key_qinq *) m->match.hash.key;
2991d30ea906Sjfb8856606 uint16_t svlan, cvlan;
2992d30ea906Sjfb8856606
2993d30ea906Sjfb8856606 if (n_tokens < 5) {
2994d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
2995d30ea906Sjfb8856606 tokens[0]);
2996d30ea906Sjfb8856606 return 0;
2997d30ea906Sjfb8856606 }
2998d30ea906Sjfb8856606
2999d30ea906Sjfb8856606 if ((parser_read_uint16(&svlan, tokens[3]) != 0) ||
3000d30ea906Sjfb8856606 (svlan > 0xFFF)) {
3001d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
3002d30ea906Sjfb8856606 "svlan");
3003d30ea906Sjfb8856606 return 0;
3004d30ea906Sjfb8856606 }
3005d30ea906Sjfb8856606
3006d30ea906Sjfb8856606 if ((parser_read_uint16(&cvlan, tokens[4]) != 0) ||
3007d30ea906Sjfb8856606 (cvlan > 0xFFF)) {
3008d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
3009d30ea906Sjfb8856606 "cvlan");
3010d30ea906Sjfb8856606 return 0;
3011d30ea906Sjfb8856606 }
3012d30ea906Sjfb8856606
3013d30ea906Sjfb8856606 qinq->svlan = rte_cpu_to_be_16(svlan);
3014d30ea906Sjfb8856606 qinq->cvlan = rte_cpu_to_be_16(cvlan);
3015d30ea906Sjfb8856606
3016d30ea906Sjfb8856606 return 5;
3017d30ea906Sjfb8856606 } /* hash qinq */
3018d30ea906Sjfb8856606
3019d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3020d30ea906Sjfb8856606 return 0;
3021d30ea906Sjfb8856606 } /* hash */
3022d30ea906Sjfb8856606
3023d30ea906Sjfb8856606 if (strcmp(tokens[1], "lpm") == 0) {
3024d30ea906Sjfb8856606 if (n_tokens < 5) {
3025d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3026d30ea906Sjfb8856606 return 0;
3027d30ea906Sjfb8856606 }
3028d30ea906Sjfb8856606
3029d30ea906Sjfb8856606 m->match_type = TABLE_LPM;
3030d30ea906Sjfb8856606
3031d30ea906Sjfb8856606 if (strcmp(tokens[2], "ipv4") == 0) {
3032d30ea906Sjfb8856606 struct in_addr addr;
3033d30ea906Sjfb8856606
3034d30ea906Sjfb8856606 m->match.lpm.ip_version = 1;
3035d30ea906Sjfb8856606
3036d30ea906Sjfb8856606 if (parse_ipv4_addr(tokens[3], &addr) != 0) {
3037d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
3038d30ea906Sjfb8856606 "addr");
3039d30ea906Sjfb8856606 return 0;
3040d30ea906Sjfb8856606 }
3041d30ea906Sjfb8856606
3042d30ea906Sjfb8856606 m->match.lpm.ipv4 = rte_be_to_cpu_32(addr.s_addr);
3043d30ea906Sjfb8856606 } else if (strcmp(tokens[2], "ipv6") == 0) {
3044d30ea906Sjfb8856606 struct in6_addr addr;
3045d30ea906Sjfb8856606
3046d30ea906Sjfb8856606 m->match.lpm.ip_version = 0;
3047d30ea906Sjfb8856606
3048d30ea906Sjfb8856606 if (parse_ipv6_addr(tokens[3], &addr) != 0) {
3049d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
3050d30ea906Sjfb8856606 "addr");
3051d30ea906Sjfb8856606 return 0;
3052d30ea906Sjfb8856606 }
3053d30ea906Sjfb8856606
3054d30ea906Sjfb8856606 memcpy(m->match.lpm.ipv6, addr.s6_addr, 16);
3055d30ea906Sjfb8856606 } else {
3056d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
3057d30ea906Sjfb8856606 "ipv4 or ipv6");
3058d30ea906Sjfb8856606 return 0;
3059d30ea906Sjfb8856606 }
3060d30ea906Sjfb8856606
3061d30ea906Sjfb8856606 if (parser_read_uint8(&m->match.lpm.depth, tokens[4]) != 0) {
3062d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "depth");
3063d30ea906Sjfb8856606 return 0;
3064d30ea906Sjfb8856606 }
3065d30ea906Sjfb8856606
3066d30ea906Sjfb8856606 return 5;
3067d30ea906Sjfb8856606 } /* lpm */
3068d30ea906Sjfb8856606
3069d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
3070d30ea906Sjfb8856606 "acl or array or hash or lpm");
3071d30ea906Sjfb8856606 return 0;
3072d30ea906Sjfb8856606 }
3073d30ea906Sjfb8856606
3074d30ea906Sjfb8856606 /**
3075d30ea906Sjfb8856606 * table_action ::=
3076d30ea906Sjfb8856606 *
3077d30ea906Sjfb8856606 * action
3078d30ea906Sjfb8856606 * fwd
3079d30ea906Sjfb8856606 * drop
3080d30ea906Sjfb8856606 * | port <port_id>
3081d30ea906Sjfb8856606 * | meta
3082d30ea906Sjfb8856606 * | table <table_id>
3083d30ea906Sjfb8856606 * [balance <out0> ... <out7>]
3084d30ea906Sjfb8856606 * [meter
3085d30ea906Sjfb8856606 * tc0 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
3086d30ea906Sjfb8856606 * [tc1 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
3087d30ea906Sjfb8856606 * tc2 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
3088d30ea906Sjfb8856606 * tc3 meter <meter_profile_id> policer g <pa> y <pa> r <pa>]]
3089d30ea906Sjfb8856606 * [tm subport <subport_id> pipe <pipe_id>]
3090d30ea906Sjfb8856606 * [encap
3091d30ea906Sjfb8856606 * ether <da> <sa>
3092d30ea906Sjfb8856606 * | vlan <da> <sa> <pcp> <dei> <vid>
3093d30ea906Sjfb8856606 * | qinq <da> <sa> <pcp> <dei> <vid> <pcp> <dei> <vid>
30944418919fSjohnjiang * | qinq_pppoe <da> <sa> <pcp> <dei> <vid> <pcp> <dei> <vid> <session_id>
3095d30ea906Sjfb8856606 * | mpls unicast | multicast
3096d30ea906Sjfb8856606 * <da> <sa>
3097d30ea906Sjfb8856606 * label0 <label> <tc> <ttl>
3098d30ea906Sjfb8856606 * [label1 <label> <tc> <ttl>
3099d30ea906Sjfb8856606 * [label2 <label> <tc> <ttl>
3100d30ea906Sjfb8856606 * [label3 <label> <tc> <ttl>]]]
3101d30ea906Sjfb8856606 * | pppoe <da> <sa> <session_id>
3102d30ea906Sjfb8856606 * | vxlan ether <da> <sa>
3103d30ea906Sjfb8856606 * [vlan <pcp> <dei> <vid>]
3104d30ea906Sjfb8856606 * ipv4 <sa> <da> <dscp> <ttl>
3105d30ea906Sjfb8856606 * | ipv6 <sa> <da> <flow_label> <dscp> <hop_limit>
3106d30ea906Sjfb8856606 * udp <sp> <dp>
3107d30ea906Sjfb8856606 * vxlan <vni>]
3108d30ea906Sjfb8856606 * [nat ipv4 | ipv6 <addr> <port>]
3109d30ea906Sjfb8856606 * [ttl dec | keep]
3110d30ea906Sjfb8856606 * [stats]
3111d30ea906Sjfb8856606 * [time]
3112d30ea906Sjfb8856606 * [sym_crypto
3113d30ea906Sjfb8856606 * encrypt | decrypt
3114d30ea906Sjfb8856606 * type
3115d30ea906Sjfb8856606 * | cipher
3116d30ea906Sjfb8856606 * cipher_algo <algo> cipher_key <key> cipher_iv <iv>
3117d30ea906Sjfb8856606 * | cipher_auth
3118d30ea906Sjfb8856606 * cipher_algo <algo> cipher_key <key> cipher_iv <iv>
3119d30ea906Sjfb8856606 * auth_algo <algo> auth_key <key> digest_size <size>
3120d30ea906Sjfb8856606 * | aead
3121d30ea906Sjfb8856606 * aead_algo <algo> aead_key <key> aead_iv <iv> aead_aad <aad>
3122d30ea906Sjfb8856606 * digest_size <size>
3123d30ea906Sjfb8856606 * data_offset <data_offset>]
3124d30ea906Sjfb8856606 * [tag <tag>]
3125d30ea906Sjfb8856606 * [decap <n>]
3126d30ea906Sjfb8856606 *
3127d30ea906Sjfb8856606 * where:
3128d30ea906Sjfb8856606 * <pa> ::= g | y | r | drop
3129d30ea906Sjfb8856606 */
3130d30ea906Sjfb8856606 static uint32_t
parse_table_action_fwd(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)3131d30ea906Sjfb8856606 parse_table_action_fwd(char **tokens,
3132d30ea906Sjfb8856606 uint32_t n_tokens,
3133d30ea906Sjfb8856606 struct table_rule_action *a)
3134d30ea906Sjfb8856606 {
3135d30ea906Sjfb8856606 if ((n_tokens == 0) || (strcmp(tokens[0], "fwd") != 0))
3136d30ea906Sjfb8856606 return 0;
3137d30ea906Sjfb8856606
3138d30ea906Sjfb8856606 tokens++;
3139d30ea906Sjfb8856606 n_tokens--;
3140d30ea906Sjfb8856606
3141d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "drop") == 0)) {
3142d30ea906Sjfb8856606 a->fwd.action = RTE_PIPELINE_ACTION_DROP;
3143d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
3144d30ea906Sjfb8856606 return 1 + 1;
3145d30ea906Sjfb8856606 }
3146d30ea906Sjfb8856606
3147d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "port") == 0)) {
3148d30ea906Sjfb8856606 uint32_t id;
3149d30ea906Sjfb8856606
3150d30ea906Sjfb8856606 if ((n_tokens < 2) ||
3151d30ea906Sjfb8856606 parser_read_uint32(&id, tokens[1]))
3152d30ea906Sjfb8856606 return 0;
3153d30ea906Sjfb8856606
3154d30ea906Sjfb8856606 a->fwd.action = RTE_PIPELINE_ACTION_PORT;
3155d30ea906Sjfb8856606 a->fwd.id = id;
3156d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
3157d30ea906Sjfb8856606 return 1 + 2;
3158d30ea906Sjfb8856606 }
3159d30ea906Sjfb8856606
3160d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "meta") == 0)) {
3161d30ea906Sjfb8856606 a->fwd.action = RTE_PIPELINE_ACTION_PORT_META;
3162d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
3163d30ea906Sjfb8856606 return 1 + 1;
3164d30ea906Sjfb8856606 }
3165d30ea906Sjfb8856606
3166d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "table") == 0)) {
3167d30ea906Sjfb8856606 uint32_t id;
3168d30ea906Sjfb8856606
3169d30ea906Sjfb8856606 if ((n_tokens < 2) ||
3170d30ea906Sjfb8856606 parser_read_uint32(&id, tokens[1]))
3171d30ea906Sjfb8856606 return 0;
3172d30ea906Sjfb8856606
3173d30ea906Sjfb8856606 a->fwd.action = RTE_PIPELINE_ACTION_TABLE;
3174d30ea906Sjfb8856606 a->fwd.id = id;
3175d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
3176d30ea906Sjfb8856606 return 1 + 2;
3177d30ea906Sjfb8856606 }
3178d30ea906Sjfb8856606
3179d30ea906Sjfb8856606 return 0;
3180d30ea906Sjfb8856606 }
3181d30ea906Sjfb8856606
3182d30ea906Sjfb8856606 static uint32_t
parse_table_action_balance(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)3183d30ea906Sjfb8856606 parse_table_action_balance(char **tokens,
3184d30ea906Sjfb8856606 uint32_t n_tokens,
3185d30ea906Sjfb8856606 struct table_rule_action *a)
3186d30ea906Sjfb8856606 {
3187d30ea906Sjfb8856606 uint32_t i;
3188d30ea906Sjfb8856606
3189d30ea906Sjfb8856606 if ((n_tokens == 0) || (strcmp(tokens[0], "balance") != 0))
3190d30ea906Sjfb8856606 return 0;
3191d30ea906Sjfb8856606
3192d30ea906Sjfb8856606 tokens++;
3193d30ea906Sjfb8856606 n_tokens--;
3194d30ea906Sjfb8856606
3195d30ea906Sjfb8856606 if (n_tokens < RTE_TABLE_ACTION_LB_TABLE_SIZE)
3196d30ea906Sjfb8856606 return 0;
3197d30ea906Sjfb8856606
3198d30ea906Sjfb8856606 for (i = 0; i < RTE_TABLE_ACTION_LB_TABLE_SIZE; i++)
3199d30ea906Sjfb8856606 if (parser_read_uint32(&a->lb.out[i], tokens[i]) != 0)
3200d30ea906Sjfb8856606 return 0;
3201d30ea906Sjfb8856606
3202d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_LB;
3203d30ea906Sjfb8856606 return 1 + RTE_TABLE_ACTION_LB_TABLE_SIZE;
3204d30ea906Sjfb8856606
3205d30ea906Sjfb8856606 }
3206d30ea906Sjfb8856606
3207d30ea906Sjfb8856606 static int
parse_policer_action(char * token,enum rte_table_action_policer * a)3208d30ea906Sjfb8856606 parse_policer_action(char *token, enum rte_table_action_policer *a)
3209d30ea906Sjfb8856606 {
3210d30ea906Sjfb8856606 if (strcmp(token, "g") == 0) {
3211d30ea906Sjfb8856606 *a = RTE_TABLE_ACTION_POLICER_COLOR_GREEN;
3212d30ea906Sjfb8856606 return 0;
3213d30ea906Sjfb8856606 }
3214d30ea906Sjfb8856606
3215d30ea906Sjfb8856606 if (strcmp(token, "y") == 0) {
3216d30ea906Sjfb8856606 *a = RTE_TABLE_ACTION_POLICER_COLOR_YELLOW;
3217d30ea906Sjfb8856606 return 0;
3218d30ea906Sjfb8856606 }
3219d30ea906Sjfb8856606
3220d30ea906Sjfb8856606 if (strcmp(token, "r") == 0) {
3221d30ea906Sjfb8856606 *a = RTE_TABLE_ACTION_POLICER_COLOR_RED;
3222d30ea906Sjfb8856606 return 0;
3223d30ea906Sjfb8856606 }
3224d30ea906Sjfb8856606
3225d30ea906Sjfb8856606 if (strcmp(token, "drop") == 0) {
3226d30ea906Sjfb8856606 *a = RTE_TABLE_ACTION_POLICER_DROP;
3227d30ea906Sjfb8856606 return 0;
3228d30ea906Sjfb8856606 }
3229d30ea906Sjfb8856606
3230d30ea906Sjfb8856606 return -1;
3231d30ea906Sjfb8856606 }
3232d30ea906Sjfb8856606
3233d30ea906Sjfb8856606 static uint32_t
parse_table_action_meter_tc(char ** tokens,uint32_t n_tokens,struct rte_table_action_mtr_tc_params * mtr)3234d30ea906Sjfb8856606 parse_table_action_meter_tc(char **tokens,
3235d30ea906Sjfb8856606 uint32_t n_tokens,
3236d30ea906Sjfb8856606 struct rte_table_action_mtr_tc_params *mtr)
3237d30ea906Sjfb8856606 {
3238d30ea906Sjfb8856606 if ((n_tokens < 9) ||
3239d30ea906Sjfb8856606 strcmp(tokens[0], "meter") ||
3240d30ea906Sjfb8856606 parser_read_uint32(&mtr->meter_profile_id, tokens[1]) ||
3241d30ea906Sjfb8856606 strcmp(tokens[2], "policer") ||
3242d30ea906Sjfb8856606 strcmp(tokens[3], "g") ||
32434418919fSjohnjiang parse_policer_action(tokens[4], &mtr->policer[RTE_COLOR_GREEN]) ||
3244d30ea906Sjfb8856606 strcmp(tokens[5], "y") ||
32454418919fSjohnjiang parse_policer_action(tokens[6], &mtr->policer[RTE_COLOR_YELLOW]) ||
3246d30ea906Sjfb8856606 strcmp(tokens[7], "r") ||
32474418919fSjohnjiang parse_policer_action(tokens[8], &mtr->policer[RTE_COLOR_RED]))
3248d30ea906Sjfb8856606 return 0;
3249d30ea906Sjfb8856606
3250d30ea906Sjfb8856606 return 9;
3251d30ea906Sjfb8856606 }
3252d30ea906Sjfb8856606
3253d30ea906Sjfb8856606 static uint32_t
parse_table_action_meter(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)3254d30ea906Sjfb8856606 parse_table_action_meter(char **tokens,
3255d30ea906Sjfb8856606 uint32_t n_tokens,
3256d30ea906Sjfb8856606 struct table_rule_action *a)
3257d30ea906Sjfb8856606 {
3258d30ea906Sjfb8856606 if ((n_tokens == 0) || strcmp(tokens[0], "meter"))
3259d30ea906Sjfb8856606 return 0;
3260d30ea906Sjfb8856606
3261d30ea906Sjfb8856606 tokens++;
3262d30ea906Sjfb8856606 n_tokens--;
3263d30ea906Sjfb8856606
3264d30ea906Sjfb8856606 if ((n_tokens < 10) ||
3265d30ea906Sjfb8856606 strcmp(tokens[0], "tc0") ||
3266d30ea906Sjfb8856606 (parse_table_action_meter_tc(tokens + 1,
3267d30ea906Sjfb8856606 n_tokens - 1,
3268d30ea906Sjfb8856606 &a->mtr.mtr[0]) == 0))
3269d30ea906Sjfb8856606 return 0;
3270d30ea906Sjfb8856606
3271d30ea906Sjfb8856606 tokens += 10;
3272d30ea906Sjfb8856606 n_tokens -= 10;
3273d30ea906Sjfb8856606
3274d30ea906Sjfb8856606 if ((n_tokens == 0) || strcmp(tokens[0], "tc1")) {
3275d30ea906Sjfb8856606 a->mtr.tc_mask = 1;
3276d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_MTR;
3277d30ea906Sjfb8856606 return 1 + 10;
3278d30ea906Sjfb8856606 }
3279d30ea906Sjfb8856606
3280d30ea906Sjfb8856606 if ((n_tokens < 30) ||
3281d30ea906Sjfb8856606 (parse_table_action_meter_tc(tokens + 1,
3282d30ea906Sjfb8856606 n_tokens - 1, &a->mtr.mtr[1]) == 0) ||
3283d30ea906Sjfb8856606 strcmp(tokens[10], "tc2") ||
3284d30ea906Sjfb8856606 (parse_table_action_meter_tc(tokens + 11,
3285d30ea906Sjfb8856606 n_tokens - 11, &a->mtr.mtr[2]) == 0) ||
3286d30ea906Sjfb8856606 strcmp(tokens[20], "tc3") ||
3287d30ea906Sjfb8856606 (parse_table_action_meter_tc(tokens + 21,
3288d30ea906Sjfb8856606 n_tokens - 21, &a->mtr.mtr[3]) == 0))
3289d30ea906Sjfb8856606 return 0;
3290d30ea906Sjfb8856606
3291d30ea906Sjfb8856606 a->mtr.tc_mask = 0xF;
3292d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_MTR;
3293d30ea906Sjfb8856606 return 1 + 10 + 3 * 10;
3294d30ea906Sjfb8856606 }
3295d30ea906Sjfb8856606
3296d30ea906Sjfb8856606 static uint32_t
parse_table_action_tm(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)3297d30ea906Sjfb8856606 parse_table_action_tm(char **tokens,
3298d30ea906Sjfb8856606 uint32_t n_tokens,
3299d30ea906Sjfb8856606 struct table_rule_action *a)
3300d30ea906Sjfb8856606 {
3301d30ea906Sjfb8856606 uint32_t subport_id, pipe_id;
3302d30ea906Sjfb8856606
3303d30ea906Sjfb8856606 if ((n_tokens < 5) ||
3304d30ea906Sjfb8856606 strcmp(tokens[0], "tm") ||
3305d30ea906Sjfb8856606 strcmp(tokens[1], "subport") ||
3306d30ea906Sjfb8856606 parser_read_uint32(&subport_id, tokens[2]) ||
3307d30ea906Sjfb8856606 strcmp(tokens[3], "pipe") ||
3308d30ea906Sjfb8856606 parser_read_uint32(&pipe_id, tokens[4]))
3309d30ea906Sjfb8856606 return 0;
3310d30ea906Sjfb8856606
3311d30ea906Sjfb8856606 a->tm.subport_id = subport_id;
3312d30ea906Sjfb8856606 a->tm.pipe_id = pipe_id;
3313d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_TM;
3314d30ea906Sjfb8856606 return 5;
3315d30ea906Sjfb8856606 }
3316d30ea906Sjfb8856606
3317d30ea906Sjfb8856606 static uint32_t
parse_table_action_encap(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)3318d30ea906Sjfb8856606 parse_table_action_encap(char **tokens,
3319d30ea906Sjfb8856606 uint32_t n_tokens,
3320d30ea906Sjfb8856606 struct table_rule_action *a)
3321d30ea906Sjfb8856606 {
3322d30ea906Sjfb8856606 if ((n_tokens == 0) || strcmp(tokens[0], "encap"))
3323d30ea906Sjfb8856606 return 0;
3324d30ea906Sjfb8856606
3325d30ea906Sjfb8856606 tokens++;
3326d30ea906Sjfb8856606 n_tokens--;
3327d30ea906Sjfb8856606
3328d30ea906Sjfb8856606 /* ether */
3329d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "ether") == 0)) {
3330d30ea906Sjfb8856606 if ((n_tokens < 3) ||
3331d30ea906Sjfb8856606 parse_mac_addr(tokens[1], &a->encap.ether.ether.da) ||
3332d30ea906Sjfb8856606 parse_mac_addr(tokens[2], &a->encap.ether.ether.sa))
3333d30ea906Sjfb8856606 return 0;
3334d30ea906Sjfb8856606
3335d30ea906Sjfb8856606 a->encap.type = RTE_TABLE_ACTION_ENCAP_ETHER;
3336d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3337d30ea906Sjfb8856606 return 1 + 3;
3338d30ea906Sjfb8856606 }
3339d30ea906Sjfb8856606
3340d30ea906Sjfb8856606 /* vlan */
3341d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "vlan") == 0)) {
3342d30ea906Sjfb8856606 uint32_t pcp, dei, vid;
3343d30ea906Sjfb8856606
3344d30ea906Sjfb8856606 if ((n_tokens < 6) ||
3345d30ea906Sjfb8856606 parse_mac_addr(tokens[1], &a->encap.vlan.ether.da) ||
3346d30ea906Sjfb8856606 parse_mac_addr(tokens[2], &a->encap.vlan.ether.sa) ||
3347d30ea906Sjfb8856606 parser_read_uint32(&pcp, tokens[3]) ||
3348d30ea906Sjfb8856606 (pcp > 0x7) ||
3349d30ea906Sjfb8856606 parser_read_uint32(&dei, tokens[4]) ||
3350d30ea906Sjfb8856606 (dei > 0x1) ||
3351d30ea906Sjfb8856606 parser_read_uint32(&vid, tokens[5]) ||
3352d30ea906Sjfb8856606 (vid > 0xFFF))
3353d30ea906Sjfb8856606 return 0;
3354d30ea906Sjfb8856606
3355d30ea906Sjfb8856606 a->encap.vlan.vlan.pcp = pcp & 0x7;
3356d30ea906Sjfb8856606 a->encap.vlan.vlan.dei = dei & 0x1;
3357d30ea906Sjfb8856606 a->encap.vlan.vlan.vid = vid & 0xFFF;
3358d30ea906Sjfb8856606 a->encap.type = RTE_TABLE_ACTION_ENCAP_VLAN;
3359d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3360d30ea906Sjfb8856606 return 1 + 6;
3361d30ea906Sjfb8856606 }
3362d30ea906Sjfb8856606
3363d30ea906Sjfb8856606 /* qinq */
3364d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "qinq") == 0)) {
3365d30ea906Sjfb8856606 uint32_t svlan_pcp, svlan_dei, svlan_vid;
3366d30ea906Sjfb8856606 uint32_t cvlan_pcp, cvlan_dei, cvlan_vid;
3367d30ea906Sjfb8856606
3368d30ea906Sjfb8856606 if ((n_tokens < 9) ||
3369d30ea906Sjfb8856606 parse_mac_addr(tokens[1], &a->encap.qinq.ether.da) ||
3370d30ea906Sjfb8856606 parse_mac_addr(tokens[2], &a->encap.qinq.ether.sa) ||
3371d30ea906Sjfb8856606 parser_read_uint32(&svlan_pcp, tokens[3]) ||
3372d30ea906Sjfb8856606 (svlan_pcp > 0x7) ||
3373d30ea906Sjfb8856606 parser_read_uint32(&svlan_dei, tokens[4]) ||
3374d30ea906Sjfb8856606 (svlan_dei > 0x1) ||
3375d30ea906Sjfb8856606 parser_read_uint32(&svlan_vid, tokens[5]) ||
3376d30ea906Sjfb8856606 (svlan_vid > 0xFFF) ||
3377d30ea906Sjfb8856606 parser_read_uint32(&cvlan_pcp, tokens[6]) ||
3378d30ea906Sjfb8856606 (cvlan_pcp > 0x7) ||
3379d30ea906Sjfb8856606 parser_read_uint32(&cvlan_dei, tokens[7]) ||
3380d30ea906Sjfb8856606 (cvlan_dei > 0x1) ||
3381d30ea906Sjfb8856606 parser_read_uint32(&cvlan_vid, tokens[8]) ||
3382d30ea906Sjfb8856606 (cvlan_vid > 0xFFF))
3383d30ea906Sjfb8856606 return 0;
3384d30ea906Sjfb8856606
3385d30ea906Sjfb8856606 a->encap.qinq.svlan.pcp = svlan_pcp & 0x7;
3386d30ea906Sjfb8856606 a->encap.qinq.svlan.dei = svlan_dei & 0x1;
3387d30ea906Sjfb8856606 a->encap.qinq.svlan.vid = svlan_vid & 0xFFF;
3388d30ea906Sjfb8856606 a->encap.qinq.cvlan.pcp = cvlan_pcp & 0x7;
3389d30ea906Sjfb8856606 a->encap.qinq.cvlan.dei = cvlan_dei & 0x1;
3390d30ea906Sjfb8856606 a->encap.qinq.cvlan.vid = cvlan_vid & 0xFFF;
3391d30ea906Sjfb8856606 a->encap.type = RTE_TABLE_ACTION_ENCAP_QINQ;
3392d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3393d30ea906Sjfb8856606 return 1 + 9;
3394d30ea906Sjfb8856606 }
3395d30ea906Sjfb8856606
33964418919fSjohnjiang /* qinq_pppoe */
33974418919fSjohnjiang if (n_tokens && (strcmp(tokens[0], "qinq_pppoe") == 0)) {
33984418919fSjohnjiang uint32_t svlan_pcp, svlan_dei, svlan_vid;
33994418919fSjohnjiang uint32_t cvlan_pcp, cvlan_dei, cvlan_vid;
34004418919fSjohnjiang
34014418919fSjohnjiang if ((n_tokens < 10) ||
34024418919fSjohnjiang parse_mac_addr(tokens[1],
34034418919fSjohnjiang &a->encap.qinq_pppoe.ether.da) ||
34044418919fSjohnjiang parse_mac_addr(tokens[2],
34054418919fSjohnjiang &a->encap.qinq_pppoe.ether.sa) ||
34064418919fSjohnjiang parser_read_uint32(&svlan_pcp, tokens[3]) ||
34074418919fSjohnjiang (svlan_pcp > 0x7) ||
34084418919fSjohnjiang parser_read_uint32(&svlan_dei, tokens[4]) ||
34094418919fSjohnjiang (svlan_dei > 0x1) ||
34104418919fSjohnjiang parser_read_uint32(&svlan_vid, tokens[5]) ||
34114418919fSjohnjiang (svlan_vid > 0xFFF) ||
34124418919fSjohnjiang parser_read_uint32(&cvlan_pcp, tokens[6]) ||
34134418919fSjohnjiang (cvlan_pcp > 0x7) ||
34144418919fSjohnjiang parser_read_uint32(&cvlan_dei, tokens[7]) ||
34154418919fSjohnjiang (cvlan_dei > 0x1) ||
34164418919fSjohnjiang parser_read_uint32(&cvlan_vid, tokens[8]) ||
34174418919fSjohnjiang (cvlan_vid > 0xFFF) ||
34184418919fSjohnjiang parser_read_uint16(&a->encap.qinq_pppoe.pppoe.session_id,
34194418919fSjohnjiang tokens[9]))
34204418919fSjohnjiang return 0;
34214418919fSjohnjiang
34224418919fSjohnjiang a->encap.qinq_pppoe.svlan.pcp = svlan_pcp & 0x7;
34234418919fSjohnjiang a->encap.qinq_pppoe.svlan.dei = svlan_dei & 0x1;
34244418919fSjohnjiang a->encap.qinq_pppoe.svlan.vid = svlan_vid & 0xFFF;
34254418919fSjohnjiang a->encap.qinq_pppoe.cvlan.pcp = cvlan_pcp & 0x7;
34264418919fSjohnjiang a->encap.qinq_pppoe.cvlan.dei = cvlan_dei & 0x1;
34274418919fSjohnjiang a->encap.qinq_pppoe.cvlan.vid = cvlan_vid & 0xFFF;
34284418919fSjohnjiang a->encap.type = RTE_TABLE_ACTION_ENCAP_QINQ_PPPOE;
34294418919fSjohnjiang a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
34304418919fSjohnjiang return 1 + 10;
34314418919fSjohnjiang
34324418919fSjohnjiang }
34334418919fSjohnjiang
3434d30ea906Sjfb8856606 /* mpls */
3435d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "mpls") == 0)) {
3436d30ea906Sjfb8856606 uint32_t label, tc, ttl;
3437d30ea906Sjfb8856606
3438d30ea906Sjfb8856606 if (n_tokens < 8)
3439d30ea906Sjfb8856606 return 0;
3440d30ea906Sjfb8856606
3441d30ea906Sjfb8856606 if (strcmp(tokens[1], "unicast") == 0)
3442d30ea906Sjfb8856606 a->encap.mpls.unicast = 1;
3443d30ea906Sjfb8856606 else if (strcmp(tokens[1], "multicast") == 0)
3444d30ea906Sjfb8856606 a->encap.mpls.unicast = 0;
3445d30ea906Sjfb8856606 else
3446d30ea906Sjfb8856606 return 0;
3447d30ea906Sjfb8856606
3448d30ea906Sjfb8856606 if (parse_mac_addr(tokens[2], &a->encap.mpls.ether.da) ||
3449d30ea906Sjfb8856606 parse_mac_addr(tokens[3], &a->encap.mpls.ether.sa) ||
3450d30ea906Sjfb8856606 strcmp(tokens[4], "label0") ||
3451d30ea906Sjfb8856606 parser_read_uint32(&label, tokens[5]) ||
3452d30ea906Sjfb8856606 (label > 0xFFFFF) ||
3453d30ea906Sjfb8856606 parser_read_uint32(&tc, tokens[6]) ||
3454d30ea906Sjfb8856606 (tc > 0x7) ||
3455d30ea906Sjfb8856606 parser_read_uint32(&ttl, tokens[7]) ||
3456d30ea906Sjfb8856606 (ttl > 0x3F))
3457d30ea906Sjfb8856606 return 0;
3458d30ea906Sjfb8856606
3459d30ea906Sjfb8856606 a->encap.mpls.mpls[0].label = label;
3460d30ea906Sjfb8856606 a->encap.mpls.mpls[0].tc = tc;
3461d30ea906Sjfb8856606 a->encap.mpls.mpls[0].ttl = ttl;
3462d30ea906Sjfb8856606
3463d30ea906Sjfb8856606 tokens += 8;
3464d30ea906Sjfb8856606 n_tokens -= 8;
3465d30ea906Sjfb8856606
3466d30ea906Sjfb8856606 if ((n_tokens == 0) || strcmp(tokens[0], "label1")) {
3467d30ea906Sjfb8856606 a->encap.mpls.mpls_count = 1;
3468d30ea906Sjfb8856606 a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3469d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3470d30ea906Sjfb8856606 return 1 + 8;
3471d30ea906Sjfb8856606 }
3472d30ea906Sjfb8856606
3473d30ea906Sjfb8856606 if ((n_tokens < 4) ||
3474d30ea906Sjfb8856606 parser_read_uint32(&label, tokens[1]) ||
3475d30ea906Sjfb8856606 (label > 0xFFFFF) ||
3476d30ea906Sjfb8856606 parser_read_uint32(&tc, tokens[2]) ||
3477d30ea906Sjfb8856606 (tc > 0x7) ||
3478d30ea906Sjfb8856606 parser_read_uint32(&ttl, tokens[3]) ||
3479d30ea906Sjfb8856606 (ttl > 0x3F))
3480d30ea906Sjfb8856606 return 0;
3481d30ea906Sjfb8856606
3482d30ea906Sjfb8856606 a->encap.mpls.mpls[1].label = label;
3483d30ea906Sjfb8856606 a->encap.mpls.mpls[1].tc = tc;
3484d30ea906Sjfb8856606 a->encap.mpls.mpls[1].ttl = ttl;
3485d30ea906Sjfb8856606
3486d30ea906Sjfb8856606 tokens += 4;
3487d30ea906Sjfb8856606 n_tokens -= 4;
3488d30ea906Sjfb8856606
3489d30ea906Sjfb8856606 if ((n_tokens == 0) || strcmp(tokens[0], "label2")) {
3490d30ea906Sjfb8856606 a->encap.mpls.mpls_count = 2;
3491d30ea906Sjfb8856606 a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3492d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3493d30ea906Sjfb8856606 return 1 + 8 + 4;
3494d30ea906Sjfb8856606 }
3495d30ea906Sjfb8856606
3496d30ea906Sjfb8856606 if ((n_tokens < 4) ||
3497d30ea906Sjfb8856606 parser_read_uint32(&label, tokens[1]) ||
3498d30ea906Sjfb8856606 (label > 0xFFFFF) ||
3499d30ea906Sjfb8856606 parser_read_uint32(&tc, tokens[2]) ||
3500d30ea906Sjfb8856606 (tc > 0x7) ||
3501d30ea906Sjfb8856606 parser_read_uint32(&ttl, tokens[3]) ||
3502d30ea906Sjfb8856606 (ttl > 0x3F))
3503d30ea906Sjfb8856606 return 0;
3504d30ea906Sjfb8856606
3505d30ea906Sjfb8856606 a->encap.mpls.mpls[2].label = label;
3506d30ea906Sjfb8856606 a->encap.mpls.mpls[2].tc = tc;
3507d30ea906Sjfb8856606 a->encap.mpls.mpls[2].ttl = ttl;
3508d30ea906Sjfb8856606
3509d30ea906Sjfb8856606 tokens += 4;
3510d30ea906Sjfb8856606 n_tokens -= 4;
3511d30ea906Sjfb8856606
3512d30ea906Sjfb8856606 if ((n_tokens == 0) || strcmp(tokens[0], "label3")) {
3513d30ea906Sjfb8856606 a->encap.mpls.mpls_count = 3;
3514d30ea906Sjfb8856606 a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3515d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3516d30ea906Sjfb8856606 return 1 + 8 + 4 + 4;
3517d30ea906Sjfb8856606 }
3518d30ea906Sjfb8856606
3519d30ea906Sjfb8856606 if ((n_tokens < 4) ||
3520d30ea906Sjfb8856606 parser_read_uint32(&label, tokens[1]) ||
3521d30ea906Sjfb8856606 (label > 0xFFFFF) ||
3522d30ea906Sjfb8856606 parser_read_uint32(&tc, tokens[2]) ||
3523d30ea906Sjfb8856606 (tc > 0x7) ||
3524d30ea906Sjfb8856606 parser_read_uint32(&ttl, tokens[3]) ||
3525d30ea906Sjfb8856606 (ttl > 0x3F))
3526d30ea906Sjfb8856606 return 0;
3527d30ea906Sjfb8856606
3528d30ea906Sjfb8856606 a->encap.mpls.mpls[3].label = label;
3529d30ea906Sjfb8856606 a->encap.mpls.mpls[3].tc = tc;
3530d30ea906Sjfb8856606 a->encap.mpls.mpls[3].ttl = ttl;
3531d30ea906Sjfb8856606
3532d30ea906Sjfb8856606 a->encap.mpls.mpls_count = 4;
3533d30ea906Sjfb8856606 a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3534d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3535d30ea906Sjfb8856606 return 1 + 8 + 4 + 4 + 4;
3536d30ea906Sjfb8856606 }
3537d30ea906Sjfb8856606
3538d30ea906Sjfb8856606 /* pppoe */
3539d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "pppoe") == 0)) {
3540d30ea906Sjfb8856606 if ((n_tokens < 4) ||
3541d30ea906Sjfb8856606 parse_mac_addr(tokens[1], &a->encap.pppoe.ether.da) ||
3542d30ea906Sjfb8856606 parse_mac_addr(tokens[2], &a->encap.pppoe.ether.sa) ||
3543d30ea906Sjfb8856606 parser_read_uint16(&a->encap.pppoe.pppoe.session_id,
3544d30ea906Sjfb8856606 tokens[3]))
3545d30ea906Sjfb8856606 return 0;
3546d30ea906Sjfb8856606
3547d30ea906Sjfb8856606 a->encap.type = RTE_TABLE_ACTION_ENCAP_PPPOE;
3548d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3549d30ea906Sjfb8856606 return 1 + 4;
3550d30ea906Sjfb8856606 }
3551d30ea906Sjfb8856606
3552d30ea906Sjfb8856606 /* vxlan */
3553d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "vxlan") == 0)) {
3554d30ea906Sjfb8856606 uint32_t n = 0;
3555d30ea906Sjfb8856606
3556d30ea906Sjfb8856606 n_tokens--;
3557d30ea906Sjfb8856606 tokens++;
3558d30ea906Sjfb8856606 n++;
3559d30ea906Sjfb8856606
3560d30ea906Sjfb8856606 /* ether <da> <sa> */
3561d30ea906Sjfb8856606 if ((n_tokens < 3) ||
3562d30ea906Sjfb8856606 strcmp(tokens[0], "ether") ||
3563d30ea906Sjfb8856606 parse_mac_addr(tokens[1], &a->encap.vxlan.ether.da) ||
3564d30ea906Sjfb8856606 parse_mac_addr(tokens[2], &a->encap.vxlan.ether.sa))
3565d30ea906Sjfb8856606 return 0;
3566d30ea906Sjfb8856606
3567d30ea906Sjfb8856606 n_tokens -= 3;
3568d30ea906Sjfb8856606 tokens += 3;
3569d30ea906Sjfb8856606 n += 3;
3570d30ea906Sjfb8856606
3571d30ea906Sjfb8856606 /* [vlan <pcp> <dei> <vid>] */
3572d30ea906Sjfb8856606 if (strcmp(tokens[0], "vlan") == 0) {
3573d30ea906Sjfb8856606 uint32_t pcp, dei, vid;
3574d30ea906Sjfb8856606
3575d30ea906Sjfb8856606 if ((n_tokens < 4) ||
3576d30ea906Sjfb8856606 parser_read_uint32(&pcp, tokens[1]) ||
3577d30ea906Sjfb8856606 (pcp > 7) ||
3578d30ea906Sjfb8856606 parser_read_uint32(&dei, tokens[2]) ||
3579d30ea906Sjfb8856606 (dei > 1) ||
3580d30ea906Sjfb8856606 parser_read_uint32(&vid, tokens[3]) ||
3581d30ea906Sjfb8856606 (vid > 0xFFF))
3582d30ea906Sjfb8856606 return 0;
3583d30ea906Sjfb8856606
3584d30ea906Sjfb8856606 a->encap.vxlan.vlan.pcp = pcp;
3585d30ea906Sjfb8856606 a->encap.vxlan.vlan.dei = dei;
3586d30ea906Sjfb8856606 a->encap.vxlan.vlan.vid = vid;
3587d30ea906Sjfb8856606
3588d30ea906Sjfb8856606 n_tokens -= 4;
3589d30ea906Sjfb8856606 tokens += 4;
3590d30ea906Sjfb8856606 n += 4;
3591d30ea906Sjfb8856606 }
3592d30ea906Sjfb8856606
3593d30ea906Sjfb8856606 /* ipv4 <sa> <da> <dscp> <ttl>
3594d30ea906Sjfb8856606 | ipv6 <sa> <da> <flow_label> <dscp> <hop_limit> */
3595d30ea906Sjfb8856606 if (strcmp(tokens[0], "ipv4") == 0) {
3596d30ea906Sjfb8856606 struct in_addr sa, da;
3597d30ea906Sjfb8856606 uint8_t dscp, ttl;
3598d30ea906Sjfb8856606
3599d30ea906Sjfb8856606 if ((n_tokens < 5) ||
3600d30ea906Sjfb8856606 parse_ipv4_addr(tokens[1], &sa) ||
3601d30ea906Sjfb8856606 parse_ipv4_addr(tokens[2], &da) ||
3602d30ea906Sjfb8856606 parser_read_uint8(&dscp, tokens[3]) ||
3603d30ea906Sjfb8856606 (dscp > 64) ||
3604d30ea906Sjfb8856606 parser_read_uint8(&ttl, tokens[4]))
3605d30ea906Sjfb8856606 return 0;
3606d30ea906Sjfb8856606
3607d30ea906Sjfb8856606 a->encap.vxlan.ipv4.sa = rte_be_to_cpu_32(sa.s_addr);
3608d30ea906Sjfb8856606 a->encap.vxlan.ipv4.da = rte_be_to_cpu_32(da.s_addr);
3609d30ea906Sjfb8856606 a->encap.vxlan.ipv4.dscp = dscp;
3610d30ea906Sjfb8856606 a->encap.vxlan.ipv4.ttl = ttl;
3611d30ea906Sjfb8856606
3612d30ea906Sjfb8856606 n_tokens -= 5;
3613d30ea906Sjfb8856606 tokens += 5;
3614d30ea906Sjfb8856606 n += 5;
3615d30ea906Sjfb8856606 } else if (strcmp(tokens[0], "ipv6") == 0) {
3616d30ea906Sjfb8856606 struct in6_addr sa, da;
3617d30ea906Sjfb8856606 uint32_t flow_label;
3618d30ea906Sjfb8856606 uint8_t dscp, hop_limit;
3619d30ea906Sjfb8856606
3620d30ea906Sjfb8856606 if ((n_tokens < 6) ||
3621d30ea906Sjfb8856606 parse_ipv6_addr(tokens[1], &sa) ||
3622d30ea906Sjfb8856606 parse_ipv6_addr(tokens[2], &da) ||
3623d30ea906Sjfb8856606 parser_read_uint32(&flow_label, tokens[3]) ||
3624d30ea906Sjfb8856606 parser_read_uint8(&dscp, tokens[4]) ||
3625d30ea906Sjfb8856606 (dscp > 64) ||
3626d30ea906Sjfb8856606 parser_read_uint8(&hop_limit, tokens[5]))
3627d30ea906Sjfb8856606 return 0;
3628d30ea906Sjfb8856606
3629d30ea906Sjfb8856606 memcpy(a->encap.vxlan.ipv6.sa, sa.s6_addr, 16);
3630d30ea906Sjfb8856606 memcpy(a->encap.vxlan.ipv6.da, da.s6_addr, 16);
3631d30ea906Sjfb8856606 a->encap.vxlan.ipv6.flow_label = flow_label;
3632d30ea906Sjfb8856606 a->encap.vxlan.ipv6.dscp = dscp;
3633d30ea906Sjfb8856606 a->encap.vxlan.ipv6.hop_limit = hop_limit;
3634d30ea906Sjfb8856606
3635d30ea906Sjfb8856606 n_tokens -= 6;
3636d30ea906Sjfb8856606 tokens += 6;
3637d30ea906Sjfb8856606 n += 6;
3638d30ea906Sjfb8856606 } else
3639d30ea906Sjfb8856606 return 0;
3640d30ea906Sjfb8856606
3641d30ea906Sjfb8856606 /* udp <sp> <dp> */
3642d30ea906Sjfb8856606 if ((n_tokens < 3) ||
3643d30ea906Sjfb8856606 strcmp(tokens[0], "udp") ||
3644d30ea906Sjfb8856606 parser_read_uint16(&a->encap.vxlan.udp.sp, tokens[1]) ||
3645d30ea906Sjfb8856606 parser_read_uint16(&a->encap.vxlan.udp.dp, tokens[2]))
3646d30ea906Sjfb8856606 return 0;
3647d30ea906Sjfb8856606
3648d30ea906Sjfb8856606 n_tokens -= 3;
3649d30ea906Sjfb8856606 tokens += 3;
3650d30ea906Sjfb8856606 n += 3;
3651d30ea906Sjfb8856606
3652d30ea906Sjfb8856606 /* vxlan <vni> */
3653d30ea906Sjfb8856606 if ((n_tokens < 2) ||
3654d30ea906Sjfb8856606 strcmp(tokens[0], "vxlan") ||
3655d30ea906Sjfb8856606 parser_read_uint32(&a->encap.vxlan.vxlan.vni, tokens[1]) ||
3656d30ea906Sjfb8856606 (a->encap.vxlan.vxlan.vni > 0xFFFFFF))
3657d30ea906Sjfb8856606 return 0;
3658d30ea906Sjfb8856606
3659d30ea906Sjfb8856606 n_tokens -= 2;
3660d30ea906Sjfb8856606 tokens += 2;
3661d30ea906Sjfb8856606 n += 2;
3662d30ea906Sjfb8856606
3663d30ea906Sjfb8856606 a->encap.type = RTE_TABLE_ACTION_ENCAP_VXLAN;
3664d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3665d30ea906Sjfb8856606 return 1 + n;
3666d30ea906Sjfb8856606 }
3667d30ea906Sjfb8856606
3668d30ea906Sjfb8856606 return 0;
3669d30ea906Sjfb8856606 }
3670d30ea906Sjfb8856606
3671d30ea906Sjfb8856606 static uint32_t
parse_table_action_nat(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)3672d30ea906Sjfb8856606 parse_table_action_nat(char **tokens,
3673d30ea906Sjfb8856606 uint32_t n_tokens,
3674d30ea906Sjfb8856606 struct table_rule_action *a)
3675d30ea906Sjfb8856606 {
3676d30ea906Sjfb8856606 if ((n_tokens < 4) ||
3677d30ea906Sjfb8856606 strcmp(tokens[0], "nat"))
3678d30ea906Sjfb8856606 return 0;
3679d30ea906Sjfb8856606
3680d30ea906Sjfb8856606 if (strcmp(tokens[1], "ipv4") == 0) {
3681d30ea906Sjfb8856606 struct in_addr addr;
3682d30ea906Sjfb8856606 uint16_t port;
3683d30ea906Sjfb8856606
3684d30ea906Sjfb8856606 if (parse_ipv4_addr(tokens[2], &addr) ||
3685d30ea906Sjfb8856606 parser_read_uint16(&port, tokens[3]))
3686d30ea906Sjfb8856606 return 0;
3687d30ea906Sjfb8856606
3688d30ea906Sjfb8856606 a->nat.ip_version = 1;
3689d30ea906Sjfb8856606 a->nat.addr.ipv4 = rte_be_to_cpu_32(addr.s_addr);
3690d30ea906Sjfb8856606 a->nat.port = port;
3691d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_NAT;
3692d30ea906Sjfb8856606 return 4;
3693d30ea906Sjfb8856606 }
3694d30ea906Sjfb8856606
3695d30ea906Sjfb8856606 if (strcmp(tokens[1], "ipv6") == 0) {
3696d30ea906Sjfb8856606 struct in6_addr addr;
3697d30ea906Sjfb8856606 uint16_t port;
3698d30ea906Sjfb8856606
3699d30ea906Sjfb8856606 if (parse_ipv6_addr(tokens[2], &addr) ||
3700d30ea906Sjfb8856606 parser_read_uint16(&port, tokens[3]))
3701d30ea906Sjfb8856606 return 0;
3702d30ea906Sjfb8856606
3703d30ea906Sjfb8856606 a->nat.ip_version = 0;
3704d30ea906Sjfb8856606 memcpy(a->nat.addr.ipv6, addr.s6_addr, 16);
3705d30ea906Sjfb8856606 a->nat.port = port;
3706d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_NAT;
3707d30ea906Sjfb8856606 return 4;
3708d30ea906Sjfb8856606 }
3709d30ea906Sjfb8856606
3710d30ea906Sjfb8856606 return 0;
3711d30ea906Sjfb8856606 }
3712d30ea906Sjfb8856606
3713d30ea906Sjfb8856606 static uint32_t
parse_table_action_ttl(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)3714d30ea906Sjfb8856606 parse_table_action_ttl(char **tokens,
3715d30ea906Sjfb8856606 uint32_t n_tokens,
3716d30ea906Sjfb8856606 struct table_rule_action *a)
3717d30ea906Sjfb8856606 {
3718d30ea906Sjfb8856606 if ((n_tokens < 2) ||
3719d30ea906Sjfb8856606 strcmp(tokens[0], "ttl"))
3720d30ea906Sjfb8856606 return 0;
3721d30ea906Sjfb8856606
3722d30ea906Sjfb8856606 if (strcmp(tokens[1], "dec") == 0)
3723d30ea906Sjfb8856606 a->ttl.decrement = 1;
3724d30ea906Sjfb8856606 else if (strcmp(tokens[1], "keep") == 0)
3725d30ea906Sjfb8856606 a->ttl.decrement = 0;
3726d30ea906Sjfb8856606 else
3727d30ea906Sjfb8856606 return 0;
3728d30ea906Sjfb8856606
3729d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_TTL;
3730d30ea906Sjfb8856606 return 2;
3731d30ea906Sjfb8856606 }
3732d30ea906Sjfb8856606
3733d30ea906Sjfb8856606 static uint32_t
parse_table_action_stats(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)3734d30ea906Sjfb8856606 parse_table_action_stats(char **tokens,
3735d30ea906Sjfb8856606 uint32_t n_tokens,
3736d30ea906Sjfb8856606 struct table_rule_action *a)
3737d30ea906Sjfb8856606 {
3738d30ea906Sjfb8856606 if ((n_tokens < 1) ||
3739d30ea906Sjfb8856606 strcmp(tokens[0], "stats"))
3740d30ea906Sjfb8856606 return 0;
3741d30ea906Sjfb8856606
3742d30ea906Sjfb8856606 a->stats.n_packets = 0;
3743d30ea906Sjfb8856606 a->stats.n_bytes = 0;
3744d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_STATS;
3745d30ea906Sjfb8856606 return 1;
3746d30ea906Sjfb8856606 }
3747d30ea906Sjfb8856606
3748d30ea906Sjfb8856606 static uint32_t
parse_table_action_time(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)3749d30ea906Sjfb8856606 parse_table_action_time(char **tokens,
3750d30ea906Sjfb8856606 uint32_t n_tokens,
3751d30ea906Sjfb8856606 struct table_rule_action *a)
3752d30ea906Sjfb8856606 {
3753d30ea906Sjfb8856606 if ((n_tokens < 1) ||
3754d30ea906Sjfb8856606 strcmp(tokens[0], "time"))
3755d30ea906Sjfb8856606 return 0;
3756d30ea906Sjfb8856606
3757d30ea906Sjfb8856606 a->time.time = rte_rdtsc();
3758d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_TIME;
3759d30ea906Sjfb8856606 return 1;
3760d30ea906Sjfb8856606 }
3761d30ea906Sjfb8856606
3762d30ea906Sjfb8856606 static void
parse_free_sym_crypto_param_data(struct rte_table_action_sym_crypto_params * p)3763d30ea906Sjfb8856606 parse_free_sym_crypto_param_data(struct rte_table_action_sym_crypto_params *p)
3764d30ea906Sjfb8856606 {
3765d30ea906Sjfb8856606 struct rte_crypto_sym_xform *xform[2] = {NULL};
3766d30ea906Sjfb8856606 uint32_t i;
3767d30ea906Sjfb8856606
3768d30ea906Sjfb8856606 xform[0] = p->xform;
3769d30ea906Sjfb8856606 if (xform[0])
3770d30ea906Sjfb8856606 xform[1] = xform[0]->next;
3771d30ea906Sjfb8856606
3772d30ea906Sjfb8856606 for (i = 0; i < 2; i++) {
3773d30ea906Sjfb8856606 if (xform[i] == NULL)
3774d30ea906Sjfb8856606 continue;
3775d30ea906Sjfb8856606
3776d30ea906Sjfb8856606 switch (xform[i]->type) {
3777d30ea906Sjfb8856606 case RTE_CRYPTO_SYM_XFORM_CIPHER:
3778d30ea906Sjfb8856606 if (p->cipher_auth.cipher_iv.val)
3779d30ea906Sjfb8856606 free(p->cipher_auth.cipher_iv.val);
3780d30ea906Sjfb8856606 if (p->cipher_auth.cipher_iv_update.val)
3781d30ea906Sjfb8856606 free(p->cipher_auth.cipher_iv_update.val);
3782d30ea906Sjfb8856606 break;
3783d30ea906Sjfb8856606 case RTE_CRYPTO_SYM_XFORM_AUTH:
3784d30ea906Sjfb8856606 if (p->cipher_auth.auth_iv.val)
3785d30ea906Sjfb8856606 free(p->cipher_auth.cipher_iv.val);
3786d30ea906Sjfb8856606 if (p->cipher_auth.auth_iv_update.val)
3787d30ea906Sjfb8856606 free(p->cipher_auth.cipher_iv_update.val);
3788d30ea906Sjfb8856606 break;
3789d30ea906Sjfb8856606 case RTE_CRYPTO_SYM_XFORM_AEAD:
3790d30ea906Sjfb8856606 if (p->aead.iv.val)
3791d30ea906Sjfb8856606 free(p->aead.iv.val);
3792d30ea906Sjfb8856606 if (p->aead.aad.val)
3793d30ea906Sjfb8856606 free(p->aead.aad.val);
3794d30ea906Sjfb8856606 break;
3795d30ea906Sjfb8856606 default:
3796d30ea906Sjfb8856606 continue;
3797d30ea906Sjfb8856606 }
3798d30ea906Sjfb8856606 }
3799d30ea906Sjfb8856606
3800d30ea906Sjfb8856606 }
3801d30ea906Sjfb8856606
3802d30ea906Sjfb8856606 static struct rte_crypto_sym_xform *
parse_table_action_cipher(struct rte_table_action_sym_crypto_params * p,uint8_t * key,uint32_t max_key_len,char ** tokens,uint32_t n_tokens,uint32_t encrypt,uint32_t * used_n_tokens)3803d30ea906Sjfb8856606 parse_table_action_cipher(struct rte_table_action_sym_crypto_params *p,
38044418919fSjohnjiang uint8_t *key, uint32_t max_key_len, char **tokens,
38054418919fSjohnjiang uint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)
3806d30ea906Sjfb8856606 {
3807d30ea906Sjfb8856606 struct rte_crypto_sym_xform *xform_cipher;
3808d30ea906Sjfb8856606 int status;
3809d30ea906Sjfb8856606 size_t len;
3810d30ea906Sjfb8856606
3811d30ea906Sjfb8856606 if (n_tokens < 7 || strcmp(tokens[1], "cipher_algo") ||
3812d30ea906Sjfb8856606 strcmp(tokens[3], "cipher_key") ||
3813d30ea906Sjfb8856606 strcmp(tokens[5], "cipher_iv"))
3814d30ea906Sjfb8856606 return NULL;
3815d30ea906Sjfb8856606
3816d30ea906Sjfb8856606 xform_cipher = calloc(1, sizeof(*xform_cipher));
3817d30ea906Sjfb8856606 if (xform_cipher == NULL)
3818d30ea906Sjfb8856606 return NULL;
3819d30ea906Sjfb8856606
3820d30ea906Sjfb8856606 xform_cipher->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3821d30ea906Sjfb8856606 xform_cipher->cipher.op = encrypt ? RTE_CRYPTO_CIPHER_OP_ENCRYPT :
3822d30ea906Sjfb8856606 RTE_CRYPTO_CIPHER_OP_DECRYPT;
3823d30ea906Sjfb8856606
3824d30ea906Sjfb8856606 /* cipher_algo */
3825d30ea906Sjfb8856606 status = rte_cryptodev_get_cipher_algo_enum(
3826d30ea906Sjfb8856606 &xform_cipher->cipher.algo, tokens[2]);
3827d30ea906Sjfb8856606 if (status < 0)
3828d30ea906Sjfb8856606 goto error_exit;
3829d30ea906Sjfb8856606
3830d30ea906Sjfb8856606 /* cipher_key */
3831d30ea906Sjfb8856606 len = strlen(tokens[4]);
38324418919fSjohnjiang if (len / 2 > max_key_len) {
38334418919fSjohnjiang status = -ENOMEM;
3834d30ea906Sjfb8856606 goto error_exit;
38354418919fSjohnjiang }
3836d30ea906Sjfb8856606
38374418919fSjohnjiang status = parse_hex_string(tokens[4], key, (uint32_t *)&len);
3838d30ea906Sjfb8856606 if (status < 0)
3839d30ea906Sjfb8856606 goto error_exit;
3840d30ea906Sjfb8856606
38414418919fSjohnjiang xform_cipher->cipher.key.data = key;
3842d30ea906Sjfb8856606 xform_cipher->cipher.key.length = (uint16_t)len;
3843d30ea906Sjfb8856606
3844d30ea906Sjfb8856606 /* cipher_iv */
3845d30ea906Sjfb8856606 len = strlen(tokens[6]);
3846d30ea906Sjfb8856606
3847d30ea906Sjfb8856606 p->cipher_auth.cipher_iv.val = calloc(1, len / 2 + 1);
3848d30ea906Sjfb8856606 if (p->cipher_auth.cipher_iv.val == NULL)
3849d30ea906Sjfb8856606 goto error_exit;
3850d30ea906Sjfb8856606
3851d30ea906Sjfb8856606 status = parse_hex_string(tokens[6],
3852d30ea906Sjfb8856606 p->cipher_auth.cipher_iv.val,
3853d30ea906Sjfb8856606 (uint32_t *)&len);
3854d30ea906Sjfb8856606 if (status < 0)
3855d30ea906Sjfb8856606 goto error_exit;
3856d30ea906Sjfb8856606
3857d30ea906Sjfb8856606 xform_cipher->cipher.iv.length = (uint16_t)len;
3858d30ea906Sjfb8856606 xform_cipher->cipher.iv.offset = RTE_TABLE_ACTION_SYM_CRYPTO_IV_OFFSET;
3859d30ea906Sjfb8856606 p->cipher_auth.cipher_iv.length = (uint32_t)len;
3860d30ea906Sjfb8856606 *used_n_tokens = 7;
3861d30ea906Sjfb8856606
3862d30ea906Sjfb8856606 return xform_cipher;
3863d30ea906Sjfb8856606
3864d30ea906Sjfb8856606 error_exit:
3865d30ea906Sjfb8856606 if (p->cipher_auth.cipher_iv.val) {
3866d30ea906Sjfb8856606 free(p->cipher_auth.cipher_iv.val);
3867d30ea906Sjfb8856606 p->cipher_auth.cipher_iv.val = NULL;
3868d30ea906Sjfb8856606 }
3869d30ea906Sjfb8856606
3870d30ea906Sjfb8856606 free(xform_cipher);
3871d30ea906Sjfb8856606
3872d30ea906Sjfb8856606 return NULL;
3873d30ea906Sjfb8856606 }
3874d30ea906Sjfb8856606
3875d30ea906Sjfb8856606 static struct rte_crypto_sym_xform *
parse_table_action_cipher_auth(struct rte_table_action_sym_crypto_params * p,uint8_t * key,uint32_t max_key_len,char ** tokens,uint32_t n_tokens,uint32_t encrypt,uint32_t * used_n_tokens)3876d30ea906Sjfb8856606 parse_table_action_cipher_auth(struct rte_table_action_sym_crypto_params *p,
38774418919fSjohnjiang uint8_t *key, uint32_t max_key_len, char **tokens,
38784418919fSjohnjiang uint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)
3879d30ea906Sjfb8856606 {
3880d30ea906Sjfb8856606 struct rte_crypto_sym_xform *xform_cipher;
3881d30ea906Sjfb8856606 struct rte_crypto_sym_xform *xform_auth;
3882d30ea906Sjfb8856606 int status;
3883d30ea906Sjfb8856606 size_t len;
3884d30ea906Sjfb8856606
3885d30ea906Sjfb8856606 if (n_tokens < 13 ||
3886d30ea906Sjfb8856606 strcmp(tokens[7], "auth_algo") ||
3887d30ea906Sjfb8856606 strcmp(tokens[9], "auth_key") ||
3888d30ea906Sjfb8856606 strcmp(tokens[11], "digest_size"))
3889d30ea906Sjfb8856606 return NULL;
3890d30ea906Sjfb8856606
3891d30ea906Sjfb8856606 xform_auth = calloc(1, sizeof(*xform_auth));
3892d30ea906Sjfb8856606 if (xform_auth == NULL)
3893d30ea906Sjfb8856606 return NULL;
3894d30ea906Sjfb8856606
3895d30ea906Sjfb8856606 xform_auth->type = RTE_CRYPTO_SYM_XFORM_AUTH;
3896d30ea906Sjfb8856606 xform_auth->auth.op = encrypt ? RTE_CRYPTO_AUTH_OP_GENERATE :
3897d30ea906Sjfb8856606 RTE_CRYPTO_AUTH_OP_VERIFY;
3898d30ea906Sjfb8856606
3899d30ea906Sjfb8856606 /* auth_algo */
3900d30ea906Sjfb8856606 status = rte_cryptodev_get_auth_algo_enum(&xform_auth->auth.algo,
3901d30ea906Sjfb8856606 tokens[8]);
3902d30ea906Sjfb8856606 if (status < 0)
3903d30ea906Sjfb8856606 goto error_exit;
3904d30ea906Sjfb8856606
3905d30ea906Sjfb8856606 /* auth_key */
3906d30ea906Sjfb8856606 len = strlen(tokens[10]);
39074418919fSjohnjiang if (len / 2 > max_key_len) {
39084418919fSjohnjiang status = -ENOMEM;
3909d30ea906Sjfb8856606 goto error_exit;
39104418919fSjohnjiang }
3911d30ea906Sjfb8856606
39124418919fSjohnjiang status = parse_hex_string(tokens[10], key, (uint32_t *)&len);
3913d30ea906Sjfb8856606 if (status < 0)
3914d30ea906Sjfb8856606 goto error_exit;
3915d30ea906Sjfb8856606
39164418919fSjohnjiang xform_auth->auth.key.data = key;
3917d30ea906Sjfb8856606 xform_auth->auth.key.length = (uint16_t)len;
3918d30ea906Sjfb8856606
39194418919fSjohnjiang key += xform_auth->auth.key.length;
39204418919fSjohnjiang max_key_len -= xform_auth->auth.key.length;
39214418919fSjohnjiang
3922d30ea906Sjfb8856606 if (strcmp(tokens[11], "digest_size"))
3923d30ea906Sjfb8856606 goto error_exit;
3924d30ea906Sjfb8856606
3925d30ea906Sjfb8856606 status = parser_read_uint16(&xform_auth->auth.digest_length,
3926d30ea906Sjfb8856606 tokens[12]);
3927d30ea906Sjfb8856606 if (status < 0)
3928d30ea906Sjfb8856606 goto error_exit;
3929d30ea906Sjfb8856606
39304418919fSjohnjiang xform_cipher = parse_table_action_cipher(p, key, max_key_len, tokens,
39314418919fSjohnjiang 7, encrypt, used_n_tokens);
3932d30ea906Sjfb8856606 if (xform_cipher == NULL)
3933d30ea906Sjfb8856606 goto error_exit;
3934d30ea906Sjfb8856606
3935d30ea906Sjfb8856606 *used_n_tokens += 6;
3936d30ea906Sjfb8856606
3937d30ea906Sjfb8856606 if (encrypt) {
3938d30ea906Sjfb8856606 xform_cipher->next = xform_auth;
3939d30ea906Sjfb8856606 return xform_cipher;
3940d30ea906Sjfb8856606 } else {
3941d30ea906Sjfb8856606 xform_auth->next = xform_cipher;
3942d30ea906Sjfb8856606 return xform_auth;
3943d30ea906Sjfb8856606 }
3944d30ea906Sjfb8856606
3945d30ea906Sjfb8856606 error_exit:
3946d30ea906Sjfb8856606 if (p->cipher_auth.auth_iv.val) {
3947d30ea906Sjfb8856606 free(p->cipher_auth.auth_iv.val);
3948d30ea906Sjfb8856606 p->cipher_auth.auth_iv.val = 0;
3949d30ea906Sjfb8856606 }
3950d30ea906Sjfb8856606
3951d30ea906Sjfb8856606 free(xform_auth);
3952d30ea906Sjfb8856606
3953d30ea906Sjfb8856606 return NULL;
3954d30ea906Sjfb8856606 }
3955d30ea906Sjfb8856606
3956d30ea906Sjfb8856606 static struct rte_crypto_sym_xform *
parse_table_action_aead(struct rte_table_action_sym_crypto_params * p,uint8_t * key,uint32_t max_key_len,char ** tokens,uint32_t n_tokens,uint32_t encrypt,uint32_t * used_n_tokens)3957d30ea906Sjfb8856606 parse_table_action_aead(struct rte_table_action_sym_crypto_params *p,
39584418919fSjohnjiang uint8_t *key, uint32_t max_key_len, char **tokens,
39594418919fSjohnjiang uint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)
3960d30ea906Sjfb8856606 {
3961d30ea906Sjfb8856606 struct rte_crypto_sym_xform *xform_aead;
3962d30ea906Sjfb8856606 int status;
3963d30ea906Sjfb8856606 size_t len;
3964d30ea906Sjfb8856606
3965d30ea906Sjfb8856606 if (n_tokens < 11 || strcmp(tokens[1], "aead_algo") ||
3966d30ea906Sjfb8856606 strcmp(tokens[3], "aead_key") ||
3967d30ea906Sjfb8856606 strcmp(tokens[5], "aead_iv") ||
3968d30ea906Sjfb8856606 strcmp(tokens[7], "aead_aad") ||
3969d30ea906Sjfb8856606 strcmp(tokens[9], "digest_size"))
3970d30ea906Sjfb8856606 return NULL;
3971d30ea906Sjfb8856606
3972d30ea906Sjfb8856606 xform_aead = calloc(1, sizeof(*xform_aead));
3973d30ea906Sjfb8856606 if (xform_aead == NULL)
3974d30ea906Sjfb8856606 return NULL;
3975d30ea906Sjfb8856606
3976d30ea906Sjfb8856606 xform_aead->type = RTE_CRYPTO_SYM_XFORM_AEAD;
3977d30ea906Sjfb8856606 xform_aead->aead.op = encrypt ? RTE_CRYPTO_AEAD_OP_ENCRYPT :
3978d30ea906Sjfb8856606 RTE_CRYPTO_AEAD_OP_DECRYPT;
3979d30ea906Sjfb8856606
3980d30ea906Sjfb8856606 /* aead_algo */
3981d30ea906Sjfb8856606 status = rte_cryptodev_get_aead_algo_enum(&xform_aead->aead.algo,
3982d30ea906Sjfb8856606 tokens[2]);
3983d30ea906Sjfb8856606 if (status < 0)
3984d30ea906Sjfb8856606 goto error_exit;
3985d30ea906Sjfb8856606
3986d30ea906Sjfb8856606 /* aead_key */
3987d30ea906Sjfb8856606 len = strlen(tokens[4]);
39884418919fSjohnjiang if (len / 2 > max_key_len) {
39894418919fSjohnjiang status = -ENOMEM;
3990d30ea906Sjfb8856606 goto error_exit;
39914418919fSjohnjiang }
3992d30ea906Sjfb8856606
39934418919fSjohnjiang status = parse_hex_string(tokens[4], key, (uint32_t *)&len);
3994d30ea906Sjfb8856606 if (status < 0)
3995d30ea906Sjfb8856606 goto error_exit;
3996d30ea906Sjfb8856606
39974418919fSjohnjiang xform_aead->aead.key.data = key;
3998d30ea906Sjfb8856606 xform_aead->aead.key.length = (uint16_t)len;
3999d30ea906Sjfb8856606
4000d30ea906Sjfb8856606 /* aead_iv */
4001d30ea906Sjfb8856606 len = strlen(tokens[6]);
4002d30ea906Sjfb8856606 p->aead.iv.val = calloc(1, len / 2 + 1);
4003d30ea906Sjfb8856606 if (p->aead.iv.val == NULL)
4004d30ea906Sjfb8856606 goto error_exit;
4005d30ea906Sjfb8856606
4006d30ea906Sjfb8856606 status = parse_hex_string(tokens[6], p->aead.iv.val,
4007d30ea906Sjfb8856606 (uint32_t *)&len);
4008d30ea906Sjfb8856606 if (status < 0)
4009d30ea906Sjfb8856606 goto error_exit;
4010d30ea906Sjfb8856606
4011d30ea906Sjfb8856606 xform_aead->aead.iv.length = (uint16_t)len;
4012d30ea906Sjfb8856606 xform_aead->aead.iv.offset = RTE_TABLE_ACTION_SYM_CRYPTO_IV_OFFSET;
4013d30ea906Sjfb8856606 p->aead.iv.length = (uint32_t)len;
4014d30ea906Sjfb8856606
4015d30ea906Sjfb8856606 /* aead_aad */
4016d30ea906Sjfb8856606 len = strlen(tokens[8]);
4017d30ea906Sjfb8856606 p->aead.aad.val = calloc(1, len / 2 + 1);
4018d30ea906Sjfb8856606 if (p->aead.aad.val == NULL)
4019d30ea906Sjfb8856606 goto error_exit;
4020d30ea906Sjfb8856606
4021d30ea906Sjfb8856606 status = parse_hex_string(tokens[8], p->aead.aad.val, (uint32_t *)&len);
4022d30ea906Sjfb8856606 if (status < 0)
4023d30ea906Sjfb8856606 goto error_exit;
4024d30ea906Sjfb8856606
4025d30ea906Sjfb8856606 xform_aead->aead.aad_length = (uint16_t)len;
4026d30ea906Sjfb8856606 p->aead.aad.length = (uint32_t)len;
4027d30ea906Sjfb8856606
4028d30ea906Sjfb8856606 /* digest_size */
4029d30ea906Sjfb8856606 status = parser_read_uint16(&xform_aead->aead.digest_length,
4030d30ea906Sjfb8856606 tokens[10]);
4031d30ea906Sjfb8856606 if (status < 0)
4032d30ea906Sjfb8856606 goto error_exit;
4033d30ea906Sjfb8856606
4034d30ea906Sjfb8856606 *used_n_tokens = 11;
4035d30ea906Sjfb8856606
4036d30ea906Sjfb8856606 return xform_aead;
4037d30ea906Sjfb8856606
4038d30ea906Sjfb8856606 error_exit:
4039d30ea906Sjfb8856606 if (p->aead.iv.val) {
4040d30ea906Sjfb8856606 free(p->aead.iv.val);
4041d30ea906Sjfb8856606 p->aead.iv.val = NULL;
4042d30ea906Sjfb8856606 }
4043d30ea906Sjfb8856606 if (p->aead.aad.val) {
4044d30ea906Sjfb8856606 free(p->aead.aad.val);
4045d30ea906Sjfb8856606 p->aead.aad.val = NULL;
4046d30ea906Sjfb8856606 }
4047d30ea906Sjfb8856606
4048d30ea906Sjfb8856606 free(xform_aead);
4049d30ea906Sjfb8856606
4050d30ea906Sjfb8856606 return NULL;
4051d30ea906Sjfb8856606 }
4052d30ea906Sjfb8856606
4053d30ea906Sjfb8856606
4054d30ea906Sjfb8856606 static uint32_t
parse_table_action_sym_crypto(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)4055d30ea906Sjfb8856606 parse_table_action_sym_crypto(char **tokens,
4056d30ea906Sjfb8856606 uint32_t n_tokens,
4057d30ea906Sjfb8856606 struct table_rule_action *a)
4058d30ea906Sjfb8856606 {
4059d30ea906Sjfb8856606 struct rte_table_action_sym_crypto_params *p = &a->sym_crypto;
4060d30ea906Sjfb8856606 struct rte_crypto_sym_xform *xform = NULL;
40614418919fSjohnjiang uint8_t *key = a->sym_crypto_key;
40624418919fSjohnjiang uint32_t max_key_len = SYM_CRYPTO_MAX_KEY_SIZE;
4063d30ea906Sjfb8856606 uint32_t used_n_tokens;
4064d30ea906Sjfb8856606 uint32_t encrypt;
4065d30ea906Sjfb8856606 int status;
4066d30ea906Sjfb8856606
4067d30ea906Sjfb8856606 if ((n_tokens < 12) ||
4068d30ea906Sjfb8856606 strcmp(tokens[0], "sym_crypto") ||
4069d30ea906Sjfb8856606 strcmp(tokens[2], "type"))
4070d30ea906Sjfb8856606 return 0;
4071d30ea906Sjfb8856606
4072d30ea906Sjfb8856606 memset(p, 0, sizeof(*p));
4073d30ea906Sjfb8856606
4074d30ea906Sjfb8856606 if (strcmp(tokens[1], "encrypt") == 0)
4075d30ea906Sjfb8856606 encrypt = 1;
4076d30ea906Sjfb8856606 else
4077d30ea906Sjfb8856606 encrypt = 0;
4078d30ea906Sjfb8856606
4079d30ea906Sjfb8856606 status = parser_read_uint32(&p->data_offset, tokens[n_tokens - 1]);
4080d30ea906Sjfb8856606 if (status < 0)
4081d30ea906Sjfb8856606 return 0;
4082d30ea906Sjfb8856606
4083d30ea906Sjfb8856606 if (strcmp(tokens[3], "cipher") == 0) {
4084d30ea906Sjfb8856606 tokens += 3;
4085d30ea906Sjfb8856606 n_tokens -= 3;
4086d30ea906Sjfb8856606
40874418919fSjohnjiang xform = parse_table_action_cipher(p, key, max_key_len, tokens,
40884418919fSjohnjiang n_tokens, encrypt, &used_n_tokens);
4089d30ea906Sjfb8856606 } else if (strcmp(tokens[3], "cipher_auth") == 0) {
4090d30ea906Sjfb8856606 tokens += 3;
4091d30ea906Sjfb8856606 n_tokens -= 3;
4092d30ea906Sjfb8856606
40934418919fSjohnjiang xform = parse_table_action_cipher_auth(p, key, max_key_len,
40944418919fSjohnjiang tokens, n_tokens, encrypt, &used_n_tokens);
4095d30ea906Sjfb8856606 } else if (strcmp(tokens[3], "aead") == 0) {
4096d30ea906Sjfb8856606 tokens += 3;
4097d30ea906Sjfb8856606 n_tokens -= 3;
4098d30ea906Sjfb8856606
40994418919fSjohnjiang xform = parse_table_action_aead(p, key, max_key_len, tokens,
41004418919fSjohnjiang n_tokens, encrypt, &used_n_tokens);
4101d30ea906Sjfb8856606 }
4102d30ea906Sjfb8856606
4103d30ea906Sjfb8856606 if (xform == NULL)
4104d30ea906Sjfb8856606 return 0;
4105d30ea906Sjfb8856606
4106d30ea906Sjfb8856606 p->xform = xform;
4107d30ea906Sjfb8856606
4108d30ea906Sjfb8856606 if (strcmp(tokens[used_n_tokens], "data_offset")) {
4109d30ea906Sjfb8856606 parse_free_sym_crypto_param_data(p);
4110d30ea906Sjfb8856606 return 0;
4111d30ea906Sjfb8856606 }
4112d30ea906Sjfb8856606
4113d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_SYM_CRYPTO;
4114d30ea906Sjfb8856606
4115d30ea906Sjfb8856606 return used_n_tokens + 5;
4116d30ea906Sjfb8856606 }
4117d30ea906Sjfb8856606
4118d30ea906Sjfb8856606 static uint32_t
parse_table_action_tag(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)4119d30ea906Sjfb8856606 parse_table_action_tag(char **tokens,
4120d30ea906Sjfb8856606 uint32_t n_tokens,
4121d30ea906Sjfb8856606 struct table_rule_action *a)
4122d30ea906Sjfb8856606 {
4123d30ea906Sjfb8856606 if ((n_tokens < 2) ||
4124d30ea906Sjfb8856606 strcmp(tokens[0], "tag"))
4125d30ea906Sjfb8856606 return 0;
4126d30ea906Sjfb8856606
4127d30ea906Sjfb8856606 if (parser_read_uint32(&a->tag.tag, tokens[1]))
4128d30ea906Sjfb8856606 return 0;
4129d30ea906Sjfb8856606
4130d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_TAG;
4131d30ea906Sjfb8856606 return 2;
4132d30ea906Sjfb8856606 }
4133d30ea906Sjfb8856606
4134d30ea906Sjfb8856606 static uint32_t
parse_table_action_decap(char ** tokens,uint32_t n_tokens,struct table_rule_action * a)4135d30ea906Sjfb8856606 parse_table_action_decap(char **tokens,
4136d30ea906Sjfb8856606 uint32_t n_tokens,
4137d30ea906Sjfb8856606 struct table_rule_action *a)
4138d30ea906Sjfb8856606 {
4139d30ea906Sjfb8856606 if ((n_tokens < 2) ||
4140d30ea906Sjfb8856606 strcmp(tokens[0], "decap"))
4141d30ea906Sjfb8856606 return 0;
4142d30ea906Sjfb8856606
4143d30ea906Sjfb8856606 if (parser_read_uint16(&a->decap.n, tokens[1]))
4144d30ea906Sjfb8856606 return 0;
4145d30ea906Sjfb8856606
4146d30ea906Sjfb8856606 a->action_mask |= 1 << RTE_TABLE_ACTION_DECAP;
4147d30ea906Sjfb8856606 return 2;
4148d30ea906Sjfb8856606 }
4149d30ea906Sjfb8856606
4150d30ea906Sjfb8856606 static uint32_t
parse_table_action(char ** tokens,uint32_t n_tokens,char * out,size_t out_size,struct table_rule_action * a)4151d30ea906Sjfb8856606 parse_table_action(char **tokens,
4152d30ea906Sjfb8856606 uint32_t n_tokens,
4153d30ea906Sjfb8856606 char *out,
4154d30ea906Sjfb8856606 size_t out_size,
4155d30ea906Sjfb8856606 struct table_rule_action *a)
4156d30ea906Sjfb8856606 {
4157d30ea906Sjfb8856606 uint32_t n_tokens0 = n_tokens;
4158d30ea906Sjfb8856606
4159d30ea906Sjfb8856606 memset(a, 0, sizeof(*a));
4160d30ea906Sjfb8856606
4161d30ea906Sjfb8856606 if ((n_tokens < 2) ||
4162d30ea906Sjfb8856606 strcmp(tokens[0], "action"))
4163d30ea906Sjfb8856606 return 0;
4164d30ea906Sjfb8856606
4165d30ea906Sjfb8856606 tokens++;
4166d30ea906Sjfb8856606 n_tokens--;
4167d30ea906Sjfb8856606
4168d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "fwd") == 0)) {
4169d30ea906Sjfb8856606 uint32_t n;
4170d30ea906Sjfb8856606
4171d30ea906Sjfb8856606 n = parse_table_action_fwd(tokens, n_tokens, a);
4172d30ea906Sjfb8856606 if (n == 0) {
4173d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4174d30ea906Sjfb8856606 "action fwd");
4175d30ea906Sjfb8856606 return 0;
4176d30ea906Sjfb8856606 }
4177d30ea906Sjfb8856606
4178d30ea906Sjfb8856606 tokens += n;
4179d30ea906Sjfb8856606 n_tokens -= n;
4180d30ea906Sjfb8856606 }
4181d30ea906Sjfb8856606
4182d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "balance") == 0)) {
4183d30ea906Sjfb8856606 uint32_t n;
4184d30ea906Sjfb8856606
4185d30ea906Sjfb8856606 n = parse_table_action_balance(tokens, n_tokens, a);
4186d30ea906Sjfb8856606 if (n == 0) {
4187d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4188d30ea906Sjfb8856606 "action balance");
4189d30ea906Sjfb8856606 return 0;
4190d30ea906Sjfb8856606 }
4191d30ea906Sjfb8856606
4192d30ea906Sjfb8856606 tokens += n;
4193d30ea906Sjfb8856606 n_tokens -= n;
4194d30ea906Sjfb8856606 }
4195d30ea906Sjfb8856606
4196d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "meter") == 0)) {
4197d30ea906Sjfb8856606 uint32_t n;
4198d30ea906Sjfb8856606
4199d30ea906Sjfb8856606 n = parse_table_action_meter(tokens, n_tokens, a);
4200d30ea906Sjfb8856606 if (n == 0) {
4201d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4202d30ea906Sjfb8856606 "action meter");
4203d30ea906Sjfb8856606 return 0;
4204d30ea906Sjfb8856606 }
4205d30ea906Sjfb8856606
4206d30ea906Sjfb8856606 tokens += n;
4207d30ea906Sjfb8856606 n_tokens -= n;
4208d30ea906Sjfb8856606 }
4209d30ea906Sjfb8856606
4210d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "tm") == 0)) {
4211d30ea906Sjfb8856606 uint32_t n;
4212d30ea906Sjfb8856606
4213d30ea906Sjfb8856606 n = parse_table_action_tm(tokens, n_tokens, a);
4214d30ea906Sjfb8856606 if (n == 0) {
4215d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4216d30ea906Sjfb8856606 "action tm");
4217d30ea906Sjfb8856606 return 0;
4218d30ea906Sjfb8856606 }
4219d30ea906Sjfb8856606
4220d30ea906Sjfb8856606 tokens += n;
4221d30ea906Sjfb8856606 n_tokens -= n;
4222d30ea906Sjfb8856606 }
4223d30ea906Sjfb8856606
4224d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "encap") == 0)) {
4225d30ea906Sjfb8856606 uint32_t n;
4226d30ea906Sjfb8856606
4227d30ea906Sjfb8856606 n = parse_table_action_encap(tokens, n_tokens, a);
4228d30ea906Sjfb8856606 if (n == 0) {
4229d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4230d30ea906Sjfb8856606 "action encap");
4231d30ea906Sjfb8856606 return 0;
4232d30ea906Sjfb8856606 }
4233d30ea906Sjfb8856606
4234d30ea906Sjfb8856606 tokens += n;
4235d30ea906Sjfb8856606 n_tokens -= n;
4236d30ea906Sjfb8856606 }
4237d30ea906Sjfb8856606
4238d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "nat") == 0)) {
4239d30ea906Sjfb8856606 uint32_t n;
4240d30ea906Sjfb8856606
4241d30ea906Sjfb8856606 n = parse_table_action_nat(tokens, n_tokens, a);
4242d30ea906Sjfb8856606 if (n == 0) {
4243d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4244d30ea906Sjfb8856606 "action nat");
4245d30ea906Sjfb8856606 return 0;
4246d30ea906Sjfb8856606 }
4247d30ea906Sjfb8856606
4248d30ea906Sjfb8856606 tokens += n;
4249d30ea906Sjfb8856606 n_tokens -= n;
4250d30ea906Sjfb8856606 }
4251d30ea906Sjfb8856606
4252d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "ttl") == 0)) {
4253d30ea906Sjfb8856606 uint32_t n;
4254d30ea906Sjfb8856606
4255d30ea906Sjfb8856606 n = parse_table_action_ttl(tokens, n_tokens, a);
4256d30ea906Sjfb8856606 if (n == 0) {
4257d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4258d30ea906Sjfb8856606 "action ttl");
4259d30ea906Sjfb8856606 return 0;
4260d30ea906Sjfb8856606 }
4261d30ea906Sjfb8856606
4262d30ea906Sjfb8856606 tokens += n;
4263d30ea906Sjfb8856606 n_tokens -= n;
4264d30ea906Sjfb8856606 }
4265d30ea906Sjfb8856606
4266d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "stats") == 0)) {
4267d30ea906Sjfb8856606 uint32_t n;
4268d30ea906Sjfb8856606
4269d30ea906Sjfb8856606 n = parse_table_action_stats(tokens, n_tokens, a);
4270d30ea906Sjfb8856606 if (n == 0) {
4271d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4272d30ea906Sjfb8856606 "action stats");
4273d30ea906Sjfb8856606 return 0;
4274d30ea906Sjfb8856606 }
4275d30ea906Sjfb8856606
4276d30ea906Sjfb8856606 tokens += n;
4277d30ea906Sjfb8856606 n_tokens -= n;
4278d30ea906Sjfb8856606 }
4279d30ea906Sjfb8856606
4280d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "time") == 0)) {
4281d30ea906Sjfb8856606 uint32_t n;
4282d30ea906Sjfb8856606
4283d30ea906Sjfb8856606 n = parse_table_action_time(tokens, n_tokens, a);
4284d30ea906Sjfb8856606 if (n == 0) {
4285d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4286d30ea906Sjfb8856606 "action time");
4287d30ea906Sjfb8856606 return 0;
4288d30ea906Sjfb8856606 }
4289d30ea906Sjfb8856606
4290d30ea906Sjfb8856606 tokens += n;
4291d30ea906Sjfb8856606 n_tokens -= n;
4292d30ea906Sjfb8856606 }
4293d30ea906Sjfb8856606
4294d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "sym_crypto") == 0)) {
4295d30ea906Sjfb8856606 uint32_t n;
4296d30ea906Sjfb8856606
4297d30ea906Sjfb8856606 n = parse_table_action_sym_crypto(tokens, n_tokens, a);
4298d30ea906Sjfb8856606 if (n == 0) {
4299d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4300d30ea906Sjfb8856606 "action sym_crypto");
4301d30ea906Sjfb8856606 }
4302d30ea906Sjfb8856606
4303d30ea906Sjfb8856606 tokens += n;
4304d30ea906Sjfb8856606 n_tokens -= n;
4305d30ea906Sjfb8856606 }
4306d30ea906Sjfb8856606
4307d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "tag") == 0)) {
4308d30ea906Sjfb8856606 uint32_t n;
4309d30ea906Sjfb8856606
4310d30ea906Sjfb8856606 n = parse_table_action_tag(tokens, n_tokens, a);
4311d30ea906Sjfb8856606 if (n == 0) {
4312d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4313d30ea906Sjfb8856606 "action tag");
4314d30ea906Sjfb8856606 return 0;
4315d30ea906Sjfb8856606 }
4316d30ea906Sjfb8856606
4317d30ea906Sjfb8856606 tokens += n;
4318d30ea906Sjfb8856606 n_tokens -= n;
4319d30ea906Sjfb8856606 }
4320d30ea906Sjfb8856606
4321d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "decap") == 0)) {
4322d30ea906Sjfb8856606 uint32_t n;
4323d30ea906Sjfb8856606
4324d30ea906Sjfb8856606 n = parse_table_action_decap(tokens, n_tokens, a);
4325d30ea906Sjfb8856606 if (n == 0) {
4326d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4327d30ea906Sjfb8856606 "action decap");
4328d30ea906Sjfb8856606 return 0;
4329d30ea906Sjfb8856606 }
4330d30ea906Sjfb8856606
4331d30ea906Sjfb8856606 tokens += n;
4332d30ea906Sjfb8856606 n_tokens -= n;
4333d30ea906Sjfb8856606 }
4334d30ea906Sjfb8856606
4335d30ea906Sjfb8856606 if (n_tokens0 - n_tokens == 1) {
4336d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "action");
4337d30ea906Sjfb8856606 return 0;
4338d30ea906Sjfb8856606 }
4339d30ea906Sjfb8856606
4340d30ea906Sjfb8856606 return n_tokens0 - n_tokens;
4341d30ea906Sjfb8856606 }
4342d30ea906Sjfb8856606
4343d30ea906Sjfb8856606
4344d30ea906Sjfb8856606 static const char cmd_pipeline_table_rule_add_help[] =
4345d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> rule add\n"
4346d30ea906Sjfb8856606 " match <match>\n"
4347d30ea906Sjfb8856606 " action <table_action>\n";
4348d30ea906Sjfb8856606
4349d30ea906Sjfb8856606 static void
cmd_pipeline_table_rule_add(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)4350d30ea906Sjfb8856606 cmd_pipeline_table_rule_add(char **tokens,
4351d30ea906Sjfb8856606 uint32_t n_tokens,
4352d30ea906Sjfb8856606 char *out,
4353d30ea906Sjfb8856606 size_t out_size)
4354d30ea906Sjfb8856606 {
4355d30ea906Sjfb8856606 struct table_rule_match m;
4356d30ea906Sjfb8856606 struct table_rule_action a;
4357d30ea906Sjfb8856606 char *pipeline_name;
4358d30ea906Sjfb8856606 uint32_t table_id, t0, n_tokens_parsed;
4359d30ea906Sjfb8856606 int status;
4360d30ea906Sjfb8856606
4361d30ea906Sjfb8856606 if (n_tokens < 8) {
4362d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4363d30ea906Sjfb8856606 return;
4364d30ea906Sjfb8856606 }
4365d30ea906Sjfb8856606
4366d30ea906Sjfb8856606 pipeline_name = tokens[1];
4367d30ea906Sjfb8856606
4368d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
4369d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
4370d30ea906Sjfb8856606 return;
4371d30ea906Sjfb8856606 }
4372d30ea906Sjfb8856606
4373d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
4374d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4375d30ea906Sjfb8856606 return;
4376d30ea906Sjfb8856606 }
4377d30ea906Sjfb8856606
4378d30ea906Sjfb8856606 if (strcmp(tokens[4], "rule") != 0) {
4379d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
4380d30ea906Sjfb8856606 return;
4381d30ea906Sjfb8856606 }
4382d30ea906Sjfb8856606
4383d30ea906Sjfb8856606 if (strcmp(tokens[5], "add") != 0) {
4384d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
4385d30ea906Sjfb8856606 return;
4386d30ea906Sjfb8856606 }
4387d30ea906Sjfb8856606
4388d30ea906Sjfb8856606 t0 = 6;
4389d30ea906Sjfb8856606
4390d30ea906Sjfb8856606 /* match */
4391d30ea906Sjfb8856606 n_tokens_parsed = parse_match(tokens + t0,
4392d30ea906Sjfb8856606 n_tokens - t0,
4393d30ea906Sjfb8856606 out,
4394d30ea906Sjfb8856606 out_size,
4395d30ea906Sjfb8856606 &m);
4396d30ea906Sjfb8856606 if (n_tokens_parsed == 0)
4397d30ea906Sjfb8856606 return;
4398d30ea906Sjfb8856606 t0 += n_tokens_parsed;
4399d30ea906Sjfb8856606
4400d30ea906Sjfb8856606 /* action */
4401d30ea906Sjfb8856606 n_tokens_parsed = parse_table_action(tokens + t0,
4402d30ea906Sjfb8856606 n_tokens - t0,
4403d30ea906Sjfb8856606 out,
4404d30ea906Sjfb8856606 out_size,
4405d30ea906Sjfb8856606 &a);
4406d30ea906Sjfb8856606 if (n_tokens_parsed == 0)
4407d30ea906Sjfb8856606 return;
4408d30ea906Sjfb8856606 t0 += n_tokens_parsed;
4409d30ea906Sjfb8856606
4410d30ea906Sjfb8856606 if (t0 != n_tokens) {
4411d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
4412d30ea906Sjfb8856606 return;
4413d30ea906Sjfb8856606 }
4414d30ea906Sjfb8856606
4415d30ea906Sjfb8856606 status = pipeline_table_rule_add(pipeline_name, table_id, &m, &a);
4416d30ea906Sjfb8856606 if (status) {
4417d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4418d30ea906Sjfb8856606 return;
4419d30ea906Sjfb8856606 }
4420d30ea906Sjfb8856606
4421d30ea906Sjfb8856606 if (a.action_mask & 1 << RTE_TABLE_ACTION_SYM_CRYPTO)
4422d30ea906Sjfb8856606 parse_free_sym_crypto_param_data(&a.sym_crypto);
4423d30ea906Sjfb8856606 }
4424d30ea906Sjfb8856606
4425d30ea906Sjfb8856606
4426d30ea906Sjfb8856606 static const char cmd_pipeline_table_rule_add_default_help[] =
4427d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> rule add\n"
4428d30ea906Sjfb8856606 " match\n"
4429d30ea906Sjfb8856606 " default\n"
4430d30ea906Sjfb8856606 " action\n"
4431d30ea906Sjfb8856606 " fwd\n"
4432d30ea906Sjfb8856606 " drop\n"
4433d30ea906Sjfb8856606 " | port <port_id>\n"
4434d30ea906Sjfb8856606 " | meta\n"
4435d30ea906Sjfb8856606 " | table <table_id>\n";
4436d30ea906Sjfb8856606
4437d30ea906Sjfb8856606 static void
cmd_pipeline_table_rule_add_default(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)4438d30ea906Sjfb8856606 cmd_pipeline_table_rule_add_default(char **tokens,
4439d30ea906Sjfb8856606 uint32_t n_tokens,
4440d30ea906Sjfb8856606 char *out,
4441d30ea906Sjfb8856606 size_t out_size)
4442d30ea906Sjfb8856606 {
4443d30ea906Sjfb8856606 struct table_rule_action action;
4444d30ea906Sjfb8856606 char *pipeline_name;
4445d30ea906Sjfb8856606 uint32_t table_id;
4446d30ea906Sjfb8856606 int status;
4447d30ea906Sjfb8856606
4448d30ea906Sjfb8856606 if ((n_tokens != 11) && (n_tokens != 12)) {
4449d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4450d30ea906Sjfb8856606 return;
4451d30ea906Sjfb8856606 }
4452d30ea906Sjfb8856606
4453d30ea906Sjfb8856606 pipeline_name = tokens[1];
4454d30ea906Sjfb8856606
4455d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
4456d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
4457d30ea906Sjfb8856606 return;
4458d30ea906Sjfb8856606 }
4459d30ea906Sjfb8856606
4460d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
4461d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4462d30ea906Sjfb8856606 return;
4463d30ea906Sjfb8856606 }
4464d30ea906Sjfb8856606
4465d30ea906Sjfb8856606 if (strcmp(tokens[4], "rule") != 0) {
4466d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
4467d30ea906Sjfb8856606 return;
4468d30ea906Sjfb8856606 }
4469d30ea906Sjfb8856606
4470d30ea906Sjfb8856606 if (strcmp(tokens[5], "add") != 0) {
4471d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
4472d30ea906Sjfb8856606 return;
4473d30ea906Sjfb8856606 }
4474d30ea906Sjfb8856606
4475d30ea906Sjfb8856606 if (strcmp(tokens[6], "match") != 0) {
4476d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "match");
4477d30ea906Sjfb8856606 return;
4478d30ea906Sjfb8856606 }
4479d30ea906Sjfb8856606
4480d30ea906Sjfb8856606 if (strcmp(tokens[7], "default") != 0) {
4481d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "default");
4482d30ea906Sjfb8856606 return;
4483d30ea906Sjfb8856606 }
4484d30ea906Sjfb8856606
4485d30ea906Sjfb8856606 if (strcmp(tokens[8], "action") != 0) {
4486d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "action");
4487d30ea906Sjfb8856606 return;
4488d30ea906Sjfb8856606 }
4489d30ea906Sjfb8856606
4490d30ea906Sjfb8856606 if (strcmp(tokens[9], "fwd") != 0) {
4491d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "fwd");
4492d30ea906Sjfb8856606 return;
4493d30ea906Sjfb8856606 }
4494d30ea906Sjfb8856606
4495d30ea906Sjfb8856606 action.action_mask = 1 << RTE_TABLE_ACTION_FWD;
4496d30ea906Sjfb8856606
4497d30ea906Sjfb8856606 if (strcmp(tokens[10], "drop") == 0) {
4498d30ea906Sjfb8856606 if (n_tokens != 11) {
4499d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4500d30ea906Sjfb8856606 return;
4501d30ea906Sjfb8856606 }
4502d30ea906Sjfb8856606
4503d30ea906Sjfb8856606 action.fwd.action = RTE_PIPELINE_ACTION_DROP;
4504d30ea906Sjfb8856606 } else if (strcmp(tokens[10], "port") == 0) {
4505d30ea906Sjfb8856606 uint32_t id;
4506d30ea906Sjfb8856606
4507d30ea906Sjfb8856606 if (n_tokens != 12) {
4508d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4509d30ea906Sjfb8856606 return;
4510d30ea906Sjfb8856606 }
4511d30ea906Sjfb8856606
4512d30ea906Sjfb8856606 if (parser_read_uint32(&id, tokens[11]) != 0) {
4513d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
4514d30ea906Sjfb8856606 return;
4515d30ea906Sjfb8856606 }
4516d30ea906Sjfb8856606
4517d30ea906Sjfb8856606 action.fwd.action = RTE_PIPELINE_ACTION_PORT;
4518d30ea906Sjfb8856606 action.fwd.id = id;
4519d30ea906Sjfb8856606 } else if (strcmp(tokens[10], "meta") == 0) {
4520d30ea906Sjfb8856606 if (n_tokens != 11) {
4521d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4522d30ea906Sjfb8856606 return;
4523d30ea906Sjfb8856606 }
4524d30ea906Sjfb8856606
4525d30ea906Sjfb8856606 action.fwd.action = RTE_PIPELINE_ACTION_PORT_META;
4526d30ea906Sjfb8856606 } else if (strcmp(tokens[10], "table") == 0) {
4527d30ea906Sjfb8856606 uint32_t id;
4528d30ea906Sjfb8856606
4529d30ea906Sjfb8856606 if (n_tokens != 12) {
4530d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4531d30ea906Sjfb8856606 return;
4532d30ea906Sjfb8856606 }
4533d30ea906Sjfb8856606
4534d30ea906Sjfb8856606 if (parser_read_uint32(&id, tokens[11]) != 0) {
4535d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4536d30ea906Sjfb8856606 return;
4537d30ea906Sjfb8856606 }
4538d30ea906Sjfb8856606
4539d30ea906Sjfb8856606 action.fwd.action = RTE_PIPELINE_ACTION_TABLE;
4540d30ea906Sjfb8856606 action.fwd.id = id;
4541d30ea906Sjfb8856606 } else {
4542d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID,
4543d30ea906Sjfb8856606 "drop or port or meta or table");
4544d30ea906Sjfb8856606 return;
4545d30ea906Sjfb8856606 }
4546d30ea906Sjfb8856606
4547d30ea906Sjfb8856606 status = pipeline_table_rule_add_default(pipeline_name,
4548d30ea906Sjfb8856606 table_id,
4549d30ea906Sjfb8856606 &action);
4550d30ea906Sjfb8856606 if (status) {
4551d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4552d30ea906Sjfb8856606 return;
4553d30ea906Sjfb8856606 }
4554d30ea906Sjfb8856606 }
4555d30ea906Sjfb8856606
4556d30ea906Sjfb8856606
4557d30ea906Sjfb8856606 static const char cmd_pipeline_table_rule_add_bulk_help[] =
4558d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> rule add bulk <file_name>\n"
4559d30ea906Sjfb8856606 "\n"
4560d30ea906Sjfb8856606 " File <file_name>:\n"
4561d30ea906Sjfb8856606 " - line format: match <match> action <action>\n";
4562d30ea906Sjfb8856606
4563d30ea906Sjfb8856606 static int
4564d30ea906Sjfb8856606 cli_rule_file_process(const char *file_name,
4565d30ea906Sjfb8856606 size_t line_len_max,
4566d30ea906Sjfb8856606 struct table_rule_list **rule_list,
4567d30ea906Sjfb8856606 uint32_t *n_rules,
4568d30ea906Sjfb8856606 uint32_t *line_number,
4569d30ea906Sjfb8856606 char *out,
4570d30ea906Sjfb8856606 size_t out_size);
4571d30ea906Sjfb8856606
4572d30ea906Sjfb8856606 static void
cmd_pipeline_table_rule_add_bulk(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)4573d30ea906Sjfb8856606 cmd_pipeline_table_rule_add_bulk(char **tokens,
4574d30ea906Sjfb8856606 uint32_t n_tokens,
4575d30ea906Sjfb8856606 char *out,
4576d30ea906Sjfb8856606 size_t out_size)
4577d30ea906Sjfb8856606 {
4578d30ea906Sjfb8856606 struct table_rule_list *list = NULL;
4579d30ea906Sjfb8856606 char *pipeline_name, *file_name;
4580d30ea906Sjfb8856606 uint32_t table_id, n_rules, n_rules_added, n_rules_not_added, line_number;
4581d30ea906Sjfb8856606 int status;
4582d30ea906Sjfb8856606
4583d30ea906Sjfb8856606 if (n_tokens != 8) {
4584d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4585d30ea906Sjfb8856606 return;
4586d30ea906Sjfb8856606 }
4587d30ea906Sjfb8856606
4588d30ea906Sjfb8856606 pipeline_name = tokens[1];
4589d30ea906Sjfb8856606
4590d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
4591d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
4592d30ea906Sjfb8856606 return;
4593d30ea906Sjfb8856606 }
4594d30ea906Sjfb8856606
4595d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
4596d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4597d30ea906Sjfb8856606 return;
4598d30ea906Sjfb8856606 }
4599d30ea906Sjfb8856606
4600d30ea906Sjfb8856606 if (strcmp(tokens[4], "rule") != 0) {
4601d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
4602d30ea906Sjfb8856606 return;
4603d30ea906Sjfb8856606 }
4604d30ea906Sjfb8856606
4605d30ea906Sjfb8856606 if (strcmp(tokens[5], "add") != 0) {
4606d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
4607d30ea906Sjfb8856606 return;
4608d30ea906Sjfb8856606 }
4609d30ea906Sjfb8856606
4610d30ea906Sjfb8856606 if (strcmp(tokens[6], "bulk") != 0) {
4611d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "bulk");
4612d30ea906Sjfb8856606 return;
4613d30ea906Sjfb8856606 }
4614d30ea906Sjfb8856606
4615d30ea906Sjfb8856606 file_name = tokens[7];
4616d30ea906Sjfb8856606
4617d30ea906Sjfb8856606 /* Load rules from file. */
4618d30ea906Sjfb8856606 status = cli_rule_file_process(file_name,
4619d30ea906Sjfb8856606 1024,
4620d30ea906Sjfb8856606 &list,
4621d30ea906Sjfb8856606 &n_rules,
4622d30ea906Sjfb8856606 &line_number,
4623d30ea906Sjfb8856606 out,
4624d30ea906Sjfb8856606 out_size);
4625d30ea906Sjfb8856606 if (status) {
4626d30ea906Sjfb8856606 snprintf(out, out_size, MSG_FILE_ERR, file_name, line_number);
4627d30ea906Sjfb8856606 return;
4628d30ea906Sjfb8856606 }
4629d30ea906Sjfb8856606
4630d30ea906Sjfb8856606 /* Rule bulk add */
4631d30ea906Sjfb8856606 status = pipeline_table_rule_add_bulk(pipeline_name,
4632d30ea906Sjfb8856606 table_id,
4633d30ea906Sjfb8856606 list,
4634d30ea906Sjfb8856606 &n_rules_added,
4635d30ea906Sjfb8856606 &n_rules_not_added);
4636d30ea906Sjfb8856606 if (status) {
4637d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4638d30ea906Sjfb8856606 return;
4639d30ea906Sjfb8856606 }
4640d30ea906Sjfb8856606
4641d30ea906Sjfb8856606 snprintf(out, out_size, "Added %u rules out of %u.\n",
4642d30ea906Sjfb8856606 n_rules_added,
4643d30ea906Sjfb8856606 n_rules);
4644d30ea906Sjfb8856606 }
4645d30ea906Sjfb8856606
4646d30ea906Sjfb8856606
4647d30ea906Sjfb8856606 static const char cmd_pipeline_table_rule_delete_help[] =
4648d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> rule delete\n"
4649d30ea906Sjfb8856606 " match <match>\n";
4650d30ea906Sjfb8856606
4651d30ea906Sjfb8856606 static void
cmd_pipeline_table_rule_delete(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)4652d30ea906Sjfb8856606 cmd_pipeline_table_rule_delete(char **tokens,
4653d30ea906Sjfb8856606 uint32_t n_tokens,
4654d30ea906Sjfb8856606 char *out,
4655d30ea906Sjfb8856606 size_t out_size)
4656d30ea906Sjfb8856606 {
4657d30ea906Sjfb8856606 struct table_rule_match m;
4658d30ea906Sjfb8856606 char *pipeline_name;
4659d30ea906Sjfb8856606 uint32_t table_id, n_tokens_parsed, t0;
4660d30ea906Sjfb8856606 int status;
4661d30ea906Sjfb8856606
4662d30ea906Sjfb8856606 if (n_tokens < 8) {
4663d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4664d30ea906Sjfb8856606 return;
4665d30ea906Sjfb8856606 }
4666d30ea906Sjfb8856606
4667d30ea906Sjfb8856606 pipeline_name = tokens[1];
4668d30ea906Sjfb8856606
4669d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
4670d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
4671d30ea906Sjfb8856606 return;
4672d30ea906Sjfb8856606 }
4673d30ea906Sjfb8856606
4674d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
4675d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4676d30ea906Sjfb8856606 return;
4677d30ea906Sjfb8856606 }
4678d30ea906Sjfb8856606
4679d30ea906Sjfb8856606 if (strcmp(tokens[4], "rule") != 0) {
4680d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
4681d30ea906Sjfb8856606 return;
4682d30ea906Sjfb8856606 }
4683d30ea906Sjfb8856606
4684d30ea906Sjfb8856606 if (strcmp(tokens[5], "delete") != 0) {
4685d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
4686d30ea906Sjfb8856606 return;
4687d30ea906Sjfb8856606 }
4688d30ea906Sjfb8856606
4689d30ea906Sjfb8856606 t0 = 6;
4690d30ea906Sjfb8856606
4691d30ea906Sjfb8856606 /* match */
4692d30ea906Sjfb8856606 n_tokens_parsed = parse_match(tokens + t0,
4693d30ea906Sjfb8856606 n_tokens - t0,
4694d30ea906Sjfb8856606 out,
4695d30ea906Sjfb8856606 out_size,
4696d30ea906Sjfb8856606 &m);
4697d30ea906Sjfb8856606 if (n_tokens_parsed == 0)
4698d30ea906Sjfb8856606 return;
4699d30ea906Sjfb8856606 t0 += n_tokens_parsed;
4700d30ea906Sjfb8856606
4701d30ea906Sjfb8856606 if (n_tokens != t0) {
4702d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4703d30ea906Sjfb8856606 return;
4704d30ea906Sjfb8856606 }
4705d30ea906Sjfb8856606
4706d30ea906Sjfb8856606 status = pipeline_table_rule_delete(pipeline_name,
4707d30ea906Sjfb8856606 table_id,
4708d30ea906Sjfb8856606 &m);
4709d30ea906Sjfb8856606 if (status) {
4710d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4711d30ea906Sjfb8856606 return;
4712d30ea906Sjfb8856606 }
4713d30ea906Sjfb8856606 }
4714d30ea906Sjfb8856606
4715d30ea906Sjfb8856606
4716d30ea906Sjfb8856606 static const char cmd_pipeline_table_rule_delete_default_help[] =
4717d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> rule delete\n"
4718d30ea906Sjfb8856606 " match\n"
4719d30ea906Sjfb8856606 " default\n";
4720d30ea906Sjfb8856606
4721d30ea906Sjfb8856606 static void
cmd_pipeline_table_rule_delete_default(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)4722d30ea906Sjfb8856606 cmd_pipeline_table_rule_delete_default(char **tokens,
4723d30ea906Sjfb8856606 uint32_t n_tokens,
4724d30ea906Sjfb8856606 char *out,
4725d30ea906Sjfb8856606 size_t out_size)
4726d30ea906Sjfb8856606 {
4727d30ea906Sjfb8856606 char *pipeline_name;
4728d30ea906Sjfb8856606 uint32_t table_id;
4729d30ea906Sjfb8856606 int status;
4730d30ea906Sjfb8856606
4731d30ea906Sjfb8856606 if (n_tokens != 8) {
4732d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4733d30ea906Sjfb8856606 return;
4734d30ea906Sjfb8856606 }
4735d30ea906Sjfb8856606
4736d30ea906Sjfb8856606 pipeline_name = tokens[1];
4737d30ea906Sjfb8856606
4738d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
4739d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
4740d30ea906Sjfb8856606 return;
4741d30ea906Sjfb8856606 }
4742d30ea906Sjfb8856606
4743d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
4744d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4745d30ea906Sjfb8856606 return;
4746d30ea906Sjfb8856606 }
4747d30ea906Sjfb8856606
4748d30ea906Sjfb8856606 if (strcmp(tokens[4], "rule") != 0) {
4749d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
4750d30ea906Sjfb8856606 return;
4751d30ea906Sjfb8856606 }
4752d30ea906Sjfb8856606
4753d30ea906Sjfb8856606 if (strcmp(tokens[5], "delete") != 0) {
4754d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
4755d30ea906Sjfb8856606 return;
4756d30ea906Sjfb8856606 }
4757d30ea906Sjfb8856606
4758d30ea906Sjfb8856606 if (strcmp(tokens[6], "match") != 0) {
4759d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "match");
4760d30ea906Sjfb8856606 return;
4761d30ea906Sjfb8856606 }
4762d30ea906Sjfb8856606
4763d30ea906Sjfb8856606 if (strcmp(tokens[7], "default") != 0) {
4764d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "default");
4765d30ea906Sjfb8856606 return;
4766d30ea906Sjfb8856606 }
4767d30ea906Sjfb8856606
4768d30ea906Sjfb8856606 status = pipeline_table_rule_delete_default(pipeline_name,
4769d30ea906Sjfb8856606 table_id);
4770d30ea906Sjfb8856606 if (status) {
4771d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4772d30ea906Sjfb8856606 return;
4773d30ea906Sjfb8856606 }
4774d30ea906Sjfb8856606 }
4775d30ea906Sjfb8856606
4776d30ea906Sjfb8856606 static void
ether_addr_show(FILE * f,struct rte_ether_addr * addr)47774418919fSjohnjiang ether_addr_show(FILE *f, struct rte_ether_addr *addr)
4778d30ea906Sjfb8856606 {
4779d30ea906Sjfb8856606 fprintf(f, "%02x:%02x:%02x:%02x:%02x:%02x",
4780d30ea906Sjfb8856606 (uint32_t)addr->addr_bytes[0], (uint32_t)addr->addr_bytes[1],
4781d30ea906Sjfb8856606 (uint32_t)addr->addr_bytes[2], (uint32_t)addr->addr_bytes[3],
4782d30ea906Sjfb8856606 (uint32_t)addr->addr_bytes[4], (uint32_t)addr->addr_bytes[5]);
4783d30ea906Sjfb8856606 }
4784d30ea906Sjfb8856606
4785d30ea906Sjfb8856606 static void
ipv4_addr_show(FILE * f,uint32_t addr)4786d30ea906Sjfb8856606 ipv4_addr_show(FILE *f, uint32_t addr)
4787d30ea906Sjfb8856606 {
4788d30ea906Sjfb8856606 fprintf(f, "%u.%u.%u.%u",
4789d30ea906Sjfb8856606 addr >> 24,
4790d30ea906Sjfb8856606 (addr >> 16) & 0xFF,
4791d30ea906Sjfb8856606 (addr >> 8) & 0xFF,
4792d30ea906Sjfb8856606 addr & 0xFF);
4793d30ea906Sjfb8856606 }
4794d30ea906Sjfb8856606
4795d30ea906Sjfb8856606 static void
ipv6_addr_show(FILE * f,uint8_t * addr)4796d30ea906Sjfb8856606 ipv6_addr_show(FILE *f, uint8_t *addr)
4797d30ea906Sjfb8856606 {
4798d30ea906Sjfb8856606 fprintf(f, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:"
4799d30ea906Sjfb8856606 "%02x%02x:%02x%02x:%02x%02x:%02x%02x:",
4800d30ea906Sjfb8856606 (uint32_t)addr[0], (uint32_t)addr[1],
4801d30ea906Sjfb8856606 (uint32_t)addr[2], (uint32_t)addr[3],
4802d30ea906Sjfb8856606 (uint32_t)addr[4], (uint32_t)addr[5],
4803d30ea906Sjfb8856606 (uint32_t)addr[6], (uint32_t)addr[7],
4804d30ea906Sjfb8856606 (uint32_t)addr[8], (uint32_t)addr[9],
4805d30ea906Sjfb8856606 (uint32_t)addr[10], (uint32_t)addr[11],
4806d30ea906Sjfb8856606 (uint32_t)addr[12], (uint32_t)addr[13],
4807d30ea906Sjfb8856606 (uint32_t)addr[14], (uint32_t)addr[15]);
4808d30ea906Sjfb8856606 }
4809d30ea906Sjfb8856606
4810d30ea906Sjfb8856606 static const char *
policer_action_string(enum rte_table_action_policer action)4811d30ea906Sjfb8856606 policer_action_string(enum rte_table_action_policer action) {
4812d30ea906Sjfb8856606 switch (action) {
4813d30ea906Sjfb8856606 case RTE_TABLE_ACTION_POLICER_COLOR_GREEN: return "G";
4814d30ea906Sjfb8856606 case RTE_TABLE_ACTION_POLICER_COLOR_YELLOW: return "Y";
4815d30ea906Sjfb8856606 case RTE_TABLE_ACTION_POLICER_COLOR_RED: return "R";
4816d30ea906Sjfb8856606 case RTE_TABLE_ACTION_POLICER_DROP: return "D";
4817d30ea906Sjfb8856606 default: return "?";
4818d30ea906Sjfb8856606 }
4819d30ea906Sjfb8856606 }
4820d30ea906Sjfb8856606
4821d30ea906Sjfb8856606 static int
table_rule_show(const char * pipeline_name,uint32_t table_id,const char * file_name)4822d30ea906Sjfb8856606 table_rule_show(const char *pipeline_name,
4823d30ea906Sjfb8856606 uint32_t table_id,
4824d30ea906Sjfb8856606 const char *file_name)
4825d30ea906Sjfb8856606 {
4826d30ea906Sjfb8856606 struct pipeline *p;
4827d30ea906Sjfb8856606 struct table *table;
4828d30ea906Sjfb8856606 struct table_rule *rule;
4829d30ea906Sjfb8856606 FILE *f = NULL;
4830d30ea906Sjfb8856606 uint32_t i;
4831d30ea906Sjfb8856606
4832d30ea906Sjfb8856606 /* Check input params. */
4833d30ea906Sjfb8856606 if ((pipeline_name == NULL) ||
4834d30ea906Sjfb8856606 (file_name == NULL))
4835d30ea906Sjfb8856606 return -1;
4836d30ea906Sjfb8856606
4837d30ea906Sjfb8856606 p = pipeline_find(pipeline_name);
4838d30ea906Sjfb8856606 if ((p == NULL) ||
4839d30ea906Sjfb8856606 (table_id >= p->n_tables))
4840d30ea906Sjfb8856606 return -1;
4841d30ea906Sjfb8856606
4842d30ea906Sjfb8856606 table = &p->table[table_id];
4843d30ea906Sjfb8856606
4844d30ea906Sjfb8856606 /* Open file. */
4845d30ea906Sjfb8856606 f = fopen(file_name, "w");
4846d30ea906Sjfb8856606 if (f == NULL)
4847d30ea906Sjfb8856606 return -1;
4848d30ea906Sjfb8856606
4849d30ea906Sjfb8856606 /* Write table rules to file. */
4850d30ea906Sjfb8856606 TAILQ_FOREACH(rule, &table->rules, node) {
4851d30ea906Sjfb8856606 struct table_rule_match *m = &rule->match;
4852d30ea906Sjfb8856606 struct table_rule_action *a = &rule->action;
4853d30ea906Sjfb8856606
4854d30ea906Sjfb8856606 fprintf(f, "match ");
4855d30ea906Sjfb8856606 switch (m->match_type) {
4856d30ea906Sjfb8856606 case TABLE_ACL:
4857d30ea906Sjfb8856606 fprintf(f, "acl priority %u ",
4858d30ea906Sjfb8856606 m->match.acl.priority);
4859d30ea906Sjfb8856606
4860d30ea906Sjfb8856606 fprintf(f, m->match.acl.ip_version ? "ipv4 " : "ipv6 ");
4861d30ea906Sjfb8856606
4862d30ea906Sjfb8856606 if (m->match.acl.ip_version)
4863d30ea906Sjfb8856606 ipv4_addr_show(f, m->match.acl.ipv4.sa);
4864d30ea906Sjfb8856606 else
4865d30ea906Sjfb8856606 ipv6_addr_show(f, m->match.acl.ipv6.sa);
4866d30ea906Sjfb8856606
4867d30ea906Sjfb8856606 fprintf(f, "%u", m->match.acl.sa_depth);
4868d30ea906Sjfb8856606
4869d30ea906Sjfb8856606 if (m->match.acl.ip_version)
4870d30ea906Sjfb8856606 ipv4_addr_show(f, m->match.acl.ipv4.da);
4871d30ea906Sjfb8856606 else
4872d30ea906Sjfb8856606 ipv6_addr_show(f, m->match.acl.ipv6.da);
4873d30ea906Sjfb8856606
4874d30ea906Sjfb8856606 fprintf(f, "%u", m->match.acl.da_depth);
4875d30ea906Sjfb8856606
4876d30ea906Sjfb8856606 fprintf(f, "%u %u %u %u %u ",
4877d30ea906Sjfb8856606 (uint32_t)m->match.acl.sp0,
4878d30ea906Sjfb8856606 (uint32_t)m->match.acl.sp1,
4879d30ea906Sjfb8856606 (uint32_t)m->match.acl.dp0,
4880d30ea906Sjfb8856606 (uint32_t)m->match.acl.dp1,
4881d30ea906Sjfb8856606 (uint32_t)m->match.acl.proto);
4882d30ea906Sjfb8856606 break;
4883d30ea906Sjfb8856606
4884d30ea906Sjfb8856606 case TABLE_ARRAY:
4885d30ea906Sjfb8856606 fprintf(f, "array %u ",
4886d30ea906Sjfb8856606 m->match.array.pos);
4887d30ea906Sjfb8856606 break;
4888d30ea906Sjfb8856606
4889d30ea906Sjfb8856606 case TABLE_HASH:
4890d30ea906Sjfb8856606 fprintf(f, "hash raw ");
4891d30ea906Sjfb8856606 for (i = 0; i < table->params.match.hash.key_size; i++)
4892d30ea906Sjfb8856606 fprintf(f, "%02x", m->match.hash.key[i]);
4893d30ea906Sjfb8856606 fprintf(f, " ");
4894d30ea906Sjfb8856606 break;
4895d30ea906Sjfb8856606
4896d30ea906Sjfb8856606 case TABLE_LPM:
4897d30ea906Sjfb8856606 fprintf(f, "lpm ");
4898d30ea906Sjfb8856606
4899d30ea906Sjfb8856606 fprintf(f, m->match.lpm.ip_version ? "ipv4 " : "ipv6 ");
4900d30ea906Sjfb8856606
4901d30ea906Sjfb8856606 if (m->match.acl.ip_version)
4902d30ea906Sjfb8856606 ipv4_addr_show(f, m->match.lpm.ipv4);
4903d30ea906Sjfb8856606 else
4904d30ea906Sjfb8856606 ipv6_addr_show(f, m->match.lpm.ipv6);
4905d30ea906Sjfb8856606
4906d30ea906Sjfb8856606 fprintf(f, "%u ",
4907d30ea906Sjfb8856606 (uint32_t)m->match.lpm.depth);
4908d30ea906Sjfb8856606 break;
4909d30ea906Sjfb8856606
4910d30ea906Sjfb8856606 default:
4911d30ea906Sjfb8856606 fprintf(f, "unknown ");
4912d30ea906Sjfb8856606 }
4913d30ea906Sjfb8856606
4914d30ea906Sjfb8856606 fprintf(f, "action ");
4915d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_FWD)) {
4916d30ea906Sjfb8856606 fprintf(f, "fwd ");
4917d30ea906Sjfb8856606 switch (a->fwd.action) {
4918d30ea906Sjfb8856606 case RTE_PIPELINE_ACTION_DROP:
4919d30ea906Sjfb8856606 fprintf(f, "drop ");
4920d30ea906Sjfb8856606 break;
4921d30ea906Sjfb8856606
4922d30ea906Sjfb8856606 case RTE_PIPELINE_ACTION_PORT:
4923d30ea906Sjfb8856606 fprintf(f, "port %u ", a->fwd.id);
4924d30ea906Sjfb8856606 break;
4925d30ea906Sjfb8856606
4926d30ea906Sjfb8856606 case RTE_PIPELINE_ACTION_PORT_META:
4927d30ea906Sjfb8856606 fprintf(f, "meta ");
4928d30ea906Sjfb8856606 break;
4929d30ea906Sjfb8856606
4930d30ea906Sjfb8856606 case RTE_PIPELINE_ACTION_TABLE:
4931d30ea906Sjfb8856606 default:
4932d30ea906Sjfb8856606 fprintf(f, "table %u ", a->fwd.id);
4933d30ea906Sjfb8856606 }
4934d30ea906Sjfb8856606 }
4935d30ea906Sjfb8856606
4936d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_LB)) {
4937d30ea906Sjfb8856606 fprintf(f, "balance ");
4938d30ea906Sjfb8856606 for (i = 0; i < RTE_DIM(a->lb.out); i++)
4939d30ea906Sjfb8856606 fprintf(f, "%u ", a->lb.out[i]);
4940d30ea906Sjfb8856606 }
4941d30ea906Sjfb8856606
4942d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) {
4943d30ea906Sjfb8856606 fprintf(f, "mtr ");
4944d30ea906Sjfb8856606 for (i = 0; i < RTE_TABLE_ACTION_TC_MAX; i++)
4945d30ea906Sjfb8856606 if (a->mtr.tc_mask & (1 << i)) {
4946d30ea906Sjfb8856606 struct rte_table_action_mtr_tc_params *p =
4947d30ea906Sjfb8856606 &a->mtr.mtr[i];
4948d30ea906Sjfb8856606 enum rte_table_action_policer ga =
49494418919fSjohnjiang p->policer[RTE_COLOR_GREEN];
4950d30ea906Sjfb8856606 enum rte_table_action_policer ya =
49514418919fSjohnjiang p->policer[RTE_COLOR_YELLOW];
4952d30ea906Sjfb8856606 enum rte_table_action_policer ra =
49534418919fSjohnjiang p->policer[RTE_COLOR_RED];
4954d30ea906Sjfb8856606
4955d30ea906Sjfb8856606 fprintf(f, "tc%u meter %u policer g %s y %s r %s ",
4956d30ea906Sjfb8856606 i,
4957d30ea906Sjfb8856606 a->mtr.mtr[i].meter_profile_id,
4958d30ea906Sjfb8856606 policer_action_string(ga),
4959d30ea906Sjfb8856606 policer_action_string(ya),
4960d30ea906Sjfb8856606 policer_action_string(ra));
4961d30ea906Sjfb8856606 }
4962d30ea906Sjfb8856606 }
4963d30ea906Sjfb8856606
4964d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_TM))
4965d30ea906Sjfb8856606 fprintf(f, "tm subport %u pipe %u ",
4966d30ea906Sjfb8856606 a->tm.subport_id,
4967d30ea906Sjfb8856606 a->tm.pipe_id);
4968d30ea906Sjfb8856606
4969d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_ENCAP)) {
4970d30ea906Sjfb8856606 fprintf(f, "encap ");
4971d30ea906Sjfb8856606 switch (a->encap.type) {
4972d30ea906Sjfb8856606 case RTE_TABLE_ACTION_ENCAP_ETHER:
4973d30ea906Sjfb8856606 fprintf(f, "ether ");
4974d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.ether.ether.da);
4975d30ea906Sjfb8856606 fprintf(f, " ");
4976d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.ether.ether.sa);
4977d30ea906Sjfb8856606 fprintf(f, " ");
4978d30ea906Sjfb8856606 break;
4979d30ea906Sjfb8856606
4980d30ea906Sjfb8856606 case RTE_TABLE_ACTION_ENCAP_VLAN:
4981d30ea906Sjfb8856606 fprintf(f, "vlan ");
4982d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.vlan.ether.da);
4983d30ea906Sjfb8856606 fprintf(f, " ");
4984d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.vlan.ether.sa);
4985d30ea906Sjfb8856606 fprintf(f, " pcp %u dei %u vid %u ",
4986d30ea906Sjfb8856606 a->encap.vlan.vlan.pcp,
4987d30ea906Sjfb8856606 a->encap.vlan.vlan.dei,
4988d30ea906Sjfb8856606 a->encap.vlan.vlan.vid);
4989d30ea906Sjfb8856606 break;
4990d30ea906Sjfb8856606
4991d30ea906Sjfb8856606 case RTE_TABLE_ACTION_ENCAP_QINQ:
4992d30ea906Sjfb8856606 fprintf(f, "qinq ");
4993d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.qinq.ether.da);
4994d30ea906Sjfb8856606 fprintf(f, " ");
4995d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.qinq.ether.sa);
4996d30ea906Sjfb8856606 fprintf(f, " pcp %u dei %u vid %u pcp %u dei %u vid %u ",
4997d30ea906Sjfb8856606 a->encap.qinq.svlan.pcp,
4998d30ea906Sjfb8856606 a->encap.qinq.svlan.dei,
4999d30ea906Sjfb8856606 a->encap.qinq.svlan.vid,
5000d30ea906Sjfb8856606 a->encap.qinq.cvlan.pcp,
5001d30ea906Sjfb8856606 a->encap.qinq.cvlan.dei,
5002d30ea906Sjfb8856606 a->encap.qinq.cvlan.vid);
5003d30ea906Sjfb8856606 break;
5004d30ea906Sjfb8856606
5005d30ea906Sjfb8856606 case RTE_TABLE_ACTION_ENCAP_MPLS:
5006d30ea906Sjfb8856606 fprintf(f, "mpls %s ", (a->encap.mpls.unicast) ?
5007d30ea906Sjfb8856606 "unicast " : "multicast ");
5008d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.mpls.ether.da);
5009d30ea906Sjfb8856606 fprintf(f, " ");
5010d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.mpls.ether.sa);
5011d30ea906Sjfb8856606 fprintf(f, " ");
5012d30ea906Sjfb8856606 for (i = 0; i < a->encap.mpls.mpls_count; i++) {
5013d30ea906Sjfb8856606 struct rte_table_action_mpls_hdr *l =
5014d30ea906Sjfb8856606 &a->encap.mpls.mpls[i];
5015d30ea906Sjfb8856606
5016d30ea906Sjfb8856606 fprintf(f, "label%u %u %u %u ",
5017d30ea906Sjfb8856606 i,
5018d30ea906Sjfb8856606 l->label,
5019d30ea906Sjfb8856606 l->tc,
5020d30ea906Sjfb8856606 l->ttl);
5021d30ea906Sjfb8856606 }
5022d30ea906Sjfb8856606 break;
5023d30ea906Sjfb8856606
5024d30ea906Sjfb8856606 case RTE_TABLE_ACTION_ENCAP_PPPOE:
5025d30ea906Sjfb8856606 fprintf(f, "pppoe ");
5026d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.pppoe.ether.da);
5027d30ea906Sjfb8856606 fprintf(f, " ");
5028d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.pppoe.ether.sa);
5029d30ea906Sjfb8856606 fprintf(f, " %u ", a->encap.pppoe.pppoe.session_id);
5030d30ea906Sjfb8856606 break;
5031d30ea906Sjfb8856606
5032d30ea906Sjfb8856606 case RTE_TABLE_ACTION_ENCAP_VXLAN:
5033d30ea906Sjfb8856606 fprintf(f, "vxlan ether ");
5034d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.vxlan.ether.da);
5035d30ea906Sjfb8856606 fprintf(f, " ");
5036d30ea906Sjfb8856606 ether_addr_show(f, &a->encap.vxlan.ether.sa);
5037d30ea906Sjfb8856606 if (table->ap->params.encap.vxlan.vlan)
5038d30ea906Sjfb8856606 fprintf(f, " vlan pcp %u dei %u vid %u ",
5039d30ea906Sjfb8856606 a->encap.vxlan.vlan.pcp,
5040d30ea906Sjfb8856606 a->encap.vxlan.vlan.dei,
5041d30ea906Sjfb8856606 a->encap.vxlan.vlan.vid);
5042d30ea906Sjfb8856606 if (table->ap->params.encap.vxlan.ip_version) {
5043d30ea906Sjfb8856606 fprintf(f, " ipv4 ");
5044d30ea906Sjfb8856606 ipv4_addr_show(f, a->encap.vxlan.ipv4.sa);
5045d30ea906Sjfb8856606 fprintf(f, " ");
5046d30ea906Sjfb8856606 ipv4_addr_show(f, a->encap.vxlan.ipv4.da);
5047d30ea906Sjfb8856606 fprintf(f, " %u %u ",
5048d30ea906Sjfb8856606 (uint32_t)a->encap.vxlan.ipv4.dscp,
5049d30ea906Sjfb8856606 (uint32_t)a->encap.vxlan.ipv4.ttl);
5050d30ea906Sjfb8856606 } else {
5051d30ea906Sjfb8856606 fprintf(f, " ipv6 ");
5052d30ea906Sjfb8856606 ipv6_addr_show(f, a->encap.vxlan.ipv6.sa);
5053d30ea906Sjfb8856606 fprintf(f, " ");
5054d30ea906Sjfb8856606 ipv6_addr_show(f, a->encap.vxlan.ipv6.da);
5055d30ea906Sjfb8856606 fprintf(f, " %u %u %u ",
5056d30ea906Sjfb8856606 a->encap.vxlan.ipv6.flow_label,
5057d30ea906Sjfb8856606 (uint32_t)a->encap.vxlan.ipv6.dscp,
5058d30ea906Sjfb8856606 (uint32_t)a->encap.vxlan.ipv6.hop_limit);
5059d30ea906Sjfb8856606 fprintf(f, " udp %u %u vxlan %u ",
5060d30ea906Sjfb8856606 a->encap.vxlan.udp.sp,
5061d30ea906Sjfb8856606 a->encap.vxlan.udp.dp,
5062d30ea906Sjfb8856606 a->encap.vxlan.vxlan.vni);
5063d30ea906Sjfb8856606 }
5064d30ea906Sjfb8856606 break;
5065d30ea906Sjfb8856606
5066d30ea906Sjfb8856606 default:
5067d30ea906Sjfb8856606 fprintf(f, "unknown ");
5068d30ea906Sjfb8856606 }
5069d30ea906Sjfb8856606 }
5070d30ea906Sjfb8856606
5071d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_NAT)) {
5072d30ea906Sjfb8856606 fprintf(f, "nat %s ", (a->nat.ip_version) ? "ipv4 " : "ipv6 ");
5073d30ea906Sjfb8856606 if (a->nat.ip_version)
5074d30ea906Sjfb8856606 ipv4_addr_show(f, a->nat.addr.ipv4);
5075d30ea906Sjfb8856606 else
5076d30ea906Sjfb8856606 ipv6_addr_show(f, a->nat.addr.ipv6);
5077d30ea906Sjfb8856606 fprintf(f, " %u ", (uint32_t)(a->nat.port));
5078d30ea906Sjfb8856606 }
5079d30ea906Sjfb8856606
5080d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_TTL))
5081d30ea906Sjfb8856606 fprintf(f, "ttl %s ", (a->ttl.decrement) ? "dec" : "keep");
5082d30ea906Sjfb8856606
5083d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_STATS))
5084d30ea906Sjfb8856606 fprintf(f, "stats ");
5085d30ea906Sjfb8856606
5086d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_TIME))
5087d30ea906Sjfb8856606 fprintf(f, "time ");
5088d30ea906Sjfb8856606
5089d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_SYM_CRYPTO))
5090d30ea906Sjfb8856606 fprintf(f, "sym_crypto ");
5091d30ea906Sjfb8856606
5092d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_TAG))
5093d30ea906Sjfb8856606 fprintf(f, "tag %u ", a->tag.tag);
5094d30ea906Sjfb8856606
5095d30ea906Sjfb8856606 if (a->action_mask & (1LLU << RTE_TABLE_ACTION_DECAP))
5096d30ea906Sjfb8856606 fprintf(f, "decap %u ", a->decap.n);
5097d30ea906Sjfb8856606
5098d30ea906Sjfb8856606 /* end */
5099d30ea906Sjfb8856606 fprintf(f, "\n");
5100d30ea906Sjfb8856606 }
5101d30ea906Sjfb8856606
5102d30ea906Sjfb8856606 /* Write table default rule to file. */
5103d30ea906Sjfb8856606 if (table->rule_default) {
5104d30ea906Sjfb8856606 struct table_rule_action *a = &table->rule_default->action;
5105d30ea906Sjfb8856606
5106d30ea906Sjfb8856606 fprintf(f, "# match default action fwd ");
5107d30ea906Sjfb8856606
5108d30ea906Sjfb8856606 switch (a->fwd.action) {
5109d30ea906Sjfb8856606 case RTE_PIPELINE_ACTION_DROP:
5110d30ea906Sjfb8856606 fprintf(f, "drop ");
5111d30ea906Sjfb8856606 break;
5112d30ea906Sjfb8856606
5113d30ea906Sjfb8856606 case RTE_PIPELINE_ACTION_PORT:
5114d30ea906Sjfb8856606 fprintf(f, "port %u ", a->fwd.id);
5115d30ea906Sjfb8856606 break;
5116d30ea906Sjfb8856606
5117d30ea906Sjfb8856606 case RTE_PIPELINE_ACTION_PORT_META:
5118d30ea906Sjfb8856606 fprintf(f, "meta ");
5119d30ea906Sjfb8856606 break;
5120d30ea906Sjfb8856606
5121d30ea906Sjfb8856606 case RTE_PIPELINE_ACTION_TABLE:
5122d30ea906Sjfb8856606 default:
5123d30ea906Sjfb8856606 fprintf(f, "table %u ", a->fwd.id);
5124d30ea906Sjfb8856606 }
5125d30ea906Sjfb8856606 } else
5126d30ea906Sjfb8856606 fprintf(f, "# match default action fwd drop ");
5127d30ea906Sjfb8856606
5128d30ea906Sjfb8856606 fprintf(f, "\n");
5129d30ea906Sjfb8856606
5130d30ea906Sjfb8856606 /* Close file. */
5131d30ea906Sjfb8856606 fclose(f);
5132d30ea906Sjfb8856606
5133d30ea906Sjfb8856606 return 0;
5134d30ea906Sjfb8856606 }
5135d30ea906Sjfb8856606
5136d30ea906Sjfb8856606 static const char cmd_pipeline_table_rule_show_help[] =
5137d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> rule show\n"
5138d30ea906Sjfb8856606 " file <file_name>\n";
5139d30ea906Sjfb8856606
5140d30ea906Sjfb8856606 static void
cmd_pipeline_table_rule_show(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)5141d30ea906Sjfb8856606 cmd_pipeline_table_rule_show(char **tokens,
5142d30ea906Sjfb8856606 uint32_t n_tokens,
5143d30ea906Sjfb8856606 char *out,
5144d30ea906Sjfb8856606 size_t out_size)
5145d30ea906Sjfb8856606 {
5146d30ea906Sjfb8856606 char *file_name = NULL, *pipeline_name;
5147d30ea906Sjfb8856606 uint32_t table_id;
5148d30ea906Sjfb8856606 int status;
5149d30ea906Sjfb8856606
5150d30ea906Sjfb8856606 if (n_tokens != 8) {
5151d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
5152d30ea906Sjfb8856606 return;
5153d30ea906Sjfb8856606 }
5154d30ea906Sjfb8856606
5155d30ea906Sjfb8856606 pipeline_name = tokens[1];
5156d30ea906Sjfb8856606
5157d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
5158d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
5159d30ea906Sjfb8856606 return;
5160d30ea906Sjfb8856606 }
5161d30ea906Sjfb8856606
5162d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
5163d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
5164d30ea906Sjfb8856606 return;
5165d30ea906Sjfb8856606 }
5166d30ea906Sjfb8856606
5167d30ea906Sjfb8856606 if (strcmp(tokens[4], "rule") != 0) {
5168d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
5169d30ea906Sjfb8856606 return;
5170d30ea906Sjfb8856606 }
5171d30ea906Sjfb8856606
5172d30ea906Sjfb8856606 if (strcmp(tokens[5], "show") != 0) {
5173d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "show");
5174d30ea906Sjfb8856606 return;
5175d30ea906Sjfb8856606 }
5176d30ea906Sjfb8856606
5177d30ea906Sjfb8856606 if (strcmp(tokens[6], "file") != 0) {
5178d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "file");
5179d30ea906Sjfb8856606 return;
5180d30ea906Sjfb8856606 }
5181d30ea906Sjfb8856606
5182d30ea906Sjfb8856606 file_name = tokens[7];
5183d30ea906Sjfb8856606
5184d30ea906Sjfb8856606 status = table_rule_show(pipeline_name, table_id, file_name);
5185d30ea906Sjfb8856606 if (status) {
5186d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
5187d30ea906Sjfb8856606 return;
5188d30ea906Sjfb8856606 }
5189d30ea906Sjfb8856606 }
5190d30ea906Sjfb8856606
5191d30ea906Sjfb8856606 static const char cmd_pipeline_table_rule_stats_read_help[] =
5192d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> rule read stats [clear]\n"
5193d30ea906Sjfb8856606 " match <match>\n";
5194d30ea906Sjfb8856606
5195d30ea906Sjfb8856606 static void
cmd_pipeline_table_rule_stats_read(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)5196d30ea906Sjfb8856606 cmd_pipeline_table_rule_stats_read(char **tokens,
5197d30ea906Sjfb8856606 uint32_t n_tokens,
5198d30ea906Sjfb8856606 char *out,
5199d30ea906Sjfb8856606 size_t out_size)
5200d30ea906Sjfb8856606 {
5201d30ea906Sjfb8856606 struct table_rule_match m;
5202d30ea906Sjfb8856606 struct rte_table_action_stats_counters stats;
5203d30ea906Sjfb8856606 char *pipeline_name;
5204d30ea906Sjfb8856606 uint32_t table_id, n_tokens_parsed;
5205d30ea906Sjfb8856606 int clear = 0, status;
5206d30ea906Sjfb8856606
5207d30ea906Sjfb8856606 if (n_tokens < 7) {
5208d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
5209d30ea906Sjfb8856606 return;
5210d30ea906Sjfb8856606 }
5211d30ea906Sjfb8856606
5212d30ea906Sjfb8856606 pipeline_name = tokens[1];
5213d30ea906Sjfb8856606
5214d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
5215d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
5216d30ea906Sjfb8856606 return;
5217d30ea906Sjfb8856606 }
5218d30ea906Sjfb8856606
5219d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
5220d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
5221d30ea906Sjfb8856606 return;
5222d30ea906Sjfb8856606 }
5223d30ea906Sjfb8856606
5224d30ea906Sjfb8856606 if (strcmp(tokens[4], "rule") != 0) {
5225d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
5226d30ea906Sjfb8856606 return;
5227d30ea906Sjfb8856606 }
5228d30ea906Sjfb8856606
5229d30ea906Sjfb8856606 if (strcmp(tokens[5], "read") != 0) {
5230d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
5231d30ea906Sjfb8856606 return;
5232d30ea906Sjfb8856606 }
5233d30ea906Sjfb8856606
5234d30ea906Sjfb8856606 if (strcmp(tokens[6], "stats") != 0) {
5235d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
5236d30ea906Sjfb8856606 return;
5237d30ea906Sjfb8856606 }
5238d30ea906Sjfb8856606
5239d30ea906Sjfb8856606 n_tokens -= 7;
5240d30ea906Sjfb8856606 tokens += 7;
5241d30ea906Sjfb8856606
5242d30ea906Sjfb8856606 /* clear */
5243d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "clear") == 0)) {
5244d30ea906Sjfb8856606 clear = 1;
5245d30ea906Sjfb8856606
5246d30ea906Sjfb8856606 n_tokens--;
5247d30ea906Sjfb8856606 tokens++;
5248d30ea906Sjfb8856606 }
5249d30ea906Sjfb8856606
5250d30ea906Sjfb8856606 /* match */
5251d30ea906Sjfb8856606 if ((n_tokens == 0) || strcmp(tokens[0], "match")) {
5252d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
5253d30ea906Sjfb8856606 return;
5254d30ea906Sjfb8856606 }
5255d30ea906Sjfb8856606
5256d30ea906Sjfb8856606 n_tokens_parsed = parse_match(tokens,
5257d30ea906Sjfb8856606 n_tokens,
5258d30ea906Sjfb8856606 out,
5259d30ea906Sjfb8856606 out_size,
5260d30ea906Sjfb8856606 &m);
5261d30ea906Sjfb8856606 if (n_tokens_parsed == 0)
5262d30ea906Sjfb8856606 return;
5263d30ea906Sjfb8856606 n_tokens -= n_tokens_parsed;
5264d30ea906Sjfb8856606 tokens += n_tokens_parsed;
5265d30ea906Sjfb8856606
5266d30ea906Sjfb8856606 /* end */
5267d30ea906Sjfb8856606 if (n_tokens) {
5268d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
5269d30ea906Sjfb8856606 return;
5270d30ea906Sjfb8856606 }
5271d30ea906Sjfb8856606
5272d30ea906Sjfb8856606 /* Read table rule stats. */
5273d30ea906Sjfb8856606 status = pipeline_table_rule_stats_read(pipeline_name,
5274d30ea906Sjfb8856606 table_id,
5275d30ea906Sjfb8856606 &m,
5276d30ea906Sjfb8856606 &stats,
5277d30ea906Sjfb8856606 clear);
5278d30ea906Sjfb8856606 if (status) {
5279d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
5280d30ea906Sjfb8856606 return;
5281d30ea906Sjfb8856606 }
5282d30ea906Sjfb8856606
5283d30ea906Sjfb8856606 /* Print stats. */
5284d30ea906Sjfb8856606 if (stats.n_packets_valid && stats.n_bytes_valid)
5285d30ea906Sjfb8856606 snprintf(out, out_size, "Packets: %" PRIu64 "; Bytes: %" PRIu64 "\n",
5286d30ea906Sjfb8856606 stats.n_packets,
5287d30ea906Sjfb8856606 stats.n_bytes);
5288d30ea906Sjfb8856606
5289d30ea906Sjfb8856606 if (stats.n_packets_valid && !stats.n_bytes_valid)
5290d30ea906Sjfb8856606 snprintf(out, out_size, "Packets: %" PRIu64 "; Bytes: N/A\n",
5291d30ea906Sjfb8856606 stats.n_packets);
5292d30ea906Sjfb8856606
5293d30ea906Sjfb8856606 if (!stats.n_packets_valid && stats.n_bytes_valid)
5294d30ea906Sjfb8856606 snprintf(out, out_size, "Packets: N/A; Bytes: %" PRIu64 "\n",
5295d30ea906Sjfb8856606 stats.n_bytes);
5296d30ea906Sjfb8856606
5297d30ea906Sjfb8856606 if (!stats.n_packets_valid && !stats.n_bytes_valid)
5298d30ea906Sjfb8856606 snprintf(out, out_size, "Packets: N/A ; Bytes: N/A\n");
5299d30ea906Sjfb8856606 }
5300d30ea906Sjfb8856606
5301d30ea906Sjfb8856606 static const char cmd_pipeline_table_meter_profile_add_help[] =
5302d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> meter profile <meter_profile_id>\n"
5303d30ea906Sjfb8856606 " add srtcm cir <cir> cbs <cbs> ebs <ebs>\n"
5304d30ea906Sjfb8856606 " | trtcm cir <cir> pir <pir> cbs <cbs> pbs <pbs>\n";
5305d30ea906Sjfb8856606
5306d30ea906Sjfb8856606 static void
cmd_pipeline_table_meter_profile_add(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)5307d30ea906Sjfb8856606 cmd_pipeline_table_meter_profile_add(char **tokens,
5308d30ea906Sjfb8856606 uint32_t n_tokens,
5309d30ea906Sjfb8856606 char *out,
5310d30ea906Sjfb8856606 size_t out_size)
5311d30ea906Sjfb8856606 {
5312d30ea906Sjfb8856606 struct rte_table_action_meter_profile p;
5313d30ea906Sjfb8856606 char *pipeline_name;
5314d30ea906Sjfb8856606 uint32_t table_id, meter_profile_id;
5315d30ea906Sjfb8856606 int status;
5316d30ea906Sjfb8856606
5317d30ea906Sjfb8856606 if (n_tokens < 9) {
5318d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
5319d30ea906Sjfb8856606 return;
5320d30ea906Sjfb8856606 }
5321d30ea906Sjfb8856606
5322d30ea906Sjfb8856606 pipeline_name = tokens[1];
5323d30ea906Sjfb8856606
5324d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
5325d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
5326d30ea906Sjfb8856606 return;
5327d30ea906Sjfb8856606 }
5328d30ea906Sjfb8856606
5329d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
5330d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
5331d30ea906Sjfb8856606 return;
5332d30ea906Sjfb8856606 }
5333d30ea906Sjfb8856606
5334d30ea906Sjfb8856606 if (strcmp(tokens[4], "meter") != 0) {
5335d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "meter");
5336d30ea906Sjfb8856606 return;
5337d30ea906Sjfb8856606 }
5338d30ea906Sjfb8856606
5339d30ea906Sjfb8856606 if (strcmp(tokens[5], "profile") != 0) {
5340d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
5341d30ea906Sjfb8856606 return;
5342d30ea906Sjfb8856606 }
5343d30ea906Sjfb8856606
5344d30ea906Sjfb8856606 if (parser_read_uint32(&meter_profile_id, tokens[6]) != 0) {
5345d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "meter_profile_id");
5346d30ea906Sjfb8856606 return;
5347d30ea906Sjfb8856606 }
5348d30ea906Sjfb8856606
5349d30ea906Sjfb8856606 if (strcmp(tokens[7], "add") != 0) {
5350d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
5351d30ea906Sjfb8856606 return;
5352d30ea906Sjfb8856606 }
5353d30ea906Sjfb8856606
5354d30ea906Sjfb8856606 if (strcmp(tokens[8], "srtcm") == 0) {
5355d30ea906Sjfb8856606 if (n_tokens != 15) {
5356d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH,
5357d30ea906Sjfb8856606 tokens[0]);
5358d30ea906Sjfb8856606 return;
5359d30ea906Sjfb8856606 }
5360d30ea906Sjfb8856606
5361d30ea906Sjfb8856606 p.alg = RTE_TABLE_ACTION_METER_SRTCM;
5362d30ea906Sjfb8856606
5363d30ea906Sjfb8856606 if (strcmp(tokens[9], "cir") != 0) {
5364d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cir");
5365d30ea906Sjfb8856606 return;
5366d30ea906Sjfb8856606 }
5367d30ea906Sjfb8856606
5368d30ea906Sjfb8856606 if (parser_read_uint64(&p.srtcm.cir, tokens[10]) != 0) {
5369d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "cir");
5370d30ea906Sjfb8856606 return;
5371d30ea906Sjfb8856606 }
5372d30ea906Sjfb8856606
5373d30ea906Sjfb8856606 if (strcmp(tokens[11], "cbs") != 0) {
5374d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cbs");
5375d30ea906Sjfb8856606 return;
5376d30ea906Sjfb8856606 }
5377d30ea906Sjfb8856606
5378d30ea906Sjfb8856606 if (parser_read_uint64(&p.srtcm.cbs, tokens[12]) != 0) {
5379d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "cbs");
5380d30ea906Sjfb8856606 return;
5381d30ea906Sjfb8856606 }
5382d30ea906Sjfb8856606
5383d30ea906Sjfb8856606 if (strcmp(tokens[13], "ebs") != 0) {
5384d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "ebs");
5385d30ea906Sjfb8856606 return;
5386d30ea906Sjfb8856606 }
5387d30ea906Sjfb8856606
5388d30ea906Sjfb8856606 if (parser_read_uint64(&p.srtcm.ebs, tokens[14]) != 0) {
5389d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "ebs");
5390d30ea906Sjfb8856606 return;
5391d30ea906Sjfb8856606 }
5392d30ea906Sjfb8856606 } else if (strcmp(tokens[8], "trtcm") == 0) {
5393d30ea906Sjfb8856606 if (n_tokens != 17) {
5394d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
5395d30ea906Sjfb8856606 return;
5396d30ea906Sjfb8856606 }
5397d30ea906Sjfb8856606
5398d30ea906Sjfb8856606 p.alg = RTE_TABLE_ACTION_METER_TRTCM;
5399d30ea906Sjfb8856606
5400d30ea906Sjfb8856606 if (strcmp(tokens[9], "cir") != 0) {
5401d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cir");
5402d30ea906Sjfb8856606 return;
5403d30ea906Sjfb8856606 }
5404d30ea906Sjfb8856606
5405d30ea906Sjfb8856606 if (parser_read_uint64(&p.trtcm.cir, tokens[10]) != 0) {
5406d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "cir");
5407d30ea906Sjfb8856606 return;
5408d30ea906Sjfb8856606 }
5409d30ea906Sjfb8856606
5410d30ea906Sjfb8856606 if (strcmp(tokens[11], "pir") != 0) {
5411d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pir");
5412d30ea906Sjfb8856606 return;
5413d30ea906Sjfb8856606 }
5414d30ea906Sjfb8856606
5415d30ea906Sjfb8856606 if (parser_read_uint64(&p.trtcm.pir, tokens[12]) != 0) {
5416d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "pir");
5417d30ea906Sjfb8856606 return;
5418d30ea906Sjfb8856606 }
5419d30ea906Sjfb8856606 if (strcmp(tokens[13], "cbs") != 0) {
5420d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cbs");
5421d30ea906Sjfb8856606 return;
5422d30ea906Sjfb8856606 }
5423d30ea906Sjfb8856606
5424d30ea906Sjfb8856606 if (parser_read_uint64(&p.trtcm.cbs, tokens[14]) != 0) {
5425d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "cbs");
5426d30ea906Sjfb8856606 return;
5427d30ea906Sjfb8856606 }
5428d30ea906Sjfb8856606
5429d30ea906Sjfb8856606 if (strcmp(tokens[15], "pbs") != 0) {
5430d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pbs");
5431d30ea906Sjfb8856606 return;
5432d30ea906Sjfb8856606 }
5433d30ea906Sjfb8856606
5434d30ea906Sjfb8856606 if (parser_read_uint64(&p.trtcm.pbs, tokens[16]) != 0) {
5435d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "pbs");
5436d30ea906Sjfb8856606 return;
5437d30ea906Sjfb8856606 }
5438d30ea906Sjfb8856606 } else {
5439d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
5440d30ea906Sjfb8856606 return;
5441d30ea906Sjfb8856606 }
5442d30ea906Sjfb8856606
5443d30ea906Sjfb8856606 status = pipeline_table_mtr_profile_add(pipeline_name,
5444d30ea906Sjfb8856606 table_id,
5445d30ea906Sjfb8856606 meter_profile_id,
5446d30ea906Sjfb8856606 &p);
5447d30ea906Sjfb8856606 if (status) {
5448d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
5449d30ea906Sjfb8856606 return;
5450d30ea906Sjfb8856606 }
5451d30ea906Sjfb8856606 }
5452d30ea906Sjfb8856606
5453d30ea906Sjfb8856606
5454d30ea906Sjfb8856606 static const char cmd_pipeline_table_meter_profile_delete_help[] =
5455d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id>\n"
5456d30ea906Sjfb8856606 " meter profile <meter_profile_id> delete\n";
5457d30ea906Sjfb8856606
5458d30ea906Sjfb8856606 static void
cmd_pipeline_table_meter_profile_delete(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)5459d30ea906Sjfb8856606 cmd_pipeline_table_meter_profile_delete(char **tokens,
5460d30ea906Sjfb8856606 uint32_t n_tokens,
5461d30ea906Sjfb8856606 char *out,
5462d30ea906Sjfb8856606 size_t out_size)
5463d30ea906Sjfb8856606 {
5464d30ea906Sjfb8856606 char *pipeline_name;
5465d30ea906Sjfb8856606 uint32_t table_id, meter_profile_id;
5466d30ea906Sjfb8856606 int status;
5467d30ea906Sjfb8856606
5468d30ea906Sjfb8856606 if (n_tokens != 8) {
5469d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
5470d30ea906Sjfb8856606 return;
5471d30ea906Sjfb8856606 }
5472d30ea906Sjfb8856606
5473d30ea906Sjfb8856606 pipeline_name = tokens[1];
5474d30ea906Sjfb8856606
5475d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
5476d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
5477d30ea906Sjfb8856606 return;
5478d30ea906Sjfb8856606 }
5479d30ea906Sjfb8856606
5480d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
5481d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
5482d30ea906Sjfb8856606 return;
5483d30ea906Sjfb8856606 }
5484d30ea906Sjfb8856606
5485d30ea906Sjfb8856606 if (strcmp(tokens[4], "meter") != 0) {
5486d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "meter");
5487d30ea906Sjfb8856606 return;
5488d30ea906Sjfb8856606 }
5489d30ea906Sjfb8856606
5490d30ea906Sjfb8856606 if (strcmp(tokens[5], "profile") != 0) {
5491d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
5492d30ea906Sjfb8856606 return;
5493d30ea906Sjfb8856606 }
5494d30ea906Sjfb8856606
5495d30ea906Sjfb8856606 if (parser_read_uint32(&meter_profile_id, tokens[6]) != 0) {
5496d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "meter_profile_id");
5497d30ea906Sjfb8856606 return;
5498d30ea906Sjfb8856606 }
5499d30ea906Sjfb8856606
5500d30ea906Sjfb8856606 if (strcmp(tokens[7], "delete") != 0) {
5501d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
5502d30ea906Sjfb8856606 return;
5503d30ea906Sjfb8856606 }
5504d30ea906Sjfb8856606
5505d30ea906Sjfb8856606 status = pipeline_table_mtr_profile_delete(pipeline_name,
5506d30ea906Sjfb8856606 table_id,
5507d30ea906Sjfb8856606 meter_profile_id);
5508d30ea906Sjfb8856606 if (status) {
5509d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
5510d30ea906Sjfb8856606 return;
5511d30ea906Sjfb8856606 }
5512d30ea906Sjfb8856606 }
5513d30ea906Sjfb8856606
5514d30ea906Sjfb8856606
5515d30ea906Sjfb8856606 static const char cmd_pipeline_table_rule_meter_read_help[] =
5516d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> rule read meter [clear]\n"
5517d30ea906Sjfb8856606 " match <match>\n";
5518d30ea906Sjfb8856606
5519d30ea906Sjfb8856606 static void
cmd_pipeline_table_rule_meter_read(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)5520d30ea906Sjfb8856606 cmd_pipeline_table_rule_meter_read(char **tokens,
5521d30ea906Sjfb8856606 uint32_t n_tokens,
5522d30ea906Sjfb8856606 char *out,
5523d30ea906Sjfb8856606 size_t out_size)
5524d30ea906Sjfb8856606 {
5525d30ea906Sjfb8856606 struct table_rule_match m;
5526d30ea906Sjfb8856606 struct rte_table_action_mtr_counters stats;
5527d30ea906Sjfb8856606 char *pipeline_name;
5528d30ea906Sjfb8856606 uint32_t table_id, n_tokens_parsed;
5529d30ea906Sjfb8856606 int clear = 0, status;
5530d30ea906Sjfb8856606
5531d30ea906Sjfb8856606 if (n_tokens < 7) {
5532d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
5533d30ea906Sjfb8856606 return;
5534d30ea906Sjfb8856606 }
5535d30ea906Sjfb8856606
5536d30ea906Sjfb8856606 pipeline_name = tokens[1];
5537d30ea906Sjfb8856606
5538d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
5539d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
5540d30ea906Sjfb8856606 return;
5541d30ea906Sjfb8856606 }
5542d30ea906Sjfb8856606
5543d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
5544d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
5545d30ea906Sjfb8856606 return;
5546d30ea906Sjfb8856606 }
5547d30ea906Sjfb8856606
5548d30ea906Sjfb8856606 if (strcmp(tokens[4], "rule") != 0) {
5549d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
5550d30ea906Sjfb8856606 return;
5551d30ea906Sjfb8856606 }
5552d30ea906Sjfb8856606
5553d30ea906Sjfb8856606 if (strcmp(tokens[5], "read") != 0) {
5554d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
5555d30ea906Sjfb8856606 return;
5556d30ea906Sjfb8856606 }
5557d30ea906Sjfb8856606
5558d30ea906Sjfb8856606 if (strcmp(tokens[6], "meter") != 0) {
5559d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "meter");
5560d30ea906Sjfb8856606 return;
5561d30ea906Sjfb8856606 }
5562d30ea906Sjfb8856606
5563d30ea906Sjfb8856606 n_tokens -= 7;
5564d30ea906Sjfb8856606 tokens += 7;
5565d30ea906Sjfb8856606
5566d30ea906Sjfb8856606 /* clear */
5567d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "clear") == 0)) {
5568d30ea906Sjfb8856606 clear = 1;
5569d30ea906Sjfb8856606
5570d30ea906Sjfb8856606 n_tokens--;
5571d30ea906Sjfb8856606 tokens++;
5572d30ea906Sjfb8856606 }
5573d30ea906Sjfb8856606
5574d30ea906Sjfb8856606 /* match */
5575d30ea906Sjfb8856606 if ((n_tokens == 0) || strcmp(tokens[0], "match")) {
5576d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
5577d30ea906Sjfb8856606 return;
5578d30ea906Sjfb8856606 }
5579d30ea906Sjfb8856606
5580d30ea906Sjfb8856606 n_tokens_parsed = parse_match(tokens,
5581d30ea906Sjfb8856606 n_tokens,
5582d30ea906Sjfb8856606 out,
5583d30ea906Sjfb8856606 out_size,
5584d30ea906Sjfb8856606 &m);
5585d30ea906Sjfb8856606 if (n_tokens_parsed == 0)
5586d30ea906Sjfb8856606 return;
5587d30ea906Sjfb8856606 n_tokens -= n_tokens_parsed;
5588d30ea906Sjfb8856606 tokens += n_tokens_parsed;
5589d30ea906Sjfb8856606
5590d30ea906Sjfb8856606 /* end */
5591d30ea906Sjfb8856606 if (n_tokens) {
5592d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
5593d30ea906Sjfb8856606 return;
5594d30ea906Sjfb8856606 }
5595d30ea906Sjfb8856606
5596d30ea906Sjfb8856606 /* Read table rule meter stats. */
5597d30ea906Sjfb8856606 status = pipeline_table_rule_mtr_read(pipeline_name,
5598d30ea906Sjfb8856606 table_id,
5599d30ea906Sjfb8856606 &m,
5600d30ea906Sjfb8856606 &stats,
5601d30ea906Sjfb8856606 clear);
5602d30ea906Sjfb8856606 if (status) {
5603d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
5604d30ea906Sjfb8856606 return;
5605d30ea906Sjfb8856606 }
5606d30ea906Sjfb8856606
5607d30ea906Sjfb8856606 /* Print stats. */
5608d30ea906Sjfb8856606 }
5609d30ea906Sjfb8856606
5610d30ea906Sjfb8856606
5611d30ea906Sjfb8856606 static const char cmd_pipeline_table_dscp_help[] =
5612d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> dscp <file_name>\n"
5613d30ea906Sjfb8856606 "\n"
5614d30ea906Sjfb8856606 " File <file_name>:\n"
5615d30ea906Sjfb8856606 " - exactly 64 lines\n"
5616d30ea906Sjfb8856606 " - line format: <tc_id> <tc_queue_id> <color>, with <color> as: g | y | r\n";
5617d30ea906Sjfb8856606
5618d30ea906Sjfb8856606 static int
load_dscp_table(struct rte_table_action_dscp_table * dscp_table,const char * file_name,uint32_t * line_number)5619d30ea906Sjfb8856606 load_dscp_table(struct rte_table_action_dscp_table *dscp_table,
5620d30ea906Sjfb8856606 const char *file_name,
5621d30ea906Sjfb8856606 uint32_t *line_number)
5622d30ea906Sjfb8856606 {
5623d30ea906Sjfb8856606 FILE *f = NULL;
5624d30ea906Sjfb8856606 uint32_t dscp, l;
5625d30ea906Sjfb8856606
5626d30ea906Sjfb8856606 /* Check input arguments */
5627d30ea906Sjfb8856606 if ((dscp_table == NULL) ||
5628d30ea906Sjfb8856606 (file_name == NULL) ||
5629d30ea906Sjfb8856606 (line_number == NULL)) {
5630d30ea906Sjfb8856606 if (line_number)
5631d30ea906Sjfb8856606 *line_number = 0;
5632d30ea906Sjfb8856606 return -EINVAL;
5633d30ea906Sjfb8856606 }
5634d30ea906Sjfb8856606
5635d30ea906Sjfb8856606 /* Open input file */
5636d30ea906Sjfb8856606 f = fopen(file_name, "r");
5637d30ea906Sjfb8856606 if (f == NULL) {
5638d30ea906Sjfb8856606 *line_number = 0;
5639d30ea906Sjfb8856606 return -EINVAL;
5640d30ea906Sjfb8856606 }
5641d30ea906Sjfb8856606
5642d30ea906Sjfb8856606 /* Read file */
5643d30ea906Sjfb8856606 for (dscp = 0, l = 1; ; l++) {
5644d30ea906Sjfb8856606 char line[64];
5645d30ea906Sjfb8856606 char *tokens[3];
56464418919fSjohnjiang enum rte_color color;
5647d30ea906Sjfb8856606 uint32_t tc_id, tc_queue_id, n_tokens = RTE_DIM(tokens);
5648d30ea906Sjfb8856606
5649d30ea906Sjfb8856606 if (fgets(line, sizeof(line), f) == NULL)
5650d30ea906Sjfb8856606 break;
5651d30ea906Sjfb8856606
5652d30ea906Sjfb8856606 if (is_comment(line))
5653d30ea906Sjfb8856606 continue;
5654d30ea906Sjfb8856606
5655d30ea906Sjfb8856606 if (parse_tokenize_string(line, tokens, &n_tokens)) {
5656d30ea906Sjfb8856606 *line_number = l;
5657d30ea906Sjfb8856606 fclose(f);
5658d30ea906Sjfb8856606 return -EINVAL;
5659d30ea906Sjfb8856606 }
5660d30ea906Sjfb8856606
5661d30ea906Sjfb8856606 if (n_tokens == 0)
5662d30ea906Sjfb8856606 continue;
5663d30ea906Sjfb8856606
5664d30ea906Sjfb8856606 if ((dscp >= RTE_DIM(dscp_table->entry)) ||
5665d30ea906Sjfb8856606 (n_tokens != RTE_DIM(tokens)) ||
5666d30ea906Sjfb8856606 parser_read_uint32(&tc_id, tokens[0]) ||
5667d30ea906Sjfb8856606 (tc_id >= RTE_TABLE_ACTION_TC_MAX) ||
5668d30ea906Sjfb8856606 parser_read_uint32(&tc_queue_id, tokens[1]) ||
5669d30ea906Sjfb8856606 (tc_queue_id >= RTE_TABLE_ACTION_TC_QUEUE_MAX) ||
5670d30ea906Sjfb8856606 (strlen(tokens[2]) != 1)) {
5671d30ea906Sjfb8856606 *line_number = l;
5672d30ea906Sjfb8856606 fclose(f);
5673d30ea906Sjfb8856606 return -EINVAL;
5674d30ea906Sjfb8856606 }
5675d30ea906Sjfb8856606
5676d30ea906Sjfb8856606 switch (tokens[2][0]) {
5677d30ea906Sjfb8856606 case 'g':
5678d30ea906Sjfb8856606 case 'G':
56794418919fSjohnjiang color = RTE_COLOR_GREEN;
5680d30ea906Sjfb8856606 break;
5681d30ea906Sjfb8856606
5682d30ea906Sjfb8856606 case 'y':
5683d30ea906Sjfb8856606 case 'Y':
56844418919fSjohnjiang color = RTE_COLOR_YELLOW;
5685d30ea906Sjfb8856606 break;
5686d30ea906Sjfb8856606
5687d30ea906Sjfb8856606 case 'r':
5688d30ea906Sjfb8856606 case 'R':
56894418919fSjohnjiang color = RTE_COLOR_RED;
5690d30ea906Sjfb8856606 break;
5691d30ea906Sjfb8856606
5692d30ea906Sjfb8856606 default:
5693d30ea906Sjfb8856606 *line_number = l;
5694d30ea906Sjfb8856606 fclose(f);
5695d30ea906Sjfb8856606 return -EINVAL;
5696d30ea906Sjfb8856606 }
5697d30ea906Sjfb8856606
5698d30ea906Sjfb8856606 dscp_table->entry[dscp].tc_id = tc_id;
5699d30ea906Sjfb8856606 dscp_table->entry[dscp].tc_queue_id = tc_queue_id;
5700d30ea906Sjfb8856606 dscp_table->entry[dscp].color = color;
5701d30ea906Sjfb8856606 dscp++;
5702d30ea906Sjfb8856606 }
5703d30ea906Sjfb8856606
5704d30ea906Sjfb8856606 /* Close file */
5705d30ea906Sjfb8856606 fclose(f);
5706d30ea906Sjfb8856606 return 0;
5707d30ea906Sjfb8856606 }
5708d30ea906Sjfb8856606
5709d30ea906Sjfb8856606 static void
cmd_pipeline_table_dscp(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)5710d30ea906Sjfb8856606 cmd_pipeline_table_dscp(char **tokens,
5711d30ea906Sjfb8856606 uint32_t n_tokens,
5712d30ea906Sjfb8856606 char *out,
5713d30ea906Sjfb8856606 size_t out_size)
5714d30ea906Sjfb8856606 {
5715d30ea906Sjfb8856606 struct rte_table_action_dscp_table dscp_table;
5716d30ea906Sjfb8856606 char *pipeline_name, *file_name;
5717d30ea906Sjfb8856606 uint32_t table_id, line_number;
5718d30ea906Sjfb8856606 int status;
5719d30ea906Sjfb8856606
5720d30ea906Sjfb8856606 if (n_tokens != 6) {
5721d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
5722d30ea906Sjfb8856606 return;
5723d30ea906Sjfb8856606 }
5724d30ea906Sjfb8856606
5725d30ea906Sjfb8856606 pipeline_name = tokens[1];
5726d30ea906Sjfb8856606
5727d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
5728d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
5729d30ea906Sjfb8856606 return;
5730d30ea906Sjfb8856606 }
5731d30ea906Sjfb8856606
5732d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
5733d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
5734d30ea906Sjfb8856606 return;
5735d30ea906Sjfb8856606 }
5736d30ea906Sjfb8856606
5737d30ea906Sjfb8856606 if (strcmp(tokens[4], "dscp") != 0) {
5738d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "dscp");
5739d30ea906Sjfb8856606 return;
5740d30ea906Sjfb8856606 }
5741d30ea906Sjfb8856606
5742d30ea906Sjfb8856606 file_name = tokens[5];
5743d30ea906Sjfb8856606
5744d30ea906Sjfb8856606 status = load_dscp_table(&dscp_table, file_name, &line_number);
5745d30ea906Sjfb8856606 if (status) {
5746d30ea906Sjfb8856606 snprintf(out, out_size, MSG_FILE_ERR, file_name, line_number);
5747d30ea906Sjfb8856606 return;
5748d30ea906Sjfb8856606 }
5749d30ea906Sjfb8856606
5750d30ea906Sjfb8856606 status = pipeline_table_dscp_table_update(pipeline_name,
5751d30ea906Sjfb8856606 table_id,
5752d30ea906Sjfb8856606 UINT64_MAX,
5753d30ea906Sjfb8856606 &dscp_table);
5754d30ea906Sjfb8856606 if (status) {
5755d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
5756d30ea906Sjfb8856606 return;
5757d30ea906Sjfb8856606 }
5758d30ea906Sjfb8856606 }
5759d30ea906Sjfb8856606
5760d30ea906Sjfb8856606
5761d30ea906Sjfb8856606 static const char cmd_pipeline_table_rule_ttl_read_help[] =
5762d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> rule read ttl [clear]\n"
5763d30ea906Sjfb8856606 " match <match>\n";
5764d30ea906Sjfb8856606
5765d30ea906Sjfb8856606 static void
cmd_pipeline_table_rule_ttl_read(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)5766d30ea906Sjfb8856606 cmd_pipeline_table_rule_ttl_read(char **tokens,
5767d30ea906Sjfb8856606 uint32_t n_tokens,
5768d30ea906Sjfb8856606 char *out,
5769d30ea906Sjfb8856606 size_t out_size)
5770d30ea906Sjfb8856606 {
5771d30ea906Sjfb8856606 struct table_rule_match m;
5772d30ea906Sjfb8856606 struct rte_table_action_ttl_counters stats;
5773d30ea906Sjfb8856606 char *pipeline_name;
5774d30ea906Sjfb8856606 uint32_t table_id, n_tokens_parsed;
5775d30ea906Sjfb8856606 int clear = 0, status;
5776d30ea906Sjfb8856606
5777d30ea906Sjfb8856606 if (n_tokens < 7) {
5778d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
5779d30ea906Sjfb8856606 return;
5780d30ea906Sjfb8856606 }
5781d30ea906Sjfb8856606
5782d30ea906Sjfb8856606 pipeline_name = tokens[1];
5783d30ea906Sjfb8856606
5784d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
5785d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
5786d30ea906Sjfb8856606 return;
5787d30ea906Sjfb8856606 }
5788d30ea906Sjfb8856606
5789d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
5790d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
5791d30ea906Sjfb8856606 return;
5792d30ea906Sjfb8856606 }
5793d30ea906Sjfb8856606
5794d30ea906Sjfb8856606 if (strcmp(tokens[4], "rule") != 0) {
5795d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
5796d30ea906Sjfb8856606 return;
5797d30ea906Sjfb8856606 }
5798d30ea906Sjfb8856606
5799d30ea906Sjfb8856606 if (strcmp(tokens[5], "read") != 0) {
5800d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
5801d30ea906Sjfb8856606 return;
5802d30ea906Sjfb8856606 }
5803d30ea906Sjfb8856606
5804d30ea906Sjfb8856606 if (strcmp(tokens[6], "ttl") != 0) {
5805d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "ttl");
5806d30ea906Sjfb8856606 return;
5807d30ea906Sjfb8856606 }
5808d30ea906Sjfb8856606
5809d30ea906Sjfb8856606 n_tokens -= 7;
5810d30ea906Sjfb8856606 tokens += 7;
5811d30ea906Sjfb8856606
5812d30ea906Sjfb8856606 /* clear */
5813d30ea906Sjfb8856606 if (n_tokens && (strcmp(tokens[0], "clear") == 0)) {
5814d30ea906Sjfb8856606 clear = 1;
5815d30ea906Sjfb8856606
5816d30ea906Sjfb8856606 n_tokens--;
5817d30ea906Sjfb8856606 tokens++;
5818d30ea906Sjfb8856606 }
5819d30ea906Sjfb8856606
5820d30ea906Sjfb8856606 /* match */
5821d30ea906Sjfb8856606 if ((n_tokens == 0) || strcmp(tokens[0], "match")) {
5822d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
5823d30ea906Sjfb8856606 return;
5824d30ea906Sjfb8856606 }
5825d30ea906Sjfb8856606
5826d30ea906Sjfb8856606 n_tokens_parsed = parse_match(tokens,
5827d30ea906Sjfb8856606 n_tokens,
5828d30ea906Sjfb8856606 out,
5829d30ea906Sjfb8856606 out_size,
5830d30ea906Sjfb8856606 &m);
5831d30ea906Sjfb8856606 if (n_tokens_parsed == 0)
5832d30ea906Sjfb8856606 return;
5833d30ea906Sjfb8856606 n_tokens -= n_tokens_parsed;
5834d30ea906Sjfb8856606 tokens += n_tokens_parsed;
5835d30ea906Sjfb8856606
5836d30ea906Sjfb8856606 /* end */
5837d30ea906Sjfb8856606 if (n_tokens) {
5838d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
5839d30ea906Sjfb8856606 return;
5840d30ea906Sjfb8856606 }
5841d30ea906Sjfb8856606
5842d30ea906Sjfb8856606 /* Read table rule TTL stats. */
5843d30ea906Sjfb8856606 status = pipeline_table_rule_ttl_read(pipeline_name,
5844d30ea906Sjfb8856606 table_id,
5845d30ea906Sjfb8856606 &m,
5846d30ea906Sjfb8856606 &stats,
5847d30ea906Sjfb8856606 clear);
5848d30ea906Sjfb8856606 if (status) {
5849d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
5850d30ea906Sjfb8856606 return;
5851d30ea906Sjfb8856606 }
5852d30ea906Sjfb8856606
5853d30ea906Sjfb8856606 /* Print stats. */
5854d30ea906Sjfb8856606 snprintf(out, out_size, "Packets: %" PRIu64 "\n",
5855d30ea906Sjfb8856606 stats.n_packets);
5856d30ea906Sjfb8856606 }
5857d30ea906Sjfb8856606
5858d30ea906Sjfb8856606 static const char cmd_pipeline_table_rule_time_read_help[] =
5859d30ea906Sjfb8856606 "pipeline <pipeline_name> table <table_id> rule read time\n"
5860d30ea906Sjfb8856606 " match <match>\n";
5861d30ea906Sjfb8856606
5862d30ea906Sjfb8856606 static void
cmd_pipeline_table_rule_time_read(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)5863d30ea906Sjfb8856606 cmd_pipeline_table_rule_time_read(char **tokens,
5864d30ea906Sjfb8856606 uint32_t n_tokens,
5865d30ea906Sjfb8856606 char *out,
5866d30ea906Sjfb8856606 size_t out_size)
5867d30ea906Sjfb8856606 {
5868d30ea906Sjfb8856606 struct table_rule_match m;
5869d30ea906Sjfb8856606 char *pipeline_name;
5870d30ea906Sjfb8856606 uint64_t timestamp;
5871d30ea906Sjfb8856606 uint32_t table_id, n_tokens_parsed;
5872d30ea906Sjfb8856606 int status;
5873d30ea906Sjfb8856606
5874d30ea906Sjfb8856606 if (n_tokens < 7) {
5875d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
5876d30ea906Sjfb8856606 return;
5877d30ea906Sjfb8856606 }
5878d30ea906Sjfb8856606
5879d30ea906Sjfb8856606 pipeline_name = tokens[1];
5880d30ea906Sjfb8856606
5881d30ea906Sjfb8856606 if (strcmp(tokens[2], "table") != 0) {
5882d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
5883d30ea906Sjfb8856606 return;
5884d30ea906Sjfb8856606 }
5885d30ea906Sjfb8856606
5886d30ea906Sjfb8856606 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
5887d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
5888d30ea906Sjfb8856606 return;
5889d30ea906Sjfb8856606 }
5890d30ea906Sjfb8856606
5891d30ea906Sjfb8856606 if (strcmp(tokens[4], "rule") != 0) {
5892d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
5893d30ea906Sjfb8856606 return;
5894d30ea906Sjfb8856606 }
5895d30ea906Sjfb8856606
5896d30ea906Sjfb8856606 if (strcmp(tokens[5], "read") != 0) {
5897d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
5898d30ea906Sjfb8856606 return;
5899d30ea906Sjfb8856606 }
5900d30ea906Sjfb8856606
5901d30ea906Sjfb8856606 if (strcmp(tokens[6], "time") != 0) {
5902d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "time");
5903d30ea906Sjfb8856606 return;
5904d30ea906Sjfb8856606 }
5905d30ea906Sjfb8856606
5906d30ea906Sjfb8856606 n_tokens -= 7;
5907d30ea906Sjfb8856606 tokens += 7;
5908d30ea906Sjfb8856606
5909d30ea906Sjfb8856606 /* match */
5910d30ea906Sjfb8856606 if ((n_tokens == 0) || strcmp(tokens[0], "match")) {
5911d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
5912d30ea906Sjfb8856606 return;
5913d30ea906Sjfb8856606 }
5914d30ea906Sjfb8856606
5915d30ea906Sjfb8856606 n_tokens_parsed = parse_match(tokens,
5916d30ea906Sjfb8856606 n_tokens,
5917d30ea906Sjfb8856606 out,
5918d30ea906Sjfb8856606 out_size,
5919d30ea906Sjfb8856606 &m);
5920d30ea906Sjfb8856606 if (n_tokens_parsed == 0)
5921d30ea906Sjfb8856606 return;
5922d30ea906Sjfb8856606 n_tokens -= n_tokens_parsed;
5923d30ea906Sjfb8856606 tokens += n_tokens_parsed;
5924d30ea906Sjfb8856606
5925d30ea906Sjfb8856606 /* end */
5926d30ea906Sjfb8856606 if (n_tokens) {
5927d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
5928d30ea906Sjfb8856606 return;
5929d30ea906Sjfb8856606 }
5930d30ea906Sjfb8856606
5931d30ea906Sjfb8856606 /* Read table rule timestamp. */
5932d30ea906Sjfb8856606 status = pipeline_table_rule_time_read(pipeline_name,
5933d30ea906Sjfb8856606 table_id,
5934d30ea906Sjfb8856606 &m,
5935d30ea906Sjfb8856606 ×tamp);
5936d30ea906Sjfb8856606 if (status) {
5937d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
5938d30ea906Sjfb8856606 return;
5939d30ea906Sjfb8856606 }
5940d30ea906Sjfb8856606
5941d30ea906Sjfb8856606 /* Print stats. */
5942d30ea906Sjfb8856606 snprintf(out, out_size, "Packets: %" PRIu64 "\n", timestamp);
5943d30ea906Sjfb8856606 }
5944d30ea906Sjfb8856606
5945d30ea906Sjfb8856606 static const char cmd_thread_pipeline_enable_help[] =
5946d30ea906Sjfb8856606 "thread <thread_id> pipeline <pipeline_name> enable\n";
5947d30ea906Sjfb8856606
5948d30ea906Sjfb8856606 static void
cmd_thread_pipeline_enable(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)5949d30ea906Sjfb8856606 cmd_thread_pipeline_enable(char **tokens,
5950d30ea906Sjfb8856606 uint32_t n_tokens,
5951d30ea906Sjfb8856606 char *out,
5952d30ea906Sjfb8856606 size_t out_size)
5953d30ea906Sjfb8856606 {
5954d30ea906Sjfb8856606 char *pipeline_name;
5955d30ea906Sjfb8856606 uint32_t thread_id;
5956d30ea906Sjfb8856606 int status;
5957d30ea906Sjfb8856606
5958d30ea906Sjfb8856606 if (n_tokens != 5) {
5959d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
5960d30ea906Sjfb8856606 return;
5961d30ea906Sjfb8856606 }
5962d30ea906Sjfb8856606
5963d30ea906Sjfb8856606 if (parser_read_uint32(&thread_id, tokens[1]) != 0) {
5964d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
5965d30ea906Sjfb8856606 return;
5966d30ea906Sjfb8856606 }
5967d30ea906Sjfb8856606
5968d30ea906Sjfb8856606 if (strcmp(tokens[2], "pipeline") != 0) {
5969d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipeline");
5970d30ea906Sjfb8856606 return;
5971d30ea906Sjfb8856606 }
5972d30ea906Sjfb8856606
5973d30ea906Sjfb8856606 pipeline_name = tokens[3];
5974d30ea906Sjfb8856606
5975d30ea906Sjfb8856606 if (strcmp(tokens[4], "enable") != 0) {
5976d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "enable");
5977d30ea906Sjfb8856606 return;
5978d30ea906Sjfb8856606 }
5979d30ea906Sjfb8856606
5980d30ea906Sjfb8856606 status = thread_pipeline_enable(thread_id, pipeline_name);
5981d30ea906Sjfb8856606 if (status) {
5982d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL, "thread pipeline enable");
5983d30ea906Sjfb8856606 return;
5984d30ea906Sjfb8856606 }
5985d30ea906Sjfb8856606 }
5986d30ea906Sjfb8856606
5987d30ea906Sjfb8856606
5988d30ea906Sjfb8856606 static const char cmd_thread_pipeline_disable_help[] =
5989d30ea906Sjfb8856606 "thread <thread_id> pipeline <pipeline_name> disable\n";
5990d30ea906Sjfb8856606
5991d30ea906Sjfb8856606 static void
cmd_thread_pipeline_disable(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)5992d30ea906Sjfb8856606 cmd_thread_pipeline_disable(char **tokens,
5993d30ea906Sjfb8856606 uint32_t n_tokens,
5994d30ea906Sjfb8856606 char *out,
5995d30ea906Sjfb8856606 size_t out_size)
5996d30ea906Sjfb8856606 {
5997d30ea906Sjfb8856606 char *pipeline_name;
5998d30ea906Sjfb8856606 uint32_t thread_id;
5999d30ea906Sjfb8856606 int status;
6000d30ea906Sjfb8856606
6001d30ea906Sjfb8856606 if (n_tokens != 5) {
6002d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
6003d30ea906Sjfb8856606 return;
6004d30ea906Sjfb8856606 }
6005d30ea906Sjfb8856606
6006d30ea906Sjfb8856606 if (parser_read_uint32(&thread_id, tokens[1]) != 0) {
6007d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
6008d30ea906Sjfb8856606 return;
6009d30ea906Sjfb8856606 }
6010d30ea906Sjfb8856606
6011d30ea906Sjfb8856606 if (strcmp(tokens[2], "pipeline") != 0) {
6012d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipeline");
6013d30ea906Sjfb8856606 return;
6014d30ea906Sjfb8856606 }
6015d30ea906Sjfb8856606
6016d30ea906Sjfb8856606 pipeline_name = tokens[3];
6017d30ea906Sjfb8856606
6018d30ea906Sjfb8856606 if (strcmp(tokens[4], "disable") != 0) {
6019d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "disable");
6020d30ea906Sjfb8856606 return;
6021d30ea906Sjfb8856606 }
6022d30ea906Sjfb8856606
6023d30ea906Sjfb8856606 status = thread_pipeline_disable(thread_id, pipeline_name);
6024d30ea906Sjfb8856606 if (status) {
6025d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_FAIL,
6026d30ea906Sjfb8856606 "thread pipeline disable");
6027d30ea906Sjfb8856606 return;
6028d30ea906Sjfb8856606 }
6029d30ea906Sjfb8856606 }
6030d30ea906Sjfb8856606
6031d30ea906Sjfb8856606 static void
cmd_help(char ** tokens,uint32_t n_tokens,char * out,size_t out_size)6032d30ea906Sjfb8856606 cmd_help(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
6033d30ea906Sjfb8856606 {
6034d30ea906Sjfb8856606 tokens++;
6035d30ea906Sjfb8856606 n_tokens--;
6036d30ea906Sjfb8856606
6037d30ea906Sjfb8856606 if (n_tokens == 0) {
6038d30ea906Sjfb8856606 snprintf(out, out_size,
6039d30ea906Sjfb8856606 "Type 'help <command>' for details on each command.\n\n"
6040d30ea906Sjfb8856606 "List of commands:\n"
6041d30ea906Sjfb8856606 "\tmempool\n"
6042d30ea906Sjfb8856606 "\tlink\n"
6043d30ea906Sjfb8856606 "\tswq\n"
6044d30ea906Sjfb8856606 "\ttmgr subport profile\n"
6045d30ea906Sjfb8856606 "\ttmgr pipe profile\n"
6046d30ea906Sjfb8856606 "\ttmgr\n"
6047d30ea906Sjfb8856606 "\ttmgr subport\n"
6048d30ea906Sjfb8856606 "\ttmgr subport pipe\n"
6049d30ea906Sjfb8856606 "\ttap\n"
6050d30ea906Sjfb8856606 "\tkni\n"
6051d30ea906Sjfb8856606 "\tport in action profile\n"
6052d30ea906Sjfb8856606 "\ttable action profile\n"
6053d30ea906Sjfb8856606 "\tpipeline\n"
6054d30ea906Sjfb8856606 "\tpipeline port in\n"
6055d30ea906Sjfb8856606 "\tpipeline port out\n"
6056d30ea906Sjfb8856606 "\tpipeline table\n"
6057d30ea906Sjfb8856606 "\tpipeline port in table\n"
6058d30ea906Sjfb8856606 "\tpipeline port in stats\n"
6059d30ea906Sjfb8856606 "\tpipeline port in enable\n"
6060d30ea906Sjfb8856606 "\tpipeline port in disable\n"
6061d30ea906Sjfb8856606 "\tpipeline port out stats\n"
6062d30ea906Sjfb8856606 "\tpipeline table stats\n"
6063d30ea906Sjfb8856606 "\tpipeline table rule add\n"
6064d30ea906Sjfb8856606 "\tpipeline table rule add default\n"
6065d30ea906Sjfb8856606 "\tpipeline table rule add bulk\n"
6066d30ea906Sjfb8856606 "\tpipeline table rule delete\n"
6067d30ea906Sjfb8856606 "\tpipeline table rule delete default\n"
6068d30ea906Sjfb8856606 "\tpipeline table rule show\n"
6069d30ea906Sjfb8856606 "\tpipeline table rule stats read\n"
6070d30ea906Sjfb8856606 "\tpipeline table meter profile add\n"
6071d30ea906Sjfb8856606 "\tpipeline table meter profile delete\n"
6072d30ea906Sjfb8856606 "\tpipeline table rule meter read\n"
6073d30ea906Sjfb8856606 "\tpipeline table dscp\n"
6074d30ea906Sjfb8856606 "\tpipeline table rule ttl read\n"
6075d30ea906Sjfb8856606 "\tpipeline table rule time read\n"
6076d30ea906Sjfb8856606 "\tthread pipeline enable\n"
6077d30ea906Sjfb8856606 "\tthread pipeline disable\n\n");
6078d30ea906Sjfb8856606 return;
6079d30ea906Sjfb8856606 }
6080d30ea906Sjfb8856606
6081d30ea906Sjfb8856606 if (strcmp(tokens[0], "mempool") == 0) {
6082d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_mempool_help);
6083d30ea906Sjfb8856606 return;
6084d30ea906Sjfb8856606 }
6085d30ea906Sjfb8856606
6086d30ea906Sjfb8856606 if (strcmp(tokens[0], "link") == 0) {
6087d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_link_help);
6088d30ea906Sjfb8856606 return;
6089d30ea906Sjfb8856606 }
6090d30ea906Sjfb8856606
6091d30ea906Sjfb8856606 if (strcmp(tokens[0], "swq") == 0) {
6092d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_swq_help);
6093d30ea906Sjfb8856606 return;
6094d30ea906Sjfb8856606 }
6095d30ea906Sjfb8856606
6096d30ea906Sjfb8856606 if (strcmp(tokens[0], "tmgr") == 0) {
6097d30ea906Sjfb8856606 if (n_tokens == 1) {
6098d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_tmgr_help);
6099d30ea906Sjfb8856606 return;
6100d30ea906Sjfb8856606 }
6101d30ea906Sjfb8856606
6102d30ea906Sjfb8856606 if ((n_tokens == 2) &&
6103d30ea906Sjfb8856606 (strcmp(tokens[1], "subport")) == 0) {
6104d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_tmgr_subport_help);
6105d30ea906Sjfb8856606 return;
6106d30ea906Sjfb8856606 }
6107d30ea906Sjfb8856606
6108d30ea906Sjfb8856606 if ((n_tokens == 3) &&
6109d30ea906Sjfb8856606 (strcmp(tokens[1], "subport") == 0) &&
6110d30ea906Sjfb8856606 (strcmp(tokens[2], "profile") == 0)) {
6111d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6112d30ea906Sjfb8856606 cmd_tmgr_subport_profile_help);
6113d30ea906Sjfb8856606 return;
6114d30ea906Sjfb8856606 }
6115d30ea906Sjfb8856606
6116d30ea906Sjfb8856606 if ((n_tokens == 3) &&
6117d30ea906Sjfb8856606 (strcmp(tokens[1], "subport") == 0) &&
6118d30ea906Sjfb8856606 (strcmp(tokens[2], "pipe") == 0)) {
6119d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_tmgr_subport_pipe_help);
6120d30ea906Sjfb8856606 return;
6121d30ea906Sjfb8856606 }
6122d30ea906Sjfb8856606
6123d30ea906Sjfb8856606 if ((n_tokens == 3) &&
6124d30ea906Sjfb8856606 (strcmp(tokens[1], "pipe") == 0) &&
6125d30ea906Sjfb8856606 (strcmp(tokens[2], "profile") == 0)) {
6126d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_tmgr_pipe_profile_help);
6127d30ea906Sjfb8856606 return;
6128d30ea906Sjfb8856606 }
6129d30ea906Sjfb8856606 }
6130d30ea906Sjfb8856606
6131d30ea906Sjfb8856606 if (strcmp(tokens[0], "tap") == 0) {
6132d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_tap_help);
6133d30ea906Sjfb8856606 return;
6134d30ea906Sjfb8856606 }
6135d30ea906Sjfb8856606
6136d30ea906Sjfb8856606 if (strcmp(tokens[0], "kni") == 0) {
6137d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_kni_help);
6138d30ea906Sjfb8856606 return;
6139d30ea906Sjfb8856606 }
6140d30ea906Sjfb8856606
6141d30ea906Sjfb8856606 if (strcmp(tokens[0], "cryptodev") == 0) {
6142d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_cryptodev_help);
6143d30ea906Sjfb8856606 return;
6144d30ea906Sjfb8856606 }
6145d30ea906Sjfb8856606
6146d30ea906Sjfb8856606 if ((n_tokens == 4) &&
6147d30ea906Sjfb8856606 (strcmp(tokens[0], "port") == 0) &&
6148d30ea906Sjfb8856606 (strcmp(tokens[1], "in") == 0) &&
6149d30ea906Sjfb8856606 (strcmp(tokens[2], "action") == 0) &&
6150d30ea906Sjfb8856606 (strcmp(tokens[3], "profile") == 0)) {
6151d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_port_in_action_profile_help);
6152d30ea906Sjfb8856606 return;
6153d30ea906Sjfb8856606 }
6154d30ea906Sjfb8856606
6155d30ea906Sjfb8856606 if ((n_tokens == 3) &&
6156d30ea906Sjfb8856606 (strcmp(tokens[0], "table") == 0) &&
6157d30ea906Sjfb8856606 (strcmp(tokens[1], "action") == 0) &&
6158d30ea906Sjfb8856606 (strcmp(tokens[2], "profile") == 0)) {
6159d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_table_action_profile_help);
6160d30ea906Sjfb8856606 return;
6161d30ea906Sjfb8856606 }
6162d30ea906Sjfb8856606
6163d30ea906Sjfb8856606 if ((strcmp(tokens[0], "pipeline") == 0) && (n_tokens == 1)) {
6164d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_pipeline_help);
6165d30ea906Sjfb8856606 return;
6166d30ea906Sjfb8856606 }
6167d30ea906Sjfb8856606
6168d30ea906Sjfb8856606 if ((strcmp(tokens[0], "pipeline") == 0) &&
6169d30ea906Sjfb8856606 (strcmp(tokens[1], "port") == 0)) {
6170d30ea906Sjfb8856606 if ((n_tokens == 3) && (strcmp(tokens[2], "in")) == 0) {
6171d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_pipeline_port_in_help);
6172d30ea906Sjfb8856606 return;
6173d30ea906Sjfb8856606 }
6174d30ea906Sjfb8856606
6175d30ea906Sjfb8856606 if ((n_tokens == 3) && (strcmp(tokens[2], "out")) == 0) {
6176d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_pipeline_port_out_help);
6177d30ea906Sjfb8856606 return;
6178d30ea906Sjfb8856606 }
6179d30ea906Sjfb8856606
6180d30ea906Sjfb8856606 if ((n_tokens == 4) &&
6181d30ea906Sjfb8856606 (strcmp(tokens[2], "in") == 0) &&
6182d30ea906Sjfb8856606 (strcmp(tokens[3], "table") == 0)) {
6183d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6184d30ea906Sjfb8856606 cmd_pipeline_port_in_table_help);
6185d30ea906Sjfb8856606 return;
6186d30ea906Sjfb8856606 }
6187d30ea906Sjfb8856606
6188d30ea906Sjfb8856606 if ((n_tokens == 4) &&
6189d30ea906Sjfb8856606 (strcmp(tokens[2], "in") == 0) &&
6190d30ea906Sjfb8856606 (strcmp(tokens[3], "stats") == 0)) {
6191d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6192d30ea906Sjfb8856606 cmd_pipeline_port_in_stats_help);
6193d30ea906Sjfb8856606 return;
6194d30ea906Sjfb8856606 }
6195d30ea906Sjfb8856606
6196d30ea906Sjfb8856606 if ((n_tokens == 4) &&
6197d30ea906Sjfb8856606 (strcmp(tokens[2], "in") == 0) &&
6198d30ea906Sjfb8856606 (strcmp(tokens[3], "enable") == 0)) {
6199d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6200d30ea906Sjfb8856606 cmd_pipeline_port_in_enable_help);
6201d30ea906Sjfb8856606 return;
6202d30ea906Sjfb8856606 }
6203d30ea906Sjfb8856606
6204d30ea906Sjfb8856606 if ((n_tokens == 4) &&
6205d30ea906Sjfb8856606 (strcmp(tokens[2], "in") == 0) &&
6206d30ea906Sjfb8856606 (strcmp(tokens[3], "disable") == 0)) {
6207d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6208d30ea906Sjfb8856606 cmd_pipeline_port_in_disable_help);
6209d30ea906Sjfb8856606 return;
6210d30ea906Sjfb8856606 }
6211d30ea906Sjfb8856606
6212d30ea906Sjfb8856606 if ((n_tokens == 4) &&
6213d30ea906Sjfb8856606 (strcmp(tokens[2], "out") == 0) &&
6214d30ea906Sjfb8856606 (strcmp(tokens[3], "stats") == 0)) {
6215d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6216d30ea906Sjfb8856606 cmd_pipeline_port_out_stats_help);
6217d30ea906Sjfb8856606 return;
6218d30ea906Sjfb8856606 }
6219d30ea906Sjfb8856606 }
6220d30ea906Sjfb8856606
6221d30ea906Sjfb8856606 if ((strcmp(tokens[0], "pipeline") == 0) &&
6222d30ea906Sjfb8856606 (strcmp(tokens[1], "table") == 0)) {
6223d30ea906Sjfb8856606 if (n_tokens == 2) {
6224d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n", cmd_pipeline_table_help);
6225d30ea906Sjfb8856606 return;
6226d30ea906Sjfb8856606 }
6227d30ea906Sjfb8856606
6228d30ea906Sjfb8856606 if ((n_tokens == 3) && strcmp(tokens[2], "stats") == 0) {
6229d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6230d30ea906Sjfb8856606 cmd_pipeline_table_stats_help);
6231d30ea906Sjfb8856606 return;
6232d30ea906Sjfb8856606 }
6233d30ea906Sjfb8856606
6234d30ea906Sjfb8856606 if ((n_tokens == 3) && strcmp(tokens[2], "dscp") == 0) {
6235d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6236d30ea906Sjfb8856606 cmd_pipeline_table_dscp_help);
6237d30ea906Sjfb8856606 return;
6238d30ea906Sjfb8856606 }
6239d30ea906Sjfb8856606
6240d30ea906Sjfb8856606 if ((n_tokens == 4) &&
6241d30ea906Sjfb8856606 (strcmp(tokens[2], "rule") == 0) &&
6242d30ea906Sjfb8856606 (strcmp(tokens[3], "add") == 0)) {
6243d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6244d30ea906Sjfb8856606 cmd_pipeline_table_rule_add_help);
6245d30ea906Sjfb8856606 return;
6246d30ea906Sjfb8856606 }
6247d30ea906Sjfb8856606
6248d30ea906Sjfb8856606 if ((n_tokens == 5) &&
6249d30ea906Sjfb8856606 (strcmp(tokens[2], "rule") == 0) &&
6250d30ea906Sjfb8856606 (strcmp(tokens[3], "add") == 0) &&
6251d30ea906Sjfb8856606 (strcmp(tokens[4], "default") == 0)) {
6252d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6253d30ea906Sjfb8856606 cmd_pipeline_table_rule_add_default_help);
6254d30ea906Sjfb8856606 return;
6255d30ea906Sjfb8856606 }
6256d30ea906Sjfb8856606
6257d30ea906Sjfb8856606 if ((n_tokens == 5) &&
6258d30ea906Sjfb8856606 (strcmp(tokens[2], "rule") == 0) &&
6259d30ea906Sjfb8856606 (strcmp(tokens[3], "add") == 0) &&
6260d30ea906Sjfb8856606 (strcmp(tokens[4], "bulk") == 0)) {
6261d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6262d30ea906Sjfb8856606 cmd_pipeline_table_rule_add_bulk_help);
6263d30ea906Sjfb8856606 return;
6264d30ea906Sjfb8856606 }
6265d30ea906Sjfb8856606
6266d30ea906Sjfb8856606 if ((n_tokens == 4) &&
6267d30ea906Sjfb8856606 (strcmp(tokens[2], "rule") == 0) &&
6268d30ea906Sjfb8856606 (strcmp(tokens[3], "delete") == 0)) {
6269d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6270d30ea906Sjfb8856606 cmd_pipeline_table_rule_delete_help);
6271d30ea906Sjfb8856606 return;
6272d30ea906Sjfb8856606 }
6273d30ea906Sjfb8856606
6274d30ea906Sjfb8856606 if ((n_tokens == 5) &&
6275d30ea906Sjfb8856606 (strcmp(tokens[2], "rule") == 0) &&
6276d30ea906Sjfb8856606 (strcmp(tokens[3], "delete") == 0) &&
6277d30ea906Sjfb8856606 (strcmp(tokens[4], "default") == 0)) {
6278d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6279d30ea906Sjfb8856606 cmd_pipeline_table_rule_delete_default_help);
6280d30ea906Sjfb8856606 return;
6281d30ea906Sjfb8856606 }
6282d30ea906Sjfb8856606
6283d30ea906Sjfb8856606 if ((n_tokens == 4) &&
6284d30ea906Sjfb8856606 (strcmp(tokens[2], "rule") == 0) &&
6285d30ea906Sjfb8856606 (strcmp(tokens[3], "show") == 0)) {
6286d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6287d30ea906Sjfb8856606 cmd_pipeline_table_rule_show_help);
6288d30ea906Sjfb8856606 return;
6289d30ea906Sjfb8856606 }
6290d30ea906Sjfb8856606
6291d30ea906Sjfb8856606 if ((n_tokens == 5) &&
6292d30ea906Sjfb8856606 (strcmp(tokens[2], "rule") == 0) &&
6293d30ea906Sjfb8856606 (strcmp(tokens[3], "stats") == 0) &&
6294d30ea906Sjfb8856606 (strcmp(tokens[4], "read") == 0)) {
6295d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6296d30ea906Sjfb8856606 cmd_pipeline_table_rule_stats_read_help);
6297d30ea906Sjfb8856606 return;
6298d30ea906Sjfb8856606 }
6299d30ea906Sjfb8856606
6300d30ea906Sjfb8856606 if ((n_tokens == 5) &&
6301d30ea906Sjfb8856606 (strcmp(tokens[2], "meter") == 0) &&
6302d30ea906Sjfb8856606 (strcmp(tokens[3], "profile") == 0) &&
6303d30ea906Sjfb8856606 (strcmp(tokens[4], "add") == 0)) {
6304d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6305d30ea906Sjfb8856606 cmd_pipeline_table_meter_profile_add_help);
6306d30ea906Sjfb8856606 return;
6307d30ea906Sjfb8856606 }
6308d30ea906Sjfb8856606
6309d30ea906Sjfb8856606 if ((n_tokens == 5) &&
6310d30ea906Sjfb8856606 (strcmp(tokens[2], "meter") == 0) &&
6311d30ea906Sjfb8856606 (strcmp(tokens[3], "profile") == 0) &&
6312d30ea906Sjfb8856606 (strcmp(tokens[4], "delete") == 0)) {
6313d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6314d30ea906Sjfb8856606 cmd_pipeline_table_meter_profile_delete_help);
6315d30ea906Sjfb8856606 return;
6316d30ea906Sjfb8856606 }
6317d30ea906Sjfb8856606
6318d30ea906Sjfb8856606 if ((n_tokens == 5) &&
6319d30ea906Sjfb8856606 (strcmp(tokens[2], "rule") == 0) &&
6320d30ea906Sjfb8856606 (strcmp(tokens[3], "meter") == 0) &&
6321d30ea906Sjfb8856606 (strcmp(tokens[4], "read") == 0)) {
6322d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6323d30ea906Sjfb8856606 cmd_pipeline_table_rule_meter_read_help);
6324d30ea906Sjfb8856606 return;
6325d30ea906Sjfb8856606 }
6326d30ea906Sjfb8856606
6327d30ea906Sjfb8856606 if ((n_tokens == 5) &&
6328d30ea906Sjfb8856606 (strcmp(tokens[2], "rule") == 0) &&
6329d30ea906Sjfb8856606 (strcmp(tokens[3], "ttl") == 0) &&
6330d30ea906Sjfb8856606 (strcmp(tokens[4], "read") == 0)) {
6331d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6332d30ea906Sjfb8856606 cmd_pipeline_table_rule_ttl_read_help);
6333d30ea906Sjfb8856606 return;
6334d30ea906Sjfb8856606 }
6335d30ea906Sjfb8856606
6336d30ea906Sjfb8856606 if ((n_tokens == 5) &&
6337d30ea906Sjfb8856606 (strcmp(tokens[2], "rule") == 0) &&
6338d30ea906Sjfb8856606 (strcmp(tokens[3], "time") == 0) &&
6339d30ea906Sjfb8856606 (strcmp(tokens[4], "read") == 0)) {
6340d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6341d30ea906Sjfb8856606 cmd_pipeline_table_rule_time_read_help);
6342d30ea906Sjfb8856606 return;
6343d30ea906Sjfb8856606 }
6344d30ea906Sjfb8856606 }
6345d30ea906Sjfb8856606
6346d30ea906Sjfb8856606 if ((n_tokens == 3) &&
6347d30ea906Sjfb8856606 (strcmp(tokens[0], "thread") == 0) &&
6348d30ea906Sjfb8856606 (strcmp(tokens[1], "pipeline") == 0)) {
6349d30ea906Sjfb8856606 if (strcmp(tokens[2], "enable") == 0) {
6350d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6351d30ea906Sjfb8856606 cmd_thread_pipeline_enable_help);
6352d30ea906Sjfb8856606 return;
6353d30ea906Sjfb8856606 }
6354d30ea906Sjfb8856606
6355d30ea906Sjfb8856606 if (strcmp(tokens[2], "disable") == 0) {
6356d30ea906Sjfb8856606 snprintf(out, out_size, "\n%s\n",
6357d30ea906Sjfb8856606 cmd_thread_pipeline_disable_help);
6358d30ea906Sjfb8856606 return;
6359d30ea906Sjfb8856606 }
6360d30ea906Sjfb8856606 }
6361d30ea906Sjfb8856606
6362d30ea906Sjfb8856606 snprintf(out, out_size, "Invalid command\n");
6363d30ea906Sjfb8856606 }
6364d30ea906Sjfb8856606
6365d30ea906Sjfb8856606 void
cli_process(char * in,char * out,size_t out_size)6366d30ea906Sjfb8856606 cli_process(char *in, char *out, size_t out_size)
6367d30ea906Sjfb8856606 {
6368d30ea906Sjfb8856606 char *tokens[CMD_MAX_TOKENS];
6369d30ea906Sjfb8856606 uint32_t n_tokens = RTE_DIM(tokens);
6370d30ea906Sjfb8856606 int status;
6371d30ea906Sjfb8856606
6372d30ea906Sjfb8856606 if (is_comment(in))
6373d30ea906Sjfb8856606 return;
6374d30ea906Sjfb8856606
6375d30ea906Sjfb8856606 status = parse_tokenize_string(in, tokens, &n_tokens);
6376d30ea906Sjfb8856606 if (status) {
6377d30ea906Sjfb8856606 snprintf(out, out_size, MSG_ARG_TOO_MANY, "");
6378d30ea906Sjfb8856606 return;
6379d30ea906Sjfb8856606 }
6380d30ea906Sjfb8856606
6381d30ea906Sjfb8856606 if (n_tokens == 0)
6382d30ea906Sjfb8856606 return;
6383d30ea906Sjfb8856606
6384d30ea906Sjfb8856606 if (strcmp(tokens[0], "help") == 0) {
6385d30ea906Sjfb8856606 cmd_help(tokens, n_tokens, out, out_size);
6386d30ea906Sjfb8856606 return;
6387d30ea906Sjfb8856606 }
6388d30ea906Sjfb8856606
6389d30ea906Sjfb8856606 if (strcmp(tokens[0], "mempool") == 0) {
6390d30ea906Sjfb8856606 cmd_mempool(tokens, n_tokens, out, out_size);
6391d30ea906Sjfb8856606 return;
6392d30ea906Sjfb8856606 }
6393d30ea906Sjfb8856606
6394d30ea906Sjfb8856606 if (strcmp(tokens[0], "link") == 0) {
6395d30ea906Sjfb8856606 if (strcmp(tokens[1], "show") == 0) {
6396d30ea906Sjfb8856606 cmd_link_show(tokens, n_tokens, out, out_size);
6397d30ea906Sjfb8856606 return;
6398d30ea906Sjfb8856606 }
6399d30ea906Sjfb8856606
6400d30ea906Sjfb8856606 cmd_link(tokens, n_tokens, out, out_size);
6401d30ea906Sjfb8856606 return;
6402d30ea906Sjfb8856606 }
6403d30ea906Sjfb8856606
6404d30ea906Sjfb8856606 if (strcmp(tokens[0], "swq") == 0) {
6405d30ea906Sjfb8856606 cmd_swq(tokens, n_tokens, out, out_size);
6406d30ea906Sjfb8856606 return;
6407d30ea906Sjfb8856606 }
6408d30ea906Sjfb8856606
6409d30ea906Sjfb8856606 if (strcmp(tokens[0], "tmgr") == 0) {
6410d30ea906Sjfb8856606 if ((n_tokens >= 3) &&
6411d30ea906Sjfb8856606 (strcmp(tokens[1], "subport") == 0) &&
6412d30ea906Sjfb8856606 (strcmp(tokens[2], "profile") == 0)) {
6413d30ea906Sjfb8856606 cmd_tmgr_subport_profile(tokens, n_tokens,
6414d30ea906Sjfb8856606 out, out_size);
6415d30ea906Sjfb8856606 return;
6416d30ea906Sjfb8856606 }
6417d30ea906Sjfb8856606
6418d30ea906Sjfb8856606 if ((n_tokens >= 3) &&
6419d30ea906Sjfb8856606 (strcmp(tokens[1], "pipe") == 0) &&
6420d30ea906Sjfb8856606 (strcmp(tokens[2], "profile") == 0)) {
6421d30ea906Sjfb8856606 cmd_tmgr_pipe_profile(tokens, n_tokens, out, out_size);
6422d30ea906Sjfb8856606 return;
6423d30ea906Sjfb8856606 }
6424d30ea906Sjfb8856606
6425d30ea906Sjfb8856606 if ((n_tokens >= 5) &&
6426d30ea906Sjfb8856606 (strcmp(tokens[2], "subport") == 0) &&
6427d30ea906Sjfb8856606 (strcmp(tokens[4], "profile") == 0)) {
6428d30ea906Sjfb8856606 cmd_tmgr_subport(tokens, n_tokens, out, out_size);
6429d30ea906Sjfb8856606 return;
6430d30ea906Sjfb8856606 }
6431d30ea906Sjfb8856606
6432d30ea906Sjfb8856606 if ((n_tokens >= 5) &&
6433d30ea906Sjfb8856606 (strcmp(tokens[2], "subport") == 0) &&
6434d30ea906Sjfb8856606 (strcmp(tokens[4], "pipe") == 0)) {
6435d30ea906Sjfb8856606 cmd_tmgr_subport_pipe(tokens, n_tokens, out, out_size);
6436d30ea906Sjfb8856606 return;
6437d30ea906Sjfb8856606 }
6438d30ea906Sjfb8856606
6439d30ea906Sjfb8856606 cmd_tmgr(tokens, n_tokens, out, out_size);
6440d30ea906Sjfb8856606 return;
6441d30ea906Sjfb8856606 }
6442d30ea906Sjfb8856606
6443d30ea906Sjfb8856606 if (strcmp(tokens[0], "tap") == 0) {
6444d30ea906Sjfb8856606 cmd_tap(tokens, n_tokens, out, out_size);
6445d30ea906Sjfb8856606 return;
6446d30ea906Sjfb8856606 }
6447d30ea906Sjfb8856606
6448d30ea906Sjfb8856606 if (strcmp(tokens[0], "kni") == 0) {
6449d30ea906Sjfb8856606 cmd_kni(tokens, n_tokens, out, out_size);
6450d30ea906Sjfb8856606 return;
6451d30ea906Sjfb8856606 }
6452d30ea906Sjfb8856606
6453d30ea906Sjfb8856606 if (strcmp(tokens[0], "cryptodev") == 0) {
6454d30ea906Sjfb8856606 cmd_cryptodev(tokens, n_tokens, out, out_size);
6455d30ea906Sjfb8856606 return;
6456d30ea906Sjfb8856606 }
6457d30ea906Sjfb8856606
6458d30ea906Sjfb8856606 if (strcmp(tokens[0], "port") == 0) {
6459d30ea906Sjfb8856606 cmd_port_in_action_profile(tokens, n_tokens, out, out_size);
6460d30ea906Sjfb8856606 return;
6461d30ea906Sjfb8856606 }
6462d30ea906Sjfb8856606
6463d30ea906Sjfb8856606 if (strcmp(tokens[0], "table") == 0) {
6464d30ea906Sjfb8856606 cmd_table_action_profile(tokens, n_tokens, out, out_size);
6465d30ea906Sjfb8856606 return;
6466d30ea906Sjfb8856606 }
6467d30ea906Sjfb8856606
6468d30ea906Sjfb8856606 if (strcmp(tokens[0], "pipeline") == 0) {
6469d30ea906Sjfb8856606 if ((n_tokens >= 3) &&
6470d30ea906Sjfb8856606 (strcmp(tokens[2], "period") == 0)) {
6471d30ea906Sjfb8856606 cmd_pipeline(tokens, n_tokens, out, out_size);
6472d30ea906Sjfb8856606 return;
6473d30ea906Sjfb8856606 }
6474d30ea906Sjfb8856606
6475d30ea906Sjfb8856606 if ((n_tokens >= 5) &&
6476d30ea906Sjfb8856606 (strcmp(tokens[2], "port") == 0) &&
6477d30ea906Sjfb8856606 (strcmp(tokens[3], "in") == 0) &&
6478d30ea906Sjfb8856606 (strcmp(tokens[4], "bsz") == 0)) {
6479d30ea906Sjfb8856606 cmd_pipeline_port_in(tokens, n_tokens, out, out_size);
6480d30ea906Sjfb8856606 return;
6481d30ea906Sjfb8856606 }
6482d30ea906Sjfb8856606
6483d30ea906Sjfb8856606 if ((n_tokens >= 5) &&
6484d30ea906Sjfb8856606 (strcmp(tokens[2], "port") == 0) &&
6485d30ea906Sjfb8856606 (strcmp(tokens[3], "out") == 0) &&
6486d30ea906Sjfb8856606 (strcmp(tokens[4], "bsz") == 0)) {
6487d30ea906Sjfb8856606 cmd_pipeline_port_out(tokens, n_tokens, out, out_size);
6488d30ea906Sjfb8856606 return;
6489d30ea906Sjfb8856606 }
6490d30ea906Sjfb8856606
6491d30ea906Sjfb8856606 if ((n_tokens >= 4) &&
6492d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6493d30ea906Sjfb8856606 (strcmp(tokens[3], "match") == 0)) {
6494d30ea906Sjfb8856606 cmd_pipeline_table(tokens, n_tokens, out, out_size);
6495d30ea906Sjfb8856606 return;
6496d30ea906Sjfb8856606 }
6497d30ea906Sjfb8856606
6498d30ea906Sjfb8856606 if ((n_tokens >= 6) &&
6499d30ea906Sjfb8856606 (strcmp(tokens[2], "port") == 0) &&
6500d30ea906Sjfb8856606 (strcmp(tokens[3], "in") == 0) &&
6501d30ea906Sjfb8856606 (strcmp(tokens[5], "table") == 0)) {
6502d30ea906Sjfb8856606 cmd_pipeline_port_in_table(tokens, n_tokens,
6503d30ea906Sjfb8856606 out, out_size);
6504d30ea906Sjfb8856606 return;
6505d30ea906Sjfb8856606 }
6506d30ea906Sjfb8856606
6507d30ea906Sjfb8856606 if ((n_tokens >= 6) &&
6508d30ea906Sjfb8856606 (strcmp(tokens[2], "port") == 0) &&
6509d30ea906Sjfb8856606 (strcmp(tokens[3], "in") == 0) &&
6510d30ea906Sjfb8856606 (strcmp(tokens[5], "stats") == 0)) {
6511d30ea906Sjfb8856606 cmd_pipeline_port_in_stats(tokens, n_tokens,
6512d30ea906Sjfb8856606 out, out_size);
6513d30ea906Sjfb8856606 return;
6514d30ea906Sjfb8856606 }
6515d30ea906Sjfb8856606
6516d30ea906Sjfb8856606 if ((n_tokens >= 6) &&
6517d30ea906Sjfb8856606 (strcmp(tokens[2], "port") == 0) &&
6518d30ea906Sjfb8856606 (strcmp(tokens[3], "in") == 0) &&
6519d30ea906Sjfb8856606 (strcmp(tokens[5], "enable") == 0)) {
6520d30ea906Sjfb8856606 cmd_pipeline_port_in_enable(tokens, n_tokens,
6521d30ea906Sjfb8856606 out, out_size);
6522d30ea906Sjfb8856606 return;
6523d30ea906Sjfb8856606 }
6524d30ea906Sjfb8856606
6525d30ea906Sjfb8856606 if ((n_tokens >= 6) &&
6526d30ea906Sjfb8856606 (strcmp(tokens[2], "port") == 0) &&
6527d30ea906Sjfb8856606 (strcmp(tokens[3], "in") == 0) &&
6528d30ea906Sjfb8856606 (strcmp(tokens[5], "disable") == 0)) {
6529d30ea906Sjfb8856606 cmd_pipeline_port_in_disable(tokens, n_tokens,
6530d30ea906Sjfb8856606 out, out_size);
6531d30ea906Sjfb8856606 return;
6532d30ea906Sjfb8856606 }
6533d30ea906Sjfb8856606
6534d30ea906Sjfb8856606 if ((n_tokens >= 6) &&
6535d30ea906Sjfb8856606 (strcmp(tokens[2], "port") == 0) &&
6536d30ea906Sjfb8856606 (strcmp(tokens[3], "out") == 0) &&
6537d30ea906Sjfb8856606 (strcmp(tokens[5], "stats") == 0)) {
6538d30ea906Sjfb8856606 cmd_pipeline_port_out_stats(tokens, n_tokens,
6539d30ea906Sjfb8856606 out, out_size);
6540d30ea906Sjfb8856606 return;
6541d30ea906Sjfb8856606 }
6542d30ea906Sjfb8856606
6543d30ea906Sjfb8856606 if ((n_tokens >= 5) &&
6544d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6545d30ea906Sjfb8856606 (strcmp(tokens[4], "stats") == 0)) {
6546d30ea906Sjfb8856606 cmd_pipeline_table_stats(tokens, n_tokens,
6547d30ea906Sjfb8856606 out, out_size);
6548d30ea906Sjfb8856606 return;
6549d30ea906Sjfb8856606 }
6550d30ea906Sjfb8856606
6551d30ea906Sjfb8856606 if ((n_tokens >= 7) &&
6552d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6553d30ea906Sjfb8856606 (strcmp(tokens[4], "rule") == 0) &&
6554d30ea906Sjfb8856606 (strcmp(tokens[5], "add") == 0) &&
6555d30ea906Sjfb8856606 (strcmp(tokens[6], "match") == 0)) {
6556d30ea906Sjfb8856606 if ((n_tokens >= 8) &&
6557d30ea906Sjfb8856606 (strcmp(tokens[7], "default") == 0)) {
6558d30ea906Sjfb8856606 cmd_pipeline_table_rule_add_default(tokens,
6559d30ea906Sjfb8856606 n_tokens, out, out_size);
6560d30ea906Sjfb8856606 return;
6561d30ea906Sjfb8856606 }
6562d30ea906Sjfb8856606
6563d30ea906Sjfb8856606 cmd_pipeline_table_rule_add(tokens, n_tokens,
6564d30ea906Sjfb8856606 out, out_size);
6565d30ea906Sjfb8856606 return;
6566d30ea906Sjfb8856606 }
6567d30ea906Sjfb8856606
6568d30ea906Sjfb8856606 if ((n_tokens >= 7) &&
6569d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6570d30ea906Sjfb8856606 (strcmp(tokens[4], "rule") == 0) &&
6571d30ea906Sjfb8856606 (strcmp(tokens[5], "add") == 0) &&
6572d30ea906Sjfb8856606 (strcmp(tokens[6], "bulk") == 0)) {
6573d30ea906Sjfb8856606 cmd_pipeline_table_rule_add_bulk(tokens,
6574d30ea906Sjfb8856606 n_tokens, out, out_size);
6575d30ea906Sjfb8856606 return;
6576d30ea906Sjfb8856606 }
6577d30ea906Sjfb8856606
6578d30ea906Sjfb8856606 if ((n_tokens >= 7) &&
6579d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6580d30ea906Sjfb8856606 (strcmp(tokens[4], "rule") == 0) &&
6581d30ea906Sjfb8856606 (strcmp(tokens[5], "delete") == 0) &&
6582d30ea906Sjfb8856606 (strcmp(tokens[6], "match") == 0)) {
6583d30ea906Sjfb8856606 if ((n_tokens >= 8) &&
6584d30ea906Sjfb8856606 (strcmp(tokens[7], "default") == 0)) {
6585d30ea906Sjfb8856606 cmd_pipeline_table_rule_delete_default(tokens,
6586d30ea906Sjfb8856606 n_tokens, out, out_size);
6587d30ea906Sjfb8856606 return;
6588d30ea906Sjfb8856606 }
6589d30ea906Sjfb8856606
6590d30ea906Sjfb8856606 cmd_pipeline_table_rule_delete(tokens, n_tokens,
6591d30ea906Sjfb8856606 out, out_size);
6592d30ea906Sjfb8856606 return;
6593d30ea906Sjfb8856606 }
6594d30ea906Sjfb8856606
6595d30ea906Sjfb8856606 if ((n_tokens >= 6) &&
6596d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6597d30ea906Sjfb8856606 (strcmp(tokens[4], "rule") == 0) &&
6598d30ea906Sjfb8856606 (strcmp(tokens[5], "show") == 0)) {
6599d30ea906Sjfb8856606 cmd_pipeline_table_rule_show(tokens, n_tokens,
6600d30ea906Sjfb8856606 out, out_size);
6601d30ea906Sjfb8856606 return;
6602d30ea906Sjfb8856606 }
6603d30ea906Sjfb8856606
6604d30ea906Sjfb8856606 if ((n_tokens >= 7) &&
6605d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6606d30ea906Sjfb8856606 (strcmp(tokens[4], "rule") == 0) &&
6607d30ea906Sjfb8856606 (strcmp(tokens[5], "read") == 0) &&
6608d30ea906Sjfb8856606 (strcmp(tokens[6], "stats") == 0)) {
6609d30ea906Sjfb8856606 cmd_pipeline_table_rule_stats_read(tokens, n_tokens,
6610d30ea906Sjfb8856606 out, out_size);
6611d30ea906Sjfb8856606 return;
6612d30ea906Sjfb8856606 }
6613d30ea906Sjfb8856606
6614d30ea906Sjfb8856606 if ((n_tokens >= 8) &&
6615d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6616d30ea906Sjfb8856606 (strcmp(tokens[4], "meter") == 0) &&
6617d30ea906Sjfb8856606 (strcmp(tokens[5], "profile") == 0) &&
6618d30ea906Sjfb8856606 (strcmp(tokens[7], "add") == 0)) {
6619d30ea906Sjfb8856606 cmd_pipeline_table_meter_profile_add(tokens, n_tokens,
6620d30ea906Sjfb8856606 out, out_size);
6621d30ea906Sjfb8856606 return;
6622d30ea906Sjfb8856606 }
6623d30ea906Sjfb8856606
6624d30ea906Sjfb8856606 if ((n_tokens >= 8) &&
6625d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6626d30ea906Sjfb8856606 (strcmp(tokens[4], "meter") == 0) &&
6627d30ea906Sjfb8856606 (strcmp(tokens[5], "profile") == 0) &&
6628d30ea906Sjfb8856606 (strcmp(tokens[7], "delete") == 0)) {
6629d30ea906Sjfb8856606 cmd_pipeline_table_meter_profile_delete(tokens,
6630d30ea906Sjfb8856606 n_tokens, out, out_size);
6631d30ea906Sjfb8856606 return;
6632d30ea906Sjfb8856606 }
6633d30ea906Sjfb8856606
6634d30ea906Sjfb8856606 if ((n_tokens >= 7) &&
6635d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6636d30ea906Sjfb8856606 (strcmp(tokens[4], "rule") == 0) &&
6637d30ea906Sjfb8856606 (strcmp(tokens[5], "read") == 0) &&
6638d30ea906Sjfb8856606 (strcmp(tokens[6], "meter") == 0)) {
6639d30ea906Sjfb8856606 cmd_pipeline_table_rule_meter_read(tokens, n_tokens,
6640d30ea906Sjfb8856606 out, out_size);
6641d30ea906Sjfb8856606 return;
6642d30ea906Sjfb8856606 }
6643d30ea906Sjfb8856606
6644d30ea906Sjfb8856606 if ((n_tokens >= 5) &&
6645d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6646d30ea906Sjfb8856606 (strcmp(tokens[4], "dscp") == 0)) {
6647d30ea906Sjfb8856606 cmd_pipeline_table_dscp(tokens, n_tokens,
6648d30ea906Sjfb8856606 out, out_size);
6649d30ea906Sjfb8856606 return;
6650d30ea906Sjfb8856606 }
6651d30ea906Sjfb8856606
6652d30ea906Sjfb8856606 if ((n_tokens >= 7) &&
6653d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6654d30ea906Sjfb8856606 (strcmp(tokens[4], "rule") == 0) &&
6655d30ea906Sjfb8856606 (strcmp(tokens[5], "read") == 0) &&
6656d30ea906Sjfb8856606 (strcmp(tokens[6], "ttl") == 0)) {
6657d30ea906Sjfb8856606 cmd_pipeline_table_rule_ttl_read(tokens, n_tokens,
6658d30ea906Sjfb8856606 out, out_size);
6659d30ea906Sjfb8856606 return;
6660d30ea906Sjfb8856606 }
6661d30ea906Sjfb8856606
6662d30ea906Sjfb8856606 if ((n_tokens >= 7) &&
6663d30ea906Sjfb8856606 (strcmp(tokens[2], "table") == 0) &&
6664d30ea906Sjfb8856606 (strcmp(tokens[4], "rule") == 0) &&
6665d30ea906Sjfb8856606 (strcmp(tokens[5], "read") == 0) &&
6666d30ea906Sjfb8856606 (strcmp(tokens[6], "time") == 0)) {
6667d30ea906Sjfb8856606 cmd_pipeline_table_rule_time_read(tokens, n_tokens,
6668d30ea906Sjfb8856606 out, out_size);
6669d30ea906Sjfb8856606 return;
6670d30ea906Sjfb8856606 }
6671d30ea906Sjfb8856606 }
6672d30ea906Sjfb8856606
6673d30ea906Sjfb8856606 if (strcmp(tokens[0], "thread") == 0) {
6674d30ea906Sjfb8856606 if ((n_tokens >= 5) &&
6675d30ea906Sjfb8856606 (strcmp(tokens[4], "enable") == 0)) {
6676d30ea906Sjfb8856606 cmd_thread_pipeline_enable(tokens, n_tokens,
6677d30ea906Sjfb8856606 out, out_size);
6678d30ea906Sjfb8856606 return;
6679d30ea906Sjfb8856606 }
6680d30ea906Sjfb8856606
6681d30ea906Sjfb8856606 if ((n_tokens >= 5) &&
6682d30ea906Sjfb8856606 (strcmp(tokens[4], "disable") == 0)) {
6683d30ea906Sjfb8856606 cmd_thread_pipeline_disable(tokens, n_tokens,
6684d30ea906Sjfb8856606 out, out_size);
6685d30ea906Sjfb8856606 return;
6686d30ea906Sjfb8856606 }
6687d30ea906Sjfb8856606 }
6688d30ea906Sjfb8856606
6689d30ea906Sjfb8856606 snprintf(out, out_size, MSG_CMD_UNKNOWN, tokens[0]);
6690d30ea906Sjfb8856606 }
6691d30ea906Sjfb8856606
6692d30ea906Sjfb8856606 int
cli_script_process(const char * file_name,size_t msg_in_len_max,size_t msg_out_len_max)6693d30ea906Sjfb8856606 cli_script_process(const char *file_name,
6694d30ea906Sjfb8856606 size_t msg_in_len_max,
6695d30ea906Sjfb8856606 size_t msg_out_len_max)
6696d30ea906Sjfb8856606 {
6697d30ea906Sjfb8856606 char *msg_in = NULL, *msg_out = NULL;
6698d30ea906Sjfb8856606 FILE *f = NULL;
6699d30ea906Sjfb8856606
6700d30ea906Sjfb8856606 /* Check input arguments */
6701d30ea906Sjfb8856606 if ((file_name == NULL) ||
6702d30ea906Sjfb8856606 (strlen(file_name) == 0) ||
6703d30ea906Sjfb8856606 (msg_in_len_max == 0) ||
6704d30ea906Sjfb8856606 (msg_out_len_max == 0))
6705d30ea906Sjfb8856606 return -EINVAL;
6706d30ea906Sjfb8856606
6707d30ea906Sjfb8856606 msg_in = malloc(msg_in_len_max + 1);
6708d30ea906Sjfb8856606 msg_out = malloc(msg_out_len_max + 1);
6709d30ea906Sjfb8856606 if ((msg_in == NULL) ||
6710d30ea906Sjfb8856606 (msg_out == NULL)) {
6711d30ea906Sjfb8856606 free(msg_out);
6712d30ea906Sjfb8856606 free(msg_in);
6713d30ea906Sjfb8856606 return -ENOMEM;
6714d30ea906Sjfb8856606 }
6715d30ea906Sjfb8856606
6716d30ea906Sjfb8856606 /* Open input file */
6717d30ea906Sjfb8856606 f = fopen(file_name, "r");
6718d30ea906Sjfb8856606 if (f == NULL) {
6719d30ea906Sjfb8856606 free(msg_out);
6720d30ea906Sjfb8856606 free(msg_in);
6721d30ea906Sjfb8856606 return -EIO;
6722d30ea906Sjfb8856606 }
6723d30ea906Sjfb8856606
6724d30ea906Sjfb8856606 /* Read file */
6725d30ea906Sjfb8856606 for ( ; ; ) {
6726d30ea906Sjfb8856606 if (fgets(msg_in, msg_in_len_max + 1, f) == NULL)
6727d30ea906Sjfb8856606 break;
6728d30ea906Sjfb8856606
6729d30ea906Sjfb8856606 printf("%s", msg_in);
6730d30ea906Sjfb8856606 msg_out[0] = 0;
6731d30ea906Sjfb8856606
6732d30ea906Sjfb8856606 cli_process(msg_in,
6733d30ea906Sjfb8856606 msg_out,
6734d30ea906Sjfb8856606 msg_out_len_max);
6735d30ea906Sjfb8856606
6736d30ea906Sjfb8856606 if (strlen(msg_out))
6737d30ea906Sjfb8856606 printf("%s", msg_out);
6738d30ea906Sjfb8856606 }
6739d30ea906Sjfb8856606
6740d30ea906Sjfb8856606 /* Close file */
6741d30ea906Sjfb8856606 fclose(f);
6742d30ea906Sjfb8856606 free(msg_out);
6743d30ea906Sjfb8856606 free(msg_in);
6744d30ea906Sjfb8856606 return 0;
6745d30ea906Sjfb8856606 }
6746d30ea906Sjfb8856606
6747d30ea906Sjfb8856606 static int
cli_rule_file_process(const char * file_name,size_t line_len_max,struct table_rule_list ** rule_list,uint32_t * n_rules,uint32_t * line_number,char * out,size_t out_size)6748d30ea906Sjfb8856606 cli_rule_file_process(const char *file_name,
6749d30ea906Sjfb8856606 size_t line_len_max,
6750d30ea906Sjfb8856606 struct table_rule_list **rule_list,
6751d30ea906Sjfb8856606 uint32_t *n_rules,
6752d30ea906Sjfb8856606 uint32_t *line_number,
6753d30ea906Sjfb8856606 char *out,
6754d30ea906Sjfb8856606 size_t out_size)
6755d30ea906Sjfb8856606 {
6756d30ea906Sjfb8856606 struct table_rule_list *list = NULL;
6757d30ea906Sjfb8856606 char *line = NULL;
6758d30ea906Sjfb8856606 FILE *f = NULL;
6759d30ea906Sjfb8856606 uint32_t rule_id = 0, line_id = 0;
6760d30ea906Sjfb8856606 int status = 0;
6761d30ea906Sjfb8856606
6762d30ea906Sjfb8856606 /* Check input arguments */
6763d30ea906Sjfb8856606 if ((file_name == NULL) ||
6764d30ea906Sjfb8856606 (strlen(file_name) == 0) ||
6765d30ea906Sjfb8856606 (line_len_max == 0) ||
6766d30ea906Sjfb8856606 (rule_list == NULL) ||
6767d30ea906Sjfb8856606 (n_rules == NULL) ||
6768d30ea906Sjfb8856606 (line_number == NULL) ||
6769d30ea906Sjfb8856606 (out == NULL)) {
6770d30ea906Sjfb8856606 status = -EINVAL;
6771d30ea906Sjfb8856606 goto cli_rule_file_process_free;
6772d30ea906Sjfb8856606 }
6773d30ea906Sjfb8856606
6774d30ea906Sjfb8856606 /* Memory allocation */
6775d30ea906Sjfb8856606 list = malloc(sizeof(struct table_rule_list));
6776d30ea906Sjfb8856606 if (list == NULL) {
6777d30ea906Sjfb8856606 status = -ENOMEM;
6778d30ea906Sjfb8856606 goto cli_rule_file_process_free;
6779d30ea906Sjfb8856606 }
6780d30ea906Sjfb8856606
6781d30ea906Sjfb8856606 TAILQ_INIT(list);
6782d30ea906Sjfb8856606
6783d30ea906Sjfb8856606 line = malloc(line_len_max + 1);
6784d30ea906Sjfb8856606 if (line == NULL) {
6785d30ea906Sjfb8856606 status = -ENOMEM;
6786d30ea906Sjfb8856606 goto cli_rule_file_process_free;
6787d30ea906Sjfb8856606 }
6788d30ea906Sjfb8856606
6789d30ea906Sjfb8856606 /* Open file */
6790d30ea906Sjfb8856606 f = fopen(file_name, "r");
6791d30ea906Sjfb8856606 if (f == NULL) {
6792d30ea906Sjfb8856606 status = -EIO;
6793d30ea906Sjfb8856606 goto cli_rule_file_process_free;
6794d30ea906Sjfb8856606 }
6795d30ea906Sjfb8856606
6796d30ea906Sjfb8856606 /* Read file */
6797d30ea906Sjfb8856606 for (line_id = 1, rule_id = 0; ; line_id++) {
6798d30ea906Sjfb8856606 char *tokens[CMD_MAX_TOKENS];
6799d30ea906Sjfb8856606 struct table_rule *rule = NULL;
6800d30ea906Sjfb8856606 uint32_t n_tokens, n_tokens_parsed, t0;
6801d30ea906Sjfb8856606
6802d30ea906Sjfb8856606 /* Read next line from file. */
6803d30ea906Sjfb8856606 if (fgets(line, line_len_max + 1, f) == NULL)
6804d30ea906Sjfb8856606 break;
6805d30ea906Sjfb8856606
6806d30ea906Sjfb8856606 /* Comment. */
6807d30ea906Sjfb8856606 if (is_comment(line))
6808d30ea906Sjfb8856606 continue;
6809d30ea906Sjfb8856606
6810d30ea906Sjfb8856606 /* Parse line. */
6811d30ea906Sjfb8856606 n_tokens = RTE_DIM(tokens);
6812d30ea906Sjfb8856606 status = parse_tokenize_string(line, tokens, &n_tokens);
6813d30ea906Sjfb8856606 if (status) {
6814d30ea906Sjfb8856606 status = -EINVAL;
6815d30ea906Sjfb8856606 goto cli_rule_file_process_free;
6816d30ea906Sjfb8856606 }
6817d30ea906Sjfb8856606
6818d30ea906Sjfb8856606 /* Empty line. */
6819d30ea906Sjfb8856606 if (n_tokens == 0)
6820d30ea906Sjfb8856606 continue;
6821d30ea906Sjfb8856606 t0 = 0;
6822d30ea906Sjfb8856606
6823d30ea906Sjfb8856606 /* Rule alloc and insert. */
6824d30ea906Sjfb8856606 rule = calloc(1, sizeof(struct table_rule));
6825d30ea906Sjfb8856606 if (rule == NULL) {
6826d30ea906Sjfb8856606 status = -ENOMEM;
6827d30ea906Sjfb8856606 goto cli_rule_file_process_free;
6828d30ea906Sjfb8856606 }
6829d30ea906Sjfb8856606
6830d30ea906Sjfb8856606 TAILQ_INSERT_TAIL(list, rule, node);
6831d30ea906Sjfb8856606
6832d30ea906Sjfb8856606 /* Rule match. */
6833d30ea906Sjfb8856606 n_tokens_parsed = parse_match(tokens + t0,
6834d30ea906Sjfb8856606 n_tokens - t0,
6835d30ea906Sjfb8856606 out,
6836d30ea906Sjfb8856606 out_size,
6837d30ea906Sjfb8856606 &rule->match);
6838d30ea906Sjfb8856606 if (n_tokens_parsed == 0) {
6839d30ea906Sjfb8856606 status = -EINVAL;
6840d30ea906Sjfb8856606 goto cli_rule_file_process_free;
6841d30ea906Sjfb8856606 }
6842d30ea906Sjfb8856606 t0 += n_tokens_parsed;
6843d30ea906Sjfb8856606
6844d30ea906Sjfb8856606 /* Rule action. */
6845d30ea906Sjfb8856606 n_tokens_parsed = parse_table_action(tokens + t0,
6846d30ea906Sjfb8856606 n_tokens - t0,
6847d30ea906Sjfb8856606 out,
6848d30ea906Sjfb8856606 out_size,
6849d30ea906Sjfb8856606 &rule->action);
6850d30ea906Sjfb8856606 if (n_tokens_parsed == 0) {
6851d30ea906Sjfb8856606 status = -EINVAL;
6852d30ea906Sjfb8856606 goto cli_rule_file_process_free;
6853d30ea906Sjfb8856606 }
6854d30ea906Sjfb8856606 t0 += n_tokens_parsed;
6855d30ea906Sjfb8856606
6856d30ea906Sjfb8856606 /* Line completed. */
6857d30ea906Sjfb8856606 if (t0 < n_tokens) {
6858d30ea906Sjfb8856606 status = -EINVAL;
6859d30ea906Sjfb8856606 goto cli_rule_file_process_free;
6860d30ea906Sjfb8856606 }
6861d30ea906Sjfb8856606
6862d30ea906Sjfb8856606 /* Increment rule count */
6863d30ea906Sjfb8856606 rule_id++;
6864d30ea906Sjfb8856606 }
6865d30ea906Sjfb8856606
6866d30ea906Sjfb8856606 /* Close file */
6867d30ea906Sjfb8856606 fclose(f);
6868d30ea906Sjfb8856606
6869d30ea906Sjfb8856606 /* Memory free */
6870d30ea906Sjfb8856606 free(line);
6871d30ea906Sjfb8856606
6872d30ea906Sjfb8856606 *rule_list = list;
6873d30ea906Sjfb8856606 *n_rules = rule_id;
6874d30ea906Sjfb8856606 *line_number = line_id;
6875d30ea906Sjfb8856606 return 0;
6876d30ea906Sjfb8856606
6877d30ea906Sjfb8856606 cli_rule_file_process_free:
6878d30ea906Sjfb8856606 if (rule_list != NULL)
6879d30ea906Sjfb8856606 *rule_list = NULL;
6880d30ea906Sjfb8856606
6881d30ea906Sjfb8856606 if (n_rules != NULL)
6882d30ea906Sjfb8856606 *n_rules = rule_id;
6883d30ea906Sjfb8856606
6884d30ea906Sjfb8856606 if (line_number != NULL)
6885d30ea906Sjfb8856606 *line_number = line_id;
6886d30ea906Sjfb8856606
6887d30ea906Sjfb8856606 if (list != NULL)
6888d30ea906Sjfb8856606 for ( ; ; ) {
6889d30ea906Sjfb8856606 struct table_rule *rule;
6890d30ea906Sjfb8856606
6891d30ea906Sjfb8856606 rule = TAILQ_FIRST(list);
6892d30ea906Sjfb8856606 if (rule == NULL)
6893d30ea906Sjfb8856606 break;
6894d30ea906Sjfb8856606
6895d30ea906Sjfb8856606 TAILQ_REMOVE(list, rule, node);
6896d30ea906Sjfb8856606 free(rule);
6897d30ea906Sjfb8856606 }
6898d30ea906Sjfb8856606
6899d30ea906Sjfb8856606 if (f)
6900d30ea906Sjfb8856606 fclose(f);
6901d30ea906Sjfb8856606 free(line);
6902d30ea906Sjfb8856606 free(list);
6903d30ea906Sjfb8856606
6904d30ea906Sjfb8856606 return status;
6905d30ea906Sjfb8856606 }
6906