API简介
vpp其实也有自己的control-plane。它们之间的就是使用API来交互,底层是用的共享内存机制。
control-plane可以是使用不同的语言来写,支持C/python/java/go
在这里了解的是用C语言与vpp通信。如图1所示。VAT通过命令行来控制VPP。
图1,VAT(vpp api test)与vpp通信:
+--------------+
| |
| VPP API TEST +
| |
+------+-------+
|
binary API |
(shmem) |
|
+------+-------+
| |
| VPP |
| |
+--------------+
了解vat与vpp使用API编程有以下几个意义。
1.了解消息传递的大致原理
2.知道xxx.api的写法
3.知道VPP部分的代码写法
4.在一些情况下可以使用VAT进行调试
步骤
我们通过acl_del这个命令来当例子了解vat与vpp是如何使用api编程的,在vpp_api_test中有这个命令
vat# help acl_del
usage: acl_del <acl-idx>
可以看到,需要在vat中解析一个acl-index,传给vpp,接着vpp会删除这个index的acl,然后告知vat。
添加一个api需要修改三个文件。代码路径是vpp/src/plugins/acl下
acl.api -- vat 与vpp 通信的结构体定义
acl_test.c -- vat使用
acl.c -- vpp使用
我们只需修改3个文件,6个部分就能完成,干货可以直接看==总结==部分
1.acl.api
acl.api中定义vat与vpp通信的结构体,然后由vppapigen文件处理,最终生成acl.api.h的头文件。两边都包含这个头文件,这样vat与vpp就使用了相同的结构体通信了。
我们看一下acl.api中的定义
/** \brief Delete an ACL
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
@param acl_index - ACL index to delete
*/
autoreply manual_print define acl_del
{
u32 client_index; //系统使用
u32 context; //系统使用
u32 acl_index; //通过命令acl_del <acl-idx>输入的acl-idx
};
这个结构体的定义由3个关键字(autoreply 、manual_print、define )加上名称再加成员构成,最终会被转化为
typedef VL_API_PACKED(struct _vl_api_acl_del {
u16 _vl_msg_id;
u32 client_index;
u32 context;
u32 acl_index;
}) vl_api_acl_del_t;
typedef VL_API_PACKED(struct _vl_api_acl_del_reply {
u16 _vl_msg_id;
u32 context;
i32 retval;
}) vl_api_acl_del_reply_t;
这样就可以用使用vl_api_acl_del_t与vl_api_acl_del_reply这个结构体通信了。
具体说一下每个部分
关键字
-
关键字 autoreply
在这里需要先提一下reply
正常情况下