C API 总览
C源码级别API
1)所有API函数都被在C 头文件中描述
2)所有VPP API间的交互通过直接的C函数调用
代码库
有几个可供C应用程序开发人员使用的与VPP相关的代码库,概述如下:
1) vlib
2) vlibapi
3) vlibmemory
4) vlibsocket
总体来说,大部分VPP C函数的VPI调用
5) vpp
VPP 消息传递API
6)vppinfra
基本架构部分,向量,hash表,位操作(bitops)等
7)vpp_plugins(VPP插件)
8)dpdk
数据平面开发套件,主要目的有两个:
1)从接口接收网络数据包,并将其放到一个方便的内存向量中。
2)从内存向量中获取一个网络数据,通过接口发送出去。该库虽然被作为VPP的一部分被构建,但有自己的项目和开发。
此外还有,jvpp-common、pneum、svm、vat、vnet
消息API Review
消息API分类见VPP-API概念,对于回复消息,必须有对应的回复消息处理函数,关于回复处理函数很重要的几点如下:
1)回复处理函数异步运行
2)dump/details 类型的消息需要通过附加的最终的(final)CONTROL_PIING消息完成
案例
基于新增插件添加API
新增VPP插件
新增插件有多种方式,VPP源码中自带新增插件脚本,通过执行脚本可快速添加一个插件,具体步骤为:
1)在vpp/src/plugins目录下执行../../extras/emacs/make-plugin.sh
2)输入插件名
3)选择插件类型 dual或qs
dual和qs只在node.c文件上有差异,dual一般应用于二层网络,里面添加了对mac的处理,qs一般是三层网络,里面只有数据包的处理
两种模板转发数据包的方式有点差异,dual适合转发到多个节点,qs适合转发到下一个节点,vpp中node节点的转发基本上都是这两种方式。
4)脚本执行成功后,会自动在当前目录下生成新增插件文件;包括如下:
CMakeLists.txt: xxx plugin的编译文件
myplugintest.api:用于描述插件中使用的消息内容的文件,并基于此生成对应语言的消息结构体变量,主要有request/reply/dump/details/event类型消息
xxx.c: 用于定义xxx plugin的vpp端(server)初始化、回调处理函数等。
xxx_test.c:用于定义vat端(client端)request、dump及vpp端回复的reply、details消息处理函数
node.c: xxx plugin的node处理函数的文件
xxx_periodic.c:定义处理plugin 事件消息函数的文件
5)编译插件,在vpp顶层目录,make build生成新的插件
添加API
在生成的代码中已包含enable_disable类型的API及相关实现,其他类型消息的API实现类似,具体步骤为:
1)在.api文件中描述插件新增消息内容request/reply/dump/details/event类型消息。
2)在node.c中实现用于VPP响应的对应消息vl_api_xx_handler回调函数
3)在_test.c文件中实现用于vat命令下发的cli的回调处理函数api_xxx_xx
4)在_test.c文件中实现用于vat解析vpp回应消息的vl_api_xx_t_handler回调函数