当前位置:   article > 正文

Linux USB虚拟网卡多板级联通信

usb虚拟网卡

        最近接到一个需求,把多个开发板通过USB连接,由一块主板通过USB,将AI计算任务分配给多个多块板同时计算,经过内部讨论,决定将USB虚拟成网卡,采用网络通信方式。为方便调试用PC代替一块开发板,如下图,三块板相连(下面PC和Board1用USB也是一样的,这里为方便就用网线)  

目录

 

一、Linux内核配置修改

二、网络配置修改

三、采用iptables地址转换的方式转发

四、三块开发板级联


一、Linux内核配置修改

本人使用的开发板有三个USB OTG接口,首先修改dts,USB0用作peripheral,USB1用作Host,上面的图,Board1 USB1连接Board2的USB0(PC和Borad1直接的网线连接,也可以用Board1 USB0连接PC提到,为方便调试直接用网线)。

修改Linux内核配置,开启USB虚拟网卡功能(有很多相关文章,这里不做详细介绍),同时开启Netfilter部分功能(需要用到Netfilter NAT 数据包转发功能,下面Netfilter开启项比较多,有些项可以不用开启)

 USB虚拟网卡相关配置可以参考:让Linux支持usb虚拟网卡。_我以为我爱了的博客-CSDN博客

二、网络配置修改

编译内核,下载到开发板,配置好各开发板IP地址。

此时,Board1可以ping通PC,也可以ping通board2,如下图:

 但是Board2 ping PC不通(Network is unreachable),如下图

由于Board2不知道192.168.10.10该怎么路由,ping命令直接返回网络不可达(没有对外发包)。

我们可以给Board2添加一个路由表项,告诉Board2 192.168.10.0网段的网关192.168.11.11(Borad1 USB0),即192.168.10.x的数据交由192.168.11.11转发。

添加路由表项后,ping 192.168.10.10,没有直接Network is unreachable,但是还是不通。

此时数据包到了Borad1 USB1口,在内核代码usbnet.c文件rx_process加一个打印qdmalib_dump_skb,打印出收到包的包头。

qdmalib_dump_skb打印函数如下

Board1日志可以看到, USB1收到了Board2发来的ICMP包,但是PC Wireshark抓不到相应的包,应为还没有在Borad1上开启NAT转发功能。

Borad1上开启NAT转发功能: 

 上面的设置重启后就不起效了,可以在/etc/sysctl.conf中增加net.ipv4.ip_forward = 1。

通过PC端通过Wireshark,可以看到,有收到Board2 192.168.11.12发过来的ICMP包,PC没有回复。

查看PC路由表,没有192.168.11.12所在网段表项,PC不知道192.168.11.12该怎么路由,所以没有回复收到的ICMP包。

 

 直接在PC端增加静态路由,设置192.168.11.0网段网关192.168.10.11(也就是Board1的网口),之前已经在Borad1上开启了转发功能。

 此时Board2 ping PC,可以ping通。

Wireshark抓包,可以看到ICMP源地址是Board2的IP地址

试一下,从PC端ping Borad2也可以。

三、采用iptables地址转换的方式转发

 上面的方式Board2 ping PC时,PC端收到ICMP包源地址还是Borad2的IP地址,我们改一下Board1配置,转发时,将Borad2 IP地址替换为Borad1 eth0口的IP地址(内网到外网转发就是如此实现的)。

在Board1上执行命令:

iptables -t nat -A POSTROUTING -d 192.168.10.0/24 -o eth0 -j MASQUERADE

发往192.168.10.0网段的数据,走eth0口转发,并且替换为eth0 IP地址。

此时Board2 ping PC也可以通,Wireshark抓包可以看到,收到的ICMP包Source IP变为了192.168.10.11(Board1 eth0的IP)。

iptables是一个开源的应用程序包,需要自己下载源码编译,具体参考下面两篇博客,这里不做详细介绍。

 交叉编译iptables_iptables交叉编译_aaaLG的博客-CSDN博客

Linux之iptables(NAT表)讲解篇_iptables nat表_孤城286的博客-CSDN博客

四、三块开发板级联

三块开发板级联,同时Board1通过网口连接到PC

PC端配置:

Board1配置

 

 Board2配置,这里eth0没有连接,忽略

 

 Board3配置

从Board3可以ping通PC。

 这里采用的是pc <--> board1 <--> board2  <--> board3,一级一级相连的方式,实际上采用星型拓扑连接方式也可以,需要相应的修改路由配置。

上面ping延时很多,是应为调试是开启了日志功能加了打印 

最后觉得没必要采用iptables地址转换的方式转发,所以去掉部分配置,最终增加的配置 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/991632
推荐阅读
相关标签
  

闽ICP备14008679号