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

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

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

回答:

要处理从用户空间到协议的通信,请使用内核套接字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路径。

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

以上是 在Linux内核中添加了新的网络协议 的全部内容, 来源链接: utcz.com/qa/416743.html

回到顶部