Closed AingSu closed 2 years ago
https://github.com/mysterywolf/formatting 用这个扫一下你提交的代码
这里面可能有以下几个问题:
ioLibrary 的部分是 wiznet 库中的,这部分的改动看到你这边是加了一个 dhcp_tick_1s
函数,该函数的目的是获取 DHCP client 解析出的续约时间是吗?
看了你的文章,你是对 DHCP_run 这个线程进行了修改,修改了函数的返回值。这个部分是做什么考虑呢?
对于 DHCP 服务器的续约问题,最常见的问题是超期续约,一般设定时间为续约时间的一半,且续约后的 IP 地址是继承之前的 IP 地址,不会做更改。你现在修改后的方案,看起来是租期到达后续约,貌似不太符合标准。
你所提供的重复续约问题,是插拔网线的场景下的描述,应只改动这个逻辑,续约时间的修改,看起来不太符合规范。
又看了你的另一个帖子,租期续约应当走DHCP Request
,应该去掉调用正常获取 IP 后调用 DHCP stop 的逻辑,这样做即可打到目的。
“dhcp_lease_time” 这个才是从路由器上获取的租约时间,“dhcp_tick_1s” 这个是本机计时的时间
dhcp_work_times = (getDHCPTick1s() > getDHCPLeasetime() / 2) ? 0 : getDHCPLeasetime() / 2 - getDHCPTick1s(); rt_work_submit(dhcp_work, (dhcp_work_times+1) * RT_TICK_PER_SECOND);
如上,只是为了计算工作队列时间,和DHCP_run()联动 ,保证工作队列每次进来时,dhcp_tick_1s 都能略大于租期一半的时间,所以传入工作队列时 dhcp_work_times 还需+1 (否则 DHCP_run() 775行 可能判断不过)
修改了DHCP_run()中 “STATE_DHCP_LEASED” 和 “STATE_DHCP_REREQUEST” 分支的返回值。 如果处于续约的过程,返回值为默认的 “DHCP_RUNNING” 这样可以避免,打断DHCP_run的续约过程 且续约完成后会自动进入到 “STATE_DHCP_LEASED” 分支,这时 dhcp_tick_1s因为被重置,返回值才为 “DHCP_IP_LEASED” 这时候才会进入到提交工作的环节中。这样逻辑才是对的。
我这样做就是为了保证每次都能 1/2 时间 时能正常续约。
重复续约不是我插拔网线的场景,是每次超时就会这样,如果可以的话你可以测试一下(路由器 租期设置最短,wireshark抓一下DHCP 你就会发现它每次都在重新DHCP) PS: gif图的演示让你会错意了,因为我第一次修改插拔后不能DHCP了。
又看了你的另一个帖子,租期续约应当走
DHCP Request
,应该去掉调用正常获取 IP 后调用 DHCP stop 的逻辑,这样做即可打到目的。
没看懂这句话的意思,但是如果获取到了ip后, 调用DHCP stop不就会重新DHCP吗?
又看了你的另一个帖子,租期续约应当走
DHCP Request
,应该去掉调用正常获取 IP 后调用 DHCP stop 的逻辑,这样做即可打到目的。没看懂这句话的意思,但是如果获取到了ip后, 调用DHCP stop不就会重新DHCP吗?
之前是完成后调用 DHCP stop,这样会清除 DHCP 的状态,这个应该是续约时会重新走一遍 DHCP 流程的原因。 代码中去掉获得 IP 后调用 dhcp_stop 的逻辑,应该就不会走一遍 DHCP 流程了。
很抱歉,我现在手里没有 wiznet 的硬件,没有办法和你一起验证。
又看了你的另一个帖子,租期续约应当走
DHCP Request
,应该去掉调用正常获取 IP 后调用 DHCP stop 的逻辑,这样做即可打到目的。没看懂这句话的意思,但是如果获取到了ip后, 调用DHCP stop不就会重新DHCP吗?
之前是完成后调用,DHCP stop,这样会清除 DHCP 的状态,这个应该是续约时会重新走一遍 DHCP 流程的原因。
对,没错,但是如果只是单纯把这里删除是不行的
static uint32_t dhcp_status)
开启 _DHCP_DEBUG_
也可以达到短时间内多次 DHCP 续约的目的,与设置路由器的续约时间是一致的。
OK,这样来说,两种方法都能实现续约目的;既然大佬这边已经实现了,那就合并这个了吧。(^o^)/
感谢,我不是大佬,使用过程中发现丢帧了,才解决了这个问题,顺便分享给大家。(^o^)/
感谢,我不是大佬,使用过程中发现丢帧了,才解决了这个问题,顺便分享给大家。(^o^)/
o͡͡͡╮░ O ◡ O ░╭o͡͡͡
解决了问题就是大佬,哈哈!😁
详情见:bug:w5500 DHCP续租逻辑问题