UDP协议栈之整体架构处理

在之前的章节中,笔者就UDP、ICMP、IP、ARP、MAC层的报文格式,以及组帧解帧、CRC校验、分片处理等操作进行了具体介绍以及详细代码实现,并且通过了仿真测试。但之前的仿真测试都是对单层报文的组帧解帧进行的,这些模块仍处于"孤立"状态,缺乏协同工作的能力。在本章节中,笔者将上述实现的各个模块,进行总线互联,实现一个UDP协议栈的整体架构,用户通过顶层接口,可以实现数据的发送、接收、ARP请求包、IP、MAC、PORT设置等关键操作。架构文字示意如下,其中PHY层物理接口,在之后的还章节会进行介绍

±--------------------+

| 用户接口层 | ← 配置MAC/IP/端口,发送/接收数据

±--------------------+

| UDP传输层 | ← 封装/解封装UDP头,端口校验

±--------------------+

| IP网络层 | ← IP头处理、分片与重组、ICMP响应

±--------------------+

| ARP & MAC链路层 | ← ARP表维护、MAC帧组帧/解帧、CRC校验

±--------------------+

| 物理接口(PHY) | ← RMII/GMII等硬件接口

±--------------------+

流程示意框图如下所示

接下来进行代码的整体组合,最终用户可操作的接口如下所示

c 复制代码
	/*MAC IP PORTp配置*/
    input   [31:0]      i_port_info     ,
    input               i_port_valid    ,
    input   [63:0]      i_ip_info       ,
    input               i_ip_valid      ,
    input   [79:0]      i_macip_info    ,
    input               i_info_valid    ,
    input   [47:0]      i_mac_sinfo     ,
    input               i_mac_svalid    ,
    /*ARP请求包配置*/
    input   [15:0]      i_op_code       ,
    input               i_op_valid      ,
    input   [31:0]      i_request_ip    ,
    input               i_request_valid ,
    /*输入数据总线*/
    input   [15:0]      i_user_len      ,
    input   [7 :0]      i_user_data     ,
    input               i_user_valid    ,
    input               i_user_last     ,
    output              o_trans_ready   ,
    /*输出接收数据总线*/
    output  [15:0]      o_user_len      ,
    output  [7 :0]      o_user_data     ,
    output              o_user_valid    ,
    output              o_user_last     ,

接下来进行代码仿真测试

仿真测试条件如下,两个UDP相互发送指令

  • 首先,两台UDP协议栈向对方发送ARP请求包,请求MAC地址
  • 之后,两台UDP协议栈向对方发送数据,单包1024字节,发送三帧
  • 观察交互信息流
    标号为1的UDP协议栈,信息如下
    MAC地址:8'h11,8'h22,8'h33,8'h44,8'h55,8'h66
    IP地址:192.168.1.10
    PORT:16'h8080
    标号为2的UDP协议栈,信息如下
    MAC地址:8'ha5,8'hd5,8'hff,8'hff,8'hff,8'he5
    IP地址:192.168.1.20
    PORT:16'h8081
    首先观察ARP测试
    观察第一副图,ARP_T接收到用户的ARP请求操作码一级请求IP地址,并进行了ARP报文的输出。
    接口功能如下
c 复制代码
	/*ARP操作码及请求IP地址*/
    input   [15:0]      i_op_code       ,
    input               i_op_valid      ,
    input   [31:0]      i_request_ip    ,
    input               i_request_valid ,
    /*输出给MAC层的报文端口*/
    output  [15:0]      o_mac_len       ,
    output  [7 :0]      o_mac_data      ,
    output              o_mac_valid     ,
    output              o_mac_last       

接下来观察ARP_RX模块仿真图,是否接收到UDP站点2的ARP响应。

观察红框中的有效数据,c0a80114其IP地址即为192.168.1.20,而mac地址为8'ha5,8'hd5,8'hff,8'hff,8'hff,8'he5,检验出,站点2接收到站点1的ARP请求,正确进行了ARP响应,站点1成功收到MAC地址。

接下来观察ARP_LIST模块仿真图,当输入进缓存的IP、MAC地址,是否进行了正确的地址查询,确定不存在后进行缓存

可以观察图中红框处的RAM使能读写以及数据地址控制信号,由于协议栈运行初始,RAM中不会缓存MAC、IP信息,所以有效搜索范围只有地址0,当检测到当前MAC、IP在ARP缓存表中不存在后,将该MAC、IP信息进行缓存。

可以看出ARP_LISRT模块正常进行了工作

接下来查看单包信息的传递情况,需知道MAC层使用的目的AMC地址,是在ARP缓存表中进行读取的,在数据报文到达IP层时,向ARP缓存表进行读取,寻找目的IP的MAC地址是否存在于ARP缓存表中,将寻找到的MAC地址发送给MAC层,所以在仿真中进行检验,是否使用了正确的MAC地址

观察下图,为ARP_LIST接收到搜寻IP对应MAC地址命令,并进行响应的时序波形

观察红框处,可以看出ARP缓存表正确输出了MAC地址

观察下图,为MAC层的发送仿真图

观察红框处,可以看出MAC_TX正确接收到MAC地址,并在发送报文时,进行了使用。

关于各层之间的处理,因为之前在各个章节已经仿真过,便不再赘述,直接观察UDP_RX的输出,是否正确接收到1024字节的数据包即可,UDP_RX的输出如下图所示

可以看出,UDP_RX正确输出三帧1024的字节包。

至此,UDP协议栈的仿真告一段落,本章节中涉及到的许多知识,在之前的章节都有讲述,对哪部分有疑问的小伙伴可以查找对应章节,进行学习。接下来,笔者将其应用层协议进行讲解,初步打算是讲解IEEE1588V2协议,并在仿真中进行时间同步测验,觉得本文章写的不错,并且对之后的更新内容感兴趣的小伙伴,可以点个关注,不迷路,感谢你的阅读,谢谢!

相关推荐
坏柠2 小时前
STM32 HAL库实战:高效整合DMA与ADC开发指南
stm32·单片机·嵌入式硬件
啾啾Fun5 小时前
[微服务设计]3_如何构建服务
运维·微服务·架构
小杨4046 小时前
springboot框架项目实践应用八(validation自定义校验)
spring boot·后端·架构
天天爱吃肉82187 小时前
【恒流源cc与恒压源cv典型电路解析】
自动化测试·单片机·嵌入式硬件·汽车
一块plus8 小时前
弹性扩展何以助力 Polkadot 2.0 触达无缝互操作的理想愿景?
设计模式·架构·github
电子艾号哲8 小时前
STC89C52单片机学习——第20节: [8-2]串口向电脑发送数据&电脑通过串口控制LED
单片机·学习·电脑
万能的小裴同学8 小时前
给单片机生成字库的方案
单片机·嵌入式硬件
全栈若城9 小时前
84.HarmonyOS NEXT 路由导航与页面管理:构建清晰的应用架构
华为·架构·harmonyos·harmonyos next
小小工匠9 小时前
架构思维:软件建模与架构设计的关键要点
架构·架构设计·软件建模