基于FPGA的UDP协议栈设计第三章_ARP层设计

news/2024/5/18 14:09:01 标签: udp, 网络协议, 网络, fpga开发, 学习

文章目录

  • 前言:ARP层报文解析
  • 一、ARP接收
  • 二、ARP发送
  • 三、ARP缓存表
  • 总结

前言:ARP层报文解析

在这里插入图片描述

在这里插入图片描述

  1. 当要和一个目的IP进行通信时,首先检查自己的ARP缓存表,是否存在目的IP对应的目的MAC,如存在则不会触发ARP请求与应答过程,直接根据ARP缓存表项封装目的MAC;

  2. 不存在arp缓存表,触发arp请求,对方收到arp请求,根据arp报文中的目的IP判断,是否寻找的主机是自己,如果是则发送arp响应携带自己的MAC地址, 回复对方。

一、ARP接收

该模块对接收到的ARP报文进行解析,主要是解析收到的是请求ARP还是回复ARP。
请求ARP:获取请求报文当中的源MAC和源IP,这些内容会作为回复ARP当中的目的地址,同时检测请求ARP当中的目的IP,如果是本机,则产生一个触发回复信号o_trig_reply给ARP_TX模块,发送模块会产生相应的回复报文;同时请求报文当中的源MAC和源IP也会被发送到ARP_table进行缓存。
回复ARP:获取请求报文当中的源MAC和源IP,将其缓存到ARP_table模块

二、ARP发送

首先系统上电会进行一次主动ARP,当ARP_TX模块收到主动ARP信号请求时,会产生一个ARP请求报文;其次当收到ARP_RX模块的o_trig_reply信号时,会产生一个回复ARP报文。就如何进行组帧的部分前俩章都进行了介绍,不做赘述。

always @(posedge i_clk or posedge i_rst)begin
    if(i_rst)
        ro_mac_data <= 'd0;
    else case (r_arp_cnt)
        0       : ro_mac_data <= 8'h00;             //硬件类型,对以太网,值为1
        1       : ro_mac_data <= 8'h01;             
        2       : ro_mac_data <= 8'h08;             //协议类型,IP 0x0800
        3       : ro_mac_data <= 8'h00;     
        4       : ro_mac_data <= 'd6;               //硬件地址长度
        5       : ro_mac_data <= 'd4;               //协议长度
        6       : ro_mac_data <= r_arp_op[15:8];    //操作类型
        7       : ro_mac_data <= r_arp_op[7 :0];
        8       : ro_mac_data <= r_src_mac[47:40];
        9       : ro_mac_data <= r_src_mac[39:32];
        10      : ro_mac_data <= r_src_mac[31:24];
        11      : ro_mac_data <= r_src_mac[23:16];
        12      : ro_mac_data <= r_src_mac[15: 8];
        13      : ro_mac_data <= r_src_mac[7 : 0];
        14      : ro_mac_data <= r_src_ip[31:24];
        15      : ro_mac_data <= r_src_ip[23:16];
        16      : ro_mac_data <= r_src_ip[15: 8];
        17      : ro_mac_data <= r_src_ip[7 : 0];
        18      : ro_mac_data <= r_arp_op == P_ARP_OP_REPLY ? ri_reply_mac[47:40] : 8'h00;
        19      : ro_mac_data <= r_arp_op == P_ARP_OP_REPLY ? ri_reply_mac[39:32] : 8'h00; 
        20      : ro_mac_data <= r_arp_op == P_ARP_OP_REPLY ? ri_reply_mac[31:24] : 8'h00;
        21      : ro_mac_data <= r_arp_op == P_ARP_OP_REPLY ? ri_reply_mac[23:16] : 8'h00;
        22      : ro_mac_data <= r_arp_op == P_ARP_OP_REPLY ? ri_reply_mac[15: 8] : 8'h00;
        23      : ro_mac_data <= r_arp_op == P_ARP_OP_REPLY ? ri_reply_mac[7 : 0] : 8'h00;
        24      : ro_mac_data <= r_dst_ip[31:24];
        25      : ro_mac_data <= r_dst_ip[23:16];
        26      : ro_mac_data <= r_dst_ip[15: 8];
        27      : ro_mac_data <= r_dst_ip[7 : 0];
        default : ro_mac_data <= 'd0; 
    endcase
end

三、ARP缓存表

