自己在做项目时,需求与LWIP协议栈中的DHCP实现不太一样,发现如果修改起来没有想象的那么容易,跟大家分享一下修改过程。
一、时间变量
- u32_t offered_t0_lease; /* lease period (in seconds) */
- u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */
- u32_t offered_t2_rebind; /* recommended rebind time (usually 66% of lease period) */
- u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */
- u16_t t1_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */
- u16_t t2_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */
1.在dhcp的代码中,没有定时器,这个时间是如何与系统时间所匹配呢?
2.还有几个变量t1_timeout、t2_timeout是做什么用的?
其实解决了这两个问题,对于dhcp控制时间的思路也就比较清晰了。
解决第一个疑问,dhcp的轮询是依靠这段代码实现的。
- for(idxtimer=0;
- idxtimer < (sizeof(timers_table)/sizeof(timers_info));
- idxtimer ++)
- {
- ptmr_inf = &timers_table[idxtimer];
- ptmr_inf->timer += time_diff;
- if (ptmr_inf->timer > ptmr_inf->timer_interval)
- {
- if (ptmr_inf->timer_func)
- ptmr_inf->timer_func();
- ptmr_inf->timer -= ptmr_inf->timer_interval;
- }
- }
- static timers_info timers_table[] = {
- /* LWIP_TCP */
- { 0, TCP_FAST_INTERVAL, tcp_fasttmr},
- { 0, TCP_SLOW_INTERVAL, tcp_slowtmr},
- /* LWIP_ARP */
- { 0, ARP_TMR_INTERVAL, etharp_tmr},
- /* LWIP_DHCP */
- #if LWIP_DHCP
- { 0, DHCP_COARSE_TIMER_SECS, dhcp_coarse_tmr},
- { 0, DHCP_FINE_TIMER_MSECS, dhcp_fine_tmr},
- #endif
- };
就是每隔DHCP_COARSE_TIMER_SECS时间后,执行一下dhcp_coarse_tmr()函数。所以是每隔系统时间DHCP_COARSE_TIMER_SECS调用一次该函数。dhcp的时间就是通过这样的方式与系统时间耦合上的。
第二个疑问。
- timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
- 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时间,这样就能够做到虽然自己没有计时器,但是却很好的耦合上了系统时间。