akp*_*akp 11 c linux networking kernel linux-kernel
我知道在linux内核中我们可以在传输层添加自己的协议,类似于TCP,UDP等.
是否有任何钩子在网络层注册新协议,类似于IP,ARP,它可以将数据包传输到应用程序以及如何在Linux内核中添加此协议?
olo*_*kki 30
要处理从用户空间到协议的通信,请使用内核套接字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
};
Run Code Online (Sandbox Code Playgroud)
要注册协议,您必须填写proto_ops结构.该结构遵循在内核内其他地方观察到的面向对象的模式.此结构为开发人员实现自己的套接字接口定义了一个接口.
实现接口定义的函数,例如bind,connect,listen,并将函数指针分配给结构条目.定义ioctl用于操作界面未涵盖的功能.
最后得到一个结构,以后嵌入在我们从create函数返回的套接字结构中.
Struct net_proto_family定义了一个新的协议族.这个结构包括create函数,你的函数实现应该填充一个用proto_ops结构填充的套接字结构.
之后使用sock_register注册该系列,如果一切正常,您应该能够从用户空间创建一个正确的套接字.
协议内部可能应该使用skbuff1,[2],[3](pdf).与网络设备通信.
skbuffs是在Linux内核中处理网络数据包的通用方法.数据包由网卡接收,放入一些skbuff,然后传递给网络堆栈,后者一直使用skbuff.
这是在linux内核中实现网络协议的基本数据结构和路径.
我不知道从头到尾描述此过程的文档.来源与你在这一个.