Linux 内核。如何在链路层发送/接收未寻址的帧

Posted

技术标签:

【中文标题】Linux 内核。如何在链路层发送/接收未寻址的帧【英文标题】:Linux kernel. How to send/receive unaddressed frame at Link Layer 【发布时间】:2021-12-29 15:21:10 【问题描述】:

我目前正在构建一个开源无线电网络通信子系统。 我有一个适用于两个生态系统(MBED-OS 或 Raspberry Pico SDK)的原型, 它可以与 NRF52 系列微控制器或任何内置的收发器一起使用 通过 SPI 链路连接的收发器(例如 RF22/23B)。 该系统与现有系统有些相似, 但它要简单得多,并且对收发器的功能没有任何特殊要求。 它可以与任何发送/接收具有一致性检查(CRC 或类似)的帧的无线电一起使用。 我想将一个工作原型转移到 Linux/WiFi 平台。 这并不太难,但我在访问足够低级别的网络堆栈时遇到了问题。 我需要能够发送/接收具有最小标头大小(最好是空的:)的数据包(帧)。 为了确保节点之间的连接,我配置了一个“Ad-Hoc”wlan(我不需要接入点,因为我已经实现了自己的网络交换机)。 我已经构建了一个可加载的内核模块,它可以通过 SysFS 从应用程序发送/接收帧并将其传输到网络。

现在是主要问题。

如何仅使用堆栈的最低层(链路层)从内核模块发送一个简单的帧。 大多数使用“dev_queue_xmit”函数的示例构建附加适当标头的更高层(IP/以太网)数据包。 我不知道是否可以发送简单的未寻址数据包(空中)? 以及当我使用“dev_add_pack”注册自己的处理程序时是否会接收并转发这些数据包进行处理

我正在寻求有关如何解决此类问题的建议。 需要内核模块和网络的最低​​层,因为我需要发送/接收帧的时间戳,并且我不希望受到干扰(毫秒)延迟。

问候, TIA

【问题讨论】:

如果您使用的是 IEEE 802.11 (Wi-Fi),那么您必须有 802.11 帧,其中包括 MAC 地址。 802.11 硬件要求这样做。 IEEE 802.3(以太网)等协议也是如此。 【参考方案1】:

根据 802.11 标准,一个帧可以包含 1 到 4 个地址,具体取决于帧类型。例如,CTS 帧只有一个地址字段,而“数据”类型的帧可以有多达 4 个。

【讨论】:

以上是关于Linux 内核。如何在链路层发送/接收未寻址的帧的主要内容,如果未能解决你的问题,请参考以下文章

MAC帧

TCP/IP详解 卷1:协议—链路层

TCP/IP详解 卷1:协议—链路层

TCP/IP详解 卷1:协议—链路层

流量控制之SR协议

网络7层协议