Linux 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地址转换的方式转发,所以去掉部分配置,最终增加的配置 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux USB虚拟网口指的是将USB接口虚拟成网络接口的功能。通过修改设备树(dts)文件,可以将USB OTG接口设置为虚拟网口的方式。例如,可以将USB0接口设置为peripheral模式,将USB1接口设置为Host模式,并通过USB连接多个开发。这样,通过网络通信方式,可以在一块主上将AI计算任务分配给多个开发同时计算。在使用Atlas 200 DK开发者与Ubuntu服务器直连的场景下,需要将Atlas 200 DK的USB网卡的默认IP地址修改为192.168.1.2,并将Ubuntu服务器的USB虚拟网卡的IP地址设置为192.168.1.x(x取值范围为01-3254),以实现两者之间的通信。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux虚拟机连接USB网络设备(以Atlas 200DK为例)无法上网、无法检测到网卡等故障排除](https://blog.csdn.net/weixin_42981609/article/details/127272943)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux USB虚拟网卡通信](https://blog.csdn.net/qq_33549208/article/details/131520550)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值