我知道在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路径。
我不知道从头到尾描述此过程的文档。来源与您有关。