LWIP之ARP协议

描述ARP缓存表的数据结构:

 struct etharp_entry {
struct etharp_q_entry *q; //数据包缓冲队列指针
ip_addr_t ipaddr; //目标IP地址
struct eth_addr ethaddr; //MAC地址
struct netif *netif; //对应网络接口信息
u8_t state; //描述该entry的状态
u8_t ctime; //描述该entry的时间信息
};

LWIP中定义一个缓存表项有四种状态,用枚举型etharp_state进行描述

 enum etharp_state{
ETHARP_STATE_EMPTY=, //empty状态
ETHARP_STATE_PENDING, //pengding状态
ETHARP_STATE_STABLE, //stable状态
ETHARP_STATE_STABLE_REREQUESTING //stable状态且发送了一个ARP请求
}

当处在stable状态时,内核会对其进行周期性定时,当定时时间到之后,内核会往该表项对应目的IP上发送一个ARP请求,以维护APR表项的有效性,当请求包发送之后,该表项状态会被暂时设置为stable_rerequesting状态。
etharp_tmr()函数是实现ARP功能的重要定时函数。典型规定stable超时时间是20mins,pending超时时间是10S。

ARP报文组织结构

以太网目

的地址(MAC)  

以太网源

地址(MAC)

帧类型 硬件类型 协议类型

硬件地

址长度

协议地

址长度

OP

发送方以

太网地址

发送方

IP地址

接收方以

太网地址

接收方

IP地址

6(bytes) 6 2 2 2 1 1 2 6 4 6 4
以太网首部 28字节ARP数据包

帧类型要注意大小端的问题。ARP:0X0806  IP:0X0800

广播包MAC地址是:FF-FF-FF-FF-FF-FF

多播包MAC地址:01-00-5E-XX-XX-XX

遇到pbuf在类型是PBUF_REF、PBUF_POOL、PBUF_RAM时,需要拷贝下来。以防止在等待发送的过程中数据改变。

上一篇:手机端html5触屏事件(touch事件)


下一篇:iOS中的round/ceil/floorf函数略解