DPDK — CLI 指令行模块

懵懂的女人 提交于 2020-08-20 07:33:05

目录

DPDK CLI

当我们开发一个 DPDK App 时,可以利用 DPDK 提供的 CLI 工具为程序添加命令行实现。添加一个命令由四部分组成:

  1. 命令行参数的数据结构
  2. 命令行的功能实现函数
  3. 命令行解析
  4. 命令行初始化

命令行的参数

struct cmd_obj_add_result {                
	cmdline_fixed_string_t action;
	cmdline_fixed_string_t name;
	cmdline_ipaddr_t ip;
};

命令行的功能

static void cmd_obj_add_parsed(void *parsed_result,struct cmdline *cl, __attribute__((unused)) void *data)
{
	struct cmd_obj_add_result *res = parsed_result;   // 初始化命令行参数结构体;
	struct object *o;
	char ip_str[INET6_ADDRSTRLEN];
 
	SLIST_FOREACH(o, &global_obj_list, next) {
		if (!strcmp(res->name, o->name)) {
			cmdline_printf(cl, "Object %s already exist\n", res->name);
			return;
		}
		break;
	}
 
	o = malloc(sizeof(*o));
	if (!o) {
		cmdline_printf(cl, "mem error\n");
		return;
	}
	snprintf(o->name, sizeof(o->name), "%s", res->name);
	o->ip = res->ip;
	SLIST_INSERT_HEAD(&global_obj_list, o, next);
 
	if (o->ip.family == AF_INET)
		snprintf(ip_str, sizeof(ip_str), NIPQUAD_FMT,
			 NIPQUAD(o->ip.addr.ipv4));
	else
		snprintf(ip_str, sizeof(ip_str), NIP6_FMT,
			 NIP6(o->ip.addr.ipv6));
 
	cmdline_printf(cl, "Object %s added, ip=%s\n",
		       o->name, ip_str);
}

命令行解析

cmdline_parse_token_string_t cmd_obj_action_add =
	TOKEN_STRING_INITIALIZER(struct cmd_obj_add_result, action, "add");
cmdline_parse_token_string_t cmd_obj_name =
	TOKEN_STRING_INITIALIZER(struct cmd_obj_add_result, name, NULL);
cmdline_parse_token_ipaddr_t cmd_obj_ip =
	TOKEN_IPADDR_INITIALIZER(struct cmd_obj_add_result, ip);

初始化命令行

cmdline_parse_inst_t cmd_obj_add = {
	.f = cmd_obj_add_parsed, 	 /* function to call */
	.data = NULL,     			 /* 2nd arg of func */
	.help_str = "Add an object (name, val)",
	.tokens = {                               /* token 列表, NULL 结束 */
		(void *)&cmd_obj_action_add,
		(void *)&cmd_obj_name,
		(void *)&cmd_obj_ip,
		NULL,
	},
};

最后,将初始化的命令行添加到一个保存命令行的数组中,数组以 NULL 结束:

cmdline_parse_ctx_t main_ctx[] = {
	(cmdline_parse_inst_t *)&cmd_obj_add,
	NULL,
};

然后在 mian 函数中创建命令行对象,通过控制台和用户交互,具体实现如下:

int main(int argc, char **argv)
{
	int ret;
	struct cmdline *cl;
 
	ret = rte_eal_init(argc, argv);
	if (ret < 0)
		rte_panic("Cannot init EAL\n");
 
	cl = cmdline_stdin_new(main_ctx, "example> ");
	
	if (cl == NULL)
		rte_panic("Cannot create cmdline instance\n");
	cmdline_interact(cl);
	cmdline_stdin_exit(cl);
	
	return 0;
}

参考文档

https://blog.csdn.net/zhang1051546117/article/details/78051240

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!