8.4.6 ARP缓存表超时处理ARP缓存表每条映射记录都是有有效期的(静态除外),在struct etharp_entry
的u16_t ctime;
这个字段中记录这点钱entry的生存时间 。
ARP超时处理函数是etharp_tmr()
,是一个周期定时函数 。
相关宏:
ARP_TMR_INTERVAL
:该函数的节拍为ARP_TMR_INTERVAL
,默认为1000,即是1秒跑一次 。
ARP_MAXAGE
:用于限制ARP条目最大生存时间,默认为300,且节拍为1秒,所以ARP的entry默认最大生存时间是5分钟 。
ARP_MAXPENDING
:限制ARP请求响应超时,也是重发ARP请求的次数,默认为5,且节拍为1秒,所以ARP请求响应默认超时为5秒 。
【【lwip】08-ARP协议一图笔记及源码实现】/** * 清除ARP表中过期的表项 * 该函数应该每隔ARP_TMR_INTERVAL毫秒(1秒)调用一次,以使ARP表项过期 */voidetharp_tmr(void){int i;LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));/* 遍历、删除ARP表中过期的表项 */for (i = 0; i < ARP_TABLE_SIZE; ++i) {u8_t state = arp_table[i].state;if (state != ETHARP_STATE_EMPTY /* 跳过空闲态的entry */#if ETHARP_SUPPORT_STATIC_ENTRIES&& (state != ETHARP_STATE_STATIC) /* 跳过静态的entry */#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */) {arp_table[i].ctime++; /* 记录当前entry的生存时间 */if ((arp_table[i].ctime >= ARP_MAXAGE) ||((arp_table[i].state == ETHARP_STATE_PENDING)&&(arp_table[i].ctime >= ARP_MAXPENDING))) { /* entry生存时间超时或者ARP请求超时都要清空本entry *//* pending or stable entry has become old! */LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %d.\n",arp_table[i].state >= ETHARP_STATE_STABLE ? "stable" : "pending", i));/* 清理刚刚过期的条目 */etharp_free_entry(i);} else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_1) {/* 过渡态1更新到过渡态2,为了防止上层在两秒能发起多次ARP更新请求 */arp_table[i].state = ETHARP_STATE_STABLE_REREQUESTING_2;} else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_2) {/* 恢复到有效态 。允许ARP */arp_table[i].state = ETHARP_STATE_STABLE;} else if (arp_table[i].state == ETHARP_STATE_PENDING) {/* 还没收到ARP响应,重发ARP请求 */etharp_request(arp_table[i].netif, &arp_table[i].ipaddr);}}}}
8.4.7 ARP缓存表entry更新能触发ARP缓存表entry更新的情况:
- ARP超时处理 。把过期或者ARP请求超时的arp entry删除 。
- IP层发送数据 。经过ARP协议时:
- arp entry更新:在对应arp entry快过期前发起ARP请求(更新arp entry) 。
- arp entry新建:ARP缓存表中没有找到对应entry时,新建一个 。
调用
etharp_find_entry()
函数获取一个entry 。该函数的参数
u8_t flags;
表示申请arp entry资源的方式:ETHARP_FLAG_TRY_HARD
:允许覆盖已有arp entry 。
- 在需要新建arp entry,且没有发现空闲的arp entry时,强制覆盖一条 。优先被覆盖的顺序:
empty entry
>oldest stable entry
>oldest pending entry without queued packets
>oldest pending entry with queued packets
。
- 在需要新建arp entry,且没有发现空闲的arp entry时,强制覆盖一条 。优先被覆盖的顺序:
ETHARP_FLAG_FIND_ONLY
:只读模式 。如果ARP缓存表中没有匹配IP(和网卡)的arp entry,则返回失败,数据包处理终止 。
文章插图
8.6 ARP收发报文数据流图
文章插图
8.7 ARP报文组包源码实现8.7.1 ARP报文数据结构
/** the ARP message, see RFC 826 ("Packet format") */struct etharp_hdr {PACK_STRUCT_FIELD(u16_t hwtype); /* 硬件类型 */PACK_STRUCT_FIELD(u16_t proto); /* 协议类型 */PACK_STRUCT_FLD_8(u8_thwlen); /* 硬件地址长度 */PACK_STRUCT_FLD_8(u8_tprotolen); /* 协议地址长度 */PACK_STRUCT_FIELD(u16_t opcode); /* 操作字段 */PACK_STRUCT_FLD_S(struct eth_addr shwaddr); /* 源硬件地址 */PACK_STRUCT_FLD_S(struct ip4_addr_wordaligned sipaddr); /* 源协议地址 */PACK_STRUCT_FLD_S(struct eth_addr dhwaddr); /* 目标硬件地址 */PACK_STRUCT_FLD_S(struct ip4_addr_wordaligned dipaddr); /* 目标协议地址 */} PACK_STRUCT_STRUCT;
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Unity坐标系入门
- 原神蔷薇种子怎么获取
- 原神3.0须弥旋曜玉帛位置在哪
- 2023年10月29日结婚好不好 嫁娶吉利吗
- 2023年农历十一月属羊人哪天适合结婚
- 聚财公司名字大全集 招财旺生意的公司名字
- 抖音店铺取名 抖音吸引人店铺名字
- 电影狼溪一共几部?
- 2023年1月30日制作嫁衣行吗 2023年1月30日制作嫁衣好不好
- 菠萝袜是什么袜子?