当前位置: 首页 > 面试题库 >

在Linux内核中添加了新的网络协议

穆飞星
2023-03-14
问题内容

我知道在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路径。

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



 类似资料:
  • nf_conntrack nf_conntrack是Linux内核连接跟踪的模块,常用在iptables中,比如 -A INPUT -m state --state RELATED,ESTABLISHED -j RETURN -A INPUT -m state --state INVALID -j DROP 可以通过cat /proc/net/nf_conntrack来查看当前跟踪的连接信息,这

  • Linux内核的Virtual Routing and Forwarding (VRF) 是由路由表和一组网络设备组成的路由实例。 VRF安装 Ubuntu默认不包括vrf内核模块,需要额外安装: apt-get install linux-headers-4.10.0-14-generic linux-image-extra-4.10.0-14-generic reboot apt-get in

  • 问题内容: 我对这个内核东西很陌生。我要做的只是向内核添加一个新的系统调用。我正在遵循以下指南:http : //hekimian-williams.com/?p=20。 问题是存在于arch / x86 / kernel下的syscall_table_32.S文件中,但是在内核版本3.3中找不到x86系统的文件。我仍然需要编辑文件并为新添加的系统调用追加一行吗?还是我需要做其他事情让内核知道我的

  • 主要内容:initramfe虚拟文件系统GRUB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。这时内核终于开始替代 BIOS 接管 Linux 的启动过程了。 内核完成再次系统自检之后,开始采用动态的方式加载每个硬件的模块,这个动态模块大家可以想象成硬件的驱动(默认 Linux 硬件的驱动是不需要手工安装的,如果是重要的功能,则会直接编译到内核当中;如果是非重要的功能,比如硬件驱动会编译为模块

  • 在Scapy中添加新的协议(或者是更加的高级:新的协议层)是非常容易的。所有的魔法都在字段中,如果你需要的字段已经有了,你就不必对这个协议太伤脑筋,几分钟就能搞定了。 简单的例子 每一个协议层都是Packet类的子类。协议层背后所有逻辑的操作都是被Packet类和继承的类所处理的。一个简单的协议层是被一系列的字段构成,他们关联在一起组成了协议层,解析时拆分成一个一个的字符串。这些字段都包含在名为f

  • 我对任何逻辑都是新手,我有一个问题我无法解决... 我把“布局类型”和“网络类型”设为“随机”,并勾选了“启动时申请”的复选框……一开始,我就有了一个不错的社交网络 然而代理的诞生和死亡...问题是,当我添加代理时,新创建的代理没有连接!所以我,当所有最初的特工都死了,我发现我自己有特工,但没有网络! 我该怎么办?添加新代理时,我希望它与其他代理连接:s 谢谢!!!