当前位置:首页 > > 程序员写个解
[导读]最近某项目采用以太网通信,实践起来有些奇怪,好像设计成只能应答某类计算机的ICMP(ping)命令, 某类计算机指的是Windows特定系统,其他系统发送ping都不能正确识别。

2022-9-23

最近某项目采用以太网通信,实践起来有些奇怪,好像设计成只能应答某类计算机的ICMP(ping)命令, 某类计算机指的是Windows特定系统,其他系统发送ping都不能正确识别。

其实不奇葩

白蔡:“吴哥,江湖救急!甲方爸爸的电路板寄过来好几天了,我一直搞不定它的以太网。”

甲方爸爸干系统集成的,要把我们两家产品打包售卖,甲方设计FPGA,我方设计嵌入式Linux,两块电路板采用以太网直连 方式通信。桌面上摆放的是双方的成熟产品,一根网线连接,简单到不能再简单了。

白蔡:“他们的产品很奇葩,FPGA的IP固定为192.168.1.6,我方的IP必须是192.168.1.7,以太网也必须千兆不协商。”

吴解两手撑着脸坐在白蔡工位:“有什么奇怪的,已发表论文都是怎么干的,FPGA--以太网--处理器,班内通信才这么搞定。没有省去路由协议,FPGA没必要设计复杂的协议栈应答模式,IP什么的仅为了填充协议栈,写死就写死,” 上挑眉毛,“说说你遇到的具体问题。”

白蔡:“奇怪的是我做如下三组实验,嵌入式Linux和FPGA好像没有应答, 当然,实验前桌面电脑和嵌入式Linux都已经设置成千兆不协商

三组对照实验如下:

  • 桌面电脑ping FPGA,OK

  • 桌面电脑ping 嵌入式Linux,OK

  • 嵌入式Linux ping FPGA,无响应

对描述者保持怀疑

吴解:“3个步骤,你再演示一遍给我看。”怀疑白蔡没有正确描述现象。

白蔡在桌面电脑设置固定千兆速率:本地连接->属性->配置->高级->速度和双工->1.0 Gbps全双工。嵌入式也用ethtool设置固定千兆速率,重复3个步骤与所述一致。

确认网速

吴解扛来示波器,验证嵌入式Linux和FPGA通信速率是不是都真的工作在千兆模式。ethtool也不是所有网卡驱动都支持,虽然/sys/class/net/eth0/speed显示着1000,有可能显示和实际不一致。

FPGA的板子毕竟不是自己画的,不太好找。

示波器测试MAC和PHY之间的通信速率,如果是125MHz表明工作在千兆模式,结果显示均为125MHz。

检查线序

白蔡:“会不会是网线的问题呢?嵌入式Linux莫非不能同时兼容交叉线、直通线?嵌入式Linux和桌面电脑连接后,桌面电脑完成收发自动翻转,于是通信成功。”

吴解:“不能自动翻转线序的网卡我只在2010年前见过一次,负责线序翻转是网卡PHY的附加功能,目前市面上的PHY都具备。”

两人去库房借来另一块同型号的嵌入式Linux板卡,确认两块嵌入式Linux板卡所用的PHY是同型号的,毕竟近些年芯片之间的Pin to Pin替换解决方案挺多。并准备两根交叉线和直连线。

如果两块嵌入式Linux板卡接入任何一根网线都能ping通,则表明板载PHY支持自动翻转线序。实验证明与网线无关。

tcpdump抓包

吴解:“是挺邪门,光猜是猜不出来的,试试tcpdump能呈现些什么东西。”

打开tcpdump后更邪门的事情发生了,FPGA居然有回应ICMP包!不会是FPGA设计的协议栈阉割得太多了吧。

疑点1、两网卡连接后首先交互的是ARP协议,在没有完成ARP协议前不可能发送ICMP协议,既然嵌入式Linux能发送ICMP表明ARP协议已经交互完成;

疑点2、嵌入式Linux ping FPGA和桌面电脑的效果不一样,首先注意到ID值,正常情况下ID值应该与发送的一致;

吴解以前移植过ICMP协议,映像里ICMP协议实现起来很简单,ID用于表征对端回应的ICMP reply是哪一个,毕竟两机器之间间隔若干路由器,每个数据包可能选择两条不通的链路返回,后发送的ICMP reply可能比先发送的先被终端收到。

busybox源码的把ID号作为判断依据。

wireshark分析

不过奇怪的是,为什么桌面电脑ping却能正常响应呢?

吴解用tcpdump把抓包的内容保存成通用格式pcap,在自己的电脑上用wireshark打开。文件保存了两份,一份是桌面电脑与FPGA的数据,一份是嵌入式Linux与FPGA的数据。

FPGA返回给桌面电脑的ICMP replay数据里ID项是跟着request变化的,不是固定的1。

猛然间发现,request和reply的长度是不一样的,分别是98字节和74字节,点开数据区域观察到数据填充内容完全不同。FPGA返回的数据区域是“abcd”开头。

看着数据区的内容吴解预感找到现象原因了,随即用自己的桌面Linux系统ping FPGA板卡也没通。跑到白蔡的工位:“你有没有桌面电脑Ubuntu系统上测试过ping FPGA板卡?”

白蔡:“没有,现在没兴趣,emo了。”

白蔡有两台桌面电脑,一台Windows一台Ubuntu,演示时仅演示Windows系统,下意识的认为白蔡之前也在Ubuntu上测试过。

吴解:“问题找到了,甲方提供的FPGA板卡ICMP reply模仿Windows格式,Windows的request就是以abcd开头的。我猜测你如果用windows设置ping包大小,FPGA同样不会正确返回。”

白蔡来了精神,抓取Windows上的ICMP request数据,果真是“abcd”开头:“也就是说后续可以正常开发应用层协议,不必管ping吗?”

吴解:“是的。”

后来白蔡找甲方爸爸确认,他们的确是模仿Windows的reply包做的。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