1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2018 Intel Corporation
10 #include <rte_common.h>
11 #include <rte_cycles.h>
24 #ifndef CMD_MAX_TOKENS
25 #define CMD_MAX_TOKENS 256
28 #define MSG_OUT_OF_MEMORY "Not enough memory.\n"
29 #define MSG_CMD_UNKNOWN "Unknown command \"%s\".\n"
30 #define MSG_CMD_UNIMPLEM "Command \"%s\" not implemented.\n"
31 #define MSG_ARG_NOT_ENOUGH "Not enough arguments for command \"%s\".\n"
32 #define MSG_ARG_TOO_MANY "Too many arguments for command \"%s\".\n"
33 #define MSG_ARG_MISMATCH "Wrong number of arguments for command \"%s\".\n"
34 #define MSG_ARG_NOT_FOUND "Argument \"%s\" not found.\n"
35 #define MSG_ARG_INVALID "Invalid value for argument \"%s\".\n"
36 #define MSG_FILE_ERR "Error in file \"%s\" at line %u.\n"
37 #define MSG_FILE_NOT_ENOUGH "Not enough rules in file \"%s\".\n"
38 #define MSG_CMD_FAIL "Command \"%s\" failed.\n"
43 if ((strlen(in) && index("!#%;", in[0])) ||
44 (strncmp(in, "//", 2) == 0) ||
45 (strncmp(in, "--", 2) == 0))
52 * mempool <mempool_name>
53 * buffer <buffer_size>
59 cmd_mempool(char **tokens,
64 struct mempool_params p;
66 struct mempool *mempool;
69 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
75 if (strcmp(tokens[2], "buffer") != 0) {
76 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "buffer");
80 if (parser_read_uint32(&p.buffer_size, tokens[3]) != 0) {
81 snprintf(out, out_size, MSG_ARG_INVALID, "buffer_size");
85 if (strcmp(tokens[4], "pool") != 0) {
86 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pool");
90 if (parser_read_uint32(&p.pool_size, tokens[5]) != 0) {
91 snprintf(out, out_size, MSG_ARG_INVALID, "pool_size");
95 if (strcmp(tokens[6], "cache") != 0) {
96 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cache");
100 if (parser_read_uint32(&p.cache_size, tokens[7]) != 0) {
101 snprintf(out, out_size, MSG_ARG_INVALID, "cache_size");
105 if (strcmp(tokens[8], "cpu") != 0) {
106 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
110 if (parser_read_uint32(&p.cpu_id, tokens[9]) != 0) {
111 snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
115 mempool = mempool_create(name, &p);
116 if (mempool == NULL) {
117 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
124 * dev <device_name> | port <port_id>
125 * rxq <n_queues> <queue_size> <mempool_name>
126 * txq <n_queues> <queue_size>
127 * promiscuous on | off
128 * [rss <qid_0> ... <qid_n>]
131 cmd_link(char **tokens,
136 struct link_params p;
137 struct link_params_rss rss;
141 memset(&p, 0, sizeof(p));
143 if ((n_tokens < 13) || (n_tokens > 14 + LINK_RXQ_RSS_MAX)) {
144 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
149 if (strcmp(tokens[2], "dev") == 0)
150 p.dev_name = tokens[3];
151 else if (strcmp(tokens[2], "port") == 0) {
154 if (parser_read_uint16(&p.port_id, tokens[3]) != 0) {
155 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
159 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "dev or port");
163 if (strcmp(tokens[4], "rxq") != 0) {
164 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rxq");
168 if (parser_read_uint32(&p.rx.n_queues, tokens[5]) != 0) {
169 snprintf(out, out_size, MSG_ARG_INVALID, "n_queues");
172 if (parser_read_uint32(&p.rx.queue_size, tokens[6]) != 0) {
173 snprintf(out, out_size, MSG_ARG_INVALID, "queue_size");
177 p.rx.mempool_name = tokens[7];
179 if (strcmp(tokens[8], "txq") != 0) {
180 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "txq");
184 if (parser_read_uint32(&p.tx.n_queues, tokens[9]) != 0) {
185 snprintf(out, out_size, MSG_ARG_INVALID, "n_queues");
189 if (parser_read_uint32(&p.tx.queue_size, tokens[10]) != 0) {
190 snprintf(out, out_size, MSG_ARG_INVALID, "queue_size");
194 if (strcmp(tokens[11], "promiscuous") != 0) {
195 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "promiscuous");
199 if (strcmp(tokens[12], "on") == 0)
201 else if (strcmp(tokens[12], "off") == 0)
204 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "on or off");
211 uint32_t queue_id, i;
213 if (strcmp(tokens[13], "rss") != 0) {
214 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rss");
221 for (i = 14; i < n_tokens; i++) {
222 if (parser_read_uint32(&queue_id, tokens[i]) != 0) {
223 snprintf(out, out_size, MSG_ARG_INVALID,
228 rss.queue_id[rss.n_queues] = queue_id;
233 link = link_create(name, &p);
235 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
246 cmd_swq(char **tokens,
256 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
262 if (strcmp(tokens[2], "size") != 0) {
263 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
267 if (parser_read_uint32(&p.size, tokens[3]) != 0) {
268 snprintf(out, out_size, MSG_ARG_INVALID, "size");
272 if (strcmp(tokens[4], "cpu") != 0) {
273 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
277 if (parser_read_uint32(&p.cpu_id, tokens[5]) != 0) {
278 snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
282 swq = swq_create(name, &p);
284 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
290 * tmgr subport profile
291 * <tb_rate> <tb_size>
292 * <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate>
296 cmd_tmgr_subport_profile(char **tokens,
301 struct rte_sched_subport_params p;
304 if (n_tokens != 10) {
305 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
309 if (parser_read_uint32(&p.tb_rate, tokens[3]) != 0) {
310 snprintf(out, out_size, MSG_ARG_INVALID, "tb_rate");
314 if (parser_read_uint32(&p.tb_size, tokens[4]) != 0) {
315 snprintf(out, out_size, MSG_ARG_INVALID, "tb_size");
319 for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
320 if (parser_read_uint32(&p.tc_rate[i], tokens[5 + i]) != 0) {
321 snprintf(out, out_size, MSG_ARG_INVALID, "tc_rate");
325 if (parser_read_uint32(&p.tc_period, tokens[9]) != 0) {
326 snprintf(out, out_size, MSG_ARG_INVALID, "tc_period");
330 status = tmgr_subport_profile_add(&p);
332 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
339 * <tb_rate> <tb_size>
340 * <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate>
346 cmd_tmgr_pipe_profile(char **tokens,
351 struct rte_sched_pipe_params p;
354 if (n_tokens != 27) {
355 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
359 if (parser_read_uint32(&p.tb_rate, tokens[3]) != 0) {
360 snprintf(out, out_size, MSG_ARG_INVALID, "tb_rate");
364 if (parser_read_uint32(&p.tb_size, tokens[4]) != 0) {
365 snprintf(out, out_size, MSG_ARG_INVALID, "tb_size");
369 for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
370 if (parser_read_uint32(&p.tc_rate[i], tokens[5 + i]) != 0) {
371 snprintf(out, out_size, MSG_ARG_INVALID, "tc_rate");
375 if (parser_read_uint32(&p.tc_period, tokens[9]) != 0) {
376 snprintf(out, out_size, MSG_ARG_INVALID, "tc_period");
380 #ifdef RTE_SCHED_SUBPORT_TC_OV
381 if (parser_read_uint8(&p.tc_ov_weight, tokens[10]) != 0) {
382 snprintf(out, out_size, MSG_ARG_INVALID, "tc_ov_weight");
387 for (i = 0; i < RTE_SCHED_QUEUES_PER_PIPE; i++)
388 if (parser_read_uint8(&p.wrr_weights[i], tokens[11 + i]) != 0) {
389 snprintf(out, out_size, MSG_ARG_INVALID, "wrr_weights");
393 status = tmgr_pipe_profile_add(&p);
395 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
403 * spp <n_subports_per_port>
404 * pps <n_pipes_per_subport>
405 * qsize <qsize_tc0> <qsize_tc1> <qsize_tc2> <qsize_tc3>
406 * fo <frame_overhead>
411 cmd_tmgr(char **tokens,
416 struct tmgr_port_params p;
418 struct tmgr_port *tmgr_port;
421 if (n_tokens != 19) {
422 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
428 if (strcmp(tokens[2], "rate") != 0) {
429 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rate");
433 if (parser_read_uint32(&p.rate, tokens[3]) != 0) {
434 snprintf(out, out_size, MSG_ARG_INVALID, "rate");
438 if (strcmp(tokens[4], "spp") != 0) {
439 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "spp");
443 if (parser_read_uint32(&p.n_subports_per_port, tokens[5]) != 0) {
444 snprintf(out, out_size, MSG_ARG_INVALID, "n_subports_per_port");
448 if (strcmp(tokens[6], "pps") != 0) {
449 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pps");
453 if (parser_read_uint32(&p.n_pipes_per_subport, tokens[7]) != 0) {
454 snprintf(out, out_size, MSG_ARG_INVALID, "n_pipes_per_subport");
458 if (strcmp(tokens[8], "qsize") != 0) {
459 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "qsize");
463 for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
464 if (parser_read_uint16(&p.qsize[i], tokens[9 + i]) != 0) {
465 snprintf(out, out_size, MSG_ARG_INVALID, "qsize");
469 if (strcmp(tokens[13], "fo") != 0) {
470 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "fo");
474 if (parser_read_uint32(&p.frame_overhead, tokens[14]) != 0) {
475 snprintf(out, out_size, MSG_ARG_INVALID, "frame_overhead");
479 if (strcmp(tokens[15], "mtu") != 0) {
480 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mtu");
484 if (parser_read_uint32(&p.mtu, tokens[16]) != 0) {
485 snprintf(out, out_size, MSG_ARG_INVALID, "mtu");
489 if (strcmp(tokens[17], "cpu") != 0) {
490 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
494 if (parser_read_uint32(&p.cpu_id, tokens[18]) != 0) {
495 snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
499 tmgr_port = tmgr_port_create(name, &p);
500 if (tmgr_port == NULL) {
501 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
507 * tmgr <tmgr_name> subport <subport_id>
508 * profile <subport_profile_id>
511 cmd_tmgr_subport(char **tokens,
516 uint32_t subport_id, subport_profile_id;
521 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
527 if (parser_read_uint32(&subport_id, tokens[3]) != 0) {
528 snprintf(out, out_size, MSG_ARG_INVALID, "subport_id");
532 if (parser_read_uint32(&subport_profile_id, tokens[5]) != 0) {
533 snprintf(out, out_size, MSG_ARG_INVALID, "subport_profile_id");
537 status = tmgr_subport_config(name, subport_id, subport_profile_id);
539 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
545 * tmgr <tmgr_name> subport <subport_id> pipe
546 * from <pipe_id_first> to <pipe_id_last>
547 * profile <pipe_profile_id>
550 cmd_tmgr_subport_pipe(char **tokens,
555 uint32_t subport_id, pipe_id_first, pipe_id_last, pipe_profile_id;
559 if (n_tokens != 11) {
560 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
566 if (parser_read_uint32(&subport_id, tokens[3]) != 0) {
567 snprintf(out, out_size, MSG_ARG_INVALID, "subport_id");
571 if (strcmp(tokens[4], "pipe") != 0) {
572 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipe");
576 if (strcmp(tokens[5], "from") != 0) {
577 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "from");
581 if (parser_read_uint32(&pipe_id_first, tokens[6]) != 0) {
582 snprintf(out, out_size, MSG_ARG_INVALID, "pipe_id_first");
586 if (strcmp(tokens[7], "to") != 0) {
587 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "to");
591 if (parser_read_uint32(&pipe_id_last, tokens[8]) != 0) {
592 snprintf(out, out_size, MSG_ARG_INVALID, "pipe_id_last");
596 if (strcmp(tokens[9], "profile") != 0) {
597 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
601 if (parser_read_uint32(&pipe_profile_id, tokens[10]) != 0) {
602 snprintf(out, out_size, MSG_ARG_INVALID, "pipe_profile_id");
606 status = tmgr_pipe_config(name, subport_id, pipe_id_first,
607 pipe_id_last, pipe_profile_id);
609 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
618 cmd_tap(char **tokens,
627 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
633 tap = tap_create(name);
635 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
643 * mempool <mempool_name>
644 * [thread <thread_id>]
647 cmd_kni(char **tokens,
656 memset(&p, 0, sizeof(p));
657 if ((n_tokens != 6) && (n_tokens != 8)) {
658 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
664 if (strcmp(tokens[2], "link") != 0) {
665 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "link");
669 p.link_name = tokens[3];
671 if (strcmp(tokens[4], "mempool") != 0) {
672 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mempool");
676 p.mempool_name = tokens[5];
679 if (strcmp(tokens[6], "thread") != 0) {
680 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "thread");
684 if (parser_read_uint32(&p.thread_id, tokens[7]) != 0) {
685 snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
693 kni = kni_create(name, &p);
695 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
701 * port in action profile <profile_name>
702 * [filter match | mismatch offset <key_offset> mask <key_mask> key <key_value> port <port_id>]
703 * [balance offset <key_offset> mask <key_mask> port <port_id0> ... <port_id15>]
706 cmd_port_in_action_profile(char **tokens,
711 struct port_in_action_profile_params p;
712 struct port_in_action_profile *ap;
716 memset(&p, 0, sizeof(p));
719 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
723 if (strcmp(tokens[1], "in") != 0) {
724 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
728 if (strcmp(tokens[2], "action") != 0) {
729 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "action");
733 if (strcmp(tokens[3], "profile") != 0) {
734 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
742 if ((t0 < n_tokens) && (strcmp(tokens[t0], "filter") == 0)) {
745 if (n_tokens < t0 + 10) {
746 snprintf(out, out_size, MSG_ARG_MISMATCH, "port in action profile filter");
750 if (strcmp(tokens[t0 + 1], "match") == 0)
751 p.fltr.filter_on_match = 1;
752 else if (strcmp(tokens[t0 + 1], "mismatch") == 0)
753 p.fltr.filter_on_match = 0;
755 snprintf(out, out_size, MSG_ARG_INVALID, "match or mismatch");
759 if (strcmp(tokens[t0 + 2], "offset") != 0) {
760 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
764 if (parser_read_uint32(&p.fltr.key_offset, tokens[t0 + 3]) != 0) {
765 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
769 if (strcmp(tokens[t0 + 4], "mask") != 0) {
770 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
774 size = RTE_PORT_IN_ACTION_FLTR_KEY_SIZE;
775 if ((parse_hex_string(tokens[t0 + 5], p.fltr.key_mask, &size) != 0) ||
776 (size != RTE_PORT_IN_ACTION_FLTR_KEY_SIZE)) {
777 snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
781 if (strcmp(tokens[t0 + 6], "key") != 0) {
782 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "key");
786 size = RTE_PORT_IN_ACTION_FLTR_KEY_SIZE;
787 if ((parse_hex_string(tokens[t0 + 7], p.fltr.key, &size) != 0) ||
788 (size != RTE_PORT_IN_ACTION_FLTR_KEY_SIZE)) {
789 snprintf(out, out_size, MSG_ARG_INVALID, "key_value");
793 if (strcmp(tokens[t0 + 8], "port") != 0) {
794 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
798 if (parser_read_uint32(&p.fltr.port_id, tokens[t0 + 9]) != 0) {
799 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
803 p.action_mask |= 1LLU << RTE_PORT_IN_ACTION_FLTR;
807 if ((t0 < n_tokens) && (strcmp(tokens[t0], "balance") == 0)) {
810 if (n_tokens < t0 + 22) {
811 snprintf(out, out_size, MSG_ARG_MISMATCH,
812 "port in action profile balance");
816 if (strcmp(tokens[t0 + 1], "offset") != 0) {
817 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
821 if (parser_read_uint32(&p.lb.key_offset, tokens[t0 + 2]) != 0) {
822 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
826 if (strcmp(tokens[t0 + 3], "mask") != 0) {
827 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
831 p.lb.key_size = RTE_PORT_IN_ACTION_LB_KEY_SIZE_MAX;
832 if (parse_hex_string(tokens[t0 + 4], p.lb.key_mask, &p.lb.key_size) != 0) {
833 snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
837 if (strcmp(tokens[t0 + 5], "port") != 0) {
838 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
842 for (i = 0; i < 16; i++)
843 if (parser_read_uint32(&p.lb.port_id[i], tokens[t0 + 6 + i]) != 0) {
844 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
848 p.action_mask |= 1LLU << RTE_PORT_IN_ACTION_LB;
853 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
857 ap = port_in_action_profile_create(name, &p);
859 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
865 * table action profile <profile_name>
869 * [balance offset <key_offset> mask <key_mask> outoffset <out_offset>]
870 * [meter srtcm | trtcm
872 * stats none | pkts | bytes | both]
873 * [tm spp <n_subports_per_port> pps <n_pipes_per_subport>]
874 * [encap ether | vlan | qinq | mpls | pppoe]
879 * [stats pkts | bytes | both]
883 cmd_table_action_profile(char **tokens,
888 struct table_action_profile_params p;
889 struct table_action_profile *ap;
893 memset(&p, 0, sizeof(p));
896 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
900 if (strcmp(tokens[1], "action") != 0) {
901 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "action");
905 if (strcmp(tokens[2], "profile") != 0) {
906 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
912 if (strcmp(tokens[4], "ipv4") == 0)
913 p.common.ip_version = 1;
914 else if (strcmp(tokens[4], "ipv6") == 0)
915 p.common.ip_version = 0;
917 snprintf(out, out_size, MSG_ARG_INVALID, "ipv4 or ipv6");
921 if (strcmp(tokens[5], "offset") != 0) {
922 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
926 if (parser_read_uint32(&p.common.ip_offset, tokens[6]) != 0) {
927 snprintf(out, out_size, MSG_ARG_INVALID, "ip_offset");
931 if (strcmp(tokens[7], "fwd") != 0) {
932 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "fwd");
936 p.action_mask |= 1LLU << RTE_TABLE_ACTION_FWD;
939 if ((t0 < n_tokens) && (strcmp(tokens[t0], "balance") == 0)) {
940 if (n_tokens < t0 + 7) {
941 snprintf(out, out_size, MSG_ARG_MISMATCH, "table action profile balance");
945 if (strcmp(tokens[t0 + 1], "offset") != 0) {
946 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
950 if (parser_read_uint32(&p.lb.key_offset, tokens[t0 + 2]) != 0) {
951 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
955 if (strcmp(tokens[t0 + 3], "mask") != 0) {
956 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
960 p.lb.key_size = RTE_PORT_IN_ACTION_LB_KEY_SIZE_MAX;
961 if (parse_hex_string(tokens[t0 + 4], p.lb.key_mask, &p.lb.key_size) != 0) {
962 snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
966 if (strcmp(tokens[t0 + 5], "outoffset") != 0) {
967 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "outoffset");
971 if (parser_read_uint32(&p.lb.out_offset, tokens[t0 + 6]) != 0) {
972 snprintf(out, out_size, MSG_ARG_INVALID, "out_offset");
976 p.action_mask |= 1LLU << RTE_TABLE_ACTION_LB;
980 if ((t0 < n_tokens) && (strcmp(tokens[t0], "meter") == 0)) {
981 if (n_tokens < t0 + 6) {
982 snprintf(out, out_size, MSG_ARG_MISMATCH,
983 "table action profile meter");
987 if (strcmp(tokens[t0 + 1], "srtcm") == 0)
988 p.mtr.alg = RTE_TABLE_ACTION_METER_SRTCM;
989 else if (strcmp(tokens[t0 + 1], "trtcm") == 0)
990 p.mtr.alg = RTE_TABLE_ACTION_METER_TRTCM;
992 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
997 if (strcmp(tokens[t0 + 2], "tc") != 0) {
998 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc");
1002 if (parser_read_uint32(&p.mtr.n_tc, tokens[t0 + 3]) != 0) {
1003 snprintf(out, out_size, MSG_ARG_INVALID, "n_tc");
1007 if (strcmp(tokens[t0 + 4], "stats") != 0) {
1008 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
1012 if (strcmp(tokens[t0 + 5], "none") == 0) {
1013 p.mtr.n_packets_enabled = 0;
1014 p.mtr.n_bytes_enabled = 0;
1015 } else if (strcmp(tokens[t0 + 5], "pkts") == 0) {
1016 p.mtr.n_packets_enabled = 1;
1017 p.mtr.n_bytes_enabled = 0;
1018 } else if (strcmp(tokens[t0 + 5], "bytes") == 0) {
1019 p.mtr.n_packets_enabled = 0;
1020 p.mtr.n_bytes_enabled = 1;
1021 } else if (strcmp(tokens[t0 + 5], "both") == 0) {
1022 p.mtr.n_packets_enabled = 1;
1023 p.mtr.n_bytes_enabled = 1;
1025 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1026 "none or pkts or bytes or both");
1030 p.action_mask |= 1LLU << RTE_TABLE_ACTION_MTR;
1034 if ((t0 < n_tokens) && (strcmp(tokens[t0], "tm") == 0)) {
1035 if (n_tokens < t0 + 5) {
1036 snprintf(out, out_size, MSG_ARG_MISMATCH,
1037 "table action profile tm");
1041 if (strcmp(tokens[t0 + 1], "spp") != 0) {
1042 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "spp");
1046 if (parser_read_uint32(&p.tm.n_subports_per_port,
1047 tokens[t0 + 2]) != 0) {
1048 snprintf(out, out_size, MSG_ARG_INVALID,
1049 "n_subports_per_port");
1053 if (strcmp(tokens[t0 + 3], "pps") != 0) {
1054 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pps");
1058 if (parser_read_uint32(&p.tm.n_pipes_per_subport,
1059 tokens[t0 + 4]) != 0) {
1060 snprintf(out, out_size, MSG_ARG_INVALID,
1061 "n_pipes_per_subport");
1065 p.action_mask |= 1LLU << RTE_TABLE_ACTION_TM;
1069 if ((t0 < n_tokens) && (strcmp(tokens[t0], "encap") == 0)) {
1070 if (n_tokens < t0 + 2) {
1071 snprintf(out, out_size, MSG_ARG_MISMATCH,
1072 "action profile encap");
1076 if (strcmp(tokens[t0 + 1], "ether") == 0)
1077 p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_ETHER;
1078 else if (strcmp(tokens[t0 + 1], "vlan") == 0)
1079 p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_VLAN;
1080 else if (strcmp(tokens[t0 + 1], "qinq") == 0)
1081 p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_QINQ;
1082 else if (strcmp(tokens[t0 + 1], "mpls") == 0)
1083 p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_MPLS;
1084 else if (strcmp(tokens[t0 + 1], "pppoe") == 0)
1085 p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_PPPOE;
1087 snprintf(out, out_size, MSG_ARG_MISMATCH, "encap");
1091 p.action_mask |= 1LLU << RTE_TABLE_ACTION_ENCAP;
1095 if ((t0 < n_tokens) && (strcmp(tokens[t0], "nat") == 0)) {
1096 if (n_tokens < t0 + 4) {
1097 snprintf(out, out_size, MSG_ARG_MISMATCH,
1098 "table action profile nat");
1102 if (strcmp(tokens[t0 + 1], "src") == 0)
1103 p.nat.source_nat = 1;
1104 else if (strcmp(tokens[t0 + 1], "dst") == 0)
1105 p.nat.source_nat = 0;
1107 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1112 if (strcmp(tokens[t0 + 2], "proto") != 0) {
1113 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "proto");
1117 if (strcmp(tokens[t0 + 3], "tcp") == 0)
1119 else if (strcmp(tokens[t0 + 3], "udp") == 0)
1122 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1127 p.action_mask |= 1LLU << RTE_TABLE_ACTION_NAT;
1131 if ((t0 < n_tokens) && (strcmp(tokens[t0], "ttl") == 0)) {
1132 if (n_tokens < t0 + 4) {
1133 snprintf(out, out_size, MSG_ARG_MISMATCH,
1134 "table action profile ttl");
1138 if (strcmp(tokens[t0 + 1], "drop") == 0)
1140 else if (strcmp(tokens[t0 + 1], "fwd") == 0)
1143 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1148 if (strcmp(tokens[t0 + 2], "stats") != 0) {
1149 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
1153 if (strcmp(tokens[t0 + 3], "none") == 0)
1154 p.ttl.n_packets_enabled = 0;
1155 else if (strcmp(tokens[t0 + 3], "pkts") == 0)
1156 p.ttl.n_packets_enabled = 1;
1158 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1163 p.action_mask |= 1LLU << RTE_TABLE_ACTION_TTL;
1167 if ((t0 < n_tokens) && (strcmp(tokens[t0], "stats") == 0)) {
1168 if (n_tokens < t0 + 2) {
1169 snprintf(out, out_size, MSG_ARG_MISMATCH,
1170 "table action profile stats");
1174 if (strcmp(tokens[t0 + 1], "pkts") == 0) {
1175 p.stats.n_packets_enabled = 1;
1176 p.stats.n_bytes_enabled = 0;
1177 } else if (strcmp(tokens[t0 + 1], "bytes") == 0) {
1178 p.stats.n_packets_enabled = 0;
1179 p.stats.n_bytes_enabled = 1;
1180 } else if (strcmp(tokens[t0 + 1], "both") == 0) {
1181 p.stats.n_packets_enabled = 1;
1182 p.stats.n_bytes_enabled = 1;
1184 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1185 "pkts or bytes or both");
1189 p.action_mask |= 1LLU << RTE_TABLE_ACTION_STATS;
1193 if ((t0 < n_tokens) && (strcmp(tokens[t0], "time") == 0)) {
1194 p.action_mask |= 1LLU << RTE_TABLE_ACTION_TIME;
1198 if (t0 < n_tokens) {
1199 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1203 ap = table_action_profile_create(name, &p);
1205 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1211 * pipeline <pipeline_name>
1212 * period <timer_period_ms>
1213 * offset_port_id <offset_port_id>
1217 cmd_pipeline(char **tokens,
1222 struct pipeline_params p;
1224 struct pipeline *pipeline;
1226 if (n_tokens != 8) {
1227 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1233 if (strcmp(tokens[2], "period") != 0) {
1234 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "period");
1238 if (parser_read_uint32(&p.timer_period_ms, tokens[3]) != 0) {
1239 snprintf(out, out_size, MSG_ARG_INVALID, "timer_period_ms");
1243 if (strcmp(tokens[4], "offset_port_id") != 0) {
1244 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset_port_id");
1248 if (parser_read_uint32(&p.offset_port_id, tokens[5]) != 0) {
1249 snprintf(out, out_size, MSG_ARG_INVALID, "offset_port_id");
1253 if (strcmp(tokens[6], "cpu") != 0) {
1254 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
1258 if (parser_read_uint32(&p.cpu_id, tokens[7]) != 0) {
1259 snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
1263 pipeline = pipeline_create(name, &p);
1264 if (pipeline == NULL) {
1265 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1271 * pipeline <pipeline_name> port in
1273 * link <link_name> rxq <queue_id>
1275 * | tmgr <tmgr_name>
1276 * | tap <tap_name> mempool <mempool_name> mtu <mtu>
1278 * | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>
1279 * [action <port_in_action_profile_name>]
1283 cmd_pipeline_port_in(char **tokens,
1288 struct port_in_params p;
1289 char *pipeline_name;
1291 int enabled, status;
1294 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1298 pipeline_name = tokens[1];
1300 if (strcmp(tokens[2], "port") != 0) {
1301 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
1305 if (strcmp(tokens[3], "in") != 0) {
1306 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
1310 if (strcmp(tokens[4], "bsz") != 0) {
1311 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "bsz");
1315 if (parser_read_uint32(&p.burst_size, tokens[5]) != 0) {
1316 snprintf(out, out_size, MSG_ARG_INVALID, "burst_size");
1322 if (strcmp(tokens[t0], "link") == 0) {
1323 if (n_tokens < t0 + 4) {
1324 snprintf(out, out_size, MSG_ARG_MISMATCH,
1325 "pipeline port in link");
1329 p.type = PORT_IN_RXQ;
1331 p.dev_name = tokens[t0 + 1];
1333 if (strcmp(tokens[t0 + 2], "rxq") != 0) {
1334 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rxq");
1338 if (parser_read_uint16(&p.rxq.queue_id, tokens[t0 + 3]) != 0) {
1339 snprintf(out, out_size, MSG_ARG_INVALID,
1344 } else if (strcmp(tokens[t0], "swq") == 0) {
1345 if (n_tokens < t0 + 2) {
1346 snprintf(out, out_size, MSG_ARG_MISMATCH,
1347 "pipeline port in swq");
1351 p.type = PORT_IN_SWQ;
1353 p.dev_name = tokens[t0 + 1];
1356 } else if (strcmp(tokens[t0], "tmgr") == 0) {
1357 if (n_tokens < t0 + 2) {
1358 snprintf(out, out_size, MSG_ARG_MISMATCH,
1359 "pipeline port in tmgr");
1363 p.type = PORT_IN_TMGR;
1365 p.dev_name = tokens[t0 + 1];
1368 } else if (strcmp(tokens[t0], "tap") == 0) {
1369 if (n_tokens < t0 + 6) {
1370 snprintf(out, out_size, MSG_ARG_MISMATCH,
1371 "pipeline port in tap");
1375 p.type = PORT_IN_TAP;
1377 p.dev_name = tokens[t0 + 1];
1379 if (strcmp(tokens[t0 + 2], "mempool") != 0) {
1380 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1385 p.tap.mempool_name = tokens[t0 + 3];
1387 if (strcmp(tokens[t0 + 4], "mtu") != 0) {
1388 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1393 if (parser_read_uint32(&p.tap.mtu, tokens[t0 + 5]) != 0) {
1394 snprintf(out, out_size, MSG_ARG_INVALID, "mtu");
1399 } else if (strcmp(tokens[t0], "kni") == 0) {
1400 if (n_tokens < t0 + 2) {
1401 snprintf(out, out_size, MSG_ARG_MISMATCH,
1402 "pipeline port in kni");
1406 p.type = PORT_IN_KNI;
1408 p.dev_name = tokens[t0 + 1];
1411 } else if (strcmp(tokens[t0], "source") == 0) {
1412 if (n_tokens < t0 + 6) {
1413 snprintf(out, out_size, MSG_ARG_MISMATCH,
1414 "pipeline port in source");
1418 p.type = PORT_IN_SOURCE;
1422 if (strcmp(tokens[t0 + 1], "mempool") != 0) {
1423 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1428 p.source.mempool_name = tokens[t0 + 2];
1430 if (strcmp(tokens[t0 + 3], "file") != 0) {
1431 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1436 p.source.file_name = tokens[t0 + 4];
1438 if (strcmp(tokens[t0 + 5], "bpp") != 0) {
1439 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1444 if (parser_read_uint32(&p.source.n_bytes_per_pkt, tokens[t0 + 6]) != 0) {
1445 snprintf(out, out_size, MSG_ARG_INVALID,
1452 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
1456 p.action_profile_name = NULL;
1457 if ((n_tokens > t0) && (strcmp(tokens[t0], "action") == 0)) {
1458 if (n_tokens < t0 + 2) {
1459 snprintf(out, out_size, MSG_ARG_MISMATCH, "action");
1463 p.action_profile_name = tokens[t0 + 1];
1469 if ((n_tokens > t0) &&
1470 (strcmp(tokens[t0], "disabled") == 0)) {
1476 if (n_tokens != t0) {
1477 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1481 status = pipeline_port_in_create(pipeline_name,
1484 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1490 * pipeline <pipeline_name> port out
1492 * link <link_name> txq <txq_id>
1494 * | tmgr <tmgr_name>
1497 * | sink [file <file_name> pkts <max_n_pkts>]
1500 cmd_pipeline_port_out(char **tokens,
1505 struct port_out_params p;
1506 char *pipeline_name;
1509 memset(&p, 0, sizeof(p));
1512 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1516 pipeline_name = tokens[1];
1518 if (strcmp(tokens[2], "port") != 0) {
1519 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
1523 if (strcmp(tokens[3], "out") != 0) {
1524 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "out");
1528 if (strcmp(tokens[4], "bsz") != 0) {
1529 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "bsz");
1533 if (parser_read_uint32(&p.burst_size, tokens[5]) != 0) {
1534 snprintf(out, out_size, MSG_ARG_INVALID, "burst_size");
1538 if (strcmp(tokens[6], "link") == 0) {
1539 if (n_tokens != 10) {
1540 snprintf(out, out_size, MSG_ARG_MISMATCH,
1541 "pipeline port out link");
1545 p.type = PORT_OUT_TXQ;
1547 p.dev_name = tokens[7];
1549 if (strcmp(tokens[8], "txq") != 0) {
1550 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "txq");
1554 if (parser_read_uint16(&p.txq.queue_id, tokens[9]) != 0) {
1555 snprintf(out, out_size, MSG_ARG_INVALID, "queue_id");
1558 } else if (strcmp(tokens[6], "swq") == 0) {
1559 if (n_tokens != 8) {
1560 snprintf(out, out_size, MSG_ARG_MISMATCH,
1561 "pipeline port out swq");
1565 p.type = PORT_OUT_SWQ;
1567 p.dev_name = tokens[7];
1568 } else if (strcmp(tokens[6], "tmgr") == 0) {
1569 if (n_tokens != 8) {
1570 snprintf(out, out_size, MSG_ARG_MISMATCH,
1571 "pipeline port out tmgr");
1575 p.type = PORT_OUT_TMGR;
1577 p.dev_name = tokens[7];
1578 } else if (strcmp(tokens[6], "tap") == 0) {
1579 if (n_tokens != 8) {
1580 snprintf(out, out_size, MSG_ARG_MISMATCH,
1581 "pipeline port out tap");
1585 p.type = PORT_OUT_TAP;
1587 p.dev_name = tokens[7];
1588 } else if (strcmp(tokens[6], "kni") == 0) {
1589 if (n_tokens != 8) {
1590 snprintf(out, out_size, MSG_ARG_MISMATCH,
1591 "pipeline port out kni");
1595 p.type = PORT_OUT_KNI;
1597 p.dev_name = tokens[7];
1598 } else if (strcmp(tokens[6], "sink") == 0) {
1599 if ((n_tokens != 7) && (n_tokens != 11)) {
1600 snprintf(out, out_size, MSG_ARG_MISMATCH,
1601 "pipeline port out sink");
1605 p.type = PORT_OUT_SINK;
1609 if (n_tokens == 7) {
1610 p.sink.file_name = NULL;
1611 p.sink.max_n_pkts = 0;
1613 if (strcmp(tokens[7], "file") != 0) {
1614 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1619 p.sink.file_name = tokens[8];
1621 if (strcmp(tokens[9], "pkts") != 0) {
1622 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pkts");
1626 if (parser_read_uint32(&p.sink.max_n_pkts, tokens[10]) != 0) {
1627 snprintf(out, out_size, MSG_ARG_INVALID, "max_n_pkts");
1632 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
1636 status = pipeline_port_out_create(pipeline_name, &p);
1638 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1644 * pipeline <pipeline_name> table
1648 * offset <ip_header_offset>
1651 * offset <key_offset>
1657 * offset <key_offset>
1658 * buckets <n_buckets>
1662 * offset <ip_header_offset>
1665 * [action <table_action_profile_name>]
1668 cmd_pipeline_table(char **tokens,
1673 uint8_t key_mask[TABLE_RULE_MATCH_SIZE_MAX];
1674 struct table_params p;
1675 char *pipeline_name;
1680 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1684 pipeline_name = tokens[1];
1686 if (strcmp(tokens[2], "table") != 0) {
1687 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
1691 if (strcmp(tokens[3], "match") != 0) {
1692 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
1697 if (strcmp(tokens[t0], "acl") == 0) {
1698 if (n_tokens < t0 + 6) {
1699 snprintf(out, out_size, MSG_ARG_MISMATCH,
1700 "pipeline table acl");
1704 p.match_type = TABLE_ACL;
1706 if (strcmp(tokens[t0 + 1], "ipv4") == 0)
1707 p.match.acl.ip_version = 1;
1708 else if (strcmp(tokens[t0 + 1], "ipv6") == 0)
1709 p.match.acl.ip_version = 0;
1711 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1716 if (strcmp(tokens[t0 + 2], "offset") != 0) {
1717 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
1721 if (parser_read_uint32(&p.match.acl.ip_header_offset,
1722 tokens[t0 + 3]) != 0) {
1723 snprintf(out, out_size, MSG_ARG_INVALID,
1724 "ip_header_offset");
1728 if (strcmp(tokens[t0 + 4], "size") != 0) {
1729 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
1733 if (parser_read_uint32(&p.match.acl.n_rules,
1734 tokens[t0 + 5]) != 0) {
1735 snprintf(out, out_size, MSG_ARG_INVALID, "n_rules");
1740 } else if (strcmp(tokens[t0], "array") == 0) {
1741 if (n_tokens < t0 + 5) {
1742 snprintf(out, out_size, MSG_ARG_MISMATCH,
1743 "pipeline table array");
1747 p.match_type = TABLE_ARRAY;
1749 if (strcmp(tokens[t0 + 1], "offset") != 0) {
1750 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
1754 if (parser_read_uint32(&p.match.array.key_offset,
1755 tokens[t0 + 2]) != 0) {
1756 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
1760 if (strcmp(tokens[t0 + 3], "size") != 0) {
1761 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
1765 if (parser_read_uint32(&p.match.array.n_keys,
1766 tokens[t0 + 4]) != 0) {
1767 snprintf(out, out_size, MSG_ARG_INVALID, "n_keys");
1772 } else if (strcmp(tokens[t0], "hash") == 0) {
1773 uint32_t key_mask_size = TABLE_RULE_MATCH_SIZE_MAX;
1775 if (n_tokens < t0 + 12) {
1776 snprintf(out, out_size, MSG_ARG_MISMATCH,
1777 "pipeline table hash");
1781 p.match_type = TABLE_HASH;
1783 if (strcmp(tokens[t0 + 1], "ext") == 0)
1784 p.match.hash.extendable_bucket = 1;
1785 else if (strcmp(tokens[t0 + 1], "lru") == 0)
1786 p.match.hash.extendable_bucket = 0;
1788 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1793 if (strcmp(tokens[t0 + 2], "key") != 0) {
1794 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "key");
1798 if ((parser_read_uint32(&p.match.hash.key_size,
1799 tokens[t0 + 3]) != 0) ||
1800 (p.match.hash.key_size == 0) ||
1801 (p.match.hash.key_size > TABLE_RULE_MATCH_SIZE_MAX)) {
1802 snprintf(out, out_size, MSG_ARG_INVALID, "key_size");
1806 if (strcmp(tokens[t0 + 4], "mask") != 0) {
1807 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
1811 if ((parse_hex_string(tokens[t0 + 5],
1812 key_mask, &key_mask_size) != 0) ||
1813 (key_mask_size != p.match.hash.key_size)) {
1814 snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
1817 p.match.hash.key_mask = key_mask;
1819 if (strcmp(tokens[t0 + 6], "offset") != 0) {
1820 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
1824 if (parser_read_uint32(&p.match.hash.key_offset,
1825 tokens[t0 + 7]) != 0) {
1826 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
1830 if (strcmp(tokens[t0 + 8], "buckets") != 0) {
1831 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "buckets");
1835 if (parser_read_uint32(&p.match.hash.n_buckets,
1836 tokens[t0 + 9]) != 0) {
1837 snprintf(out, out_size, MSG_ARG_INVALID, "n_buckets");
1841 if (strcmp(tokens[t0 + 10], "size") != 0) {
1842 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
1846 if (parser_read_uint32(&p.match.hash.n_keys,
1847 tokens[t0 + 11]) != 0) {
1848 snprintf(out, out_size, MSG_ARG_INVALID, "n_keys");
1853 } else if (strcmp(tokens[t0], "lpm") == 0) {
1854 if (n_tokens < t0 + 6) {
1855 snprintf(out, out_size, MSG_ARG_MISMATCH,
1856 "pipeline table lpm");
1860 p.match_type = TABLE_LPM;
1862 if (strcmp(tokens[t0 + 1], "ipv4") == 0)
1863 p.match.lpm.key_size = 4;
1864 else if (strcmp(tokens[t0 + 1], "ipv6") == 0)
1865 p.match.lpm.key_size = 16;
1867 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
1872 if (strcmp(tokens[t0 + 2], "offset") != 0) {
1873 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
1877 if (parser_read_uint32(&p.match.lpm.key_offset,
1878 tokens[t0 + 3]) != 0) {
1879 snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
1883 if (strcmp(tokens[t0 + 4], "size") != 0) {
1884 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
1888 if (parser_read_uint32(&p.match.lpm.n_rules,
1889 tokens[t0 + 5]) != 0) {
1890 snprintf(out, out_size, MSG_ARG_INVALID, "n_rules");
1895 } else if (strcmp(tokens[t0], "stub") == 0) {
1896 p.match_type = TABLE_STUB;
1900 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
1904 p.action_profile_name = NULL;
1905 if ((n_tokens > t0) && (strcmp(tokens[t0], "action") == 0)) {
1906 if (n_tokens < t0 + 2) {
1907 snprintf(out, out_size, MSG_ARG_MISMATCH, "action");
1911 p.action_profile_name = tokens[t0 + 1];
1916 if (n_tokens > t0) {
1917 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1921 status = pipeline_table_create(pipeline_name, &p);
1923 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1929 * pipeline <pipeline_name> port in <port_id> table <table_id>
1932 cmd_pipeline_port_in_table(char **tokens,
1937 char *pipeline_name;
1938 uint32_t port_id, table_id;
1941 if (n_tokens != 7) {
1942 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
1946 pipeline_name = tokens[1];
1948 if (strcmp(tokens[2], "port") != 0) {
1949 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
1953 if (strcmp(tokens[3], "in") != 0) {
1954 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
1958 if (parser_read_uint32(&port_id, tokens[4]) != 0) {
1959 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
1963 if (strcmp(tokens[5], "table") != 0) {
1964 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
1968 if (parser_read_uint32(&table_id, tokens[6]) != 0) {
1969 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
1973 status = pipeline_port_in_connect_to_table(pipeline_name,
1977 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
1983 * pipeline <pipeline_name> port in <port_id> stats read [clear]
1986 #define MSG_PIPELINE_PORT_IN_STATS \
1987 "Pkts in: %" PRIu64 "\n" \
1988 "Pkts dropped by AH: %" PRIu64 "\n" \
1989 "Pkts dropped by other: %" PRIu64 "\n"
1992 cmd_pipeline_port_in_stats(char **tokens,
1997 struct rte_pipeline_port_in_stats stats;
1998 char *pipeline_name;
2002 if ((n_tokens != 7) && (n_tokens != 8)) {
2003 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2007 pipeline_name = tokens[1];
2009 if (strcmp(tokens[2], "port") != 0) {
2010 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2014 if (strcmp(tokens[3], "in") != 0) {
2015 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
2019 if (parser_read_uint32(&port_id, tokens[4]) != 0) {
2020 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
2024 if (strcmp(tokens[5], "stats") != 0) {
2025 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
2029 if (strcmp(tokens[6], "read") != 0) {
2030 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
2035 if (n_tokens == 8) {
2036 if (strcmp(tokens[7], "clear") != 0) {
2037 snprintf(out, out_size, MSG_ARG_INVALID, "clear");
2044 status = pipeline_port_in_stats_read(pipeline_name,
2049 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2053 snprintf(out, out_size, MSG_PIPELINE_PORT_IN_STATS,
2054 stats.stats.n_pkts_in,
2055 stats.n_pkts_dropped_by_ah,
2056 stats.stats.n_pkts_drop);
2060 * pipeline <pipeline_name> port in <port_id> enable
2063 cmd_pipeline_port_in_enable(char **tokens,
2068 char *pipeline_name;
2072 if (n_tokens != 6) {
2073 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2077 pipeline_name = tokens[1];
2079 if (strcmp(tokens[2], "port") != 0) {
2080 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2084 if (strcmp(tokens[3], "in") != 0) {
2085 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
2089 if (parser_read_uint32(&port_id, tokens[4]) != 0) {
2090 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
2094 if (strcmp(tokens[5], "enable") != 0) {
2095 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "enable");
2099 status = pipeline_port_in_enable(pipeline_name, port_id);
2101 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2107 * pipeline <pipeline_name> port in <port_id> disable
2110 cmd_pipeline_port_in_disable(char **tokens,
2115 char *pipeline_name;
2119 if (n_tokens != 6) {
2120 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2124 pipeline_name = tokens[1];
2126 if (strcmp(tokens[2], "port") != 0) {
2127 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2131 if (strcmp(tokens[3], "in") != 0) {
2132 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
2136 if (parser_read_uint32(&port_id, tokens[4]) != 0) {
2137 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
2141 if (strcmp(tokens[5], "disable") != 0) {
2142 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "disable");
2146 status = pipeline_port_in_disable(pipeline_name, port_id);
2148 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2154 * pipeline <pipeline_name> port out <port_id> stats read [clear]
2156 #define MSG_PIPELINE_PORT_OUT_STATS \
2157 "Pkts in: %" PRIu64 "\n" \
2158 "Pkts dropped by AH: %" PRIu64 "\n" \
2159 "Pkts dropped by other: %" PRIu64 "\n"
2162 cmd_pipeline_port_out_stats(char **tokens,
2167 struct rte_pipeline_port_out_stats stats;
2168 char *pipeline_name;
2172 if ((n_tokens != 7) && (n_tokens != 8)) {
2173 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2177 pipeline_name = tokens[1];
2179 if (strcmp(tokens[2], "port") != 0) {
2180 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2184 if (strcmp(tokens[3], "out") != 0) {
2185 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "out");
2189 if (parser_read_uint32(&port_id, tokens[4]) != 0) {
2190 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
2194 if (strcmp(tokens[5], "stats") != 0) {
2195 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
2199 if (strcmp(tokens[6], "read") != 0) {
2200 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
2205 if (n_tokens == 8) {
2206 if (strcmp(tokens[7], "clear") != 0) {
2207 snprintf(out, out_size, MSG_ARG_INVALID, "clear");
2214 status = pipeline_port_out_stats_read(pipeline_name,
2219 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2223 snprintf(out, out_size, MSG_PIPELINE_PORT_OUT_STATS,
2224 stats.stats.n_pkts_in,
2225 stats.n_pkts_dropped_by_ah,
2226 stats.stats.n_pkts_drop);
2230 * pipeline <pipeline_name> table <table_id> stats read [clear]
2232 #define MSG_PIPELINE_TABLE_STATS \
2233 "Pkts in: %" PRIu64 "\n" \
2234 "Pkts in with lookup miss: %" PRIu64 "\n" \
2235 "Pkts in with lookup hit dropped by AH: %" PRIu64 "\n" \
2236 "Pkts in with lookup hit dropped by others: %" PRIu64 "\n" \
2237 "Pkts in with lookup miss dropped by AH: %" PRIu64 "\n" \
2238 "Pkts in with lookup miss dropped by others: %" PRIu64 "\n"
2241 cmd_pipeline_table_stats(char **tokens,
2246 struct rte_pipeline_table_stats stats;
2247 char *pipeline_name;
2251 if ((n_tokens != 6) && (n_tokens != 7)) {
2252 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2256 pipeline_name = tokens[1];
2258 if (strcmp(tokens[2], "table") != 0) {
2259 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
2263 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
2264 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
2268 if (strcmp(tokens[4], "stats") != 0) {
2269 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
2273 if (strcmp(tokens[5], "read") != 0) {
2274 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
2279 if (n_tokens == 7) {
2280 if (strcmp(tokens[6], "clear") != 0) {
2281 snprintf(out, out_size, MSG_ARG_INVALID, "clear");
2288 status = pipeline_table_stats_read(pipeline_name,
2293 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
2297 snprintf(out, out_size, MSG_PIPELINE_TABLE_STATS,
2298 stats.stats.n_pkts_in,
2299 stats.stats.n_pkts_lookup_miss,
2300 stats.n_pkts_dropped_by_lkp_hit_ah,
2301 stats.n_pkts_dropped_lkp_hit,
2302 stats.n_pkts_dropped_by_lkp_miss_ah,
2303 stats.n_pkts_dropped_lkp_miss);
2311 * priority <priority>
2312 * ipv4 | ipv6 <sa> <sa_depth> <da> <da_depth>
2313 * <sp0> <sp1> <dp0> <dp1> <proto>
2317 * | ipv4_5tuple <sa> <da> <sp> <dp> <proto>
2318 * | ipv6_5tuple <sa> <da> <sp> <dp> <proto>
2319 * | ipv4_addr <addr>
2320 * | ipv6_addr <addr>
2321 * | qinq <svlan> <cvlan>
2323 * ipv4 | ipv6 <addr> <depth>
2325 struct pkt_key_qinq {
2326 uint16_t ethertype_svlan;
2328 uint16_t ethertype_cvlan;
2330 } __attribute__((__packed__));
2332 struct pkt_key_ipv4_5tuple {
2333 uint8_t time_to_live;
2335 uint16_t hdr_checksum;
2340 } __attribute__((__packed__));
2342 struct pkt_key_ipv6_5tuple {
2343 uint16_t payload_length;
2350 } __attribute__((__packed__));
2352 struct pkt_key_ipv4_addr {
2354 } __attribute__((__packed__));
2356 struct pkt_key_ipv6_addr {
2358 } __attribute__((__packed__));
2361 parse_match(char **tokens,
2365 struct table_rule_match *m)
2367 memset(m, 0, sizeof(*m));
2372 if (strcmp(tokens[0], "match") != 0) {
2373 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
2377 if (strcmp(tokens[1], "acl") == 0) {
2378 if (n_tokens < 14) {
2379 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2383 m->match_type = TABLE_ACL;
2385 if (strcmp(tokens[2], "priority") != 0) {
2386 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "priority");
2390 if (parser_read_uint32(&m->match.acl.priority,
2392 snprintf(out, out_size, MSG_ARG_INVALID, "priority");
2396 if (strcmp(tokens[4], "ipv4") == 0) {
2397 struct in_addr saddr, daddr;
2399 m->match.acl.ip_version = 1;
2401 if (parse_ipv4_addr(tokens[5], &saddr) != 0) {
2402 snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2405 m->match.acl.ipv4.sa = rte_be_to_cpu_32(saddr.s_addr);
2407 if (parse_ipv4_addr(tokens[7], &daddr) != 0) {
2408 snprintf(out, out_size, MSG_ARG_INVALID, "da");
2411 m->match.acl.ipv4.da = rte_be_to_cpu_32(daddr.s_addr);
2412 } else if (strcmp(tokens[4], "ipv6") == 0) {
2413 struct in6_addr saddr, daddr;
2415 m->match.acl.ip_version = 0;
2417 if (parse_ipv6_addr(tokens[5], &saddr) != 0) {
2418 snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2421 memcpy(m->match.acl.ipv6.sa, saddr.s6_addr, 16);
2423 if (parse_ipv6_addr(tokens[7], &daddr) != 0) {
2424 snprintf(out, out_size, MSG_ARG_INVALID, "da");
2427 memcpy(m->match.acl.ipv6.da, daddr.s6_addr, 16);
2429 snprintf(out, out_size, MSG_ARG_NOT_FOUND,
2434 if (parser_read_uint32(&m->match.acl.sa_depth,
2436 snprintf(out, out_size, MSG_ARG_INVALID, "sa_depth");
2440 if (parser_read_uint32(&m->match.acl.da_depth,
2442 snprintf(out, out_size, MSG_ARG_INVALID, "da_depth");
2446 if (parser_read_uint16(&m->match.acl.sp0, tokens[9]) != 0) {
2447 snprintf(out, out_size, MSG_ARG_INVALID, "sp0");
2451 if (parser_read_uint16(&m->match.acl.sp1, tokens[10]) != 0) {
2452 snprintf(out, out_size, MSG_ARG_INVALID, "sp1");
2456 if (parser_read_uint16(&m->match.acl.dp0, tokens[11]) != 0) {
2457 snprintf(out, out_size, MSG_ARG_INVALID, "dp0");
2461 if (parser_read_uint16(&m->match.acl.dp1, tokens[12]) != 0) {
2462 snprintf(out, out_size, MSG_ARG_INVALID, "dp1");
2466 if (parser_read_uint8(&m->match.acl.proto, tokens[13]) != 0) {
2467 snprintf(out, out_size, MSG_ARG_INVALID, "proto");
2471 m->match.acl.proto_mask = 0xff;
2476 if (strcmp(tokens[1], "array") == 0) {
2478 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2482 m->match_type = TABLE_ARRAY;
2484 if (parser_read_uint32(&m->match.array.pos, tokens[2]) != 0) {
2485 snprintf(out, out_size, MSG_ARG_INVALID, "pos");
2492 if (strcmp(tokens[1], "hash") == 0) {
2494 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2498 m->match_type = TABLE_HASH;
2500 if (strcmp(tokens[2], "raw") == 0) {
2501 uint32_t key_size = TABLE_RULE_MATCH_SIZE_MAX;
2504 snprintf(out, out_size, MSG_ARG_MISMATCH,
2509 if (parse_hex_string(tokens[3],
2510 m->match.hash.key, &key_size) != 0) {
2511 snprintf(out, out_size, MSG_ARG_INVALID, "key");
2518 if (strcmp(tokens[2], "ipv4_5tuple") == 0) {
2519 struct pkt_key_ipv4_5tuple *ipv4 =
2520 (struct pkt_key_ipv4_5tuple *) m->match.hash.key;
2521 struct in_addr saddr, daddr;
2526 snprintf(out, out_size, MSG_ARG_MISMATCH,
2531 if (parse_ipv4_addr(tokens[3], &saddr) != 0) {
2532 snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2536 if (parse_ipv4_addr(tokens[4], &daddr) != 0) {
2537 snprintf(out, out_size, MSG_ARG_INVALID, "da");
2541 if (parser_read_uint16(&sp, tokens[5]) != 0) {
2542 snprintf(out, out_size, MSG_ARG_INVALID, "sp");
2546 if (parser_read_uint16(&dp, tokens[6]) != 0) {
2547 snprintf(out, out_size, MSG_ARG_INVALID, "dp");
2551 if (parser_read_uint8(&proto, tokens[7]) != 0) {
2552 snprintf(out, out_size, MSG_ARG_INVALID,
2557 ipv4->sa = saddr.s_addr;
2558 ipv4->da = daddr.s_addr;
2559 ipv4->sp = rte_cpu_to_be_16(sp);
2560 ipv4->dp = rte_cpu_to_be_16(dp);
2561 ipv4->proto = proto;
2564 } /* hash ipv4_5tuple */
2566 if (strcmp(tokens[2], "ipv6_5tuple") == 0) {
2567 struct pkt_key_ipv6_5tuple *ipv6 =
2568 (struct pkt_key_ipv6_5tuple *) m->match.hash.key;
2569 struct in6_addr saddr, daddr;
2574 snprintf(out, out_size, MSG_ARG_MISMATCH,
2579 if (parse_ipv6_addr(tokens[3], &saddr) != 0) {
2580 snprintf(out, out_size, MSG_ARG_INVALID, "sa");
2584 if (parse_ipv6_addr(tokens[4], &daddr) != 0) {
2585 snprintf(out, out_size, MSG_ARG_INVALID, "da");
2589 if (parser_read_uint16(&sp, tokens[5]) != 0) {
2590 snprintf(out, out_size, MSG_ARG_INVALID, "sp");
2594 if (parser_read_uint16(&dp, tokens[6]) != 0) {
2595 snprintf(out, out_size, MSG_ARG_INVALID, "dp");
2599 if (parser_read_uint8(&proto, tokens[7]) != 0) {
2600 snprintf(out, out_size, MSG_ARG_INVALID,
2605 memcpy(ipv6->sa, saddr.s6_addr, 16);
2606 memcpy(ipv6->da, daddr.s6_addr, 16);
2607 ipv6->sp = rte_cpu_to_be_16(sp);
2608 ipv6->dp = rte_cpu_to_be_16(dp);
2609 ipv6->proto = proto;
2612 } /* hash ipv6_5tuple */
2614 if (strcmp(tokens[2], "ipv4_addr") == 0) {
2615 struct pkt_key_ipv4_addr *ipv4_addr =
2616 (struct pkt_key_ipv4_addr *) m->match.hash.key;
2617 struct in_addr addr;
2620 snprintf(out, out_size, MSG_ARG_MISMATCH,
2625 if (parse_ipv4_addr(tokens[3], &addr) != 0) {
2626 snprintf(out, out_size, MSG_ARG_INVALID,
2631 ipv4_addr->addr = addr.s_addr;
2634 } /* hash ipv4_addr */
2636 if (strcmp(tokens[2], "ipv6_addr") == 0) {
2637 struct pkt_key_ipv6_addr *ipv6_addr =
2638 (struct pkt_key_ipv6_addr *) m->match.hash.key;
2639 struct in6_addr addr;
2642 snprintf(out, out_size, MSG_ARG_MISMATCH,
2647 if (parse_ipv6_addr(tokens[3], &addr) != 0) {
2648 snprintf(out, out_size, MSG_ARG_INVALID,
2653 memcpy(ipv6_addr->addr, addr.s6_addr, 16);
2656 } /* hash ipv6_5tuple */
2658 if (strcmp(tokens[2], "qinq") == 0) {
2659 struct pkt_key_qinq *qinq =
2660 (struct pkt_key_qinq *) m->match.hash.key;
2661 uint16_t svlan, cvlan;
2664 snprintf(out, out_size, MSG_ARG_MISMATCH,
2669 if ((parser_read_uint16(&svlan, tokens[3]) != 0) ||
2671 snprintf(out, out_size, MSG_ARG_INVALID,
2676 if ((parser_read_uint16(&cvlan, tokens[4]) != 0) ||
2678 snprintf(out, out_size, MSG_ARG_INVALID,
2683 qinq->svlan = rte_cpu_to_be_16(svlan);
2684 qinq->cvlan = rte_cpu_to_be_16(cvlan);
2689 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2693 if (strcmp(tokens[1], "lpm") == 0) {
2695 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
2699 m->match_type = TABLE_LPM;
2701 if (strcmp(tokens[2], "ipv4") == 0) {
2702 struct in_addr addr;
2704 m->match.lpm.ip_version = 1;
2706 if (parse_ipv4_addr(tokens[3], &addr) != 0) {
2707 snprintf(out, out_size, MSG_ARG_INVALID,
2712 m->match.lpm.ipv4 = rte_be_to_cpu_32(addr.s_addr);
2713 } else if (strcmp(tokens[2], "ipv6") == 0) {
2714 struct in6_addr addr;
2716 m->match.lpm.ip_version = 0;
2718 if (parse_ipv6_addr(tokens[3], &addr) != 0) {
2719 snprintf(out, out_size, MSG_ARG_INVALID,
2724 memcpy(m->match.lpm.ipv6, addr.s6_addr, 16);
2726 snprintf(out, out_size, MSG_ARG_MISMATCH,
2731 if (parser_read_uint8(&m->match.lpm.depth, tokens[4]) != 0) {
2732 snprintf(out, out_size, MSG_ARG_INVALID, "depth");
2739 snprintf(out, out_size, MSG_ARG_MISMATCH,
2740 "acl or array or hash or lpm");
2752 * | table <table_id>
2753 * [balance <out0> ... <out7>]
2755 * tc0 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
2756 * [tc1 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
2757 * tc2 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
2758 * tc3 meter <meter_profile_id> policer g <pa> y <pa> r <pa>]]
2759 * [tm subport <subport_id> pipe <pipe_id>]
2762 * | vlan <da> <sa> <pcp> <dei> <vid>
2763 * | qinq <da> <sa> <pcp> <dei> <vid> <pcp> <dei> <vid>
2764 * | mpls unicast | multicast
2766 * label0 <label> <tc> <ttl>
2767 * [label1 <label> <tc> <ttl>
2768 * [label2 <label> <tc> <ttl>
2769 * [label3 <label> <tc> <ttl>]]]
2770 * | pppoe <da> <sa> <session_id>]
2771 * [nat ipv4 | ipv6 <addr> <port>]
2777 * <pa> ::= g | y | r | drop
2780 parse_table_action_fwd(char **tokens,
2782 struct table_rule_action *a)
2784 if ((n_tokens == 0) || (strcmp(tokens[0], "fwd") != 0))
2790 if (n_tokens && (strcmp(tokens[0], "drop") == 0)) {
2791 a->fwd.action = RTE_PIPELINE_ACTION_DROP;
2792 a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
2796 if (n_tokens && (strcmp(tokens[0], "port") == 0)) {
2799 if ((n_tokens < 2) ||
2800 parser_read_uint32(&id, tokens[1]))
2803 a->fwd.action = RTE_PIPELINE_ACTION_PORT;
2805 a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
2809 if (n_tokens && (strcmp(tokens[0], "meta") == 0)) {
2810 a->fwd.action = RTE_PIPELINE_ACTION_PORT_META;
2811 a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
2815 if (n_tokens && (strcmp(tokens[0], "table") == 0)) {
2818 if ((n_tokens < 2) ||
2819 parser_read_uint32(&id, tokens[1]))
2822 a->fwd.action = RTE_PIPELINE_ACTION_TABLE;
2824 a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
2832 parse_table_action_balance(char **tokens,
2834 struct table_rule_action *a)
2838 if ((n_tokens == 0) || (strcmp(tokens[0], "balance") != 0))
2844 if (n_tokens < RTE_TABLE_ACTION_LB_TABLE_SIZE)
2847 for (i = 0; i < RTE_TABLE_ACTION_LB_TABLE_SIZE; i++)
2848 if (parser_read_uint32(&a->lb.out[i], tokens[i]) != 0)
2851 a->action_mask |= 1 << RTE_TABLE_ACTION_LB;
2852 return 1 + RTE_TABLE_ACTION_LB_TABLE_SIZE;
2857 parse_policer_action(char *token, enum rte_table_action_policer *a)
2859 if (strcmp(token, "g") == 0) {
2860 *a = RTE_TABLE_ACTION_POLICER_COLOR_GREEN;
2864 if (strcmp(token, "y") == 0) {
2865 *a = RTE_TABLE_ACTION_POLICER_COLOR_YELLOW;
2869 if (strcmp(token, "r") == 0) {
2870 *a = RTE_TABLE_ACTION_POLICER_COLOR_RED;
2874 if (strcmp(token, "drop") == 0) {
2875 *a = RTE_TABLE_ACTION_POLICER_DROP;
2883 parse_table_action_meter_tc(char **tokens,
2885 struct rte_table_action_mtr_tc_params *mtr)
2887 if ((n_tokens < 9) ||
2888 strcmp(tokens[0], "meter") ||
2889 parser_read_uint32(&mtr->meter_profile_id, tokens[1]) ||
2890 strcmp(tokens[2], "policer") ||
2891 strcmp(tokens[3], "g") ||
2892 parse_policer_action(tokens[4], &mtr->policer[e_RTE_METER_GREEN]) ||
2893 strcmp(tokens[5], "y") ||
2894 parse_policer_action(tokens[6], &mtr->policer[e_RTE_METER_YELLOW]) ||
2895 strcmp(tokens[7], "r") ||
2896 parse_policer_action(tokens[8], &mtr->policer[e_RTE_METER_RED]))
2903 parse_table_action_meter(char **tokens,
2905 struct table_rule_action *a)
2907 if ((n_tokens == 0) || strcmp(tokens[0], "meter"))
2913 if ((n_tokens < 10) ||
2914 strcmp(tokens[0], "tc0") ||
2915 (parse_table_action_meter_tc(tokens + 1,
2917 &a->mtr.mtr[0]) == 0))
2923 if ((n_tokens == 0) || strcmp(tokens[0], "tc1")) {
2925 a->action_mask |= 1 << RTE_TABLE_ACTION_MTR;
2929 if ((n_tokens < 30) ||
2930 (parse_table_action_meter_tc(tokens + 1,
2931 n_tokens - 1, &a->mtr.mtr[1]) == 0) ||
2932 strcmp(tokens[10], "tc2") ||
2933 (parse_table_action_meter_tc(tokens + 11,
2934 n_tokens - 11, &a->mtr.mtr[2]) == 0) ||
2935 strcmp(tokens[20], "tc3") ||
2936 (parse_table_action_meter_tc(tokens + 21,
2937 n_tokens - 21, &a->mtr.mtr[3]) == 0))
2940 a->mtr.tc_mask = 0xF;
2941 a->action_mask |= 1 << RTE_TABLE_ACTION_MTR;
2942 return 1 + 10 + 3 * 10;
2946 parse_table_action_tm(char **tokens,
2948 struct table_rule_action *a)
2950 uint32_t subport_id, pipe_id;
2952 if ((n_tokens < 5) ||
2953 strcmp(tokens[0], "tm") ||
2954 strcmp(tokens[1], "subport") ||
2955 parser_read_uint32(&subport_id, tokens[2]) ||
2956 strcmp(tokens[3], "pipe") ||
2957 parser_read_uint32(&pipe_id, tokens[4]))
2960 a->tm.subport_id = subport_id;
2961 a->tm.pipe_id = pipe_id;
2962 a->action_mask |= 1 << RTE_TABLE_ACTION_TM;
2967 parse_table_action_encap(char **tokens,
2969 struct table_rule_action *a)
2971 if ((n_tokens == 0) || strcmp(tokens[0], "encap"))
2978 if (n_tokens && (strcmp(tokens[0], "ether") == 0)) {
2979 if ((n_tokens < 3) ||
2980 parse_mac_addr(tokens[1], &a->encap.ether.ether.da) ||
2981 parse_mac_addr(tokens[2], &a->encap.ether.ether.sa))
2984 a->encap.type = RTE_TABLE_ACTION_ENCAP_ETHER;
2985 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
2990 if (n_tokens && (strcmp(tokens[0], "vlan") == 0)) {
2991 uint32_t pcp, dei, vid;
2993 if ((n_tokens < 6) ||
2994 parse_mac_addr(tokens[1], &a->encap.vlan.ether.da) ||
2995 parse_mac_addr(tokens[2], &a->encap.vlan.ether.sa) ||
2996 parser_read_uint32(&pcp, tokens[3]) ||
2998 parser_read_uint32(&dei, tokens[4]) ||
3000 parser_read_uint32(&vid, tokens[5]) ||
3004 a->encap.vlan.vlan.pcp = pcp & 0x7;
3005 a->encap.vlan.vlan.dei = dei & 0x1;
3006 a->encap.vlan.vlan.vid = vid & 0xFFF;
3007 a->encap.type = RTE_TABLE_ACTION_ENCAP_VLAN;
3008 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3013 if (n_tokens && (strcmp(tokens[0], "qinq") == 0)) {
3014 uint32_t svlan_pcp, svlan_dei, svlan_vid;
3015 uint32_t cvlan_pcp, cvlan_dei, cvlan_vid;
3017 if ((n_tokens < 9) ||
3018 parse_mac_addr(tokens[1], &a->encap.qinq.ether.da) ||
3019 parse_mac_addr(tokens[2], &a->encap.qinq.ether.sa) ||
3020 parser_read_uint32(&svlan_pcp, tokens[3]) ||
3021 (svlan_pcp > 0x7) ||
3022 parser_read_uint32(&svlan_dei, tokens[4]) ||
3023 (svlan_dei > 0x1) ||
3024 parser_read_uint32(&svlan_vid, tokens[5]) ||
3025 (svlan_vid > 0xFFF) ||
3026 parser_read_uint32(&cvlan_pcp, tokens[6]) ||
3027 (cvlan_pcp > 0x7) ||
3028 parser_read_uint32(&cvlan_dei, tokens[7]) ||
3029 (cvlan_dei > 0x1) ||
3030 parser_read_uint32(&cvlan_vid, tokens[8]) ||
3031 (cvlan_vid > 0xFFF))
3034 a->encap.qinq.svlan.pcp = svlan_pcp & 0x7;
3035 a->encap.qinq.svlan.dei = svlan_dei & 0x1;
3036 a->encap.qinq.svlan.vid = svlan_vid & 0xFFF;
3037 a->encap.qinq.cvlan.pcp = cvlan_pcp & 0x7;
3038 a->encap.qinq.cvlan.dei = cvlan_dei & 0x1;
3039 a->encap.qinq.cvlan.vid = cvlan_vid & 0xFFF;
3040 a->encap.type = RTE_TABLE_ACTION_ENCAP_QINQ;
3041 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3046 if (n_tokens && (strcmp(tokens[0], "mpls") == 0)) {
3047 uint32_t label, tc, ttl;
3052 if (strcmp(tokens[1], "unicast") == 0)
3053 a->encap.mpls.unicast = 1;
3054 else if (strcmp(tokens[1], "multicast") == 0)
3055 a->encap.mpls.unicast = 0;
3059 if (parse_mac_addr(tokens[2], &a->encap.mpls.ether.da) ||
3060 parse_mac_addr(tokens[3], &a->encap.mpls.ether.sa) ||
3061 strcmp(tokens[4], "label0") ||
3062 parser_read_uint32(&label, tokens[5]) ||
3063 (label > 0xFFFFF) ||
3064 parser_read_uint32(&tc, tokens[6]) ||
3066 parser_read_uint32(&ttl, tokens[7]) ||
3070 a->encap.mpls.mpls[0].label = label;
3071 a->encap.mpls.mpls[0].tc = tc;
3072 a->encap.mpls.mpls[0].ttl = ttl;
3077 if ((n_tokens == 0) || strcmp(tokens[0], "label1")) {
3078 a->encap.mpls.mpls_count = 1;
3079 a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3080 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3084 if ((n_tokens < 4) ||
3085 parser_read_uint32(&label, tokens[1]) ||
3086 (label > 0xFFFFF) ||
3087 parser_read_uint32(&tc, tokens[2]) ||
3089 parser_read_uint32(&ttl, tokens[3]) ||
3093 a->encap.mpls.mpls[1].label = label;
3094 a->encap.mpls.mpls[1].tc = tc;
3095 a->encap.mpls.mpls[1].ttl = ttl;
3100 if ((n_tokens == 0) || strcmp(tokens[0], "label2")) {
3101 a->encap.mpls.mpls_count = 2;
3102 a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3103 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3107 if ((n_tokens < 4) ||
3108 parser_read_uint32(&label, tokens[1]) ||
3109 (label > 0xFFFFF) ||
3110 parser_read_uint32(&tc, tokens[2]) ||
3112 parser_read_uint32(&ttl, tokens[3]) ||
3116 a->encap.mpls.mpls[2].label = label;
3117 a->encap.mpls.mpls[2].tc = tc;
3118 a->encap.mpls.mpls[2].ttl = ttl;
3123 if ((n_tokens == 0) || strcmp(tokens[0], "label3")) {
3124 a->encap.mpls.mpls_count = 3;
3125 a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3126 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3127 return 1 + 8 + 4 + 4;
3130 if ((n_tokens < 4) ||
3131 parser_read_uint32(&label, tokens[1]) ||
3132 (label > 0xFFFFF) ||
3133 parser_read_uint32(&tc, tokens[2]) ||
3135 parser_read_uint32(&ttl, tokens[3]) ||
3139 a->encap.mpls.mpls[3].label = label;
3140 a->encap.mpls.mpls[3].tc = tc;
3141 a->encap.mpls.mpls[3].ttl = ttl;
3143 a->encap.mpls.mpls_count = 4;
3144 a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
3145 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3146 return 1 + 8 + 4 + 4 + 4;
3150 if (n_tokens && (strcmp(tokens[0], "pppoe") == 0)) {
3151 if ((n_tokens < 4) ||
3152 parse_mac_addr(tokens[1], &a->encap.pppoe.ether.da) ||
3153 parse_mac_addr(tokens[2], &a->encap.pppoe.ether.sa) ||
3154 parser_read_uint16(&a->encap.pppoe.pppoe.session_id,
3158 a->encap.type = RTE_TABLE_ACTION_ENCAP_PPPOE;
3159 a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
3167 parse_table_action_nat(char **tokens,
3169 struct table_rule_action *a)
3171 if ((n_tokens < 4) ||
3172 strcmp(tokens[0], "nat"))
3175 if (strcmp(tokens[1], "ipv4") == 0) {
3176 struct in_addr addr;
3179 if (parse_ipv4_addr(tokens[2], &addr) ||
3180 parser_read_uint16(&port, tokens[3]))
3183 a->nat.ip_version = 1;
3184 a->nat.addr.ipv4 = rte_be_to_cpu_32(addr.s_addr);
3186 a->action_mask |= 1 << RTE_TABLE_ACTION_NAT;
3190 if (strcmp(tokens[1], "ipv6") == 0) {
3191 struct in6_addr addr;
3194 if (parse_ipv6_addr(tokens[2], &addr) ||
3195 parser_read_uint16(&port, tokens[3]))
3198 a->nat.ip_version = 0;
3199 memcpy(a->nat.addr.ipv6, addr.s6_addr, 16);
3201 a->action_mask |= 1 << RTE_TABLE_ACTION_NAT;
3209 parse_table_action_ttl(char **tokens,
3211 struct table_rule_action *a)
3213 if ((n_tokens < 2) ||
3214 strcmp(tokens[0], "ttl"))
3217 if (strcmp(tokens[1], "dec") == 0)
3218 a->ttl.decrement = 1;
3219 else if (strcmp(tokens[1], "keep") == 0)
3220 a->ttl.decrement = 0;
3224 a->action_mask |= 1 << RTE_TABLE_ACTION_TTL;
3229 parse_table_action_stats(char **tokens,
3231 struct table_rule_action *a)
3233 if ((n_tokens < 1) ||
3234 strcmp(tokens[0], "stats"))
3237 a->stats.n_packets = 0;
3238 a->stats.n_bytes = 0;
3239 a->action_mask |= 1 << RTE_TABLE_ACTION_STATS;
3244 parse_table_action_time(char **tokens,
3246 struct table_rule_action *a)
3248 if ((n_tokens < 1) ||
3249 strcmp(tokens[0], "time"))
3252 a->time.time = rte_rdtsc();
3253 a->action_mask |= 1 << RTE_TABLE_ACTION_TIME;
3258 parse_table_action(char **tokens,
3262 struct table_rule_action *a)
3264 uint32_t n_tokens0 = n_tokens;
3266 memset(a, 0, sizeof(*a));
3268 if ((n_tokens < 2) ||
3269 strcmp(tokens[0], "action"))
3275 if (n_tokens && (strcmp(tokens[0], "fwd") == 0)) {
3278 n = parse_table_action_fwd(tokens, n_tokens, a);
3280 snprintf(out, out_size, MSG_ARG_INVALID,
3289 if (n_tokens && (strcmp(tokens[0], "balance") == 0)) {
3292 n = parse_table_action_balance(tokens, n_tokens, a);
3294 snprintf(out, out_size, MSG_ARG_INVALID,
3303 if (n_tokens && (strcmp(tokens[0], "meter") == 0)) {
3306 n = parse_table_action_meter(tokens, n_tokens, a);
3308 snprintf(out, out_size, MSG_ARG_INVALID,
3317 if (n_tokens && (strcmp(tokens[0], "tm") == 0)) {
3320 n = parse_table_action_tm(tokens, n_tokens, a);
3322 snprintf(out, out_size, MSG_ARG_INVALID,
3331 if (n_tokens && (strcmp(tokens[0], "encap") == 0)) {
3334 n = parse_table_action_encap(tokens, n_tokens, a);
3336 snprintf(out, out_size, MSG_ARG_INVALID,
3345 if (n_tokens && (strcmp(tokens[0], "nat") == 0)) {
3348 n = parse_table_action_nat(tokens, n_tokens, a);
3350 snprintf(out, out_size, MSG_ARG_INVALID,
3359 if (n_tokens && (strcmp(tokens[0], "ttl") == 0)) {
3362 n = parse_table_action_ttl(tokens, n_tokens, a);
3364 snprintf(out, out_size, MSG_ARG_INVALID,
3373 if (n_tokens && (strcmp(tokens[0], "stats") == 0)) {
3376 n = parse_table_action_stats(tokens, n_tokens, a);
3378 snprintf(out, out_size, MSG_ARG_INVALID,
3387 if (n_tokens && (strcmp(tokens[0], "time") == 0)) {
3390 n = parse_table_action_time(tokens, n_tokens, a);
3392 snprintf(out, out_size, MSG_ARG_INVALID,
3401 if (n_tokens0 - n_tokens == 1) {
3402 snprintf(out, out_size, MSG_ARG_INVALID, "action");
3406 return n_tokens0 - n_tokens;
3410 * pipeline <pipeline_name> table <table_id> rule add
3412 * action <table_action>
3415 cmd_pipeline_table_rule_add(char **tokens,
3420 struct table_rule_match m;
3421 struct table_rule_action a;
3422 char *pipeline_name;
3424 uint32_t table_id, t0, n_tokens_parsed;
3428 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3432 pipeline_name = tokens[1];
3434 if (strcmp(tokens[2], "table") != 0) {
3435 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
3439 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
3440 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
3444 if (strcmp(tokens[4], "rule") != 0) {
3445 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
3449 if (strcmp(tokens[5], "add") != 0) {
3450 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
3457 n_tokens_parsed = parse_match(tokens + t0,
3462 if (n_tokens_parsed == 0)
3464 t0 += n_tokens_parsed;
3467 n_tokens_parsed = parse_table_action(tokens + t0,
3472 if (n_tokens_parsed == 0)
3474 t0 += n_tokens_parsed;
3476 if (t0 != n_tokens) {
3477 snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
3481 status = pipeline_table_rule_add(pipeline_name, table_id,
3484 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
3490 * pipeline <pipeline_name> table <table_id> rule add
3498 * | table <table_id>
3501 cmd_pipeline_table_rule_add_default(char **tokens,
3506 struct table_rule_action action;
3508 char *pipeline_name;
3512 if ((n_tokens != 11) && (n_tokens != 12)) {
3513 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3517 pipeline_name = tokens[1];
3519 if (strcmp(tokens[2], "table") != 0) {
3520 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
3524 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
3525 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
3529 if (strcmp(tokens[4], "rule") != 0) {
3530 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
3534 if (strcmp(tokens[5], "add") != 0) {
3535 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
3539 if (strcmp(tokens[6], "match") != 0) {
3540 snprintf(out, out_size, MSG_ARG_INVALID, "match");
3544 if (strcmp(tokens[7], "default") != 0) {
3545 snprintf(out, out_size, MSG_ARG_INVALID, "default");
3549 if (strcmp(tokens[8], "action") != 0) {
3550 snprintf(out, out_size, MSG_ARG_INVALID, "action");
3554 if (strcmp(tokens[9], "fwd") != 0) {
3555 snprintf(out, out_size, MSG_ARG_INVALID, "fwd");
3559 action.action_mask = 1 << RTE_TABLE_ACTION_FWD;
3561 if (strcmp(tokens[10], "drop") == 0) {
3562 if (n_tokens != 11) {
3563 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3567 action.fwd.action = RTE_PIPELINE_ACTION_DROP;
3568 } else if (strcmp(tokens[10], "port") == 0) {
3571 if (n_tokens != 12) {
3572 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3576 if (parser_read_uint32(&id, tokens[11]) != 0) {
3577 snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
3581 action.fwd.action = RTE_PIPELINE_ACTION_PORT;
3583 } else if (strcmp(tokens[10], "meta") == 0) {
3584 if (n_tokens != 11) {
3585 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3589 action.fwd.action = RTE_PIPELINE_ACTION_PORT_META;
3590 } else if (strcmp(tokens[10], "table") == 0) {
3593 if (n_tokens != 12) {
3594 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3598 if (parser_read_uint32(&id, tokens[11]) != 0) {
3599 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
3603 action.fwd.action = RTE_PIPELINE_ACTION_TABLE;
3606 snprintf(out, out_size, MSG_ARG_INVALID,
3607 "drop or port or meta or table");
3611 status = pipeline_table_rule_add_default(pipeline_name,
3616 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
3622 * pipeline <pipeline_name> table <table_id> rule add bulk <file_name> <n_rules>
3625 * - line format: match <match> action <action>
3628 cli_rule_file_process(const char *file_name,
3629 size_t line_len_max,
3630 struct table_rule_match *m,
3631 struct table_rule_action *a,
3633 uint32_t *line_number,
3638 cmd_pipeline_table_rule_add_bulk(char **tokens,
3643 struct table_rule_match *match;
3644 struct table_rule_action *action;
3646 char *pipeline_name, *file_name;
3647 uint32_t table_id, n_rules, n_rules_parsed, line_number;
3650 if (n_tokens != 9) {
3651 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3655 pipeline_name = tokens[1];
3657 if (strcmp(tokens[2], "table") != 0) {
3658 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
3662 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
3663 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
3667 if (strcmp(tokens[4], "rule") != 0) {
3668 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
3672 if (strcmp(tokens[5], "add") != 0) {
3673 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
3677 if (strcmp(tokens[6], "bulk") != 0) {
3678 snprintf(out, out_size, MSG_ARG_INVALID, "bulk");
3682 file_name = tokens[7];
3684 if ((parser_read_uint32(&n_rules, tokens[8]) != 0) ||
3686 snprintf(out, out_size, MSG_ARG_INVALID, "n_rules");
3690 /* Memory allocation. */
3691 match = calloc(n_rules, sizeof(struct table_rule_match));
3692 action = calloc(n_rules, sizeof(struct table_rule_action));
3693 data = calloc(n_rules, sizeof(void *));
3694 if ((match == NULL) || (action == NULL) || (data == NULL)) {
3695 snprintf(out, out_size, MSG_OUT_OF_MEMORY);
3702 /* Load rule file */
3703 n_rules_parsed = n_rules;
3704 status = cli_rule_file_process(file_name,
3713 snprintf(out, out_size, MSG_FILE_ERR, file_name, line_number);
3719 if (n_rules_parsed != n_rules) {
3720 snprintf(out, out_size, MSG_FILE_NOT_ENOUGH, file_name);
3728 status = pipeline_table_rule_add_bulk(pipeline_name,
3735 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
3749 * pipeline <pipeline_name> table <table_id> rule delete
3753 cmd_pipeline_table_rule_delete(char **tokens,
3758 struct table_rule_match m;
3759 char *pipeline_name;
3760 uint32_t table_id, n_tokens_parsed, t0;
3764 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3768 pipeline_name = tokens[1];
3770 if (strcmp(tokens[2], "table") != 0) {
3771 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
3775 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
3776 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
3780 if (strcmp(tokens[4], "rule") != 0) {
3781 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
3785 if (strcmp(tokens[5], "delete") != 0) {
3786 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
3793 n_tokens_parsed = parse_match(tokens + t0,
3798 if (n_tokens_parsed == 0)
3800 t0 += n_tokens_parsed;
3802 if (n_tokens != t0) {
3803 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3807 status = pipeline_table_rule_delete(pipeline_name,
3811 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
3817 * pipeline <pipeline_name> table <table_id> rule delete
3822 cmd_pipeline_table_rule_delete_default(char **tokens,
3827 char *pipeline_name;
3831 if (n_tokens != 8) {
3832 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3836 pipeline_name = tokens[1];
3838 if (strcmp(tokens[2], "table") != 0) {
3839 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
3843 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
3844 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
3848 if (strcmp(tokens[4], "rule") != 0) {
3849 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
3853 if (strcmp(tokens[5], "delete") != 0) {
3854 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
3858 if (strcmp(tokens[6], "match") != 0) {
3859 snprintf(out, out_size, MSG_ARG_INVALID, "match");
3863 if (strcmp(tokens[7], "default") != 0) {
3864 snprintf(out, out_size, MSG_ARG_INVALID, "default");
3868 status = pipeline_table_rule_delete_default(pipeline_name,
3871 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
3877 * pipeline <pipeline_name> table <table_id> rule read stats [clear]
3880 cmd_pipeline_table_rule_stats_read(char **tokens,
3881 uint32_t n_tokens __rte_unused,
3885 snprintf(out, out_size, MSG_CMD_UNIMPLEM, tokens[0]);
3889 * pipeline <pipeline_name> table <table_id> meter profile <meter_profile_id>
3890 * add srtcm cir <cir> cbs <cbs> ebs <ebs>
3891 * | trtcm cir <cir> pir <pir> cbs <cbs> pbs <pbs>
3894 cmd_pipeline_table_meter_profile_add(char **tokens,
3899 struct rte_table_action_meter_profile p;
3900 char *pipeline_name;
3901 uint32_t table_id, meter_profile_id;
3905 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3909 pipeline_name = tokens[1];
3911 if (strcmp(tokens[2], "table") != 0) {
3912 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
3916 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
3917 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
3921 if (strcmp(tokens[4], "meter") != 0) {
3922 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "meter");
3926 if (strcmp(tokens[5], "profile") != 0) {
3927 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
3931 if (parser_read_uint32(&meter_profile_id, tokens[6]) != 0) {
3932 snprintf(out, out_size, MSG_ARG_INVALID, "meter_profile_id");
3936 if (strcmp(tokens[7], "add") != 0) {
3937 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
3941 if (strcmp(tokens[8], "srtcm") == 0) {
3942 if (n_tokens != 15) {
3943 snprintf(out, out_size, MSG_ARG_MISMATCH,
3948 p.alg = RTE_TABLE_ACTION_METER_SRTCM;
3950 if (strcmp(tokens[9], "cir") != 0) {
3951 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cir");
3955 if (parser_read_uint64(&p.srtcm.cir, tokens[10]) != 0) {
3956 snprintf(out, out_size, MSG_ARG_INVALID, "cir");
3960 if (strcmp(tokens[11], "cbs") != 0) {
3961 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cbs");
3965 if (parser_read_uint64(&p.srtcm.cbs, tokens[12]) != 0) {
3966 snprintf(out, out_size, MSG_ARG_INVALID, "cbs");
3970 if (strcmp(tokens[13], "ebs") != 0) {
3971 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "ebs");
3975 if (parser_read_uint64(&p.srtcm.ebs, tokens[14]) != 0) {
3976 snprintf(out, out_size, MSG_ARG_INVALID, "ebs");
3979 } else if (strcmp(tokens[8], "trtcm") == 0) {
3980 if (n_tokens != 17) {
3981 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
3985 p.alg = RTE_TABLE_ACTION_METER_TRTCM;
3987 if (strcmp(tokens[9], "cir") != 0) {
3988 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cir");
3992 if (parser_read_uint64(&p.trtcm.cir, tokens[10]) != 0) {
3993 snprintf(out, out_size, MSG_ARG_INVALID, "cir");
3997 if (strcmp(tokens[11], "pir") != 0) {
3998 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pir");
4002 if (parser_read_uint64(&p.trtcm.pir, tokens[12]) != 0) {
4003 snprintf(out, out_size, MSG_ARG_INVALID, "pir");
4006 if (strcmp(tokens[13], "cbs") != 0) {
4007 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cbs");
4011 if (parser_read_uint64(&p.trtcm.cbs, tokens[14]) != 0) {
4012 snprintf(out, out_size, MSG_ARG_INVALID, "cbs");
4016 if (strcmp(tokens[15], "pbs") != 0) {
4017 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pbs");
4021 if (parser_read_uint64(&p.trtcm.pbs, tokens[16]) != 0) {
4022 snprintf(out, out_size, MSG_ARG_INVALID, "pbs");
4026 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4030 status = pipeline_table_mtr_profile_add(pipeline_name,
4035 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4041 * pipeline <pipeline_name> table <table_id>
4042 * meter profile <meter_profile_id> delete
4045 cmd_pipeline_table_meter_profile_delete(char **tokens,
4050 char *pipeline_name;
4051 uint32_t table_id, meter_profile_id;
4054 if (n_tokens != 8) {
4055 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4059 pipeline_name = tokens[1];
4061 if (strcmp(tokens[2], "table") != 0) {
4062 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
4066 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
4067 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4071 if (strcmp(tokens[4], "meter") != 0) {
4072 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "meter");
4076 if (strcmp(tokens[5], "profile") != 0) {
4077 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
4081 if (parser_read_uint32(&meter_profile_id, tokens[6]) != 0) {
4082 snprintf(out, out_size, MSG_ARG_INVALID, "meter_profile_id");
4086 if (strcmp(tokens[7], "delete") != 0) {
4087 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
4091 status = pipeline_table_mtr_profile_delete(pipeline_name,
4095 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4101 * pipeline <pipeline_name> table <table_id> rule read meter [clear]
4104 cmd_pipeline_table_rule_meter_read(char **tokens,
4105 uint32_t n_tokens __rte_unused,
4109 snprintf(out, out_size, MSG_CMD_UNIMPLEM, tokens[0]);
4113 * pipeline <pipeline_name> table <table_id> dscp <file_name>
4116 * - exactly 64 lines
4117 * - line format: <tc_id> <tc_queue_id> <color>, with <color> as: g | y | r
4120 load_dscp_table(struct rte_table_action_dscp_table *dscp_table,
4121 const char *file_name,
4122 uint32_t *line_number)
4127 /* Check input arguments */
4128 if ((dscp_table == NULL) ||
4129 (file_name == NULL) ||
4130 (line_number == NULL)) {
4136 /* Open input file */
4137 f = fopen(file_name, "r");
4144 for (dscp = 0, l = 1; ; l++) {
4147 enum rte_meter_color color;
4148 uint32_t tc_id, tc_queue_id, n_tokens = RTE_DIM(tokens);
4150 if (fgets(line, sizeof(line), f) == NULL)
4153 if (is_comment(line))
4156 if (parse_tokenize_string(line, tokens, &n_tokens)) {
4165 if ((dscp >= RTE_DIM(dscp_table->entry)) ||
4166 (n_tokens != RTE_DIM(tokens)) ||
4167 parser_read_uint32(&tc_id, tokens[0]) ||
4168 (tc_id >= RTE_TABLE_ACTION_TC_MAX) ||
4169 parser_read_uint32(&tc_queue_id, tokens[1]) ||
4170 (tc_queue_id >= RTE_TABLE_ACTION_TC_QUEUE_MAX) ||
4171 (strlen(tokens[2]) != 1)) {
4177 switch (tokens[2][0]) {
4180 color = e_RTE_METER_GREEN;
4185 color = e_RTE_METER_YELLOW;
4190 color = e_RTE_METER_RED;
4199 dscp_table->entry[dscp].tc_id = tc_id;
4200 dscp_table->entry[dscp].tc_queue_id = tc_queue_id;
4201 dscp_table->entry[dscp].color = color;
4211 cmd_pipeline_table_dscp(char **tokens,
4216 struct rte_table_action_dscp_table dscp_table;
4217 char *pipeline_name, *file_name;
4218 uint32_t table_id, line_number;
4221 if (n_tokens != 6) {
4222 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4226 pipeline_name = tokens[1];
4228 if (strcmp(tokens[2], "table") != 0) {
4229 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
4233 if (parser_read_uint32(&table_id, tokens[3]) != 0) {
4234 snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
4238 if (strcmp(tokens[4], "dscp") != 0) {
4239 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "dscp");
4243 file_name = tokens[5];
4245 status = load_dscp_table(&dscp_table, file_name, &line_number);
4247 snprintf(out, out_size, MSG_FILE_ERR, file_name, line_number);
4251 status = pipeline_table_dscp_table_update(pipeline_name,
4256 snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
4262 * pipeline <pipeline_name> table <table_id> rule read ttl [clear]
4265 cmd_pipeline_table_rule_ttl_read(char **tokens,
4266 uint32_t n_tokens __rte_unused,
4270 snprintf(out, out_size, MSG_CMD_UNIMPLEM, tokens[0]);
4274 * thread <thread_id> pipeline <pipeline_name> enable
4277 cmd_thread_pipeline_enable(char **tokens,
4282 char *pipeline_name;
4286 if (n_tokens != 5) {
4287 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4291 if (parser_read_uint32(&thread_id, tokens[1]) != 0) {
4292 snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
4296 if (strcmp(tokens[2], "pipeline") != 0) {
4297 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipeline");
4301 pipeline_name = tokens[3];
4303 if (strcmp(tokens[4], "enable") != 0) {
4304 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "enable");
4308 status = thread_pipeline_enable(thread_id, pipeline_name);
4310 snprintf(out, out_size, MSG_CMD_FAIL, "thread pipeline enable");
4316 * thread <thread_id> pipeline <pipeline_name> disable
4319 cmd_thread_pipeline_disable(char **tokens,
4324 char *pipeline_name;
4328 if (n_tokens != 5) {
4329 snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
4333 if (parser_read_uint32(&thread_id, tokens[1]) != 0) {
4334 snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
4338 if (strcmp(tokens[2], "pipeline") != 0) {
4339 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipeline");
4343 pipeline_name = tokens[3];
4345 if (strcmp(tokens[4], "disable") != 0) {
4346 snprintf(out, out_size, MSG_ARG_NOT_FOUND, "disable");
4350 status = thread_pipeline_disable(thread_id, pipeline_name);
4352 snprintf(out, out_size, MSG_CMD_FAIL,
4353 "thread pipeline disable");
4359 cli_process(char *in, char *out, size_t out_size)
4361 char *tokens[CMD_MAX_TOKENS];
4362 uint32_t n_tokens = RTE_DIM(tokens);
4368 status = parse_tokenize_string(in, tokens, &n_tokens);
4370 snprintf(out, out_size, MSG_ARG_TOO_MANY, "");
4377 if (strcmp(tokens[0], "mempool") == 0) {
4378 cmd_mempool(tokens, n_tokens, out, out_size);
4382 if (strcmp(tokens[0], "link") == 0) {
4383 cmd_link(tokens, n_tokens, out, out_size);
4387 if (strcmp(tokens[0], "swq") == 0) {
4388 cmd_swq(tokens, n_tokens, out, out_size);
4392 if (strcmp(tokens[0], "tmgr") == 0) {
4393 if ((n_tokens >= 3) &&
4394 (strcmp(tokens[1], "subport") == 0) &&
4395 (strcmp(tokens[2], "profile") == 0)) {
4396 cmd_tmgr_subport_profile(tokens, n_tokens,
4401 if ((n_tokens >= 3) &&
4402 (strcmp(tokens[1], "pipe") == 0) &&
4403 (strcmp(tokens[2], "profile") == 0)) {
4404 cmd_tmgr_pipe_profile(tokens, n_tokens, out, out_size);
4408 if ((n_tokens >= 5) &&
4409 (strcmp(tokens[2], "subport") == 0) &&
4410 (strcmp(tokens[4], "profile") == 0)) {
4411 cmd_tmgr_subport(tokens, n_tokens, out, out_size);
4415 if ((n_tokens >= 5) &&
4416 (strcmp(tokens[2], "subport") == 0) &&
4417 (strcmp(tokens[4], "pipe") == 0)) {
4418 cmd_tmgr_subport_pipe(tokens, n_tokens, out, out_size);
4422 cmd_tmgr(tokens, n_tokens, out, out_size);
4426 if (strcmp(tokens[0], "tap") == 0) {
4427 cmd_tap(tokens, n_tokens, out, out_size);
4431 if (strcmp(tokens[0], "kni") == 0) {
4432 cmd_kni(tokens, n_tokens, out, out_size);
4436 if (strcmp(tokens[0], "port") == 0) {
4437 cmd_port_in_action_profile(tokens, n_tokens, out, out_size);
4441 if (strcmp(tokens[0], "table") == 0) {
4442 cmd_table_action_profile(tokens, n_tokens, out, out_size);
4446 if (strcmp(tokens[0], "pipeline") == 0) {
4447 if ((n_tokens >= 3) &&
4448 (strcmp(tokens[2], "period") == 0)) {
4449 cmd_pipeline(tokens, n_tokens, out, out_size);
4453 if ((n_tokens >= 5) &&
4454 (strcmp(tokens[2], "port") == 0) &&
4455 (strcmp(tokens[3], "in") == 0) &&
4456 (strcmp(tokens[4], "bsz") == 0)) {
4457 cmd_pipeline_port_in(tokens, n_tokens, out, out_size);
4461 if ((n_tokens >= 5) &&
4462 (strcmp(tokens[2], "port") == 0) &&
4463 (strcmp(tokens[3], "out") == 0) &&
4464 (strcmp(tokens[4], "bsz") == 0)) {
4465 cmd_pipeline_port_out(tokens, n_tokens, out, out_size);
4469 if ((n_tokens >= 4) &&
4470 (strcmp(tokens[2], "table") == 0) &&
4471 (strcmp(tokens[3], "match") == 0)) {
4472 cmd_pipeline_table(tokens, n_tokens, out, out_size);
4476 if ((n_tokens >= 6) &&
4477 (strcmp(tokens[2], "port") == 0) &&
4478 (strcmp(tokens[3], "in") == 0) &&
4479 (strcmp(tokens[5], "table") == 0)) {
4480 cmd_pipeline_port_in_table(tokens, n_tokens,
4485 if ((n_tokens >= 6) &&
4486 (strcmp(tokens[2], "port") == 0) &&
4487 (strcmp(tokens[3], "in") == 0) &&
4488 (strcmp(tokens[5], "stats") == 0)) {
4489 cmd_pipeline_port_in_stats(tokens, n_tokens,
4494 if ((n_tokens >= 6) &&
4495 (strcmp(tokens[2], "port") == 0) &&
4496 (strcmp(tokens[3], "in") == 0) &&
4497 (strcmp(tokens[5], "enable") == 0)) {
4498 cmd_pipeline_port_in_enable(tokens, n_tokens,
4503 if ((n_tokens >= 6) &&
4504 (strcmp(tokens[2], "port") == 0) &&
4505 (strcmp(tokens[3], "in") == 0) &&
4506 (strcmp(tokens[5], "disable") == 0)) {
4507 cmd_pipeline_port_in_disable(tokens, n_tokens,
4512 if ((n_tokens >= 6) &&
4513 (strcmp(tokens[2], "port") == 0) &&
4514 (strcmp(tokens[3], "out") == 0) &&
4515 (strcmp(tokens[5], "stats") == 0)) {
4516 cmd_pipeline_port_out_stats(tokens, n_tokens,
4521 if ((n_tokens >= 5) &&
4522 (strcmp(tokens[2], "table") == 0) &&
4523 (strcmp(tokens[4], "stats") == 0)) {
4524 cmd_pipeline_table_stats(tokens, n_tokens,
4529 if ((n_tokens >= 7) &&
4530 (strcmp(tokens[2], "table") == 0) &&
4531 (strcmp(tokens[4], "rule") == 0) &&
4532 (strcmp(tokens[5], "add") == 0) &&
4533 (strcmp(tokens[6], "match") == 0)) {
4534 if ((n_tokens >= 8) &&
4535 (strcmp(tokens[7], "default") == 0)) {
4536 cmd_pipeline_table_rule_add_default(tokens,
4537 n_tokens, out, out_size);
4541 cmd_pipeline_table_rule_add(tokens, n_tokens,
4546 if ((n_tokens >= 7) &&
4547 (strcmp(tokens[2], "table") == 0) &&
4548 (strcmp(tokens[4], "rule") == 0) &&
4549 (strcmp(tokens[5], "add") == 0) &&
4550 (strcmp(tokens[6], "bulk") == 0)) {
4551 cmd_pipeline_table_rule_add_bulk(tokens,
4552 n_tokens, out, out_size);
4556 if ((n_tokens >= 7) &&
4557 (strcmp(tokens[2], "table") == 0) &&
4558 (strcmp(tokens[4], "rule") == 0) &&
4559 (strcmp(tokens[5], "delete") == 0) &&
4560 (strcmp(tokens[6], "match") == 0)) {
4561 if ((n_tokens >= 8) &&
4562 (strcmp(tokens[7], "default") == 0)) {
4563 cmd_pipeline_table_rule_delete_default(tokens,
4564 n_tokens, out, out_size);
4568 cmd_pipeline_table_rule_delete(tokens, n_tokens,
4573 if ((n_tokens >= 7) &&
4574 (strcmp(tokens[2], "table") == 0) &&
4575 (strcmp(tokens[4], "rule") == 0) &&
4576 (strcmp(tokens[5], "read") == 0) &&
4577 (strcmp(tokens[6], "stats") == 0)) {
4578 cmd_pipeline_table_rule_stats_read(tokens, n_tokens,
4583 if ((n_tokens >= 8) &&
4584 (strcmp(tokens[2], "table") == 0) &&
4585 (strcmp(tokens[4], "meter") == 0) &&
4586 (strcmp(tokens[5], "profile") == 0) &&
4587 (strcmp(tokens[7], "add") == 0)) {
4588 cmd_pipeline_table_meter_profile_add(tokens, n_tokens,
4593 if ((n_tokens >= 8) &&
4594 (strcmp(tokens[2], "table") == 0) &&
4595 (strcmp(tokens[4], "meter") == 0) &&
4596 (strcmp(tokens[5], "profile") == 0) &&
4597 (strcmp(tokens[7], "delete") == 0)) {
4598 cmd_pipeline_table_meter_profile_delete(tokens,
4599 n_tokens, out, out_size);
4603 if ((n_tokens >= 7) &&
4604 (strcmp(tokens[2], "table") == 0) &&
4605 (strcmp(tokens[4], "rule") == 0) &&
4606 (strcmp(tokens[5], "read") == 0) &&
4607 (strcmp(tokens[6], "meter") == 0)) {
4608 cmd_pipeline_table_rule_meter_read(tokens, n_tokens,
4613 if ((n_tokens >= 5) &&
4614 (strcmp(tokens[2], "table") == 0) &&
4615 (strcmp(tokens[4], "dscp") == 0)) {
4616 cmd_pipeline_table_dscp(tokens, n_tokens,
4621 if ((n_tokens >= 7) &&
4622 (strcmp(tokens[2], "table") == 0) &&
4623 (strcmp(tokens[4], "rule") == 0) &&
4624 (strcmp(tokens[5], "read") == 0) &&
4625 (strcmp(tokens[6], "ttl") == 0)) {
4626 cmd_pipeline_table_rule_ttl_read(tokens, n_tokens,
4632 if (strcmp(tokens[0], "thread") == 0) {
4633 if ((n_tokens >= 5) &&
4634 (strcmp(tokens[4], "enable") == 0)) {
4635 cmd_thread_pipeline_enable(tokens, n_tokens,
4640 if ((n_tokens >= 5) &&
4641 (strcmp(tokens[4], "disable") == 0)) {
4642 cmd_thread_pipeline_disable(tokens, n_tokens,
4648 snprintf(out, out_size, MSG_CMD_UNKNOWN, tokens[0]);
4652 cli_script_process(const char *file_name,
4653 size_t msg_in_len_max,
4654 size_t msg_out_len_max)
4656 char *msg_in = NULL, *msg_out = NULL;
4659 /* Check input arguments */
4660 if ((file_name == NULL) ||
4661 (strlen(file_name) == 0) ||
4662 (msg_in_len_max == 0) ||
4663 (msg_out_len_max == 0))
4666 msg_in = malloc(msg_in_len_max + 1);
4667 msg_out = malloc(msg_out_len_max + 1);
4668 if ((msg_in == NULL) ||
4669 (msg_out == NULL)) {
4675 /* Open input file */
4676 f = fopen(file_name, "r");
4685 if (fgets(msg_in, msg_in_len_max + 1, f) == NULL)
4688 printf("%s", msg_in);
4695 if (strlen(msg_out))
4696 printf("%s", msg_out);
4707 cli_rule_file_process(const char *file_name,
4708 size_t line_len_max,
4709 struct table_rule_match *m,
4710 struct table_rule_action *a,
4712 uint32_t *line_number,
4718 uint32_t rule_id, line_id;
4721 /* Check input arguments */
4722 if ((file_name == NULL) ||
4723 (strlen(file_name) == 0) ||
4724 (line_len_max == 0)) {
4729 /* Memory allocation */
4730 line = malloc(line_len_max + 1);
4737 f = fopen(file_name, "r");
4745 for (line_id = 1, rule_id = 0; rule_id < *n_rules; line_id++) {
4746 char *tokens[CMD_MAX_TOKENS];
4747 uint32_t n_tokens, n_tokens_parsed, t0;
4749 /* Read next line from file. */
4750 if (fgets(line, line_len_max + 1, f) == NULL)
4754 if (is_comment(line))
4758 n_tokens = RTE_DIM(tokens);
4759 status = parse_tokenize_string(line, tokens, &n_tokens);
4771 n_tokens_parsed = parse_match(tokens + t0,
4776 if (n_tokens_parsed == 0) {
4780 t0 += n_tokens_parsed;
4783 n_tokens_parsed = parse_table_action(tokens + t0,
4788 if (n_tokens_parsed == 0) {
4792 t0 += n_tokens_parsed;
4794 /* Line completed. */
4795 if (t0 < n_tokens) {
4800 /* Increment rule count */
4811 *line_number = line_id;