【问题标题】:addition of a new network protocol in the linux kernel在 linux 内核中添加一个新的网络协议
【发布时间】:2021-02-05 23:33:48
【问题描述】:

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

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

【问题讨论】:

  • 您需要将它们添加到内核中。作为一个模块比一个补丁更好。
  • @PavelOgnev 你能否建议一些文件如何做到这一点......我知道模块。
  • 注意:您也可以使用原始套接字直接评估来自用户空间的以太网帧。

标签: c linux networking linux-kernel kernel


【解决方案1】:

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

查看相关code samples 的蓝牙/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 结构。这个结构遵循在内核其他地方观察到的object oriented pattern。该结构定义了一个接口,供开发人员实现自己的套接字接口时遵循。

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

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

Struct net_proto_family 定义了一个新的协议族。这个结构包括 create 函数,你的函数实现应该填充一个由 proto_ops 结构填充的套接字结构。

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

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

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

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

我不知道有一份文件从头到尾描述了这个过程。 来源与您同在。

【讨论】:

【解决方案2】:

要实现协议,请编写内核模块。

模块应该在/dev 中创建一个新设备。然后应用程序可以使用ioctl() 与您的模块通信以指定目标主机、选项等内容。

See Chapter 7 of The Linux Kernel Module Programming Guide 了解如何在内核模块中实现ioctl()

This blog post 似乎也是对该主题的一个很好的介绍。

【讨论】:

  • 但主要问题是 NIC 驱动程序如何将数据包传输到此模块....我的意思是 new_protocol 的注册位置和方式。?
  • 我不确定,但我认为这不会在任何地方实现。 NIC 不知道“协议”可能意味着什么。只要数据具有正确的 IP 标头,它就不会关心有效负载。以 NETBIOS 为例。整个协议在用户代码中实现(参见 Samba 项目)。
  • @AaronDigulla:当然,如果这个新协议是在网络层,那么数据不会有正确的IP头,因为该协议旨在取代IP。我对这些东西不是很熟悉,但部分问题可能是,“NIC 为 Linux 上的 OSI 数据层提供什么接口?”。 NetBIOS 通常在会话层运行(至少,根据 Wikipedia)。
  • @SteveJessop:是的,你是对的。我认为今天的网卡需要 MAC 标头;有效载荷的其余部分可以是任何东西。
  • 我们将设备添加到 /dev 以通过 ioctls 从用户空间与设备驱动程序通信。只有在寻找设备驱动程序时,才应考虑将文件添加到 /dev。从用户空间到内核空间有多种通信方式,例如 Netlink。他要求在内核中注册一个新的第 4 层协议。
猜你喜欢
  • 2012-04-08
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2022-01-15
  • 2021-05-20
相关资源
最近更新 更多