首页>>科技 >>内容

基于XC2VP20—FF896CGB0345,FPGA实现IPV6数据包的拆装

发布时间:2023-11-30 09:08:22编辑:温柔的背包来源:

很多朋友对基于XC2VP20—FF896CGB0345,FPGA实现IPV6数据包的拆装不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

基于XC2VP20—FF896CGB0345,FPGA实现IPV6数据包的拆装

作者:王志远,杜世武,曲静

我在参与国家“863”重大专项“高速密码芯片及验证平台系统”的过程中,遇到了将IPV6数据包的报头和数据部分进行拆解,然后将数据部分送到密码芯片进行加密/解密处理,最后将处理后的数据部分和报头重新打包成数据包的问题。

以往IP包的拆装大多是通过软件实现的,但这个项目涉及到与高速密码芯片(处理速度在2Gbit/s以上)协同工作的问题。显然,软件拆解IP包的速度达不到要求。因此采用FPGA(Xilinx公司的XC2VP20—FF896CGB0345)对IPV6数据包进行拆解和组装。FPGA的内部逻辑框图如图1所示。

图1 FPGA内部逻辑框图。其工作流程如下:2.5GHz标准IPV6分组串行差分信号经过ROCKETIO高速通道后转换为16位125MHz并行信号,再由信号转换模块进一步转换为66位62.5MHz并行信号,然后对输出数据进行判断。如果是头,就送到FIFO1 3缓存,如果是数据部分,就送到FI。

FO2缓存,最后将FIFO2数据发送到密码芯片进行处理;密码芯片处理后的数据先放入FIFO4缓存,然后控制FIFO3和FIFO4将一个数据包的头和数据写入FIFO5,重新打包成一个完整的数据包;重新打包的IPV6数据包通过信号转换模块转换成16位125MHz并行信号,再通过ROCKETIO高速通道转换成2.5GHz高速串行差分信号。可以看出,经过上述过程后,一个包被拆分并重新打包。

1 IPV6包拆分利用FPGA来拆分IPV6包,主要是通过控制几个FIFO的数据输入输出。FPGA中拆分单元电路的物理连接如图2所示,其中FIFO1用于缓存IPV6数据包,FIFO2用于缓存IPV6数据包的数据部分,FIFO3用于缓存IPV6数据包的报头。图2分离单元电路的物理连接图

图中的三个FIFO都是由Xilinx公司的开发工具ISE6.1的核心IP生成的。其中,FIFO1和FIFO3为同步FIFO,工作时钟为62.5MHz,输入输出数据宽度为66bit。FIFO2为异步FIFO,输入时钟频率为62.5MHz,输出时钟频率为50MHz(密码芯片工作时钟频率为50MHz),输入输出数据宽度均为64bit。

FIFO1的输入数据是IPV6数据包,格式如表1所示。可以看出,数据以并行66位信号传输,即每个时钟周期并行传输66位数据。每个周期的前两位(65位和64位)是数据包的头尾标志,由IPV6路由器根据实际处理需要添加。“10”代表一个完整数据包的第一个周期,“11”代表数据包的中间内容,“01”代表一个完整数据包的最后一个周期。

因为IPV6数据包的报头具有40字节的固定长度(等于564位),所以前五个数据周期是IPV6数据包的报头,后面是数据包的数据部分。

接下来,讨论分割IPV6分组的报头和数据部分的过程。首先,判断FIFO1输入端数据的头尾标志数据(65 ~ 64)和FIFO1的满标志。如果data(65 ~ 64)=“10”且full 1=“0”,即判断到达了一个完整数据包的开始且FIFO1未满,则FIFO1的写使能WR_EN1有效,以写入数据。如果data(65 ~ 64)=“01”,即判断一个完整的数据包结束时,使WR_EN1无效,从而在FIFO1中缓存一个完整的数据包。

当判断出FIFO1的空标志为“0”,即FIFO1不为空时,FIFO1的读使能信号RD_EN1被置位,FIFO1中的数据被读出,直到empty1为“1”,即FIFO1为空。设置计数器COUNTER1对读取的数据进行计数,当DOUT1不为0时开始计数,即FIFO1输出有信号。

05: 00,WR_EN3无效,WR_EN2有效,IPV6报文的数据部分送到FIFO2缓冲,准备送到密码芯片处理,直到头尾标志dout 1(65 ~ 64)=“01”,COUNTER1清零,判断COUNTER1为0后,WR_EN2无效。注:FIFO1的输出端口是66位,FIFO2的输入端口是64位。因此,在从FIFO1向FIFO2写入数据的过程中,FIFO1的输出端口信号Dout1 (63 ~ 0)应传输到FIFO2的输入端口Din2 (63 ~ 0)。

当判断FIFO2不为空时,读使能信号RD_EN2被设置为有效,数据可以被发送到密码芯片。

2 IPV6数据包的重新打包IPV6数据包的重新打包是通过控制几个FIFO的数据输入和输出来实现的。FPGA中重新打包单元电路的物理连接如图3所示,其中FIFO4用于缓存密码芯片发送的加密数据。FIFO5的功能是缓冲重新打包的IPV6数据包;FI FO3与分割单元共享,以缓存IPV6数据包报头。图3物理连接到重新封装单元电路的图图4密码芯片的输出指令格式。

图中FIFO4和FIFO5也是由Xilinx公司的开发工具ISE6.1的内核IP生成的,其中FIFO4是异步的,输入时钟为50MHz,输出时钟为62.5MHz,输入输出数据宽度为66bitFIFO5为同步FIFO,工作时钟为62.5MHz,输入输出数据宽度均为66bit。

数据加/解密完成后,密码芯片在发送处理后的数据前,向外部系统发送64位接收指令,指示处理数据所使用的加解密算法和数据长度。例如,在对数据进行3DES加密处理的情况下,接收到的指令的格式(十六进制)如图4所示,其中高56位是指令代码,低8位是要输出的已处理数据的长度。

因此,当接收到处理数据时,首先判断是否有接收指令。如果有接收指令,则将接收指令中的数据长度放入寄存器进行注册,并设置计数器COUNTER2开始计数。为0时,包头已缓存在FIFO3中,处理后的数据已按照格式要求缓存在FIFO4中。最后要做的是控制FIFO3和FIFO4,并将一个完整的IPV6数据包写入FIFO5。

具体方法是:设置COUNTER3,当FIFO3和FIFO4不为空时,COUNTER3开始计数。当计数器3 > 0时,FIFO5的写使能信号WR_EN5被断言;当计数器3=0时,WR_EN5被设置为无效。当0=6时,RD_EN3无效,RD_EN4有效,FIFO4的输出数据dout4 (65 ~ 0)写入FIFO5的输入端din5 (65 ~ 0),直到dout 4(65 ~ 64)=“01”,计数器3清零,RD_EN4无效。

这样,一个完整的IPV6数据包被重新打包到FIFO5中。当判断FIFO5不为空时,可以使RD_EN5有效,并且可以输出处理后的完整IPV6分组。

从上面的讨论中,我们可以看到FPGA中使用了五个FIFO,并设置了三个计数器来控制这五个FIFO的输入和输出,以拆分和重新打包IPV6数据包。总体来说,整个FPGA设计思路巧妙,电路结构简单,达到了预期的处理速度。图5示出了在将1024字节的IPV6分组解包、将其发送到密码芯片进行加密和重新打包之后,在测试仪的控制软件界面上显示的分组接收数据的统计。

从图中可以看出,整个系统对于IPV6数据包的处理速度达到了2.372Gbit/s,这是用软件无法实现的。

图5测试仪收包数据统计

以上知识分享希望能够帮助到大家!