gpt4 book ai didi

c - 在 linux 内核中添加了一个新的网络协议(protocol)

转载 作者:IT王子 更新时间:2023-10-29 00:03:01 26 4
gpt4 key购买 nike

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

是否有任何钩子(Hook)可以在网络层注册一个新的协议(protocol),类似于 IP、ARP,可以将数据包传输到应用程序,以及如何在 linux 内核中添加这个协议(protocol)?

最佳答案

要处理从用户空间到您的协议(protocol)的通信,请向内核注册您的协议(protocol) sockets API .这允许您从用户空间创建一个普通套接字。

查看相关的蓝牙/RFCOM 套接字实现 code samples .

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
};

要注册协议(protocol),您必须填写 proto_ops结构体。此结构遵循 object oriented pattern在内核的其他地方观察到。此结构定义了开发人员实现自己的套接字接口(interface)时要遵循的接口(interface)。

实现接口(interface)定义的bind、connect、listen等函数,并将函数指针赋值给结构体入口。为操作接口(interface)未涵盖的功能定义 ioctl。

您最终得到一个结构,稍后您将其嵌入到 socket struct 中我们从创建函数返回。

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

之后用sock_register注册家庭,如果一切正常,您应该能够从用户空间创建一个合适的套接字。

在内部,该协议(protocol)可能应该使用 skbuffs(参见 herehere)与网络设备通信。

skbuffs 是 linux 内核中处理网络数据包的通用方式。数据包由网卡接收,放入一些 skbuff,然后传递给网络堆栈,网络堆栈一直使用 skbuff。

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

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

关于c - 在 linux 内核中添加了一个新的网络协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13760017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com