netlink_compat 兼容层使用手册

netlink_compat 兼容层使用手册

本编用于介绍基于 SylixOS 的 Netlink 兼容层使用方法。

简介

Netlink介绍

Netlink 是一种 Linux 系统下的一种 IPC(Inter Process Commumicate)机制,它用于内核与用户空间通信,同时它也以用于进程间通信(Netlink 更多用于内核通信,进程之间通信更多使用Unix域套接字)。Linux 系统中,在一般情况下,用户态和内核态通信会使用传统的 Ioctl、sysfs 属性文件或者 procfs 属性文件,这 3 种通信方式都是同步通信方式,由用户态主动发起向内核态的通信,内核无法主动发起通信。而 Netlink 是一种异步全双工的通信方式,它支持由内核态主动发起通信,内核为Netlink通信提供了一组特殊的 API 接口,用户态则基于 socket API,内核发送的数据会保存在接收进程 socket 的接收缓存中,由接收进程处理。

Netlink 有以下优点:

1、双向全双工异步传输,支持由内核主动发起传输通信,而不需要用户空间出发(例如使用 ioctl 这类的单工方式)。如此用户空间在等待内核某种触发条件满足时就无需不断轮询,而异步接收内核消息即可。

2、支持组播传输,即内核态可以将消息发送给多个接收进程,这样就不用每个进程单独来查询了。

Netlink 的详细内容可以参考 Linux 相关代码与文档,Netlink 的具体内容和应用不是本篇讨论的重点。

SylixOS Netlink 兼容层简介

SylixOS 下,提供了一个 Netlink 兼容层内核模块。它可以用来移植 Linux 系统中使用 Netlink 操作的相关程序。SylixOS 不支持 Netlink 协议域,因此本兼容层的原理是用 UNIX 协议域去替换 Netlink 协议,即虽然看似使用的是 Netlink 通信,但实际 SylixOS 下使用的是用 UNIX 通信去模拟 Netlink 的规则。

目前 Netlink 兼容层支持常见的 Netlink 操作,如:

  • 支持应用层与内核借助 Netlink 进行单播或者组播通信
  • 支持 genetlink 的通信
  • 用户可以借助 Netlink 子协议实现其他通信内容

Netlink 兼容层工程目录如下所示:
在这里插入图片描述
bitmap:依赖的相关位操作
compat:Linux 的相关兼容接口
lib:Netlink 相关内核库
netlink:Netlink 及 genetlink 的兼容实现
socket_compat.c: 用于兼容 socket 接口
netlink_compat.c: 内核模块入口

Netlink 兼容层运行

1、依赖关系说明

Netlink 的头文件放在了 wificdk 这样一个公用头文件中,因为目前 Netlink 的很多接口都是给 WIFI 子系统使用的,因此 SylixOS 将 Netlink 的头文件与 WIFI 子系统的头文件一起放在了 wificdk 工程中,这个工程在 cfg80211 的仓库内。

2、编译
  1. 从 Git 仓库中 clone:wificdk netlink_compat 两个工程;
  2. 将其放在同一个 workspace 中,进行编译
3、部署运行

将编译完成的上述 ko 部署到 SylixOS 开发环境中,按照如下顺序依次运行:

insmod /lib/modules/netlink_compat.ko

加载完成后,开发环境即可正常使用 Netlink

Netlink 兼容层使用

1、应用程序使用
socket 接口使用方式:

因为应用程序使用 Netlink 时是借助的 socket 接口,而 SylixOS 系统中提供的 socket 接口并不支持 Netlink 域,因此 netlink_compat 模块中提供一个 socket_compat.h 的兼容头文件。它与 SylIxOS 中的
socket.h 接口类型一致,只是 API 接口名字不同,如下:

/*********************************************************************************************************
  socket api
*********************************************************************************************************/

int          socketpair_compat(int domain, int type, int protocol, int sv[2]);
int          socket_compat(int domain, int type, int protocol);
int          accept_compat(int s, struct sockaddr *addr, socklen_t *addrlen);
int          accept4_compat(int s, struct sockaddr *addr, socklen_t *addrlen, int flags);
int          bind_compat (int s, struct sockaddr *name, socklen_t namelen);
int          shutdown_compat(int s, int how);
int          connect_compat(int s, const struct sockaddr *name, socklen_t namelen);
int          getsockname_compat(int s, struct sockaddr *name, socklen_t *namelen);
int          getpeername_compat(int s, struct sockaddr *name, socklen_t *namelen);
int          setsockopt_compat(int s, int level, int optname, const void *optval, socklen_t optlen);
int          getsockopt_compat(int s, int level, int optname, void *optval, socklen_t *optlen);
int          listen_compat(int s, int backlog);
ssize_t      recv_compat(int s, void *mem, size_t len, int flags);
ssize_t      recvfrom_compat(int s, void *mem, size_t len, int flags,
                      struct sockaddr *from, socklen_t *fromlen);
ssize_t      recvmsg_compat(int  s, struct msghdr *msg, int flags);
ssize_t      send_compat(int s, const void *data, size_t size, int flags);
ssize_t      sendto_compat(int s, const void *data, size_t size, int flags,
                    const struct sockaddr *to, socklen_t tolen);
ssize_t      sendmsg_compat (int  s, struct msghdr *msg, int flags);
INT  socket_close_compat (INT  iFd);

它是在所有的 socket 接口后增加了一个 compat 字段。这个头文件中的所有 socket 接口除了支持 SylixOS 自带的 socket 功能外,还支持 Netlink 协议域。因此应用程序要使用 Netlink 时,需要引入这个头文件,并将原来的 socket 接口替换为这个文件中的 socket 接口。

Netlink 接口使用方式:

应用程序中,也需要使用 Netlink 相关的结构或接口,此时可以导入 wificdk 工程中相关的内容,如下图所示:
在这里插入图片描述
其目录结构与 linux 一致,因此如果是移植的 Netlink 应用程序,只要头文件可以找到就可以不做任何修改。

注意:应用程序最好先包含 #include <linux/netlink.h> 这个头文件,因为其内部有兼容接口操作;
另外,应用程序最好借助 libnl 库去使用 Netlink

2、内核模块使用

内核模块使用 Netlink 时,可以直接使用Netlink 提供的相关内核符号,内核模块的收发报文都是有对应的 Netlink 接口,而不是 socket 接口。因此内核模块只需要导入上文中提到的 netlink_compat 工程相关的头文件直接使用即可。

注意: netlink_compat 工程提供了一些 Linux 兼容接口,如 sk_buff 等内容,内核模块可以直接使用,如果内核模块中有些特殊的 Linux 操作接口,可以单独实现,但需要保证尽量别跟 Netlink 工程冲突。

genetlink 的使用

genetlink 是 Netlink 的一个子协议,它用于扩展 Netlink 协议支持的内容。目前 Netlink 兼容层也已经支持 genetlink。它的使用与上述直接使用 Netlink 一致,这里就不赘述。

注意: 在 Netlink 兼容层 Git 仓库中,有对应的测试 demo 可以参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值