Lwip ARP模块详解:数据结构与关键函数

需积分: 18 7 下载量 68 浏览量 更新于2024-09-01 收藏 212KB PDF 举报
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缓存。