LwIP是一个轻量级的嵌入式TCP/IP协议栈,Arp(Address Resolution Protocol)是网络层的重要组成部分,用于在IPv4网络中将IP地址映射到MAC地址。在LwIP的实现中,arp模块的核心是数据结构和函数接口的设计。
数据结构部分,Lwip的ARP表结构如下:
```markdown
struct etharp_entry {
#if ARP_QUEUEING
struct pbuf* p; // 指向队列中的待发送数据包
#endif
struct ip_addr ipaddr; // IP地址,存储要查找的IP
struct eth_addr ethaddr; // MAC地址,存储查找后的对应地址
enum etharp_state state; // 表项状态,如学习、请求、响应等
u8_t time; // 时间计数,表示表项的有效时间
};
```
这个数据结构包含了ARP缓存的基本信息,如IP地址、MAC地址、状态以及过期时间。当数据包需要通过ARP查找目标MAC地址时,会使用这个表进行匹配或更新。`pbuf`指针的存在允许在某些情况下(如ARP请求未收到响应时)暂存数据包,等待进一步处理。
核心函数包括:
1. `etharp_init()`:ARP模块的初始化函数,负责清零所有表项的时间并将其状态设置为初始(例如,未学习)状态。
2. `etharp_tmr()`:ARP定时器函数,当定时器超时时调用,其主要任务是检查arp表中的表项,如果某个表项已过期(可能基于定时器或特定策略),则将其标记为失效并可能进行相应的清理操作。
3. `find_entry(ipaddr, flags)`:查找arp表的功能函数,接收一个IP地址和标志参数。该函数通过遍历表项,根据状态和时间进行匹配。它会记住不同类型的表项,如空闲、稳定、未决(无排队数据包和有排队数据包)等,以便在多个条件满足时作出决策。如果选择了try_hard模式(由flags决定),则会更加努力地尝试获取MAC地址,即使表项已失效也可能尝试重发。
这些函数共同构成了LwIP ARP模块的基本运作机制,它们确保了网络中的地址解析高效且正确。在嵌入式系统中,由于资源有限,LwIP的这种轻量级设计使得它非常适合于内存受限的环境,同时保持了基本的网络通信功能。理解这些细节有助于开发者在实际项目中优化网络通信性能和管理ARP缓存。