1. 介绍

vpp网络协议栈配备了一组调试命令。访问CLI(具有适当权限)的最简单方法是使用vppctl命令:

sudo vppctl <cli command>

CLI解析器匹配静态的关键字字符串后,调用动作执行函数。 你可以通过在代码源文件中搜索VLIB_CLI_COMMAND宏的来查找CLI命令的源代码.

2. 调试和Telnet CLI

使用unix交互式参数或启动配置选项启用调试CLI。 这会导致VPP不以守护进程的情况启动,并在运行它的终端上显示命令行界面.

使用cli-listen localhost:5002选项启用Telnet CLI,这将导致VPP侦听localhost地址端口5002上的TCP连接。 然后,Telnet客户端可以连接到此端口(例如,telnet localhost 5002)并将收到命令行提示符。

以下配置将启用这两种机制:

unix {
  interactive
  cli-listen localhost:5002
}

CLI以横幅图形(可以禁用)和命令行提示符提示CLI开始。对于VPP的发布版本,命令行提示符通常为“vpp”, 对于启用了调试功能的开发版本,命令行提示符为“DBGvpp#”,可以通过unix cli-prompt设置命令行提示符, 并通过unix cli-no-banner来禁止横幅.

3. CLI特征

  • <-或-> 左右光标键,在命令行内移动光标。
  • Ctrl-左/右将向左或向右搜索下一个单词的开头。
  • Home / end将光标跳转到行的开头和结尾。
  • 可以使用exit命令关闭CLI。 或者,空输入行上的^ D也将关闭会话。关闭调试会话也将关闭VPP

4. 命令行参数与配置文件

VPP网络协议栈可以在命令行或配置文件中提供配置参数。 您可以通过搜索VLIB_CONFIG_FUNCTION宏在源代码中找到命令行参数解析器的相关代码。 调用VLIB_CONFIG_FUNCTION(foo_config,“foo”)将使函数foo_config接收名为“foo”的参数块中给出的所有参数, 例如:“foo {arg1 arg2 arg3 …}”

VPP应用程序必须能够找到自己的可执行映像。确保这一点最简单方法是通过给出其绝对路径来调用VPP应用程序;

例如:/usr/bin/vpp

在启动时,VPP应用程序通过解析自己的ELF段以生成初始化,配置和退出处理程序的列表

配置文件:

还可以在启动配置文件中提供命令行参数,配置文件的路径在命令行上提供给VPP应用程序。

配置文件的格式是一个简单的文本文件,其内容与命令行相同,但是能够使用换行符使内容更加易于阅读。 例如:

unix {
  nodaemon
  /var/log/vpp/vpp.log
  full-coredump
  cli-listen localhost:5002
}

api-trace {
  on
}

dpdk {
  dev 0000:03:00.0
}

然后使用-c选项指示VPP加载配置文件:

/usr/bin/vpp -c /etc/vpp/startup.conf

5. 常用命令

create sub BondEthernet0 834	创建子接口,tag是834
set interface ip table BondEthernet0.834 1	将此接口设置在fib 1里
set interface ip address BondEthernet0.834 192.168.0.250/24	设置接口ip
set interface state  BondEthernet0.834 up 	up接口
set interface l2 bridge BondEthernet0.834 834	将此接口设置到bridge 834里
set ip arp GigabitEthernet2/6/0 192.168.2.2 00:0c:29:dc:96:f8 	设置静态arp
ip route add 1.2.3.0/24 via GigabitEthernet2/6/0	添加路由
create vhost socket /tmp/sock2.sock server	创建vhost接口
l2fib add  fa:16:3e:b0:a9:71 834  BondEthernet0.834 	添加二层转发流表
create host-interface name vpp5a   创建veth口,name后参数名字必须和Linux里创建的veth口名字对应
set dpdk interface descriptors  TenGigabitEthernet6/0/0 tx/rx 1024	设置发送或是接收队列大小
set dpdk interface descriptors interface0/0/0  rx 1 tx 1024    设置此接口rx或是tx队列大小,intel人说2000-4000差距不大
trace add dpdk-input 8	跟踪dpdk接口数据包 (dpdk-input是节点的名字,想跟踪任何节点都可以)
trace add vhost-user-input 8	跟踪vhost接口数据包
trace add af-packet-input 8	跟踪veth接口数据包 
show hardware-interfaces	查看接口mac
show vlib graph 	查看node逻辑图
show threads    	查看vpp线程
show l2fib	查看二层转发流表
show ip fib	查看路由表
show ip arp	查看arp
show affinity    	查看主线程cpu亲和性
show version   	查看vpp版本
show int	查看接口统计
show interfaces address	查看接口ip
show bridge-domain	查看bridge 接口情况
1.查询路由
 show ip fib
 show ip6 fib
 show l2fib
 
2.查询用户信息
show upf session up seid X debug

打开调试开关
set upf log level 255 
set upf log level 0

3.trace
trace add dpdk-input 200
show trace max 100
clear trace

4.接口抓包:
接口收包
 pcap rx trace on max 100 intfc GigabitEthernet1/0/0 file 1234.pcap 
 pcap rx trace off
接口发出的包
 pcap tx trace on max 100 intfc GigabitEthernet1/0/0 file 1234.pcap 
 pcap tx trace off

5.统计
clear upf dbgcnt
show upf dbgcnt