xref: /dpdk/app/graph/cli.c (revision c6552d9a8deffa448de2d5e2e726f50508c1efd2)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2023 Marvell.
3  */
4 
5 #include <errno.h>
6 #include <stdio.h>
7 #include <stdint.h>
8 #include <stdlib.h>
9 #include <string.h>
10 
11 #include <cmdline_parse.h>
12 #include <cmdline_parse_num.h>
13 #include <cmdline_parse_string.h>
14 #include <cmdline_socket.h>
15 #include <rte_common.h>
16 
17 #include "module_api.h"
18 
19 #define CMD_MAX_TOKENS 256
20 #define MAX_LINE_SIZE 2048
21 
22 cmdline_parse_ctx_t modules_ctx[] = {
23 	(cmdline_parse_inst_t *)&graph_config_cmd_ctx,
24 	(cmdline_parse_inst_t *)&graph_start_cmd_ctx,
25 	(cmdline_parse_inst_t *)&graph_stats_cmd_ctx,
26 	(cmdline_parse_inst_t *)&graph_help_cmd_ctx,
27 	(cmdline_parse_inst_t *)&mempool_config_cmd_ctx,
28 	(cmdline_parse_inst_t *)&mempool_help_cmd_ctx,
29 	(cmdline_parse_inst_t *)&ethdev_show_cmd_ctx,
30 	(cmdline_parse_inst_t *)&ethdev_stats_cmd_ctx,
31 	(cmdline_parse_inst_t *)&ethdev_mtu_cmd_ctx,
32 	(cmdline_parse_inst_t *)&ethdev_prom_mode_cmd_ctx,
33 	(cmdline_parse_inst_t *)&ethdev_ip4_cmd_ctx,
34 	(cmdline_parse_inst_t *)&ethdev_ip6_cmd_ctx,
35 	(cmdline_parse_inst_t *)&ethdev_forward_cmd_ctx,
36 	(cmdline_parse_inst_t *)&ethdev_cmd_ctx,
37 	(cmdline_parse_inst_t *)&ethdev_help_cmd_ctx,
38 	(cmdline_parse_inst_t *)&ethdev_rx_cmd_ctx,
39 	(cmdline_parse_inst_t *)&ethdev_rx_help_cmd_ctx,
40 	(cmdline_parse_inst_t *)&ipv4_lookup_cmd_ctx,
41 	(cmdline_parse_inst_t *)&ipv4_lookup_help_cmd_ctx,
42 	(cmdline_parse_inst_t *)&ipv6_lookup_cmd_ctx,
43 	(cmdline_parse_inst_t *)&ipv6_lookup_help_cmd_ctx,
44 	(cmdline_parse_inst_t *)&neigh_v4_cmd_ctx,
45 	(cmdline_parse_inst_t *)&neigh_v6_cmd_ctx,
46 	(cmdline_parse_inst_t *)&neigh_help_cmd_ctx,
47 	NULL,
48 };
49 
50 static struct cmdline *cl;
51 
52 static int
53 is_comment(char *in)
54 {
55 	if ((strlen(in) && index("!#%;", in[0])) ||
56 		(strncmp(in, "//", 2) == 0) ||
57 		(strncmp(in, "--", 2) == 0))
58 		return 1;
59 
60 	return 0;
61 }
62 
63 void
64 cli_init(void)
65 {
66 	cl = cmdline_stdin_new(modules_ctx, "");
67 }
68 
69 void
70 cli_exit(void)
71 {
72 	cmdline_stdin_exit(cl);
73 }
74 
75 void
76 cli_process(char *in, char *out, size_t out_size, __rte_unused void *obj)
77 {
78 	int rc;
79 
80 	if (is_comment(in))
81 		return;
82 
83 	rc = cmdline_parse(cl, in);
84 	if (rc == CMDLINE_PARSE_AMBIGUOUS)
85 		snprintf(out, out_size, MSG_CMD_FAIL, "Ambiguous command");
86 	else if (rc == CMDLINE_PARSE_NOMATCH)
87 		snprintf(out, out_size, MSG_CMD_FAIL, "Command mismatch");
88 	else if (rc == CMDLINE_PARSE_BAD_ARGS)
89 		snprintf(out, out_size, MSG_CMD_FAIL, "Bad arguments");
90 
91 	return;
92 
93 }
94 
95 int
96 cli_script_process(const char *file_name, size_t msg_in_len_max, size_t msg_out_len_max, void *obj)
97 {
98 	char *msg_in = NULL, *msg_out = NULL;
99 	int rc = -EINVAL;
100 	FILE *f = NULL;
101 
102 	/* Check input arguments */
103 	if ((file_name == NULL) || (strlen(file_name) == 0) || (msg_in_len_max == 0) ||
104 	    (msg_out_len_max == 0))
105 		return rc;
106 
107 	msg_in = malloc(msg_in_len_max + 1);
108 	msg_out = malloc(msg_out_len_max + 1);
109 	if ((msg_in == NULL) || (msg_out == NULL)) {
110 		rc = -ENOMEM;
111 		goto exit;
112 	}
113 
114 	/* Open input file */
115 	f = fopen(file_name, "r");
116 	if (f == NULL) {
117 		rc = -EIO;
118 		goto exit;
119 	}
120 
121 	/* Read file */
122 	while (fgets(msg_in, msg_in_len_max, f) != NULL) {
123 		msg_out[0] = 0;
124 
125 		cli_process(msg_in, msg_out, msg_out_len_max, obj);
126 
127 		if (strlen(msg_out))
128 			printf("%s", msg_out);
129 	}
130 
131 	/* Close file */
132 	fclose(f);
133 	rc = 0;
134 
135 exit:
136 	free(msg_out);
137 	free(msg_in);
138 	return rc;
139 }
140