LWIP手记【A】arp高速缓冲区清零

ARP高速缓存里面存放了最近的Internet地址到MAC地址之间的映射记录。高速缓存的每一项的生存时间一般是20分钟,起始时间从被创建时开始计算。LWIP里面的全局变量arp_talbe的结构体成员ctime就是记录这个时间的。这里注意,每一项都有一个生存时间,每一项都是单独计时的。另外注意,如果对一个不存在的主机发出arp请求,一般设置超时时间是3分钟。这个在LWIP里面似乎没有看到。

何时重设超时值?卷1的第4章说“”“HOST Requirements RFC表明即使表项正在使用时,超时值也应该启动,但是大多数从伯克利系统演变而来的系统没有这样做--它们每次都是在访问表项的时候重设超时值。”

那么LIWP是何时设置超时值得呢?

我们这里讨论屏蔽DUBUG的情况。如果设置//#define LWIP_DEBUG  那么在etharp_tmr里面会有这个函数etharp_free_entry内部有

#ifdef LWIP_DEBUG
  /* for debugging, clean out the complete entry */
  arp_table[i].ctime = 0;
  arp_table[i].netif = NULL;
  ip_addr_set_zero(&arp_table[i].ipaddr);
  arp_table[i].ethaddr = ethzero;
#endif /* LWIP_DEBUG */

所以下面讨论不定义DEBUG的情况。

首先是调用etharp_find_entry进行对应条目ctime清零,然后在函数etharp_update_arp_entry对MAC地址赋值且ctime又清零。

然后超时,然后MAC地址保持,ctime这个计数器也是保持的,就是保持240这个数值。(为什么240?因为240 * 5=20分钟。5是etharp_tmr这个函数的参数),然后把state变为empty。

然后下次在运行发送IP的时候,然后重复以前步骤(注意重复的过程中,后来的mac将以前的覆盖)。

你可能感兴趣的:(lwip,ETH基础)