xref: /f-stack/dpdk/examples/ip_pipeline/cli.c (revision 2d9fd380)
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, &eth_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(&params, 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(&params.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(&params.n_queues, tokens[5]) < 0) {
837d30ea906Sjfb8856606 		snprintf(out, out_size,	MSG_ARG_INVALID,
838d30ea906Sjfb8856606 			"q");
839d30ea906Sjfb8856606 		return;
840d30ea906Sjfb8856606 	}
841d30ea906Sjfb8856606 
842d30ea906Sjfb8856606 	if (parser_read_uint32(&params.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(&params.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, &params) == 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 		&timestamp);
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