当前位置: 首页 > news >正文

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

文章目录

  • 前言: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)beginif(i_rst)ro_mac_data <= 'd0;else case (r_arp_cnt)0       : ro_mac_data <= 8'h00;             //硬件类型,对以太网,值为11       : ro_mac_data <= 8'h01;             2       : ro_mac_data <= 8'h08;             //协议类型,IP 0x08003       : 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

相关文章:

  • RESTful架构
  • 零基础-MySQL数据库的基本操作
  • PWM脉宽调制技术
  • 第十节:Vben Admin实战-系统管理之角色管理实现(分页查询,修改)-中
  • creator-webview与Android交互
  • Unity:2D
  • 读算法的陷阱:超级平台、算法垄断与场景欺骗笔记19_前方的路
  • leetcode最大连续1的个数(简单)
  • docker 容器与本地主机间文件/文件夹的传输
  • 如何用VSCode和Clangd与Clang-Format插件高效阅读Linux内核源码及写驱动
  • python与excel第一节
  • 【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i 运行测试
  • 海康威视的观澜大模型技术
  • C语言内存函数(1)【memcpy函数的使用与模拟实现】【memmove函数的使用和模拟实现】
  • Fabric Measurement
  • [译]如何构建服务器端web组件,为何要构建?
  • “大数据应用场景”之隔壁老王(连载四)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 2017前端实习生面试总结
  • Babel配置的不完全指南
  • HashMap ConcurrentHashMap
  • HTTP中GET与POST的区别 99%的错误认识
  • Java程序员幽默爆笑锦集
  • Java深入 - 深入理解Java集合
  • Less 日常用法
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • RxJS: 简单入门
  • SSH 免密登录
  • vue-loader 源码解析系列之 selector
  • Web设计流程优化:网页效果图设计新思路
  • win10下安装mysql5.7
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 基于axios的vue插件,让http请求更简单
  • 收藏好这篇,别再只说“数据劫持”了
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 详解移动APP与web APP的区别
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 湖北分布式智能数据采集方法有哪些?
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (0)Nginx 功能特性
  • (2)STL算法之元素计数
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (剑指Offer)面试题34:丑数
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .aanva
  • .form文件_SSM框架文件上传篇
  • .NET 指南:抽象化实现的基类