使用内核空间中的原始套接字将数据包从NIC转发到WiFi



对于一个项目,我有两台带有两个无线接口(wlan0和wlan1(和一个NIC的笔记本电脑,让我们称之为Sender和Receiver。我想做的是将通过其以太网接口到达Sender的奇数数据包通过wlan0发送到Receiver笔记本电脑,甚至将通过wlan1到达的偶数数据包发送到Received笔记本电脑。我想通过任何允许我通过代码检查每个数据包的方式来做到这一点,这样我就可以在需要时修改任何内容或更改发送策略,我想在内核空间中这样做,因为对于这个特定的任务,低延迟非常重要。

假设所有接口都设置正确(发送方的wlan0连接到接收方的wlanO,对于wlan1也是如此(,原始套接字是最快的选择吗?

有什么"简单"的方法可以将802.3报头更改为802.11报头吗?

我将尝试的步骤大致如下:

  1. 打开接收原始套接字和发送原始套接字
  2. 接收以太网数据包,提取上层
  3. 用802.11报头封装
  4. 通过原始套接字发送修改后的数据包

我唯一不清楚的步骤是第三步,我希望在这方面得到任何帮助。

  1. 有没有"容易";如何将802.3标头更改为802.11标头

是。这是对付他们的唯一正确方法。不要改变它们!802.3和802.11都是OSI模型的数据链路层的一部分。处理这些标头是NIC驱动程序的职责,但不是您的职责,至少在您对编程特定NIC设备感兴趣之前是这样。根据您的项目描述,您需要捕获从以太网卡的NIC驱动程序的RX队列中推出的每一帧,并将它们转发到一个WLAN NIC或另一个WLAN网卡的驱动程序的TX队列。您只需要一个策略,在中间适当地替换收件人的MAC地址——桥接。

  1. 原始套接字是最快的选择吗

Sockets是一个面向用户空间进程的接口,用于在内核中实现的网络设施。您提到您关心延迟,因此计划在内核中实现桥接——因此,在套接字接口下面。在内核模式中,您必须处理套接字缓冲区描述符(struct sk_buff(,这些描述符使用相应的元数据封装帧,并依赖于所谓的新API(NAPI(。您可以查看struct net_device和字段rx_handler,它们似乎主要是为了桥接目的而实现的。

最新更新