vpp添加binary api之上篇

vpp可以对外提供C/C++接口来进行操作,这里将详细介绍一下如何添加binary api

官方的ACL插件是一个很好的教程,但是由于里面的内容太多新手很容易犯迷糊,这里用插件的形式来介绍一下,添加一个接口十分简单

ACL插件的介绍可以参考教程https://segmentfault.com/a/1190000019613730,这个教程写的很详细了

首先要掌握的知识是会创建插件,可以参考vpp插件介绍之创建插件

这里以qs类型的插件为例,插件名称为testqs

vpp提供了三种接口,一般常用的就是request/reply和dump/details,上篇只打算介绍如何添加dump/details的接口

这里以一个简单的用例告诉你添加一个dump接口十分简单,只需要编写三个函数外加一个说明

1.相关文件

首先介绍一下binary api相关的源码文件,分别是testqs.api testqs.c testqs_test.c

testqs.api是我们定义需要的数据结构

testqs.c是vpp内部处理外界请求的地方

testqs_test.c是vat向vpp发送请求的地方,一般是为了测试添加的接口是否正确

2.定义数据结构

 

是的,这句话 **基本正确**,但需要稍作补充和说明,以更准确地描述 VPP 的行为。 --- ### ✅ 正确表述: > 在 VPP 中,如果一个 Binary API **没有显式指定 `is_mp_safe = 1`**,那么在处理该 API 时,VPP 会调用 `vl_msg_api_barrier_sync()` 来 **暂停所有 worker 线程**,确保当前 API 处理期间没有数据包被处理。 --- ### 🔍 详细解释: #### 1. **Binary API 的线程安全机制** VPP 是一个多线程系统(支持多 worker 线程处理数据包),但很多控制面操作(如接口配置、路由更新等)**不是线程安全的**,它们通常只在主线程(main thread)中执行。 为了防止并发访问共享资源,VPP 提供了一个同步机制: ```c vl_msg_api_barrier_sync(); ... 执行非线程安全的 API 处理 ... vl_msg_api_barrier_release(); ``` - `vl_msg_api_barrier_sync()`:**暂停所有 worker 线程**,防止它们处理数据包。 - `vl_msg_api_barrier_release()`:恢复 worker 线程运行。 #### 2. **is_mp_safe 的作用** - 如果一个 API **没有设置 `is_mp_safe`**,VPP 会认为它是非线程安全的,就会自动插入上述同步屏障。 - 如果设置了 `is_mp_safe`,则跳过屏障,API 可以在多线程环境下安全执行。 --- ### 🧠 举个例子 假设你有一个 API: ```c define my_api { u32 some_value; } ``` 因为没有设置 `is_mp_safe`,VPP 会自动在调用 `my_api` 的处理函数前插入: ```c vl_msg_api_barrier_sync(); my_api_handler(...); vl_msg_api_barrier_release(); ``` 这会**暂停所有 worker 线程**,确保该 API 的处理是串行化的。 --- ### ✅ 总结 | 问题 | 回答 | |------|------| | 未设置 `is_mp_safe` 的 API 是否会阻塞 worker 线程? | ✅ 是的,VPP 会调用 `vl_msg_api_barrier_sync()` 暂停所有 worker 线程。 | | 这样做的目的是什么? | ✅ 防止并发访问共享资源,确保非线程安全操作安全执行。 | | 如何避免阻塞? | ✅ 在 `.api` 文件中添加 `is_mp_safe;` 字段。 | --- ### ✅ 结论 > 所以你这句话: > > “VPPbinary API在非显式指定is_mp_safe=1时,在处理时会阻塞worker线程,即API处理过程中不会有任何包被处理。” > > 是 **正确的**。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值