You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux内核下链路层收发无地址帧的实现方案咨询

内核态链路层自定义帧收发实现方案

发送逻辑

dev_queue_xmit 本身没有强制要求附加IP/以太网等上层头部,仅需填充skb的必要链路层控制字段即可发送任意自定义帧,实现步骤如下:

  • 调用 dev_get_by_name(&init_net, "你的Ad-Hoc网卡名") 获取目标网络设备的 struct net_device 实例
  • 按实际payload长度申请skb:alloc_skb(payload_len + dev->hard_header_len, GFP_KERNEL),若网卡支持无头部帧发送,可临时将 dev->hard_header_len 设为0,发送完成后改回原值即可避免影响其他网络业务
  • 绑定skb的 dev 字段到目标网卡,protocol 字段设置为未被内核占用的自定义协议号(建议取0x0600以上的值,避免和IEEE预留长度字段冲突,例如 htons(0x1234))
  • 直接将payload拷贝到skb的data区域,调用 dev_queue_xmit(skb) 完成发送,内核不会自动附加任何上层协议头

注意:部分消费级WiFi网卡固件会强制校验802.11 MAC头合法性,完全空头部的帧可能会被固件丢弃,这种情况可以将MAC头的地址字段填为固定广播值,仅保留24字节的最小802.11头部即可,是当前消费级硬件可实现的最小开销。

接收逻辑

通过 dev_add_pack 注册的处理函数可以正常接收自定义帧,配置步骤如下:

  • 定义 struct packet_type 实例,type 字段填发送时使用的自定义协议号,dev 字段绑定到目标Ad-Hoc网卡(填NULL则会监听所有网卡的对应协议帧)
  • 将实例的 func 字段绑定自定义帧处理回调,内核收到匹配协议号的帧后会直接调用该回调,不会进入IP层等上层处理逻辑,回调内可直接获取完整payload

高精度时间戳获取

内核原生提供纳秒级时间戳能力,完全可以避免毫秒级延迟干扰:

  • 发送时间戳:可在调用 dev_queue_xmit 后直接调用 ktime_get_real_ns() 获取,或hook网卡的 ndo_start_xmit 回调在硬件发送完成时打时间戳,精度可达微秒级
  • 接收时间戳:直接读取回调函数传入skb的 skb->tstamp 字段即可,该时间戳是网卡收到帧时驱动层自动打的,无上层栈延迟

内容的提问来源于stack exchange,提问作者HeS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:36:04