网络数据包是网络上信息传输的基本单位。在FPGA中,以太网数据包的传送需遵循一定的协议。例如,采用avalon stream格式进行数据包传输。
图1 avalon stream格式数据包
每一个以太网数据包被切分为若干个avst packet。对于avst packet格式的数据包,在网络中,可能会出现以下异常情况。
(1)数据包到来时,首个avst packet的sop没有拉高;
(2)一个数据包传输完成后,最后一个avst packet的eop没有拉高;
(3)一个数据包过长(超过以太网MTU),或过短(小于64字节)。
当出现以上异常情况时,链路上的以太网数据包实际上是错误的。我们可以在FPGA中采用在缓存FIFO前增加过滤器的手段,将异常数据包检测出来并上报,阻止异常数据的进一步传播。
过滤器模块采用状态机对输入的avst packet进行检查。状态如下图2所示。
图2 过滤器模块状态图
(1)系统复位时处于IDLE状态。对于正常数据包,IDLE状态接收一个数据包的第一个avst packet,并转入PROC状态。PROC状态处理后续的avst packet,并在收到eop后转回IDLE状态。
(2)在IDLE状态,输入数据如果没有拉高sop,则报告丢失sop错误,丢弃数据包并仍然保持在IDLE状态内。此时因这个数据包被丢弃,过滤器无视接下来的输入数据,直到下一个sop出现。
(3)在IDLE状态,输入数据如果sop和eop同时拉高,则是一个短数据包。此时检测其长度,如果低于阈值则标记为过短包,报告过短包错误并丢弃这个数据包,并仍然保持在IDLE状态内。
(4)在PROC状态,输入数据如果再次出现sop,则意味着上一个数据包的eop丢失了。此时报告丢失eop错误,丢弃上一个以及这一个数据包,并返回IDLE状态。
(5)在PROC状态,存在计数器对输入数据包的累计长度进行统计。如果超过阈值,则标记为过长包,报告过长包错误,丢弃这个数据包并返回IDLE状态。
采用该过滤器可以有效过滤各种异常数据包情况,例如,下图所示的仿真波形展示了几种异常的数据包。
图3 过滤网口反压、丢失sop、丢失eop
从图3中可以看到,过滤器可以正确检测出网口反压丢包、丢失sop、丢失eop的情况,并进行上报。
图4 过滤过短过长数据包
从图4中可以看到,过滤器可以正确检测出过短数据包、过长数据包,并进行上报。最后为正确数据包的正常通行。