xref: /dpdk/examples/ip_pipeline/cli.c (revision d5ed626f61b2577c63e5fb67526b531150d5105c)
14bbf8e30SJasvinder Singh /* SPDX-License-Identifier: BSD-3-Clause
24bbf8e30SJasvinder Singh  * Copyright(c) 2010-2018 Intel Corporation
34bbf8e30SJasvinder Singh  */
44bbf8e30SJasvinder Singh 
54bbf8e30SJasvinder Singh #include <stdio.h>
64bbf8e30SJasvinder Singh #include <stdint.h>
74bbf8e30SJasvinder Singh #include <stdlib.h>
84bbf8e30SJasvinder Singh #include <string.h>
94bbf8e30SJasvinder Singh 
104bbf8e30SJasvinder Singh #include <rte_common.h>
11a3a95b7dSJasvinder Singh #include <rte_cycles.h>
12ecfc2b1cSKevin Laatz #include <rte_ethdev.h>
134bbf8e30SJasvinder Singh 
144bbf8e30SJasvinder Singh #include "cli.h"
151edccebcSFan Zhang 
161edccebcSFan Zhang #include "cryptodev.h"
179a408cc8SJasvinder Singh #include "kni.h"
18133c2c65SJasvinder Singh #include "link.h"
196bfe74f8SJasvinder Singh #include "mempool.h"
206bfe74f8SJasvinder Singh #include "parser.h"
21d75c371eSJasvinder Singh #include "pipeline.h"
228245472cSJasvinder Singh #include "swq.h"
232f74ae28SJasvinder Singh #include "tap.h"
2432e5d9b1SJasvinder Singh #include "thread.h"
2525961ff3SJasvinder Singh #include "tmgr.h"
266bfe74f8SJasvinder Singh 
276bfe74f8SJasvinder Singh #ifndef CMD_MAX_TOKENS
286bfe74f8SJasvinder Singh #define CMD_MAX_TOKENS     256
296bfe74f8SJasvinder Singh #endif
306bfe74f8SJasvinder Singh 
316bfe74f8SJasvinder Singh #define MSG_OUT_OF_MEMORY   "Not enough memory.\n"
326bfe74f8SJasvinder Singh #define MSG_CMD_UNKNOWN     "Unknown command \"%s\".\n"
336bfe74f8SJasvinder Singh #define MSG_CMD_UNIMPLEM    "Command \"%s\" not implemented.\n"
346bfe74f8SJasvinder Singh #define MSG_ARG_NOT_ENOUGH  "Not enough arguments for command \"%s\".\n"
356bfe74f8SJasvinder Singh #define MSG_ARG_TOO_MANY    "Too many arguments for command \"%s\".\n"
366bfe74f8SJasvinder Singh #define MSG_ARG_MISMATCH    "Wrong number of arguments for command \"%s\".\n"
376bfe74f8SJasvinder Singh #define MSG_ARG_NOT_FOUND   "Argument \"%s\" not found.\n"
386bfe74f8SJasvinder Singh #define MSG_ARG_INVALID     "Invalid value for argument \"%s\".\n"
396bfe74f8SJasvinder Singh #define MSG_FILE_ERR        "Error in file \"%s\" at line %u.\n"
403186282fSJasvinder Singh #define MSG_FILE_NOT_ENOUGH "Not enough rules in file \"%s\".\n"
416bfe74f8SJasvinder Singh #define MSG_CMD_FAIL        "Command \"%s\" failed.\n"
424bbf8e30SJasvinder Singh 
434bbf8e30SJasvinder Singh static int
444bbf8e30SJasvinder Singh is_comment(char *in)
454bbf8e30SJasvinder Singh {
464bbf8e30SJasvinder Singh 	if ((strlen(in) && index("!#%;", in[0])) ||
474bbf8e30SJasvinder Singh 		(strncmp(in, "//", 2) == 0) ||
484bbf8e30SJasvinder Singh 		(strncmp(in, "--", 2) == 0))
494bbf8e30SJasvinder Singh 		return 1;
504bbf8e30SJasvinder Singh 
514bbf8e30SJasvinder Singh 	return 0;
524bbf8e30SJasvinder Singh }
534bbf8e30SJasvinder Singh 
5426b3effeSKevin Laatz static const char cmd_mempool_help[] =
5526b3effeSKevin Laatz "mempool <mempool_name>\n"
5626b3effeSKevin Laatz "   buffer <buffer_size>\n"
5726b3effeSKevin Laatz "   pool <pool_size>\n"
5826b3effeSKevin Laatz "   cache <cache_size>\n"
5926b3effeSKevin Laatz "   cpu <cpu_id>\n";
6026b3effeSKevin Laatz 
616bfe74f8SJasvinder Singh static void
626bfe74f8SJasvinder Singh cmd_mempool(char **tokens,
636bfe74f8SJasvinder Singh 	uint32_t n_tokens,
646bfe74f8SJasvinder Singh 	char *out,
656bfe74f8SJasvinder Singh 	size_t out_size)
664bbf8e30SJasvinder Singh {
676bfe74f8SJasvinder Singh 	struct mempool_params p;
686bfe74f8SJasvinder Singh 	char *name;
696bfe74f8SJasvinder Singh 	struct mempool *mempool;
706bfe74f8SJasvinder Singh 
716bfe74f8SJasvinder Singh 	if (n_tokens != 10) {
726bfe74f8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
736bfe74f8SJasvinder Singh 		return;
746bfe74f8SJasvinder Singh 	}
756bfe74f8SJasvinder Singh 
766bfe74f8SJasvinder Singh 	name = tokens[1];
776bfe74f8SJasvinder Singh 
786bfe74f8SJasvinder Singh 	if (strcmp(tokens[2], "buffer") != 0) {
796bfe74f8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "buffer");
806bfe74f8SJasvinder Singh 		return;
816bfe74f8SJasvinder Singh 	}
826bfe74f8SJasvinder Singh 
836bfe74f8SJasvinder Singh 	if (parser_read_uint32(&p.buffer_size, tokens[3]) != 0) {
846bfe74f8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "buffer_size");
856bfe74f8SJasvinder Singh 		return;
866bfe74f8SJasvinder Singh 	}
876bfe74f8SJasvinder Singh 
886bfe74f8SJasvinder Singh 	if (strcmp(tokens[4], "pool") != 0) {
896bfe74f8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pool");
906bfe74f8SJasvinder Singh 		return;
916bfe74f8SJasvinder Singh 	}
926bfe74f8SJasvinder Singh 
936bfe74f8SJasvinder Singh 	if (parser_read_uint32(&p.pool_size, tokens[5]) != 0) {
946bfe74f8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "pool_size");
956bfe74f8SJasvinder Singh 		return;
966bfe74f8SJasvinder Singh 	}
976bfe74f8SJasvinder Singh 
986bfe74f8SJasvinder Singh 	if (strcmp(tokens[6], "cache") != 0) {
996bfe74f8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cache");
1006bfe74f8SJasvinder Singh 		return;
1016bfe74f8SJasvinder Singh 	}
1026bfe74f8SJasvinder Singh 
1036bfe74f8SJasvinder Singh 	if (parser_read_uint32(&p.cache_size, tokens[7]) != 0) {
1046bfe74f8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "cache_size");
1056bfe74f8SJasvinder Singh 		return;
1066bfe74f8SJasvinder Singh 	}
1076bfe74f8SJasvinder Singh 
1086bfe74f8SJasvinder Singh 	if (strcmp(tokens[8], "cpu") != 0) {
1096bfe74f8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
1106bfe74f8SJasvinder Singh 		return;
1116bfe74f8SJasvinder Singh 	}
1126bfe74f8SJasvinder Singh 
1136bfe74f8SJasvinder Singh 	if (parser_read_uint32(&p.cpu_id, tokens[9]) != 0) {
1146bfe74f8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
1156bfe74f8SJasvinder Singh 		return;
1166bfe74f8SJasvinder Singh 	}
1176bfe74f8SJasvinder Singh 
1186bfe74f8SJasvinder Singh 	mempool = mempool_create(name, &p);
1196bfe74f8SJasvinder Singh 	if (mempool == NULL) {
1206bfe74f8SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1216bfe74f8SJasvinder Singh 		return;
1226bfe74f8SJasvinder Singh 	}
1236bfe74f8SJasvinder Singh }
1246bfe74f8SJasvinder Singh 
12526b3effeSKevin Laatz static const char cmd_link_help[] =
12626b3effeSKevin Laatz "link <link_name>\n"
12726b3effeSKevin Laatz "   dev <device_name> | port <port_id>\n"
12826b3effeSKevin Laatz "   rxq <n_queues> <queue_size> <mempool_name>\n"
12926b3effeSKevin Laatz "   txq <n_queues> <queue_size>\n"
13026b3effeSKevin Laatz "   promiscuous on | off\n"
13126b3effeSKevin Laatz "   [rss <qid_0> ... <qid_n>]\n";
13226b3effeSKevin Laatz 
133133c2c65SJasvinder Singh static void
134133c2c65SJasvinder Singh cmd_link(char **tokens,
135133c2c65SJasvinder Singh 	uint32_t n_tokens,
136133c2c65SJasvinder Singh 	char *out,
137133c2c65SJasvinder Singh 	size_t out_size)
138133c2c65SJasvinder Singh {
139133c2c65SJasvinder Singh 	struct link_params p;
140133c2c65SJasvinder Singh 	struct link_params_rss rss;
141133c2c65SJasvinder Singh 	struct link *link;
142133c2c65SJasvinder Singh 	char *name;
143133c2c65SJasvinder Singh 
14484a27d89SFan Zhang 	memset(&p, 0, sizeof(p));
14584a27d89SFan Zhang 
146133c2c65SJasvinder Singh 	if ((n_tokens < 13) || (n_tokens > 14 + LINK_RXQ_RSS_MAX)) {
147133c2c65SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
148133c2c65SJasvinder Singh 		return;
149133c2c65SJasvinder Singh 	}
150133c2c65SJasvinder Singh 	name = tokens[1];
151133c2c65SJasvinder Singh 
152133c2c65SJasvinder Singh 	if (strcmp(tokens[2], "dev") == 0)
153133c2c65SJasvinder Singh 		p.dev_name = tokens[3];
154133c2c65SJasvinder Singh 	else if (strcmp(tokens[2], "port") == 0) {
155133c2c65SJasvinder Singh 		p.dev_name = NULL;
156133c2c65SJasvinder Singh 
157133c2c65SJasvinder Singh 		if (parser_read_uint16(&p.port_id, tokens[3]) != 0) {
158133c2c65SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
159133c2c65SJasvinder Singh 			return;
160133c2c65SJasvinder Singh 		}
161133c2c65SJasvinder Singh 	} else {
162133c2c65SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "dev or port");
163133c2c65SJasvinder Singh 		return;
164133c2c65SJasvinder Singh 	}
165133c2c65SJasvinder Singh 
166133c2c65SJasvinder Singh 	if (strcmp(tokens[4], "rxq") != 0) {
167133c2c65SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rxq");
168133c2c65SJasvinder Singh 		return;
169133c2c65SJasvinder Singh 	}
170133c2c65SJasvinder Singh 
171133c2c65SJasvinder Singh 	if (parser_read_uint32(&p.rx.n_queues, tokens[5]) != 0) {
172133c2c65SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "n_queues");
173133c2c65SJasvinder Singh 		return;
174133c2c65SJasvinder Singh 	}
175133c2c65SJasvinder Singh 	if (parser_read_uint32(&p.rx.queue_size, tokens[6]) != 0) {
176133c2c65SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "queue_size");
177133c2c65SJasvinder Singh 		return;
178133c2c65SJasvinder Singh 	}
179133c2c65SJasvinder Singh 
180133c2c65SJasvinder Singh 	p.rx.mempool_name = tokens[7];
181133c2c65SJasvinder Singh 
182133c2c65SJasvinder Singh 	if (strcmp(tokens[8], "txq") != 0) {
183133c2c65SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "txq");
184133c2c65SJasvinder Singh 		return;
185133c2c65SJasvinder Singh 	}
186133c2c65SJasvinder Singh 
187133c2c65SJasvinder Singh 	if (parser_read_uint32(&p.tx.n_queues, tokens[9]) != 0) {
188133c2c65SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "n_queues");
189133c2c65SJasvinder Singh 		return;
190133c2c65SJasvinder Singh 	}
191133c2c65SJasvinder Singh 
192133c2c65SJasvinder Singh 	if (parser_read_uint32(&p.tx.queue_size, tokens[10]) != 0) {
193133c2c65SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "queue_size");
194133c2c65SJasvinder Singh 		return;
195133c2c65SJasvinder Singh 	}
196133c2c65SJasvinder Singh 
197133c2c65SJasvinder Singh 	if (strcmp(tokens[11], "promiscuous") != 0) {
198133c2c65SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "promiscuous");
199133c2c65SJasvinder Singh 		return;
200133c2c65SJasvinder Singh 	}
201133c2c65SJasvinder Singh 
202133c2c65SJasvinder Singh 	if (strcmp(tokens[12], "on") == 0)
203133c2c65SJasvinder Singh 		p.promiscuous = 1;
204133c2c65SJasvinder Singh 	else if (strcmp(tokens[12], "off") == 0)
205133c2c65SJasvinder Singh 		p.promiscuous = 0;
206133c2c65SJasvinder Singh 	else {
207133c2c65SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "on or off");
208133c2c65SJasvinder Singh 		return;
209133c2c65SJasvinder Singh 	}
210133c2c65SJasvinder Singh 
211133c2c65SJasvinder Singh 	/* RSS */
212133c2c65SJasvinder Singh 	p.rx.rss = NULL;
213133c2c65SJasvinder Singh 	if (n_tokens > 13) {
214133c2c65SJasvinder Singh 		uint32_t queue_id, i;
215133c2c65SJasvinder Singh 
216133c2c65SJasvinder Singh 		if (strcmp(tokens[13], "rss") != 0) {
217133c2c65SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rss");
218133c2c65SJasvinder Singh 			return;
219133c2c65SJasvinder Singh 		}
220133c2c65SJasvinder Singh 
221133c2c65SJasvinder Singh 		p.rx.rss = &rss;
222133c2c65SJasvinder Singh 
223133c2c65SJasvinder Singh 		rss.n_queues = 0;
224133c2c65SJasvinder Singh 		for (i = 14; i < n_tokens; i++) {
225133c2c65SJasvinder Singh 			if (parser_read_uint32(&queue_id, tokens[i]) != 0) {
226133c2c65SJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID,
227133c2c65SJasvinder Singh 					"queue_id");
228133c2c65SJasvinder Singh 				return;
229133c2c65SJasvinder Singh 			}
230133c2c65SJasvinder Singh 
231133c2c65SJasvinder Singh 			rss.queue_id[rss.n_queues] = queue_id;
232133c2c65SJasvinder Singh 			rss.n_queues++;
233133c2c65SJasvinder Singh 		}
234133c2c65SJasvinder Singh 	}
235133c2c65SJasvinder Singh 
236133c2c65SJasvinder Singh 	link = link_create(name, &p);
237133c2c65SJasvinder Singh 	if (link == NULL) {
238133c2c65SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
239133c2c65SJasvinder Singh 		return;
240133c2c65SJasvinder Singh 	}
241133c2c65SJasvinder Singh }
242133c2c65SJasvinder Singh 
243ecfc2b1cSKevin Laatz /* Print the link stats and info */
244ecfc2b1cSKevin Laatz static void
245ecfc2b1cSKevin Laatz print_link_info(struct link *link, char *out, size_t out_size)
246ecfc2b1cSKevin Laatz {
247ecfc2b1cSKevin Laatz 	struct rte_eth_stats stats;
248ecfc2b1cSKevin Laatz 	struct ether_addr mac_addr;
249ecfc2b1cSKevin Laatz 	struct rte_eth_link eth_link;
250ecfc2b1cSKevin Laatz 	uint16_t mtu;
251ecfc2b1cSKevin Laatz 
252ecfc2b1cSKevin Laatz 	memset(&stats, 0, sizeof(stats));
253ecfc2b1cSKevin Laatz 	rte_eth_stats_get(link->port_id, &stats);
254ecfc2b1cSKevin Laatz 
255ecfc2b1cSKevin Laatz 	rte_eth_macaddr_get(link->port_id, &mac_addr);
256ecfc2b1cSKevin Laatz 	rte_eth_link_get(link->port_id, &eth_link);
257ecfc2b1cSKevin Laatz 	rte_eth_dev_get_mtu(link->port_id, &mtu);
258ecfc2b1cSKevin Laatz 
259ecfc2b1cSKevin Laatz 	snprintf(out, out_size,
260ecfc2b1cSKevin Laatz 		"\n"
261ecfc2b1cSKevin Laatz 		"%s: flags=<%s> mtu %u\n"
262ecfc2b1cSKevin Laatz 		"\tether %02X:%02X:%02X:%02X:%02X:%02X rxqueues %u txqueues %u\n"
263ecfc2b1cSKevin Laatz 		"\tport# %u  speed %u Mbps\n"
264ecfc2b1cSKevin Laatz 		"\tRX packets %" PRIu64"  bytes %" PRIu64"\n"
265ecfc2b1cSKevin Laatz 		"\tRX errors %" PRIu64"  missed %" PRIu64"  no-mbuf %" PRIu64"\n"
266ecfc2b1cSKevin Laatz 		"\tTX packets %" PRIu64"  bytes %" PRIu64"\n"
267ecfc2b1cSKevin Laatz 		"\tTX errors %" PRIu64"\n",
268ecfc2b1cSKevin Laatz 		link->name,
269ecfc2b1cSKevin Laatz 		eth_link.link_status == 0 ? "DOWN" : "UP",
270ecfc2b1cSKevin Laatz 		mtu,
271ecfc2b1cSKevin Laatz 		mac_addr.addr_bytes[0], mac_addr.addr_bytes[1],
272ecfc2b1cSKevin Laatz 		mac_addr.addr_bytes[2], mac_addr.addr_bytes[3],
273ecfc2b1cSKevin Laatz 		mac_addr.addr_bytes[4], mac_addr.addr_bytes[5],
274ecfc2b1cSKevin Laatz 		link->n_rxq,
275ecfc2b1cSKevin Laatz 		link->n_txq,
276ecfc2b1cSKevin Laatz 		link->port_id,
277ecfc2b1cSKevin Laatz 		eth_link.link_speed,
278ecfc2b1cSKevin Laatz 		stats.ipackets,
279ecfc2b1cSKevin Laatz 		stats.ibytes,
280ecfc2b1cSKevin Laatz 		stats.ierrors,
281ecfc2b1cSKevin Laatz 		stats.imissed,
282ecfc2b1cSKevin Laatz 		stats.rx_nombuf,
283ecfc2b1cSKevin Laatz 		stats.opackets,
284ecfc2b1cSKevin Laatz 		stats.obytes,
285ecfc2b1cSKevin Laatz 		stats.oerrors);
286ecfc2b1cSKevin Laatz }
287ecfc2b1cSKevin Laatz 
288ecfc2b1cSKevin Laatz /*
289ecfc2b1cSKevin Laatz  * link show [<link_name>]
290ecfc2b1cSKevin Laatz  */
291ecfc2b1cSKevin Laatz static void
292ecfc2b1cSKevin Laatz cmd_link_show(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
293ecfc2b1cSKevin Laatz {
294ecfc2b1cSKevin Laatz 	struct link *link;
295ecfc2b1cSKevin Laatz 	char *link_name;
296ecfc2b1cSKevin Laatz 
297ecfc2b1cSKevin Laatz 	if (n_tokens != 2 && n_tokens != 3) {
298ecfc2b1cSKevin Laatz 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
299ecfc2b1cSKevin Laatz 		return;
300ecfc2b1cSKevin Laatz 	}
301ecfc2b1cSKevin Laatz 
302ecfc2b1cSKevin Laatz 	if (n_tokens == 2) {
303ecfc2b1cSKevin Laatz 		link = link_next(NULL);
304ecfc2b1cSKevin Laatz 
305ecfc2b1cSKevin Laatz 		while (link != NULL) {
306ecfc2b1cSKevin Laatz 			out_size = out_size - strlen(out);
307ecfc2b1cSKevin Laatz 			out = &out[strlen(out)];
308ecfc2b1cSKevin Laatz 
309ecfc2b1cSKevin Laatz 			print_link_info(link, out, out_size);
310ecfc2b1cSKevin Laatz 			link = link_next(link);
311ecfc2b1cSKevin Laatz 		}
312ecfc2b1cSKevin Laatz 	} else {
313ecfc2b1cSKevin Laatz 		out_size = out_size - strlen(out);
314ecfc2b1cSKevin Laatz 		out = &out[strlen(out)];
315ecfc2b1cSKevin Laatz 
316ecfc2b1cSKevin Laatz 		link_name = tokens[2];
317ecfc2b1cSKevin Laatz 		link = link_find(link_name);
318ecfc2b1cSKevin Laatz 
319ecfc2b1cSKevin Laatz 		if (link == NULL) {
320ecfc2b1cSKevin Laatz 			snprintf(out, out_size, MSG_ARG_INVALID,
321ecfc2b1cSKevin Laatz 					"Link does not exist");
322ecfc2b1cSKevin Laatz 			return;
323ecfc2b1cSKevin Laatz 		}
324ecfc2b1cSKevin Laatz 		print_link_info(link, out, out_size);
325ecfc2b1cSKevin Laatz 	}
326ecfc2b1cSKevin Laatz }
327ecfc2b1cSKevin Laatz 
32826b3effeSKevin Laatz static const char cmd_swq_help[] =
32926b3effeSKevin Laatz "swq <swq_name>\n"
33026b3effeSKevin Laatz "   size <size>\n"
33126b3effeSKevin Laatz "   cpu <cpu_id>\n";
33226b3effeSKevin Laatz 
3338245472cSJasvinder Singh static void
3348245472cSJasvinder Singh cmd_swq(char **tokens,
3358245472cSJasvinder Singh 	uint32_t n_tokens,
3368245472cSJasvinder Singh 	char *out,
3378245472cSJasvinder Singh 	size_t out_size)
3388245472cSJasvinder Singh {
3398245472cSJasvinder Singh 	struct swq_params p;
3408245472cSJasvinder Singh 	char *name;
3418245472cSJasvinder Singh 	struct swq *swq;
3428245472cSJasvinder Singh 
3438245472cSJasvinder Singh 	if (n_tokens != 6) {
3448245472cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3458245472cSJasvinder Singh 		return;
3468245472cSJasvinder Singh 	}
3478245472cSJasvinder Singh 
3488245472cSJasvinder Singh 	name = tokens[1];
3498245472cSJasvinder Singh 
3508245472cSJasvinder Singh 	if (strcmp(tokens[2], "size") != 0) {
3518245472cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
3528245472cSJasvinder Singh 		return;
3538245472cSJasvinder Singh 	}
3548245472cSJasvinder Singh 
3558245472cSJasvinder Singh 	if (parser_read_uint32(&p.size, tokens[3]) != 0) {
3568245472cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "size");
3578245472cSJasvinder Singh 		return;
3588245472cSJasvinder Singh 	}
3598245472cSJasvinder Singh 
3608245472cSJasvinder Singh 	if (strcmp(tokens[4], "cpu") != 0) {
3618245472cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
3628245472cSJasvinder Singh 		return;
3638245472cSJasvinder Singh 	}
3648245472cSJasvinder Singh 
3658245472cSJasvinder Singh 	if (parser_read_uint32(&p.cpu_id, tokens[5]) != 0) {
3668245472cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
3678245472cSJasvinder Singh 		return;
3688245472cSJasvinder Singh 	}
3698245472cSJasvinder Singh 
3708245472cSJasvinder Singh 	swq = swq_create(name, &p);
3718245472cSJasvinder Singh 	if (swq == NULL) {
3728245472cSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
3738245472cSJasvinder Singh 		return;
3748245472cSJasvinder Singh 	}
3758245472cSJasvinder Singh }
3768245472cSJasvinder Singh 
37726b3effeSKevin Laatz static const char cmd_tmgr_subport_profile_help[] =
37826b3effeSKevin Laatz "tmgr subport profile\n"
37926b3effeSKevin Laatz "   <tb_rate> <tb_size>\n"
38026b3effeSKevin Laatz "   <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate>\n"
38126b3effeSKevin Laatz "   <tc_period>\n";
38226b3effeSKevin Laatz 
38325961ff3SJasvinder Singh static void
38425961ff3SJasvinder Singh cmd_tmgr_subport_profile(char **tokens,
38525961ff3SJasvinder Singh 	uint32_t n_tokens,
38625961ff3SJasvinder Singh 	char *out,
38725961ff3SJasvinder Singh 	size_t out_size)
38825961ff3SJasvinder Singh {
38925961ff3SJasvinder Singh 	struct rte_sched_subport_params p;
39025961ff3SJasvinder Singh 	int status, i;
39125961ff3SJasvinder Singh 
39225961ff3SJasvinder Singh 	if (n_tokens != 10) {
39325961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
39425961ff3SJasvinder Singh 		return;
39525961ff3SJasvinder Singh 	}
39625961ff3SJasvinder Singh 
39725961ff3SJasvinder Singh 	if (parser_read_uint32(&p.tb_rate, tokens[3]) != 0) {
39825961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "tb_rate");
39925961ff3SJasvinder Singh 		return;
40025961ff3SJasvinder Singh 	}
40125961ff3SJasvinder Singh 
40225961ff3SJasvinder Singh 	if (parser_read_uint32(&p.tb_size, tokens[4]) != 0) {
40325961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "tb_size");
40425961ff3SJasvinder Singh 		return;
40525961ff3SJasvinder Singh 	}
40625961ff3SJasvinder Singh 
40725961ff3SJasvinder Singh 	for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
40825961ff3SJasvinder Singh 		if (parser_read_uint32(&p.tc_rate[i], tokens[5 + i]) != 0) {
40925961ff3SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "tc_rate");
41025961ff3SJasvinder Singh 			return;
41125961ff3SJasvinder Singh 		}
41225961ff3SJasvinder Singh 
41325961ff3SJasvinder Singh 	if (parser_read_uint32(&p.tc_period, tokens[9]) != 0) {
41425961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "tc_period");
41525961ff3SJasvinder Singh 		return;
41625961ff3SJasvinder Singh 	}
41725961ff3SJasvinder Singh 
41825961ff3SJasvinder Singh 	status = tmgr_subport_profile_add(&p);
41925961ff3SJasvinder Singh 	if (status != 0) {
42025961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
42125961ff3SJasvinder Singh 		return;
42225961ff3SJasvinder Singh 	}
42325961ff3SJasvinder Singh }
42425961ff3SJasvinder Singh 
42526b3effeSKevin Laatz static const char cmd_tmgr_pipe_profile_help[] =
42626b3effeSKevin Laatz "tmgr pipe profile\n"
42726b3effeSKevin Laatz "   <tb_rate> <tb_size>\n"
42826b3effeSKevin Laatz "   <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate>\n"
42926b3effeSKevin Laatz "   <tc_period>\n"
43026b3effeSKevin Laatz "   <tc_ov_weight>\n"
43126b3effeSKevin Laatz "   <wrr_weight0..15>\n";
43226b3effeSKevin Laatz 
43325961ff3SJasvinder Singh static void
43425961ff3SJasvinder Singh cmd_tmgr_pipe_profile(char **tokens,
43525961ff3SJasvinder Singh 	uint32_t n_tokens,
43625961ff3SJasvinder Singh 	char *out,
43725961ff3SJasvinder Singh 	size_t out_size)
43825961ff3SJasvinder Singh {
43925961ff3SJasvinder Singh 	struct rte_sched_pipe_params p;
44025961ff3SJasvinder Singh 	int status, i;
44125961ff3SJasvinder Singh 
44225961ff3SJasvinder Singh 	if (n_tokens != 27) {
44325961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
44425961ff3SJasvinder Singh 		return;
44525961ff3SJasvinder Singh 	}
44625961ff3SJasvinder Singh 
44725961ff3SJasvinder Singh 	if (parser_read_uint32(&p.tb_rate, tokens[3]) != 0) {
44825961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "tb_rate");
44925961ff3SJasvinder Singh 		return;
45025961ff3SJasvinder Singh 	}
45125961ff3SJasvinder Singh 
45225961ff3SJasvinder Singh 	if (parser_read_uint32(&p.tb_size, tokens[4]) != 0) {
45325961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "tb_size");
45425961ff3SJasvinder Singh 		return;
45525961ff3SJasvinder Singh 	}
45625961ff3SJasvinder Singh 
45725961ff3SJasvinder Singh 	for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
45825961ff3SJasvinder Singh 		if (parser_read_uint32(&p.tc_rate[i], tokens[5 + i]) != 0) {
45925961ff3SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "tc_rate");
46025961ff3SJasvinder Singh 			return;
46125961ff3SJasvinder Singh 		}
46225961ff3SJasvinder Singh 
46325961ff3SJasvinder Singh 	if (parser_read_uint32(&p.tc_period, tokens[9]) != 0) {
46425961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "tc_period");
46525961ff3SJasvinder Singh 		return;
46625961ff3SJasvinder Singh 	}
46725961ff3SJasvinder Singh 
46825961ff3SJasvinder Singh #ifdef RTE_SCHED_SUBPORT_TC_OV
46925961ff3SJasvinder Singh 	if (parser_read_uint8(&p.tc_ov_weight, tokens[10]) != 0) {
47025961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "tc_ov_weight");
47125961ff3SJasvinder Singh 		return;
47225961ff3SJasvinder Singh 	}
47325961ff3SJasvinder Singh #endif
47425961ff3SJasvinder Singh 
47525961ff3SJasvinder Singh 	for (i = 0; i < RTE_SCHED_QUEUES_PER_PIPE; i++)
47625961ff3SJasvinder Singh 		if (parser_read_uint8(&p.wrr_weights[i], tokens[11 + i]) != 0) {
47725961ff3SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "wrr_weights");
47825961ff3SJasvinder Singh 			return;
47925961ff3SJasvinder Singh 		}
48025961ff3SJasvinder Singh 
48125961ff3SJasvinder Singh 	status = tmgr_pipe_profile_add(&p);
48225961ff3SJasvinder Singh 	if (status != 0) {
48325961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
48425961ff3SJasvinder Singh 		return;
48525961ff3SJasvinder Singh 	}
48625961ff3SJasvinder Singh }
48725961ff3SJasvinder Singh 
48826b3effeSKevin Laatz static const char cmd_tmgr_help[] =
48926b3effeSKevin Laatz "tmgr <tmgr_name>\n"
49026b3effeSKevin Laatz "   rate <rate>\n"
49126b3effeSKevin Laatz "   spp <n_subports_per_port>\n"
49226b3effeSKevin Laatz "   pps <n_pipes_per_subport>\n"
49326b3effeSKevin Laatz "   qsize <qsize_tc0> <qsize_tc1> <qsize_tc2> <qsize_tc3>\n"
49426b3effeSKevin Laatz "   fo <frame_overhead>\n"
49526b3effeSKevin Laatz "   mtu <mtu>\n"
49626b3effeSKevin Laatz "   cpu <cpu_id>\n";
49726b3effeSKevin Laatz 
49825961ff3SJasvinder Singh static void
49925961ff3SJasvinder Singh cmd_tmgr(char **tokens,
50025961ff3SJasvinder Singh 	uint32_t n_tokens,
50125961ff3SJasvinder Singh 	char *out,
50225961ff3SJasvinder Singh 	size_t out_size)
50325961ff3SJasvinder Singh {
50425961ff3SJasvinder Singh 	struct tmgr_port_params p;
50525961ff3SJasvinder Singh 	char *name;
50625961ff3SJasvinder Singh 	struct tmgr_port *tmgr_port;
50725961ff3SJasvinder Singh 	int i;
50825961ff3SJasvinder Singh 
50925961ff3SJasvinder Singh 	if (n_tokens != 19) {
51025961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
51125961ff3SJasvinder Singh 		return;
51225961ff3SJasvinder Singh 	}
51325961ff3SJasvinder Singh 
51425961ff3SJasvinder Singh 	name = tokens[1];
51525961ff3SJasvinder Singh 
51625961ff3SJasvinder Singh 	if (strcmp(tokens[2], "rate") != 0) {
51725961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rate");
51825961ff3SJasvinder Singh 		return;
51925961ff3SJasvinder Singh 	}
52025961ff3SJasvinder Singh 
52125961ff3SJasvinder Singh 	if (parser_read_uint32(&p.rate, tokens[3]) != 0) {
52225961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "rate");
52325961ff3SJasvinder Singh 		return;
52425961ff3SJasvinder Singh 	}
52525961ff3SJasvinder Singh 
52625961ff3SJasvinder Singh 	if (strcmp(tokens[4], "spp") != 0) {
52725961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "spp");
52825961ff3SJasvinder Singh 		return;
52925961ff3SJasvinder Singh 	}
53025961ff3SJasvinder Singh 
53125961ff3SJasvinder Singh 	if (parser_read_uint32(&p.n_subports_per_port, tokens[5]) != 0) {
53225961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "n_subports_per_port");
53325961ff3SJasvinder Singh 		return;
53425961ff3SJasvinder Singh 	}
53525961ff3SJasvinder Singh 
53625961ff3SJasvinder Singh 	if (strcmp(tokens[6], "pps") != 0) {
53725961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pps");
53825961ff3SJasvinder Singh 		return;
53925961ff3SJasvinder Singh 	}
54025961ff3SJasvinder Singh 
54125961ff3SJasvinder Singh 	if (parser_read_uint32(&p.n_pipes_per_subport, tokens[7]) != 0) {
54225961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "n_pipes_per_subport");
54325961ff3SJasvinder Singh 		return;
54425961ff3SJasvinder Singh 	}
54525961ff3SJasvinder Singh 
54625961ff3SJasvinder Singh 	if (strcmp(tokens[8], "qsize") != 0) {
54725961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "qsize");
54825961ff3SJasvinder Singh 		return;
54925961ff3SJasvinder Singh 	}
55025961ff3SJasvinder Singh 
55125961ff3SJasvinder Singh 	for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
55225961ff3SJasvinder Singh 		if (parser_read_uint16(&p.qsize[i], tokens[9 + i]) != 0) {
55325961ff3SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "qsize");
55425961ff3SJasvinder Singh 			return;
55525961ff3SJasvinder Singh 		}
55625961ff3SJasvinder Singh 
55725961ff3SJasvinder Singh 	if (strcmp(tokens[13], "fo") != 0) {
55825961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "fo");
55925961ff3SJasvinder Singh 		return;
56025961ff3SJasvinder Singh 	}
56125961ff3SJasvinder Singh 
56225961ff3SJasvinder Singh 	if (parser_read_uint32(&p.frame_overhead, tokens[14]) != 0) {
56325961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "frame_overhead");
56425961ff3SJasvinder Singh 		return;
56525961ff3SJasvinder Singh 	}
56625961ff3SJasvinder Singh 
56725961ff3SJasvinder Singh 	if (strcmp(tokens[15], "mtu") != 0) {
56825961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mtu");
56925961ff3SJasvinder Singh 		return;
57025961ff3SJasvinder Singh 	}
57125961ff3SJasvinder Singh 
57225961ff3SJasvinder Singh 	if (parser_read_uint32(&p.mtu, tokens[16]) != 0) {
57325961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "mtu");
57425961ff3SJasvinder Singh 		return;
57525961ff3SJasvinder Singh 	}
57625961ff3SJasvinder Singh 
57725961ff3SJasvinder Singh 	if (strcmp(tokens[17], "cpu") != 0) {
57825961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
57925961ff3SJasvinder Singh 		return;
58025961ff3SJasvinder Singh 	}
58125961ff3SJasvinder Singh 
58225961ff3SJasvinder Singh 	if (parser_read_uint32(&p.cpu_id, tokens[18]) != 0) {
58325961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
58425961ff3SJasvinder Singh 		return;
58525961ff3SJasvinder Singh 	}
58625961ff3SJasvinder Singh 
58725961ff3SJasvinder Singh 	tmgr_port = tmgr_port_create(name, &p);
58825961ff3SJasvinder Singh 	if (tmgr_port == NULL) {
58925961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
59025961ff3SJasvinder Singh 		return;
59125961ff3SJasvinder Singh 	}
59225961ff3SJasvinder Singh }
59325961ff3SJasvinder Singh 
59426b3effeSKevin Laatz static const char cmd_tmgr_subport_help[] =
59526b3effeSKevin Laatz "tmgr <tmgr_name> subport <subport_id>\n"
59626b3effeSKevin Laatz "   profile <subport_profile_id>\n";
59726b3effeSKevin Laatz 
59825961ff3SJasvinder Singh static void
59925961ff3SJasvinder Singh cmd_tmgr_subport(char **tokens,
60025961ff3SJasvinder Singh 	uint32_t n_tokens,
60125961ff3SJasvinder Singh 	char *out,
60225961ff3SJasvinder Singh 	size_t out_size)
60325961ff3SJasvinder Singh {
60425961ff3SJasvinder Singh 	uint32_t subport_id, subport_profile_id;
60525961ff3SJasvinder Singh 	int status;
60625961ff3SJasvinder Singh 	char *name;
60725961ff3SJasvinder Singh 
60825961ff3SJasvinder Singh 	if (n_tokens != 6) {
60925961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
61025961ff3SJasvinder Singh 		return;
61125961ff3SJasvinder Singh 	}
61225961ff3SJasvinder Singh 
61325961ff3SJasvinder Singh 	name = tokens[1];
61425961ff3SJasvinder Singh 
61525961ff3SJasvinder Singh 	if (parser_read_uint32(&subport_id, tokens[3]) != 0) {
61625961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "subport_id");
61725961ff3SJasvinder Singh 		return;
61825961ff3SJasvinder Singh 	}
61925961ff3SJasvinder Singh 
62025961ff3SJasvinder Singh 	if (parser_read_uint32(&subport_profile_id, tokens[5]) != 0) {
62125961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "subport_profile_id");
62225961ff3SJasvinder Singh 		return;
62325961ff3SJasvinder Singh 	}
62425961ff3SJasvinder Singh 
62525961ff3SJasvinder Singh 	status = tmgr_subport_config(name, subport_id, subport_profile_id);
62625961ff3SJasvinder Singh 	if (status) {
62725961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
62825961ff3SJasvinder Singh 		return;
62925961ff3SJasvinder Singh 	}
63025961ff3SJasvinder Singh }
63125961ff3SJasvinder Singh 
63226b3effeSKevin Laatz 
63326b3effeSKevin Laatz static const char cmd_tmgr_subport_pipe_help[] =
63426b3effeSKevin Laatz "tmgr <tmgr_name> subport <subport_id> pipe\n"
63526b3effeSKevin Laatz "   from <pipe_id_first> to <pipe_id_last>\n"
63626b3effeSKevin Laatz "   profile <pipe_profile_id>\n";
63726b3effeSKevin Laatz 
63825961ff3SJasvinder Singh static void
63925961ff3SJasvinder Singh cmd_tmgr_subport_pipe(char **tokens,
64025961ff3SJasvinder Singh 	uint32_t n_tokens,
64125961ff3SJasvinder Singh 	char *out,
64225961ff3SJasvinder Singh 	size_t out_size)
64325961ff3SJasvinder Singh {
64425961ff3SJasvinder Singh 	uint32_t subport_id, pipe_id_first, pipe_id_last, pipe_profile_id;
64525961ff3SJasvinder Singh 	int status;
64625961ff3SJasvinder Singh 	char *name;
64725961ff3SJasvinder Singh 
64825961ff3SJasvinder Singh 	if (n_tokens != 11) {
64925961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
65025961ff3SJasvinder Singh 		return;
65125961ff3SJasvinder Singh 	}
65225961ff3SJasvinder Singh 
65325961ff3SJasvinder Singh 	name = tokens[1];
65425961ff3SJasvinder Singh 
65525961ff3SJasvinder Singh 	if (parser_read_uint32(&subport_id, tokens[3]) != 0) {
65625961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "subport_id");
65725961ff3SJasvinder Singh 		return;
65825961ff3SJasvinder Singh 	}
65925961ff3SJasvinder Singh 
66025961ff3SJasvinder Singh 	if (strcmp(tokens[4], "pipe") != 0) {
66125961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipe");
66225961ff3SJasvinder Singh 		return;
66325961ff3SJasvinder Singh 	}
66425961ff3SJasvinder Singh 
66525961ff3SJasvinder Singh 	if (strcmp(tokens[5], "from") != 0) {
66625961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "from");
66725961ff3SJasvinder Singh 		return;
66825961ff3SJasvinder Singh 	}
66925961ff3SJasvinder Singh 
67025961ff3SJasvinder Singh 	if (parser_read_uint32(&pipe_id_first, tokens[6]) != 0) {
67125961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "pipe_id_first");
67225961ff3SJasvinder Singh 		return;
67325961ff3SJasvinder Singh 	}
67425961ff3SJasvinder Singh 
67525961ff3SJasvinder Singh 	if (strcmp(tokens[7], "to") != 0) {
67625961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "to");
67725961ff3SJasvinder Singh 		return;
67825961ff3SJasvinder Singh 	}
67925961ff3SJasvinder Singh 
68025961ff3SJasvinder Singh 	if (parser_read_uint32(&pipe_id_last, tokens[8]) != 0) {
68125961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "pipe_id_last");
68225961ff3SJasvinder Singh 		return;
68325961ff3SJasvinder Singh 	}
68425961ff3SJasvinder Singh 
68525961ff3SJasvinder Singh 	if (strcmp(tokens[9], "profile") != 0) {
68625961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
68725961ff3SJasvinder Singh 		return;
68825961ff3SJasvinder Singh 	}
68925961ff3SJasvinder Singh 
69025961ff3SJasvinder Singh 	if (parser_read_uint32(&pipe_profile_id, tokens[10]) != 0) {
69125961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "pipe_profile_id");
69225961ff3SJasvinder Singh 		return;
69325961ff3SJasvinder Singh 	}
69425961ff3SJasvinder Singh 
69525961ff3SJasvinder Singh 	status = tmgr_pipe_config(name, subport_id, pipe_id_first,
69625961ff3SJasvinder Singh 			pipe_id_last, pipe_profile_id);
69725961ff3SJasvinder Singh 	if (status) {
69825961ff3SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
69925961ff3SJasvinder Singh 		return;
70025961ff3SJasvinder Singh 	}
70125961ff3SJasvinder Singh }
70225961ff3SJasvinder Singh 
70326b3effeSKevin Laatz 
70426b3effeSKevin Laatz static const char cmd_tap_help[] =
70526b3effeSKevin Laatz "tap <tap_name>\n";
70626b3effeSKevin Laatz 
7072f74ae28SJasvinder Singh static void
7082f74ae28SJasvinder Singh cmd_tap(char **tokens,
7092f74ae28SJasvinder Singh 	uint32_t n_tokens,
7102f74ae28SJasvinder Singh 	char *out,
7112f74ae28SJasvinder Singh 	size_t out_size)
7122f74ae28SJasvinder Singh {
7132f74ae28SJasvinder Singh 	char *name;
7142f74ae28SJasvinder Singh 	struct tap *tap;
7152f74ae28SJasvinder Singh 
7162f74ae28SJasvinder Singh 	if (n_tokens != 2) {
7172f74ae28SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
7182f74ae28SJasvinder Singh 		return;
7192f74ae28SJasvinder Singh 	}
7202f74ae28SJasvinder Singh 
7212f74ae28SJasvinder Singh 	name = tokens[1];
7222f74ae28SJasvinder Singh 
7232f74ae28SJasvinder Singh 	tap = tap_create(name);
7242f74ae28SJasvinder Singh 	if (tap == NULL) {
7252f74ae28SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
7262f74ae28SJasvinder Singh 		return;
7272f74ae28SJasvinder Singh 	}
7282f74ae28SJasvinder Singh }
7292f74ae28SJasvinder Singh 
73026b3effeSKevin Laatz static const char cmd_kni_help[] =
73126b3effeSKevin Laatz "kni <kni_name>\n"
73226b3effeSKevin Laatz "   link <link_name>\n"
73326b3effeSKevin Laatz "   mempool <mempool_name>\n"
73426b3effeSKevin Laatz "   [thread <thread_id>]\n";
73526b3effeSKevin Laatz 
7369a408cc8SJasvinder Singh static void
7379a408cc8SJasvinder Singh cmd_kni(char **tokens,
7389a408cc8SJasvinder Singh 	uint32_t n_tokens,
7399a408cc8SJasvinder Singh 	char *out,
7409a408cc8SJasvinder Singh 	size_t out_size)
7419a408cc8SJasvinder Singh {
7429a408cc8SJasvinder Singh 	struct kni_params p;
7439a408cc8SJasvinder Singh 	char *name;
7449a408cc8SJasvinder Singh 	struct kni *kni;
7459a408cc8SJasvinder Singh 
7461d27b0f2SReshma Pattan 	memset(&p, 0, sizeof(p));
7479a408cc8SJasvinder Singh 	if ((n_tokens != 6) && (n_tokens != 8)) {
7489a408cc8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
7499a408cc8SJasvinder Singh 		return;
7509a408cc8SJasvinder Singh 	}
7519a408cc8SJasvinder Singh 
7529a408cc8SJasvinder Singh 	name = tokens[1];
7539a408cc8SJasvinder Singh 
7549a408cc8SJasvinder Singh 	if (strcmp(tokens[2], "link") != 0) {
7559a408cc8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "link");
7569a408cc8SJasvinder Singh 		return;
7579a408cc8SJasvinder Singh 	}
7589a408cc8SJasvinder Singh 
7599a408cc8SJasvinder Singh 	p.link_name = tokens[3];
7609a408cc8SJasvinder Singh 
7619a408cc8SJasvinder Singh 	if (strcmp(tokens[4], "mempool") != 0) {
7629a408cc8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mempool");
7639a408cc8SJasvinder Singh 		return;
7649a408cc8SJasvinder Singh 	}
7659a408cc8SJasvinder Singh 
7669a408cc8SJasvinder Singh 	p.mempool_name = tokens[5];
7679a408cc8SJasvinder Singh 
7689a408cc8SJasvinder Singh 	if (n_tokens == 8) {
7699a408cc8SJasvinder Singh 		if (strcmp(tokens[6], "thread") != 0) {
7709a408cc8SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "thread");
7719a408cc8SJasvinder Singh 			return;
7729a408cc8SJasvinder Singh 		}
7739a408cc8SJasvinder Singh 
7749a408cc8SJasvinder Singh 		if (parser_read_uint32(&p.thread_id, tokens[7]) != 0) {
7759a408cc8SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
7769a408cc8SJasvinder Singh 			return;
7779a408cc8SJasvinder Singh 		}
7789a408cc8SJasvinder Singh 
7799a408cc8SJasvinder Singh 		p.force_bind = 1;
7809a408cc8SJasvinder Singh 	} else
7819a408cc8SJasvinder Singh 		p.force_bind = 0;
7829a408cc8SJasvinder Singh 
7839a408cc8SJasvinder Singh 	kni = kni_create(name, &p);
7849a408cc8SJasvinder Singh 	if (kni == NULL) {
7859a408cc8SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
7869a408cc8SJasvinder Singh 		return;
7879a408cc8SJasvinder Singh 	}
7889a408cc8SJasvinder Singh }
7899a408cc8SJasvinder Singh 
7901edccebcSFan Zhang static const char cmd_cryptodev_help[] =
7911edccebcSFan Zhang "cryptodev <cryptodev_name>\n"
7921edccebcSFan Zhang "   dev <device_name> | dev_id <device_id>\n"
7931edccebcSFan Zhang "   queue <n_queues> <queue_size>\n";
7941edccebcSFan Zhang 
7951edccebcSFan Zhang static void
7961edccebcSFan Zhang cmd_cryptodev(char **tokens,
7971edccebcSFan Zhang 	uint32_t n_tokens,
7981edccebcSFan Zhang 	char *out,
7991edccebcSFan Zhang 	size_t out_size)
8001edccebcSFan Zhang {
8011edccebcSFan Zhang 	struct cryptodev_params params;
8021edccebcSFan Zhang 	char *name;
8031edccebcSFan Zhang 
8041edccebcSFan Zhang 	memset(&params, 0, sizeof(params));
8051edccebcSFan Zhang 	if (n_tokens != 7) {
8061edccebcSFan Zhang 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
8071edccebcSFan Zhang 		return;
8081edccebcSFan Zhang 	}
8091edccebcSFan Zhang 
8101edccebcSFan Zhang 	name = tokens[1];
8111edccebcSFan Zhang 
8121edccebcSFan Zhang 	if (strcmp(tokens[2], "dev") == 0)
8131edccebcSFan Zhang 		params.dev_name = tokens[3];
8141edccebcSFan Zhang 	else if (strcmp(tokens[2], "dev_id") == 0) {
8151edccebcSFan Zhang 		if (parser_read_uint32(&params.dev_id, tokens[3]) < 0) {
8161edccebcSFan Zhang 			snprintf(out, out_size,	MSG_ARG_INVALID,
8171edccebcSFan Zhang 				"dev_id");
8181edccebcSFan Zhang 			return;
8191edccebcSFan Zhang 		}
8201edccebcSFan Zhang 	} else {
8211edccebcSFan Zhang 		snprintf(out, out_size,	MSG_ARG_INVALID,
8221edccebcSFan Zhang 			"cryptodev");
8231edccebcSFan Zhang 		return;
8241edccebcSFan Zhang 	}
8251edccebcSFan Zhang 
8261edccebcSFan Zhang 	if (strcmp(tokens[4], "queue")) {
8271edccebcSFan Zhang 		snprintf(out, out_size,	MSG_ARG_NOT_FOUND,
8281edccebcSFan Zhang 			"4");
8291edccebcSFan Zhang 		return;
8301edccebcSFan Zhang 	}
8311edccebcSFan Zhang 
8321edccebcSFan Zhang 	if (parser_read_uint32(&params.n_queues, tokens[5]) < 0) {
8331edccebcSFan Zhang 		snprintf(out, out_size,	MSG_ARG_INVALID,
8341edccebcSFan Zhang 			"q");
8351edccebcSFan Zhang 		return;
8361edccebcSFan Zhang 	}
8371edccebcSFan Zhang 
8381edccebcSFan Zhang 	if (parser_read_uint32(&params.queue_size, tokens[6]) < 0) {
8391edccebcSFan Zhang 		snprintf(out, out_size,	MSG_ARG_INVALID,
8401edccebcSFan Zhang 			"queue_size");
8411edccebcSFan Zhang 		return;
8421edccebcSFan Zhang 	}
8431edccebcSFan Zhang 
8441edccebcSFan Zhang 	if (cryptodev_create(name, &params) == NULL) {
8451edccebcSFan Zhang 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
8461edccebcSFan Zhang 		return;
8471edccebcSFan Zhang 	}
8481edccebcSFan Zhang }
84926b3effeSKevin Laatz 
85026b3effeSKevin Laatz static const char cmd_port_in_action_profile_help[] =
85126b3effeSKevin Laatz "port in action profile <profile_name>\n"
85226b3effeSKevin Laatz "   [filter match | mismatch offset <key_offset> mask <key_mask> key <key_value> port <port_id>]\n"
85326b3effeSKevin Laatz "   [balance offset <key_offset> mask <key_mask> port <port_id0> ... <port_id15>]\n";
85426b3effeSKevin Laatz 
85571937434SJasvinder Singh static void
85671937434SJasvinder Singh cmd_port_in_action_profile(char **tokens,
85771937434SJasvinder Singh 	uint32_t n_tokens,
85871937434SJasvinder Singh 	char *out,
85971937434SJasvinder Singh 	size_t out_size)
86071937434SJasvinder Singh {
86171937434SJasvinder Singh 	struct port_in_action_profile_params p;
86271937434SJasvinder Singh 	struct port_in_action_profile *ap;
86371937434SJasvinder Singh 	char *name;
86471937434SJasvinder Singh 	uint32_t t0;
86571937434SJasvinder Singh 
86671937434SJasvinder Singh 	memset(&p, 0, sizeof(p));
86771937434SJasvinder Singh 
86871937434SJasvinder Singh 	if (n_tokens < 5) {
86971937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
87071937434SJasvinder Singh 		return;
87171937434SJasvinder Singh 	}
87271937434SJasvinder Singh 
87371937434SJasvinder Singh 	if (strcmp(tokens[1], "in") != 0) {
87471937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
87571937434SJasvinder Singh 		return;
87671937434SJasvinder Singh 	}
87771937434SJasvinder Singh 
87871937434SJasvinder Singh 	if (strcmp(tokens[2], "action") != 0) {
87971937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "action");
88071937434SJasvinder Singh 		return;
88171937434SJasvinder Singh 	}
88271937434SJasvinder Singh 
88371937434SJasvinder Singh 	if (strcmp(tokens[3], "profile") != 0) {
88471937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
88571937434SJasvinder Singh 		return;
88671937434SJasvinder Singh 	}
88771937434SJasvinder Singh 
88871937434SJasvinder Singh 	name = tokens[4];
88971937434SJasvinder Singh 
89071937434SJasvinder Singh 	t0 = 5;
89171937434SJasvinder Singh 
89271937434SJasvinder Singh 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "filter") == 0)) {
89371937434SJasvinder Singh 		uint32_t size;
89471937434SJasvinder Singh 
89571937434SJasvinder Singh 		if (n_tokens < t0 + 10) {
89671937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, "port in action profile filter");
89771937434SJasvinder Singh 			return;
89871937434SJasvinder Singh 		}
89971937434SJasvinder Singh 
90071937434SJasvinder Singh 		if (strcmp(tokens[t0 + 1], "match") == 0)
90171937434SJasvinder Singh 			p.fltr.filter_on_match = 1;
90271937434SJasvinder Singh 		else if (strcmp(tokens[t0 + 1], "mismatch") == 0)
90371937434SJasvinder Singh 			p.fltr.filter_on_match = 0;
90471937434SJasvinder Singh 		else {
90571937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "match or mismatch");
90671937434SJasvinder Singh 			return;
90771937434SJasvinder Singh 		}
90871937434SJasvinder Singh 
90971937434SJasvinder Singh 		if (strcmp(tokens[t0 + 2], "offset") != 0) {
91071937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
91171937434SJasvinder Singh 			return;
91271937434SJasvinder Singh 		}
91371937434SJasvinder Singh 
91471937434SJasvinder Singh 		if (parser_read_uint32(&p.fltr.key_offset, tokens[t0 + 3]) != 0) {
91571937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
91671937434SJasvinder Singh 			return;
91771937434SJasvinder Singh 		}
91871937434SJasvinder Singh 
91971937434SJasvinder Singh 		if (strcmp(tokens[t0 + 4], "mask") != 0) {
92071937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
92171937434SJasvinder Singh 			return;
92271937434SJasvinder Singh 		}
92371937434SJasvinder Singh 
92471937434SJasvinder Singh 		size = RTE_PORT_IN_ACTION_FLTR_KEY_SIZE;
92571937434SJasvinder Singh 		if ((parse_hex_string(tokens[t0 + 5], p.fltr.key_mask, &size) != 0) ||
92671937434SJasvinder Singh 			(size != RTE_PORT_IN_ACTION_FLTR_KEY_SIZE)) {
92771937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
92871937434SJasvinder Singh 			return;
92971937434SJasvinder Singh 		}
93071937434SJasvinder Singh 
93171937434SJasvinder Singh 		if (strcmp(tokens[t0 + 6], "key") != 0) {
93271937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "key");
93371937434SJasvinder Singh 			return;
93471937434SJasvinder Singh 		}
93571937434SJasvinder Singh 
93671937434SJasvinder Singh 		size = RTE_PORT_IN_ACTION_FLTR_KEY_SIZE;
93771937434SJasvinder Singh 		if ((parse_hex_string(tokens[t0 + 7], p.fltr.key, &size) != 0) ||
93871937434SJasvinder Singh 			(size != RTE_PORT_IN_ACTION_FLTR_KEY_SIZE)) {
93971937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_value");
94071937434SJasvinder Singh 			return;
94171937434SJasvinder Singh 		}
94271937434SJasvinder Singh 
94371937434SJasvinder Singh 		if (strcmp(tokens[t0 + 8], "port") != 0) {
94471937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
94571937434SJasvinder Singh 			return;
94671937434SJasvinder Singh 		}
94771937434SJasvinder Singh 
94871937434SJasvinder Singh 		if (parser_read_uint32(&p.fltr.port_id, tokens[t0 + 9]) != 0) {
94971937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
95071937434SJasvinder Singh 			return;
95171937434SJasvinder Singh 		}
95271937434SJasvinder Singh 
95371937434SJasvinder Singh 		p.action_mask |= 1LLU << RTE_PORT_IN_ACTION_FLTR;
95471937434SJasvinder Singh 		t0 += 10;
95571937434SJasvinder Singh 	} /* filter */
95671937434SJasvinder Singh 
95771937434SJasvinder Singh 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "balance") == 0)) {
95871937434SJasvinder Singh 		uint32_t i;
95971937434SJasvinder Singh 
96071937434SJasvinder Singh 		if (n_tokens < t0 + 22) {
961802755dcSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
962802755dcSJasvinder Singh 				"port in action profile balance");
96371937434SJasvinder Singh 			return;
96471937434SJasvinder Singh 		}
96571937434SJasvinder Singh 
96671937434SJasvinder Singh 		if (strcmp(tokens[t0 + 1], "offset") != 0) {
96771937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
96871937434SJasvinder Singh 			return;
96971937434SJasvinder Singh 		}
97071937434SJasvinder Singh 
97171937434SJasvinder Singh 		if (parser_read_uint32(&p.lb.key_offset, tokens[t0 + 2]) != 0) {
97271937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
97371937434SJasvinder Singh 			return;
97471937434SJasvinder Singh 		}
97571937434SJasvinder Singh 
97671937434SJasvinder Singh 		if (strcmp(tokens[t0 + 3], "mask") != 0) {
97771937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
97871937434SJasvinder Singh 			return;
97971937434SJasvinder Singh 		}
98071937434SJasvinder Singh 
98171937434SJasvinder Singh 		p.lb.key_size = RTE_PORT_IN_ACTION_LB_KEY_SIZE_MAX;
98271937434SJasvinder Singh 		if (parse_hex_string(tokens[t0 + 4], p.lb.key_mask, &p.lb.key_size) != 0) {
98371937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
98471937434SJasvinder Singh 			return;
98571937434SJasvinder Singh 		}
98671937434SJasvinder Singh 
98771937434SJasvinder Singh 		if (strcmp(tokens[t0 + 5], "port") != 0) {
98871937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
98971937434SJasvinder Singh 			return;
99071937434SJasvinder Singh 		}
99171937434SJasvinder Singh 
99271937434SJasvinder Singh 		for (i = 0; i < 16; i++)
99371937434SJasvinder Singh 			if (parser_read_uint32(&p.lb.port_id[i], tokens[t0 + 6 + i]) != 0) {
99471937434SJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
99571937434SJasvinder Singh 				return;
99671937434SJasvinder Singh 			}
99771937434SJasvinder Singh 
99871937434SJasvinder Singh 		p.action_mask |= 1LLU << RTE_PORT_IN_ACTION_LB;
99971937434SJasvinder Singh 		t0 += 22;
100071937434SJasvinder Singh 	} /* balance */
100171937434SJasvinder Singh 
100271937434SJasvinder Singh 	if (t0 < n_tokens) {
100371937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
100471937434SJasvinder Singh 		return;
100571937434SJasvinder Singh 	}
100671937434SJasvinder Singh 
100771937434SJasvinder Singh 	ap = port_in_action_profile_create(name, &p);
100871937434SJasvinder Singh 	if (ap == NULL) {
100971937434SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
101071937434SJasvinder Singh 		return;
101171937434SJasvinder Singh 	}
101271937434SJasvinder Singh }
101371937434SJasvinder Singh 
101426b3effeSKevin Laatz 
101526b3effeSKevin Laatz static const char cmd_table_action_profile_help[] =
101626b3effeSKevin Laatz "table action profile <profile_name>\n"
101726b3effeSKevin Laatz "   ipv4 | ipv6\n"
101826b3effeSKevin Laatz "   offset <ip_offset>\n"
101926b3effeSKevin Laatz "   fwd\n"
102026b3effeSKevin Laatz "   [balance offset <key_offset> mask <key_mask> outoffset <out_offset>]\n"
102126b3effeSKevin Laatz "   [meter srtcm | trtcm\n"
102226b3effeSKevin Laatz "       tc <n_tc>\n"
102326b3effeSKevin Laatz "       stats none | pkts | bytes | both]\n"
102426b3effeSKevin Laatz "   [tm spp <n_subports_per_port> pps <n_pipes_per_subport>]\n"
102544cad685SCristian Dumitrescu "   [encap ether | vlan | qinq | mpls | pppoe |\n"
102644cad685SCristian Dumitrescu "       vxlan offset <ether_offset> ipv4 | ipv6 vlan on | off]\n"
102726b3effeSKevin Laatz "   [nat src | dst\n"
102826b3effeSKevin Laatz "       proto udp | tcp]\n"
102926b3effeSKevin Laatz "   [ttl drop | fwd\n"
103026b3effeSKevin Laatz "       stats none | pkts]\n"
103126b3effeSKevin Laatz "   [stats pkts | bytes | both]\n"
10321edccebcSFan Zhang "   [time]\n"
10331edccebcSFan Zhang "   [sym_crypto dev <CRYPTODEV_NAME> offset <op_offset> "
10341edccebcSFan Zhang "       mempool_create <mempool_name>\n"
10351bdf2632SCristian Dumitrescu "       mempool_init <mempool_name>]\n"
1036*d5ed626fSCristian Dumitrescu "   [tag]\n"
1037*d5ed626fSCristian Dumitrescu "   [decap]\n";
103826b3effeSKevin Laatz 
103971937434SJasvinder Singh static void
104071937434SJasvinder Singh cmd_table_action_profile(char **tokens,
104171937434SJasvinder Singh 	uint32_t n_tokens,
104271937434SJasvinder Singh 	char *out,
104371937434SJasvinder Singh 	size_t out_size)
104471937434SJasvinder Singh {
104571937434SJasvinder Singh 	struct table_action_profile_params p;
104671937434SJasvinder Singh 	struct table_action_profile *ap;
104771937434SJasvinder Singh 	char *name;
104871937434SJasvinder Singh 	uint32_t t0;
104971937434SJasvinder Singh 
105071937434SJasvinder Singh 	memset(&p, 0, sizeof(p));
105171937434SJasvinder Singh 
105271937434SJasvinder Singh 	if (n_tokens < 8) {
105371937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
105471937434SJasvinder Singh 		return;
105571937434SJasvinder Singh 	}
105671937434SJasvinder Singh 
105771937434SJasvinder Singh 	if (strcmp(tokens[1], "action") != 0) {
105871937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "action");
105971937434SJasvinder Singh 		return;
106071937434SJasvinder Singh 	}
106171937434SJasvinder Singh 
106271937434SJasvinder Singh 	if (strcmp(tokens[2], "profile") != 0) {
106371937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
106471937434SJasvinder Singh 		return;
106571937434SJasvinder Singh 	}
106671937434SJasvinder Singh 
106771937434SJasvinder Singh 	name = tokens[3];
106871937434SJasvinder Singh 
106971937434SJasvinder Singh 	if (strcmp(tokens[4], "ipv4") == 0)
107071937434SJasvinder Singh 		p.common.ip_version = 1;
107171937434SJasvinder Singh 	else if (strcmp(tokens[4], "ipv6") == 0)
107271937434SJasvinder Singh 		p.common.ip_version = 0;
107371937434SJasvinder Singh 	else {
107471937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "ipv4 or ipv6");
107571937434SJasvinder Singh 		return;
107671937434SJasvinder Singh 	}
107771937434SJasvinder Singh 
107871937434SJasvinder Singh 	if (strcmp(tokens[5], "offset") != 0) {
107971937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
108071937434SJasvinder Singh 		return;
108171937434SJasvinder Singh 	}
108271937434SJasvinder Singh 
108371937434SJasvinder Singh 	if (parser_read_uint32(&p.common.ip_offset, tokens[6]) != 0) {
108471937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "ip_offset");
108571937434SJasvinder Singh 		return;
108671937434SJasvinder Singh 	}
108771937434SJasvinder Singh 
108871937434SJasvinder Singh 	if (strcmp(tokens[7], "fwd") != 0) {
108971937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "fwd");
109071937434SJasvinder Singh 		return;
109171937434SJasvinder Singh 	}
109271937434SJasvinder Singh 
109371937434SJasvinder Singh 	p.action_mask |= 1LLU << RTE_TABLE_ACTION_FWD;
109471937434SJasvinder Singh 
109571937434SJasvinder Singh 	t0 = 8;
1096802755dcSJasvinder Singh 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "balance") == 0)) {
1097802755dcSJasvinder Singh 		if (n_tokens < t0 + 7) {
1098802755dcSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, "table action profile balance");
1099802755dcSJasvinder Singh 			return;
1100802755dcSJasvinder Singh 		}
1101802755dcSJasvinder Singh 
1102802755dcSJasvinder Singh 		if (strcmp(tokens[t0 + 1], "offset") != 0) {
1103802755dcSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
1104802755dcSJasvinder Singh 			return;
1105802755dcSJasvinder Singh 		}
1106802755dcSJasvinder Singh 
1107802755dcSJasvinder Singh 		if (parser_read_uint32(&p.lb.key_offset, tokens[t0 + 2]) != 0) {
1108802755dcSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
1109802755dcSJasvinder Singh 			return;
1110802755dcSJasvinder Singh 		}
1111802755dcSJasvinder Singh 
1112802755dcSJasvinder Singh 		if (strcmp(tokens[t0 + 3], "mask") != 0) {
1113802755dcSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
1114802755dcSJasvinder Singh 			return;
1115802755dcSJasvinder Singh 		}
1116802755dcSJasvinder Singh 
1117802755dcSJasvinder Singh 		p.lb.key_size = RTE_PORT_IN_ACTION_LB_KEY_SIZE_MAX;
1118802755dcSJasvinder Singh 		if (parse_hex_string(tokens[t0 + 4], p.lb.key_mask, &p.lb.key_size) != 0) {
1119802755dcSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
1120802755dcSJasvinder Singh 			return;
1121802755dcSJasvinder Singh 		}
1122802755dcSJasvinder Singh 
1123802755dcSJasvinder Singh 		if (strcmp(tokens[t0 + 5], "outoffset") != 0) {
1124802755dcSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "outoffset");
1125802755dcSJasvinder Singh 			return;
1126802755dcSJasvinder Singh 		}
1127802755dcSJasvinder Singh 
1128802755dcSJasvinder Singh 		if (parser_read_uint32(&p.lb.out_offset, tokens[t0 + 6]) != 0) {
1129802755dcSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "out_offset");
1130802755dcSJasvinder Singh 			return;
1131802755dcSJasvinder Singh 		}
1132802755dcSJasvinder Singh 
1133802755dcSJasvinder Singh 		p.action_mask |= 1LLU << RTE_TABLE_ACTION_LB;
1134802755dcSJasvinder Singh 		t0 += 7;
1135802755dcSJasvinder Singh 	} /* balance */
1136802755dcSJasvinder Singh 
113771937434SJasvinder Singh 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "meter") == 0)) {
113871937434SJasvinder Singh 		if (n_tokens < t0 + 6) {
113971937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
114071937434SJasvinder Singh 				"table action profile meter");
114171937434SJasvinder Singh 			return;
114271937434SJasvinder Singh 		}
114371937434SJasvinder Singh 
114471937434SJasvinder Singh 		if (strcmp(tokens[t0 + 1], "srtcm") == 0)
114571937434SJasvinder Singh 			p.mtr.alg = RTE_TABLE_ACTION_METER_SRTCM;
114671937434SJasvinder Singh 		else if (strcmp(tokens[t0 + 1], "trtcm") == 0)
114771937434SJasvinder Singh 			p.mtr.alg = RTE_TABLE_ACTION_METER_TRTCM;
114871937434SJasvinder Singh 		else {
114971937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
115071937434SJasvinder Singh 				"srtcm or trtcm");
115171937434SJasvinder Singh 			return;
115271937434SJasvinder Singh 		}
115371937434SJasvinder Singh 
115471937434SJasvinder Singh 		if (strcmp(tokens[t0 + 2], "tc") != 0) {
115571937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc");
115671937434SJasvinder Singh 			return;
115771937434SJasvinder Singh 		}
115871937434SJasvinder Singh 
115971937434SJasvinder Singh 		if (parser_read_uint32(&p.mtr.n_tc, tokens[t0 + 3]) != 0) {
116071937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "n_tc");
116171937434SJasvinder Singh 			return;
116271937434SJasvinder Singh 		}
116371937434SJasvinder Singh 
116471937434SJasvinder Singh 		if (strcmp(tokens[t0 + 4], "stats") != 0) {
116571937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
116671937434SJasvinder Singh 			return;
116771937434SJasvinder Singh 		}
116871937434SJasvinder Singh 
116971937434SJasvinder Singh 		if (strcmp(tokens[t0 + 5], "none") == 0) {
117071937434SJasvinder Singh 			p.mtr.n_packets_enabled = 0;
117171937434SJasvinder Singh 			p.mtr.n_bytes_enabled = 0;
117271937434SJasvinder Singh 		} else if (strcmp(tokens[t0 + 5], "pkts") == 0) {
117371937434SJasvinder Singh 			p.mtr.n_packets_enabled = 1;
117471937434SJasvinder Singh 			p.mtr.n_bytes_enabled = 0;
117571937434SJasvinder Singh 		} else if (strcmp(tokens[t0 + 5], "bytes") == 0) {
117671937434SJasvinder Singh 			p.mtr.n_packets_enabled = 0;
117771937434SJasvinder Singh 			p.mtr.n_bytes_enabled = 1;
117871937434SJasvinder Singh 		} else if (strcmp(tokens[t0 + 5], "both") == 0) {
117971937434SJasvinder Singh 			p.mtr.n_packets_enabled = 1;
118071937434SJasvinder Singh 			p.mtr.n_bytes_enabled = 1;
118171937434SJasvinder Singh 		} else {
118271937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
118371937434SJasvinder Singh 				"none or pkts or bytes or both");
118471937434SJasvinder Singh 			return;
118571937434SJasvinder Singh 		}
118671937434SJasvinder Singh 
118771937434SJasvinder Singh 		p.action_mask |= 1LLU << RTE_TABLE_ACTION_MTR;
118871937434SJasvinder Singh 		t0 += 6;
118971937434SJasvinder Singh 	} /* meter */
119071937434SJasvinder Singh 
119171937434SJasvinder Singh 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "tm") == 0)) {
119271937434SJasvinder Singh 		if (n_tokens < t0 + 5) {
119371937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
119471937434SJasvinder Singh 				"table action profile tm");
119571937434SJasvinder Singh 			return;
119671937434SJasvinder Singh 		}
119771937434SJasvinder Singh 
119871937434SJasvinder Singh 		if (strcmp(tokens[t0 + 1], "spp") != 0) {
119971937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "spp");
120071937434SJasvinder Singh 			return;
120171937434SJasvinder Singh 		}
120271937434SJasvinder Singh 
120371937434SJasvinder Singh 		if (parser_read_uint32(&p.tm.n_subports_per_port,
120471937434SJasvinder Singh 			tokens[t0 + 2]) != 0) {
120571937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
120671937434SJasvinder Singh 				"n_subports_per_port");
120771937434SJasvinder Singh 			return;
120871937434SJasvinder Singh 		}
120971937434SJasvinder Singh 
121071937434SJasvinder Singh 		if (strcmp(tokens[t0 + 3], "pps") != 0) {
121171937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pps");
121271937434SJasvinder Singh 			return;
121371937434SJasvinder Singh 		}
121471937434SJasvinder Singh 
121571937434SJasvinder Singh 		if (parser_read_uint32(&p.tm.n_pipes_per_subport,
121671937434SJasvinder Singh 			tokens[t0 + 4]) != 0) {
121771937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
121871937434SJasvinder Singh 				"n_pipes_per_subport");
121971937434SJasvinder Singh 			return;
122071937434SJasvinder Singh 		}
122171937434SJasvinder Singh 
122271937434SJasvinder Singh 		p.action_mask |= 1LLU << RTE_TABLE_ACTION_TM;
122371937434SJasvinder Singh 		t0 += 5;
122471937434SJasvinder Singh 	} /* tm */
122571937434SJasvinder Singh 
122671937434SJasvinder Singh 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "encap") == 0)) {
122744cad685SCristian Dumitrescu 		uint32_t n_extra_tokens = 0;
122844cad685SCristian Dumitrescu 
122971937434SJasvinder Singh 		if (n_tokens < t0 + 2) {
123071937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
123171937434SJasvinder Singh 				"action profile encap");
123271937434SJasvinder Singh 			return;
123371937434SJasvinder Singh 		}
123471937434SJasvinder Singh 
123571937434SJasvinder Singh 		if (strcmp(tokens[t0 + 1], "ether") == 0)
123671937434SJasvinder Singh 			p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_ETHER;
123771937434SJasvinder Singh 		else if (strcmp(tokens[t0 + 1], "vlan") == 0)
123871937434SJasvinder Singh 			p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_VLAN;
123971937434SJasvinder Singh 		else if (strcmp(tokens[t0 + 1], "qinq") == 0)
124071937434SJasvinder Singh 			p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_QINQ;
124171937434SJasvinder Singh 		else if (strcmp(tokens[t0 + 1], "mpls") == 0)
124271937434SJasvinder Singh 			p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_MPLS;
124371937434SJasvinder Singh 		else if (strcmp(tokens[t0 + 1], "pppoe") == 0)
124471937434SJasvinder Singh 			p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_PPPOE;
124544cad685SCristian Dumitrescu 		else if (strcmp(tokens[t0 + 1], "vxlan") == 0) {
124644cad685SCristian Dumitrescu 			if (n_tokens < t0 + 2 + 5) {
124744cad685SCristian Dumitrescu 				snprintf(out, out_size, MSG_ARG_MISMATCH,
124844cad685SCristian Dumitrescu 					"action profile encap vxlan");
124944cad685SCristian Dumitrescu 				return;
125044cad685SCristian Dumitrescu 			}
125144cad685SCristian Dumitrescu 
125244cad685SCristian Dumitrescu 			if (strcmp(tokens[t0 + 2], "offset") != 0) {
125344cad685SCristian Dumitrescu 				snprintf(out, out_size, MSG_ARG_NOT_FOUND,
125444cad685SCristian Dumitrescu 					"vxlan: offset");
125544cad685SCristian Dumitrescu 				return;
125644cad685SCristian Dumitrescu 			}
125744cad685SCristian Dumitrescu 
125844cad685SCristian Dumitrescu 			if (parser_read_uint32(&p.encap.vxlan.data_offset,
125944cad685SCristian Dumitrescu 				tokens[t0 + 2 + 1]) != 0) {
126044cad685SCristian Dumitrescu 				snprintf(out, out_size, MSG_ARG_INVALID,
126144cad685SCristian Dumitrescu 					"vxlan: ether_offset");
126244cad685SCristian Dumitrescu 				return;
126344cad685SCristian Dumitrescu 			}
126444cad685SCristian Dumitrescu 
126544cad685SCristian Dumitrescu 			if (strcmp(tokens[t0 + 2 + 2], "ipv4") == 0)
126644cad685SCristian Dumitrescu 				p.encap.vxlan.ip_version = 1;
126744cad685SCristian Dumitrescu 			else if (strcmp(tokens[t0 + 2 + 2], "ipv6") == 0)
126844cad685SCristian Dumitrescu 				p.encap.vxlan.ip_version = 0;
126971937434SJasvinder Singh 			else {
127044cad685SCristian Dumitrescu 				snprintf(out, out_size, MSG_ARG_INVALID,
127144cad685SCristian Dumitrescu 					"vxlan: ipv4 or ipv6");
127244cad685SCristian Dumitrescu 				return;
127344cad685SCristian Dumitrescu 			}
127444cad685SCristian Dumitrescu 
127544cad685SCristian Dumitrescu 			if (strcmp(tokens[t0 + 2 + 3], "vlan") != 0) {
127644cad685SCristian Dumitrescu 				snprintf(out, out_size, MSG_ARG_NOT_FOUND,
127744cad685SCristian Dumitrescu 					"vxlan: vlan");
127844cad685SCristian Dumitrescu 				return;
127944cad685SCristian Dumitrescu 			}
128044cad685SCristian Dumitrescu 
128144cad685SCristian Dumitrescu 			if (strcmp(tokens[t0 + 2 + 4], "on") == 0)
128244cad685SCristian Dumitrescu 				p.encap.vxlan.vlan = 1;
128344cad685SCristian Dumitrescu 			else if (strcmp(tokens[t0 + 2 + 4], "off") == 0)
128444cad685SCristian Dumitrescu 				p.encap.vxlan.vlan = 0;
128544cad685SCristian Dumitrescu 			else {
128644cad685SCristian Dumitrescu 				snprintf(out, out_size, MSG_ARG_INVALID,
128744cad685SCristian Dumitrescu 					"vxlan: on or off");
128844cad685SCristian Dumitrescu 				return;
128944cad685SCristian Dumitrescu 			}
129044cad685SCristian Dumitrescu 
129144cad685SCristian Dumitrescu 			p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_VXLAN;
129244cad685SCristian Dumitrescu 			n_extra_tokens = 5;
129344cad685SCristian Dumitrescu 		} else {
129471937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, "encap");
129571937434SJasvinder Singh 			return;
129671937434SJasvinder Singh 		}
129771937434SJasvinder Singh 
129871937434SJasvinder Singh 		p.action_mask |= 1LLU << RTE_TABLE_ACTION_ENCAP;
129944cad685SCristian Dumitrescu 		t0 += 2 + n_extra_tokens;
130071937434SJasvinder Singh 	} /* encap */
130171937434SJasvinder Singh 
130271937434SJasvinder Singh 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "nat") == 0)) {
130371937434SJasvinder Singh 		if (n_tokens < t0 + 4) {
130471937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
130571937434SJasvinder Singh 				"table action profile nat");
130671937434SJasvinder Singh 			return;
130771937434SJasvinder Singh 		}
130871937434SJasvinder Singh 
130971937434SJasvinder Singh 		if (strcmp(tokens[t0 + 1], "src") == 0)
131071937434SJasvinder Singh 			p.nat.source_nat = 1;
131171937434SJasvinder Singh 		else if (strcmp(tokens[t0 + 1], "dst") == 0)
131271937434SJasvinder Singh 			p.nat.source_nat = 0;
131371937434SJasvinder Singh 		else {
131471937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
131571937434SJasvinder Singh 				"src or dst");
131671937434SJasvinder Singh 			return;
131771937434SJasvinder Singh 		}
131871937434SJasvinder Singh 
131971937434SJasvinder Singh 		if (strcmp(tokens[t0 + 2], "proto") != 0) {
132071937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "proto");
132171937434SJasvinder Singh 			return;
132271937434SJasvinder Singh 		}
132371937434SJasvinder Singh 
132471937434SJasvinder Singh 		if (strcmp(tokens[t0 + 3], "tcp") == 0)
132571937434SJasvinder Singh 			p.nat.proto = 0x06;
132671937434SJasvinder Singh 		else if (strcmp(tokens[t0 + 3], "udp") == 0)
132771937434SJasvinder Singh 			p.nat.proto = 0x11;
132871937434SJasvinder Singh 		else {
132971937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
133071937434SJasvinder Singh 				"tcp or udp");
133171937434SJasvinder Singh 			return;
133271937434SJasvinder Singh 		}
133371937434SJasvinder Singh 
133471937434SJasvinder Singh 		p.action_mask |= 1LLU << RTE_TABLE_ACTION_NAT;
133571937434SJasvinder Singh 		t0 += 4;
133671937434SJasvinder Singh 	} /* nat */
133771937434SJasvinder Singh 
133871937434SJasvinder Singh 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "ttl") == 0)) {
133971937434SJasvinder Singh 		if (n_tokens < t0 + 4) {
134071937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
134171937434SJasvinder Singh 				"table action profile ttl");
134271937434SJasvinder Singh 			return;
134371937434SJasvinder Singh 		}
134471937434SJasvinder Singh 
134571937434SJasvinder Singh 		if (strcmp(tokens[t0 + 1], "drop") == 0)
134671937434SJasvinder Singh 			p.ttl.drop = 1;
134771937434SJasvinder Singh 		else if (strcmp(tokens[t0 + 1], "fwd") == 0)
134871937434SJasvinder Singh 			p.ttl.drop = 0;
134971937434SJasvinder Singh 		else {
135071937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
135171937434SJasvinder Singh 				"drop or fwd");
135271937434SJasvinder Singh 			return;
135371937434SJasvinder Singh 		}
135471937434SJasvinder Singh 
135571937434SJasvinder Singh 		if (strcmp(tokens[t0 + 2], "stats") != 0) {
135671937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
135771937434SJasvinder Singh 			return;
135871937434SJasvinder Singh 		}
135971937434SJasvinder Singh 
136071937434SJasvinder Singh 		if (strcmp(tokens[t0 + 3], "none") == 0)
136171937434SJasvinder Singh 			p.ttl.n_packets_enabled = 0;
136271937434SJasvinder Singh 		else if (strcmp(tokens[t0 + 3], "pkts") == 0)
136371937434SJasvinder Singh 			p.ttl.n_packets_enabled = 1;
136471937434SJasvinder Singh 		else {
136571937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
136671937434SJasvinder Singh 				"none or pkts");
136771937434SJasvinder Singh 			return;
136871937434SJasvinder Singh 		}
136971937434SJasvinder Singh 
137071937434SJasvinder Singh 		p.action_mask |= 1LLU << RTE_TABLE_ACTION_TTL;
137171937434SJasvinder Singh 		t0 += 4;
137271937434SJasvinder Singh 	} /* ttl */
137371937434SJasvinder Singh 
137471937434SJasvinder Singh 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "stats") == 0)) {
137571937434SJasvinder Singh 		if (n_tokens < t0 + 2) {
137671937434SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
137771937434SJasvinder Singh 				"table action profile stats");
137871937434SJasvinder Singh 			return;
137971937434SJasvinder Singh 		}
138071937434SJasvinder Singh 
138171937434SJasvinder Singh 		if (strcmp(tokens[t0 + 1], "pkts") == 0) {
138271937434SJasvinder Singh 			p.stats.n_packets_enabled = 1;
138371937434SJasvinder Singh 			p.stats.n_bytes_enabled = 0;
138471937434SJasvinder Singh 		} else if (strcmp(tokens[t0 + 1], "bytes") == 0) {
138571937434SJasvinder Singh 			p.stats.n_packets_enabled = 0;
138671937434SJasvinder Singh 			p.stats.n_bytes_enabled = 1;
138771937434SJasvinder Singh 		} else if (strcmp(tokens[t0 + 1], "both") == 0) {
138871937434SJasvinder Singh 			p.stats.n_packets_enabled = 1;
138971937434SJasvinder Singh 			p.stats.n_bytes_enabled = 1;
139071937434SJasvinder Singh 		} else {
139171937434SJasvinder Singh 			snprintf(out, out_size,	MSG_ARG_NOT_FOUND,
139271937434SJasvinder Singh 				"pkts or bytes or both");
139371937434SJasvinder Singh 			return;
139471937434SJasvinder Singh 		}
139571937434SJasvinder Singh 
139671937434SJasvinder Singh 		p.action_mask |= 1LLU << RTE_TABLE_ACTION_STATS;
139771937434SJasvinder Singh 		t0 += 2;
139871937434SJasvinder Singh 	} /* stats */
139971937434SJasvinder Singh 
140071937434SJasvinder Singh 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "time") == 0)) {
140171937434SJasvinder Singh 		p.action_mask |= 1LLU << RTE_TABLE_ACTION_TIME;
140271937434SJasvinder Singh 		t0 += 1;
140371937434SJasvinder Singh 	} /* time */
140471937434SJasvinder Singh 
14051edccebcSFan Zhang 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "sym_crypto") == 0)) {
14061edccebcSFan Zhang 		struct cryptodev *cryptodev;
14071edccebcSFan Zhang 		struct mempool *mempool;
14081edccebcSFan Zhang 
14091edccebcSFan Zhang 		if (n_tokens < t0 + 9 ||
14101edccebcSFan Zhang 				strcmp(tokens[t0 + 1], "dev") ||
14111edccebcSFan Zhang 				strcmp(tokens[t0 + 3], "offset") ||
14121edccebcSFan Zhang 				strcmp(tokens[t0 + 5], "mempool_create") ||
14131edccebcSFan Zhang 				strcmp(tokens[t0 + 7], "mempool_init")) {
14141edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_MISMATCH,
14151edccebcSFan Zhang 				"table action profile sym_crypto");
14161edccebcSFan Zhang 			return;
14171edccebcSFan Zhang 		}
14181edccebcSFan Zhang 
14191edccebcSFan Zhang 		cryptodev = cryptodev_find(tokens[t0 + 2]);
14201edccebcSFan Zhang 		if (cryptodev == NULL) {
14211edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_INVALID,
14221edccebcSFan Zhang 				"table action profile sym_crypto");
14231edccebcSFan Zhang 			return;
14241edccebcSFan Zhang 		}
14251edccebcSFan Zhang 
14261edccebcSFan Zhang 		p.sym_crypto.cryptodev_id = cryptodev->dev_id;
14271edccebcSFan Zhang 
14281edccebcSFan Zhang 		if (parser_read_uint32(&p.sym_crypto.op_offset,
14291edccebcSFan Zhang 				tokens[t0 + 4]) != 0) {
14301edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_INVALID,
14311edccebcSFan Zhang 					"table action profile sym_crypto");
14321edccebcSFan Zhang 			return;
14331edccebcSFan Zhang 		}
14341edccebcSFan Zhang 
14351edccebcSFan Zhang 		mempool = mempool_find(tokens[t0 + 6]);
14361edccebcSFan Zhang 		if (mempool == NULL) {
14371edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_INVALID,
14381edccebcSFan Zhang 				"table action profile sym_crypto");
14391edccebcSFan Zhang 			return;
14401edccebcSFan Zhang 		}
14411edccebcSFan Zhang 		p.sym_crypto.mp_create = mempool->m;
14421edccebcSFan Zhang 
14431edccebcSFan Zhang 		mempool = mempool_find(tokens[t0 + 8]);
14441edccebcSFan Zhang 		if (mempool == NULL) {
14451edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_INVALID,
14461edccebcSFan Zhang 				"table action profile sym_crypto");
14471edccebcSFan Zhang 			return;
14481edccebcSFan Zhang 		}
14491edccebcSFan Zhang 		p.sym_crypto.mp_init = mempool->m;
14501edccebcSFan Zhang 
14511edccebcSFan Zhang 		p.action_mask |= 1LLU << RTE_TABLE_ACTION_SYM_CRYPTO;
14521edccebcSFan Zhang 
14531edccebcSFan Zhang 		t0 += 9;
14541edccebcSFan Zhang 	} /* sym_crypto */
14551edccebcSFan Zhang 
14561bdf2632SCristian Dumitrescu 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "tag") == 0)) {
14571bdf2632SCristian Dumitrescu 		p.action_mask |= 1LLU << RTE_TABLE_ACTION_TAG;
14581bdf2632SCristian Dumitrescu 		t0 += 1;
14591bdf2632SCristian Dumitrescu 	} /* tag */
14601bdf2632SCristian Dumitrescu 
1461*d5ed626fSCristian Dumitrescu 	if ((t0 < n_tokens) && (strcmp(tokens[t0], "decap") == 0)) {
1462*d5ed626fSCristian Dumitrescu 		p.action_mask |= 1LLU << RTE_TABLE_ACTION_DECAP;
1463*d5ed626fSCristian Dumitrescu 		t0 += 1;
1464*d5ed626fSCristian Dumitrescu 	} /* decap */
1465*d5ed626fSCristian Dumitrescu 
146671937434SJasvinder Singh 	if (t0 < n_tokens) {
146771937434SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
146871937434SJasvinder Singh 		return;
146971937434SJasvinder Singh 	}
147071937434SJasvinder Singh 
147171937434SJasvinder Singh 	ap = table_action_profile_create(name, &p);
147271937434SJasvinder Singh 	if (ap == NULL) {
147371937434SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
147471937434SJasvinder Singh 		return;
147571937434SJasvinder Singh 	}
147671937434SJasvinder Singh }
147771937434SJasvinder Singh 
147826b3effeSKevin Laatz static const char cmd_pipeline_help[] =
147926b3effeSKevin Laatz "pipeline <pipeline_name>\n"
148026b3effeSKevin Laatz "   period <timer_period_ms>\n"
148126b3effeSKevin Laatz "   offset_port_id <offset_port_id>\n"
148226b3effeSKevin Laatz "   cpu <cpu_id>\n";
148326b3effeSKevin Laatz 
1484d75c371eSJasvinder Singh static void
1485d75c371eSJasvinder Singh cmd_pipeline(char **tokens,
1486d75c371eSJasvinder Singh 	uint32_t n_tokens,
1487d75c371eSJasvinder Singh 	char *out,
1488d75c371eSJasvinder Singh 	size_t out_size)
1489d75c371eSJasvinder Singh {
1490d75c371eSJasvinder Singh 	struct pipeline_params p;
1491d75c371eSJasvinder Singh 	char *name;
1492d75c371eSJasvinder Singh 	struct pipeline *pipeline;
1493d75c371eSJasvinder Singh 
1494d75c371eSJasvinder Singh 	if (n_tokens != 8) {
1495d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1496d75c371eSJasvinder Singh 		return;
1497d75c371eSJasvinder Singh 	}
1498d75c371eSJasvinder Singh 
1499d75c371eSJasvinder Singh 	name = tokens[1];
1500d75c371eSJasvinder Singh 
1501d75c371eSJasvinder Singh 	if (strcmp(tokens[2], "period") != 0) {
1502d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "period");
1503d75c371eSJasvinder Singh 		return;
1504d75c371eSJasvinder Singh 	}
1505d75c371eSJasvinder Singh 
1506d75c371eSJasvinder Singh 	if (parser_read_uint32(&p.timer_period_ms, tokens[3]) != 0) {
1507d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "timer_period_ms");
1508d75c371eSJasvinder Singh 		return;
1509d75c371eSJasvinder Singh 	}
1510d75c371eSJasvinder Singh 
1511d75c371eSJasvinder Singh 	if (strcmp(tokens[4], "offset_port_id") != 0) {
1512d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset_port_id");
1513d75c371eSJasvinder Singh 		return;
1514d75c371eSJasvinder Singh 	}
1515d75c371eSJasvinder Singh 
1516d75c371eSJasvinder Singh 	if (parser_read_uint32(&p.offset_port_id, tokens[5]) != 0) {
1517d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "offset_port_id");
1518d75c371eSJasvinder Singh 		return;
1519d75c371eSJasvinder Singh 	}
1520d75c371eSJasvinder Singh 
1521d75c371eSJasvinder Singh 	if (strcmp(tokens[6], "cpu") != 0) {
1522d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
1523d75c371eSJasvinder Singh 		return;
1524d75c371eSJasvinder Singh 	}
1525d75c371eSJasvinder Singh 
1526d75c371eSJasvinder Singh 	if (parser_read_uint32(&p.cpu_id, tokens[7]) != 0) {
1527d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
1528d75c371eSJasvinder Singh 		return;
1529d75c371eSJasvinder Singh 	}
1530d75c371eSJasvinder Singh 
1531d75c371eSJasvinder Singh 	pipeline = pipeline_create(name, &p);
1532d75c371eSJasvinder Singh 	if (pipeline == NULL) {
1533d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1534d75c371eSJasvinder Singh 		return;
1535d75c371eSJasvinder Singh 	}
1536d75c371eSJasvinder Singh }
1537d75c371eSJasvinder Singh 
153826b3effeSKevin Laatz static const char cmd_pipeline_port_in_help[] =
153926b3effeSKevin Laatz "pipeline <pipeline_name> port in\n"
154026b3effeSKevin Laatz "   bsz <burst_size>\n"
154126b3effeSKevin Laatz "   link <link_name> rxq <queue_id>\n"
154226b3effeSKevin Laatz "   | swq <swq_name>\n"
154326b3effeSKevin Laatz "   | tmgr <tmgr_name>\n"
154426b3effeSKevin Laatz "   | tap <tap_name> mempool <mempool_name> mtu <mtu>\n"
154526b3effeSKevin Laatz "   | kni <kni_name>\n"
154626b3effeSKevin Laatz "   | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>\n"
15471edccebcSFan Zhang "   | cryptodev <cryptodev_name> rxq <queue_id>\n"
154826b3effeSKevin Laatz "   [action <port_in_action_profile_name>]\n"
154926b3effeSKevin Laatz "   [disabled]\n";
155026b3effeSKevin Laatz 
1551d75c371eSJasvinder Singh static void
1552d75c371eSJasvinder Singh cmd_pipeline_port_in(char **tokens,
1553d75c371eSJasvinder Singh 	uint32_t n_tokens,
1554d75c371eSJasvinder Singh 	char *out,
1555d75c371eSJasvinder Singh 	size_t out_size)
1556d75c371eSJasvinder Singh {
1557d75c371eSJasvinder Singh 	struct port_in_params p;
1558d75c371eSJasvinder Singh 	char *pipeline_name;
1559d75c371eSJasvinder Singh 	uint32_t t0;
1560d75c371eSJasvinder Singh 	int enabled, status;
1561d75c371eSJasvinder Singh 
1562d75c371eSJasvinder Singh 	if (n_tokens < 7) {
1563d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1564d75c371eSJasvinder Singh 		return;
1565d75c371eSJasvinder Singh 	}
1566d75c371eSJasvinder Singh 
1567d75c371eSJasvinder Singh 	pipeline_name = tokens[1];
1568d75c371eSJasvinder Singh 
1569d75c371eSJasvinder Singh 	if (strcmp(tokens[2], "port") != 0) {
1570d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
1571d75c371eSJasvinder Singh 		return;
1572d75c371eSJasvinder Singh 	}
1573d75c371eSJasvinder Singh 
1574d75c371eSJasvinder Singh 	if (strcmp(tokens[3], "in") != 0) {
1575d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
1576d75c371eSJasvinder Singh 		return;
1577d75c371eSJasvinder Singh 	}
1578d75c371eSJasvinder Singh 
1579d75c371eSJasvinder Singh 	if (strcmp(tokens[4], "bsz") != 0) {
1580d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "bsz");
1581d75c371eSJasvinder Singh 		return;
1582d75c371eSJasvinder Singh 	}
1583d75c371eSJasvinder Singh 
1584d75c371eSJasvinder Singh 	if (parser_read_uint32(&p.burst_size, tokens[5]) != 0) {
1585d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "burst_size");
1586d75c371eSJasvinder Singh 		return;
1587d75c371eSJasvinder Singh 	}
1588d75c371eSJasvinder Singh 
1589d75c371eSJasvinder Singh 	t0 = 6;
1590d75c371eSJasvinder Singh 
1591d75c371eSJasvinder Singh 	if (strcmp(tokens[t0], "link") == 0) {
1592d75c371eSJasvinder Singh 		if (n_tokens < t0 + 4) {
1593d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1594d75c371eSJasvinder Singh 				"pipeline port in link");
1595d75c371eSJasvinder Singh 			return;
1596d75c371eSJasvinder Singh 		}
1597d75c371eSJasvinder Singh 
1598d75c371eSJasvinder Singh 		p.type = PORT_IN_RXQ;
1599d75c371eSJasvinder Singh 
1600d75c371eSJasvinder Singh 		p.dev_name = tokens[t0 + 1];
1601d75c371eSJasvinder Singh 
1602d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 2], "rxq") != 0) {
1603d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rxq");
1604d75c371eSJasvinder Singh 			return;
1605d75c371eSJasvinder Singh 		}
1606d75c371eSJasvinder Singh 
1607d75c371eSJasvinder Singh 		if (parser_read_uint16(&p.rxq.queue_id, tokens[t0 + 3]) != 0) {
1608d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
1609d75c371eSJasvinder Singh 				"queue_id");
1610d75c371eSJasvinder Singh 			return;
1611d75c371eSJasvinder Singh 		}
1612d75c371eSJasvinder Singh 		t0 += 4;
1613d75c371eSJasvinder Singh 	} else if (strcmp(tokens[t0], "swq") == 0) {
1614d75c371eSJasvinder Singh 		if (n_tokens < t0 + 2) {
1615d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1616d75c371eSJasvinder Singh 				"pipeline port in swq");
1617d75c371eSJasvinder Singh 			return;
1618d75c371eSJasvinder Singh 		}
1619d75c371eSJasvinder Singh 
1620d75c371eSJasvinder Singh 		p.type = PORT_IN_SWQ;
1621d75c371eSJasvinder Singh 
1622d75c371eSJasvinder Singh 		p.dev_name = tokens[t0 + 1];
1623d75c371eSJasvinder Singh 
1624d75c371eSJasvinder Singh 		t0 += 2;
1625d75c371eSJasvinder Singh 	} else if (strcmp(tokens[t0], "tmgr") == 0) {
1626d75c371eSJasvinder Singh 		if (n_tokens < t0 + 2) {
1627d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1628d75c371eSJasvinder Singh 				"pipeline port in tmgr");
1629d75c371eSJasvinder Singh 			return;
1630d75c371eSJasvinder Singh 		}
1631d75c371eSJasvinder Singh 
1632d75c371eSJasvinder Singh 		p.type = PORT_IN_TMGR;
1633d75c371eSJasvinder Singh 
1634d75c371eSJasvinder Singh 		p.dev_name = tokens[t0 + 1];
1635d75c371eSJasvinder Singh 
1636d75c371eSJasvinder Singh 		t0 += 2;
1637d75c371eSJasvinder Singh 	} else if (strcmp(tokens[t0], "tap") == 0) {
1638d75c371eSJasvinder Singh 		if (n_tokens < t0 + 6) {
1639d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1640d75c371eSJasvinder Singh 				"pipeline port in tap");
1641d75c371eSJasvinder Singh 			return;
1642d75c371eSJasvinder Singh 		}
1643d75c371eSJasvinder Singh 
1644d75c371eSJasvinder Singh 		p.type = PORT_IN_TAP;
1645d75c371eSJasvinder Singh 
1646d75c371eSJasvinder Singh 		p.dev_name = tokens[t0 + 1];
1647d75c371eSJasvinder Singh 
1648d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 2], "mempool") != 0) {
1649d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1650d75c371eSJasvinder Singh 				"mempool");
1651d75c371eSJasvinder Singh 			return;
1652d75c371eSJasvinder Singh 		}
1653d75c371eSJasvinder Singh 
1654d75c371eSJasvinder Singh 		p.tap.mempool_name = tokens[t0 + 3];
1655d75c371eSJasvinder Singh 
1656d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 4], "mtu") != 0) {
1657d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1658d75c371eSJasvinder Singh 				"mtu");
1659d75c371eSJasvinder Singh 			return;
1660d75c371eSJasvinder Singh 		}
1661d75c371eSJasvinder Singh 
1662d75c371eSJasvinder Singh 		if (parser_read_uint32(&p.tap.mtu, tokens[t0 + 5]) != 0) {
1663d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "mtu");
1664d75c371eSJasvinder Singh 			return;
1665d75c371eSJasvinder Singh 		}
1666d75c371eSJasvinder Singh 
1667d75c371eSJasvinder Singh 		t0 += 6;
1668d75c371eSJasvinder Singh 	} else if (strcmp(tokens[t0], "kni") == 0) {
1669d75c371eSJasvinder Singh 		if (n_tokens < t0 + 2) {
1670d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1671d75c371eSJasvinder Singh 				"pipeline port in kni");
1672d75c371eSJasvinder Singh 			return;
1673d75c371eSJasvinder Singh 		}
1674d75c371eSJasvinder Singh 
1675d75c371eSJasvinder Singh 		p.type = PORT_IN_KNI;
1676d75c371eSJasvinder Singh 
1677d75c371eSJasvinder Singh 		p.dev_name = tokens[t0 + 1];
1678d75c371eSJasvinder Singh 
1679d75c371eSJasvinder Singh 		t0 += 2;
1680d75c371eSJasvinder Singh 	} else if (strcmp(tokens[t0], "source") == 0) {
1681d75c371eSJasvinder Singh 		if (n_tokens < t0 + 6) {
1682d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1683d75c371eSJasvinder Singh 				"pipeline port in source");
1684d75c371eSJasvinder Singh 			return;
1685d75c371eSJasvinder Singh 		}
1686d75c371eSJasvinder Singh 
1687d75c371eSJasvinder Singh 		p.type = PORT_IN_SOURCE;
1688d75c371eSJasvinder Singh 
1689d75c371eSJasvinder Singh 		p.dev_name = NULL;
1690d75c371eSJasvinder Singh 
1691d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 1], "mempool") != 0) {
1692d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1693d75c371eSJasvinder Singh 				"mempool");
1694d75c371eSJasvinder Singh 			return;
1695d75c371eSJasvinder Singh 		}
1696d75c371eSJasvinder Singh 
1697d75c371eSJasvinder Singh 		p.source.mempool_name = tokens[t0 + 2];
1698d75c371eSJasvinder Singh 
1699d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 3], "file") != 0) {
1700d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1701d75c371eSJasvinder Singh 				"file");
1702d75c371eSJasvinder Singh 			return;
1703d75c371eSJasvinder Singh 		}
1704d75c371eSJasvinder Singh 
1705d75c371eSJasvinder Singh 		p.source.file_name = tokens[t0 + 4];
1706d75c371eSJasvinder Singh 
1707d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 5], "bpp") != 0) {
1708d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1709d75c371eSJasvinder Singh 				"bpp");
1710d75c371eSJasvinder Singh 			return;
1711d75c371eSJasvinder Singh 		}
1712d75c371eSJasvinder Singh 
1713d75c371eSJasvinder Singh 		if (parser_read_uint32(&p.source.n_bytes_per_pkt, tokens[t0 + 6]) != 0) {
1714d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
1715d75c371eSJasvinder Singh 				"n_bytes_per_pkt");
1716d75c371eSJasvinder Singh 			return;
1717d75c371eSJasvinder Singh 		}
1718d75c371eSJasvinder Singh 
1719d75c371eSJasvinder Singh 		t0 += 7;
17201edccebcSFan Zhang 	} else if (strcmp(tokens[t0], "cryptodev") == 0) {
17211edccebcSFan Zhang 		if (n_tokens < t0 + 3) {
17221edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_MISMATCH,
17231edccebcSFan Zhang 				"pipeline port in cryptodev");
17241edccebcSFan Zhang 			return;
17251edccebcSFan Zhang 		}
17261edccebcSFan Zhang 
17271edccebcSFan Zhang 		p.type = PORT_IN_CRYPTODEV;
17281edccebcSFan Zhang 
17291edccebcSFan Zhang 		p.dev_name = tokens[t0 + 1];
17301edccebcSFan Zhang 		if (parser_read_uint16(&p.rxq.queue_id, tokens[t0 + 3]) != 0) {
17311edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_INVALID,
17321edccebcSFan Zhang 				"rxq");
17331edccebcSFan Zhang 			return;
17341edccebcSFan Zhang 		}
17351edccebcSFan Zhang 
17361edccebcSFan Zhang 		p.cryptodev.arg_callback = NULL;
17371edccebcSFan Zhang 		p.cryptodev.f_callback = NULL;
17381edccebcSFan Zhang 
17391edccebcSFan Zhang 		t0 += 4;
1740d75c371eSJasvinder Singh 	} else {
1741d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
1742d75c371eSJasvinder Singh 		return;
1743d75c371eSJasvinder Singh 	}
1744d75c371eSJasvinder Singh 
1745d75c371eSJasvinder Singh 	p.action_profile_name = NULL;
1746d75c371eSJasvinder Singh 	if ((n_tokens > t0) && (strcmp(tokens[t0], "action") == 0)) {
1747d75c371eSJasvinder Singh 		if (n_tokens < t0 + 2) {
1748d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, "action");
1749d75c371eSJasvinder Singh 			return;
1750d75c371eSJasvinder Singh 		}
1751d75c371eSJasvinder Singh 
1752d75c371eSJasvinder Singh 		p.action_profile_name = tokens[t0 + 1];
1753d75c371eSJasvinder Singh 
1754d75c371eSJasvinder Singh 		t0 += 2;
1755d75c371eSJasvinder Singh 	}
1756d75c371eSJasvinder Singh 
1757d75c371eSJasvinder Singh 	enabled = 1;
1758d75c371eSJasvinder Singh 	if ((n_tokens > t0) &&
1759d75c371eSJasvinder Singh 		(strcmp(tokens[t0], "disabled") == 0)) {
1760d75c371eSJasvinder Singh 		enabled = 0;
1761d75c371eSJasvinder Singh 
1762d75c371eSJasvinder Singh 		t0 += 1;
1763d75c371eSJasvinder Singh 	}
1764d75c371eSJasvinder Singh 
1765d75c371eSJasvinder Singh 	if (n_tokens != t0) {
1766d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1767d75c371eSJasvinder Singh 		return;
1768d75c371eSJasvinder Singh 	}
1769d75c371eSJasvinder Singh 
1770d75c371eSJasvinder Singh 	status = pipeline_port_in_create(pipeline_name,
1771d75c371eSJasvinder Singh 		&p, enabled);
1772d75c371eSJasvinder Singh 	if (status) {
1773d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1774d75c371eSJasvinder Singh 		return;
1775d75c371eSJasvinder Singh 	}
1776d75c371eSJasvinder Singh }
1777d75c371eSJasvinder Singh 
177826b3effeSKevin Laatz static const char cmd_pipeline_port_out_help[] =
177926b3effeSKevin Laatz "pipeline <pipeline_name> port out\n"
178026b3effeSKevin Laatz "   bsz <burst_size>\n"
178126b3effeSKevin Laatz "   link <link_name> txq <txq_id>\n"
178226b3effeSKevin Laatz "   | swq <swq_name>\n"
178326b3effeSKevin Laatz "   | tmgr <tmgr_name>\n"
178426b3effeSKevin Laatz "   | tap <tap_name>\n"
178526b3effeSKevin Laatz "   | kni <kni_name>\n"
17861edccebcSFan Zhang "   | sink [file <file_name> pkts <max_n_pkts>]\n"
17871edccebcSFan Zhang "   | cryptodev <cryptodev_name> txq <txq_id> offset <crypto_op_offset>\n";
178826b3effeSKevin Laatz 
1789d75c371eSJasvinder Singh static void
1790d75c371eSJasvinder Singh cmd_pipeline_port_out(char **tokens,
1791d75c371eSJasvinder Singh 	uint32_t n_tokens,
1792d75c371eSJasvinder Singh 	char *out,
1793d75c371eSJasvinder Singh 	size_t out_size)
1794d75c371eSJasvinder Singh {
1795d75c371eSJasvinder Singh 	struct port_out_params p;
1796d75c371eSJasvinder Singh 	char *pipeline_name;
1797d75c371eSJasvinder Singh 	int status;
1798d75c371eSJasvinder Singh 
1799d75c371eSJasvinder Singh 	memset(&p, 0, sizeof(p));
1800d75c371eSJasvinder Singh 
1801d75c371eSJasvinder Singh 	if (n_tokens < 7) {
1802d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1803d75c371eSJasvinder Singh 		return;
1804d75c371eSJasvinder Singh 	}
1805d75c371eSJasvinder Singh 
1806d75c371eSJasvinder Singh 	pipeline_name = tokens[1];
1807d75c371eSJasvinder Singh 
1808d75c371eSJasvinder Singh 	if (strcmp(tokens[2], "port") != 0) {
1809d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
1810d75c371eSJasvinder Singh 		return;
1811d75c371eSJasvinder Singh 	}
1812d75c371eSJasvinder Singh 
1813d75c371eSJasvinder Singh 	if (strcmp(tokens[3], "out") != 0) {
1814d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "out");
1815d75c371eSJasvinder Singh 		return;
1816d75c371eSJasvinder Singh 	}
1817d75c371eSJasvinder Singh 
1818d75c371eSJasvinder Singh 	if (strcmp(tokens[4], "bsz") != 0) {
1819d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "bsz");
1820d75c371eSJasvinder Singh 		return;
1821d75c371eSJasvinder Singh 	}
1822d75c371eSJasvinder Singh 
1823d75c371eSJasvinder Singh 	if (parser_read_uint32(&p.burst_size, tokens[5]) != 0) {
1824d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "burst_size");
1825d75c371eSJasvinder Singh 		return;
1826d75c371eSJasvinder Singh 	}
1827d75c371eSJasvinder Singh 
1828d75c371eSJasvinder Singh 	if (strcmp(tokens[6], "link") == 0) {
1829d75c371eSJasvinder Singh 		if (n_tokens != 10) {
1830d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1831d75c371eSJasvinder Singh 				"pipeline port out link");
1832d75c371eSJasvinder Singh 			return;
1833d75c371eSJasvinder Singh 		}
1834d75c371eSJasvinder Singh 
1835d75c371eSJasvinder Singh 		p.type = PORT_OUT_TXQ;
1836d75c371eSJasvinder Singh 
1837d75c371eSJasvinder Singh 		p.dev_name = tokens[7];
1838d75c371eSJasvinder Singh 
1839d75c371eSJasvinder Singh 		if (strcmp(tokens[8], "txq") != 0) {
1840d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "txq");
1841d75c371eSJasvinder Singh 			return;
1842d75c371eSJasvinder Singh 		}
1843d75c371eSJasvinder Singh 
1844d75c371eSJasvinder Singh 		if (parser_read_uint16(&p.txq.queue_id, tokens[9]) != 0) {
1845d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "queue_id");
1846d75c371eSJasvinder Singh 			return;
1847d75c371eSJasvinder Singh 		}
1848d75c371eSJasvinder Singh 	} else if (strcmp(tokens[6], "swq") == 0) {
1849d75c371eSJasvinder Singh 		if (n_tokens != 8) {
1850d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1851d75c371eSJasvinder Singh 				"pipeline port out swq");
1852d75c371eSJasvinder Singh 			return;
1853d75c371eSJasvinder Singh 		}
1854d75c371eSJasvinder Singh 
1855d75c371eSJasvinder Singh 		p.type = PORT_OUT_SWQ;
1856d75c371eSJasvinder Singh 
1857d75c371eSJasvinder Singh 		p.dev_name = tokens[7];
1858d75c371eSJasvinder Singh 	} else if (strcmp(tokens[6], "tmgr") == 0) {
1859d75c371eSJasvinder Singh 		if (n_tokens != 8) {
1860d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1861d75c371eSJasvinder Singh 				"pipeline port out tmgr");
1862d75c371eSJasvinder Singh 			return;
1863d75c371eSJasvinder Singh 		}
1864d75c371eSJasvinder Singh 
1865d75c371eSJasvinder Singh 		p.type = PORT_OUT_TMGR;
1866d75c371eSJasvinder Singh 
1867d75c371eSJasvinder Singh 		p.dev_name = tokens[7];
1868d75c371eSJasvinder Singh 	} else if (strcmp(tokens[6], "tap") == 0) {
1869d75c371eSJasvinder Singh 		if (n_tokens != 8) {
1870d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1871d75c371eSJasvinder Singh 				"pipeline port out tap");
1872d75c371eSJasvinder Singh 			return;
1873d75c371eSJasvinder Singh 		}
1874d75c371eSJasvinder Singh 
1875d75c371eSJasvinder Singh 		p.type = PORT_OUT_TAP;
1876d75c371eSJasvinder Singh 
1877d75c371eSJasvinder Singh 		p.dev_name = tokens[7];
1878d75c371eSJasvinder Singh 	} else if (strcmp(tokens[6], "kni") == 0) {
1879d75c371eSJasvinder Singh 		if (n_tokens != 8) {
1880d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1881d75c371eSJasvinder Singh 				"pipeline port out kni");
1882d75c371eSJasvinder Singh 			return;
1883d75c371eSJasvinder Singh 		}
1884d75c371eSJasvinder Singh 
1885d75c371eSJasvinder Singh 		p.type = PORT_OUT_KNI;
1886d75c371eSJasvinder Singh 
1887d75c371eSJasvinder Singh 		p.dev_name = tokens[7];
1888d75c371eSJasvinder Singh 	} else if (strcmp(tokens[6], "sink") == 0) {
1889d75c371eSJasvinder Singh 		if ((n_tokens != 7) && (n_tokens != 11)) {
1890d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
1891d75c371eSJasvinder Singh 				"pipeline port out sink");
1892d75c371eSJasvinder Singh 			return;
1893d75c371eSJasvinder Singh 		}
1894d75c371eSJasvinder Singh 
1895d75c371eSJasvinder Singh 		p.type = PORT_OUT_SINK;
1896d75c371eSJasvinder Singh 
1897d75c371eSJasvinder Singh 		p.dev_name = NULL;
1898d75c371eSJasvinder Singh 
1899d75c371eSJasvinder Singh 		if (n_tokens == 7) {
1900d75c371eSJasvinder Singh 			p.sink.file_name = NULL;
1901d75c371eSJasvinder Singh 			p.sink.max_n_pkts = 0;
1902d75c371eSJasvinder Singh 		} else {
1903d75c371eSJasvinder Singh 			if (strcmp(tokens[7], "file") != 0) {
1904d75c371eSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1905d75c371eSJasvinder Singh 					"file");
1906d75c371eSJasvinder Singh 				return;
1907d75c371eSJasvinder Singh 			}
1908d75c371eSJasvinder Singh 
1909d75c371eSJasvinder Singh 			p.sink.file_name = tokens[8];
1910d75c371eSJasvinder Singh 
1911d75c371eSJasvinder Singh 			if (strcmp(tokens[9], "pkts") != 0) {
1912d75c371eSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pkts");
1913d75c371eSJasvinder Singh 				return;
1914d75c371eSJasvinder Singh 			}
1915d75c371eSJasvinder Singh 
1916d75c371eSJasvinder Singh 			if (parser_read_uint32(&p.sink.max_n_pkts, tokens[10]) != 0) {
1917d75c371eSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "max_n_pkts");
1918d75c371eSJasvinder Singh 				return;
1919d75c371eSJasvinder Singh 			}
1920d75c371eSJasvinder Singh 		}
19211edccebcSFan Zhang 
19221edccebcSFan Zhang 	} else if (strcmp(tokens[6], "cryptodev") == 0) {
19231edccebcSFan Zhang 		if (n_tokens != 12) {
19241edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_MISMATCH,
19251edccebcSFan Zhang 				"pipeline port out cryptodev");
19261edccebcSFan Zhang 			return;
19271edccebcSFan Zhang 		}
19281edccebcSFan Zhang 
19291edccebcSFan Zhang 		p.type = PORT_OUT_CRYPTODEV;
19301edccebcSFan Zhang 
19311edccebcSFan Zhang 		p.dev_name = tokens[7];
19321edccebcSFan Zhang 
19331edccebcSFan Zhang 		if (strcmp(tokens[8], "txq")) {
19341edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_MISMATCH,
19351edccebcSFan Zhang 				"pipeline port out cryptodev");
19361edccebcSFan Zhang 			return;
19371edccebcSFan Zhang 		}
19381edccebcSFan Zhang 
19391edccebcSFan Zhang 		if (parser_read_uint16(&p.cryptodev.queue_id, tokens[9])
19401edccebcSFan Zhang 				!= 0) {
19411edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_INVALID, "queue_id");
19421edccebcSFan Zhang 			return;
19431edccebcSFan Zhang 		}
19441edccebcSFan Zhang 
19451edccebcSFan Zhang 		if (strcmp(tokens[10], "offset")) {
19461edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_MISMATCH,
19471edccebcSFan Zhang 				"pipeline port out cryptodev");
19481edccebcSFan Zhang 			return;
19491edccebcSFan Zhang 		}
19501edccebcSFan Zhang 
19511edccebcSFan Zhang 		if (parser_read_uint32(&p.cryptodev.op_offset, tokens[11])
19521edccebcSFan Zhang 				!= 0) {
19531edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_INVALID, "queue_id");
19541edccebcSFan Zhang 			return;
19551edccebcSFan Zhang 		}
1956d75c371eSJasvinder Singh 	} else {
1957d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
1958d75c371eSJasvinder Singh 		return;
1959d75c371eSJasvinder Singh 	}
1960d75c371eSJasvinder Singh 
1961d75c371eSJasvinder Singh 	status = pipeline_port_out_create(pipeline_name, &p);
1962d75c371eSJasvinder Singh 	if (status) {
1963d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1964d75c371eSJasvinder Singh 		return;
1965d75c371eSJasvinder Singh 	}
1966d75c371eSJasvinder Singh }
1967d75c371eSJasvinder Singh 
196826b3effeSKevin Laatz static const char cmd_pipeline_table_help[] =
196926b3effeSKevin Laatz "pipeline <pipeline_name> table\n"
197026b3effeSKevin Laatz "       match\n"
197126b3effeSKevin Laatz "       acl\n"
197226b3effeSKevin Laatz "           ipv4 | ipv6\n"
197326b3effeSKevin Laatz "           offset <ip_header_offset>\n"
197426b3effeSKevin Laatz "           size <n_rules>\n"
197526b3effeSKevin Laatz "       | array\n"
197626b3effeSKevin Laatz "           offset <key_offset>\n"
197726b3effeSKevin Laatz "           size <n_keys>\n"
197826b3effeSKevin Laatz "       | hash\n"
197926b3effeSKevin Laatz "           ext | lru\n"
198026b3effeSKevin Laatz "           key <key_size>\n"
198126b3effeSKevin Laatz "           mask <key_mask>\n"
198226b3effeSKevin Laatz "           offset <key_offset>\n"
198326b3effeSKevin Laatz "           buckets <n_buckets>\n"
198426b3effeSKevin Laatz "           size <n_keys>\n"
198526b3effeSKevin Laatz "       | lpm\n"
198626b3effeSKevin Laatz "           ipv4 | ipv6\n"
198726b3effeSKevin Laatz "           offset <ip_header_offset>\n"
198826b3effeSKevin Laatz "           size <n_rules>\n"
198926b3effeSKevin Laatz "       | stub\n"
199026b3effeSKevin Laatz "   [action <table_action_profile_name>]\n";
199126b3effeSKevin Laatz 
1992d75c371eSJasvinder Singh static void
1993d75c371eSJasvinder Singh cmd_pipeline_table(char **tokens,
1994d75c371eSJasvinder Singh 	uint32_t n_tokens,
1995d75c371eSJasvinder Singh 	char *out,
1996d75c371eSJasvinder Singh 	size_t out_size)
1997d75c371eSJasvinder Singh {
1998d75c371eSJasvinder Singh 	uint8_t key_mask[TABLE_RULE_MATCH_SIZE_MAX];
1999d75c371eSJasvinder Singh 	struct table_params p;
2000d75c371eSJasvinder Singh 	char *pipeline_name;
2001d75c371eSJasvinder Singh 	uint32_t t0;
2002d75c371eSJasvinder Singh 	int status;
2003d75c371eSJasvinder Singh 
2004d75c371eSJasvinder Singh 	if (n_tokens < 5) {
2005d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2006d75c371eSJasvinder Singh 		return;
2007d75c371eSJasvinder Singh 	}
2008d75c371eSJasvinder Singh 
2009d75c371eSJasvinder Singh 	pipeline_name = tokens[1];
2010d75c371eSJasvinder Singh 
2011d75c371eSJasvinder Singh 	if (strcmp(tokens[2], "table") != 0) {
2012d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
2013d75c371eSJasvinder Singh 		return;
2014d75c371eSJasvinder Singh 	}
2015d75c371eSJasvinder Singh 
2016d75c371eSJasvinder Singh 	if (strcmp(tokens[3], "match") != 0) {
2017d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
2018d75c371eSJasvinder Singh 		return;
2019d75c371eSJasvinder Singh 	}
2020d75c371eSJasvinder Singh 
2021d75c371eSJasvinder Singh 	t0 = 4;
2022d75c371eSJasvinder Singh 	if (strcmp(tokens[t0], "acl") == 0) {
2023d75c371eSJasvinder Singh 		if (n_tokens < t0 + 6) {
2024d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
2025d75c371eSJasvinder Singh 				"pipeline table acl");
2026d75c371eSJasvinder Singh 			return;
2027d75c371eSJasvinder Singh 		}
2028d75c371eSJasvinder Singh 
2029d75c371eSJasvinder Singh 		p.match_type = TABLE_ACL;
2030d75c371eSJasvinder Singh 
2031d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 1], "ipv4") == 0)
2032d75c371eSJasvinder Singh 			p.match.acl.ip_version = 1;
2033d75c371eSJasvinder Singh 		else if (strcmp(tokens[t0 + 1], "ipv6") == 0)
2034d75c371eSJasvinder Singh 			p.match.acl.ip_version = 0;
2035d75c371eSJasvinder Singh 		else {
2036d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
2037d75c371eSJasvinder Singh 				"ipv4 or ipv6");
2038d75c371eSJasvinder Singh 			return;
2039d75c371eSJasvinder Singh 		}
2040d75c371eSJasvinder Singh 
2041d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 2], "offset") != 0) {
2042d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
2043d75c371eSJasvinder Singh 			return;
2044d75c371eSJasvinder Singh 		}
2045d75c371eSJasvinder Singh 
2046d75c371eSJasvinder Singh 		if (parser_read_uint32(&p.match.acl.ip_header_offset,
2047d75c371eSJasvinder Singh 			tokens[t0 + 3]) != 0) {
2048d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
2049d75c371eSJasvinder Singh 				"ip_header_offset");
2050d75c371eSJasvinder Singh 			return;
2051d75c371eSJasvinder Singh 		}
2052d75c371eSJasvinder Singh 
2053d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 4], "size") != 0) {
2054d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
2055d75c371eSJasvinder Singh 			return;
2056d75c371eSJasvinder Singh 		}
2057d75c371eSJasvinder Singh 
2058d75c371eSJasvinder Singh 		if (parser_read_uint32(&p.match.acl.n_rules,
2059d75c371eSJasvinder Singh 			tokens[t0 + 5]) != 0) {
2060d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "n_rules");
2061d75c371eSJasvinder Singh 			return;
2062d75c371eSJasvinder Singh 		}
2063d75c371eSJasvinder Singh 
2064d75c371eSJasvinder Singh 		t0 += 6;
2065d75c371eSJasvinder Singh 	} else if (strcmp(tokens[t0], "array") == 0) {
2066d75c371eSJasvinder Singh 		if (n_tokens < t0 + 5) {
2067d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
2068d75c371eSJasvinder Singh 				"pipeline table array");
2069d75c371eSJasvinder Singh 			return;
2070d75c371eSJasvinder Singh 		}
2071d75c371eSJasvinder Singh 
2072d75c371eSJasvinder Singh 		p.match_type = TABLE_ARRAY;
2073d75c371eSJasvinder Singh 
2074d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 1], "offset") != 0) {
2075d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
2076d75c371eSJasvinder Singh 			return;
2077d75c371eSJasvinder Singh 		}
2078d75c371eSJasvinder Singh 
2079d75c371eSJasvinder Singh 		if (parser_read_uint32(&p.match.array.key_offset,
2080d75c371eSJasvinder Singh 			tokens[t0 + 2]) != 0) {
2081d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
2082d75c371eSJasvinder Singh 			return;
2083d75c371eSJasvinder Singh 		}
2084d75c371eSJasvinder Singh 
2085d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 3], "size") != 0) {
2086d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
2087d75c371eSJasvinder Singh 			return;
2088d75c371eSJasvinder Singh 		}
2089d75c371eSJasvinder Singh 
2090d75c371eSJasvinder Singh 		if (parser_read_uint32(&p.match.array.n_keys,
2091d75c371eSJasvinder Singh 			tokens[t0 + 4]) != 0) {
2092d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "n_keys");
2093d75c371eSJasvinder Singh 			return;
2094d75c371eSJasvinder Singh 		}
2095d75c371eSJasvinder Singh 
2096d75c371eSJasvinder Singh 		t0 += 5;
2097d75c371eSJasvinder Singh 	} else if (strcmp(tokens[t0], "hash") == 0) {
2098d75c371eSJasvinder Singh 		uint32_t key_mask_size = TABLE_RULE_MATCH_SIZE_MAX;
2099d75c371eSJasvinder Singh 
2100d75c371eSJasvinder Singh 		if (n_tokens < t0 + 12) {
2101d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
2102d75c371eSJasvinder Singh 				"pipeline table hash");
2103d75c371eSJasvinder Singh 			return;
2104d75c371eSJasvinder Singh 		}
2105d75c371eSJasvinder Singh 
2106d75c371eSJasvinder Singh 		p.match_type = TABLE_HASH;
2107d75c371eSJasvinder Singh 
2108d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 1], "ext") == 0)
2109d75c371eSJasvinder Singh 			p.match.hash.extendable_bucket = 1;
2110d75c371eSJasvinder Singh 		else if (strcmp(tokens[t0 + 1], "lru") == 0)
2111d75c371eSJasvinder Singh 			p.match.hash.extendable_bucket = 0;
2112d75c371eSJasvinder Singh 		else {
2113d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
2114d75c371eSJasvinder Singh 				"ext or lru");
2115d75c371eSJasvinder Singh 			return;
2116d75c371eSJasvinder Singh 		}
2117d75c371eSJasvinder Singh 
2118d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 2], "key") != 0) {
2119d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "key");
2120d75c371eSJasvinder Singh 			return;
2121d75c371eSJasvinder Singh 		}
2122d75c371eSJasvinder Singh 
2123d75c371eSJasvinder Singh 		if ((parser_read_uint32(&p.match.hash.key_size,
2124d75c371eSJasvinder Singh 			tokens[t0 + 3]) != 0) ||
2125d75c371eSJasvinder Singh 			(p.match.hash.key_size == 0) ||
2126d75c371eSJasvinder Singh 			(p.match.hash.key_size > TABLE_RULE_MATCH_SIZE_MAX)) {
2127d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_size");
2128d75c371eSJasvinder Singh 			return;
2129d75c371eSJasvinder Singh 		}
2130d75c371eSJasvinder Singh 
2131d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 4], "mask") != 0) {
2132d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
2133d75c371eSJasvinder Singh 			return;
2134d75c371eSJasvinder Singh 		}
2135d75c371eSJasvinder Singh 
2136d75c371eSJasvinder Singh 		if ((parse_hex_string(tokens[t0 + 5],
2137d75c371eSJasvinder Singh 			key_mask, &key_mask_size) != 0) ||
2138d75c371eSJasvinder Singh 			(key_mask_size != p.match.hash.key_size)) {
2139d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
2140d75c371eSJasvinder Singh 			return;
2141d75c371eSJasvinder Singh 		}
2142d75c371eSJasvinder Singh 		p.match.hash.key_mask = key_mask;
2143d75c371eSJasvinder Singh 
2144d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 6], "offset") != 0) {
2145d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
2146d75c371eSJasvinder Singh 			return;
2147d75c371eSJasvinder Singh 		}
2148d75c371eSJasvinder Singh 
2149d75c371eSJasvinder Singh 		if (parser_read_uint32(&p.match.hash.key_offset,
2150d75c371eSJasvinder Singh 			tokens[t0 + 7]) != 0) {
2151d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
2152d75c371eSJasvinder Singh 			return;
2153d75c371eSJasvinder Singh 		}
2154d75c371eSJasvinder Singh 
2155d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 8], "buckets") != 0) {
2156d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "buckets");
2157d75c371eSJasvinder Singh 			return;
2158d75c371eSJasvinder Singh 		}
2159d75c371eSJasvinder Singh 
2160d75c371eSJasvinder Singh 		if (parser_read_uint32(&p.match.hash.n_buckets,
2161d75c371eSJasvinder Singh 			tokens[t0 + 9]) != 0) {
2162d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "n_buckets");
2163d75c371eSJasvinder Singh 			return;
2164d75c371eSJasvinder Singh 		}
2165d75c371eSJasvinder Singh 
2166d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 10], "size") != 0) {
2167d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
2168d75c371eSJasvinder Singh 			return;
2169d75c371eSJasvinder Singh 		}
2170d75c371eSJasvinder Singh 
2171d75c371eSJasvinder Singh 		if (parser_read_uint32(&p.match.hash.n_keys,
2172d75c371eSJasvinder Singh 			tokens[t0 + 11]) != 0) {
2173d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "n_keys");
2174d75c371eSJasvinder Singh 			return;
2175d75c371eSJasvinder Singh 		}
2176d75c371eSJasvinder Singh 
2177d75c371eSJasvinder Singh 		t0 += 12;
2178d75c371eSJasvinder Singh 	} else if (strcmp(tokens[t0], "lpm") == 0) {
2179d75c371eSJasvinder Singh 		if (n_tokens < t0 + 6) {
2180d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
2181d75c371eSJasvinder Singh 				"pipeline table lpm");
2182d75c371eSJasvinder Singh 			return;
2183d75c371eSJasvinder Singh 		}
2184d75c371eSJasvinder Singh 
2185d75c371eSJasvinder Singh 		p.match_type = TABLE_LPM;
2186d75c371eSJasvinder Singh 
2187d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 1], "ipv4") == 0)
2188d75c371eSJasvinder Singh 			p.match.lpm.key_size = 4;
2189d75c371eSJasvinder Singh 		else if (strcmp(tokens[t0 + 1], "ipv6") == 0)
2190d75c371eSJasvinder Singh 			p.match.lpm.key_size = 16;
2191d75c371eSJasvinder Singh 		else {
2192d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
2193d75c371eSJasvinder Singh 				"ipv4 or ipv6");
2194d75c371eSJasvinder Singh 			return;
2195d75c371eSJasvinder Singh 		}
2196d75c371eSJasvinder Singh 
2197d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 2], "offset") != 0) {
2198d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
2199d75c371eSJasvinder Singh 			return;
2200d75c371eSJasvinder Singh 		}
2201d75c371eSJasvinder Singh 
2202d75c371eSJasvinder Singh 		if (parser_read_uint32(&p.match.lpm.key_offset,
2203d75c371eSJasvinder Singh 			tokens[t0 + 3]) != 0) {
2204d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
2205d75c371eSJasvinder Singh 			return;
2206d75c371eSJasvinder Singh 		}
2207d75c371eSJasvinder Singh 
2208d75c371eSJasvinder Singh 		if (strcmp(tokens[t0 + 4], "size") != 0) {
2209d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
2210d75c371eSJasvinder Singh 			return;
2211d75c371eSJasvinder Singh 		}
2212d75c371eSJasvinder Singh 
2213d75c371eSJasvinder Singh 		if (parser_read_uint32(&p.match.lpm.n_rules,
2214d75c371eSJasvinder Singh 			tokens[t0 + 5]) != 0) {
2215d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "n_rules");
2216d75c371eSJasvinder Singh 			return;
2217d75c371eSJasvinder Singh 		}
2218d75c371eSJasvinder Singh 
2219d75c371eSJasvinder Singh 		t0 += 6;
2220d75c371eSJasvinder Singh 	} else if (strcmp(tokens[t0], "stub") == 0) {
2221d75c371eSJasvinder Singh 		p.match_type = TABLE_STUB;
2222d75c371eSJasvinder Singh 
2223d75c371eSJasvinder Singh 		t0 += 1;
2224d75c371eSJasvinder Singh 	} else {
2225d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
2226d75c371eSJasvinder Singh 		return;
2227d75c371eSJasvinder Singh 	}
2228d75c371eSJasvinder Singh 
2229d75c371eSJasvinder Singh 	p.action_profile_name = NULL;
2230d75c371eSJasvinder Singh 	if ((n_tokens > t0) && (strcmp(tokens[t0], "action") == 0)) {
2231d75c371eSJasvinder Singh 		if (n_tokens < t0 + 2) {
2232d75c371eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, "action");
2233d75c371eSJasvinder Singh 			return;
2234d75c371eSJasvinder Singh 		}
2235d75c371eSJasvinder Singh 
2236d75c371eSJasvinder Singh 		p.action_profile_name = tokens[t0 + 1];
2237d75c371eSJasvinder Singh 
2238d75c371eSJasvinder Singh 		t0 += 2;
2239d75c371eSJasvinder Singh 	}
2240d75c371eSJasvinder Singh 
2241d75c371eSJasvinder Singh 	if (n_tokens > t0) {
2242d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2243d75c371eSJasvinder Singh 		return;
2244d75c371eSJasvinder Singh 	}
2245d75c371eSJasvinder Singh 
2246d75c371eSJasvinder Singh 	status = pipeline_table_create(pipeline_name, &p);
2247d75c371eSJasvinder Singh 	if (status) {
2248d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2249d75c371eSJasvinder Singh 		return;
2250d75c371eSJasvinder Singh 	}
2251d75c371eSJasvinder Singh }
2252d75c371eSJasvinder Singh 
225326b3effeSKevin Laatz static const char cmd_pipeline_port_in_table_help[] =
225426b3effeSKevin Laatz "pipeline <pipeline_name> port in <port_id> table <table_id>\n";
225526b3effeSKevin Laatz 
2256d75c371eSJasvinder Singh static void
2257d75c371eSJasvinder Singh cmd_pipeline_port_in_table(char **tokens,
2258d75c371eSJasvinder Singh 	uint32_t n_tokens,
2259d75c371eSJasvinder Singh 	char *out,
2260d75c371eSJasvinder Singh 	size_t out_size)
2261d75c371eSJasvinder Singh {
2262d75c371eSJasvinder Singh 	char *pipeline_name;
2263d75c371eSJasvinder Singh 	uint32_t port_id, table_id;
2264d75c371eSJasvinder Singh 	int status;
2265d75c371eSJasvinder Singh 
2266d75c371eSJasvinder Singh 	if (n_tokens != 7) {
2267d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2268d75c371eSJasvinder Singh 		return;
2269d75c371eSJasvinder Singh 	}
2270d75c371eSJasvinder Singh 
2271d75c371eSJasvinder Singh 	pipeline_name = tokens[1];
2272d75c371eSJasvinder Singh 
2273d75c371eSJasvinder Singh 	if (strcmp(tokens[2], "port") != 0) {
2274d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2275d75c371eSJasvinder Singh 		return;
2276d75c371eSJasvinder Singh 	}
2277d75c371eSJasvinder Singh 
2278d75c371eSJasvinder Singh 	if (strcmp(tokens[3], "in") != 0) {
2279d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
2280d75c371eSJasvinder Singh 		return;
2281d75c371eSJasvinder Singh 	}
2282d75c371eSJasvinder Singh 
2283d75c371eSJasvinder Singh 	if (parser_read_uint32(&port_id, tokens[4]) != 0) {
2284d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
2285d75c371eSJasvinder Singh 		return;
2286d75c371eSJasvinder Singh 	}
2287d75c371eSJasvinder Singh 
2288d75c371eSJasvinder Singh 	if (strcmp(tokens[5], "table") != 0) {
2289d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
2290d75c371eSJasvinder Singh 		return;
2291d75c371eSJasvinder Singh 	}
2292d75c371eSJasvinder Singh 
2293d75c371eSJasvinder Singh 	if (parser_read_uint32(&table_id, tokens[6]) != 0) {
2294d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
2295d75c371eSJasvinder Singh 		return;
2296d75c371eSJasvinder Singh 	}
2297d75c371eSJasvinder Singh 
2298d75c371eSJasvinder Singh 	status = pipeline_port_in_connect_to_table(pipeline_name,
2299d75c371eSJasvinder Singh 		port_id,
2300d75c371eSJasvinder Singh 		table_id);
2301d75c371eSJasvinder Singh 	if (status) {
2302d75c371eSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2303d75c371eSJasvinder Singh 		return;
2304d75c371eSJasvinder Singh 	}
2305d75c371eSJasvinder Singh }
2306d75c371eSJasvinder Singh 
230726b3effeSKevin Laatz 
230826b3effeSKevin Laatz static const char cmd_pipeline_port_in_stats_help[] =
230926b3effeSKevin Laatz "pipeline <pipeline_name> port in <port_id> stats read [clear]\n";
231050e73d05SJasvinder Singh 
231150e73d05SJasvinder Singh #define MSG_PIPELINE_PORT_IN_STATS                         \
231250e73d05SJasvinder Singh 	"Pkts in: %" PRIu64 "\n"                           \
231350e73d05SJasvinder Singh 	"Pkts dropped by AH: %" PRIu64 "\n"                \
231450e73d05SJasvinder Singh 	"Pkts dropped by other: %" PRIu64 "\n"
231550e73d05SJasvinder Singh 
231650e73d05SJasvinder Singh static void
231750e73d05SJasvinder Singh cmd_pipeline_port_in_stats(char **tokens,
231850e73d05SJasvinder Singh 	uint32_t n_tokens,
231950e73d05SJasvinder Singh 	char *out,
232050e73d05SJasvinder Singh 	size_t out_size)
232150e73d05SJasvinder Singh {
232250e73d05SJasvinder Singh 	struct rte_pipeline_port_in_stats stats;
232350e73d05SJasvinder Singh 	char *pipeline_name;
232450e73d05SJasvinder Singh 	uint32_t port_id;
232550e73d05SJasvinder Singh 	int clear, status;
232650e73d05SJasvinder Singh 
232750e73d05SJasvinder Singh 	if ((n_tokens != 7) && (n_tokens != 8)) {
232850e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
232950e73d05SJasvinder Singh 		return;
233050e73d05SJasvinder Singh 	}
233150e73d05SJasvinder Singh 
233250e73d05SJasvinder Singh 	pipeline_name = tokens[1];
233350e73d05SJasvinder Singh 
233450e73d05SJasvinder Singh 	if (strcmp(tokens[2], "port") != 0) {
233550e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
233650e73d05SJasvinder Singh 		return;
233750e73d05SJasvinder Singh 	}
233850e73d05SJasvinder Singh 
233950e73d05SJasvinder Singh 	if (strcmp(tokens[3], "in") != 0) {
234050e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
234150e73d05SJasvinder Singh 		return;
234250e73d05SJasvinder Singh 	}
234350e73d05SJasvinder Singh 
234450e73d05SJasvinder Singh 	if (parser_read_uint32(&port_id, tokens[4]) != 0) {
234550e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
234650e73d05SJasvinder Singh 		return;
234750e73d05SJasvinder Singh 	}
234850e73d05SJasvinder Singh 
234950e73d05SJasvinder Singh 	if (strcmp(tokens[5], "stats") != 0) {
235050e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
235150e73d05SJasvinder Singh 		return;
235250e73d05SJasvinder Singh 	}
235350e73d05SJasvinder Singh 
235450e73d05SJasvinder Singh 	if (strcmp(tokens[6], "read") != 0) {
235550e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
235650e73d05SJasvinder Singh 		return;
235750e73d05SJasvinder Singh 	}
235850e73d05SJasvinder Singh 
235950e73d05SJasvinder Singh 	clear = 0;
236050e73d05SJasvinder Singh 	if (n_tokens == 8) {
236150e73d05SJasvinder Singh 		if (strcmp(tokens[7], "clear") != 0) {
236250e73d05SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "clear");
236350e73d05SJasvinder Singh 			return;
236450e73d05SJasvinder Singh 		}
236550e73d05SJasvinder Singh 
236650e73d05SJasvinder Singh 		clear = 1;
236750e73d05SJasvinder Singh 	}
236850e73d05SJasvinder Singh 
236950e73d05SJasvinder Singh 	status = pipeline_port_in_stats_read(pipeline_name,
237050e73d05SJasvinder Singh 		port_id,
237150e73d05SJasvinder Singh 		&stats,
237250e73d05SJasvinder Singh 		clear);
237350e73d05SJasvinder Singh 	if (status) {
237450e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
237550e73d05SJasvinder Singh 		return;
237650e73d05SJasvinder Singh 	}
237750e73d05SJasvinder Singh 
237850e73d05SJasvinder Singh 	snprintf(out, out_size, MSG_PIPELINE_PORT_IN_STATS,
237950e73d05SJasvinder Singh 		stats.stats.n_pkts_in,
238050e73d05SJasvinder Singh 		stats.n_pkts_dropped_by_ah,
238150e73d05SJasvinder Singh 		stats.stats.n_pkts_drop);
238250e73d05SJasvinder Singh }
238350e73d05SJasvinder Singh 
238426b3effeSKevin Laatz 
238526b3effeSKevin Laatz static const char cmd_pipeline_port_in_enable_help[] =
238626b3effeSKevin Laatz "pipeline <pipeline_name> port in <port_id> enable\n";
238726b3effeSKevin Laatz 
23886b1b3c3cSJasvinder Singh static void
23896b1b3c3cSJasvinder Singh cmd_pipeline_port_in_enable(char **tokens,
23906b1b3c3cSJasvinder Singh 	uint32_t n_tokens,
23916b1b3c3cSJasvinder Singh 	char *out,
23926b1b3c3cSJasvinder Singh 	size_t out_size)
23936b1b3c3cSJasvinder Singh {
23946b1b3c3cSJasvinder Singh 	char *pipeline_name;
23956b1b3c3cSJasvinder Singh 	uint32_t port_id;
23966b1b3c3cSJasvinder Singh 	int status;
23976b1b3c3cSJasvinder Singh 
23986b1b3c3cSJasvinder Singh 	if (n_tokens != 6) {
23996b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
24006b1b3c3cSJasvinder Singh 		return;
24016b1b3c3cSJasvinder Singh 	}
24026b1b3c3cSJasvinder Singh 
24036b1b3c3cSJasvinder Singh 	pipeline_name = tokens[1];
24046b1b3c3cSJasvinder Singh 
24056b1b3c3cSJasvinder Singh 	if (strcmp(tokens[2], "port") != 0) {
24066b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
24076b1b3c3cSJasvinder Singh 		return;
24086b1b3c3cSJasvinder Singh 	}
24096b1b3c3cSJasvinder Singh 
24106b1b3c3cSJasvinder Singh 	if (strcmp(tokens[3], "in") != 0) {
24116b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
24126b1b3c3cSJasvinder Singh 		return;
24136b1b3c3cSJasvinder Singh 	}
24146b1b3c3cSJasvinder Singh 
24156b1b3c3cSJasvinder Singh 	if (parser_read_uint32(&port_id, tokens[4]) != 0) {
24166b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
24176b1b3c3cSJasvinder Singh 		return;
24186b1b3c3cSJasvinder Singh 	}
24196b1b3c3cSJasvinder Singh 
24206b1b3c3cSJasvinder Singh 	if (strcmp(tokens[5], "enable") != 0) {
24216b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "enable");
24226b1b3c3cSJasvinder Singh 		return;
24236b1b3c3cSJasvinder Singh 	}
24246b1b3c3cSJasvinder Singh 
24256b1b3c3cSJasvinder Singh 	status = pipeline_port_in_enable(pipeline_name, port_id);
24266b1b3c3cSJasvinder Singh 	if (status) {
24276b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
24286b1b3c3cSJasvinder Singh 		return;
24296b1b3c3cSJasvinder Singh 	}
24306b1b3c3cSJasvinder Singh }
24316b1b3c3cSJasvinder Singh 
243226b3effeSKevin Laatz 
243326b3effeSKevin Laatz static const char cmd_pipeline_port_in_disable_help[] =
243426b3effeSKevin Laatz "pipeline <pipeline_name> port in <port_id> disable\n";
243526b3effeSKevin Laatz 
24366b1b3c3cSJasvinder Singh static void
24376b1b3c3cSJasvinder Singh cmd_pipeline_port_in_disable(char **tokens,
24386b1b3c3cSJasvinder Singh 	uint32_t n_tokens,
24396b1b3c3cSJasvinder Singh 	char *out,
24406b1b3c3cSJasvinder Singh 	size_t out_size)
24416b1b3c3cSJasvinder Singh {
24426b1b3c3cSJasvinder Singh 	char *pipeline_name;
24436b1b3c3cSJasvinder Singh 	uint32_t port_id;
24446b1b3c3cSJasvinder Singh 	int status;
24456b1b3c3cSJasvinder Singh 
24466b1b3c3cSJasvinder Singh 	if (n_tokens != 6) {
24476b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
24486b1b3c3cSJasvinder Singh 		return;
24496b1b3c3cSJasvinder Singh 	}
24506b1b3c3cSJasvinder Singh 
24516b1b3c3cSJasvinder Singh 	pipeline_name = tokens[1];
24526b1b3c3cSJasvinder Singh 
24536b1b3c3cSJasvinder Singh 	if (strcmp(tokens[2], "port") != 0) {
24546b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
24556b1b3c3cSJasvinder Singh 		return;
24566b1b3c3cSJasvinder Singh 	}
24576b1b3c3cSJasvinder Singh 
24586b1b3c3cSJasvinder Singh 	if (strcmp(tokens[3], "in") != 0) {
24596b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
24606b1b3c3cSJasvinder Singh 		return;
24616b1b3c3cSJasvinder Singh 	}
24626b1b3c3cSJasvinder Singh 
24636b1b3c3cSJasvinder Singh 	if (parser_read_uint32(&port_id, tokens[4]) != 0) {
24646b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
24656b1b3c3cSJasvinder Singh 		return;
24666b1b3c3cSJasvinder Singh 	}
24676b1b3c3cSJasvinder Singh 
24686b1b3c3cSJasvinder Singh 	if (strcmp(tokens[5], "disable") != 0) {
24696b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "disable");
24706b1b3c3cSJasvinder Singh 		return;
24716b1b3c3cSJasvinder Singh 	}
24726b1b3c3cSJasvinder Singh 
24736b1b3c3cSJasvinder Singh 	status = pipeline_port_in_disable(pipeline_name, port_id);
24746b1b3c3cSJasvinder Singh 	if (status) {
24756b1b3c3cSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
24766b1b3c3cSJasvinder Singh 		return;
24776b1b3c3cSJasvinder Singh 	}
24786b1b3c3cSJasvinder Singh }
24796b1b3c3cSJasvinder Singh 
248026b3effeSKevin Laatz 
248126b3effeSKevin Laatz static const char cmd_pipeline_port_out_stats_help[] =
248226b3effeSKevin Laatz "pipeline <pipeline_name> port out <port_id> stats read [clear]\n";
248326b3effeSKevin Laatz 
248450e73d05SJasvinder Singh #define MSG_PIPELINE_PORT_OUT_STATS                        \
248550e73d05SJasvinder Singh 	"Pkts in: %" PRIu64 "\n"                           \
248650e73d05SJasvinder Singh 	"Pkts dropped by AH: %" PRIu64 "\n"                \
248750e73d05SJasvinder Singh 	"Pkts dropped by other: %" PRIu64 "\n"
248850e73d05SJasvinder Singh 
248950e73d05SJasvinder Singh static void
249050e73d05SJasvinder Singh cmd_pipeline_port_out_stats(char **tokens,
249150e73d05SJasvinder Singh 	uint32_t n_tokens,
249250e73d05SJasvinder Singh 	char *out,
249350e73d05SJasvinder Singh 	size_t out_size)
249450e73d05SJasvinder Singh {
249550e73d05SJasvinder Singh 	struct rte_pipeline_port_out_stats stats;
249650e73d05SJasvinder Singh 	char *pipeline_name;
249750e73d05SJasvinder Singh 	uint32_t port_id;
249850e73d05SJasvinder Singh 	int clear, status;
249950e73d05SJasvinder Singh 
250050e73d05SJasvinder Singh 	if ((n_tokens != 7) && (n_tokens != 8)) {
250150e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
250250e73d05SJasvinder Singh 		return;
250350e73d05SJasvinder Singh 	}
250450e73d05SJasvinder Singh 
250550e73d05SJasvinder Singh 	pipeline_name = tokens[1];
250650e73d05SJasvinder Singh 
250750e73d05SJasvinder Singh 	if (strcmp(tokens[2], "port") != 0) {
250850e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
250950e73d05SJasvinder Singh 		return;
251050e73d05SJasvinder Singh 	}
251150e73d05SJasvinder Singh 
251250e73d05SJasvinder Singh 	if (strcmp(tokens[3], "out") != 0) {
251350e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "out");
251450e73d05SJasvinder Singh 		return;
251550e73d05SJasvinder Singh 	}
251650e73d05SJasvinder Singh 
251750e73d05SJasvinder Singh 	if (parser_read_uint32(&port_id, tokens[4]) != 0) {
251850e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
251950e73d05SJasvinder Singh 		return;
252050e73d05SJasvinder Singh 	}
252150e73d05SJasvinder Singh 
252250e73d05SJasvinder Singh 	if (strcmp(tokens[5], "stats") != 0) {
252350e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
252450e73d05SJasvinder Singh 		return;
252550e73d05SJasvinder Singh 	}
252650e73d05SJasvinder Singh 
252750e73d05SJasvinder Singh 	if (strcmp(tokens[6], "read") != 0) {
252850e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
252950e73d05SJasvinder Singh 		return;
253050e73d05SJasvinder Singh 	}
253150e73d05SJasvinder Singh 
253250e73d05SJasvinder Singh 	clear = 0;
253350e73d05SJasvinder Singh 	if (n_tokens == 8) {
253450e73d05SJasvinder Singh 		if (strcmp(tokens[7], "clear") != 0) {
253550e73d05SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "clear");
253650e73d05SJasvinder Singh 			return;
253750e73d05SJasvinder Singh 		}
253850e73d05SJasvinder Singh 
253950e73d05SJasvinder Singh 		clear = 1;
254050e73d05SJasvinder Singh 	}
254150e73d05SJasvinder Singh 
254250e73d05SJasvinder Singh 	status = pipeline_port_out_stats_read(pipeline_name,
254350e73d05SJasvinder Singh 		port_id,
254450e73d05SJasvinder Singh 		&stats,
254550e73d05SJasvinder Singh 		clear);
254650e73d05SJasvinder Singh 	if (status) {
254750e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
254850e73d05SJasvinder Singh 		return;
254950e73d05SJasvinder Singh 	}
255050e73d05SJasvinder Singh 
255150e73d05SJasvinder Singh 	snprintf(out, out_size, MSG_PIPELINE_PORT_OUT_STATS,
255250e73d05SJasvinder Singh 		stats.stats.n_pkts_in,
255350e73d05SJasvinder Singh 		stats.n_pkts_dropped_by_ah,
255450e73d05SJasvinder Singh 		stats.stats.n_pkts_drop);
255550e73d05SJasvinder Singh }
255650e73d05SJasvinder Singh 
255726b3effeSKevin Laatz 
255826b3effeSKevin Laatz static const char cmd_pipeline_table_stats_help[] =
255926b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id> stats read [clear]\n";
256026b3effeSKevin Laatz 
256150e73d05SJasvinder Singh #define MSG_PIPELINE_TABLE_STATS                                     \
256250e73d05SJasvinder Singh 	"Pkts in: %" PRIu64 "\n"                                     \
256350e73d05SJasvinder Singh 	"Pkts in with lookup miss: %" PRIu64 "\n"                    \
256450e73d05SJasvinder Singh 	"Pkts in with lookup hit dropped by AH: %" PRIu64 "\n"       \
256550e73d05SJasvinder Singh 	"Pkts in with lookup hit dropped by others: %" PRIu64 "\n"   \
256650e73d05SJasvinder Singh 	"Pkts in with lookup miss dropped by AH: %" PRIu64 "\n"      \
256750e73d05SJasvinder Singh 	"Pkts in with lookup miss dropped by others: %" PRIu64 "\n"
256850e73d05SJasvinder Singh 
256950e73d05SJasvinder Singh static void
257050e73d05SJasvinder Singh cmd_pipeline_table_stats(char **tokens,
257150e73d05SJasvinder Singh 	uint32_t n_tokens,
257250e73d05SJasvinder Singh 	char *out,
257350e73d05SJasvinder Singh 	size_t out_size)
257450e73d05SJasvinder Singh {
257550e73d05SJasvinder Singh 	struct rte_pipeline_table_stats stats;
257650e73d05SJasvinder Singh 	char *pipeline_name;
257750e73d05SJasvinder Singh 	uint32_t table_id;
257850e73d05SJasvinder Singh 	int clear, status;
257950e73d05SJasvinder Singh 
258050e73d05SJasvinder Singh 	if ((n_tokens != 6) && (n_tokens != 7)) {
258150e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
258250e73d05SJasvinder Singh 		return;
258350e73d05SJasvinder Singh 	}
258450e73d05SJasvinder Singh 
258550e73d05SJasvinder Singh 	pipeline_name = tokens[1];
258650e73d05SJasvinder Singh 
258750e73d05SJasvinder Singh 	if (strcmp(tokens[2], "table") != 0) {
258850e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
258950e73d05SJasvinder Singh 		return;
259050e73d05SJasvinder Singh 	}
259150e73d05SJasvinder Singh 
259250e73d05SJasvinder Singh 	if (parser_read_uint32(&table_id, tokens[3]) != 0) {
259350e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
259450e73d05SJasvinder Singh 		return;
259550e73d05SJasvinder Singh 	}
259650e73d05SJasvinder Singh 
259750e73d05SJasvinder Singh 	if (strcmp(tokens[4], "stats") != 0) {
259850e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
259950e73d05SJasvinder Singh 		return;
260050e73d05SJasvinder Singh 	}
260150e73d05SJasvinder Singh 
260250e73d05SJasvinder Singh 	if (strcmp(tokens[5], "read") != 0) {
260350e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
260450e73d05SJasvinder Singh 		return;
260550e73d05SJasvinder Singh 	}
260650e73d05SJasvinder Singh 
260750e73d05SJasvinder Singh 	clear = 0;
260850e73d05SJasvinder Singh 	if (n_tokens == 7) {
260950e73d05SJasvinder Singh 		if (strcmp(tokens[6], "clear") != 0) {
261050e73d05SJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "clear");
261150e73d05SJasvinder Singh 			return;
261250e73d05SJasvinder Singh 		}
261350e73d05SJasvinder Singh 
261450e73d05SJasvinder Singh 		clear = 1;
261550e73d05SJasvinder Singh 	}
261650e73d05SJasvinder Singh 
261750e73d05SJasvinder Singh 	status = pipeline_table_stats_read(pipeline_name,
261850e73d05SJasvinder Singh 		table_id,
261950e73d05SJasvinder Singh 		&stats,
262050e73d05SJasvinder Singh 		clear);
262150e73d05SJasvinder Singh 	if (status) {
262250e73d05SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
262350e73d05SJasvinder Singh 		return;
262450e73d05SJasvinder Singh 	}
262550e73d05SJasvinder Singh 
262650e73d05SJasvinder Singh 	snprintf(out, out_size, MSG_PIPELINE_TABLE_STATS,
262750e73d05SJasvinder Singh 		stats.stats.n_pkts_in,
262850e73d05SJasvinder Singh 		stats.stats.n_pkts_lookup_miss,
262950e73d05SJasvinder Singh 		stats.n_pkts_dropped_by_lkp_hit_ah,
263050e73d05SJasvinder Singh 		stats.n_pkts_dropped_lkp_hit,
263150e73d05SJasvinder Singh 		stats.n_pkts_dropped_by_lkp_miss_ah,
263250e73d05SJasvinder Singh 		stats.n_pkts_dropped_lkp_miss);
263350e73d05SJasvinder Singh }
263450e73d05SJasvinder Singh 
263550e73d05SJasvinder Singh /**
2636a3a95b7dSJasvinder Singh  * <match> ::=
2637a3a95b7dSJasvinder Singh  *
2638a3a95b7dSJasvinder Singh  * match
2639a3a95b7dSJasvinder Singh  *    acl
2640a3a95b7dSJasvinder Singh  *       priority <priority>
2641a3a95b7dSJasvinder Singh  *       ipv4 | ipv6 <sa> <sa_depth> <da> <da_depth>
2642a3a95b7dSJasvinder Singh  *       <sp0> <sp1> <dp0> <dp1> <proto>
2643085c3d8cSJasvinder Singh  *    | array <pos>
2644a3a95b7dSJasvinder Singh  *    | hash
2645a3a95b7dSJasvinder Singh  *       raw <key>
2646a3a95b7dSJasvinder Singh  *       | ipv4_5tuple <sa> <da> <sp> <dp> <proto>
2647a3a95b7dSJasvinder Singh  *       | ipv6_5tuple <sa> <da> <sp> <dp> <proto>
2648a3a95b7dSJasvinder Singh  *       | ipv4_addr <addr>
2649a3a95b7dSJasvinder Singh  *       | ipv6_addr <addr>
2650a3a95b7dSJasvinder Singh  *       | qinq <svlan> <cvlan>
2651a3a95b7dSJasvinder Singh  *    | lpm
2652a3a95b7dSJasvinder Singh  *       ipv4 | ipv6 <addr> <depth>
2653a3a95b7dSJasvinder Singh  */
2654a3a95b7dSJasvinder Singh struct pkt_key_qinq {
2655a3a95b7dSJasvinder Singh 	uint16_t ethertype_svlan;
2656a3a95b7dSJasvinder Singh 	uint16_t svlan;
2657a3a95b7dSJasvinder Singh 	uint16_t ethertype_cvlan;
2658a3a95b7dSJasvinder Singh 	uint16_t cvlan;
2659a3a95b7dSJasvinder Singh } __attribute__((__packed__));
2660a3a95b7dSJasvinder Singh 
2661a3a95b7dSJasvinder Singh struct pkt_key_ipv4_5tuple {
2662a3a95b7dSJasvinder Singh 	uint8_t time_to_live;
2663a3a95b7dSJasvinder Singh 	uint8_t proto;
2664a3a95b7dSJasvinder Singh 	uint16_t hdr_checksum;
2665a3a95b7dSJasvinder Singh 	uint32_t sa;
2666a3a95b7dSJasvinder Singh 	uint32_t da;
2667a3a95b7dSJasvinder Singh 	uint16_t sp;
2668a3a95b7dSJasvinder Singh 	uint16_t dp;
2669a3a95b7dSJasvinder Singh } __attribute__((__packed__));
2670a3a95b7dSJasvinder Singh 
2671a3a95b7dSJasvinder Singh struct pkt_key_ipv6_5tuple {
2672a3a95b7dSJasvinder Singh 	uint16_t payload_length;
2673a3a95b7dSJasvinder Singh 	uint8_t proto;
2674a3a95b7dSJasvinder Singh 	uint8_t hop_limit;
2675a3a95b7dSJasvinder Singh 	uint8_t sa[16];
2676a3a95b7dSJasvinder Singh 	uint8_t da[16];
2677a3a95b7dSJasvinder Singh 	uint16_t sp;
2678a3a95b7dSJasvinder Singh 	uint16_t dp;
2679a3a95b7dSJasvinder Singh } __attribute__((__packed__));
2680a3a95b7dSJasvinder Singh 
2681a3a95b7dSJasvinder Singh struct pkt_key_ipv4_addr {
2682a3a95b7dSJasvinder Singh 	uint32_t addr;
2683a3a95b7dSJasvinder Singh } __attribute__((__packed__));
2684a3a95b7dSJasvinder Singh 
2685a3a95b7dSJasvinder Singh struct pkt_key_ipv6_addr {
2686a3a95b7dSJasvinder Singh 	uint8_t addr[16];
2687a3a95b7dSJasvinder Singh } __attribute__((__packed__));
2688a3a95b7dSJasvinder Singh 
2689a3a95b7dSJasvinder Singh static uint32_t
2690a3a95b7dSJasvinder Singh parse_match(char **tokens,
2691a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
2692a3a95b7dSJasvinder Singh 	char *out,
2693a3a95b7dSJasvinder Singh 	size_t out_size,
2694a3a95b7dSJasvinder Singh 	struct table_rule_match *m)
2695a3a95b7dSJasvinder Singh {
2696a3a95b7dSJasvinder Singh 	memset(m, 0, sizeof(*m));
2697a3a95b7dSJasvinder Singh 
2698a3a95b7dSJasvinder Singh 	if (n_tokens < 2)
2699a3a95b7dSJasvinder Singh 		return 0;
2700a3a95b7dSJasvinder Singh 
2701a3a95b7dSJasvinder Singh 	if (strcmp(tokens[0], "match") != 0) {
2702a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
2703a3a95b7dSJasvinder Singh 		return 0;
2704a3a95b7dSJasvinder Singh 	}
2705a3a95b7dSJasvinder Singh 
2706a3a95b7dSJasvinder Singh 	if (strcmp(tokens[1], "acl") == 0) {
2707a3a95b7dSJasvinder Singh 		if (n_tokens < 14) {
2708a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2709a3a95b7dSJasvinder Singh 			return 0;
2710a3a95b7dSJasvinder Singh 		}
2711a3a95b7dSJasvinder Singh 
2712a3a95b7dSJasvinder Singh 		m->match_type = TABLE_ACL;
2713a3a95b7dSJasvinder Singh 
2714a3a95b7dSJasvinder Singh 		if (strcmp(tokens[2], "priority") != 0) {
2715a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "priority");
2716a3a95b7dSJasvinder Singh 			return 0;
2717a3a95b7dSJasvinder Singh 		}
2718a3a95b7dSJasvinder Singh 
2719a3a95b7dSJasvinder Singh 		if (parser_read_uint32(&m->match.acl.priority,
2720a3a95b7dSJasvinder Singh 			tokens[3]) != 0) {
2721a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "priority");
2722a3a95b7dSJasvinder Singh 			return 0;
2723a3a95b7dSJasvinder Singh 		}
2724a3a95b7dSJasvinder Singh 
2725a3a95b7dSJasvinder Singh 		if (strcmp(tokens[4], "ipv4") == 0) {
2726a3a95b7dSJasvinder Singh 			struct in_addr saddr, daddr;
2727a3a95b7dSJasvinder Singh 
2728a3a95b7dSJasvinder Singh 			m->match.acl.ip_version = 1;
2729a3a95b7dSJasvinder Singh 
2730a3a95b7dSJasvinder Singh 			if (parse_ipv4_addr(tokens[5], &saddr) != 0) {
2731a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2732a3a95b7dSJasvinder Singh 				return 0;
2733a3a95b7dSJasvinder Singh 			}
2734a3a95b7dSJasvinder Singh 			m->match.acl.ipv4.sa = rte_be_to_cpu_32(saddr.s_addr);
2735a3a95b7dSJasvinder Singh 
2736a3a95b7dSJasvinder Singh 			if (parse_ipv4_addr(tokens[7], &daddr) != 0) {
2737a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "da");
2738a3a95b7dSJasvinder Singh 				return 0;
2739a3a95b7dSJasvinder Singh 			}
2740a3a95b7dSJasvinder Singh 			m->match.acl.ipv4.da = rte_be_to_cpu_32(daddr.s_addr);
2741a3a95b7dSJasvinder Singh 		} else if (strcmp(tokens[4], "ipv6") == 0) {
2742a3a95b7dSJasvinder Singh 			struct in6_addr saddr, daddr;
2743a3a95b7dSJasvinder Singh 
2744a3a95b7dSJasvinder Singh 			m->match.acl.ip_version = 0;
2745a3a95b7dSJasvinder Singh 
2746a3a95b7dSJasvinder Singh 			if (parse_ipv6_addr(tokens[5], &saddr) != 0) {
2747a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2748a3a95b7dSJasvinder Singh 				return 0;
2749a3a95b7dSJasvinder Singh 			}
2750a3a95b7dSJasvinder Singh 			memcpy(m->match.acl.ipv6.sa, saddr.s6_addr, 16);
2751a3a95b7dSJasvinder Singh 
2752a3a95b7dSJasvinder Singh 			if (parse_ipv6_addr(tokens[7], &daddr) != 0) {
2753a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "da");
2754a3a95b7dSJasvinder Singh 				return 0;
2755a3a95b7dSJasvinder Singh 			}
2756a3a95b7dSJasvinder Singh 			memcpy(m->match.acl.ipv6.da, daddr.s6_addr, 16);
2757a3a95b7dSJasvinder Singh 		} else {
2758a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND,
2759a3a95b7dSJasvinder Singh 				"ipv4 or ipv6");
2760a3a95b7dSJasvinder Singh 			return 0;
2761a3a95b7dSJasvinder Singh 		}
2762a3a95b7dSJasvinder Singh 
2763a3a95b7dSJasvinder Singh 		if (parser_read_uint32(&m->match.acl.sa_depth,
2764a3a95b7dSJasvinder Singh 			tokens[6]) != 0) {
2765a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "sa_depth");
2766a3a95b7dSJasvinder Singh 			return 0;
2767a3a95b7dSJasvinder Singh 		}
2768a3a95b7dSJasvinder Singh 
2769a3a95b7dSJasvinder Singh 		if (parser_read_uint32(&m->match.acl.da_depth,
2770a3a95b7dSJasvinder Singh 			tokens[8]) != 0) {
2771a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "da_depth");
2772a3a95b7dSJasvinder Singh 			return 0;
2773a3a95b7dSJasvinder Singh 		}
2774a3a95b7dSJasvinder Singh 
2775a3a95b7dSJasvinder Singh 		if (parser_read_uint16(&m->match.acl.sp0, tokens[9]) != 0) {
2776a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "sp0");
2777a3a95b7dSJasvinder Singh 			return 0;
2778a3a95b7dSJasvinder Singh 		}
2779a3a95b7dSJasvinder Singh 
2780a3a95b7dSJasvinder Singh 		if (parser_read_uint16(&m->match.acl.sp1, tokens[10]) != 0) {
2781a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "sp1");
2782a3a95b7dSJasvinder Singh 			return 0;
2783a3a95b7dSJasvinder Singh 		}
2784a3a95b7dSJasvinder Singh 
2785a3a95b7dSJasvinder Singh 		if (parser_read_uint16(&m->match.acl.dp0, tokens[11]) != 0) {
2786a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "dp0");
2787a3a95b7dSJasvinder Singh 			return 0;
2788a3a95b7dSJasvinder Singh 		}
2789a3a95b7dSJasvinder Singh 
2790a3a95b7dSJasvinder Singh 		if (parser_read_uint16(&m->match.acl.dp1, tokens[12]) != 0) {
2791a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "dp1");
2792a3a95b7dSJasvinder Singh 			return 0;
2793a3a95b7dSJasvinder Singh 		}
2794a3a95b7dSJasvinder Singh 
2795a3a95b7dSJasvinder Singh 		if (parser_read_uint8(&m->match.acl.proto, tokens[13]) != 0) {
2796a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "proto");
2797a3a95b7dSJasvinder Singh 			return 0;
2798a3a95b7dSJasvinder Singh 		}
2799a3a95b7dSJasvinder Singh 
2800a3a95b7dSJasvinder Singh 		m->match.acl.proto_mask = 0xff;
2801a3a95b7dSJasvinder Singh 
2802a3a95b7dSJasvinder Singh 		return 14;
2803a3a95b7dSJasvinder Singh 	} /* acl */
2804a3a95b7dSJasvinder Singh 
2805a3a95b7dSJasvinder Singh 	if (strcmp(tokens[1], "array") == 0) {
2806a3a95b7dSJasvinder Singh 		if (n_tokens < 3) {
2807a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2808a3a95b7dSJasvinder Singh 			return 0;
2809a3a95b7dSJasvinder Singh 		}
2810a3a95b7dSJasvinder Singh 
2811a3a95b7dSJasvinder Singh 		m->match_type = TABLE_ARRAY;
2812a3a95b7dSJasvinder Singh 
2813a3a95b7dSJasvinder Singh 		if (parser_read_uint32(&m->match.array.pos, tokens[2]) != 0) {
2814a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "pos");
2815a3a95b7dSJasvinder Singh 			return 0;
2816a3a95b7dSJasvinder Singh 		}
2817a3a95b7dSJasvinder Singh 
2818a3a95b7dSJasvinder Singh 		return 3;
2819a3a95b7dSJasvinder Singh 	} /* array */
2820a3a95b7dSJasvinder Singh 
2821a3a95b7dSJasvinder Singh 	if (strcmp(tokens[1], "hash") == 0) {
2822a3a95b7dSJasvinder Singh 		if (n_tokens < 3) {
2823a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2824a3a95b7dSJasvinder Singh 			return 0;
2825a3a95b7dSJasvinder Singh 		}
2826a3a95b7dSJasvinder Singh 
2827a3a95b7dSJasvinder Singh 		m->match_type = TABLE_HASH;
2828a3a95b7dSJasvinder Singh 
2829a3a95b7dSJasvinder Singh 		if (strcmp(tokens[2], "raw") == 0) {
2830a3a95b7dSJasvinder Singh 			uint32_t key_size = TABLE_RULE_MATCH_SIZE_MAX;
2831a3a95b7dSJasvinder Singh 
2832a3a95b7dSJasvinder Singh 			if (n_tokens < 4) {
2833a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_MISMATCH,
2834a3a95b7dSJasvinder Singh 					tokens[0]);
2835a3a95b7dSJasvinder Singh 				return 0;
2836a3a95b7dSJasvinder Singh 			}
2837a3a95b7dSJasvinder Singh 
2838a3a95b7dSJasvinder Singh 			if (parse_hex_string(tokens[3],
2839a3a95b7dSJasvinder Singh 				m->match.hash.key, &key_size) != 0) {
2840a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "key");
2841a3a95b7dSJasvinder Singh 				return 0;
2842a3a95b7dSJasvinder Singh 			}
2843a3a95b7dSJasvinder Singh 
2844a3a95b7dSJasvinder Singh 			return 4;
2845a3a95b7dSJasvinder Singh 		} /* hash raw */
2846a3a95b7dSJasvinder Singh 
2847a3a95b7dSJasvinder Singh 		if (strcmp(tokens[2], "ipv4_5tuple") == 0) {
2848a3a95b7dSJasvinder Singh 			struct pkt_key_ipv4_5tuple *ipv4 =
2849a3a95b7dSJasvinder Singh 				(struct pkt_key_ipv4_5tuple *) m->match.hash.key;
2850a3a95b7dSJasvinder Singh 			struct in_addr saddr, daddr;
2851a3a95b7dSJasvinder Singh 			uint16_t sp, dp;
2852a3a95b7dSJasvinder Singh 			uint8_t proto;
2853a3a95b7dSJasvinder Singh 
2854a3a95b7dSJasvinder Singh 			if (n_tokens < 8) {
2855a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_MISMATCH,
2856a3a95b7dSJasvinder Singh 					tokens[0]);
2857a3a95b7dSJasvinder Singh 				return 0;
2858a3a95b7dSJasvinder Singh 			}
2859a3a95b7dSJasvinder Singh 
2860a3a95b7dSJasvinder Singh 			if (parse_ipv4_addr(tokens[3], &saddr) != 0) {
2861a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2862a3a95b7dSJasvinder Singh 				return 0;
2863a3a95b7dSJasvinder Singh 			}
2864a3a95b7dSJasvinder Singh 
2865a3a95b7dSJasvinder Singh 			if (parse_ipv4_addr(tokens[4], &daddr) != 0) {
2866a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "da");
2867a3a95b7dSJasvinder Singh 				return 0;
2868a3a95b7dSJasvinder Singh 			}
2869a3a95b7dSJasvinder Singh 
2870a3a95b7dSJasvinder Singh 			if (parser_read_uint16(&sp, tokens[5]) != 0) {
2871a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "sp");
2872a3a95b7dSJasvinder Singh 				return 0;
2873a3a95b7dSJasvinder Singh 			}
2874a3a95b7dSJasvinder Singh 
2875a3a95b7dSJasvinder Singh 			if (parser_read_uint16(&dp, tokens[6]) != 0) {
2876a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "dp");
2877a3a95b7dSJasvinder Singh 				return 0;
2878a3a95b7dSJasvinder Singh 			}
2879a3a95b7dSJasvinder Singh 
2880a3a95b7dSJasvinder Singh 			if (parser_read_uint8(&proto, tokens[7]) != 0) {
2881a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID,
2882a3a95b7dSJasvinder Singh 					"proto");
2883a3a95b7dSJasvinder Singh 				return 0;
2884a3a95b7dSJasvinder Singh 			}
2885a3a95b7dSJasvinder Singh 
2886a3a95b7dSJasvinder Singh 			ipv4->sa = saddr.s_addr;
2887a3a95b7dSJasvinder Singh 			ipv4->da = daddr.s_addr;
2888a3a95b7dSJasvinder Singh 			ipv4->sp = rte_cpu_to_be_16(sp);
2889a3a95b7dSJasvinder Singh 			ipv4->dp = rte_cpu_to_be_16(dp);
2890a3a95b7dSJasvinder Singh 			ipv4->proto = proto;
2891a3a95b7dSJasvinder Singh 
2892a3a95b7dSJasvinder Singh 			return 8;
2893a3a95b7dSJasvinder Singh 		} /* hash ipv4_5tuple */
2894a3a95b7dSJasvinder Singh 
2895a3a95b7dSJasvinder Singh 		if (strcmp(tokens[2], "ipv6_5tuple") == 0) {
2896a3a95b7dSJasvinder Singh 			struct pkt_key_ipv6_5tuple *ipv6 =
2897a3a95b7dSJasvinder Singh 				(struct pkt_key_ipv6_5tuple *) m->match.hash.key;
2898a3a95b7dSJasvinder Singh 			struct in6_addr saddr, daddr;
2899a3a95b7dSJasvinder Singh 			uint16_t sp, dp;
2900a3a95b7dSJasvinder Singh 			uint8_t proto;
2901a3a95b7dSJasvinder Singh 
2902a3a95b7dSJasvinder Singh 			if (n_tokens < 8) {
2903a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_MISMATCH,
2904a3a95b7dSJasvinder Singh 					tokens[0]);
2905a3a95b7dSJasvinder Singh 				return 0;
2906a3a95b7dSJasvinder Singh 			}
2907a3a95b7dSJasvinder Singh 
2908a3a95b7dSJasvinder Singh 			if (parse_ipv6_addr(tokens[3], &saddr) != 0) {
2909a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2910a3a95b7dSJasvinder Singh 				return 0;
2911a3a95b7dSJasvinder Singh 			}
2912a3a95b7dSJasvinder Singh 
2913a3a95b7dSJasvinder Singh 			if (parse_ipv6_addr(tokens[4], &daddr) != 0) {
2914a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "da");
2915a3a95b7dSJasvinder Singh 				return 0;
2916a3a95b7dSJasvinder Singh 			}
2917a3a95b7dSJasvinder Singh 
2918a3a95b7dSJasvinder Singh 			if (parser_read_uint16(&sp, tokens[5]) != 0) {
2919a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "sp");
2920a3a95b7dSJasvinder Singh 				return 0;
2921a3a95b7dSJasvinder Singh 			}
2922a3a95b7dSJasvinder Singh 
2923a3a95b7dSJasvinder Singh 			if (parser_read_uint16(&dp, tokens[6]) != 0) {
2924a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID, "dp");
2925a3a95b7dSJasvinder Singh 				return 0;
2926a3a95b7dSJasvinder Singh 			}
2927a3a95b7dSJasvinder Singh 
2928a3a95b7dSJasvinder Singh 			if (parser_read_uint8(&proto, tokens[7]) != 0) {
2929a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID,
2930a3a95b7dSJasvinder Singh 					"proto");
2931a3a95b7dSJasvinder Singh 				return 0;
2932a3a95b7dSJasvinder Singh 			}
2933a3a95b7dSJasvinder Singh 
2934a3a95b7dSJasvinder Singh 			memcpy(ipv6->sa, saddr.s6_addr, 16);
2935a3a95b7dSJasvinder Singh 			memcpy(ipv6->da, daddr.s6_addr, 16);
2936a3a95b7dSJasvinder Singh 			ipv6->sp = rte_cpu_to_be_16(sp);
2937a3a95b7dSJasvinder Singh 			ipv6->dp = rte_cpu_to_be_16(dp);
2938a3a95b7dSJasvinder Singh 			ipv6->proto = proto;
2939a3a95b7dSJasvinder Singh 
2940a3a95b7dSJasvinder Singh 			return 8;
2941a3a95b7dSJasvinder Singh 		} /* hash ipv6_5tuple */
2942a3a95b7dSJasvinder Singh 
2943a3a95b7dSJasvinder Singh 		if (strcmp(tokens[2], "ipv4_addr") == 0) {
2944a3a95b7dSJasvinder Singh 			struct pkt_key_ipv4_addr *ipv4_addr =
2945a3a95b7dSJasvinder Singh 				(struct pkt_key_ipv4_addr *) m->match.hash.key;
2946a3a95b7dSJasvinder Singh 			struct in_addr addr;
2947a3a95b7dSJasvinder Singh 
2948a3a95b7dSJasvinder Singh 			if (n_tokens < 4) {
2949a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_MISMATCH,
2950a3a95b7dSJasvinder Singh 					tokens[0]);
2951a3a95b7dSJasvinder Singh 				return 0;
2952a3a95b7dSJasvinder Singh 			}
2953a3a95b7dSJasvinder Singh 
2954a3a95b7dSJasvinder Singh 			if (parse_ipv4_addr(tokens[3], &addr) != 0) {
2955a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID,
2956a3a95b7dSJasvinder Singh 					"addr");
2957a3a95b7dSJasvinder Singh 				return 0;
2958a3a95b7dSJasvinder Singh 			}
2959a3a95b7dSJasvinder Singh 
2960a3a95b7dSJasvinder Singh 			ipv4_addr->addr = addr.s_addr;
2961a3a95b7dSJasvinder Singh 
2962a3a95b7dSJasvinder Singh 			return 4;
2963a3a95b7dSJasvinder Singh 		} /* hash ipv4_addr */
2964a3a95b7dSJasvinder Singh 
2965a3a95b7dSJasvinder Singh 		if (strcmp(tokens[2], "ipv6_addr") == 0) {
2966a3a95b7dSJasvinder Singh 			struct pkt_key_ipv6_addr *ipv6_addr =
2967a3a95b7dSJasvinder Singh 				(struct pkt_key_ipv6_addr *) m->match.hash.key;
2968a3a95b7dSJasvinder Singh 			struct in6_addr addr;
2969a3a95b7dSJasvinder Singh 
2970a3a95b7dSJasvinder Singh 			if (n_tokens < 4) {
2971a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_MISMATCH,
2972a3a95b7dSJasvinder Singh 					tokens[0]);
2973a3a95b7dSJasvinder Singh 				return 0;
2974a3a95b7dSJasvinder Singh 			}
2975a3a95b7dSJasvinder Singh 
2976a3a95b7dSJasvinder Singh 			if (parse_ipv6_addr(tokens[3], &addr) != 0) {
2977a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID,
2978a3a95b7dSJasvinder Singh 					"addr");
2979a3a95b7dSJasvinder Singh 				return 0;
2980a3a95b7dSJasvinder Singh 			}
2981a3a95b7dSJasvinder Singh 
2982a3a95b7dSJasvinder Singh 			memcpy(ipv6_addr->addr, addr.s6_addr, 16);
2983a3a95b7dSJasvinder Singh 
2984a3a95b7dSJasvinder Singh 			return 4;
2985a3a95b7dSJasvinder Singh 		} /* hash ipv6_5tuple */
2986a3a95b7dSJasvinder Singh 
2987a3a95b7dSJasvinder Singh 		if (strcmp(tokens[2], "qinq") == 0) {
2988a3a95b7dSJasvinder Singh 			struct pkt_key_qinq *qinq =
2989a3a95b7dSJasvinder Singh 				(struct pkt_key_qinq *) m->match.hash.key;
2990a3a95b7dSJasvinder Singh 			uint16_t svlan, cvlan;
2991a3a95b7dSJasvinder Singh 
2992a3a95b7dSJasvinder Singh 			if (n_tokens < 5) {
2993a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_MISMATCH,
2994a3a95b7dSJasvinder Singh 					tokens[0]);
2995a3a95b7dSJasvinder Singh 				return 0;
2996a3a95b7dSJasvinder Singh 			}
2997a3a95b7dSJasvinder Singh 
2998a3a95b7dSJasvinder Singh 			if ((parser_read_uint16(&svlan, tokens[3]) != 0) ||
2999a3a95b7dSJasvinder Singh 				(svlan > 0xFFF)) {
3000a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID,
3001a3a95b7dSJasvinder Singh 					"svlan");
3002a3a95b7dSJasvinder Singh 				return 0;
3003a3a95b7dSJasvinder Singh 			}
3004a3a95b7dSJasvinder Singh 
3005a3a95b7dSJasvinder Singh 			if ((parser_read_uint16(&cvlan, tokens[4]) != 0) ||
3006a3a95b7dSJasvinder Singh 				(cvlan > 0xFFF)) {
3007a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID,
3008a3a95b7dSJasvinder Singh 					"cvlan");
3009a3a95b7dSJasvinder Singh 				return 0;
3010a3a95b7dSJasvinder Singh 			}
3011a3a95b7dSJasvinder Singh 
3012a3a95b7dSJasvinder Singh 			qinq->svlan = rte_cpu_to_be_16(svlan);
3013a3a95b7dSJasvinder Singh 			qinq->cvlan = rte_cpu_to_be_16(cvlan);
3014a3a95b7dSJasvinder Singh 
3015a3a95b7dSJasvinder Singh 			return 5;
3016a3a95b7dSJasvinder Singh 		} /* hash qinq */
3017a3a95b7dSJasvinder Singh 
3018a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3019a3a95b7dSJasvinder Singh 		return 0;
3020a3a95b7dSJasvinder Singh 	} /* hash */
3021a3a95b7dSJasvinder Singh 
3022a3a95b7dSJasvinder Singh 	if (strcmp(tokens[1], "lpm") == 0) {
3023a3a95b7dSJasvinder Singh 		if (n_tokens < 5) {
3024a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3025a3a95b7dSJasvinder Singh 			return 0;
3026a3a95b7dSJasvinder Singh 		}
3027a3a95b7dSJasvinder Singh 
3028a3a95b7dSJasvinder Singh 		m->match_type = TABLE_LPM;
3029a3a95b7dSJasvinder Singh 
3030a3a95b7dSJasvinder Singh 		if (strcmp(tokens[2], "ipv4") == 0) {
3031a3a95b7dSJasvinder Singh 			struct in_addr addr;
3032a3a95b7dSJasvinder Singh 
3033a3a95b7dSJasvinder Singh 			m->match.lpm.ip_version = 1;
3034a3a95b7dSJasvinder Singh 
3035a3a95b7dSJasvinder Singh 			if (parse_ipv4_addr(tokens[3], &addr) != 0) {
3036a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID,
3037a3a95b7dSJasvinder Singh 					"addr");
3038a3a95b7dSJasvinder Singh 				return 0;
3039a3a95b7dSJasvinder Singh 			}
3040a3a95b7dSJasvinder Singh 
3041a3a95b7dSJasvinder Singh 			m->match.lpm.ipv4 = rte_be_to_cpu_32(addr.s_addr);
3042a3a95b7dSJasvinder Singh 		} else if (strcmp(tokens[2], "ipv6") == 0) {
3043a3a95b7dSJasvinder Singh 			struct in6_addr addr;
3044a3a95b7dSJasvinder Singh 
3045a3a95b7dSJasvinder Singh 			m->match.lpm.ip_version = 0;
3046a3a95b7dSJasvinder Singh 
3047a3a95b7dSJasvinder Singh 			if (parse_ipv6_addr(tokens[3], &addr) != 0) {
3048a3a95b7dSJasvinder Singh 				snprintf(out, out_size, MSG_ARG_INVALID,
3049a3a95b7dSJasvinder Singh 					"addr");
3050a3a95b7dSJasvinder Singh 				return 0;
3051a3a95b7dSJasvinder Singh 			}
3052a3a95b7dSJasvinder Singh 
3053a3a95b7dSJasvinder Singh 			memcpy(m->match.lpm.ipv6, addr.s6_addr, 16);
3054a3a95b7dSJasvinder Singh 		} else {
3055a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
3056a3a95b7dSJasvinder Singh 				"ipv4 or ipv6");
3057a3a95b7dSJasvinder Singh 			return 0;
3058a3a95b7dSJasvinder Singh 		}
3059a3a95b7dSJasvinder Singh 
3060a3a95b7dSJasvinder Singh 		if (parser_read_uint8(&m->match.lpm.depth, tokens[4]) != 0) {
3061a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "depth");
3062a3a95b7dSJasvinder Singh 			return 0;
3063a3a95b7dSJasvinder Singh 		}
3064a3a95b7dSJasvinder Singh 
3065a3a95b7dSJasvinder Singh 		return 5;
3066a3a95b7dSJasvinder Singh 	} /* lpm */
3067a3a95b7dSJasvinder Singh 
3068a3a95b7dSJasvinder Singh 	snprintf(out, out_size, MSG_ARG_MISMATCH,
3069a3a95b7dSJasvinder Singh 		"acl or array or hash or lpm");
3070a3a95b7dSJasvinder Singh 	return 0;
3071a3a95b7dSJasvinder Singh }
3072a3a95b7dSJasvinder Singh 
3073a3a95b7dSJasvinder Singh /**
3074a3a95b7dSJasvinder Singh  * table_action ::=
3075a3a95b7dSJasvinder Singh  *
3076a3a95b7dSJasvinder Singh  * action
3077a3a95b7dSJasvinder Singh  *    fwd
3078a3a95b7dSJasvinder Singh  *       drop
3079a3a95b7dSJasvinder Singh  *       | port <port_id>
3080a3a95b7dSJasvinder Singh  *       | meta
3081a3a95b7dSJasvinder Singh  *       | table <table_id>
3082a3a95b7dSJasvinder Singh  *    [balance <out0> ... <out7>]
3083a3a95b7dSJasvinder Singh  *    [meter
3084a3a95b7dSJasvinder Singh  *       tc0 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
3085a3a95b7dSJasvinder Singh  *       [tc1 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
3086a3a95b7dSJasvinder Singh  *       tc2 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
3087a3a95b7dSJasvinder Singh  *       tc3 meter <meter_profile_id> policer g <pa> y <pa> r <pa>]]
3088a3a95b7dSJasvinder Singh  *    [tm subport <subport_id> pipe <pipe_id>]
3089a3a95b7dSJasvinder Singh  *    [encap
3090a3a95b7dSJasvinder Singh  *       ether <da> <sa>
3091a3a95b7dSJasvinder Singh  *       | vlan <da> <sa> <pcp> <dei> <vid>
3092a3a95b7dSJasvinder Singh  *       | qinq <da> <sa> <pcp> <dei> <vid> <pcp> <dei> <vid>
3093a3a95b7dSJasvinder Singh  *       | mpls unicast | multicast
3094a3a95b7dSJasvinder Singh  *          <da> <sa>
3095a3a95b7dSJasvinder Singh  *          label0 <label> <tc> <ttl>
3096a3a95b7dSJasvinder Singh  *          [label1 <label> <tc> <ttl>
3097a3a95b7dSJasvinder Singh  *          [label2 <label> <tc> <ttl>
3098a3a95b7dSJasvinder Singh  *          [label3 <label> <tc> <ttl>]]]
309944cad685SCristian Dumitrescu  *       | pppoe <da> <sa> <session_id>
310044cad685SCristian Dumitrescu  *       | vxlan ether <da> <sa>
310144cad685SCristian Dumitrescu  *          [vlan <pcp> <dei> <vid>]
310244cad685SCristian Dumitrescu  *          ipv4 <sa> <da> <dscp> <ttl>
310344cad685SCristian Dumitrescu  *          | ipv6 <sa> <da> <flow_label> <dscp> <hop_limit>
310444cad685SCristian Dumitrescu  *          udp <sp> <dp>
310544cad685SCristian Dumitrescu  *          vxlan <vni>]
3106a3a95b7dSJasvinder Singh  *    [nat ipv4 | ipv6 <addr> <port>]
3107a3a95b7dSJasvinder Singh  *    [ttl dec | keep]
3108a3a95b7dSJasvinder Singh  *    [stats]
3109a3a95b7dSJasvinder Singh  *    [time]
31101edccebcSFan Zhang  *    [sym_crypto
31111edccebcSFan Zhang  *       encrypt | decrypt
31121edccebcSFan Zhang  *       type
31131edccebcSFan Zhang  *       | cipher
31141edccebcSFan Zhang  *          cipher_algo <algo> cipher_key <key> cipher_iv <iv>
31151edccebcSFan Zhang  *       | cipher_auth
31161edccebcSFan Zhang  *          cipher_algo <algo> cipher_key <key> cipher_iv <iv>
31171edccebcSFan Zhang  *          auth_algo <algo> auth_key <key> digest_size <size>
31181edccebcSFan Zhang  *       | aead
31191edccebcSFan Zhang  *          aead_algo <algo> aead_key <key> aead_iv <iv> aead_aad <aad>
31201edccebcSFan Zhang  *          digest_size <size>
31211edccebcSFan Zhang  *       data_offset <data_offset>]
31221bdf2632SCristian Dumitrescu  *    [tag <tag>]
3123*d5ed626fSCristian Dumitrescu  *    [decap <n>]
3124a3a95b7dSJasvinder Singh  *
3125a3a95b7dSJasvinder Singh  * where:
3126a3a95b7dSJasvinder Singh  *    <pa> ::= g | y | r | drop
3127a3a95b7dSJasvinder Singh  */
3128a3a95b7dSJasvinder Singh static uint32_t
3129a3a95b7dSJasvinder Singh parse_table_action_fwd(char **tokens,
3130a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
3131a3a95b7dSJasvinder Singh 	struct table_rule_action *a)
3132a3a95b7dSJasvinder Singh {
3133a3a95b7dSJasvinder Singh 	if ((n_tokens == 0) || (strcmp(tokens[0], "fwd") != 0))
3134a3a95b7dSJasvinder Singh 		return 0;
3135a3a95b7dSJasvinder Singh 
3136a3a95b7dSJasvinder Singh 	tokens++;
3137a3a95b7dSJasvinder Singh 	n_tokens--;
3138a3a95b7dSJasvinder Singh 
3139a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "drop") == 0)) {
3140a3a95b7dSJasvinder Singh 		a->fwd.action = RTE_PIPELINE_ACTION_DROP;
3141a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
3142a3a95b7dSJasvinder Singh 		return 1 + 1;
3143a3a95b7dSJasvinder Singh 	}
3144a3a95b7dSJasvinder Singh 
3145a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "port") == 0)) {
3146a3a95b7dSJasvinder Singh 		uint32_t id;
3147a3a95b7dSJasvinder Singh 
3148a3a95b7dSJasvinder Singh 		if ((n_tokens < 2) ||
3149a3a95b7dSJasvinder Singh 			parser_read_uint32(&id, tokens[1]))
3150a3a95b7dSJasvinder Singh 			return 0;
3151a3a95b7dSJasvinder Singh 
3152a3a95b7dSJasvinder Singh 		a->fwd.action = RTE_PIPELINE_ACTION_PORT;
3153a3a95b7dSJasvinder Singh 		a->fwd.id = id;
3154a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
3155a3a95b7dSJasvinder Singh 		return 1 + 2;
3156a3a95b7dSJasvinder Singh 	}
3157a3a95b7dSJasvinder Singh 
3158a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "meta") == 0)) {
3159a3a95b7dSJasvinder Singh 		a->fwd.action = RTE_PIPELINE_ACTION_PORT_META;
3160a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
3161a3a95b7dSJasvinder Singh 		return 1 + 1;
3162a3a95b7dSJasvinder Singh 	}
3163a3a95b7dSJasvinder Singh 
3164a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "table") == 0)) {
3165a3a95b7dSJasvinder Singh 		uint32_t id;
3166a3a95b7dSJasvinder Singh 
3167a3a95b7dSJasvinder Singh 		if ((n_tokens < 2) ||
3168a3a95b7dSJasvinder Singh 			parser_read_uint32(&id, tokens[1]))
3169a3a95b7dSJasvinder Singh 			return 0;
3170a3a95b7dSJasvinder Singh 
3171a3a95b7dSJasvinder Singh 		a->fwd.action = RTE_PIPELINE_ACTION_TABLE;
3172a3a95b7dSJasvinder Singh 		a->fwd.id = id;
3173a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
3174a3a95b7dSJasvinder Singh 		return 1 + 2;
3175a3a95b7dSJasvinder Singh 	}
3176a3a95b7dSJasvinder Singh 
3177a3a95b7dSJasvinder Singh 	return 0;
3178a3a95b7dSJasvinder Singh }
3179a3a95b7dSJasvinder Singh 
3180802755dcSJasvinder Singh static uint32_t
3181802755dcSJasvinder Singh parse_table_action_balance(char **tokens,
3182802755dcSJasvinder Singh 	uint32_t n_tokens,
3183802755dcSJasvinder Singh 	struct table_rule_action *a)
3184802755dcSJasvinder Singh {
3185802755dcSJasvinder Singh 	uint32_t i;
3186802755dcSJasvinder Singh 
3187802755dcSJasvinder Singh 	if ((n_tokens == 0) || (strcmp(tokens[0], "balance") != 0))
3188802755dcSJasvinder Singh 		return 0;
3189802755dcSJasvinder Singh 
3190802755dcSJasvinder Singh 	tokens++;
3191802755dcSJasvinder Singh 	n_tokens--;
3192802755dcSJasvinder Singh 
3193085c3d8cSJasvinder Singh 	if (n_tokens < RTE_TABLE_ACTION_LB_TABLE_SIZE)
3194802755dcSJasvinder Singh 		return 0;
3195802755dcSJasvinder Singh 
3196085c3d8cSJasvinder Singh 	for (i = 0; i < RTE_TABLE_ACTION_LB_TABLE_SIZE; i++)
3197802755dcSJasvinder Singh 		if (parser_read_uint32(&a->lb.out[i], tokens[i]) != 0)
3198802755dcSJasvinder Singh 			return 0;
3199802755dcSJasvinder Singh 
3200802755dcSJasvinder Singh 	a->action_mask |= 1 << RTE_TABLE_ACTION_LB;
3201085c3d8cSJasvinder Singh 	return 1 + RTE_TABLE_ACTION_LB_TABLE_SIZE;
3202802755dcSJasvinder Singh 
3203802755dcSJasvinder Singh }
3204802755dcSJasvinder Singh 
3205a3a95b7dSJasvinder Singh static int
3206a3a95b7dSJasvinder Singh parse_policer_action(char *token, enum rte_table_action_policer *a)
3207a3a95b7dSJasvinder Singh {
3208a3a95b7dSJasvinder Singh 	if (strcmp(token, "g") == 0) {
3209a3a95b7dSJasvinder Singh 		*a = RTE_TABLE_ACTION_POLICER_COLOR_GREEN;
3210a3a95b7dSJasvinder Singh 		return 0;
3211a3a95b7dSJasvinder Singh 	}
3212a3a95b7dSJasvinder Singh 
3213a3a95b7dSJasvinder Singh 	if (strcmp(token, "y") == 0) {
3214a3a95b7dSJasvinder Singh 		*a = RTE_TABLE_ACTION_POLICER_COLOR_YELLOW;
3215a3a95b7dSJasvinder Singh 		return 0;
3216a3a95b7dSJasvinder Singh 	}
3217a3a95b7dSJasvinder Singh 
3218a3a95b7dSJasvinder Singh 	if (strcmp(token, "r") == 0) {
3219a3a95b7dSJasvinder Singh 		*a = RTE_TABLE_ACTION_POLICER_COLOR_RED;
3220a3a95b7dSJasvinder Singh 		return 0;
3221a3a95b7dSJasvinder Singh 	}
3222a3a95b7dSJasvinder Singh 
3223a3a95b7dSJasvinder Singh 	if (strcmp(token, "drop") == 0) {
3224a3a95b7dSJasvinder Singh 		*a = RTE_TABLE_ACTION_POLICER_DROP;
3225a3a95b7dSJasvinder Singh 		return 0;
3226a3a95b7dSJasvinder Singh 	}
3227a3a95b7dSJasvinder Singh 
3228a3a95b7dSJasvinder Singh 	return -1;
3229a3a95b7dSJasvinder Singh }
3230a3a95b7dSJasvinder Singh 
3231a3a95b7dSJasvinder Singh static uint32_t
3232a3a95b7dSJasvinder Singh parse_table_action_meter_tc(char **tokens,
3233a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
3234a3a95b7dSJasvinder Singh 	struct rte_table_action_mtr_tc_params *mtr)
3235a3a95b7dSJasvinder Singh {
3236a3a95b7dSJasvinder Singh 	if ((n_tokens < 9) ||
3237a3a95b7dSJasvinder Singh 		strcmp(tokens[0], "meter") ||
3238a3a95b7dSJasvinder Singh 		parser_read_uint32(&mtr->meter_profile_id, tokens[1]) ||
3239a3a95b7dSJasvinder Singh 		strcmp(tokens[2], "policer") ||
3240a3a95b7dSJasvinder Singh 		strcmp(tokens[3], "g") ||
3241a3a95b7dSJasvinder Singh 		parse_policer_action(tokens[4], &mtr->policer[e_RTE_METER_GREEN]) ||
3242a3a95b7dSJasvinder Singh 		strcmp(tokens[5], "y") ||
3243a3a95b7dSJasvinder Singh 		parse_policer_action(tokens[6], &mtr->policer[e_RTE_METER_YELLOW]) ||
3244a3a95b7dSJasvinder Singh 		strcmp(tokens[7], "r") ||
3245a3a95b7dSJasvinder Singh 		parse_policer_action(tokens[8], &mtr->policer[e_RTE_METER_RED]))
3246a3a95b7dSJasvinder Singh 		return 0;
3247a3a95b7dSJasvinder Singh 
3248a3a95b7dSJasvinder Singh 	return 9;
3249a3a95b7dSJasvinder Singh }
3250a3a95b7dSJasvinder Singh 
3251a3a95b7dSJasvinder Singh static uint32_t
3252a3a95b7dSJasvinder Singh parse_table_action_meter(char **tokens,
3253a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
3254a3a95b7dSJasvinder Singh 	struct table_rule_action *a)
3255a3a95b7dSJasvinder Singh {
3256a3a95b7dSJasvinder Singh 	if ((n_tokens == 0) || strcmp(tokens[0], "meter"))
3257a3a95b7dSJasvinder Singh 		return 0;
3258a3a95b7dSJasvinder Singh 
3259a3a95b7dSJasvinder Singh 	tokens++;
3260a3a95b7dSJasvinder Singh 	n_tokens--;
3261a3a95b7dSJasvinder Singh 
3262a3a95b7dSJasvinder Singh 	if ((n_tokens < 10) ||
3263a3a95b7dSJasvinder Singh 		strcmp(tokens[0], "tc0") ||
3264a3a95b7dSJasvinder Singh 		(parse_table_action_meter_tc(tokens + 1,
3265a3a95b7dSJasvinder Singh 			n_tokens - 1,
3266a3a95b7dSJasvinder Singh 			&a->mtr.mtr[0]) == 0))
3267a3a95b7dSJasvinder Singh 		return 0;
3268a3a95b7dSJasvinder Singh 
3269a3a95b7dSJasvinder Singh 	tokens += 10;
3270a3a95b7dSJasvinder Singh 	n_tokens -= 10;
3271a3a95b7dSJasvinder Singh 
3272a3a95b7dSJasvinder Singh 	if ((n_tokens == 0) || strcmp(tokens[0], "tc1")) {
3273a3a95b7dSJasvinder Singh 		a->mtr.tc_mask = 1;
3274a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_MTR;
3275a3a95b7dSJasvinder Singh 		return 1 + 10;
3276a3a95b7dSJasvinder Singh 	}
3277a3a95b7dSJasvinder Singh 
3278a3a95b7dSJasvinder Singh 	if ((n_tokens < 30) ||
3279a3a95b7dSJasvinder Singh 		(parse_table_action_meter_tc(tokens + 1,
3280a3a95b7dSJasvinder Singh 			n_tokens - 1, &a->mtr.mtr[1]) == 0) ||
3281a3a95b7dSJasvinder Singh 		strcmp(tokens[10], "tc2") ||
3282a3a95b7dSJasvinder Singh 		(parse_table_action_meter_tc(tokens + 11,
3283a3a95b7dSJasvinder Singh 			n_tokens - 11, &a->mtr.mtr[2]) == 0) ||
3284a3a95b7dSJasvinder Singh 		strcmp(tokens[20], "tc3") ||
3285a3a95b7dSJasvinder Singh 		(parse_table_action_meter_tc(tokens + 21,
3286a3a95b7dSJasvinder Singh 			n_tokens - 21, &a->mtr.mtr[3]) == 0))
3287a3a95b7dSJasvinder Singh 		return 0;
3288a3a95b7dSJasvinder Singh 
3289a3a95b7dSJasvinder Singh 	a->mtr.tc_mask = 0xF;
3290a3a95b7dSJasvinder Singh 	a->action_mask |= 1 << RTE_TABLE_ACTION_MTR;
3291a3a95b7dSJasvinder Singh 	return 1 + 10 + 3 * 10;
3292a3a95b7dSJasvinder Singh }
3293a3a95b7dSJasvinder Singh 
3294a3a95b7dSJasvinder Singh static uint32_t
3295a3a95b7dSJasvinder Singh parse_table_action_tm(char **tokens,
3296a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
3297a3a95b7dSJasvinder Singh 	struct table_rule_action *a)
3298a3a95b7dSJasvinder Singh {
3299a3a95b7dSJasvinder Singh 	uint32_t subport_id, pipe_id;
3300a3a95b7dSJasvinder Singh 
3301a3a95b7dSJasvinder Singh 	if ((n_tokens < 5) ||
3302a3a95b7dSJasvinder Singh 		strcmp(tokens[0], "tm") ||
3303a3a95b7dSJasvinder Singh 		strcmp(tokens[1], "subport") ||
3304a3a95b7dSJasvinder Singh 		parser_read_uint32(&subport_id, tokens[2]) ||
3305a3a95b7dSJasvinder Singh 		strcmp(tokens[3], "pipe") ||
3306a3a95b7dSJasvinder Singh 		parser_read_uint32(&pipe_id, tokens[4]))
3307a3a95b7dSJasvinder Singh 		return 0;
3308a3a95b7dSJasvinder Singh 
3309a3a95b7dSJasvinder Singh 	a->tm.subport_id = subport_id;
3310a3a95b7dSJasvinder Singh 	a->tm.pipe_id = pipe_id;
3311a3a95b7dSJasvinder Singh 	a->action_mask |= 1 << RTE_TABLE_ACTION_TM;
3312a3a95b7dSJasvinder Singh 	return 5;
3313a3a95b7dSJasvinder Singh }
3314a3a95b7dSJasvinder Singh 
3315a3a95b7dSJasvinder Singh static uint32_t
3316a3a95b7dSJasvinder Singh parse_table_action_encap(char **tokens,
3317a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
3318a3a95b7dSJasvinder Singh 	struct table_rule_action *a)
3319a3a95b7dSJasvinder Singh {
3320a3a95b7dSJasvinder Singh 	if ((n_tokens == 0) || strcmp(tokens[0], "encap"))
3321a3a95b7dSJasvinder Singh 		return 0;
3322a3a95b7dSJasvinder Singh 
3323a3a95b7dSJasvinder Singh 	tokens++;
3324a3a95b7dSJasvinder Singh 	n_tokens--;
3325a3a95b7dSJasvinder Singh 
3326a3a95b7dSJasvinder Singh 	/* ether */
3327a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "ether") == 0)) {
3328a3a95b7dSJasvinder Singh 		if ((n_tokens < 3) ||
3329a3a95b7dSJasvinder Singh 			parse_mac_addr(tokens[1], &a->encap.ether.ether.da) ||
3330a3a95b7dSJasvinder Singh 			parse_mac_addr(tokens[2], &a->encap.ether.ether.sa))
3331a3a95b7dSJasvinder Singh 			return 0;
3332a3a95b7dSJasvinder Singh 
3333a3a95b7dSJasvinder Singh 		a->encap.type = RTE_TABLE_ACTION_ENCAP_ETHER;
3334a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3335a3a95b7dSJasvinder Singh 		return 1 + 3;
3336a3a95b7dSJasvinder Singh 	}
3337a3a95b7dSJasvinder Singh 
3338a3a95b7dSJasvinder Singh 	/* vlan */
3339a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "vlan") == 0)) {
3340a3a95b7dSJasvinder Singh 		uint32_t pcp, dei, vid;
3341a3a95b7dSJasvinder Singh 
3342a3a95b7dSJasvinder Singh 		if ((n_tokens < 6) ||
3343a3a95b7dSJasvinder Singh 			parse_mac_addr(tokens[1], &a->encap.vlan.ether.da) ||
3344a3a95b7dSJasvinder Singh 			parse_mac_addr(tokens[2], &a->encap.vlan.ether.sa) ||
3345a3a95b7dSJasvinder Singh 			parser_read_uint32(&pcp, tokens[3]) ||
3346a3a95b7dSJasvinder Singh 			(pcp > 0x7) ||
3347a3a95b7dSJasvinder Singh 			parser_read_uint32(&dei, tokens[4]) ||
3348a3a95b7dSJasvinder Singh 			(dei > 0x1) ||
3349a3a95b7dSJasvinder Singh 			parser_read_uint32(&vid, tokens[5]) ||
3350a3a95b7dSJasvinder Singh 			(vid > 0xFFF))
3351a3a95b7dSJasvinder Singh 			return 0;
3352a3a95b7dSJasvinder Singh 
3353a3a95b7dSJasvinder Singh 		a->encap.vlan.vlan.pcp = pcp & 0x7;
3354a3a95b7dSJasvinder Singh 		a->encap.vlan.vlan.dei = dei & 0x1;
3355a3a95b7dSJasvinder Singh 		a->encap.vlan.vlan.vid = vid & 0xFFF;
3356a3a95b7dSJasvinder Singh 		a->encap.type = RTE_TABLE_ACTION_ENCAP_VLAN;
3357a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3358a3a95b7dSJasvinder Singh 		return 1 + 6;
3359a3a95b7dSJasvinder Singh 	}
3360a3a95b7dSJasvinder Singh 
3361a3a95b7dSJasvinder Singh 	/* qinq */
3362a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "qinq") == 0)) {
3363a3a95b7dSJasvinder Singh 		uint32_t svlan_pcp, svlan_dei, svlan_vid;
3364a3a95b7dSJasvinder Singh 		uint32_t cvlan_pcp, cvlan_dei, cvlan_vid;
3365a3a95b7dSJasvinder Singh 
3366a3a95b7dSJasvinder Singh 		if ((n_tokens < 9) ||
3367a3a95b7dSJasvinder Singh 			parse_mac_addr(tokens[1], &a->encap.qinq.ether.da) ||
3368a3a95b7dSJasvinder Singh 			parse_mac_addr(tokens[2], &a->encap.qinq.ether.sa) ||
3369a3a95b7dSJasvinder Singh 			parser_read_uint32(&svlan_pcp, tokens[3]) ||
3370a3a95b7dSJasvinder Singh 			(svlan_pcp > 0x7) ||
3371a3a95b7dSJasvinder Singh 			parser_read_uint32(&svlan_dei, tokens[4]) ||
3372a3a95b7dSJasvinder Singh 			(svlan_dei > 0x1) ||
3373a3a95b7dSJasvinder Singh 			parser_read_uint32(&svlan_vid, tokens[5]) ||
3374a3a95b7dSJasvinder Singh 			(svlan_vid > 0xFFF) ||
3375a3a95b7dSJasvinder Singh 			parser_read_uint32(&cvlan_pcp, tokens[6]) ||
3376a3a95b7dSJasvinder Singh 			(cvlan_pcp > 0x7) ||
3377a3a95b7dSJasvinder Singh 			parser_read_uint32(&cvlan_dei, tokens[7]) ||
3378a3a95b7dSJasvinder Singh 			(cvlan_dei > 0x1) ||
3379a3a95b7dSJasvinder Singh 			parser_read_uint32(&cvlan_vid, tokens[8]) ||
3380a3a95b7dSJasvinder Singh 			(cvlan_vid > 0xFFF))
3381a3a95b7dSJasvinder Singh 			return 0;
3382a3a95b7dSJasvinder Singh 
3383a3a95b7dSJasvinder Singh 		a->encap.qinq.svlan.pcp = svlan_pcp & 0x7;
3384a3a95b7dSJasvinder Singh 		a->encap.qinq.svlan.dei = svlan_dei & 0x1;
3385a3a95b7dSJasvinder Singh 		a->encap.qinq.svlan.vid = svlan_vid & 0xFFF;
3386a3a95b7dSJasvinder Singh 		a->encap.qinq.cvlan.pcp = cvlan_pcp & 0x7;
3387a3a95b7dSJasvinder Singh 		a->encap.qinq.cvlan.dei = cvlan_dei & 0x1;
3388a3a95b7dSJasvinder Singh 		a->encap.qinq.cvlan.vid = cvlan_vid & 0xFFF;
3389a3a95b7dSJasvinder Singh 		a->encap.type = RTE_TABLE_ACTION_ENCAP_QINQ;
3390a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3391a3a95b7dSJasvinder Singh 		return 1 + 9;
3392a3a95b7dSJasvinder Singh 	}
3393a3a95b7dSJasvinder Singh 
3394a3a95b7dSJasvinder Singh 	/* mpls */
3395a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "mpls") == 0)) {
3396a3a95b7dSJasvinder Singh 		uint32_t label, tc, ttl;
3397a3a95b7dSJasvinder Singh 
3398a3a95b7dSJasvinder Singh 		if (n_tokens < 8)
3399a3a95b7dSJasvinder Singh 			return 0;
3400a3a95b7dSJasvinder Singh 
3401a3a95b7dSJasvinder Singh 		if (strcmp(tokens[1], "unicast") == 0)
3402a3a95b7dSJasvinder Singh 			a->encap.mpls.unicast = 1;
3403a3a95b7dSJasvinder Singh 		else if (strcmp(tokens[1], "multicast") == 0)
3404a3a95b7dSJasvinder Singh 			a->encap.mpls.unicast = 0;
3405a3a95b7dSJasvinder Singh 		else
3406a3a95b7dSJasvinder Singh 			return 0;
3407a3a95b7dSJasvinder Singh 
3408a3a95b7dSJasvinder Singh 		if (parse_mac_addr(tokens[2], &a->encap.mpls.ether.da) ||
3409a3a95b7dSJasvinder Singh 			parse_mac_addr(tokens[3], &a->encap.mpls.ether.sa) ||
3410a3a95b7dSJasvinder Singh 			strcmp(tokens[4], "label0") ||
3411a3a95b7dSJasvinder Singh 			parser_read_uint32(&label, tokens[5]) ||
3412a3a95b7dSJasvinder Singh 			(label > 0xFFFFF) ||
3413a3a95b7dSJasvinder Singh 			parser_read_uint32(&tc, tokens[6]) ||
3414a3a95b7dSJasvinder Singh 			(tc > 0x7) ||
3415a3a95b7dSJasvinder Singh 			parser_read_uint32(&ttl, tokens[7]) ||
3416a3a95b7dSJasvinder Singh 			(ttl > 0x3F))
3417a3a95b7dSJasvinder Singh 			return 0;
3418a3a95b7dSJasvinder Singh 
3419a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[0].label = label;
3420a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[0].tc = tc;
3421a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[0].ttl = ttl;
3422a3a95b7dSJasvinder Singh 
3423a3a95b7dSJasvinder Singh 		tokens += 8;
3424a3a95b7dSJasvinder Singh 		n_tokens -= 8;
3425a3a95b7dSJasvinder Singh 
3426a3a95b7dSJasvinder Singh 		if ((n_tokens == 0) || strcmp(tokens[0], "label1")) {
3427a3a95b7dSJasvinder Singh 			a->encap.mpls.mpls_count = 1;
3428a3a95b7dSJasvinder Singh 			a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3429a3a95b7dSJasvinder Singh 			a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3430a3a95b7dSJasvinder Singh 			return 1 + 8;
3431a3a95b7dSJasvinder Singh 		}
3432a3a95b7dSJasvinder Singh 
3433a3a95b7dSJasvinder Singh 		if ((n_tokens < 4) ||
3434a3a95b7dSJasvinder Singh 			parser_read_uint32(&label, tokens[1]) ||
3435a3a95b7dSJasvinder Singh 			(label > 0xFFFFF) ||
3436a3a95b7dSJasvinder Singh 			parser_read_uint32(&tc, tokens[2]) ||
3437a3a95b7dSJasvinder Singh 			(tc > 0x7) ||
3438a3a95b7dSJasvinder Singh 			parser_read_uint32(&ttl, tokens[3]) ||
3439a3a95b7dSJasvinder Singh 			(ttl > 0x3F))
3440a3a95b7dSJasvinder Singh 			return 0;
3441a3a95b7dSJasvinder Singh 
3442a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[1].label = label;
3443a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[1].tc = tc;
3444a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[1].ttl = ttl;
3445a3a95b7dSJasvinder Singh 
3446a3a95b7dSJasvinder Singh 		tokens += 4;
3447a3a95b7dSJasvinder Singh 		n_tokens -= 4;
3448a3a95b7dSJasvinder Singh 
3449a3a95b7dSJasvinder Singh 		if ((n_tokens == 0) || strcmp(tokens[0], "label2")) {
3450a3a95b7dSJasvinder Singh 			a->encap.mpls.mpls_count = 2;
3451a3a95b7dSJasvinder Singh 			a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3452a3a95b7dSJasvinder Singh 			a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3453a3a95b7dSJasvinder Singh 			return 1 + 8 + 4;
3454a3a95b7dSJasvinder Singh 		}
3455a3a95b7dSJasvinder Singh 
3456a3a95b7dSJasvinder Singh 		if ((n_tokens < 4) ||
3457a3a95b7dSJasvinder Singh 			parser_read_uint32(&label, tokens[1]) ||
3458a3a95b7dSJasvinder Singh 			(label > 0xFFFFF) ||
3459a3a95b7dSJasvinder Singh 			parser_read_uint32(&tc, tokens[2]) ||
3460a3a95b7dSJasvinder Singh 			(tc > 0x7) ||
3461a3a95b7dSJasvinder Singh 			parser_read_uint32(&ttl, tokens[3]) ||
3462a3a95b7dSJasvinder Singh 			(ttl > 0x3F))
3463a3a95b7dSJasvinder Singh 			return 0;
3464a3a95b7dSJasvinder Singh 
3465a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[2].label = label;
3466a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[2].tc = tc;
3467a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[2].ttl = ttl;
3468a3a95b7dSJasvinder Singh 
3469a3a95b7dSJasvinder Singh 		tokens += 4;
3470a3a95b7dSJasvinder Singh 		n_tokens -= 4;
3471a3a95b7dSJasvinder Singh 
3472a3a95b7dSJasvinder Singh 		if ((n_tokens == 0) || strcmp(tokens[0], "label3")) {
3473a3a95b7dSJasvinder Singh 			a->encap.mpls.mpls_count = 3;
3474a3a95b7dSJasvinder Singh 			a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3475a3a95b7dSJasvinder Singh 			a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3476a3a95b7dSJasvinder Singh 			return 1 + 8 + 4 + 4;
3477a3a95b7dSJasvinder Singh 		}
3478a3a95b7dSJasvinder Singh 
3479a3a95b7dSJasvinder Singh 		if ((n_tokens < 4) ||
3480a3a95b7dSJasvinder Singh 			parser_read_uint32(&label, tokens[1]) ||
3481a3a95b7dSJasvinder Singh 			(label > 0xFFFFF) ||
3482a3a95b7dSJasvinder Singh 			parser_read_uint32(&tc, tokens[2]) ||
3483a3a95b7dSJasvinder Singh 			(tc > 0x7) ||
3484a3a95b7dSJasvinder Singh 			parser_read_uint32(&ttl, tokens[3]) ||
3485a3a95b7dSJasvinder Singh 			(ttl > 0x3F))
3486a3a95b7dSJasvinder Singh 			return 0;
3487a3a95b7dSJasvinder Singh 
3488a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[3].label = label;
3489a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[3].tc = tc;
3490a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls[3].ttl = ttl;
3491a3a95b7dSJasvinder Singh 
3492a3a95b7dSJasvinder Singh 		a->encap.mpls.mpls_count = 4;
3493a3a95b7dSJasvinder Singh 		a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3494a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3495a3a95b7dSJasvinder Singh 		return 1 + 8 + 4 + 4 + 4;
3496a3a95b7dSJasvinder Singh 	}
3497a3a95b7dSJasvinder Singh 
3498a3a95b7dSJasvinder Singh 	/* pppoe */
3499a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "pppoe") == 0)) {
3500a3a95b7dSJasvinder Singh 		if ((n_tokens < 4) ||
3501a3a95b7dSJasvinder Singh 			parse_mac_addr(tokens[1], &a->encap.pppoe.ether.da) ||
3502a3a95b7dSJasvinder Singh 			parse_mac_addr(tokens[2], &a->encap.pppoe.ether.sa) ||
3503a3a95b7dSJasvinder Singh 			parser_read_uint16(&a->encap.pppoe.pppoe.session_id,
3504a3a95b7dSJasvinder Singh 				tokens[3]))
3505a3a95b7dSJasvinder Singh 			return 0;
3506a3a95b7dSJasvinder Singh 
3507a3a95b7dSJasvinder Singh 		a->encap.type = RTE_TABLE_ACTION_ENCAP_PPPOE;
3508a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3509a3a95b7dSJasvinder Singh 		return 1 + 4;
3510a3a95b7dSJasvinder Singh 	}
3511a3a95b7dSJasvinder Singh 
351244cad685SCristian Dumitrescu 	/* vxlan */
351344cad685SCristian Dumitrescu 	if (n_tokens && (strcmp(tokens[0], "vxlan") == 0)) {
351444cad685SCristian Dumitrescu 		uint32_t n = 0;
351544cad685SCristian Dumitrescu 
351644cad685SCristian Dumitrescu 		n_tokens--;
351744cad685SCristian Dumitrescu 		tokens++;
351844cad685SCristian Dumitrescu 		n++;
351944cad685SCristian Dumitrescu 
352044cad685SCristian Dumitrescu 		/* ether <da> <sa> */
352144cad685SCristian Dumitrescu 		if ((n_tokens < 3) ||
352244cad685SCristian Dumitrescu 			strcmp(tokens[0], "ether") ||
352344cad685SCristian Dumitrescu 			parse_mac_addr(tokens[1], &a->encap.vxlan.ether.da) ||
352444cad685SCristian Dumitrescu 			parse_mac_addr(tokens[2], &a->encap.vxlan.ether.sa))
352544cad685SCristian Dumitrescu 			return 0;
352644cad685SCristian Dumitrescu 
352744cad685SCristian Dumitrescu 		n_tokens -= 3;
352844cad685SCristian Dumitrescu 		tokens += 3;
352944cad685SCristian Dumitrescu 		n += 3;
353044cad685SCristian Dumitrescu 
353144cad685SCristian Dumitrescu 		/* [vlan <pcp> <dei> <vid>] */
353244cad685SCristian Dumitrescu 		if (strcmp(tokens[0], "vlan") == 0) {
353344cad685SCristian Dumitrescu 			uint32_t pcp, dei, vid;
353444cad685SCristian Dumitrescu 
353544cad685SCristian Dumitrescu 			if ((n_tokens < 4) ||
353644cad685SCristian Dumitrescu 				parser_read_uint32(&pcp, tokens[1]) ||
353744cad685SCristian Dumitrescu 				(pcp > 7) ||
353844cad685SCristian Dumitrescu 				parser_read_uint32(&dei, tokens[2]) ||
353944cad685SCristian Dumitrescu 				(dei > 1) ||
354044cad685SCristian Dumitrescu 				parser_read_uint32(&vid, tokens[3]) ||
354144cad685SCristian Dumitrescu 				(vid > 0xFFF))
354244cad685SCristian Dumitrescu 				return 0;
354344cad685SCristian Dumitrescu 
354444cad685SCristian Dumitrescu 			a->encap.vxlan.vlan.pcp = pcp;
354544cad685SCristian Dumitrescu 			a->encap.vxlan.vlan.dei = dei;
354644cad685SCristian Dumitrescu 			a->encap.vxlan.vlan.vid = vid;
354744cad685SCristian Dumitrescu 
354844cad685SCristian Dumitrescu 			n_tokens -= 4;
354944cad685SCristian Dumitrescu 			tokens += 4;
355044cad685SCristian Dumitrescu 			n += 4;
355144cad685SCristian Dumitrescu 		}
355244cad685SCristian Dumitrescu 
355344cad685SCristian Dumitrescu 		/* ipv4 <sa> <da> <dscp> <ttl>
355444cad685SCristian Dumitrescu 		   | ipv6 <sa> <da> <flow_label> <dscp> <hop_limit> */
355544cad685SCristian Dumitrescu 		if (strcmp(tokens[0], "ipv4") == 0) {
355644cad685SCristian Dumitrescu 			struct in_addr sa, da;
355744cad685SCristian Dumitrescu 			uint8_t dscp, ttl;
355844cad685SCristian Dumitrescu 
355944cad685SCristian Dumitrescu 			if ((n_tokens < 5) ||
356044cad685SCristian Dumitrescu 				parse_ipv4_addr(tokens[1], &sa) ||
356144cad685SCristian Dumitrescu 				parse_ipv4_addr(tokens[2], &da) ||
356244cad685SCristian Dumitrescu 				parser_read_uint8(&dscp, tokens[3]) ||
356344cad685SCristian Dumitrescu 				(dscp > 64) ||
356444cad685SCristian Dumitrescu 				parser_read_uint8(&ttl, tokens[4]))
356544cad685SCristian Dumitrescu 				return 0;
356644cad685SCristian Dumitrescu 
356744cad685SCristian Dumitrescu 			a->encap.vxlan.ipv4.sa = rte_be_to_cpu_32(sa.s_addr);
356844cad685SCristian Dumitrescu 			a->encap.vxlan.ipv4.da = rte_be_to_cpu_32(da.s_addr);
356944cad685SCristian Dumitrescu 			a->encap.vxlan.ipv4.dscp = dscp;
357044cad685SCristian Dumitrescu 			a->encap.vxlan.ipv4.ttl = ttl;
357144cad685SCristian Dumitrescu 
357244cad685SCristian Dumitrescu 			n_tokens -= 5;
357344cad685SCristian Dumitrescu 			tokens += 5;
357444cad685SCristian Dumitrescu 			n += 5;
357544cad685SCristian Dumitrescu 		} else if (strcmp(tokens[0], "ipv6") == 0) {
357644cad685SCristian Dumitrescu 			struct in6_addr sa, da;
357744cad685SCristian Dumitrescu 			uint32_t flow_label;
357844cad685SCristian Dumitrescu 			uint8_t dscp, hop_limit;
357944cad685SCristian Dumitrescu 
358044cad685SCristian Dumitrescu 			if ((n_tokens < 6) ||
358144cad685SCristian Dumitrescu 				parse_ipv6_addr(tokens[1], &sa) ||
358244cad685SCristian Dumitrescu 				parse_ipv6_addr(tokens[2], &da) ||
358344cad685SCristian Dumitrescu 				parser_read_uint32(&flow_label, tokens[3]) ||
358444cad685SCristian Dumitrescu 				parser_read_uint8(&dscp, tokens[4]) ||
358544cad685SCristian Dumitrescu 				(dscp > 64) ||
358644cad685SCristian Dumitrescu 				parser_read_uint8(&hop_limit, tokens[5]))
358744cad685SCristian Dumitrescu 				return 0;
358844cad685SCristian Dumitrescu 
358944cad685SCristian Dumitrescu 			memcpy(a->encap.vxlan.ipv6.sa, sa.s6_addr, 16);
359044cad685SCristian Dumitrescu 			memcpy(a->encap.vxlan.ipv6.da, da.s6_addr, 16);
359144cad685SCristian Dumitrescu 			a->encap.vxlan.ipv6.flow_label = flow_label;
359244cad685SCristian Dumitrescu 			a->encap.vxlan.ipv6.dscp = dscp;
359344cad685SCristian Dumitrescu 			a->encap.vxlan.ipv6.hop_limit = hop_limit;
359444cad685SCristian Dumitrescu 
359544cad685SCristian Dumitrescu 			n_tokens -= 6;
359644cad685SCristian Dumitrescu 			tokens += 6;
359744cad685SCristian Dumitrescu 			n += 6;
359844cad685SCristian Dumitrescu 		} else
359944cad685SCristian Dumitrescu 			return 0;
360044cad685SCristian Dumitrescu 
360144cad685SCristian Dumitrescu 		/* udp <sp> <dp> */
360244cad685SCristian Dumitrescu 		if ((n_tokens < 3) ||
360344cad685SCristian Dumitrescu 			strcmp(tokens[0], "udp") ||
360444cad685SCristian Dumitrescu 			parser_read_uint16(&a->encap.vxlan.udp.sp, tokens[1]) ||
360544cad685SCristian Dumitrescu 			parser_read_uint16(&a->encap.vxlan.udp.dp, tokens[2]))
360644cad685SCristian Dumitrescu 			return 0;
360744cad685SCristian Dumitrescu 
360844cad685SCristian Dumitrescu 		n_tokens -= 3;
360944cad685SCristian Dumitrescu 		tokens += 3;
361044cad685SCristian Dumitrescu 		n += 3;
361144cad685SCristian Dumitrescu 
361244cad685SCristian Dumitrescu 		/* vxlan <vni> */
361344cad685SCristian Dumitrescu 		if ((n_tokens < 2) ||
361444cad685SCristian Dumitrescu 			strcmp(tokens[0], "vxlan") ||
361544cad685SCristian Dumitrescu 			parser_read_uint32(&a->encap.vxlan.vxlan.vni, tokens[1]) ||
361644cad685SCristian Dumitrescu 			(a->encap.vxlan.vxlan.vni > 0xFFFFFF))
361744cad685SCristian Dumitrescu 			return 0;
361844cad685SCristian Dumitrescu 
361944cad685SCristian Dumitrescu 		n_tokens -= 2;
362044cad685SCristian Dumitrescu 		tokens += 2;
362144cad685SCristian Dumitrescu 		n += 2;
362244cad685SCristian Dumitrescu 
362344cad685SCristian Dumitrescu 		a->encap.type = RTE_TABLE_ACTION_ENCAP_VXLAN;
362444cad685SCristian Dumitrescu 		a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
362544cad685SCristian Dumitrescu 		return 1 + n;
362644cad685SCristian Dumitrescu 	}
362744cad685SCristian Dumitrescu 
3628a3a95b7dSJasvinder Singh 	return 0;
3629a3a95b7dSJasvinder Singh }
3630a3a95b7dSJasvinder Singh 
3631a3a95b7dSJasvinder Singh static uint32_t
3632a3a95b7dSJasvinder Singh parse_table_action_nat(char **tokens,
3633a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
3634a3a95b7dSJasvinder Singh 	struct table_rule_action *a)
3635a3a95b7dSJasvinder Singh {
3636a3a95b7dSJasvinder Singh 	if ((n_tokens < 4) ||
3637a3a95b7dSJasvinder Singh 		strcmp(tokens[0], "nat"))
3638a3a95b7dSJasvinder Singh 		return 0;
3639a3a95b7dSJasvinder Singh 
3640a3a95b7dSJasvinder Singh 	if (strcmp(tokens[1], "ipv4") == 0) {
3641a3a95b7dSJasvinder Singh 		struct in_addr addr;
3642a3a95b7dSJasvinder Singh 		uint16_t port;
3643a3a95b7dSJasvinder Singh 
3644a3a95b7dSJasvinder Singh 		if (parse_ipv4_addr(tokens[2], &addr) ||
3645a3a95b7dSJasvinder Singh 			parser_read_uint16(&port, tokens[3]))
3646a3a95b7dSJasvinder Singh 			return 0;
3647a3a95b7dSJasvinder Singh 
3648a3a95b7dSJasvinder Singh 		a->nat.ip_version = 1;
3649a3a95b7dSJasvinder Singh 		a->nat.addr.ipv4 = rte_be_to_cpu_32(addr.s_addr);
3650a3a95b7dSJasvinder Singh 		a->nat.port = port;
3651a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_NAT;
3652a3a95b7dSJasvinder Singh 		return 4;
3653a3a95b7dSJasvinder Singh 	}
3654a3a95b7dSJasvinder Singh 
3655a3a95b7dSJasvinder Singh 	if (strcmp(tokens[1], "ipv6") == 0) {
3656a3a95b7dSJasvinder Singh 		struct in6_addr addr;
3657a3a95b7dSJasvinder Singh 		uint16_t port;
3658a3a95b7dSJasvinder Singh 
3659a3a95b7dSJasvinder Singh 		if (parse_ipv6_addr(tokens[2], &addr) ||
3660a3a95b7dSJasvinder Singh 			parser_read_uint16(&port, tokens[3]))
3661a3a95b7dSJasvinder Singh 			return 0;
3662a3a95b7dSJasvinder Singh 
3663a3a95b7dSJasvinder Singh 		a->nat.ip_version = 0;
3664a3a95b7dSJasvinder Singh 		memcpy(a->nat.addr.ipv6, addr.s6_addr, 16);
3665a3a95b7dSJasvinder Singh 		a->nat.port = port;
3666a3a95b7dSJasvinder Singh 		a->action_mask |= 1 << RTE_TABLE_ACTION_NAT;
3667a3a95b7dSJasvinder Singh 		return 4;
3668a3a95b7dSJasvinder Singh 	}
3669a3a95b7dSJasvinder Singh 
3670a3a95b7dSJasvinder Singh 	return 0;
3671a3a95b7dSJasvinder Singh }
3672a3a95b7dSJasvinder Singh 
3673a3a95b7dSJasvinder Singh static uint32_t
3674a3a95b7dSJasvinder Singh parse_table_action_ttl(char **tokens,
3675a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
3676a3a95b7dSJasvinder Singh 	struct table_rule_action *a)
3677a3a95b7dSJasvinder Singh {
3678a3a95b7dSJasvinder Singh 	if ((n_tokens < 2) ||
3679a3a95b7dSJasvinder Singh 		strcmp(tokens[0], "ttl"))
3680a3a95b7dSJasvinder Singh 		return 0;
3681a3a95b7dSJasvinder Singh 
3682a3a95b7dSJasvinder Singh 	if (strcmp(tokens[1], "dec") == 0)
3683a3a95b7dSJasvinder Singh 		a->ttl.decrement = 1;
3684a3a95b7dSJasvinder Singh 	else if (strcmp(tokens[1], "keep") == 0)
3685a3a95b7dSJasvinder Singh 		a->ttl.decrement = 0;
3686a3a95b7dSJasvinder Singh 	else
3687a3a95b7dSJasvinder Singh 		return 0;
3688a3a95b7dSJasvinder Singh 
3689a3a95b7dSJasvinder Singh 	a->action_mask |= 1 << RTE_TABLE_ACTION_TTL;
3690a3a95b7dSJasvinder Singh 	return 2;
3691a3a95b7dSJasvinder Singh }
3692a3a95b7dSJasvinder Singh 
3693a3a95b7dSJasvinder Singh static uint32_t
3694a3a95b7dSJasvinder Singh parse_table_action_stats(char **tokens,
3695a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
3696a3a95b7dSJasvinder Singh 	struct table_rule_action *a)
3697a3a95b7dSJasvinder Singh {
3698a3a95b7dSJasvinder Singh 	if ((n_tokens < 1) ||
3699a3a95b7dSJasvinder Singh 		strcmp(tokens[0], "stats"))
3700a3a95b7dSJasvinder Singh 		return 0;
3701a3a95b7dSJasvinder Singh 
3702a3a95b7dSJasvinder Singh 	a->stats.n_packets = 0;
3703a3a95b7dSJasvinder Singh 	a->stats.n_bytes = 0;
3704a3a95b7dSJasvinder Singh 	a->action_mask |= 1 << RTE_TABLE_ACTION_STATS;
3705a3a95b7dSJasvinder Singh 	return 1;
3706a3a95b7dSJasvinder Singh }
3707a3a95b7dSJasvinder Singh 
3708a3a95b7dSJasvinder Singh static uint32_t
3709a3a95b7dSJasvinder Singh parse_table_action_time(char **tokens,
3710a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
3711a3a95b7dSJasvinder Singh 	struct table_rule_action *a)
3712a3a95b7dSJasvinder Singh {
3713a3a95b7dSJasvinder Singh 	if ((n_tokens < 1) ||
3714a3a95b7dSJasvinder Singh 		strcmp(tokens[0], "time"))
3715a3a95b7dSJasvinder Singh 		return 0;
3716a3a95b7dSJasvinder Singh 
3717a3a95b7dSJasvinder Singh 	a->time.time = rte_rdtsc();
3718a3a95b7dSJasvinder Singh 	a->action_mask |= 1 << RTE_TABLE_ACTION_TIME;
3719a3a95b7dSJasvinder Singh 	return 1;
3720a3a95b7dSJasvinder Singh }
3721a3a95b7dSJasvinder Singh 
37221edccebcSFan Zhang static void
37231edccebcSFan Zhang parse_free_sym_crypto_param_data(struct rte_table_action_sym_crypto_params *p)
37241edccebcSFan Zhang {
37251edccebcSFan Zhang 	struct rte_crypto_sym_xform *xform[2] = {NULL};
37261edccebcSFan Zhang 	uint32_t i;
37271edccebcSFan Zhang 
37281edccebcSFan Zhang 	xform[0] = p->xform;
37291edccebcSFan Zhang 	if (xform[0])
37301edccebcSFan Zhang 		xform[1] = xform[0]->next;
37311edccebcSFan Zhang 
37321edccebcSFan Zhang 	for (i = 0; i < 2; i++) {
37331edccebcSFan Zhang 		if (xform[i] == NULL)
37341edccebcSFan Zhang 			continue;
37351edccebcSFan Zhang 
37361edccebcSFan Zhang 		switch (xform[i]->type) {
37371edccebcSFan Zhang 		case RTE_CRYPTO_SYM_XFORM_CIPHER:
37381edccebcSFan Zhang 			if (xform[i]->cipher.key.data)
37391edccebcSFan Zhang 				free(xform[i]->cipher.key.data);
37401edccebcSFan Zhang 			if (p->cipher_auth.cipher_iv.val)
37411edccebcSFan Zhang 				free(p->cipher_auth.cipher_iv.val);
37421edccebcSFan Zhang 			if (p->cipher_auth.cipher_iv_update.val)
37431edccebcSFan Zhang 				free(p->cipher_auth.cipher_iv_update.val);
37441edccebcSFan Zhang 			break;
37451edccebcSFan Zhang 		case RTE_CRYPTO_SYM_XFORM_AUTH:
37461edccebcSFan Zhang 			if (xform[i]->auth.key.data)
37471edccebcSFan Zhang 				free(xform[i]->cipher.key.data);
37481edccebcSFan Zhang 			if (p->cipher_auth.auth_iv.val)
37491edccebcSFan Zhang 				free(p->cipher_auth.cipher_iv.val);
37501edccebcSFan Zhang 			if (p->cipher_auth.auth_iv_update.val)
37511edccebcSFan Zhang 				free(p->cipher_auth.cipher_iv_update.val);
37521edccebcSFan Zhang 			break;
37531edccebcSFan Zhang 		case RTE_CRYPTO_SYM_XFORM_AEAD:
37541edccebcSFan Zhang 			if (xform[i]->aead.key.data)
37551edccebcSFan Zhang 				free(xform[i]->cipher.key.data);
37561edccebcSFan Zhang 			if (p->aead.iv.val)
37571edccebcSFan Zhang 				free(p->aead.iv.val);
37581edccebcSFan Zhang 			if (p->aead.aad.val)
37591edccebcSFan Zhang 				free(p->aead.aad.val);
37601edccebcSFan Zhang 			break;
37611edccebcSFan Zhang 		default:
37621edccebcSFan Zhang 			continue;
37631edccebcSFan Zhang 		}
37641edccebcSFan Zhang 	}
37651edccebcSFan Zhang 
37661edccebcSFan Zhang }
37671edccebcSFan Zhang 
37681edccebcSFan Zhang static struct rte_crypto_sym_xform *
37691edccebcSFan Zhang parse_table_action_cipher(struct rte_table_action_sym_crypto_params *p,
37701edccebcSFan Zhang 		char **tokens, uint32_t n_tokens, uint32_t encrypt,
37711edccebcSFan Zhang 		uint32_t *used_n_tokens)
37721edccebcSFan Zhang {
37731edccebcSFan Zhang 	struct rte_crypto_sym_xform *xform_cipher;
37741edccebcSFan Zhang 	int status;
37751edccebcSFan Zhang 	size_t len;
37761edccebcSFan Zhang 
37771edccebcSFan Zhang 	if (n_tokens < 7 || strcmp(tokens[1], "cipher_algo") ||
37781edccebcSFan Zhang 			strcmp(tokens[3], "cipher_key") ||
37791edccebcSFan Zhang 			strcmp(tokens[5], "cipher_iv"))
37801edccebcSFan Zhang 		return NULL;
37811edccebcSFan Zhang 
37821edccebcSFan Zhang 	xform_cipher = calloc(1, sizeof(*xform_cipher));
37831edccebcSFan Zhang 	if (xform_cipher == NULL)
37841edccebcSFan Zhang 		return NULL;
37851edccebcSFan Zhang 
37861edccebcSFan Zhang 	xform_cipher->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
37871edccebcSFan Zhang 	xform_cipher->cipher.op = encrypt ? RTE_CRYPTO_CIPHER_OP_ENCRYPT :
37881edccebcSFan Zhang 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
37891edccebcSFan Zhang 
37901edccebcSFan Zhang 	/* cipher_algo */
37911edccebcSFan Zhang 	status = rte_cryptodev_get_cipher_algo_enum(
37921edccebcSFan Zhang 			&xform_cipher->cipher.algo, tokens[2]);
37931edccebcSFan Zhang 	if (status < 0)
37941edccebcSFan Zhang 		goto error_exit;
37951edccebcSFan Zhang 
37961edccebcSFan Zhang 	/* cipher_key */
37971edccebcSFan Zhang 	len = strlen(tokens[4]);
37981edccebcSFan Zhang 	xform_cipher->cipher.key.data = calloc(1, len / 2 + 1);
37991edccebcSFan Zhang 	if (xform_cipher->cipher.key.data == NULL)
38001edccebcSFan Zhang 		goto error_exit;
38011edccebcSFan Zhang 
38021edccebcSFan Zhang 	status = parse_hex_string(tokens[4],
38031edccebcSFan Zhang 			xform_cipher->cipher.key.data,
38041edccebcSFan Zhang 			(uint32_t *)&len);
38051edccebcSFan Zhang 	if (status < 0)
38061edccebcSFan Zhang 		goto error_exit;
38071edccebcSFan Zhang 
38081edccebcSFan Zhang 	xform_cipher->cipher.key.length = (uint16_t)len;
38091edccebcSFan Zhang 
38101edccebcSFan Zhang 	/* cipher_iv */
38111edccebcSFan Zhang 	len = strlen(tokens[6]);
38121edccebcSFan Zhang 
38131edccebcSFan Zhang 	p->cipher_auth.cipher_iv.val = calloc(1, len / 2 + 1);
38141edccebcSFan Zhang 	if (p->cipher_auth.cipher_iv.val == NULL)
38151edccebcSFan Zhang 		goto error_exit;
38161edccebcSFan Zhang 
38171edccebcSFan Zhang 	status = parse_hex_string(tokens[6],
38181edccebcSFan Zhang 			p->cipher_auth.cipher_iv.val,
38191edccebcSFan Zhang 			(uint32_t *)&len);
38201edccebcSFan Zhang 	if (status < 0)
38211edccebcSFan Zhang 		goto error_exit;
38221edccebcSFan Zhang 
38231edccebcSFan Zhang 	xform_cipher->cipher.iv.length = (uint16_t)len;
38241edccebcSFan Zhang 	xform_cipher->cipher.iv.offset = RTE_TABLE_ACTION_SYM_CRYPTO_IV_OFFSET;
38251edccebcSFan Zhang 	p->cipher_auth.cipher_iv.length = (uint32_t)len;
38261edccebcSFan Zhang 	*used_n_tokens = 7;
38271edccebcSFan Zhang 
38281edccebcSFan Zhang 	return xform_cipher;
38291edccebcSFan Zhang 
38301edccebcSFan Zhang error_exit:
38311edccebcSFan Zhang 	if (xform_cipher->cipher.key.data)
38321edccebcSFan Zhang 		free(xform_cipher->cipher.key.data);
38331edccebcSFan Zhang 
38341edccebcSFan Zhang 	if (p->cipher_auth.cipher_iv.val) {
38351edccebcSFan Zhang 		free(p->cipher_auth.cipher_iv.val);
38361edccebcSFan Zhang 		p->cipher_auth.cipher_iv.val = NULL;
38371edccebcSFan Zhang 	}
38381edccebcSFan Zhang 
38391edccebcSFan Zhang 	free(xform_cipher);
38401edccebcSFan Zhang 
38411edccebcSFan Zhang 	return NULL;
38421edccebcSFan Zhang }
38431edccebcSFan Zhang 
38441edccebcSFan Zhang static struct rte_crypto_sym_xform *
38451edccebcSFan Zhang parse_table_action_cipher_auth(struct rte_table_action_sym_crypto_params *p,
38461edccebcSFan Zhang 		char **tokens, uint32_t n_tokens, uint32_t encrypt,
38471edccebcSFan Zhang 		uint32_t *used_n_tokens)
38481edccebcSFan Zhang {
38491edccebcSFan Zhang 	struct rte_crypto_sym_xform *xform_cipher;
38501edccebcSFan Zhang 	struct rte_crypto_sym_xform *xform_auth;
38511edccebcSFan Zhang 	int status;
38521edccebcSFan Zhang 	size_t len;
38531edccebcSFan Zhang 
38541edccebcSFan Zhang 	if (n_tokens < 13 ||
38551edccebcSFan Zhang 			strcmp(tokens[7], "auth_algo") ||
38561edccebcSFan Zhang 			strcmp(tokens[9], "auth_key") ||
38571edccebcSFan Zhang 			strcmp(tokens[11], "digest_size"))
38581edccebcSFan Zhang 		return NULL;
38591edccebcSFan Zhang 
38601edccebcSFan Zhang 	xform_auth = calloc(1, sizeof(*xform_auth));
38611edccebcSFan Zhang 	if (xform_auth == NULL)
38621edccebcSFan Zhang 		return NULL;
38631edccebcSFan Zhang 
38641edccebcSFan Zhang 	xform_auth->type = RTE_CRYPTO_SYM_XFORM_AUTH;
38651edccebcSFan Zhang 	xform_auth->auth.op = encrypt ? RTE_CRYPTO_AUTH_OP_GENERATE :
38661edccebcSFan Zhang 			RTE_CRYPTO_AUTH_OP_VERIFY;
38671edccebcSFan Zhang 
38681edccebcSFan Zhang 	/* auth_algo */
38691edccebcSFan Zhang 	status = rte_cryptodev_get_auth_algo_enum(&xform_auth->auth.algo,
38701edccebcSFan Zhang 			tokens[8]);
38711edccebcSFan Zhang 	if (status < 0)
38721edccebcSFan Zhang 		goto error_exit;
38731edccebcSFan Zhang 
38741edccebcSFan Zhang 	/* auth_key */
38751edccebcSFan Zhang 	len = strlen(tokens[10]);
38761edccebcSFan Zhang 	xform_auth->auth.key.data = calloc(1, len / 2 + 1);
38771edccebcSFan Zhang 	if (xform_auth->auth.key.data == NULL)
38781edccebcSFan Zhang 		goto error_exit;
38791edccebcSFan Zhang 
38801edccebcSFan Zhang 	status = parse_hex_string(tokens[10],
38811edccebcSFan Zhang 			xform_auth->auth.key.data, (uint32_t *)&len);
38821edccebcSFan Zhang 	if (status < 0)
38831edccebcSFan Zhang 		goto error_exit;
38841edccebcSFan Zhang 
38851edccebcSFan Zhang 	xform_auth->auth.key.length = (uint16_t)len;
38861edccebcSFan Zhang 
38871edccebcSFan Zhang 	if (strcmp(tokens[11], "digest_size"))
38881edccebcSFan Zhang 		goto error_exit;
38891edccebcSFan Zhang 
38901edccebcSFan Zhang 	status = parser_read_uint16(&xform_auth->auth.digest_length,
38911edccebcSFan Zhang 			tokens[12]);
38921edccebcSFan Zhang 	if (status < 0)
38931edccebcSFan Zhang 		goto error_exit;
38941edccebcSFan Zhang 
38951edccebcSFan Zhang 	xform_cipher = parse_table_action_cipher(p, tokens, 7, encrypt,
38961edccebcSFan Zhang 			used_n_tokens);
38971edccebcSFan Zhang 	if (xform_cipher == NULL)
38981edccebcSFan Zhang 		goto error_exit;
38991edccebcSFan Zhang 
39001edccebcSFan Zhang 	*used_n_tokens += 6;
39011edccebcSFan Zhang 
39021edccebcSFan Zhang 	if (encrypt) {
39031edccebcSFan Zhang 		xform_cipher->next = xform_auth;
39041edccebcSFan Zhang 		return xform_cipher;
39051edccebcSFan Zhang 	} else {
39061edccebcSFan Zhang 		xform_auth->next = xform_cipher;
39071edccebcSFan Zhang 		return xform_auth;
39081edccebcSFan Zhang 	}
39091edccebcSFan Zhang 
39101edccebcSFan Zhang error_exit:
39111edccebcSFan Zhang 	if (xform_auth->auth.key.data)
39121edccebcSFan Zhang 		free(xform_auth->auth.key.data);
39131edccebcSFan Zhang 	if (p->cipher_auth.auth_iv.val) {
39141edccebcSFan Zhang 		free(p->cipher_auth.auth_iv.val);
39151edccebcSFan Zhang 		p->cipher_auth.auth_iv.val = 0;
39161edccebcSFan Zhang 	}
39171edccebcSFan Zhang 
39181edccebcSFan Zhang 	free(xform_auth);
39191edccebcSFan Zhang 
39201edccebcSFan Zhang 	return NULL;
39211edccebcSFan Zhang }
39221edccebcSFan Zhang 
39231edccebcSFan Zhang static struct rte_crypto_sym_xform *
39241edccebcSFan Zhang parse_table_action_aead(struct rte_table_action_sym_crypto_params *p,
39251edccebcSFan Zhang 		char **tokens, uint32_t n_tokens, uint32_t encrypt,
39261edccebcSFan Zhang 		uint32_t *used_n_tokens)
39271edccebcSFan Zhang {
39281edccebcSFan Zhang 	struct rte_crypto_sym_xform *xform_aead;
39291edccebcSFan Zhang 	int status;
39301edccebcSFan Zhang 	size_t len;
39311edccebcSFan Zhang 
39321edccebcSFan Zhang 	if (n_tokens < 11 || strcmp(tokens[1], "aead_algo") ||
39331edccebcSFan Zhang 			strcmp(tokens[3], "aead_key") ||
39341edccebcSFan Zhang 			strcmp(tokens[5], "aead_iv") ||
39351edccebcSFan Zhang 			strcmp(tokens[7], "aead_aad") ||
39361edccebcSFan Zhang 			strcmp(tokens[9], "digest_size"))
39371edccebcSFan Zhang 		return NULL;
39381edccebcSFan Zhang 
39391edccebcSFan Zhang 	xform_aead = calloc(1, sizeof(*xform_aead));
39401edccebcSFan Zhang 	if (xform_aead == NULL)
39411edccebcSFan Zhang 		return NULL;
39421edccebcSFan Zhang 
39431edccebcSFan Zhang 	xform_aead->type = RTE_CRYPTO_SYM_XFORM_AEAD;
39441edccebcSFan Zhang 	xform_aead->aead.op = encrypt ? RTE_CRYPTO_AEAD_OP_ENCRYPT :
39451edccebcSFan Zhang 			RTE_CRYPTO_AEAD_OP_DECRYPT;
39461edccebcSFan Zhang 
39471edccebcSFan Zhang 	/* aead_algo */
39481edccebcSFan Zhang 	status = rte_cryptodev_get_aead_algo_enum(&xform_aead->aead.algo,
39491edccebcSFan Zhang 			tokens[2]);
39501edccebcSFan Zhang 	if (status < 0)
39511edccebcSFan Zhang 		goto error_exit;
39521edccebcSFan Zhang 
39531edccebcSFan Zhang 	/* aead_key */
39541edccebcSFan Zhang 	len = strlen(tokens[4]);
39551edccebcSFan Zhang 	xform_aead->aead.key.data = calloc(1, len / 2 + 1);
39561edccebcSFan Zhang 	if (xform_aead->aead.key.data == NULL)
39571edccebcSFan Zhang 		goto error_exit;
39581edccebcSFan Zhang 
39591edccebcSFan Zhang 	status = parse_hex_string(tokens[4], xform_aead->aead.key.data,
39601edccebcSFan Zhang 			(uint32_t *)&len);
39611edccebcSFan Zhang 	if (status < 0)
39621edccebcSFan Zhang 		goto error_exit;
39631edccebcSFan Zhang 
39641edccebcSFan Zhang 	xform_aead->aead.key.length = (uint16_t)len;
39651edccebcSFan Zhang 
39661edccebcSFan Zhang 	/* aead_iv */
39671edccebcSFan Zhang 	len = strlen(tokens[6]);
39681edccebcSFan Zhang 	p->aead.iv.val = calloc(1, len / 2 + 1);
39691edccebcSFan Zhang 	if (p->aead.iv.val == NULL)
39701edccebcSFan Zhang 		goto error_exit;
39711edccebcSFan Zhang 
39721edccebcSFan Zhang 	status = parse_hex_string(tokens[6], p->aead.iv.val,
39731edccebcSFan Zhang 			(uint32_t *)&len);
39741edccebcSFan Zhang 	if (status < 0)
39751edccebcSFan Zhang 		goto error_exit;
39761edccebcSFan Zhang 
39771edccebcSFan Zhang 	xform_aead->aead.iv.length = (uint16_t)len;
39781edccebcSFan Zhang 	xform_aead->aead.iv.offset = RTE_TABLE_ACTION_SYM_CRYPTO_IV_OFFSET;
39791edccebcSFan Zhang 	p->aead.iv.length = (uint32_t)len;
39801edccebcSFan Zhang 
39811edccebcSFan Zhang 	/* aead_aad */
39821edccebcSFan Zhang 	len = strlen(tokens[8]);
39831edccebcSFan Zhang 	p->aead.aad.val = calloc(1, len / 2 + 1);
39841edccebcSFan Zhang 	if (p->aead.aad.val == NULL)
39851edccebcSFan Zhang 		goto error_exit;
39861edccebcSFan Zhang 
39871edccebcSFan Zhang 	status = parse_hex_string(tokens[8], p->aead.aad.val, (uint32_t *)&len);
39881edccebcSFan Zhang 	if (status < 0)
39891edccebcSFan Zhang 		goto error_exit;
39901edccebcSFan Zhang 
39911edccebcSFan Zhang 	xform_aead->aead.aad_length = (uint16_t)len;
39921edccebcSFan Zhang 	p->aead.aad.length = (uint32_t)len;
39931edccebcSFan Zhang 
39941edccebcSFan Zhang 	/* digest_size */
39951edccebcSFan Zhang 	status = parser_read_uint16(&xform_aead->aead.digest_length,
39961edccebcSFan Zhang 			tokens[10]);
39971edccebcSFan Zhang 	if (status < 0)
39981edccebcSFan Zhang 		goto error_exit;
39991edccebcSFan Zhang 
40001edccebcSFan Zhang 	*used_n_tokens = 11;
40011edccebcSFan Zhang 
40021edccebcSFan Zhang 	return xform_aead;
40031edccebcSFan Zhang 
40041edccebcSFan Zhang error_exit:
40051edccebcSFan Zhang 	if (xform_aead->aead.key.data)
40061edccebcSFan Zhang 		free(xform_aead->aead.key.data);
40071edccebcSFan Zhang 	if (p->aead.iv.val) {
40081edccebcSFan Zhang 		free(p->aead.iv.val);
40091edccebcSFan Zhang 		p->aead.iv.val = NULL;
40101edccebcSFan Zhang 	}
40111edccebcSFan Zhang 	if (p->aead.aad.val) {
40121edccebcSFan Zhang 		free(p->aead.aad.val);
40131edccebcSFan Zhang 		p->aead.aad.val = NULL;
40141edccebcSFan Zhang 	}
40151edccebcSFan Zhang 
40161edccebcSFan Zhang 	free(xform_aead);
40171edccebcSFan Zhang 
40181edccebcSFan Zhang 	return NULL;
40191edccebcSFan Zhang }
40201edccebcSFan Zhang 
40211edccebcSFan Zhang 
40221edccebcSFan Zhang static uint32_t
40231edccebcSFan Zhang parse_table_action_sym_crypto(char **tokens,
40241edccebcSFan Zhang 	uint32_t n_tokens,
40251edccebcSFan Zhang 	struct table_rule_action *a)
40261edccebcSFan Zhang {
40271edccebcSFan Zhang 	struct rte_table_action_sym_crypto_params *p = &a->sym_crypto;
40281edccebcSFan Zhang 	struct rte_crypto_sym_xform *xform = NULL;
40291edccebcSFan Zhang 	uint32_t used_n_tokens;
40301edccebcSFan Zhang 	uint32_t encrypt;
40311edccebcSFan Zhang 	int status;
40321edccebcSFan Zhang 
40331edccebcSFan Zhang 	if ((n_tokens < 12) ||
40341edccebcSFan Zhang 		strcmp(tokens[0], "sym_crypto") ||
40351edccebcSFan Zhang 		strcmp(tokens[2], "type"))
40361edccebcSFan Zhang 		return 0;
40371edccebcSFan Zhang 
40381edccebcSFan Zhang 	memset(p, 0, sizeof(*p));
40391edccebcSFan Zhang 
40401edccebcSFan Zhang 	if (strcmp(tokens[1], "encrypt") == 0)
40411edccebcSFan Zhang 		encrypt = 1;
40421edccebcSFan Zhang 	else
40431edccebcSFan Zhang 		encrypt = 0;
40441edccebcSFan Zhang 
40451edccebcSFan Zhang 	status = parser_read_uint32(&p->data_offset, tokens[n_tokens - 1]);
40461edccebcSFan Zhang 	if (status < 0)
40471edccebcSFan Zhang 		return 0;
40481edccebcSFan Zhang 
40491edccebcSFan Zhang 	if (strcmp(tokens[3], "cipher") == 0) {
40501edccebcSFan Zhang 		tokens += 3;
40511edccebcSFan Zhang 		n_tokens -= 3;
40521edccebcSFan Zhang 
40531edccebcSFan Zhang 		xform = parse_table_action_cipher(p, tokens, n_tokens, encrypt,
40541edccebcSFan Zhang 				&used_n_tokens);
40551edccebcSFan Zhang 	} else if (strcmp(tokens[3], "cipher_auth") == 0) {
40561edccebcSFan Zhang 		tokens += 3;
40571edccebcSFan Zhang 		n_tokens -= 3;
40581edccebcSFan Zhang 
40591edccebcSFan Zhang 		xform = parse_table_action_cipher_auth(p, tokens, n_tokens,
40601edccebcSFan Zhang 				encrypt, &used_n_tokens);
40611edccebcSFan Zhang 	} else if (strcmp(tokens[3], "aead") == 0) {
40621edccebcSFan Zhang 		tokens += 3;
40631edccebcSFan Zhang 		n_tokens -= 3;
40641edccebcSFan Zhang 
40651edccebcSFan Zhang 		xform = parse_table_action_aead(p, tokens, n_tokens, encrypt,
40661edccebcSFan Zhang 				&used_n_tokens);
40671edccebcSFan Zhang 	}
40681edccebcSFan Zhang 
40691edccebcSFan Zhang 	if (xform == NULL)
40701edccebcSFan Zhang 		return 0;
40711edccebcSFan Zhang 
40721edccebcSFan Zhang 	p->xform = xform;
40731edccebcSFan Zhang 
40741edccebcSFan Zhang 	if (strcmp(tokens[used_n_tokens], "data_offset")) {
40751edccebcSFan Zhang 		parse_free_sym_crypto_param_data(p);
40761edccebcSFan Zhang 		return 0;
40771edccebcSFan Zhang 	}
40781edccebcSFan Zhang 
40791edccebcSFan Zhang 	a->action_mask |= 1 << RTE_TABLE_ACTION_SYM_CRYPTO;
40801edccebcSFan Zhang 
40811edccebcSFan Zhang 	return used_n_tokens + 5;
40821edccebcSFan Zhang }
40831edccebcSFan Zhang 
4084a3a95b7dSJasvinder Singh static uint32_t
40851bdf2632SCristian Dumitrescu parse_table_action_tag(char **tokens,
40861bdf2632SCristian Dumitrescu 	uint32_t n_tokens,
40871bdf2632SCristian Dumitrescu 	struct table_rule_action *a)
40881bdf2632SCristian Dumitrescu {
40891bdf2632SCristian Dumitrescu 	if ((n_tokens < 2) ||
40901bdf2632SCristian Dumitrescu 		strcmp(tokens[0], "tag"))
40911bdf2632SCristian Dumitrescu 		return 0;
40921bdf2632SCristian Dumitrescu 
40931bdf2632SCristian Dumitrescu 	if (parser_read_uint32(&a->tag.tag, tokens[1]))
40941bdf2632SCristian Dumitrescu 		return 0;
40951bdf2632SCristian Dumitrescu 
40961bdf2632SCristian Dumitrescu 	a->action_mask |= 1 << RTE_TABLE_ACTION_TAG;
40971bdf2632SCristian Dumitrescu 	return 2;
40981bdf2632SCristian Dumitrescu }
40991bdf2632SCristian Dumitrescu 
41001bdf2632SCristian Dumitrescu static uint32_t
4101*d5ed626fSCristian Dumitrescu parse_table_action_decap(char **tokens,
4102*d5ed626fSCristian Dumitrescu 	uint32_t n_tokens,
4103*d5ed626fSCristian Dumitrescu 	struct table_rule_action *a)
4104*d5ed626fSCristian Dumitrescu {
4105*d5ed626fSCristian Dumitrescu 	if ((n_tokens < 2) ||
4106*d5ed626fSCristian Dumitrescu 		strcmp(tokens[0], "decap"))
4107*d5ed626fSCristian Dumitrescu 		return 0;
4108*d5ed626fSCristian Dumitrescu 
4109*d5ed626fSCristian Dumitrescu 	if (parser_read_uint16(&a->decap.n, tokens[1]))
4110*d5ed626fSCristian Dumitrescu 		return 0;
4111*d5ed626fSCristian Dumitrescu 
4112*d5ed626fSCristian Dumitrescu 	a->action_mask |= 1 << RTE_TABLE_ACTION_DECAP;
4113*d5ed626fSCristian Dumitrescu 	return 2;
4114*d5ed626fSCristian Dumitrescu }
4115*d5ed626fSCristian Dumitrescu 
4116*d5ed626fSCristian Dumitrescu static uint32_t
4117a3a95b7dSJasvinder Singh parse_table_action(char **tokens,
4118a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
4119a3a95b7dSJasvinder Singh 	char *out,
4120a3a95b7dSJasvinder Singh 	size_t out_size,
4121a3a95b7dSJasvinder Singh 	struct table_rule_action *a)
4122a3a95b7dSJasvinder Singh {
4123a3a95b7dSJasvinder Singh 	uint32_t n_tokens0 = n_tokens;
4124a3a95b7dSJasvinder Singh 
4125a3a95b7dSJasvinder Singh 	memset(a, 0, sizeof(*a));
4126a3a95b7dSJasvinder Singh 
4127a3a95b7dSJasvinder Singh 	if ((n_tokens < 2) ||
4128a3a95b7dSJasvinder Singh 		strcmp(tokens[0], "action"))
4129a3a95b7dSJasvinder Singh 		return 0;
4130a3a95b7dSJasvinder Singh 
4131a3a95b7dSJasvinder Singh 	tokens++;
4132a3a95b7dSJasvinder Singh 	n_tokens--;
4133a3a95b7dSJasvinder Singh 
4134a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "fwd") == 0)) {
4135a3a95b7dSJasvinder Singh 		uint32_t n;
4136a3a95b7dSJasvinder Singh 
4137a3a95b7dSJasvinder Singh 		n = parse_table_action_fwd(tokens, n_tokens, a);
4138a3a95b7dSJasvinder Singh 		if (n == 0) {
4139a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
4140a3a95b7dSJasvinder Singh 				"action fwd");
4141a3a95b7dSJasvinder Singh 			return 0;
4142a3a95b7dSJasvinder Singh 		}
4143a3a95b7dSJasvinder Singh 
4144a3a95b7dSJasvinder Singh 		tokens += n;
4145a3a95b7dSJasvinder Singh 		n_tokens -= n;
4146a3a95b7dSJasvinder Singh 	}
4147a3a95b7dSJasvinder Singh 
4148802755dcSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "balance") == 0)) {
4149802755dcSJasvinder Singh 		uint32_t n;
4150802755dcSJasvinder Singh 
4151802755dcSJasvinder Singh 		n = parse_table_action_balance(tokens, n_tokens, a);
4152802755dcSJasvinder Singh 		if (n == 0) {
4153802755dcSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
4154802755dcSJasvinder Singh 				"action balance");
4155802755dcSJasvinder Singh 			return 0;
4156802755dcSJasvinder Singh 		}
4157802755dcSJasvinder Singh 
4158802755dcSJasvinder Singh 		tokens += n;
4159802755dcSJasvinder Singh 		n_tokens -= n;
4160802755dcSJasvinder Singh 	}
4161802755dcSJasvinder Singh 
4162a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "meter") == 0)) {
4163a3a95b7dSJasvinder Singh 		uint32_t n;
4164a3a95b7dSJasvinder Singh 
4165a3a95b7dSJasvinder Singh 		n = parse_table_action_meter(tokens, n_tokens, a);
4166a3a95b7dSJasvinder Singh 		if (n == 0) {
4167a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
4168a3a95b7dSJasvinder Singh 				"action meter");
4169a3a95b7dSJasvinder Singh 			return 0;
4170a3a95b7dSJasvinder Singh 		}
4171a3a95b7dSJasvinder Singh 
4172a3a95b7dSJasvinder Singh 		tokens += n;
4173a3a95b7dSJasvinder Singh 		n_tokens -= n;
4174a3a95b7dSJasvinder Singh 	}
4175a3a95b7dSJasvinder Singh 
4176a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "tm") == 0)) {
4177a3a95b7dSJasvinder Singh 		uint32_t n;
4178a3a95b7dSJasvinder Singh 
4179a3a95b7dSJasvinder Singh 		n = parse_table_action_tm(tokens, n_tokens, a);
4180a3a95b7dSJasvinder Singh 		if (n == 0) {
4181a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
4182a3a95b7dSJasvinder Singh 				"action tm");
4183a3a95b7dSJasvinder Singh 			return 0;
4184a3a95b7dSJasvinder Singh 		}
4185a3a95b7dSJasvinder Singh 
4186a3a95b7dSJasvinder Singh 		tokens += n;
4187a3a95b7dSJasvinder Singh 		n_tokens -= n;
4188a3a95b7dSJasvinder Singh 	}
4189a3a95b7dSJasvinder Singh 
4190a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "encap") == 0)) {
4191a3a95b7dSJasvinder Singh 		uint32_t n;
4192a3a95b7dSJasvinder Singh 
4193a3a95b7dSJasvinder Singh 		n = parse_table_action_encap(tokens, n_tokens, a);
4194a3a95b7dSJasvinder Singh 		if (n == 0) {
4195a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
4196a3a95b7dSJasvinder Singh 				"action encap");
4197a3a95b7dSJasvinder Singh 			return 0;
4198a3a95b7dSJasvinder Singh 		}
4199a3a95b7dSJasvinder Singh 
4200a3a95b7dSJasvinder Singh 		tokens += n;
4201a3a95b7dSJasvinder Singh 		n_tokens -= n;
4202a3a95b7dSJasvinder Singh 	}
4203a3a95b7dSJasvinder Singh 
4204a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "nat") == 0)) {
4205a3a95b7dSJasvinder Singh 		uint32_t n;
4206a3a95b7dSJasvinder Singh 
4207a3a95b7dSJasvinder Singh 		n = parse_table_action_nat(tokens, n_tokens, a);
4208a3a95b7dSJasvinder Singh 		if (n == 0) {
4209a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
4210a3a95b7dSJasvinder Singh 				"action nat");
4211a3a95b7dSJasvinder Singh 			return 0;
4212a3a95b7dSJasvinder Singh 		}
4213a3a95b7dSJasvinder Singh 
4214a3a95b7dSJasvinder Singh 		tokens += n;
4215a3a95b7dSJasvinder Singh 		n_tokens -= n;
4216a3a95b7dSJasvinder Singh 	}
4217a3a95b7dSJasvinder Singh 
4218a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "ttl") == 0)) {
4219a3a95b7dSJasvinder Singh 		uint32_t n;
4220a3a95b7dSJasvinder Singh 
4221a3a95b7dSJasvinder Singh 		n = parse_table_action_ttl(tokens, n_tokens, a);
4222a3a95b7dSJasvinder Singh 		if (n == 0) {
4223a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
4224a3a95b7dSJasvinder Singh 				"action ttl");
4225a3a95b7dSJasvinder Singh 			return 0;
4226a3a95b7dSJasvinder Singh 		}
4227a3a95b7dSJasvinder Singh 
4228a3a95b7dSJasvinder Singh 		tokens += n;
4229a3a95b7dSJasvinder Singh 		n_tokens -= n;
4230a3a95b7dSJasvinder Singh 	}
4231a3a95b7dSJasvinder Singh 
4232a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "stats") == 0)) {
4233a3a95b7dSJasvinder Singh 		uint32_t n;
4234a3a95b7dSJasvinder Singh 
4235a3a95b7dSJasvinder Singh 		n = parse_table_action_stats(tokens, n_tokens, a);
4236a3a95b7dSJasvinder Singh 		if (n == 0) {
4237a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
4238a3a95b7dSJasvinder Singh 				"action stats");
4239a3a95b7dSJasvinder Singh 			return 0;
4240a3a95b7dSJasvinder Singh 		}
4241a3a95b7dSJasvinder Singh 
4242a3a95b7dSJasvinder Singh 		tokens += n;
4243a3a95b7dSJasvinder Singh 		n_tokens -= n;
4244a3a95b7dSJasvinder Singh 	}
4245a3a95b7dSJasvinder Singh 
4246a3a95b7dSJasvinder Singh 	if (n_tokens && (strcmp(tokens[0], "time") == 0)) {
4247a3a95b7dSJasvinder Singh 		uint32_t n;
4248a3a95b7dSJasvinder Singh 
4249a3a95b7dSJasvinder Singh 		n = parse_table_action_time(tokens, n_tokens, a);
4250a3a95b7dSJasvinder Singh 		if (n == 0) {
4251a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID,
4252a3a95b7dSJasvinder Singh 				"action time");
4253a3a95b7dSJasvinder Singh 			return 0;
4254a3a95b7dSJasvinder Singh 		}
4255a3a95b7dSJasvinder Singh 
4256a3a95b7dSJasvinder Singh 		tokens += n;
4257a3a95b7dSJasvinder Singh 		n_tokens -= n;
4258a3a95b7dSJasvinder Singh 	}
4259a3a95b7dSJasvinder Singh 
42601edccebcSFan Zhang 	if (n_tokens && (strcmp(tokens[0], "sym_crypto") == 0)) {
42611edccebcSFan Zhang 		uint32_t n;
42621edccebcSFan Zhang 
42631edccebcSFan Zhang 		n = parse_table_action_sym_crypto(tokens, n_tokens, a);
42641edccebcSFan Zhang 		if (n == 0) {
42651edccebcSFan Zhang 			snprintf(out, out_size, MSG_ARG_INVALID,
42661edccebcSFan Zhang 				"action sym_crypto");
42671bdf2632SCristian Dumitrescu 		}
42681bdf2632SCristian Dumitrescu 
42691bdf2632SCristian Dumitrescu 		tokens += n;
42701bdf2632SCristian Dumitrescu 		n_tokens -= n;
42711bdf2632SCristian Dumitrescu 	}
42721bdf2632SCristian Dumitrescu 
42731bdf2632SCristian Dumitrescu 	if (n_tokens && (strcmp(tokens[0], "tag") == 0)) {
42741bdf2632SCristian Dumitrescu 		uint32_t n;
42751bdf2632SCristian Dumitrescu 
42761bdf2632SCristian Dumitrescu 		n = parse_table_action_tag(tokens, n_tokens, a);
42771bdf2632SCristian Dumitrescu 		if (n == 0) {
42781bdf2632SCristian Dumitrescu 			snprintf(out, out_size, MSG_ARG_INVALID,
42791bdf2632SCristian Dumitrescu 				"action tag");
42801edccebcSFan Zhang 			return 0;
42811edccebcSFan Zhang 		}
42821edccebcSFan Zhang 
42831edccebcSFan Zhang 		tokens += n;
42841edccebcSFan Zhang 		n_tokens -= n;
42851edccebcSFan Zhang 	}
42861edccebcSFan Zhang 
4287*d5ed626fSCristian Dumitrescu 	if (n_tokens && (strcmp(tokens[0], "decap") == 0)) {
4288*d5ed626fSCristian Dumitrescu 		uint32_t n;
4289*d5ed626fSCristian Dumitrescu 
4290*d5ed626fSCristian Dumitrescu 		n = parse_table_action_decap(tokens, n_tokens, a);
4291*d5ed626fSCristian Dumitrescu 		if (n == 0) {
4292*d5ed626fSCristian Dumitrescu 			snprintf(out, out_size, MSG_ARG_INVALID,
4293*d5ed626fSCristian Dumitrescu 				"action decap");
4294*d5ed626fSCristian Dumitrescu 			return 0;
4295*d5ed626fSCristian Dumitrescu 		}
4296*d5ed626fSCristian Dumitrescu 
4297*d5ed626fSCristian Dumitrescu 		tokens += n;
4298*d5ed626fSCristian Dumitrescu 		n_tokens -= n;
4299*d5ed626fSCristian Dumitrescu 	}
4300*d5ed626fSCristian Dumitrescu 
4301a3a95b7dSJasvinder Singh 	if (n_tokens0 - n_tokens == 1) {
4302a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "action");
4303a3a95b7dSJasvinder Singh 		return 0;
4304a3a95b7dSJasvinder Singh 	}
4305a3a95b7dSJasvinder Singh 
4306a3a95b7dSJasvinder Singh 	return n_tokens0 - n_tokens;
4307a3a95b7dSJasvinder Singh }
4308a3a95b7dSJasvinder Singh 
430926b3effeSKevin Laatz 
431026b3effeSKevin Laatz static const char cmd_pipeline_table_rule_add_help[] =
431126b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id> rule add\n"
431226b3effeSKevin Laatz "     match <match>\n"
431326b3effeSKevin Laatz "     action <table_action>\n";
431426b3effeSKevin Laatz 
4315a3a95b7dSJasvinder Singh static void
4316a3a95b7dSJasvinder Singh cmd_pipeline_table_rule_add(char **tokens,
4317a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
4318a3a95b7dSJasvinder Singh 	char *out,
4319a3a95b7dSJasvinder Singh 	size_t out_size)
4320a3a95b7dSJasvinder Singh {
4321a3a95b7dSJasvinder Singh 	struct table_rule_match m;
4322a3a95b7dSJasvinder Singh 	struct table_rule_action a;
4323a3a95b7dSJasvinder Singh 	char *pipeline_name;
4324a3a95b7dSJasvinder Singh 	void *data;
4325a3a95b7dSJasvinder Singh 	uint32_t table_id, t0, n_tokens_parsed;
4326a3a95b7dSJasvinder Singh 	int status;
4327a3a95b7dSJasvinder Singh 
4328a3a95b7dSJasvinder Singh 	if (n_tokens < 8) {
4329a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4330a3a95b7dSJasvinder Singh 		return;
4331a3a95b7dSJasvinder Singh 	}
4332a3a95b7dSJasvinder Singh 
4333a3a95b7dSJasvinder Singh 	pipeline_name = tokens[1];
4334a3a95b7dSJasvinder Singh 
4335a3a95b7dSJasvinder Singh 	if (strcmp(tokens[2], "table") != 0) {
4336a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
4337a3a95b7dSJasvinder Singh 		return;
4338a3a95b7dSJasvinder Singh 	}
4339a3a95b7dSJasvinder Singh 
4340a3a95b7dSJasvinder Singh 	if (parser_read_uint32(&table_id, tokens[3]) != 0) {
4341a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4342a3a95b7dSJasvinder Singh 		return;
4343a3a95b7dSJasvinder Singh 	}
4344a3a95b7dSJasvinder Singh 
4345a3a95b7dSJasvinder Singh 	if (strcmp(tokens[4], "rule") != 0) {
4346a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
4347a3a95b7dSJasvinder Singh 		return;
4348a3a95b7dSJasvinder Singh 	}
4349a3a95b7dSJasvinder Singh 
4350a3a95b7dSJasvinder Singh 	if (strcmp(tokens[5], "add") != 0) {
4351a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
4352a3a95b7dSJasvinder Singh 		return;
4353a3a95b7dSJasvinder Singh 	}
4354a3a95b7dSJasvinder Singh 
4355a3a95b7dSJasvinder Singh 	t0 = 6;
4356a3a95b7dSJasvinder Singh 
4357a3a95b7dSJasvinder Singh 	/* match */
4358a3a95b7dSJasvinder Singh 	n_tokens_parsed = parse_match(tokens + t0,
4359a3a95b7dSJasvinder Singh 		n_tokens - t0,
4360a3a95b7dSJasvinder Singh 		out,
4361a3a95b7dSJasvinder Singh 		out_size,
4362a3a95b7dSJasvinder Singh 		&m);
4363a3a95b7dSJasvinder Singh 	if (n_tokens_parsed == 0)
4364a3a95b7dSJasvinder Singh 		return;
4365a3a95b7dSJasvinder Singh 	t0 += n_tokens_parsed;
4366a3a95b7dSJasvinder Singh 
4367a3a95b7dSJasvinder Singh 	/* action */
4368a3a95b7dSJasvinder Singh 	n_tokens_parsed = parse_table_action(tokens + t0,
4369a3a95b7dSJasvinder Singh 		n_tokens - t0,
4370a3a95b7dSJasvinder Singh 		out,
4371a3a95b7dSJasvinder Singh 		out_size,
4372a3a95b7dSJasvinder Singh 		&a);
4373a3a95b7dSJasvinder Singh 	if (n_tokens_parsed == 0)
4374a3a95b7dSJasvinder Singh 		return;
4375a3a95b7dSJasvinder Singh 	t0 += n_tokens_parsed;
4376a3a95b7dSJasvinder Singh 
4377a3a95b7dSJasvinder Singh 	if (t0 != n_tokens) {
4378a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
4379a3a95b7dSJasvinder Singh 		return;
4380a3a95b7dSJasvinder Singh 	}
4381a3a95b7dSJasvinder Singh 
4382a3a95b7dSJasvinder Singh 	status = pipeline_table_rule_add(pipeline_name, table_id,
4383a3a95b7dSJasvinder Singh 		&m, &a, &data);
4384a3a95b7dSJasvinder Singh 	if (status) {
4385a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4386a3a95b7dSJasvinder Singh 		return;
4387a3a95b7dSJasvinder Singh 	}
43881edccebcSFan Zhang 
43891edccebcSFan Zhang 	if (a.action_mask & 1 << RTE_TABLE_ACTION_SYM_CRYPTO)
43901edccebcSFan Zhang 		parse_free_sym_crypto_param_data(&a.sym_crypto);
4391a3a95b7dSJasvinder Singh }
4392a3a95b7dSJasvinder Singh 
439326b3effeSKevin Laatz 
439426b3effeSKevin Laatz static const char cmd_pipeline_table_rule_add_default_help[] =
439526b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id> rule add\n"
439626b3effeSKevin Laatz "     match\n"
439726b3effeSKevin Laatz "        default\n"
439826b3effeSKevin Laatz "     action\n"
439926b3effeSKevin Laatz "        fwd\n"
440026b3effeSKevin Laatz "           drop\n"
440126b3effeSKevin Laatz "           | port <port_id>\n"
440226b3effeSKevin Laatz "           | meta\n"
440326b3effeSKevin Laatz "           | table <table_id>\n";
440426b3effeSKevin Laatz 
4405a3a95b7dSJasvinder Singh static void
4406a3a95b7dSJasvinder Singh cmd_pipeline_table_rule_add_default(char **tokens,
4407a3a95b7dSJasvinder Singh 	uint32_t n_tokens,
4408a3a95b7dSJasvinder Singh 	char *out,
4409a3a95b7dSJasvinder Singh 	size_t out_size)
4410a3a95b7dSJasvinder Singh {
4411a3a95b7dSJasvinder Singh 	struct table_rule_action action;
4412a3a95b7dSJasvinder Singh 	void *data;
4413a3a95b7dSJasvinder Singh 	char *pipeline_name;
4414a3a95b7dSJasvinder Singh 	uint32_t table_id;
4415a3a95b7dSJasvinder Singh 	int status;
4416a3a95b7dSJasvinder Singh 
4417a3a95b7dSJasvinder Singh 	if ((n_tokens != 11) && (n_tokens != 12)) {
4418a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4419a3a95b7dSJasvinder Singh 		return;
4420a3a95b7dSJasvinder Singh 	}
4421a3a95b7dSJasvinder Singh 
4422a3a95b7dSJasvinder Singh 	pipeline_name = tokens[1];
4423a3a95b7dSJasvinder Singh 
4424a3a95b7dSJasvinder Singh 	if (strcmp(tokens[2], "table") != 0) {
4425a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
4426a3a95b7dSJasvinder Singh 		return;
4427a3a95b7dSJasvinder Singh 	}
4428a3a95b7dSJasvinder Singh 
4429a3a95b7dSJasvinder Singh 	if (parser_read_uint32(&table_id, tokens[3]) != 0) {
4430a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4431a3a95b7dSJasvinder Singh 		return;
4432a3a95b7dSJasvinder Singh 	}
4433a3a95b7dSJasvinder Singh 
4434a3a95b7dSJasvinder Singh 	if (strcmp(tokens[4], "rule") != 0) {
4435a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
4436a3a95b7dSJasvinder Singh 		return;
4437a3a95b7dSJasvinder Singh 	}
4438a3a95b7dSJasvinder Singh 
4439a3a95b7dSJasvinder Singh 	if (strcmp(tokens[5], "add") != 0) {
4440a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
4441a3a95b7dSJasvinder Singh 		return;
4442a3a95b7dSJasvinder Singh 	}
4443a3a95b7dSJasvinder Singh 
4444a3a95b7dSJasvinder Singh 	if (strcmp(tokens[6], "match") != 0) {
4445a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "match");
4446a3a95b7dSJasvinder Singh 		return;
4447a3a95b7dSJasvinder Singh 	}
4448a3a95b7dSJasvinder Singh 
4449a3a95b7dSJasvinder Singh 	if (strcmp(tokens[7], "default") != 0) {
4450a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "default");
4451a3a95b7dSJasvinder Singh 		return;
4452a3a95b7dSJasvinder Singh 	}
4453a3a95b7dSJasvinder Singh 
4454a3a95b7dSJasvinder Singh 	if (strcmp(tokens[8], "action") != 0) {
4455a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "action");
4456a3a95b7dSJasvinder Singh 		return;
4457a3a95b7dSJasvinder Singh 	}
4458a3a95b7dSJasvinder Singh 
4459a3a95b7dSJasvinder Singh 	if (strcmp(tokens[9], "fwd") != 0) {
4460a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "fwd");
4461a3a95b7dSJasvinder Singh 		return;
4462a3a95b7dSJasvinder Singh 	}
4463a3a95b7dSJasvinder Singh 
4464a3a95b7dSJasvinder Singh 	action.action_mask = 1 << RTE_TABLE_ACTION_FWD;
4465a3a95b7dSJasvinder Singh 
4466a3a95b7dSJasvinder Singh 	if (strcmp(tokens[10], "drop") == 0) {
4467a3a95b7dSJasvinder Singh 		if (n_tokens != 11) {
4468a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4469a3a95b7dSJasvinder Singh 			return;
4470a3a95b7dSJasvinder Singh 		}
4471a3a95b7dSJasvinder Singh 
4472a3a95b7dSJasvinder Singh 		action.fwd.action = RTE_PIPELINE_ACTION_DROP;
4473a3a95b7dSJasvinder Singh 	} else if (strcmp(tokens[10], "port") == 0) {
4474a3a95b7dSJasvinder Singh 		uint32_t id;
4475a3a95b7dSJasvinder Singh 
4476a3a95b7dSJasvinder Singh 		if (n_tokens != 12) {
4477a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4478a3a95b7dSJasvinder Singh 			return;
4479a3a95b7dSJasvinder Singh 		}
4480a3a95b7dSJasvinder Singh 
4481a3a95b7dSJasvinder Singh 		if (parser_read_uint32(&id, tokens[11]) != 0) {
4482a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
4483a3a95b7dSJasvinder Singh 			return;
4484a3a95b7dSJasvinder Singh 		}
4485a3a95b7dSJasvinder Singh 
4486a3a95b7dSJasvinder Singh 		action.fwd.action = RTE_PIPELINE_ACTION_PORT;
4487a3a95b7dSJasvinder Singh 		action.fwd.id = id;
4488a3a95b7dSJasvinder Singh 	} else if (strcmp(tokens[10], "meta") == 0) {
4489a3a95b7dSJasvinder Singh 		if (n_tokens != 11) {
4490a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4491a3a95b7dSJasvinder Singh 			return;
4492a3a95b7dSJasvinder Singh 		}
4493a3a95b7dSJasvinder Singh 
4494a3a95b7dSJasvinder Singh 		action.fwd.action = RTE_PIPELINE_ACTION_PORT_META;
4495a3a95b7dSJasvinder Singh 	} else if (strcmp(tokens[10], "table") == 0) {
4496a3a95b7dSJasvinder Singh 		uint32_t id;
4497a3a95b7dSJasvinder Singh 
4498a3a95b7dSJasvinder Singh 		if (n_tokens != 12) {
4499a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4500a3a95b7dSJasvinder Singh 			return;
4501a3a95b7dSJasvinder Singh 		}
4502a3a95b7dSJasvinder Singh 
4503a3a95b7dSJasvinder Singh 		if (parser_read_uint32(&id, tokens[11]) != 0) {
4504a3a95b7dSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4505a3a95b7dSJasvinder Singh 			return;
4506a3a95b7dSJasvinder Singh 		}
4507a3a95b7dSJasvinder Singh 
4508a3a95b7dSJasvinder Singh 		action.fwd.action = RTE_PIPELINE_ACTION_TABLE;
4509a3a95b7dSJasvinder Singh 		action.fwd.id = id;
4510a3a95b7dSJasvinder Singh 	} else {
4511a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID,
4512a3a95b7dSJasvinder Singh 			"drop or port or meta or table");
4513a3a95b7dSJasvinder Singh 		return;
4514a3a95b7dSJasvinder Singh 	}
4515a3a95b7dSJasvinder Singh 
4516a3a95b7dSJasvinder Singh 	status = pipeline_table_rule_add_default(pipeline_name,
4517a3a95b7dSJasvinder Singh 		table_id,
4518a3a95b7dSJasvinder Singh 		&action,
4519a3a95b7dSJasvinder Singh 		&data);
4520a3a95b7dSJasvinder Singh 	if (status) {
4521a3a95b7dSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4522a3a95b7dSJasvinder Singh 		return;
4523a3a95b7dSJasvinder Singh 	}
4524a3a95b7dSJasvinder Singh }
4525a3a95b7dSJasvinder Singh 
452626b3effeSKevin Laatz 
452726b3effeSKevin Laatz static const char cmd_pipeline_table_rule_add_bulk_help[] =
452826b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id> rule add bulk <file_name> <n_rules>\n"
452926b3effeSKevin Laatz "\n"
453026b3effeSKevin Laatz "  File <file_name>:\n"
453126b3effeSKevin Laatz "  - line format: match <match> action <action>\n";
453226b3effeSKevin Laatz 
45333186282fSJasvinder Singh static int
45343186282fSJasvinder Singh cli_rule_file_process(const char *file_name,
45353186282fSJasvinder Singh 	size_t line_len_max,
45363186282fSJasvinder Singh 	struct table_rule_match *m,
45373186282fSJasvinder Singh 	struct table_rule_action *a,
45383186282fSJasvinder Singh 	uint32_t *n_rules,
45393186282fSJasvinder Singh 	uint32_t *line_number,
45403186282fSJasvinder Singh 	char *out,
45413186282fSJasvinder Singh 	size_t out_size);
45423186282fSJasvinder Singh 
45433186282fSJasvinder Singh static void
45443186282fSJasvinder Singh cmd_pipeline_table_rule_add_bulk(char **tokens,
45453186282fSJasvinder Singh 	uint32_t n_tokens,
45463186282fSJasvinder Singh 	char *out,
45473186282fSJasvinder Singh 	size_t out_size)
45483186282fSJasvinder Singh {
45493186282fSJasvinder Singh 	struct table_rule_match *match;
45503186282fSJasvinder Singh 	struct table_rule_action *action;
45513186282fSJasvinder Singh 	void **data;
45523186282fSJasvinder Singh 	char *pipeline_name, *file_name;
45533186282fSJasvinder Singh 	uint32_t table_id, n_rules, n_rules_parsed, line_number;
45543186282fSJasvinder Singh 	int status;
45553186282fSJasvinder Singh 
45563186282fSJasvinder Singh 	if (n_tokens != 9) {
45573186282fSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
45583186282fSJasvinder Singh 		return;
45593186282fSJasvinder Singh 	}
45603186282fSJasvinder Singh 
45613186282fSJasvinder Singh 	pipeline_name = tokens[1];
45623186282fSJasvinder Singh 
45633186282fSJasvinder Singh 	if (strcmp(tokens[2], "table") != 0) {
45643186282fSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
45653186282fSJasvinder Singh 		return;
45663186282fSJasvinder Singh 	}
45673186282fSJasvinder Singh 
45683186282fSJasvinder Singh 	if (parser_read_uint32(&table_id, tokens[3]) != 0) {
45693186282fSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
45703186282fSJasvinder Singh 		return;
45713186282fSJasvinder Singh 	}
45723186282fSJasvinder Singh 
45733186282fSJasvinder Singh 	if (strcmp(tokens[4], "rule") != 0) {
45743186282fSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
45753186282fSJasvinder Singh 		return;
45763186282fSJasvinder Singh 	}
45773186282fSJasvinder Singh 
45783186282fSJasvinder Singh 	if (strcmp(tokens[5], "add") != 0) {
45793186282fSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
45803186282fSJasvinder Singh 		return;
45813186282fSJasvinder Singh 	}
45823186282fSJasvinder Singh 
45833186282fSJasvinder Singh 	if (strcmp(tokens[6], "bulk") != 0) {
45843186282fSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "bulk");
45853186282fSJasvinder Singh 		return;
45863186282fSJasvinder Singh 	}
45873186282fSJasvinder Singh 
45883186282fSJasvinder Singh 	file_name = tokens[7];
45893186282fSJasvinder Singh 
45903186282fSJasvinder Singh 	if ((parser_read_uint32(&n_rules, tokens[8]) != 0) ||
45913186282fSJasvinder Singh 		(n_rules == 0)) {
45923186282fSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "n_rules");
45933186282fSJasvinder Singh 		return;
45943186282fSJasvinder Singh 	}
45953186282fSJasvinder Singh 
45963186282fSJasvinder Singh 	/* Memory allocation. */
45973186282fSJasvinder Singh 	match = calloc(n_rules, sizeof(struct table_rule_match));
45983186282fSJasvinder Singh 	action = calloc(n_rules, sizeof(struct table_rule_action));
45993186282fSJasvinder Singh 	data = calloc(n_rules, sizeof(void *));
46003186282fSJasvinder Singh 	if ((match == NULL) || (action == NULL) || (data == NULL)) {
46013186282fSJasvinder Singh 		snprintf(out, out_size, MSG_OUT_OF_MEMORY);
46023186282fSJasvinder Singh 		free(data);
46033186282fSJasvinder Singh 		free(action);
46043186282fSJasvinder Singh 		free(match);
46053186282fSJasvinder Singh 		return;
46063186282fSJasvinder Singh 	}
46073186282fSJasvinder Singh 
46083186282fSJasvinder Singh 	/* Load rule file */
46093186282fSJasvinder Singh 	n_rules_parsed = n_rules;
46103186282fSJasvinder Singh 	status = cli_rule_file_process(file_name,
46113186282fSJasvinder Singh 		1024,
46123186282fSJasvinder Singh 		match,
46133186282fSJasvinder Singh 		action,
46143186282fSJasvinder Singh 		&n_rules_parsed,
46153186282fSJasvinder Singh 		&line_number,
46163186282fSJasvinder Singh 		out,
46173186282fSJasvinder Singh 		out_size);
46183186282fSJasvinder Singh 	if (status) {
46193186282fSJasvinder Singh 		snprintf(out, out_size, MSG_FILE_ERR, file_name, line_number);
46203186282fSJasvinder Singh 		free(data);
46213186282fSJasvinder Singh 		free(action);
46223186282fSJasvinder Singh 		free(match);
46233186282fSJasvinder Singh 		return;
46243186282fSJasvinder Singh 	}
46253186282fSJasvinder Singh 	if (n_rules_parsed != n_rules) {
46263186282fSJasvinder Singh 		snprintf(out, out_size, MSG_FILE_NOT_ENOUGH, file_name);
46273186282fSJasvinder Singh 		free(data);
46283186282fSJasvinder Singh 		free(action);
46293186282fSJasvinder Singh 		free(match);
46303186282fSJasvinder Singh 		return;
46313186282fSJasvinder Singh 	}
46323186282fSJasvinder Singh 
46333186282fSJasvinder Singh 	/* Rule bulk add */
46343186282fSJasvinder Singh 	status = pipeline_table_rule_add_bulk(pipeline_name,
46353186282fSJasvinder Singh 		table_id,
46363186282fSJasvinder Singh 		match,
46373186282fSJasvinder Singh 		action,
46383186282fSJasvinder Singh 		data,
46393186282fSJasvinder Singh 		&n_rules);
46403186282fSJasvinder Singh 	if (status) {
46413186282fSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
46423186282fSJasvinder Singh 		free(data);
46433186282fSJasvinder Singh 		free(action);
46443186282fSJasvinder Singh 		free(match);
46453186282fSJasvinder Singh 		return;
46463186282fSJasvinder Singh 	}
46473186282fSJasvinder Singh 
46483186282fSJasvinder Singh 	/* Memory free */
46493186282fSJasvinder Singh 	free(data);
46503186282fSJasvinder Singh 	free(action);
46513186282fSJasvinder Singh 	free(match);
46523186282fSJasvinder Singh }
46533186282fSJasvinder Singh 
465426b3effeSKevin Laatz 
465526b3effeSKevin Laatz static const char cmd_pipeline_table_rule_delete_help[] =
465626b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id> rule delete\n"
465726b3effeSKevin Laatz "     match <match>\n";
465826b3effeSKevin Laatz 
4659f634e4c5SJasvinder Singh static void
4660f634e4c5SJasvinder Singh cmd_pipeline_table_rule_delete(char **tokens,
4661f634e4c5SJasvinder Singh 	uint32_t n_tokens,
4662f634e4c5SJasvinder Singh 	char *out,
4663f634e4c5SJasvinder Singh 	size_t out_size)
4664f634e4c5SJasvinder Singh {
4665f634e4c5SJasvinder Singh 	struct table_rule_match m;
4666f634e4c5SJasvinder Singh 	char *pipeline_name;
4667f634e4c5SJasvinder Singh 	uint32_t table_id, n_tokens_parsed, t0;
4668f634e4c5SJasvinder Singh 	int status;
4669f634e4c5SJasvinder Singh 
4670f634e4c5SJasvinder Singh 	if (n_tokens < 8) {
4671f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4672f634e4c5SJasvinder Singh 		return;
4673f634e4c5SJasvinder Singh 	}
4674f634e4c5SJasvinder Singh 
4675f634e4c5SJasvinder Singh 	pipeline_name = tokens[1];
4676f634e4c5SJasvinder Singh 
4677f634e4c5SJasvinder Singh 	if (strcmp(tokens[2], "table") != 0) {
4678f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
4679f634e4c5SJasvinder Singh 		return;
4680f634e4c5SJasvinder Singh 	}
4681f634e4c5SJasvinder Singh 
4682f634e4c5SJasvinder Singh 	if (parser_read_uint32(&table_id, tokens[3]) != 0) {
4683f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4684f634e4c5SJasvinder Singh 		return;
4685f634e4c5SJasvinder Singh 	}
4686f634e4c5SJasvinder Singh 
4687f634e4c5SJasvinder Singh 	if (strcmp(tokens[4], "rule") != 0) {
4688f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
4689f634e4c5SJasvinder Singh 		return;
4690f634e4c5SJasvinder Singh 	}
4691f634e4c5SJasvinder Singh 
4692f634e4c5SJasvinder Singh 	if (strcmp(tokens[5], "delete") != 0) {
4693f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
4694f634e4c5SJasvinder Singh 		return;
4695f634e4c5SJasvinder Singh 	}
4696f634e4c5SJasvinder Singh 
4697f634e4c5SJasvinder Singh 	t0 = 6;
4698f634e4c5SJasvinder Singh 
4699f634e4c5SJasvinder Singh 	/* match */
4700f634e4c5SJasvinder Singh 	n_tokens_parsed = parse_match(tokens + t0,
4701f634e4c5SJasvinder Singh 		n_tokens - t0,
4702f634e4c5SJasvinder Singh 		out,
4703f634e4c5SJasvinder Singh 		out_size,
4704f634e4c5SJasvinder Singh 		&m);
4705f634e4c5SJasvinder Singh 	if (n_tokens_parsed == 0)
4706f634e4c5SJasvinder Singh 		return;
4707f634e4c5SJasvinder Singh 	t0 += n_tokens_parsed;
4708f634e4c5SJasvinder Singh 
4709f634e4c5SJasvinder Singh 	if (n_tokens != t0) {
4710f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4711f634e4c5SJasvinder Singh 		return;
4712f634e4c5SJasvinder Singh 	}
4713f634e4c5SJasvinder Singh 
4714f634e4c5SJasvinder Singh 	status = pipeline_table_rule_delete(pipeline_name,
4715f634e4c5SJasvinder Singh 		table_id,
4716f634e4c5SJasvinder Singh 		&m);
4717f634e4c5SJasvinder Singh 	if (status) {
4718f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4719f634e4c5SJasvinder Singh 		return;
4720f634e4c5SJasvinder Singh 	}
4721f634e4c5SJasvinder Singh }
4722f634e4c5SJasvinder Singh 
472326b3effeSKevin Laatz 
472426b3effeSKevin Laatz static const char cmd_pipeline_table_rule_delete_default_help[] =
472526b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id> rule delete\n"
472626b3effeSKevin Laatz "     match\n"
472726b3effeSKevin Laatz "        default\n";
472826b3effeSKevin Laatz 
4729f634e4c5SJasvinder Singh static void
4730f634e4c5SJasvinder Singh cmd_pipeline_table_rule_delete_default(char **tokens,
4731f634e4c5SJasvinder Singh 	uint32_t n_tokens,
4732f634e4c5SJasvinder Singh 	char *out,
4733f634e4c5SJasvinder Singh 	size_t out_size)
4734f634e4c5SJasvinder Singh {
4735f634e4c5SJasvinder Singh 	char *pipeline_name;
4736f634e4c5SJasvinder Singh 	uint32_t table_id;
4737f634e4c5SJasvinder Singh 	int status;
4738f634e4c5SJasvinder Singh 
4739f634e4c5SJasvinder Singh 	if (n_tokens != 8) {
4740f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4741f634e4c5SJasvinder Singh 		return;
4742f634e4c5SJasvinder Singh 	}
4743f634e4c5SJasvinder Singh 
4744f634e4c5SJasvinder Singh 	pipeline_name = tokens[1];
4745f634e4c5SJasvinder Singh 
4746f634e4c5SJasvinder Singh 	if (strcmp(tokens[2], "table") != 0) {
4747f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
4748f634e4c5SJasvinder Singh 		return;
4749f634e4c5SJasvinder Singh 	}
4750f634e4c5SJasvinder Singh 
4751f634e4c5SJasvinder Singh 	if (parser_read_uint32(&table_id, tokens[3]) != 0) {
4752f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4753f634e4c5SJasvinder Singh 		return;
4754f634e4c5SJasvinder Singh 	}
4755f634e4c5SJasvinder Singh 
4756f634e4c5SJasvinder Singh 	if (strcmp(tokens[4], "rule") != 0) {
4757f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
4758f634e4c5SJasvinder Singh 		return;
4759f634e4c5SJasvinder Singh 	}
4760f634e4c5SJasvinder Singh 
4761f634e4c5SJasvinder Singh 	if (strcmp(tokens[5], "delete") != 0) {
4762f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
4763f634e4c5SJasvinder Singh 		return;
4764f634e4c5SJasvinder Singh 	}
4765f634e4c5SJasvinder Singh 
4766f634e4c5SJasvinder Singh 	if (strcmp(tokens[6], "match") != 0) {
4767f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "match");
4768f634e4c5SJasvinder Singh 		return;
4769f634e4c5SJasvinder Singh 	}
4770f634e4c5SJasvinder Singh 
4771f634e4c5SJasvinder Singh 	if (strcmp(tokens[7], "default") != 0) {
4772f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "default");
4773f634e4c5SJasvinder Singh 		return;
4774f634e4c5SJasvinder Singh 	}
4775f634e4c5SJasvinder Singh 
4776f634e4c5SJasvinder Singh 	status = pipeline_table_rule_delete_default(pipeline_name,
4777f634e4c5SJasvinder Singh 		table_id);
4778f634e4c5SJasvinder Singh 	if (status) {
4779f634e4c5SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4780f634e4c5SJasvinder Singh 		return;
4781f634e4c5SJasvinder Singh 	}
4782f634e4c5SJasvinder Singh }
4783f634e4c5SJasvinder Singh 
478426b3effeSKevin Laatz 
478526b3effeSKevin Laatz static const char cmd_pipeline_table_rule_stats_read_help[] =
478626b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id> rule read stats [clear]\n";
478726b3effeSKevin Laatz 
4788c64b9121SJasvinder Singh static void
4789c64b9121SJasvinder Singh cmd_pipeline_table_rule_stats_read(char **tokens,
4790c64b9121SJasvinder Singh 	uint32_t n_tokens __rte_unused,
4791c64b9121SJasvinder Singh 	char *out,
4792c64b9121SJasvinder Singh 	size_t out_size)
4793c64b9121SJasvinder Singh {
4794c64b9121SJasvinder Singh 	snprintf(out, out_size, MSG_CMD_UNIMPLEM, tokens[0]);
4795c64b9121SJasvinder Singh }
4796c64b9121SJasvinder Singh 
479726b3effeSKevin Laatz 
479826b3effeSKevin Laatz static const char cmd_pipeline_table_meter_profile_add_help[] =
479926b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id> meter profile <meter_profile_id>\n"
480026b3effeSKevin Laatz "   add srtcm cir <cir> cbs <cbs> ebs <ebs>\n"
480126b3effeSKevin Laatz "   | trtcm cir <cir> pir <pir> cbs <cbs> pbs <pbs>\n";
480226b3effeSKevin Laatz 
48037e11393eSJasvinder Singh static void
48047e11393eSJasvinder Singh cmd_pipeline_table_meter_profile_add(char **tokens,
48057e11393eSJasvinder Singh 	uint32_t n_tokens,
48067e11393eSJasvinder Singh 	char *out,
48077e11393eSJasvinder Singh 	size_t out_size)
48087e11393eSJasvinder Singh {
48097e11393eSJasvinder Singh 	struct rte_table_action_meter_profile p;
48107e11393eSJasvinder Singh 	char *pipeline_name;
48117e11393eSJasvinder Singh 	uint32_t table_id, meter_profile_id;
48127e11393eSJasvinder Singh 	int status;
48137e11393eSJasvinder Singh 
48147e11393eSJasvinder Singh 	if (n_tokens < 9) {
48157e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
48167e11393eSJasvinder Singh 		return;
48177e11393eSJasvinder Singh 	}
48187e11393eSJasvinder Singh 
48197e11393eSJasvinder Singh 	pipeline_name = tokens[1];
48207e11393eSJasvinder Singh 
48217e11393eSJasvinder Singh 	if (strcmp(tokens[2], "table") != 0) {
48227e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
48237e11393eSJasvinder Singh 		return;
48247e11393eSJasvinder Singh 	}
48257e11393eSJasvinder Singh 
48267e11393eSJasvinder Singh 	if (parser_read_uint32(&table_id, tokens[3]) != 0) {
48277e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
48287e11393eSJasvinder Singh 		return;
48297e11393eSJasvinder Singh 	}
48307e11393eSJasvinder Singh 
48317e11393eSJasvinder Singh 	if (strcmp(tokens[4], "meter") != 0) {
48327e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "meter");
48337e11393eSJasvinder Singh 		return;
48347e11393eSJasvinder Singh 	}
48357e11393eSJasvinder Singh 
48367e11393eSJasvinder Singh 	if (strcmp(tokens[5], "profile") != 0) {
48377e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
48387e11393eSJasvinder Singh 		return;
48397e11393eSJasvinder Singh 	}
48407e11393eSJasvinder Singh 
48417e11393eSJasvinder Singh 	if (parser_read_uint32(&meter_profile_id, tokens[6]) != 0) {
48427e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "meter_profile_id");
48437e11393eSJasvinder Singh 		return;
48447e11393eSJasvinder Singh 	}
48457e11393eSJasvinder Singh 
48467e11393eSJasvinder Singh 	if (strcmp(tokens[7], "add") != 0) {
48477e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
48487e11393eSJasvinder Singh 		return;
48497e11393eSJasvinder Singh 	}
48507e11393eSJasvinder Singh 
48517e11393eSJasvinder Singh 	if (strcmp(tokens[8], "srtcm") == 0) {
48527e11393eSJasvinder Singh 		if (n_tokens != 15) {
48537e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH,
48547e11393eSJasvinder Singh 				tokens[0]);
48557e11393eSJasvinder Singh 			return;
48567e11393eSJasvinder Singh 		}
48577e11393eSJasvinder Singh 
48587e11393eSJasvinder Singh 		p.alg = RTE_TABLE_ACTION_METER_SRTCM;
48597e11393eSJasvinder Singh 
48607e11393eSJasvinder Singh 		if (strcmp(tokens[9], "cir") != 0) {
48617e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cir");
48627e11393eSJasvinder Singh 			return;
48637e11393eSJasvinder Singh 		}
48647e11393eSJasvinder Singh 
48657e11393eSJasvinder Singh 		if (parser_read_uint64(&p.srtcm.cir, tokens[10]) != 0) {
48667e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "cir");
48677e11393eSJasvinder Singh 			return;
48687e11393eSJasvinder Singh 		}
48697e11393eSJasvinder Singh 
48707e11393eSJasvinder Singh 		if (strcmp(tokens[11], "cbs") != 0) {
48717e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cbs");
48727e11393eSJasvinder Singh 			return;
48737e11393eSJasvinder Singh 		}
48747e11393eSJasvinder Singh 
48757e11393eSJasvinder Singh 		if (parser_read_uint64(&p.srtcm.cbs, tokens[12]) != 0) {
48767e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "cbs");
48777e11393eSJasvinder Singh 			return;
48787e11393eSJasvinder Singh 		}
48797e11393eSJasvinder Singh 
48807e11393eSJasvinder Singh 		if (strcmp(tokens[13], "ebs") != 0) {
48817e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "ebs");
48827e11393eSJasvinder Singh 			return;
48837e11393eSJasvinder Singh 		}
48847e11393eSJasvinder Singh 
48857e11393eSJasvinder Singh 		if (parser_read_uint64(&p.srtcm.ebs, tokens[14]) != 0) {
48867e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "ebs");
48877e11393eSJasvinder Singh 			return;
48887e11393eSJasvinder Singh 		}
48897e11393eSJasvinder Singh 	} else if (strcmp(tokens[8], "trtcm") == 0) {
48907e11393eSJasvinder Singh 		if (n_tokens != 17) {
48917e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
48927e11393eSJasvinder Singh 			return;
48937e11393eSJasvinder Singh 		}
48947e11393eSJasvinder Singh 
48957e11393eSJasvinder Singh 		p.alg = RTE_TABLE_ACTION_METER_TRTCM;
48967e11393eSJasvinder Singh 
48977e11393eSJasvinder Singh 		if (strcmp(tokens[9], "cir") != 0) {
48987e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cir");
48997e11393eSJasvinder Singh 			return;
49007e11393eSJasvinder Singh 		}
49017e11393eSJasvinder Singh 
49027e11393eSJasvinder Singh 		if (parser_read_uint64(&p.trtcm.cir, tokens[10]) != 0) {
49037e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "cir");
49047e11393eSJasvinder Singh 			return;
49057e11393eSJasvinder Singh 		}
49067e11393eSJasvinder Singh 
49077e11393eSJasvinder Singh 		if (strcmp(tokens[11], "pir") != 0) {
49087e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pir");
49097e11393eSJasvinder Singh 			return;
49107e11393eSJasvinder Singh 		}
49117e11393eSJasvinder Singh 
49127e11393eSJasvinder Singh 		if (parser_read_uint64(&p.trtcm.pir, tokens[12]) != 0) {
49137e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "pir");
49147e11393eSJasvinder Singh 			return;
49157e11393eSJasvinder Singh 		}
49167e11393eSJasvinder Singh 		if (strcmp(tokens[13], "cbs") != 0) {
49177e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cbs");
49187e11393eSJasvinder Singh 			return;
49197e11393eSJasvinder Singh 		}
49207e11393eSJasvinder Singh 
49217e11393eSJasvinder Singh 		if (parser_read_uint64(&p.trtcm.cbs, tokens[14]) != 0) {
49227e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "cbs");
49237e11393eSJasvinder Singh 			return;
49247e11393eSJasvinder Singh 		}
49257e11393eSJasvinder Singh 
49267e11393eSJasvinder Singh 		if (strcmp(tokens[15], "pbs") != 0) {
49277e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pbs");
49287e11393eSJasvinder Singh 			return;
49297e11393eSJasvinder Singh 		}
49307e11393eSJasvinder Singh 
49317e11393eSJasvinder Singh 		if (parser_read_uint64(&p.trtcm.pbs, tokens[16]) != 0) {
49327e11393eSJasvinder Singh 			snprintf(out, out_size, MSG_ARG_INVALID, "pbs");
49337e11393eSJasvinder Singh 			return;
49347e11393eSJasvinder Singh 		}
49357e11393eSJasvinder Singh 	} else {
49367e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
49377e11393eSJasvinder Singh 		return;
49387e11393eSJasvinder Singh 	}
49397e11393eSJasvinder Singh 
49407e11393eSJasvinder Singh 	status = pipeline_table_mtr_profile_add(pipeline_name,
49417e11393eSJasvinder Singh 		table_id,
49427e11393eSJasvinder Singh 		meter_profile_id,
49437e11393eSJasvinder Singh 		&p);
49447e11393eSJasvinder Singh 	if (status) {
49457e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
49467e11393eSJasvinder Singh 		return;
49477e11393eSJasvinder Singh 	}
49487e11393eSJasvinder Singh }
49497e11393eSJasvinder Singh 
495026b3effeSKevin Laatz 
495126b3effeSKevin Laatz static const char cmd_pipeline_table_meter_profile_delete_help[] =
495226b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id>\n"
495326b3effeSKevin Laatz "   meter profile <meter_profile_id> delete\n";
495426b3effeSKevin Laatz 
49557e11393eSJasvinder Singh static void
49567e11393eSJasvinder Singh cmd_pipeline_table_meter_profile_delete(char **tokens,
49577e11393eSJasvinder Singh 	uint32_t n_tokens,
49587e11393eSJasvinder Singh 	char *out,
49597e11393eSJasvinder Singh 	size_t out_size)
49607e11393eSJasvinder Singh {
49617e11393eSJasvinder Singh 	char *pipeline_name;
49627e11393eSJasvinder Singh 	uint32_t table_id, meter_profile_id;
49637e11393eSJasvinder Singh 	int status;
49647e11393eSJasvinder Singh 
49657e11393eSJasvinder Singh 	if (n_tokens != 8) {
49667e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
49677e11393eSJasvinder Singh 		return;
49687e11393eSJasvinder Singh 	}
49697e11393eSJasvinder Singh 
49707e11393eSJasvinder Singh 	pipeline_name = tokens[1];
49717e11393eSJasvinder Singh 
49727e11393eSJasvinder Singh 	if (strcmp(tokens[2], "table") != 0) {
49737e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
49747e11393eSJasvinder Singh 		return;
49757e11393eSJasvinder Singh 	}
49767e11393eSJasvinder Singh 
49777e11393eSJasvinder Singh 	if (parser_read_uint32(&table_id, tokens[3]) != 0) {
49787e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
49797e11393eSJasvinder Singh 		return;
49807e11393eSJasvinder Singh 	}
49817e11393eSJasvinder Singh 
49827e11393eSJasvinder Singh 	if (strcmp(tokens[4], "meter") != 0) {
49837e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "meter");
49847e11393eSJasvinder Singh 		return;
49857e11393eSJasvinder Singh 	}
49867e11393eSJasvinder Singh 
49877e11393eSJasvinder Singh 	if (strcmp(tokens[5], "profile") != 0) {
49887e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
49897e11393eSJasvinder Singh 		return;
49907e11393eSJasvinder Singh 	}
49917e11393eSJasvinder Singh 
49927e11393eSJasvinder Singh 	if (parser_read_uint32(&meter_profile_id, tokens[6]) != 0) {
49937e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "meter_profile_id");
49947e11393eSJasvinder Singh 		return;
49957e11393eSJasvinder Singh 	}
49967e11393eSJasvinder Singh 
49977e11393eSJasvinder Singh 	if (strcmp(tokens[7], "delete") != 0) {
49987e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
49997e11393eSJasvinder Singh 		return;
50007e11393eSJasvinder Singh 	}
50017e11393eSJasvinder Singh 
50027e11393eSJasvinder Singh 	status = pipeline_table_mtr_profile_delete(pipeline_name,
50037e11393eSJasvinder Singh 		table_id,
50047e11393eSJasvinder Singh 		meter_profile_id);
50057e11393eSJasvinder Singh 	if (status) {
50067e11393eSJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
50077e11393eSJasvinder Singh 		return;
50087e11393eSJasvinder Singh 	}
50097e11393eSJasvinder Singh }
50107e11393eSJasvinder Singh 
501126b3effeSKevin Laatz 
501226b3effeSKevin Laatz static const char cmd_pipeline_table_rule_meter_read_help[] =
501326b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id> rule read meter [clear]\n";
501426b3effeSKevin Laatz 
5015e92058d6SJasvinder Singh static void
5016e92058d6SJasvinder Singh cmd_pipeline_table_rule_meter_read(char **tokens,
5017e92058d6SJasvinder Singh 	uint32_t n_tokens __rte_unused,
5018e92058d6SJasvinder Singh 	char *out,
5019e92058d6SJasvinder Singh 	size_t out_size)
5020e92058d6SJasvinder Singh {
5021e92058d6SJasvinder Singh 	snprintf(out, out_size, MSG_CMD_UNIMPLEM, tokens[0]);
5022e92058d6SJasvinder Singh }
5023e92058d6SJasvinder Singh 
502426b3effeSKevin Laatz 
502526b3effeSKevin Laatz static const char cmd_pipeline_table_dscp_help[] =
502626b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id> dscp <file_name>\n"
502726b3effeSKevin Laatz "\n"
502826b3effeSKevin Laatz " File <file_name>:\n"
502926b3effeSKevin Laatz "   - exactly 64 lines\n"
503026b3effeSKevin Laatz "   - line format: <tc_id> <tc_queue_id> <color>, with <color> as: g | y | r\n";
503126b3effeSKevin Laatz 
50322b82ef48SJasvinder Singh static int
50332b82ef48SJasvinder Singh load_dscp_table(struct rte_table_action_dscp_table *dscp_table,
50342b82ef48SJasvinder Singh 	const char *file_name,
50352b82ef48SJasvinder Singh 	uint32_t *line_number)
50362b82ef48SJasvinder Singh {
50372b82ef48SJasvinder Singh 	FILE *f = NULL;
50382b82ef48SJasvinder Singh 	uint32_t dscp, l;
50392b82ef48SJasvinder Singh 
50402b82ef48SJasvinder Singh 	/* Check input arguments */
50412b82ef48SJasvinder Singh 	if ((dscp_table == NULL) ||
50422b82ef48SJasvinder Singh 		(file_name == NULL) ||
50432b82ef48SJasvinder Singh 		(line_number == NULL)) {
50442b82ef48SJasvinder Singh 		if (line_number)
50452b82ef48SJasvinder Singh 			*line_number = 0;
50462b82ef48SJasvinder Singh 		return -EINVAL;
50472b82ef48SJasvinder Singh 	}
50482b82ef48SJasvinder Singh 
50492b82ef48SJasvinder Singh 	/* Open input file */
50502b82ef48SJasvinder Singh 	f = fopen(file_name, "r");
50512b82ef48SJasvinder Singh 	if (f == NULL) {
50522b82ef48SJasvinder Singh 		*line_number = 0;
50532b82ef48SJasvinder Singh 		return -EINVAL;
50542b82ef48SJasvinder Singh 	}
50552b82ef48SJasvinder Singh 
50562b82ef48SJasvinder Singh 	/* Read file */
50572b82ef48SJasvinder Singh 	for (dscp = 0, l = 1; ; l++) {
50582b82ef48SJasvinder Singh 		char line[64];
50592b82ef48SJasvinder Singh 		char *tokens[3];
50602b82ef48SJasvinder Singh 		enum rte_meter_color color;
50612b82ef48SJasvinder Singh 		uint32_t tc_id, tc_queue_id, n_tokens = RTE_DIM(tokens);
50622b82ef48SJasvinder Singh 
50632b82ef48SJasvinder Singh 		if (fgets(line, sizeof(line), f) == NULL)
50642b82ef48SJasvinder Singh 			break;
50652b82ef48SJasvinder Singh 
50662b82ef48SJasvinder Singh 		if (is_comment(line))
50672b82ef48SJasvinder Singh 			continue;
50682b82ef48SJasvinder Singh 
50692b82ef48SJasvinder Singh 		if (parse_tokenize_string(line, tokens, &n_tokens)) {
50702b82ef48SJasvinder Singh 			*line_number = l;
50719b607951SJasvinder Singh 			fclose(f);
50722b82ef48SJasvinder Singh 			return -EINVAL;
50732b82ef48SJasvinder Singh 		}
50742b82ef48SJasvinder Singh 
50752b82ef48SJasvinder Singh 		if (n_tokens == 0)
50762b82ef48SJasvinder Singh 			continue;
50772b82ef48SJasvinder Singh 
50782b82ef48SJasvinder Singh 		if ((dscp >= RTE_DIM(dscp_table->entry)) ||
50792b82ef48SJasvinder Singh 			(n_tokens != RTE_DIM(tokens)) ||
50802b82ef48SJasvinder Singh 			parser_read_uint32(&tc_id, tokens[0]) ||
50812b82ef48SJasvinder Singh 			(tc_id >= RTE_TABLE_ACTION_TC_MAX) ||
50822b82ef48SJasvinder Singh 			parser_read_uint32(&tc_queue_id, tokens[1]) ||
50832b82ef48SJasvinder Singh 			(tc_queue_id >= RTE_TABLE_ACTION_TC_QUEUE_MAX) ||
50842b82ef48SJasvinder Singh 			(strlen(tokens[2]) != 1)) {
50852b82ef48SJasvinder Singh 			*line_number = l;
50869b607951SJasvinder Singh 			fclose(f);
50872b82ef48SJasvinder Singh 			return -EINVAL;
50882b82ef48SJasvinder Singh 		}
50892b82ef48SJasvinder Singh 
50902b82ef48SJasvinder Singh 		switch (tokens[2][0]) {
50912b82ef48SJasvinder Singh 		case 'g':
50922b82ef48SJasvinder Singh 		case 'G':
50932b82ef48SJasvinder Singh 			color = e_RTE_METER_GREEN;
50942b82ef48SJasvinder Singh 			break;
50952b82ef48SJasvinder Singh 
50962b82ef48SJasvinder Singh 		case 'y':
50972b82ef48SJasvinder Singh 		case 'Y':
50982b82ef48SJasvinder Singh 			color = e_RTE_METER_YELLOW;
50992b82ef48SJasvinder Singh 			break;
51002b82ef48SJasvinder Singh 
51012b82ef48SJasvinder Singh 		case 'r':
51022b82ef48SJasvinder Singh 		case 'R':
51032b82ef48SJasvinder Singh 			color = e_RTE_METER_RED;
51042b82ef48SJasvinder Singh 			break;
51052b82ef48SJasvinder Singh 
51062b82ef48SJasvinder Singh 		default:
51072b82ef48SJasvinder Singh 			*line_number = l;
51089b607951SJasvinder Singh 			fclose(f);
51092b82ef48SJasvinder Singh 			return -EINVAL;
51102b82ef48SJasvinder Singh 		}
51112b82ef48SJasvinder Singh 
51122b82ef48SJasvinder Singh 		dscp_table->entry[dscp].tc_id = tc_id;
51132b82ef48SJasvinder Singh 		dscp_table->entry[dscp].tc_queue_id = tc_queue_id;
51142b82ef48SJasvinder Singh 		dscp_table->entry[dscp].color = color;
51152b82ef48SJasvinder Singh 		dscp++;
51162b82ef48SJasvinder Singh 	}
51172b82ef48SJasvinder Singh 
51182b82ef48SJasvinder Singh 	/* Close file */
51192b82ef48SJasvinder Singh 	fclose(f);
51202b82ef48SJasvinder Singh 	return 0;
51212b82ef48SJasvinder Singh }
51222b82ef48SJasvinder Singh 
51232b82ef48SJasvinder Singh static void
51242b82ef48SJasvinder Singh cmd_pipeline_table_dscp(char **tokens,
51252b82ef48SJasvinder Singh 	uint32_t n_tokens,
51262b82ef48SJasvinder Singh 	char *out,
51272b82ef48SJasvinder Singh 	size_t out_size)
51282b82ef48SJasvinder Singh {
51292b82ef48SJasvinder Singh 	struct rte_table_action_dscp_table dscp_table;
51302b82ef48SJasvinder Singh 	char *pipeline_name, *file_name;
51312b82ef48SJasvinder Singh 	uint32_t table_id, line_number;
51322b82ef48SJasvinder Singh 	int status;
51332b82ef48SJasvinder Singh 
51342b82ef48SJasvinder Singh 	if (n_tokens != 6) {
51352b82ef48SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
51362b82ef48SJasvinder Singh 		return;
51372b82ef48SJasvinder Singh 	}
51382b82ef48SJasvinder Singh 
51392b82ef48SJasvinder Singh 	pipeline_name = tokens[1];
51402b82ef48SJasvinder Singh 
51412b82ef48SJasvinder Singh 	if (strcmp(tokens[2], "table") != 0) {
51422b82ef48SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
51432b82ef48SJasvinder Singh 		return;
51442b82ef48SJasvinder Singh 	}
51452b82ef48SJasvinder Singh 
51462b82ef48SJasvinder Singh 	if (parser_read_uint32(&table_id, tokens[3]) != 0) {
51472b82ef48SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
51482b82ef48SJasvinder Singh 		return;
51492b82ef48SJasvinder Singh 	}
51502b82ef48SJasvinder Singh 
51512b82ef48SJasvinder Singh 	if (strcmp(tokens[4], "dscp") != 0) {
51522b82ef48SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "dscp");
51532b82ef48SJasvinder Singh 		return;
51542b82ef48SJasvinder Singh 	}
51552b82ef48SJasvinder Singh 
51562b82ef48SJasvinder Singh 	file_name = tokens[5];
51572b82ef48SJasvinder Singh 
51582b82ef48SJasvinder Singh 	status = load_dscp_table(&dscp_table, file_name, &line_number);
51592b82ef48SJasvinder Singh 	if (status) {
51602b82ef48SJasvinder Singh 		snprintf(out, out_size, MSG_FILE_ERR, file_name, line_number);
51612b82ef48SJasvinder Singh 		return;
51622b82ef48SJasvinder Singh 	}
51632b82ef48SJasvinder Singh 
51642b82ef48SJasvinder Singh 	status = pipeline_table_dscp_table_update(pipeline_name,
51652b82ef48SJasvinder Singh 		table_id,
51662b82ef48SJasvinder Singh 		UINT64_MAX,
51672b82ef48SJasvinder Singh 		&dscp_table);
51682b82ef48SJasvinder Singh 	if (status) {
51692b82ef48SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
51702b82ef48SJasvinder Singh 		return;
51712b82ef48SJasvinder Singh 	}
51722b82ef48SJasvinder Singh }
51732b82ef48SJasvinder Singh 
517426b3effeSKevin Laatz 
517526b3effeSKevin Laatz static const char cmd_pipeline_table_rule_ttl_read_help[] =
517626b3effeSKevin Laatz "pipeline <pipeline_name> table <table_id> rule read ttl [clear]\n";
517726b3effeSKevin Laatz 
5178d0d306c7SJasvinder Singh static void
5179d0d306c7SJasvinder Singh cmd_pipeline_table_rule_ttl_read(char **tokens,
5180d0d306c7SJasvinder Singh 	uint32_t n_tokens __rte_unused,
5181d0d306c7SJasvinder Singh 	char *out,
5182d0d306c7SJasvinder Singh 	size_t out_size)
5183d0d306c7SJasvinder Singh {
5184d0d306c7SJasvinder Singh 	snprintf(out, out_size, MSG_CMD_UNIMPLEM, tokens[0]);
5185d0d306c7SJasvinder Singh }
5186d0d306c7SJasvinder Singh 
518726b3effeSKevin Laatz 
518826b3effeSKevin Laatz static const char cmd_thread_pipeline_enable_help[] =
518926b3effeSKevin Laatz "thread <thread_id> pipeline <pipeline_name> enable\n";
519026b3effeSKevin Laatz 
519132e5d9b1SJasvinder Singh static void
519232e5d9b1SJasvinder Singh cmd_thread_pipeline_enable(char **tokens,
519332e5d9b1SJasvinder Singh 	uint32_t n_tokens,
519432e5d9b1SJasvinder Singh 	char *out,
519532e5d9b1SJasvinder Singh 	size_t out_size)
519632e5d9b1SJasvinder Singh {
519732e5d9b1SJasvinder Singh 	char *pipeline_name;
519832e5d9b1SJasvinder Singh 	uint32_t thread_id;
519932e5d9b1SJasvinder Singh 	int status;
520032e5d9b1SJasvinder Singh 
520132e5d9b1SJasvinder Singh 	if (n_tokens != 5) {
520232e5d9b1SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
520332e5d9b1SJasvinder Singh 		return;
520432e5d9b1SJasvinder Singh 	}
520532e5d9b1SJasvinder Singh 
520632e5d9b1SJasvinder Singh 	if (parser_read_uint32(&thread_id, tokens[1]) != 0) {
520732e5d9b1SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
520832e5d9b1SJasvinder Singh 		return;
520932e5d9b1SJasvinder Singh 	}
521032e5d9b1SJasvinder Singh 
521132e5d9b1SJasvinder Singh 	if (strcmp(tokens[2], "pipeline") != 0) {
521232e5d9b1SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipeline");
521332e5d9b1SJasvinder Singh 		return;
521432e5d9b1SJasvinder Singh 	}
521532e5d9b1SJasvinder Singh 
521632e5d9b1SJasvinder Singh 	pipeline_name = tokens[3];
521732e5d9b1SJasvinder Singh 
521832e5d9b1SJasvinder Singh 	if (strcmp(tokens[4], "enable") != 0) {
521932e5d9b1SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "enable");
522032e5d9b1SJasvinder Singh 		return;
522132e5d9b1SJasvinder Singh 	}
522232e5d9b1SJasvinder Singh 
522332e5d9b1SJasvinder Singh 	status = thread_pipeline_enable(thread_id, pipeline_name);
522432e5d9b1SJasvinder Singh 	if (status) {
522532e5d9b1SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL, "thread pipeline enable");
522632e5d9b1SJasvinder Singh 		return;
522732e5d9b1SJasvinder Singh 	}
522832e5d9b1SJasvinder Singh }
522932e5d9b1SJasvinder Singh 
523026b3effeSKevin Laatz 
523126b3effeSKevin Laatz static const char cmd_thread_pipeline_disable_help[] =
523226b3effeSKevin Laatz "thread <thread_id> pipeline <pipeline_name> disable\n";
523326b3effeSKevin Laatz 
523432e5d9b1SJasvinder Singh static void
523532e5d9b1SJasvinder Singh cmd_thread_pipeline_disable(char **tokens,
523632e5d9b1SJasvinder Singh 	uint32_t n_tokens,
523732e5d9b1SJasvinder Singh 	char *out,
523832e5d9b1SJasvinder Singh 	size_t out_size)
523932e5d9b1SJasvinder Singh {
524032e5d9b1SJasvinder Singh 	char *pipeline_name;
524132e5d9b1SJasvinder Singh 	uint32_t thread_id;
524232e5d9b1SJasvinder Singh 	int status;
524332e5d9b1SJasvinder Singh 
524432e5d9b1SJasvinder Singh 	if (n_tokens != 5) {
524532e5d9b1SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
524632e5d9b1SJasvinder Singh 		return;
524732e5d9b1SJasvinder Singh 	}
524832e5d9b1SJasvinder Singh 
524932e5d9b1SJasvinder Singh 	if (parser_read_uint32(&thread_id, tokens[1]) != 0) {
525032e5d9b1SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
525132e5d9b1SJasvinder Singh 		return;
525232e5d9b1SJasvinder Singh 	}
525332e5d9b1SJasvinder Singh 
525432e5d9b1SJasvinder Singh 	if (strcmp(tokens[2], "pipeline") != 0) {
525532e5d9b1SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipeline");
525632e5d9b1SJasvinder Singh 		return;
525732e5d9b1SJasvinder Singh 	}
525832e5d9b1SJasvinder Singh 
525932e5d9b1SJasvinder Singh 	pipeline_name = tokens[3];
526032e5d9b1SJasvinder Singh 
526132e5d9b1SJasvinder Singh 	if (strcmp(tokens[4], "disable") != 0) {
526232e5d9b1SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "disable");
526332e5d9b1SJasvinder Singh 		return;
526432e5d9b1SJasvinder Singh 	}
526532e5d9b1SJasvinder Singh 
526632e5d9b1SJasvinder Singh 	status = thread_pipeline_disable(thread_id, pipeline_name);
526732e5d9b1SJasvinder Singh 	if (status) {
526832e5d9b1SJasvinder Singh 		snprintf(out, out_size, MSG_CMD_FAIL,
526932e5d9b1SJasvinder Singh 			"thread pipeline disable");
527032e5d9b1SJasvinder Singh 		return;
527132e5d9b1SJasvinder Singh 	}
527232e5d9b1SJasvinder Singh }
527332e5d9b1SJasvinder Singh 
527426b3effeSKevin Laatz static void
527526b3effeSKevin Laatz cmd_help(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
527626b3effeSKevin Laatz {
527726b3effeSKevin Laatz 	tokens++;
527826b3effeSKevin Laatz 	n_tokens--;
527926b3effeSKevin Laatz 
528026b3effeSKevin Laatz 	if (n_tokens == 0) {
528126b3effeSKevin Laatz 		snprintf(out, out_size,
528226b3effeSKevin Laatz 			"Type 'help <command>' for details on each command.\n\n"
528326b3effeSKevin Laatz 			"List of commands:\n"
528426b3effeSKevin Laatz 			"\tmempool\n"
528526b3effeSKevin Laatz 			"\tlink\n"
528626b3effeSKevin Laatz 			"\tswq\n"
528726b3effeSKevin Laatz 			"\ttmgr subport profile\n"
528826b3effeSKevin Laatz 			"\ttmgr pipe profile\n"
528926b3effeSKevin Laatz 			"\ttmgr\n"
529026b3effeSKevin Laatz 			"\ttmgr subport\n"
529126b3effeSKevin Laatz 			"\ttmgr subport pipe\n"
529226b3effeSKevin Laatz 			"\ttap\n"
529326b3effeSKevin Laatz 			"\tkni\n"
529426b3effeSKevin Laatz 			"\tport in action profile\n"
529526b3effeSKevin Laatz 			"\ttable action profile\n"
529626b3effeSKevin Laatz 			"\tpipeline\n"
529726b3effeSKevin Laatz 			"\tpipeline port in\n"
529826b3effeSKevin Laatz 			"\tpipeline port out\n"
529926b3effeSKevin Laatz 			"\tpipeline table\n"
530026b3effeSKevin Laatz 			"\tpipeline port in table\n"
530126b3effeSKevin Laatz 			"\tpipeline port in stats\n"
530226b3effeSKevin Laatz 			"\tpipeline port in enable\n"
530326b3effeSKevin Laatz 			"\tpipeline port in disable\n"
530426b3effeSKevin Laatz 			"\tpipeline port out stats\n"
530526b3effeSKevin Laatz 			"\tpipeline table stats\n"
530626b3effeSKevin Laatz 			"\tpipeline table rule add\n"
530726b3effeSKevin Laatz 			"\tpipeline table rule add default\n"
530826b3effeSKevin Laatz 			"\tpipeline table rule add bulk\n"
530926b3effeSKevin Laatz 			"\tpipeline table rule delete\n"
531026b3effeSKevin Laatz 			"\tpipeline table rule delete default\n"
531126b3effeSKevin Laatz 			"\tpipeline table rule stats read\n"
531226b3effeSKevin Laatz 			"\tpipeline table meter profile add\n"
531326b3effeSKevin Laatz 			"\tpipeline table meter profile delete\n"
531426b3effeSKevin Laatz 			"\tpipeline table rule meter read\n"
531526b3effeSKevin Laatz 			"\tpipeline table dscp\n"
531626b3effeSKevin Laatz 			"\tpipeline table rule ttl read\n"
531726b3effeSKevin Laatz 			"\tthread pipeline enable\n"
531826b3effeSKevin Laatz 			"\tthread pipeline disable\n\n");
531926b3effeSKevin Laatz 		return;
532026b3effeSKevin Laatz 	}
532126b3effeSKevin Laatz 
532226b3effeSKevin Laatz 	if (strcmp(tokens[0], "mempool") == 0) {
532326b3effeSKevin Laatz 		snprintf(out, out_size, "\n%s\n", cmd_mempool_help);
532426b3effeSKevin Laatz 		return;
532526b3effeSKevin Laatz 	}
532626b3effeSKevin Laatz 
532726b3effeSKevin Laatz 	if (strcmp(tokens[0], "link") == 0) {
532826b3effeSKevin Laatz 		snprintf(out, out_size, "\n%s\n", cmd_link_help);
532926b3effeSKevin Laatz 		return;
533026b3effeSKevin Laatz 	}
533126b3effeSKevin Laatz 
533226b3effeSKevin Laatz 	if (strcmp(tokens[0], "swq") == 0) {
533326b3effeSKevin Laatz 		snprintf(out, out_size, "\n%s\n", cmd_swq_help);
533426b3effeSKevin Laatz 		return;
533526b3effeSKevin Laatz 	}
533626b3effeSKevin Laatz 
533726b3effeSKevin Laatz 	if (strcmp(tokens[0], "tmgr") == 0) {
533826b3effeSKevin Laatz 		if (n_tokens == 1) {
533926b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n", cmd_tmgr_help);
534026b3effeSKevin Laatz 			return;
534126b3effeSKevin Laatz 		}
534226b3effeSKevin Laatz 
534326b3effeSKevin Laatz 		if ((n_tokens == 2) &&
534426b3effeSKevin Laatz 			(strcmp(tokens[1], "subport")) == 0) {
534526b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n", cmd_tmgr_subport_help);
534626b3effeSKevin Laatz 			return;
534726b3effeSKevin Laatz 		}
534826b3effeSKevin Laatz 
534926b3effeSKevin Laatz 		if ((n_tokens == 3) &&
535026b3effeSKevin Laatz 			(strcmp(tokens[1], "subport") == 0) &&
535126b3effeSKevin Laatz 			(strcmp(tokens[2], "profile") == 0)) {
535226b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
535326b3effeSKevin Laatz 				cmd_tmgr_subport_profile_help);
535426b3effeSKevin Laatz 			return;
535526b3effeSKevin Laatz 		}
535626b3effeSKevin Laatz 
535726b3effeSKevin Laatz 		if ((n_tokens == 3) &&
535826b3effeSKevin Laatz 			(strcmp(tokens[1], "subport") == 0) &&
535926b3effeSKevin Laatz 			(strcmp(tokens[2], "pipe") == 0)) {
536026b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n", cmd_tmgr_subport_pipe_help);
536126b3effeSKevin Laatz 			return;
536226b3effeSKevin Laatz 		}
536326b3effeSKevin Laatz 
536426b3effeSKevin Laatz 		if ((n_tokens == 3) &&
536526b3effeSKevin Laatz 			(strcmp(tokens[1], "pipe") == 0) &&
536626b3effeSKevin Laatz 			(strcmp(tokens[2], "profile") == 0)) {
536726b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n", cmd_tmgr_pipe_profile_help);
536826b3effeSKevin Laatz 			return;
536926b3effeSKevin Laatz 		}
537026b3effeSKevin Laatz 	}
537126b3effeSKevin Laatz 
537226b3effeSKevin Laatz 	if (strcmp(tokens[0], "tap") == 0) {
537326b3effeSKevin Laatz 		snprintf(out, out_size, "\n%s\n", cmd_tap_help);
537426b3effeSKevin Laatz 		return;
537526b3effeSKevin Laatz 	}
537626b3effeSKevin Laatz 
537726b3effeSKevin Laatz 	if (strcmp(tokens[0], "kni") == 0) {
537826b3effeSKevin Laatz 		snprintf(out, out_size, "\n%s\n", cmd_kni_help);
537926b3effeSKevin Laatz 		return;
538026b3effeSKevin Laatz 	}
538126b3effeSKevin Laatz 
53821edccebcSFan Zhang 	if (strcmp(tokens[0], "cryptodev") == 0) {
53831edccebcSFan Zhang 		snprintf(out, out_size, "\n%s\n", cmd_cryptodev_help);
53841edccebcSFan Zhang 		return;
53851edccebcSFan Zhang 	}
53861edccebcSFan Zhang 
538726b3effeSKevin Laatz 	if ((n_tokens == 4) &&
538826b3effeSKevin Laatz 		(strcmp(tokens[0], "port") == 0) &&
538926b3effeSKevin Laatz 		(strcmp(tokens[1], "in") == 0) &&
539026b3effeSKevin Laatz 		(strcmp(tokens[2], "action") == 0) &&
539126b3effeSKevin Laatz 		(strcmp(tokens[3], "profile") == 0)) {
539226b3effeSKevin Laatz 		snprintf(out, out_size, "\n%s\n", cmd_port_in_action_profile_help);
539326b3effeSKevin Laatz 		return;
539426b3effeSKevin Laatz 	}
539526b3effeSKevin Laatz 
539626b3effeSKevin Laatz 	if ((n_tokens == 3) &&
539726b3effeSKevin Laatz 		(strcmp(tokens[0], "table") == 0) &&
539826b3effeSKevin Laatz 		(strcmp(tokens[1], "action") == 0) &&
539926b3effeSKevin Laatz 		(strcmp(tokens[2], "profile") == 0)) {
540026b3effeSKevin Laatz 		snprintf(out, out_size, "\n%s\n", cmd_table_action_profile_help);
540126b3effeSKevin Laatz 		return;
540226b3effeSKevin Laatz 	}
540326b3effeSKevin Laatz 
540426b3effeSKevin Laatz 	if ((strcmp(tokens[0], "pipeline") == 0) && (n_tokens == 1)) {
540526b3effeSKevin Laatz 		snprintf(out, out_size, "\n%s\n", cmd_pipeline_help);
540626b3effeSKevin Laatz 		return;
540726b3effeSKevin Laatz 	}
540826b3effeSKevin Laatz 
540926b3effeSKevin Laatz 	if ((strcmp(tokens[0], "pipeline") == 0) &&
541026b3effeSKevin Laatz 		(strcmp(tokens[1], "port") == 0)) {
541126b3effeSKevin Laatz 		if ((n_tokens == 3) && (strcmp(tokens[2], "in")) == 0) {
541226b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n", cmd_pipeline_port_in_help);
541326b3effeSKevin Laatz 			return;
541426b3effeSKevin Laatz 		}
541526b3effeSKevin Laatz 
541626b3effeSKevin Laatz 		if ((n_tokens == 3) && (strcmp(tokens[2], "out")) == 0) {
541726b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n", cmd_pipeline_port_out_help);
541826b3effeSKevin Laatz 			return;
541926b3effeSKevin Laatz 		}
542026b3effeSKevin Laatz 
542126b3effeSKevin Laatz 		if ((n_tokens == 4) &&
542226b3effeSKevin Laatz 			(strcmp(tokens[2], "in") == 0) &&
542326b3effeSKevin Laatz 			(strcmp(tokens[3], "table") == 0)) {
542426b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
542526b3effeSKevin Laatz 				cmd_pipeline_port_in_table_help);
542626b3effeSKevin Laatz 			return;
542726b3effeSKevin Laatz 		}
542826b3effeSKevin Laatz 
542926b3effeSKevin Laatz 		if ((n_tokens == 4) &&
543026b3effeSKevin Laatz 			(strcmp(tokens[2], "in") == 0) &&
543126b3effeSKevin Laatz 			(strcmp(tokens[3], "stats") == 0)) {
543226b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
543326b3effeSKevin Laatz 				cmd_pipeline_port_in_stats_help);
543426b3effeSKevin Laatz 			return;
543526b3effeSKevin Laatz 		}
543626b3effeSKevin Laatz 
543726b3effeSKevin Laatz 		if ((n_tokens == 4) &&
543826b3effeSKevin Laatz 			(strcmp(tokens[2], "in") == 0) &&
543926b3effeSKevin Laatz 			(strcmp(tokens[3], "enable") == 0)) {
544026b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
544126b3effeSKevin Laatz 				cmd_pipeline_port_in_enable_help);
544226b3effeSKevin Laatz 			return;
544326b3effeSKevin Laatz 		}
544426b3effeSKevin Laatz 
544526b3effeSKevin Laatz 		if ((n_tokens == 4) &&
544626b3effeSKevin Laatz 			(strcmp(tokens[2], "in") == 0) &&
544726b3effeSKevin Laatz 			(strcmp(tokens[3], "disable") == 0)) {
544826b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
544926b3effeSKevin Laatz 				cmd_pipeline_port_in_disable_help);
545026b3effeSKevin Laatz 			return;
545126b3effeSKevin Laatz 		}
545226b3effeSKevin Laatz 
545326b3effeSKevin Laatz 		if ((n_tokens == 4) &&
545426b3effeSKevin Laatz 			(strcmp(tokens[2], "out") == 0) &&
545526b3effeSKevin Laatz 			(strcmp(tokens[3], "stats") == 0)) {
545626b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
545726b3effeSKevin Laatz 				cmd_pipeline_port_out_stats_help);
545826b3effeSKevin Laatz 			return;
545926b3effeSKevin Laatz 		}
546026b3effeSKevin Laatz 	}
546126b3effeSKevin Laatz 
546226b3effeSKevin Laatz 	if ((strcmp(tokens[0], "pipeline") == 0) &&
546326b3effeSKevin Laatz 		(strcmp(tokens[1], "table") == 0)) {
546426b3effeSKevin Laatz 		if (n_tokens == 2) {
546526b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n", cmd_pipeline_table_help);
546626b3effeSKevin Laatz 			return;
546726b3effeSKevin Laatz 		}
546826b3effeSKevin Laatz 
546926b3effeSKevin Laatz 		if ((n_tokens == 3) && strcmp(tokens[2], "stats") == 0) {
547026b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
547126b3effeSKevin Laatz 				cmd_pipeline_table_stats_help);
547226b3effeSKevin Laatz 			return;
547326b3effeSKevin Laatz 		}
547426b3effeSKevin Laatz 
547526b3effeSKevin Laatz 		if ((n_tokens == 3) && strcmp(tokens[2], "dscp") == 0) {
547626b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
547726b3effeSKevin Laatz 				cmd_pipeline_table_dscp_help);
547826b3effeSKevin Laatz 			return;
547926b3effeSKevin Laatz 		}
548026b3effeSKevin Laatz 
548126b3effeSKevin Laatz 		if ((n_tokens == 4) &&
548226b3effeSKevin Laatz 			(strcmp(tokens[2], "rule") == 0) &&
548326b3effeSKevin Laatz 			(strcmp(tokens[3], "add") == 0)) {
548426b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
548526b3effeSKevin Laatz 				cmd_pipeline_table_rule_add_help);
548626b3effeSKevin Laatz 			return;
548726b3effeSKevin Laatz 		}
548826b3effeSKevin Laatz 
548926b3effeSKevin Laatz 		if ((n_tokens == 5) &&
549026b3effeSKevin Laatz 			(strcmp(tokens[2], "rule") == 0) &&
549126b3effeSKevin Laatz 			(strcmp(tokens[3], "add") == 0) &&
549226b3effeSKevin Laatz 			(strcmp(tokens[4], "default") == 0)) {
549326b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
549426b3effeSKevin Laatz 				cmd_pipeline_table_rule_add_default_help);
549526b3effeSKevin Laatz 			return;
549626b3effeSKevin Laatz 		}
549726b3effeSKevin Laatz 
549826b3effeSKevin Laatz 		if ((n_tokens == 5) &&
549926b3effeSKevin Laatz 			(strcmp(tokens[2], "rule") == 0) &&
550026b3effeSKevin Laatz 			(strcmp(tokens[3], "add") == 0) &&
550126b3effeSKevin Laatz 			(strcmp(tokens[4], "bulk") == 0)) {
550226b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
550326b3effeSKevin Laatz 				cmd_pipeline_table_rule_add_bulk_help);
550426b3effeSKevin Laatz 			return;
550526b3effeSKevin Laatz 		}
550626b3effeSKevin Laatz 
550726b3effeSKevin Laatz 		if ((n_tokens == 4) &&
550826b3effeSKevin Laatz 			(strcmp(tokens[2], "rule") == 0) &&
550926b3effeSKevin Laatz 			(strcmp(tokens[3], "delete") == 0)) {
551026b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
551126b3effeSKevin Laatz 				cmd_pipeline_table_rule_delete_help);
551226b3effeSKevin Laatz 			return;
551326b3effeSKevin Laatz 		}
551426b3effeSKevin Laatz 
551526b3effeSKevin Laatz 		if ((n_tokens == 5) &&
551626b3effeSKevin Laatz 			(strcmp(tokens[2], "rule") == 0) &&
551726b3effeSKevin Laatz 			(strcmp(tokens[3], "delete") == 0) &&
551826b3effeSKevin Laatz 			(strcmp(tokens[4], "default") == 0)) {
551926b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
552026b3effeSKevin Laatz 				cmd_pipeline_table_rule_delete_default_help);
552126b3effeSKevin Laatz 			return;
552226b3effeSKevin Laatz 		}
552326b3effeSKevin Laatz 
552426b3effeSKevin Laatz 		if ((n_tokens == 5) &&
552526b3effeSKevin Laatz 			(strcmp(tokens[2], "rule") == 0) &&
552626b3effeSKevin Laatz 			(strcmp(tokens[3], "stats") == 0) &&
552726b3effeSKevin Laatz 			(strcmp(tokens[4], "read") == 0)) {
552826b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
552926b3effeSKevin Laatz 				cmd_pipeline_table_rule_stats_read_help);
553026b3effeSKevin Laatz 			return;
553126b3effeSKevin Laatz 		}
553226b3effeSKevin Laatz 
553326b3effeSKevin Laatz 		if ((n_tokens == 5) &&
553426b3effeSKevin Laatz 			(strcmp(tokens[2], "meter") == 0) &&
553526b3effeSKevin Laatz 			(strcmp(tokens[3], "profile") == 0) &&
553626b3effeSKevin Laatz 			(strcmp(tokens[4], "add") == 0)) {
553726b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
553826b3effeSKevin Laatz 				cmd_pipeline_table_meter_profile_add_help);
553926b3effeSKevin Laatz 			return;
554026b3effeSKevin Laatz 		}
554126b3effeSKevin Laatz 
554226b3effeSKevin Laatz 		if ((n_tokens == 5) &&
554326b3effeSKevin Laatz 			(strcmp(tokens[2], "meter") == 0) &&
554426b3effeSKevin Laatz 			(strcmp(tokens[3], "profile") == 0) &&
554526b3effeSKevin Laatz 			(strcmp(tokens[4], "delete") == 0)) {
554626b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
554726b3effeSKevin Laatz 				cmd_pipeline_table_meter_profile_delete_help);
554826b3effeSKevin Laatz 			return;
554926b3effeSKevin Laatz 		}
555026b3effeSKevin Laatz 
555126b3effeSKevin Laatz 		if ((n_tokens == 5) &&
555226b3effeSKevin Laatz 			(strcmp(tokens[2], "rule") == 0) &&
555326b3effeSKevin Laatz 			(strcmp(tokens[3], "meter") == 0) &&
555426b3effeSKevin Laatz 			(strcmp(tokens[4], "read") == 0)) {
555526b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
555626b3effeSKevin Laatz 				cmd_pipeline_table_rule_meter_read_help);
555726b3effeSKevin Laatz 			return;
555826b3effeSKevin Laatz 		}
555926b3effeSKevin Laatz 
556026b3effeSKevin Laatz 		if ((n_tokens == 5) &&
556126b3effeSKevin Laatz 			(strcmp(tokens[2], "rule") == 0) &&
556226b3effeSKevin Laatz 			(strcmp(tokens[3], "ttl") == 0) &&
556326b3effeSKevin Laatz 			(strcmp(tokens[4], "read") == 0)) {
556426b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
556526b3effeSKevin Laatz 				cmd_pipeline_table_rule_ttl_read_help);
556626b3effeSKevin Laatz 			return;
556726b3effeSKevin Laatz 		}
556826b3effeSKevin Laatz 	}
556926b3effeSKevin Laatz 
557026b3effeSKevin Laatz 	if ((n_tokens == 3) &&
557126b3effeSKevin Laatz 		(strcmp(tokens[0], "thread") == 0) &&
557226b3effeSKevin Laatz 		(strcmp(tokens[1], "pipeline") == 0)) {
557326b3effeSKevin Laatz 		if (strcmp(tokens[2], "enable") == 0) {
557426b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
557526b3effeSKevin Laatz 				cmd_thread_pipeline_enable_help);
557626b3effeSKevin Laatz 			return;
557726b3effeSKevin Laatz 		}
557826b3effeSKevin Laatz 
557926b3effeSKevin Laatz 		if (strcmp(tokens[2], "disable") == 0) {
558026b3effeSKevin Laatz 			snprintf(out, out_size, "\n%s\n",
558126b3effeSKevin Laatz 				cmd_thread_pipeline_disable_help);
558226b3effeSKevin Laatz 			return;
558326b3effeSKevin Laatz 		}
558426b3effeSKevin Laatz 	}
558526b3effeSKevin Laatz 
558626b3effeSKevin Laatz 	snprintf(out, out_size, "Invalid command\n");
558726b3effeSKevin Laatz }
558826b3effeSKevin Laatz 
55896bfe74f8SJasvinder Singh void
55906bfe74f8SJasvinder Singh cli_process(char *in, char *out, size_t out_size)
55916bfe74f8SJasvinder Singh {
55926bfe74f8SJasvinder Singh 	char *tokens[CMD_MAX_TOKENS];
55936bfe74f8SJasvinder Singh 	uint32_t n_tokens = RTE_DIM(tokens);
55946bfe74f8SJasvinder Singh 	int status;
55956bfe74f8SJasvinder Singh 
55964bbf8e30SJasvinder Singh 	if (is_comment(in))
55974bbf8e30SJasvinder Singh 		return;
55984bbf8e30SJasvinder Singh 
55996bfe74f8SJasvinder Singh 	status = parse_tokenize_string(in, tokens, &n_tokens);
56006bfe74f8SJasvinder Singh 	if (status) {
56016bfe74f8SJasvinder Singh 		snprintf(out, out_size, MSG_ARG_TOO_MANY, "");
56026bfe74f8SJasvinder Singh 		return;
56036bfe74f8SJasvinder Singh 	}
56046bfe74f8SJasvinder Singh 
56056bfe74f8SJasvinder Singh 	if (n_tokens == 0)
56066bfe74f8SJasvinder Singh 		return;
56076bfe74f8SJasvinder Singh 
560826b3effeSKevin Laatz 	if (strcmp(tokens[0], "help") == 0) {
560926b3effeSKevin Laatz 		cmd_help(tokens, n_tokens, out, out_size);
561026b3effeSKevin Laatz 		return;
561126b3effeSKevin Laatz 	}
561226b3effeSKevin Laatz 
56136bfe74f8SJasvinder Singh 	if (strcmp(tokens[0], "mempool") == 0) {
56146bfe74f8SJasvinder Singh 		cmd_mempool(tokens, n_tokens, out, out_size);
56156bfe74f8SJasvinder Singh 		return;
56166bfe74f8SJasvinder Singh 	}
56176bfe74f8SJasvinder Singh 
5618133c2c65SJasvinder Singh 	if (strcmp(tokens[0], "link") == 0) {
5619ecfc2b1cSKevin Laatz 		if (strcmp(tokens[1], "show") == 0) {
5620ecfc2b1cSKevin Laatz 			cmd_link_show(tokens, n_tokens, out, out_size);
5621ecfc2b1cSKevin Laatz 			return;
5622ecfc2b1cSKevin Laatz 		}
5623ecfc2b1cSKevin Laatz 
5624133c2c65SJasvinder Singh 		cmd_link(tokens, n_tokens, out, out_size);
5625133c2c65SJasvinder Singh 		return;
5626133c2c65SJasvinder Singh 	}
5627133c2c65SJasvinder Singh 
56288245472cSJasvinder Singh 	if (strcmp(tokens[0], "swq") == 0) {
56298245472cSJasvinder Singh 		cmd_swq(tokens, n_tokens, out, out_size);
56308245472cSJasvinder Singh 		return;
56318245472cSJasvinder Singh 	}
56328245472cSJasvinder Singh 
563325961ff3SJasvinder Singh 	if (strcmp(tokens[0], "tmgr") == 0) {
563425961ff3SJasvinder Singh 		if ((n_tokens >= 3) &&
563525961ff3SJasvinder Singh 			(strcmp(tokens[1], "subport") == 0) &&
563625961ff3SJasvinder Singh 			(strcmp(tokens[2], "profile") == 0)) {
563725961ff3SJasvinder Singh 			cmd_tmgr_subport_profile(tokens, n_tokens,
563825961ff3SJasvinder Singh 				out, out_size);
563925961ff3SJasvinder Singh 			return;
564025961ff3SJasvinder Singh 		}
564125961ff3SJasvinder Singh 
564225961ff3SJasvinder Singh 		if ((n_tokens >= 3) &&
564325961ff3SJasvinder Singh 			(strcmp(tokens[1], "pipe") == 0) &&
564425961ff3SJasvinder Singh 			(strcmp(tokens[2], "profile") == 0)) {
564525961ff3SJasvinder Singh 			cmd_tmgr_pipe_profile(tokens, n_tokens, out, out_size);
564625961ff3SJasvinder Singh 			return;
564725961ff3SJasvinder Singh 		}
564825961ff3SJasvinder Singh 
564925961ff3SJasvinder Singh 		if ((n_tokens >= 5) &&
565025961ff3SJasvinder Singh 			(strcmp(tokens[2], "subport") == 0) &&
565125961ff3SJasvinder Singh 			(strcmp(tokens[4], "profile") == 0)) {
565225961ff3SJasvinder Singh 			cmd_tmgr_subport(tokens, n_tokens, out, out_size);
565325961ff3SJasvinder Singh 			return;
565425961ff3SJasvinder Singh 		}
565525961ff3SJasvinder Singh 
565625961ff3SJasvinder Singh 		if ((n_tokens >= 5) &&
565725961ff3SJasvinder Singh 			(strcmp(tokens[2], "subport") == 0) &&
565825961ff3SJasvinder Singh 			(strcmp(tokens[4], "pipe") == 0)) {
565925961ff3SJasvinder Singh 			cmd_tmgr_subport_pipe(tokens, n_tokens, out, out_size);
566025961ff3SJasvinder Singh 			return;
566125961ff3SJasvinder Singh 		}
566225961ff3SJasvinder Singh 
566325961ff3SJasvinder Singh 		cmd_tmgr(tokens, n_tokens, out, out_size);
566425961ff3SJasvinder Singh 		return;
566525961ff3SJasvinder Singh 	}
566625961ff3SJasvinder Singh 
56672f74ae28SJasvinder Singh 	if (strcmp(tokens[0], "tap") == 0) {
56682f74ae28SJasvinder Singh 		cmd_tap(tokens, n_tokens, out, out_size);
56692f74ae28SJasvinder Singh 		return;
56702f74ae28SJasvinder Singh 	}
56712f74ae28SJasvinder Singh 
56729a408cc8SJasvinder Singh 	if (strcmp(tokens[0], "kni") == 0) {
56739a408cc8SJasvinder Singh 		cmd_kni(tokens, n_tokens, out, out_size);
56749a408cc8SJasvinder Singh 		return;
56759a408cc8SJasvinder Singh 	}
56769a408cc8SJasvinder Singh 
56771edccebcSFan Zhang 	if (strcmp(tokens[0], "cryptodev") == 0) {
56781edccebcSFan Zhang 		cmd_cryptodev(tokens, n_tokens, out, out_size);
56791edccebcSFan Zhang 		return;
56801edccebcSFan Zhang 	}
56811edccebcSFan Zhang 
568271937434SJasvinder Singh 	if (strcmp(tokens[0], "port") == 0) {
568371937434SJasvinder Singh 		cmd_port_in_action_profile(tokens, n_tokens, out, out_size);
568471937434SJasvinder Singh 		return;
568571937434SJasvinder Singh 	}
568671937434SJasvinder Singh 
568771937434SJasvinder Singh 	if (strcmp(tokens[0], "table") == 0) {
568871937434SJasvinder Singh 		cmd_table_action_profile(tokens, n_tokens, out, out_size);
568971937434SJasvinder Singh 		return;
569071937434SJasvinder Singh 	}
569171937434SJasvinder Singh 
5692d75c371eSJasvinder Singh 	if (strcmp(tokens[0], "pipeline") == 0) {
5693d75c371eSJasvinder Singh 		if ((n_tokens >= 3) &&
5694d75c371eSJasvinder Singh 			(strcmp(tokens[2], "period") == 0)) {
5695d75c371eSJasvinder Singh 			cmd_pipeline(tokens, n_tokens, out, out_size);
5696d75c371eSJasvinder Singh 			return;
5697d75c371eSJasvinder Singh 		}
5698d75c371eSJasvinder Singh 
5699d75c371eSJasvinder Singh 		if ((n_tokens >= 5) &&
5700d75c371eSJasvinder Singh 			(strcmp(tokens[2], "port") == 0) &&
5701d75c371eSJasvinder Singh 			(strcmp(tokens[3], "in") == 0) &&
5702d75c371eSJasvinder Singh 			(strcmp(tokens[4], "bsz") == 0)) {
5703d75c371eSJasvinder Singh 			cmd_pipeline_port_in(tokens, n_tokens, out, out_size);
5704d75c371eSJasvinder Singh 			return;
5705d75c371eSJasvinder Singh 		}
5706d75c371eSJasvinder Singh 
5707d75c371eSJasvinder Singh 		if ((n_tokens >= 5) &&
5708d75c371eSJasvinder Singh 			(strcmp(tokens[2], "port") == 0) &&
5709d75c371eSJasvinder Singh 			(strcmp(tokens[3], "out") == 0) &&
5710d75c371eSJasvinder Singh 			(strcmp(tokens[4], "bsz") == 0)) {
5711d75c371eSJasvinder Singh 			cmd_pipeline_port_out(tokens, n_tokens, out, out_size);
5712d75c371eSJasvinder Singh 			return;
5713d75c371eSJasvinder Singh 		}
5714d75c371eSJasvinder Singh 
5715d75c371eSJasvinder Singh 		if ((n_tokens >= 4) &&
5716d75c371eSJasvinder Singh 			(strcmp(tokens[2], "table") == 0) &&
5717d75c371eSJasvinder Singh 			(strcmp(tokens[3], "match") == 0)) {
5718d75c371eSJasvinder Singh 			cmd_pipeline_table(tokens, n_tokens, out, out_size);
5719d75c371eSJasvinder Singh 			return;
5720d75c371eSJasvinder Singh 		}
5721d75c371eSJasvinder Singh 
5722d75c371eSJasvinder Singh 		if ((n_tokens >= 6) &&
5723d75c371eSJasvinder Singh 			(strcmp(tokens[2], "port") == 0) &&
5724d75c371eSJasvinder Singh 			(strcmp(tokens[3], "in") == 0) &&
5725d75c371eSJasvinder Singh 			(strcmp(tokens[5], "table") == 0)) {
5726d75c371eSJasvinder Singh 			cmd_pipeline_port_in_table(tokens, n_tokens,
5727d75c371eSJasvinder Singh 				out, out_size);
5728d75c371eSJasvinder Singh 			return;
5729d75c371eSJasvinder Singh 		}
57306b1b3c3cSJasvinder Singh 
57316b1b3c3cSJasvinder Singh 		if ((n_tokens >= 6) &&
57326b1b3c3cSJasvinder Singh 			(strcmp(tokens[2], "port") == 0) &&
57336b1b3c3cSJasvinder Singh 			(strcmp(tokens[3], "in") == 0) &&
573450e73d05SJasvinder Singh 			(strcmp(tokens[5], "stats") == 0)) {
573550e73d05SJasvinder Singh 			cmd_pipeline_port_in_stats(tokens, n_tokens,
573650e73d05SJasvinder Singh 				out, out_size);
573750e73d05SJasvinder Singh 			return;
573850e73d05SJasvinder Singh 		}
573950e73d05SJasvinder Singh 
574050e73d05SJasvinder Singh 		if ((n_tokens >= 6) &&
574150e73d05SJasvinder Singh 			(strcmp(tokens[2], "port") == 0) &&
574250e73d05SJasvinder Singh 			(strcmp(tokens[3], "in") == 0) &&
57436b1b3c3cSJasvinder Singh 			(strcmp(tokens[5], "enable") == 0)) {
57446b1b3c3cSJasvinder Singh 			cmd_pipeline_port_in_enable(tokens, n_tokens,
57456b1b3c3cSJasvinder Singh 				out, out_size);
57466b1b3c3cSJasvinder Singh 			return;
57476b1b3c3cSJasvinder Singh 		}
57486b1b3c3cSJasvinder Singh 
57496b1b3c3cSJasvinder Singh 		if ((n_tokens >= 6) &&
57506b1b3c3cSJasvinder Singh 			(strcmp(tokens[2], "port") == 0) &&
57516b1b3c3cSJasvinder Singh 			(strcmp(tokens[3], "in") == 0) &&
57526b1b3c3cSJasvinder Singh 			(strcmp(tokens[5], "disable") == 0)) {
57536b1b3c3cSJasvinder Singh 			cmd_pipeline_port_in_disable(tokens, n_tokens,
57546b1b3c3cSJasvinder Singh 				out, out_size);
57556b1b3c3cSJasvinder Singh 			return;
57566b1b3c3cSJasvinder Singh 		}
575750e73d05SJasvinder Singh 
575850e73d05SJasvinder Singh 		if ((n_tokens >= 6) &&
575950e73d05SJasvinder Singh 			(strcmp(tokens[2], "port") == 0) &&
576050e73d05SJasvinder Singh 			(strcmp(tokens[3], "out") == 0) &&
576150e73d05SJasvinder Singh 			(strcmp(tokens[5], "stats") == 0)) {
576250e73d05SJasvinder Singh 			cmd_pipeline_port_out_stats(tokens, n_tokens,
576350e73d05SJasvinder Singh 				out, out_size);
576450e73d05SJasvinder Singh 			return;
576550e73d05SJasvinder Singh 		}
576650e73d05SJasvinder Singh 
576750e73d05SJasvinder Singh 		if ((n_tokens >= 5) &&
576850e73d05SJasvinder Singh 			(strcmp(tokens[2], "table") == 0) &&
576950e73d05SJasvinder Singh 			(strcmp(tokens[4], "stats") == 0)) {
577050e73d05SJasvinder Singh 			cmd_pipeline_table_stats(tokens, n_tokens,
577150e73d05SJasvinder Singh 				out, out_size);
577250e73d05SJasvinder Singh 			return;
577350e73d05SJasvinder Singh 		}
5774a3a95b7dSJasvinder Singh 
5775a3a95b7dSJasvinder Singh 		if ((n_tokens >= 7) &&
5776a3a95b7dSJasvinder Singh 			(strcmp(tokens[2], "table") == 0) &&
5777a3a95b7dSJasvinder Singh 			(strcmp(tokens[4], "rule") == 0) &&
5778a3a95b7dSJasvinder Singh 			(strcmp(tokens[5], "add") == 0) &&
5779a3a95b7dSJasvinder Singh 			(strcmp(tokens[6], "match") == 0)) {
5780a3a95b7dSJasvinder Singh 			if ((n_tokens >= 8) &&
5781a3a95b7dSJasvinder Singh 				(strcmp(tokens[7], "default") == 0)) {
5782a3a95b7dSJasvinder Singh 				cmd_pipeline_table_rule_add_default(tokens,
5783a3a95b7dSJasvinder Singh 					n_tokens, out, out_size);
5784a3a95b7dSJasvinder Singh 				return;
5785a3a95b7dSJasvinder Singh 			}
5786a3a95b7dSJasvinder Singh 
5787a3a95b7dSJasvinder Singh 			cmd_pipeline_table_rule_add(tokens, n_tokens,
5788a3a95b7dSJasvinder Singh 				out, out_size);
5789a3a95b7dSJasvinder Singh 			return;
5790a3a95b7dSJasvinder Singh 		}
5791f634e4c5SJasvinder Singh 
5792f634e4c5SJasvinder Singh 		if ((n_tokens >= 7) &&
5793f634e4c5SJasvinder Singh 			(strcmp(tokens[2], "table") == 0) &&
5794f634e4c5SJasvinder Singh 			(strcmp(tokens[4], "rule") == 0) &&
57953186282fSJasvinder Singh 			(strcmp(tokens[5], "add") == 0) &&
57963186282fSJasvinder Singh 			(strcmp(tokens[6], "bulk") == 0)) {
57973186282fSJasvinder Singh 			cmd_pipeline_table_rule_add_bulk(tokens,
57983186282fSJasvinder Singh 				n_tokens, out, out_size);
57993186282fSJasvinder Singh 			return;
58003186282fSJasvinder Singh 		}
58013186282fSJasvinder Singh 
58023186282fSJasvinder Singh 		if ((n_tokens >= 7) &&
58033186282fSJasvinder Singh 			(strcmp(tokens[2], "table") == 0) &&
58043186282fSJasvinder Singh 			(strcmp(tokens[4], "rule") == 0) &&
5805f634e4c5SJasvinder Singh 			(strcmp(tokens[5], "delete") == 0) &&
5806f634e4c5SJasvinder Singh 			(strcmp(tokens[6], "match") == 0)) {
5807f634e4c5SJasvinder Singh 			if ((n_tokens >= 8) &&
5808f634e4c5SJasvinder Singh 				(strcmp(tokens[7], "default") == 0)) {
5809f634e4c5SJasvinder Singh 				cmd_pipeline_table_rule_delete_default(tokens,
5810f634e4c5SJasvinder Singh 					n_tokens, out, out_size);
5811f634e4c5SJasvinder Singh 				return;
5812f634e4c5SJasvinder Singh 				}
5813f634e4c5SJasvinder Singh 
5814f634e4c5SJasvinder Singh 			cmd_pipeline_table_rule_delete(tokens, n_tokens,
5815f634e4c5SJasvinder Singh 				out, out_size);
5816f634e4c5SJasvinder Singh 			return;
5817f634e4c5SJasvinder Singh 		}
5818c64b9121SJasvinder Singh 
5819c64b9121SJasvinder Singh 		if ((n_tokens >= 7) &&
5820c64b9121SJasvinder Singh 			(strcmp(tokens[2], "table") == 0) &&
5821c64b9121SJasvinder Singh 			(strcmp(tokens[4], "rule") == 0) &&
5822c64b9121SJasvinder Singh 			(strcmp(tokens[5], "read") == 0) &&
5823c64b9121SJasvinder Singh 			(strcmp(tokens[6], "stats") == 0)) {
5824c64b9121SJasvinder Singh 			cmd_pipeline_table_rule_stats_read(tokens, n_tokens,
5825c64b9121SJasvinder Singh 				out, out_size);
5826c64b9121SJasvinder Singh 			return;
5827c64b9121SJasvinder Singh 		}
58287e11393eSJasvinder Singh 
58297e11393eSJasvinder Singh 		if ((n_tokens >= 8) &&
58307e11393eSJasvinder Singh 			(strcmp(tokens[2], "table") == 0) &&
58317e11393eSJasvinder Singh 			(strcmp(tokens[4], "meter") == 0) &&
58327e11393eSJasvinder Singh 			(strcmp(tokens[5], "profile") == 0) &&
58337e11393eSJasvinder Singh 			(strcmp(tokens[7], "add") == 0)) {
58347e11393eSJasvinder Singh 			cmd_pipeline_table_meter_profile_add(tokens, n_tokens,
58357e11393eSJasvinder Singh 				out, out_size);
58367e11393eSJasvinder Singh 			return;
58377e11393eSJasvinder Singh 		}
58387e11393eSJasvinder Singh 
58397e11393eSJasvinder Singh 		if ((n_tokens >= 8) &&
58407e11393eSJasvinder Singh 			(strcmp(tokens[2], "table") == 0) &&
58417e11393eSJasvinder Singh 			(strcmp(tokens[4], "meter") == 0) &&
58427e11393eSJasvinder Singh 			(strcmp(tokens[5], "profile") == 0) &&
58437e11393eSJasvinder Singh 			(strcmp(tokens[7], "delete") == 0)) {
58447e11393eSJasvinder Singh 			cmd_pipeline_table_meter_profile_delete(tokens,
58457e11393eSJasvinder Singh 				n_tokens, out, out_size);
58467e11393eSJasvinder Singh 			return;
58477e11393eSJasvinder Singh 		}
5848e92058d6SJasvinder Singh 
5849e92058d6SJasvinder Singh 		if ((n_tokens >= 7) &&
5850e92058d6SJasvinder Singh 			(strcmp(tokens[2], "table") == 0) &&
5851e92058d6SJasvinder Singh 			(strcmp(tokens[4], "rule") == 0) &&
5852e92058d6SJasvinder Singh 			(strcmp(tokens[5], "read") == 0) &&
5853e92058d6SJasvinder Singh 			(strcmp(tokens[6], "meter") == 0)) {
5854e92058d6SJasvinder Singh 			cmd_pipeline_table_rule_meter_read(tokens, n_tokens,
5855e92058d6SJasvinder Singh 				out, out_size);
5856e92058d6SJasvinder Singh 			return;
5857e92058d6SJasvinder Singh 		}
58582b82ef48SJasvinder Singh 
58592b82ef48SJasvinder Singh 		if ((n_tokens >= 5) &&
58602b82ef48SJasvinder Singh 			(strcmp(tokens[2], "table") == 0) &&
58612b82ef48SJasvinder Singh 			(strcmp(tokens[4], "dscp") == 0)) {
58622b82ef48SJasvinder Singh 			cmd_pipeline_table_dscp(tokens, n_tokens,
58632b82ef48SJasvinder Singh 				out, out_size);
58642b82ef48SJasvinder Singh 			return;
58652b82ef48SJasvinder Singh 		}
5866d0d306c7SJasvinder Singh 
5867d0d306c7SJasvinder Singh 		if ((n_tokens >= 7) &&
5868d0d306c7SJasvinder Singh 			(strcmp(tokens[2], "table") == 0) &&
5869d0d306c7SJasvinder Singh 			(strcmp(tokens[4], "rule") == 0) &&
5870d0d306c7SJasvinder Singh 			(strcmp(tokens[5], "read") == 0) &&
5871d0d306c7SJasvinder Singh 			(strcmp(tokens[6], "ttl") == 0)) {
5872d0d306c7SJasvinder Singh 			cmd_pipeline_table_rule_ttl_read(tokens, n_tokens,
5873d0d306c7SJasvinder Singh 				out, out_size);
5874d0d306c7SJasvinder Singh 			return;
5875d0d306c7SJasvinder Singh 		}
5876d75c371eSJasvinder Singh 	}
5877d75c371eSJasvinder Singh 
587832e5d9b1SJasvinder Singh 	if (strcmp(tokens[0], "thread") == 0) {
587932e5d9b1SJasvinder Singh 		if ((n_tokens >= 5) &&
588032e5d9b1SJasvinder Singh 			(strcmp(tokens[4], "enable") == 0)) {
588132e5d9b1SJasvinder Singh 			cmd_thread_pipeline_enable(tokens, n_tokens,
588232e5d9b1SJasvinder Singh 				out, out_size);
588332e5d9b1SJasvinder Singh 			return;
588432e5d9b1SJasvinder Singh 		}
588532e5d9b1SJasvinder Singh 
588632e5d9b1SJasvinder Singh 		if ((n_tokens >= 5) &&
588732e5d9b1SJasvinder Singh 			(strcmp(tokens[4], "disable") == 0)) {
588832e5d9b1SJasvinder Singh 			cmd_thread_pipeline_disable(tokens, n_tokens,
588932e5d9b1SJasvinder Singh 				out, out_size);
589032e5d9b1SJasvinder Singh 			return;
589132e5d9b1SJasvinder Singh 		}
589232e5d9b1SJasvinder Singh 	}
589332e5d9b1SJasvinder Singh 
58946bfe74f8SJasvinder Singh 	snprintf(out, out_size, MSG_CMD_UNKNOWN, tokens[0]);
58954bbf8e30SJasvinder Singh }
58964bbf8e30SJasvinder Singh 
58974bbf8e30SJasvinder Singh int
58984bbf8e30SJasvinder Singh cli_script_process(const char *file_name,
58994bbf8e30SJasvinder Singh 	size_t msg_in_len_max,
59004bbf8e30SJasvinder Singh 	size_t msg_out_len_max)
59014bbf8e30SJasvinder Singh {
59024bbf8e30SJasvinder Singh 	char *msg_in = NULL, *msg_out = NULL;
59034bbf8e30SJasvinder Singh 	FILE *f = NULL;
59044bbf8e30SJasvinder Singh 
59054bbf8e30SJasvinder Singh 	/* Check input arguments */
59064bbf8e30SJasvinder Singh 	if ((file_name == NULL) ||
59074bbf8e30SJasvinder Singh 		(strlen(file_name) == 0) ||
59084bbf8e30SJasvinder Singh 		(msg_in_len_max == 0) ||
59094bbf8e30SJasvinder Singh 		(msg_out_len_max == 0))
59104bbf8e30SJasvinder Singh 		return -EINVAL;
59114bbf8e30SJasvinder Singh 
59124bbf8e30SJasvinder Singh 	msg_in = malloc(msg_in_len_max + 1);
59134bbf8e30SJasvinder Singh 	msg_out = malloc(msg_out_len_max + 1);
59144bbf8e30SJasvinder Singh 	if ((msg_in == NULL) ||
59154bbf8e30SJasvinder Singh 		(msg_out == NULL)) {
59164bbf8e30SJasvinder Singh 		free(msg_out);
59174bbf8e30SJasvinder Singh 		free(msg_in);
59184bbf8e30SJasvinder Singh 		return -ENOMEM;
59194bbf8e30SJasvinder Singh 	}
59204bbf8e30SJasvinder Singh 
59214bbf8e30SJasvinder Singh 	/* Open input file */
59224bbf8e30SJasvinder Singh 	f = fopen(file_name, "r");
59234bbf8e30SJasvinder Singh 	if (f == NULL) {
59244bbf8e30SJasvinder Singh 		free(msg_out);
59254bbf8e30SJasvinder Singh 		free(msg_in);
59264bbf8e30SJasvinder Singh 		return -EIO;
59274bbf8e30SJasvinder Singh 	}
59284bbf8e30SJasvinder Singh 
59294bbf8e30SJasvinder Singh 	/* Read file */
59304bbf8e30SJasvinder Singh 	for ( ; ; ) {
59314bbf8e30SJasvinder Singh 		if (fgets(msg_in, msg_in_len_max + 1, f) == NULL)
59324bbf8e30SJasvinder Singh 			break;
59334bbf8e30SJasvinder Singh 
59344bbf8e30SJasvinder Singh 		printf("%s", msg_in);
59354bbf8e30SJasvinder Singh 		msg_out[0] = 0;
59364bbf8e30SJasvinder Singh 
59374bbf8e30SJasvinder Singh 		cli_process(msg_in,
59384bbf8e30SJasvinder Singh 			msg_out,
59394bbf8e30SJasvinder Singh 			msg_out_len_max);
59404bbf8e30SJasvinder Singh 
59414bbf8e30SJasvinder Singh 		if (strlen(msg_out))
59424bbf8e30SJasvinder Singh 			printf("%s", msg_out);
59434bbf8e30SJasvinder Singh 	}
59444bbf8e30SJasvinder Singh 
59454bbf8e30SJasvinder Singh 	/* Close file */
59464bbf8e30SJasvinder Singh 	fclose(f);
59474bbf8e30SJasvinder Singh 	free(msg_out);
59484bbf8e30SJasvinder Singh 	free(msg_in);
59494bbf8e30SJasvinder Singh 	return 0;
59504bbf8e30SJasvinder Singh }
59513186282fSJasvinder Singh 
59523186282fSJasvinder Singh static int
59533186282fSJasvinder Singh cli_rule_file_process(const char *file_name,
59543186282fSJasvinder Singh 	size_t line_len_max,
59553186282fSJasvinder Singh 	struct table_rule_match *m,
59563186282fSJasvinder Singh 	struct table_rule_action *a,
59573186282fSJasvinder Singh 	uint32_t *n_rules,
59583186282fSJasvinder Singh 	uint32_t *line_number,
59593186282fSJasvinder Singh 	char *out,
59603186282fSJasvinder Singh 	size_t out_size)
59613186282fSJasvinder Singh {
59623186282fSJasvinder Singh 	FILE *f = NULL;
59633186282fSJasvinder Singh 	char *line = NULL;
59643186282fSJasvinder Singh 	uint32_t rule_id, line_id;
59653186282fSJasvinder Singh 	int status = 0;
59663186282fSJasvinder Singh 
59673186282fSJasvinder Singh 	/* Check input arguments */
59683186282fSJasvinder Singh 	if ((file_name == NULL) ||
59693186282fSJasvinder Singh 		(strlen(file_name) == 0) ||
59703186282fSJasvinder Singh 		(line_len_max == 0)) {
59713186282fSJasvinder Singh 		*line_number = 0;
59723186282fSJasvinder Singh 		return -EINVAL;
59733186282fSJasvinder Singh 	}
59743186282fSJasvinder Singh 
59753186282fSJasvinder Singh 	/* Memory allocation */
59763186282fSJasvinder Singh 	line = malloc(line_len_max + 1);
59773186282fSJasvinder Singh 	if (line == NULL) {
59783186282fSJasvinder Singh 		*line_number = 0;
59793186282fSJasvinder Singh 		return -ENOMEM;
59803186282fSJasvinder Singh 	}
59813186282fSJasvinder Singh 
59823186282fSJasvinder Singh 	/* Open file */
59833186282fSJasvinder Singh 	f = fopen(file_name, "r");
59843186282fSJasvinder Singh 	if (f == NULL) {
59853186282fSJasvinder Singh 		*line_number = 0;
59863186282fSJasvinder Singh 		free(line);
59873186282fSJasvinder Singh 		return -EIO;
59883186282fSJasvinder Singh 	}
59893186282fSJasvinder Singh 
59903186282fSJasvinder Singh 	/* Read file */
59913186282fSJasvinder Singh 	for (line_id = 1, rule_id = 0; rule_id < *n_rules; line_id++) {
59923186282fSJasvinder Singh 		char *tokens[CMD_MAX_TOKENS];
59933186282fSJasvinder Singh 		uint32_t n_tokens, n_tokens_parsed, t0;
59943186282fSJasvinder Singh 
59953186282fSJasvinder Singh 		/* Read next line from file. */
59963186282fSJasvinder Singh 		if (fgets(line, line_len_max + 1, f) == NULL)
59973186282fSJasvinder Singh 			break;
59983186282fSJasvinder Singh 
59993186282fSJasvinder Singh 		/* Comment. */
60003186282fSJasvinder Singh 		if (is_comment(line))
60013186282fSJasvinder Singh 			continue;
60023186282fSJasvinder Singh 
60033186282fSJasvinder Singh 		/* Parse line. */
60043186282fSJasvinder Singh 		n_tokens = RTE_DIM(tokens);
60053186282fSJasvinder Singh 		status = parse_tokenize_string(line, tokens, &n_tokens);
60063186282fSJasvinder Singh 		if (status) {
60073186282fSJasvinder Singh 			status = -EINVAL;
60083186282fSJasvinder Singh 			break;
60093186282fSJasvinder Singh 		}
60103186282fSJasvinder Singh 
60113186282fSJasvinder Singh 		/* Empty line. */
60123186282fSJasvinder Singh 		if (n_tokens == 0)
60133186282fSJasvinder Singh 			continue;
60143186282fSJasvinder Singh 		t0 = 0;
60153186282fSJasvinder Singh 
60163186282fSJasvinder Singh 		/* Rule match. */
60173186282fSJasvinder Singh 		n_tokens_parsed = parse_match(tokens + t0,
60183186282fSJasvinder Singh 			n_tokens - t0,
60193186282fSJasvinder Singh 			out,
60203186282fSJasvinder Singh 			out_size,
60213186282fSJasvinder Singh 			&m[rule_id]);
60223186282fSJasvinder Singh 		if (n_tokens_parsed == 0) {
60233186282fSJasvinder Singh 			status = -EINVAL;
60243186282fSJasvinder Singh 			break;
60253186282fSJasvinder Singh 		}
60263186282fSJasvinder Singh 		t0 += n_tokens_parsed;
60273186282fSJasvinder Singh 
60283186282fSJasvinder Singh 		/* Rule action. */
60293186282fSJasvinder Singh 		n_tokens_parsed = parse_table_action(tokens + t0,
60303186282fSJasvinder Singh 			n_tokens - t0,
60313186282fSJasvinder Singh 			out,
60323186282fSJasvinder Singh 			out_size,
60333186282fSJasvinder Singh 			&a[rule_id]);
60343186282fSJasvinder Singh 		if (n_tokens_parsed == 0) {
60353186282fSJasvinder Singh 			status = -EINVAL;
60363186282fSJasvinder Singh 			break;
60373186282fSJasvinder Singh 		}
60383186282fSJasvinder Singh 		t0 += n_tokens_parsed;
60393186282fSJasvinder Singh 
60403186282fSJasvinder Singh 		/* Line completed. */
60413186282fSJasvinder Singh 		if (t0 < n_tokens) {
60423186282fSJasvinder Singh 			status = -EINVAL;
60433186282fSJasvinder Singh 			break;
60443186282fSJasvinder Singh 		}
60453186282fSJasvinder Singh 
60463186282fSJasvinder Singh 		/* Increment rule count */
60473186282fSJasvinder Singh 		rule_id++;
60483186282fSJasvinder Singh 	}
60493186282fSJasvinder Singh 
60503186282fSJasvinder Singh 	/* Close file */
60513186282fSJasvinder Singh 	fclose(f);
60523186282fSJasvinder Singh 
60533186282fSJasvinder Singh 	/* Memory free */
60543186282fSJasvinder Singh 	free(line);
60553186282fSJasvinder Singh 
60563186282fSJasvinder Singh 	*n_rules = rule_id;
60573186282fSJasvinder Singh 	*line_number = line_id;
60583186282fSJasvinder Singh 	return status;
60593186282fSJasvinder Singh }
6060