一、lwip協議棧之dhcp 時間

   自己在做項目時,需求與LWIP協議棧中的DHCP實現不太一樣,發現如果修改起來沒有想象的那麼容易,跟大家分享一下修改過程。

一、時間變量

  1. u32_t offered_t0_lease; /* lease period (in seconds) */ 
  2. u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */ 
  3. u32_t offered_t2_rebind; /* recommended rebind time (usually 66% of lease period)  */ 
  4.  
  5.  
  6. u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */ 
  7. u16_t t1_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */ 
  8. u16_t t2_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */ 
  9.  

 

在offered_t0_lease 租約時間,服務器在offer報文跟ack報文中都會給你,時間是秒,在lwip協議棧中則是在ack報文中獲得並保存下來,option爲51。其他更新時間與綁定時間也類似,看起來比較容易。可是在使用中,出現了兩個疑問。

1.在dhcp的代碼中,沒有定時器,這個時間是如何與系統時間所匹配呢?

2.還有幾個變量t1_timeout、t2_timeout是做什麼用的?
 
   其實解決了這兩個問題,對於dhcp控制時間的思路也就比較清晰了。
   解決第一個疑問,dhcp的輪詢是依靠這段代碼實現的。
  1. for(idxtimer=0; 
  2.             idxtimer < (sizeof(timers_table)/sizeof(timers_info)); 
  3.             idxtimer ++) 
  4.         { 
  5.             ptmr_inf = &timers_table[idxtimer]; 
  6.             ptmr_inf->timer += time_diff; 
  7.             if (ptmr_inf->timer > ptmr_inf->timer_interval) 
  8.             { 
  9.                 if (ptmr_inf->timer_func) 
  10.                     ptmr_inf->timer_func(); 
  11.                 ptmr_inf->timer -= ptmr_inf->timer_interval; 
  12.             } 
  13.         } 
     
  1. static timers_info timers_table[] = { 
  2.     /* LWIP_TCP */ 
  3.     { 0, TCP_FAST_INTERVAL,     tcp_fasttmr}, 
  4.     { 0, TCP_SLOW_INTERVAL,     tcp_slowtmr}, 
  5.     /* LWIP_ARP */ 
  6.     { 0, ARP_TMR_INTERVAL,      etharp_tmr}, 
  7.     /* LWIP_DHCP */ 
  8.     #if LWIP_DHCP 
  9.     { 0, DHCP_COARSE_TIMER_SECS, dhcp_coarse_tmr}, 
  10.     { 0, DHCP_FINE_TIMER_MSECS,  dhcp_fine_tmr}, 
  11.     #endif 
  12. }; 
   就是每隔DHCP_COARSE_TIMER_SECS時間後,執行一下dhcp_coarse_tmr()函數。所以是每隔系統時間DHCP_COARSE_TIMER_SECS調用一次該函數。dhcp的時間就是通過這樣的方式與系統時間耦合上的。
 
 
   第二個疑問。
 
  1. timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS; 
  2. dhcp->t1_timeout = (u16_t)timeout; 
 
就是這麼得來的,t1_timeout爲以DHCP_COARSE_TIMER_SECS爲衡量的單位時間,就是說有t1個DHCP_COARSE_TIMER_SECS時間,而在dhcp_coarse_tmr()函數中的t1_timeout--也就是每次輪詢,都自減一個DHCP_COARSE_TIMER_SECS時間,這樣就能夠做到雖然自己沒有計時器,但是卻很好的耦合上了系統時間。
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章