dhcpv6_client: use milliseconds rather than microseconds as base unit
This commit is contained in:
parent
02c0581ab9
commit
d1613da617
@ -95,9 +95,9 @@ static void _renew(event_t *event);
|
|||||||
static void _rebind(event_t *event);
|
static void _rebind(event_t *event);
|
||||||
|
|
||||||
static void _set_timer(xtimer_t *timer, xtimer_callback_t cb,
|
static void _set_timer(xtimer_t *timer, xtimer_callback_t cb,
|
||||||
uint32_t delay_us);
|
uint32_t delay_ms);
|
||||||
static void _set_timer64(xtimer_t *timer, xtimer_callback_t cb,
|
static void _set_timer64(xtimer_t *timer, xtimer_callback_t cb,
|
||||||
uint64_t delay_us);
|
uint64_t delay_ms);
|
||||||
static void _clear_timer(xtimer_t *timer);
|
static void _clear_timer(xtimer_t *timer);
|
||||||
|
|
||||||
static event_t solicit_servers = { .handler = _solicit_servers };
|
static event_t solicit_servers = { .handler = _solicit_servers };
|
||||||
@ -150,7 +150,7 @@ void dhcpv6_client_start(void)
|
|||||||
duid_len = dhcpv6_client_get_duid_l2(local.netif,
|
duid_len = dhcpv6_client_get_duid_l2(local.netif,
|
||||||
(dhcpv6_duid_l2_t *)&duid);
|
(dhcpv6_duid_l2_t *)&duid);
|
||||||
if (duid_len > 0) {
|
if (duid_len > 0) {
|
||||||
uint32_t delay = random_uint32_range(0, DHCPV6_SOL_MAX_DELAY * US_PER_SEC);
|
uint32_t delay = random_uint32_range(0, DHCPV6_SOL_MAX_DELAY * MS_PER_SEC);
|
||||||
|
|
||||||
sock_udp_create(&sock, &local, NULL, 0);
|
sock_udp_create(&sock, &local, NULL, 0);
|
||||||
_set_timer(&timer, _post_solicit_servers, delay);
|
_set_timer(&timer, _post_solicit_servers, delay);
|
||||||
@ -340,36 +340,36 @@ static inline size_t _add_ia_pd_from_config(uint8_t *buf, size_t len_max)
|
|||||||
return msg_len;
|
return msg_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int32_t get_rand_us_factor(void)
|
static inline int32_t get_rand_ms_factor(void)
|
||||||
{
|
{
|
||||||
int32_t res = ((int32_t)random_uint32_range(0, 200 * US_PER_MS));
|
int32_t res = ((int32_t)random_uint32_range(0, 200));
|
||||||
res -= 100 * US_PER_SEC;
|
res -= 100;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t _irt_us(uint16_t irt, bool greater_irt)
|
static inline uint32_t _irt_ms(uint16_t irt, bool greater_irt)
|
||||||
{
|
{
|
||||||
uint32_t irt_us = (irt * US_PER_SEC);
|
uint32_t irt_ms = (irt * MS_PER_SEC);
|
||||||
int32_t factor = get_rand_us_factor();
|
int32_t factor = get_rand_ms_factor();
|
||||||
|
|
||||||
if (greater_irt && (factor < 0)) {
|
if (greater_irt && (factor < 0)) {
|
||||||
factor = -factor;
|
factor = -factor;
|
||||||
}
|
}
|
||||||
irt_us += (factor * irt_us) / US_PER_SEC;
|
irt_ms += (factor * irt_ms) / MS_PER_SEC;
|
||||||
return irt_us;
|
return irt_ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t _sub_rt_us(uint32_t rt_prev_us, uint16_t mrt)
|
static inline uint32_t _sub_rt_ms(uint32_t rt_prev_ms, uint16_t mrt)
|
||||||
{
|
{
|
||||||
uint32_t sub_rt_us = (2 * rt_prev_us) +
|
uint32_t sub_rt_ms = (2 * rt_prev_ms) +
|
||||||
((get_rand_us_factor() * rt_prev_us) / US_PER_SEC);
|
((get_rand_ms_factor() * rt_prev_ms) / MS_PER_SEC);
|
||||||
|
|
||||||
if (sub_rt_us > (mrt * US_PER_SEC)) {
|
if (sub_rt_ms > (mrt * MS_PER_SEC)) {
|
||||||
uint32_t mrt_us = mrt * US_PER_SEC;
|
uint32_t mrt_ms = mrt * MS_PER_SEC;
|
||||||
|
|
||||||
sub_rt_us = mrt_us + ((get_rand_us_factor() * mrt_us) / US_PER_SEC);
|
sub_rt_ms = mrt_ms + ((get_rand_ms_factor() * mrt_ms) / MS_PER_SEC);
|
||||||
}
|
}
|
||||||
return sub_rt_us;
|
return sub_rt_ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline size_t _opt_len(dhcpv6_opt_t *opt)
|
static inline size_t _opt_len(dhcpv6_opt_t *opt)
|
||||||
@ -504,25 +504,25 @@ static int _preparse_advertise(uint8_t *adv, size_t len, uint8_t **buf)
|
|||||||
static void _schedule_t2(void)
|
static void _schedule_t2(void)
|
||||||
{
|
{
|
||||||
if (t2 < UINT32_MAX) {
|
if (t2 < UINT32_MAX) {
|
||||||
uint64_t t2_usec = t2 * US_PER_SEC;
|
uint64_t t2_msec = t2 * MS_PER_SEC;
|
||||||
|
|
||||||
rebind_time = _now_sec() + t2;
|
rebind_time = _now_sec() + t2;
|
||||||
_clear_timer(&rebind_timer);
|
_clear_timer(&rebind_timer);
|
||||||
DEBUG("DHCPv6 client: scheduling REBIND in %lu sec\n",
|
DEBUG("DHCPv6 client: scheduling REBIND in %lu sec\n",
|
||||||
(unsigned long)t2);
|
(unsigned long)t2);
|
||||||
_set_timer64(&rebind_timer, _post_rebind, t2_usec);
|
_set_timer64(&rebind_timer, _post_rebind, t2_msec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _schedule_t1_t2(void)
|
static void _schedule_t1_t2(void)
|
||||||
{
|
{
|
||||||
if (server.t1 < UINT32_MAX) {
|
if (server.t1 < UINT32_MAX) {
|
||||||
uint64_t t1_usec = server.t1 * US_PER_SEC;
|
uint64_t t1_msec = server.t1 * MS_PER_SEC;
|
||||||
|
|
||||||
_clear_timer(&timer);
|
_clear_timer(&timer);
|
||||||
DEBUG("DHCPv6 client: scheduling RENEW in %lu sec\n",
|
DEBUG("DHCPv6 client: scheduling RENEW in %lu sec\n",
|
||||||
(unsigned long)server.t1);
|
(unsigned long)server.t1);
|
||||||
_set_timer64(&timer, _post_renew, t1_usec);
|
_set_timer64(&timer, _post_renew, t1_msec);
|
||||||
}
|
}
|
||||||
_schedule_t2();
|
_schedule_t2();
|
||||||
}
|
}
|
||||||
@ -534,7 +534,7 @@ static void _parse_advertise(uint8_t *adv, size_t len)
|
|||||||
/* might not have been executed when not received in first retransmission
|
/* might not have been executed when not received in first retransmission
|
||||||
* window => redo even if already done */
|
* window => redo even if already done */
|
||||||
if (_preparse_advertise(adv, len, NULL) < 0) {
|
if (_preparse_advertise(adv, len, NULL) < 0) {
|
||||||
uint32_t delay = _irt_us(DHCPV6_SOL_TIMEOUT, true);
|
uint32_t delay = _irt_ms(DHCPV6_SOL_TIMEOUT, true);
|
||||||
/* SOLICIT new server */
|
/* SOLICIT new server */
|
||||||
_set_timer(&timer, _post_solicit_servers, delay);
|
_set_timer(&timer, _post_solicit_servers, delay);
|
||||||
return;
|
return;
|
||||||
@ -758,7 +758,7 @@ static void _solicit_servers(event_t *event)
|
|||||||
dhcpv6_msg_t *msg = (dhcpv6_msg_t *)&send_buf[0];
|
dhcpv6_msg_t *msg = (dhcpv6_msg_t *)&send_buf[0];
|
||||||
dhcpv6_opt_elapsed_time_t *time;
|
dhcpv6_opt_elapsed_time_t *time;
|
||||||
uint8_t *buf = NULL;
|
uint8_t *buf = NULL;
|
||||||
uint32_t retrans_timeout = _irt_us(DHCPV6_SOL_TIMEOUT, true);
|
uint32_t retrans_timeout = _irt_ms(DHCPV6_SOL_TIMEOUT, true);
|
||||||
size_t msg_len = sizeof(dhcpv6_msg_t);
|
size_t msg_len = sizeof(dhcpv6_msg_t);
|
||||||
int res, best_res = 0;
|
int res, best_res = 0;
|
||||||
bool first_rt = true;
|
bool first_rt = true;
|
||||||
@ -780,20 +780,20 @@ static void _solicit_servers(event_t *event)
|
|||||||
res = sock_udp_send(&sock, send_buf, msg_len, &remote);
|
res = sock_udp_send(&sock, send_buf, msg_len, &remote);
|
||||||
assert(res > 0); /* something went terribly wrong */
|
assert(res > 0); /* something went terribly wrong */
|
||||||
while (((res = sock_udp_recv(&sock, recv_buf, sizeof(recv_buf),
|
while (((res = sock_udp_recv(&sock, recv_buf, sizeof(recv_buf),
|
||||||
retrans_timeout, NULL)) <= 0) ||
|
retrans_timeout * US_PER_MS, NULL)) <= 0) ||
|
||||||
(first_rt && (res > 0)) ||
|
(first_rt && (res > 0)) ||
|
||||||
((res > 0) && (recv_buf[0] != DHCPV6_ADVERTISE))) {
|
((res > 0) && (recv_buf[0] != DHCPV6_ADVERTISE))) {
|
||||||
if (first_rt && (res > 0) && (recv_buf[0] == DHCPV6_ADVERTISE)) {
|
if (first_rt && (res > 0) && (recv_buf[0] == DHCPV6_ADVERTISE)) {
|
||||||
int parse_res;
|
int parse_res;
|
||||||
|
|
||||||
DEBUG("DHCPv6 client: initial transmission, collect best advertise\n");
|
DEBUG("DHCPv6 client: initial transmission, collect best advertise\n");
|
||||||
retrans_timeout -= (_get_elapsed_time() * US_PER_CS);
|
retrans_timeout -= (_get_elapsed_time() * MS_PER_CS);
|
||||||
parse_res = _preparse_advertise(recv_buf, res, &buf);
|
parse_res = _preparse_advertise(recv_buf, res, &buf);
|
||||||
if (buf != NULL) {
|
if (buf != NULL) {
|
||||||
best_res = res;
|
best_res = res;
|
||||||
}
|
}
|
||||||
if ((parse_res == UINT8_MAX) ||
|
if ((parse_res == UINT8_MAX) ||
|
||||||
(retrans_timeout > (DHCPV6_SOL_MAX_RT * US_PER_SEC))) {
|
(retrans_timeout > (DHCPV6_SOL_MAX_RT * MS_PER_SEC))) {
|
||||||
/* retrans_timeout underflowed => don't retry to receive */
|
/* retrans_timeout underflowed => don't retry to receive */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -801,7 +801,7 @@ static void _solicit_servers(event_t *event)
|
|||||||
else if (buf == NULL) {
|
else if (buf == NULL) {
|
||||||
DEBUG("DHCPv6 client: resend SOLICIT\n");
|
DEBUG("DHCPv6 client: resend SOLICIT\n");
|
||||||
first_rt = false;
|
first_rt = false;
|
||||||
retrans_timeout = _sub_rt_us(retrans_timeout, DHCPV6_SOL_MAX_RT);
|
retrans_timeout = _sub_rt_ms(retrans_timeout, DHCPV6_SOL_MAX_RT);
|
||||||
_compose_elapsed_time_opt(time);
|
_compose_elapsed_time_opt(time);
|
||||||
res = sock_udp_send(&sock, send_buf, msg_len, &remote);
|
res = sock_udp_send(&sock, send_buf, msg_len, &remote);
|
||||||
assert(res > 0); /* something went terribly wrong */
|
assert(res > 0); /* something went terribly wrong */
|
||||||
@ -872,7 +872,7 @@ static void _request_renew_rebind(uint8_t type)
|
|||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
retrans_timeout = _irt_us(irt, false);
|
retrans_timeout = _irt_ms(irt, false);
|
||||||
_generate_tid();
|
_generate_tid();
|
||||||
msg->type = type;
|
msg->type = type;
|
||||||
_set_tid(msg->tid);
|
_set_tid(msg->tid);
|
||||||
@ -891,12 +891,12 @@ static void _request_renew_rebind(uint8_t type)
|
|||||||
_flush_stale_replies(&sock);
|
_flush_stale_replies(&sock);
|
||||||
while (sock_udp_send(&sock, send_buf, msg_len, &remote) <= 0) {}
|
while (sock_udp_send(&sock, send_buf, msg_len, &remote) <= 0) {}
|
||||||
while (((res = sock_udp_recv(&sock, recv_buf, sizeof(recv_buf),
|
while (((res = sock_udp_recv(&sock, recv_buf, sizeof(recv_buf),
|
||||||
retrans_timeout, NULL)) <= 0) ||
|
retrans_timeout * US_PER_MS, NULL)) <= 0) ||
|
||||||
((res > 0) && (recv_buf[0] != DHCPV6_REPLY))) {
|
((res > 0) && (recv_buf[0] != DHCPV6_REPLY))) {
|
||||||
if ((mrd > 0) && (_get_elapsed_time() > (mrd * CS_PER_SEC))) {
|
if ((mrd > 0) && (_get_elapsed_time() > (mrd * CS_PER_SEC))) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
retrans_timeout = _sub_rt_us(retrans_timeout, mrt);
|
retrans_timeout = _sub_rt_ms(retrans_timeout, mrt);
|
||||||
if ((mrc > 0) && (++retrans) >= mrc) {
|
if ((mrc > 0) && (++retrans) >= mrc) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -939,17 +939,17 @@ static void _rebind(event_t *event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void _set_timer(xtimer_t *timer, xtimer_callback_t cb,
|
static void _set_timer(xtimer_t *timer, xtimer_callback_t cb,
|
||||||
uint32_t delay_us)
|
uint32_t delay_ms)
|
||||||
{
|
{
|
||||||
timer->callback = cb;
|
timer->callback = cb;
|
||||||
xtimer_set(timer, delay_us);
|
xtimer_set(timer, delay_ms * US_PER_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _set_timer64(xtimer_t *timer, xtimer_callback_t cb,
|
static void _set_timer64(xtimer_t *timer, xtimer_callback_t cb,
|
||||||
uint64_t delay_us)
|
uint64_t delay_ms)
|
||||||
{
|
{
|
||||||
timer->callback = cb;
|
timer->callback = cb;
|
||||||
xtimer_set64(timer, delay_us);
|
xtimer_set64(timer, delay_ms * US_PER_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _clear_timer(xtimer_t *timer)
|
static void _clear_timer(xtimer_t *timer)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user