我使用我的 Boost.Asio 扩展编写了一个桥接器(第 2 层交换机)。我们可以轻松地制作满足其类型要求的其他套接字、端点和协议。我的扩展使用带有AF_PACKET
,SOCK_RAW
和的 linux 数据包套接字htons(ETH_P_ALL)
(man 7 packet
有关数据包套接字的更多信息,请参阅)。
这是一个解释我的桥如何工作的示例:
[PC1] <----> IF1[PC2]IF2 <----> [PC3]
网桥连接网络接口(例如 eth0)IF1 和 IF2,因此 PC1 可以通过在 PC2 上运行的网桥与 PC3 通信。连接接口的方式是将接收到的数据包从 IF1 发送到 IF2(反之亦然)
我的网桥按预期在有线连接下工作,但在无线连接下不起作用。所以我试图找出导致这个问题的原因,我发现 ARP 请求从未成功。
导致此问题的实际环境是:
[PC1] <--wired--> eth0[PC2]wlan0 <--wireless(802.11g)--> [router1]
例如,在上述环境下,现在 PC1 尝试向 router1 发送 ping(ICMP) 数据包。要将其发送到 PC3,PC1 必须知道 router1 的 MAC 地址,因此 PC1 向 PC1 发送 ARP 请求,FF:FF:FF:FF:FF:FF
而我在 PC2 上运行的网桥从 eth0 接收它并将其发送到 wlan0,但 router1 从不向 PC1 发送 arp 回复。
注意:SOCK_RAW 数据包传入和传出设备驱动程序,数据包数据没有任何变化。(引用自数据包的手册页)
我应该怎么做才能让 PC1 与 router1 通信?
谢谢你。
编辑:
这是我的 Boost.Asio 扩展。
github:pfpacket/libarex
这是我上面使用的桥。
libarex/example/layer2_switch/interface_bridge.cpp