ARP的超时重新请求
生活随笔
收集整理的这篇文章主要介绍了
ARP的超时重新请求
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
文章目录
- 1 原理
- 2 代码实现
1 原理
问题:ARP表项是否一直有效?
实现原理如下:
2 代码实现
先看下代码组织结构:
prot_pcap.c中增加如下代码:
xnet_tiny.h中增加如下代码:
#define XARP_CFG_ENTRY_OK_TMO (5) // ARP表项超时时间 #define XARP_CFG_ENTRY_PENDING_TMO (1) // ARP表项挂起超时时间 #define XARP_CFG_MAX_RETRIES 4 // ARP表挂起时重试查询次数#define XARP_ENTRY_FREE 0 // ARP表项空闲 #define XARP_ENTRY_OK 1 // ARP表项解析成功 #define XARP_ENTRY_RESOLVING 2 // ARP表项正在解析 #define XARP_TIMER_PERIOD 1 // ARP扫描周期,1s足够void xarp_poll(void);xnet_tiny.c中增加如下代码:
static xnet_time_t arp_timer; // ARP扫描定时/*** 检查是否超时* @param time 前一时间* @param sec 预期超时时间,值为0时,表示获取当前时间* @return 0 - 未超时,1-超时*/ int xnet_check_tmo(xnet_time_t * time, uint32_t sec) {xnet_time_t curr = xsys_get_time();if (sec == 0) { // 0,取当前时间*time = curr;return 0;} else if (curr - *time >= sec) { // 非0检查超时*time = curr; // 当超时时,才更新时间return 1;}return 0; }/*** ARP初始化*/ void xarp_init(void) {arp_entry.state = XARP_ENTRY_FREE;// 获取初始时间xnet_check_tmo(&arp_timer, 0); }/*** 查询ARP表项是否超时,超时则重新请求*/ void xarp_poll(void) {if (xnet_check_tmo(&arp_timer, XARP_TIMER_PERIOD)) {switch (arp_entry.state) {case XARP_ENTRY_RESOLVING:if (--arp_entry.tmo == 0) { // 重试完毕,回收if (arp_entry.retry_cnt-- == 0) {arp_entry.state = XARP_ENTRY_FREE;} else { // 继续重试xarp_make_request(&arp_entry.ipaddr);arp_entry.state = XARP_ENTRY_RESOLVING;arp_entry.tmo = XARP_CFG_ENTRY_PENDING_TMO;}}break;case XARP_ENTRY_OK:if (--arp_entry.tmo == 0) { // 超时,重新请求xarp_make_request(&arp_entry.ipaddr);arp_entry.state = XARP_ENTRY_RESOLVING;arp_entry.tmo = XARP_CFG_ENTRY_PENDING_TMO;}break;}} }/*** 更新ARP表项* @param src_ip 源IP地址* @param mac_addr 对应的mac地址*/ static void update_arp_entry(uint8_t * src_ip, uint8_t * mac_addr) {memcpy(arp_entry.ipaddr.array, src_ip, XNET_IPV4_ADDR_SIZE);memcpy(arp_entry.macaddr, mac_addr, 6);arp_entry.state = XARP_ENTRY_OK;arp_entry.tmo = XARP_CFG_ENTRY_OK_TMO;arp_entry.retry_cnt = XARP_CFG_MAX_RETRIES; }/*** 轮询处理数据包,并在协议栈中处理*/ void xnet_poll(void) {ethernet_poll();xarp_poll(); } 《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读总结
以上是生活随笔为你收集整理的ARP的超时重新请求的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 怎么知道办的信用卡是不是正规的
- 下一篇: 视频的基本概念