Zephyr网络传输Offloading--添加offload socket
Posted HalfCoder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zephyr网络传输Offloading--添加offload socket相关的知识,希望对你有一定的参考价值。
在一文中提到了Zephyr网络传输offloading支持socket offloading API, 本文就如何将第三方socket以offloading的方式添加到zephyr中进行说明。
本文只说明如何添加,不说明第三方socket的具体实现形式,后文中以vender_ 开头的函数均为第三方socket需要porting的函数。
1.配置
配置CONFIG_NET_SOCKETS_OFFLOAD=y
,编译时会启用socket offload
2. 注册dns查询函数
按照下列函数指针的模式使用第三方socket API实现dns查询函数vender_getaddrinfo/vender_freeaddrinfo
1 |
struct socket_dns_offload { |
用实现的函数初始化一个socket_dns_offload结构体变量, 并注册到socket_offload中
1 |
const struct socket_dns_offload vender_dns_ops = { |
3. 实现socket API
按照struct socket_op_vtable的定义使用第三方socket API实现zephyr的socket抽象,总计要实现read/write/close/ioctrl/bind/connect/listen/accept/sendto/recvfrom/getsockopt/setsockopt/sendmsg/getsockname总计14个,这里以列出read和bind示意
1 |
struct socket_op_vtable { |
用实现的函数初始化一个struct socket_op_vtable结构体变量
1 |
static const struct socket_op_vtable vender_socket_fd_op_vtable = { |
4.实现注册函数并注册
按照下列形式实现is_supported和handler,
1 |
struct net_socket_register { |
is_supported用于判断socket是否支持该协议族(family),socket类型(type), 和协议(proto), 例如我的第三方offload socket全部都支持就直接返回true
1 |
static bool vender_is_supported(int family, int type, int proto) |
handler是用于创建socket的函数,该函数中负责将vender_socket_fd_op_vtable注册到fdtable内,实现如下
1 |
static int vender_socket_create(int family, int type, int proto) |
使用下面宏进行注册,Zephyr的socket就可以调用到vender的socket实现了。
1 |
NET_SOCKET_REGISTER(vender, AF_UNSPEC, vender_is_supported, vender_socket_create); |
以上4步做完后,zephyr中使用socket编程,最终都会调用到vender_ 这一组由第三方socket porting的API。
到底了,关注获取新文章
以上是关于Zephyr网络传输Offloading--添加offload socket的主要内容,如果未能解决你的问题,请参考以下文章
Offloading Monocular Visual Odometry with Edge Computing: Optimizing Image Quality in Multi-Robot Sy