一尘不染

在Linux内核中添加了新的网络协议

linux

我知道在linux内核中,我们可以在传输层添加我们自己的协议,类似于TCP,UDP等。

是否有任何钩子可以在网络层上注册类似于IP,ARP的新协议,可以将数据包传输到应用程序,以及如何在Linux内核中添加此协议?


阅读 523

收藏
2020-06-07

共1个答案

一尘不染

要处理从用户空间到协议的通信,请使用内核套接字API注册协议。这使您可以从用户空间创建普通套接字。

看一下相关代码示例的蓝牙/
RFCOM套接字实现。

static const struct proto_ops rfcomm_sock_ops = {
     .family         = PF_BLUETOOTH,
     .owner          = THIS_MODULE,
     .bind           = rfcomm_sock_bind,
     .connect        = rfcomm_sock_connect,
     .listen         = rfcomm_sock_listen,
     .
     .
     .
     .accept         = rfcomm_sock_accept,

};

static const struct net_proto_family rfcomm_sock_family_ops = {
     .family         = PF_BLUETOOTH,
     .owner          = THIS_MODULE,
     .create         = rfcomm_sock_create
};

要注册协议,您将必须填写proto_ops结构。这种结构遵循内核内部其他地方观察到的面向对象的模式。此结构定义了实现自己的套接字接口的开发人员可以遵循的接口。

实现接口定义的功能,例如绑定,连接,侦听并将功能指针分配给结构条目。为操作界面未涵盖的功能定义ioctl。

您最终得到一个结构,之后将其嵌入我们从create函数返回的套接字结构中

结构net_proto_family定义了一个新的协议族。此结构包括create函数,您的函数实现应在其中填充由proto_ops结构填充的套接字结构。

之后,使用sock_register注册家族,如果一切正常,则应该能够从用户空间创建适当的套接字。

内部协议应该使用skbuffs1[2][3](pdf)。与网络设备通信。

skbuffs是在Linux内核中处理网络数据包的通用方法。数据包由网卡接收,放入一些skbuff中,然后传递到网络堆栈,该网络堆栈始终使用该skbuff。

这是在Linux内核中实现网络协议的基本数据结构和io路径。

我不知道从头到尾描述此过程的文档。来源与您有关。

2020-06-07