在linux内核中添加了一个新的网络协议

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内核中实现网络协议的基本数据结构和路径.

我不知道从头到尾描述此过程的文档.来源与你在这一个.