ARP的超时重新请求
生活随笔
收集整理的這篇文章主要介紹了
ARP的超时重新请求
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1 原理
- 2 代碼實(shí)現(xiàn)
1 原理
問(wèn)題:ARP表項(xiàng)是否一直有效?
實(shí)現(xiàn)原理如下:
2 代碼實(shí)現(xiàn)
先看下代碼組織結(jié)構(gòu):
prot_pcap.c中增加如下代碼:
xnet_tiny.h中增加如下代碼:
#define XARP_CFG_ENTRY_OK_TMO (5) // ARP表項(xiàng)超時(shí)時(shí)間 #define XARP_CFG_ENTRY_PENDING_TMO (1) // ARP表項(xiàng)掛起超時(shí)時(shí)間 #define XARP_CFG_MAX_RETRIES 4 // ARP表掛起時(shí)重試查詢(xún)次數(shù)#define XARP_ENTRY_FREE 0 // ARP表項(xiàng)空閑 #define XARP_ENTRY_OK 1 // ARP表項(xiàng)解析成功 #define XARP_ENTRY_RESOLVING 2 // ARP表項(xiàng)正在解析 #define XARP_TIMER_PERIOD 1 // ARP掃描周期,1s足夠void xarp_poll(void);xnet_tiny.c中增加如下代碼:
static xnet_time_t arp_timer; // ARP掃描定時(shí)/*** 檢查是否超時(shí)* @param time 前一時(shí)間* @param sec 預(yù)期超時(shí)時(shí)間,值為0時(shí),表示獲取當(dāng)前時(shí)間* @return 0 - 未超時(shí),1-超時(shí)*/ int xnet_check_tmo(xnet_time_t * time, uint32_t sec) {xnet_time_t curr = xsys_get_time();if (sec == 0) { // 0,取當(dāng)前時(shí)間*time = curr;return 0;} else if (curr - *time >= sec) { // 非0檢查超時(shí)*time = curr; // 當(dāng)超時(shí)時(shí),才更新時(shí)間return 1;}return 0; }/*** ARP初始化*/ void xarp_init(void) {arp_entry.state = XARP_ENTRY_FREE;// 獲取初始時(shí)間xnet_check_tmo(&arp_timer, 0); }/*** 查詢(xún)ARP表項(xiàng)是否超時(shí),超時(shí)則重新請(qǐng)求*/ 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 { // 繼續(xù)重試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) { // 超時(shí),重新請(qǐng)求xarp_make_request(&arp_entry.ipaddr);arp_entry.state = XARP_ENTRY_RESOLVING;arp_entry.tmo = XARP_CFG_ENTRY_PENDING_TMO;}break;}} }/*** 更新ARP表項(xiàng)* @param src_ip 源IP地址* @param mac_addr 對(duì)應(yīng)的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; }/*** 輪詢(xún)處理數(shù)據(jù)包,并在協(xié)議棧中處理*/ void xnet_poll(void) {ethernet_poll();xarp_poll(); } 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的ARP的超时重新请求的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么知道办的信用卡是不是正规的
- 下一篇: 视频的基本概念