vpp cli简单介绍

2023-03-07 17:17:57 浏览数 (1)

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命令行。

0 人点赞