API 方法分类
VPP 二进制API是消息传递API,支持如下API方法类型:
Request/Reply
客户端发送一个请求消息,服务端回复一个单一的回复消息,通常回复消息以method_name+ reply的形式命名。
Dump/Detail
客户端发送一个“bulk”(大部分)类型的请求消息到服务端,服务端回复一系列详细消息的集合,这些消息可能属于不同的消息类型,dump/detail调用必须被包括在一个控制的ping block内(a control ping block,个人理解有点像socket通信),否则客户端不知道基本消息什么时候传输结束;方法名必须以method+“_dump”的形式结束,回复消息应该以method + "_details"命名;这里的例外是返回多种消息类型的方法(比如sw_interface_dump);dump/detail方法被典型的用于获取集体(bulk)信息,比如完整的FIB table消息。
Events
客户端可以注册一个事件以获取来自服务器的异步事件通告,当用于获取接口状态改变、周期性统计等信息时很有用,请求通告的方法名通常以“want_”为前缀,例如“want_interface_events”,API定义中没有定义何种通告类型需要事件注册;来自客户端的消息必须包含“client_index”,一个不透明的cookie用于识别发送者,一个“context”(上下文/内容)字段让客户端匹配请求与回复。
命名规则总结
Reply/Request方法: Request:name Reply:name+_reply
Dump/Detail方法: Request:name+_dump Reply: name+_details
Event registration:Request: want_+name Reply: want_+name+_reply
类型支持
VPP API支持任意的C类型,包括复合数据类型。
遗留问题
类型问题
1)二进制数组和字符串都被表示为u8[],一个单独的类型for string已经被添加
2)从历史上看,因为没有使用显示类型,语言包装器的类型检查一直很困难
3)变长数组不包含u8 char[0],并且计数字段是特定于消息的,因此很难为这些消息类型自动生成代码。
4)指向共享内存指针的使用
方法问题
Dump/Details:没有明确定义可以返回哪些消息类型
Event methods:没有明确定义可以返回哪些消息类型
Dump/Details :无法将失败返回给客户端