1. 引言
以太网络通信中,网卡硬件FPGA中需要对网络流量报文进行解析识别,过滤分流,编辑等处理。报文编辑常见的有NAT,vlan添加和删除,checksum 计算等。报文的过滤分流,一般针对报文头信息进行匹配处理,此时不需要报文负载内容。那么报文需要先缓存起来,等待报文编辑时再使用。
2. 常见实现方法
2.1 方法一
缓存的报文数据量比较少,则可以使用FPGA的片上BRAM建立报文缓存。FIFO缓存是最简单的报文缓存形式,适用于流式处理框架,每个报文只读取处理一次。若需要多次读取处理,使用RAM缓存更容易控制,避免二次缓存,避免流量处理的阻塞。
RAM缓存进一步可以区分成顺序写入和顺序读出框架和非顺序写入和顺序读出框架。
顺序写入和顺序读出框架,对所有流量报文等价处理,不区分优先级,即先进入的流量报文肯定先读出。将当前报文处理动作完成后,才读出处理下一个报文。缓存可用空间通过写入和读出指针的差值计算得到。这个架构无差别处理,损失了流量处理的灵活性,某些处理时延小的报文,只能等待前面流量报文处理后再输出。对于缓存不同业务流量的应用,需要减少不同业务流量处理的相互干扰,即不用业务流量报文共享了报文缓存,需要区别对待,根据各自的实际处理时延乱序输出。
非顺序写入和顺序读出框架,即支持了报文乱序输出的框架。流量报文的长度不一,需要对存储空间进行分块编号。一个报文对应多个存储块位置。存储块的编号,使用存储块编号管理器进行分配和回收。接收写入报文时,分配消耗存储块。当可用的存储块编号不足时,不能再存储新的报文。一个报文会使用多个任意编号的块进行存储。一个报文处理动作完成后,通知存储块编号管理器回收存储块编号。
2.2 方法二
缓存的报文数据量比较大,FPGA的片上BRAM不足以缓存流量报文,需要使用更大容量的片外缓存,比如DDR4存储器。一个DDR4-2400 MT/s, x32比特的存储通道,能够支持大约70Gbps的读写带宽。此时构建片上缓存和片外缓存结合的缓存机制,能够结合片上低时延大带宽和片外大容量缓存的特性。
3. 结论
基于FPGA的报文缓存方法,没有固定的一招鲜方式,需要结合具体应用场景,硬件配置,确认具体的报文缓存实现方法。