NCSI开发指南(三)
摘要:NCSI网卡需通过设置过滤寄存器处理共享网口的报文转发,包括广播包、单播包和VLAN过滤等关键命令配置。IPv6报文过滤需通过邻居发现协议自学习实现。真机调试中,抓包分析是解决疑难问题的关键,如通过RMII总线数据流分析丢包原因。当多网卡共享总线时,需正确处理select/deselect命令以避免总线竞争,修改固件行为将报文缓存后再转发可解决丢包问题。
一、网络报文的过滤
控制命令调通后就可以上真机了,这个时候就需要处理网络报文了。
外界发到NCSI网卡的共享网口上的报文,需要判断一下是给到linux内核的还是给到BMC的,这里就需要设置网卡芯片的过滤寄存器了。
具体怎么设置过滤,各家芯片的设计不同,但是原理相似。
和过滤相关的NCSI命令有以下几条:

比如说,当收到Enable Broadcast Filter命令之后,固件除了需要回复这条命令之外,还需要打开广播包的过滤开关,让共享网口收到广播包之后,可以转发到BMC,这个是必须的,要不然,ARP报文都不通,外界也就无法Ping通BMC了。
Set Mac Address命令比较重要,是单播过滤的最重要的命令,当收到这个命令之后,固件就需要配置单播过滤的MAC地址,设置完之后,只有目的地址是BMC芯片的Mac地址的单播包才会转发给BMC。
Set VLAN Filter命令和Enable VLAN命令配合使用,Set VLAN Filter会确定一个VLAN的ID号,意图是:只有符合该ID号的报文会发送给BMC,所以固件也必须在芯片的VLAN过滤寄存器作对应的配置。
Enable Gloabal Multicast Filter是组播过滤开关,这个也挺重要,如果不打开的话,IPv6就无法进来了。和IPv4报文不同,存在NCSI命令去配置Mac地址过滤。IPv6的过滤并没有一条专有的NCSI命令去进行配置。所以,BMC的IPv6报文过滤需要网卡固件通过邻居发现协议去自学习,大概原理是,在BMC芯片往外发送的NA报文中可以得到BMC的IPv6地址,得到这个IPv6地址后配置芯片的IPv6过滤寄存器即可。
二、抓包调试
真机调试一般抓包是关键。
可以通过串口或者Jlink打印的方式,把网卡RMII通道上的数据流都打印出来,保存成文件。
这个文件就可以放到Wireshark去解析了。
各种疑难杂症其实都是首先通过抓包分析得到第一手资料的。
比如有一个案例,某客户的服务器上插了我们的NCSI网卡,远端通过该NCSI网卡的共享网口去ping该服务器的BMC的时候,发现有丢包。
我让客户打开RMII的打印后,得到如下数据:

可以看到除了Ping报文之外,有很多Select Package和Deselect Package的命令报文
这个报文的意思得说明一下,首先看一下NCSI网卡的拓扑图

一般来说,一张网卡占用一个独立的Package号,如上图的左侧所示。
但是,当一条RMII总线上有多张网卡的时候(很多情况下是一张板载网卡和一张OCP卡),就如上图的右侧A所示。在大多数情况下,一般BMC只会选用其中的一张网卡的一个网口作为共享网口,这种情况下其他方向上的网卡的流量是关闭的。
但是少数场景下,BMC有同时和几个网卡进行通信的需求,这个时候,BMC为了可以区分网络流量来自于哪张网卡,避免总线竞争,就需要仲裁。仲裁分为硬件仲裁和命令仲裁,如果网卡和BMC都支持硬件仲裁,则不会产生总线竞争的问题,如果网卡不支持硬件仲裁,则只能采用命令仲裁的方式,其原理是,在通信的时候,BMC会发送deselect package命令来关闭一个方向的流量,select package命令打开另一个方向的流量,收到deselect package命令的网卡,必须马上释放RMII总线,不再往RMII总线的RXD上发送数据,否则还是会产生总线竞争问题。
在我们之前的固件设计中,没有考虑到这种情况,收到Passthrough报文的时候,只要符合BMC过滤条件,是直接转发给BMC的,这就会导致丢包。
修改后的行为是这样的:当收到deselect package命令之后,需要把passthrough报文缓存起来,等到下次收到select package命令之后再一起发送给bmc,这样问题就解决了。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)