该模块将接收到的回复ARP报文中的MAC和IP地址进行保存,主要通过俩个RAM实现。
当IP层进行组帧时,根据目标IP地址会发出一个寻找请求i_seek_valid和寻找IP信号i_seek_ip到该模块,该模块会查找相应的MAC地址,如果找到则返回对应的MAC地址,如果没有,则返回48’hffff_ffff_ffff,即广播MAC。

RAM_IP RAM_IP_u0 (
  .clka     (i_clk          ),     
  .ena      (r_ip_ram_en    ),     
  .wea      (r_ip_ram_we    ),     
  .addra    (r_ip_ram_addr  ),     
  .dina     (r_updata_ip    ),     
  .douta    (w_ip_ram_dout  )      
);
RAM_MAC RAM_MAC_u0 (
  .clka     (i_clk          ),     
  .ena      (r_mac_ram_en   ),     
  .wea      (r_mac_ram_we   ),     
  .addra    (r_mac_ram_addr ),     
  .dina     (r_updata_mac   ),     
  .douta    (w_mac_ram_dout )      
);

这里多提一句: 对于广播的ARP报文,ARP当中的目的MAC字段为全0,MAC层目的MAC地址字段全F。

总结

完整代码参考GitHub:https://github.com/shun6-6/Tri_Eth_UDP_pro_stack


http://www.niftyadmin.cn/n/5446313.html

相关文章

总结 | vue3项目初始化(附相应链接)

如何运行 vue 项目&#xff1a;vscode运行vue项目_vscode启动vue项目命令-CSDN博客 vue3项目搭建 目录管理 git管理&#xff1a;vue3项目搭建并git管理_git 新建vue3项目-CSDN博客 目录调整&#xff1a;vue3项目 - 目录调整-CSDN博客 vscode中快速生成vue3模板&#xff1a…

kubernetes-ingress 控制器

kubernetes-ingress 控制器 kubernetes-ingress 控制器1、理解一下负载均衡1.1、概念图1.2、理解ingress1.3、ingress的负载均衡属于7层负载均衡1.4、Ingress 的关键特性包括&#xff1a;1.5、Ingress 的工作原理&#xff1a;1.6、Ingress 的配置示例&#xff1a;1.7、ingress和…

【Java开发过程中的流程图】

流程图由一系列的图形符号和箭头组成&#xff0c;每个符号代表一个特定的操作或决策。下面是一些常见的流程图符号及其含义&#xff1a; 开始/结束符号&#xff08;圆形&#xff09;&#xff1a;表示程序的开始和结束点。 过程/操作符号&#xff08;矩形&#xff09;&#xff…

电控开发新架构 —— 生成式电力电子拓扑电路与统一的模型预测控制算法相结合

子标题&#xff1a;容错、高效、鲁棒、零序电压控制&#xff08;降低漏电流、共模电压、轴电压等&#xff09;、提升系统动态性能、更多指标系统级优化、统一电力电子功率模块的可重构性 一、电动汽车电控开发架构 高性能的电动汽车变流技术系统需要专门的设计&#xff0c;以满…

4核16G服务器租用优惠价格,26.52元1个月,半年149元

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年&#xff0c;配置为阿里云服务器ECS经济型e实例ecs.e-c1m4.xlarge&#xff0c;4核16G、按固定带宽 10Mbs、100GB ESSD Entry系统盘&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接打开如下图&a…

RK3568基于openHarmony3.2版本之GT911触摸屏调试成功

RK3568基于openHarmony3.2版本之GT911触摸屏 开发环境调试过程HDF架构配置内核配置(选择性配置)效果展示总结开发环境 ubuntu版本:20.04 openharmony版本:3.2.4-release 核心板:RK3568 触摸屏型号:GT911 博主想说句话:太太太不容易了,这源码的坑不是一般的多,在总结那…

队列——数据结构——day5

队列 队列(queue)是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。 队列是一种先进先出(First In First Out)的线性表&#xff0c;简称FIFO。允许插入的一端称为队尾&#xff0c;允许删除的一端称为队头。假设队列是q(a1,a2,……,an),那么a1就是队头元…

全国大学生数学建模大赛备赛——相关系数的求解(皮尔逊(pearson)、斯皮尔曼(spearman)、肯德尔(kendall)相关系数)

相关系数是用来衡量两个变量之间线性相关程度的指标。它的取值范围在-1到1之间&#xff0c;当相关系数为1时表示两个变量完全正相关&#xff08;即一个变大另一个也变大&#xff09;&#xff0c;当相关系数为-1时表示两个变量完全负相关&#xff08;即一个变大另一个变小&#…