10G_ethernet学习记录(5):ICMP编写

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请求与回复的identifiersequence_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,上板

        后续综合工程实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值