系列文章目录
返回总目录
文章目录
- 系列文章目录
- 一、IPv4报文格式
- 二、主要函数
- 1.IPv4_Init()
- 2.IPv4_Receive()
- 3.IPv4_Transmit()
一、IPv4报文格式
二、主要函数
1.IPv4_Init()
这个函数除了对模块配置进行初始化,如果有分包和组包使能,则会对一些相关配置进行初始化如buf长度和位置指针等。如果不涉及分包和组包,那么初始化内容很简单。
2.IPv4_Receive()
在收到报文后根据类型判断为IPv4 (类型 = 800)
然后经过头校验:版本校验,长度校验,checksum校验等。
接下来源地址校验过程比较复杂,以后会拆开讲。先在这里讲个大概。
上述校验合法后,继续校验源地址合法性。
源地址合法性包括是否是loop back IP、预留IP、广播ip或autoip等,如果是这些IP不再往下分析了。
目的地址也需要校验,这里不细说。
取出协议进行识别,看是UDP,TCP,还是ICMP。
然后分别调用UDP_indication / TCP_indication / ICMP_indication
那么在分别把包识别出协议后丢给各个协议进行解析之前,IPv4还做了哪些工作呢?
两项:组包,和检查ARP更新。
3.IPv4_Transmit()
这个函数主要是给上层协议提供发送需要组装的ipc4数据。
调用时机是在Icmp和Udp需要发送的时候,提供数据封装。
底层是用EthIf层来进行报文空间的分配。底层的事交给底层做。不作为分析重点