0,ICMP协议
type&&code
在FPGA中我们只做 00 (ping回应),80(ping请求)。
在ping功能,如下:
下面是使用wireshark抓取ICMP去ping百度的网页:
1,工程编写
本工程包含icmp_module,icmp_rx,icmp_tx。ICMP层相比于前面是比较简单的。
module _10g_icmp_module
(
input i_clk ,
input i_rst ,
output [ 63:0] m_axis_ip_data ,
output [ 55:0] m_axis_ip_user ,//16len + 8type + 16ip + 3mflag + 13offset
output [ 7:0] m_axis_ip_keep ,
output m_axis_ip_last ,
output m_axis_ip_valid ,
input [ 63:0] s_axis_ip_data ,
input [ 55:0] s_axis_ip_user ,//16len + 8type + 16ip + 3mflag + 13offset
input [ 7:0] s_axis_ip_keep ,
input s_axis_ip_last ,
input s_axis_ip_valid
);
1.1,icmp_rx
该层的作用主要是接受IP层发送过来的ICMP数据,进行解析,分辨是ping请求还是回复(FPGA做回复,请求一般在上位机通过ping命令实现)。
module _10g_icmp_rx
(
input i_clk ,
input i_rst ,
input [ 63:0] s_axis_ip_data ,
input [ 55:0] s_axis_ip_user ,//16len + 8type + 16ip + 3mflag + 13offset
input [ 7:0] s_axis_ip_keep ,
input s_axis_ip_last ,
input s_axis_ip_valid ,
output [ 15:0] o_identifier ,//标识符
output [ 15:0] o_sequence_number ,//序号
output o_trigger //触发信号,回复报文
);
我们在wireshark中抓取两个ping报文可以发现
可以发现ping请求与回复的identifier与sequence_number是一样的,且最后会补充数据6161.。。6869;我们就按照这个来进行编写代码。
首先需要将ping请求报文中的identifier与sequenc_number提取出来,发送给icmp_tx模块。
仿真模型:
1.2,icmp_tx
主要进行icmp报文组帧,实现icmp回复功能。
module _10g_icmp_tx
(
input i_clk ,
input i_rst ,
output [ 63:0] m_axis_ip_data ,
output [ 55:0] m_axis_ip_user ,//16len + 8type + 16ip + 3mflag + 13offset
output [ 7:0] m_axis_ip_keep ,
output m_axis_ip_last ,
output m_axis_ip_valid ,
input [ 15:0] i_identifier ,//标识符
input [ 15:0] i_sequence_number ,//序号
input i_trigger //触发信号,回复报文
);
因为ICMP报文头一个64b即可产生,剩余的byte不出wireshark中抓取到的:
Data: 6162636465666768696a6b6c6d6e6f7071727374757677616263646566676869
组帧数据:
always @(posedge i_clk) begin
if (i_rst) begin
r_m_axis_ip_data <= 'd0;
end
else begin
case (r_frame_cnt)
1 :r_m_axis_ip_data <= {8'd0, 8'd0, 16'd0,r_i_identifier,r_i_sequence_number};//ICMP可以不用做校验和
2 :r_m_axis_ip_data <= 64'h6162636465666768;
3 :r_m_axis_ip_data <= 64'h696a6b6c6d6e6f70;
4 :r_m_axis_ip_data <= 64'h7172737475767761;
5 :r_m_axis_ip_data <= 64'h6263646566676869;
default :r_m_axis_ip_data <= r_m_axis_ip_data ;
endcase
end
end
仿真波形:
可以看到在有i_trigger拉高之后,icmp_tx组成回复报文。
2,上板
后续综合工程实现