我用boost.asio扩展编写了一个桥接器(第二层交换机)。我们可以很容易地制作满足类型要求的附加套接字、端点和协议。我的扩展使用了linux的packet socket withAF_PACKET
,SOCK_RAW
和htons(ETH_P_ALL)
(有关packet socket的更多信息,请参见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尝试将ping(icmp)数据包发送到router1。要发送到PC3,PC1必须知道路由器1的MAC地址,所以PC1向
FF:FF:FF:FF:FF:FF
发送ARP请求,我在PC2上运行的网桥从eth0接收并发送到wlan0,但路由器1从不向PC1发送ARP应答。注意:sock_raw数据包在数据包数据没有任何变化的情况下从设备驱动程序传递到设备驱动程序。(引自文件包手册页)
我应该怎么做才能让PC1与路由器1通信?
谢谢您。
编辑:
这是我的提振信号。作为分机。
github: pfpacket/libarex
这是我上面用的桥。
libarex/example/layer2_switch/interface_bridge.cpp
最佳答案
我正在写我们在评论中讨论的内容。
无线桥接是有问题的(至少在linux下,我不知道其他的情况)。调查显示,很可能用作桥接器的硬件的无线驱动程序或芯片组无法执行桥接操作(brctl
失败支持此假设)。
其他可能的原因,如上面的链接中所解释的,可能是ap丢弃具有未关联mac地址的分组等。
此外,代码对于有线接口也很好,因此在某些层上是硬件问题。没什么好说的了。