cli简介
vpp提供了一套非常方便的cli引擎,无论是用户还是开发人员的角度,在代码调试、构造产品的可维护性方面、及配置下发等等都有使用。 要添加一个新命令,需要注册它的名称、帮助字符串及处理函数。 通过下面的测试代码来说明一下:
cli注册及回调函数
cli注册只需要使用宏VLIB_CLI_COMMAND,但是有一个地方需要注意 test_cli_config_command 需要是全局唯一的,否则会编译报错。
代码语言:javascript复制/*简单的回调函数*/
static clib_error_t *
test_cli_config_command_fn (vlib_main_t * vm,
unformat_input_t * input,
vlib_cli_command_t * cmd)
{
u8 *name = NULL;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "name %s", &name))
{
vlib_cli_output (vm, "name %s",name);
/*这里需要注意,需要释放内存,否则导致泄漏*/
vec_free(name);
}
else
{
return clib_error_return (0, "unknown input `%U'",
format_unformat_error, input);
}
}
return NULL;
}
VLIB_CLI_COMMAND (test_cli_config_command, static) =
{
.path = "test cli config",
.short_help = "test cli config name <string>",
.function = test_cli_config_command_fn,
.is_mp_safe = 1,
};
is_mp_safe 这个参数以前没有使用过,可以告诉用户命令行是否多线程安全。 在使用unformat是需要注意了,不如%u %d的时候必须使用int 类型来接收,否则会导致异常。%s 时 ,需要注意内存泄漏问题。
cli 使用
代码语言:javascript复制/*命令行测试*/
DBGvpp# test cli config name test
name test
DBGvpp#
vpp对命令行还提供了一些统计信息及安全性
代码语言:javascript复制/*可以查询当前命令行是否是线程安全的*/
[18:20:07]root:~$ vppctl show cli mp-safe | grep "test cli config"
test cli config
/*查询命令行使用次数*/
[18:23:31]root:~$ vppctl show cli hit
quit: 2
show cli: 1
test cli config: 1
/*清空cli统计*/
[18:24:27]root:~$ vppctl show cli clear-hit
hit counters cleared...
个人使用举例
下面是在产品中为了查询流表信息及监控资源使用情况,添加的命令行信息。 流表是基于报文五元组做key,value:是线程索引及pool资源池的索引(详细细节就不便多说了)。在查询表象信息及资源使用情况,及bihash的分布情况都非常又用。
代码语言:javascript复制/*查询bihash资源分布情况及内存使用情况*/
DBGvpp# show session hashv4 tables detail
Hash table ip4 session table
/*当前桶的下表,当前桶存储数据个数,是否线性存储*/
[60517]: heap offset 6293776, len 1, refcnt 2, linear 0
/*显示key value*/
0: Key :sip[140.249.38.232][80] dip[172.168.68.30][62018] proto[6]
Value : pool_index[0] thread_index[2]
/*下面就是内存使用情况,vpp自带的打印格式*/
1 active elements 1 active buckets
0 free lists
0 linear search buckets
arena: base 7fdccfc00000, next 680000
used 6815744 b (6 Mbytes) of 536870912 b (512 Mbytes)
/*根据vlaue查询流表信息及状态,*/
DBGvpp# show session table ipv4 index 0 2
------------------------Session info-----------------------------
Session address : 0x0x7fdcaf5de030
Session ID : 378114
Start and last time : 1477.7775 1491.5501
Pool and thread id : 0 2
Session state : 4 <established>
Session flag : 131
Timers handle : 2048
Packet src address : 172.168.68.30
dst address : 140.249.38.232
src/dst port : 62018 80
protocol : 6 <TCP>
/*pool 内存池资源使用情况*/
DBGvpp# show session pool used
Session manager threads num 6:
Id Max_elts Mem_base Free elts State
1 16384 0x7fdcaf7ef000 16384 Normal
2 16384 0x7fdcaf5de000 16384 Normal
3 16384 0x7fdcaf3cd000 16384 Normal
4 16384 0x7fdcaf1bc000 16384 Normal
5 16384 0x7fdcaefab000 16384 Normal
总结
本文简单介绍了vpp中cli的使用及可能存在问题的地方。并且以自己实际工作的例子举例-产品可维护命令行。通过这些命令行的输出信息,基本上可以定位70%以上的问题。 所以要好好利用cli命令行。