netif: use xtimer for gnrc_ipv6_netif_t::rtr_adv_timer
This commit is contained in:
parent
7490dc21a0
commit
a979d0c72c
@ -342,7 +342,8 @@ typedef struct {
|
|||||||
xtimer_t rtr_sol_timer; /**< Timer for periodic router solicitations */
|
xtimer_t rtr_sol_timer; /**< Timer for periodic router solicitations */
|
||||||
msg_t rtr_sol_msg; /**< msg_t for gnrc_ipv6_netif_t::rtr_sol_timer */
|
msg_t rtr_sol_msg; /**< msg_t for gnrc_ipv6_netif_t::rtr_sol_timer */
|
||||||
#if defined (MODULE_GNRC_NDP_ROUTER) || defined (MODULE_GNRC_SIXLOWPAN_ND_ROUTER)
|
#if defined (MODULE_GNRC_NDP_ROUTER) || defined (MODULE_GNRC_SIXLOWPAN_ND_ROUTER)
|
||||||
vtimer_t rtr_adv_timer; /**< Timer for periodic router advertisements */
|
xtimer_t rtr_adv_timer; /**< Timer for periodic router advertisements */
|
||||||
|
msg_t rtr_adv_msg; /**< msg_t for gnrc_ipv6_netif_t::rtr_adv_timer */
|
||||||
#endif
|
#endif
|
||||||
} gnrc_ipv6_netif_t;
|
} gnrc_ipv6_netif_t;
|
||||||
|
|
||||||
|
|||||||
@ -236,7 +236,7 @@ void gnrc_ipv6_netif_remove(kernel_pid_t pid)
|
|||||||
mutex_lock(&entry->mutex);
|
mutex_lock(&entry->mutex);
|
||||||
xtimer_remove(&entry->rtr_sol_timer);
|
xtimer_remove(&entry->rtr_sol_timer);
|
||||||
#ifdef MODULE_GNRC_NDP_ROUTER
|
#ifdef MODULE_GNRC_NDP_ROUTER
|
||||||
vtimer_remove(&entry->rtr_adv_timer);
|
xtimer_remove(&entry->rtr_adv_timer);
|
||||||
#endif
|
#endif
|
||||||
_reset_addr_from_entry(entry);
|
_reset_addr_from_entry(entry);
|
||||||
DEBUG("ipv6 netif: Remove IPv6 interface %" PRIkernel_pid "\n", pid);
|
DEBUG("ipv6 netif: Remove IPv6 interface %" PRIkernel_pid "\n", pid);
|
||||||
|
|||||||
@ -422,38 +422,42 @@ void gnrc_ndp_rtr_sol_handle(kernel_pid_t iface, gnrc_pktsnip_t *pkt,
|
|||||||
_stale_nc(iface, &ipv6->src, l2src, l2src_len);
|
_stale_nc(iface, &ipv6->src, l2src, l2src_len);
|
||||||
/* send delayed */
|
/* send delayed */
|
||||||
if (if_entry->flags & GNRC_IPV6_NETIF_FLAGS_RTR_ADV) {
|
if (if_entry->flags & GNRC_IPV6_NETIF_FLAGS_RTR_ADV) {
|
||||||
timex_t delay;
|
uint32_t delay;
|
||||||
uint32_t ms = GNRC_NDP_MAX_RTR_ADV_DELAY;
|
uint32_t ms = GNRC_NDP_MAX_RTR_ADV_DELAY;
|
||||||
#ifdef MODULE_GNRC_SIXLOWPAN_ND_ROUTER
|
#ifdef MODULE_GNRC_SIXLOWPAN_ND_ROUTER
|
||||||
if (if_entry->flags & GNRC_IPV6_NETIF_FLAGS_SIXLOWPAN) {
|
if (if_entry->flags & GNRC_IPV6_NETIF_FLAGS_SIXLOWPAN) {
|
||||||
ms = GNRC_SIXLOWPAN_ND_MAX_RTR_ADV_DELAY;
|
ms = GNRC_SIXLOWPAN_ND_MAX_RTR_ADV_DELAY;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
delay = timex_set(0, genrand_uint32_range(0, ms));
|
delay = genrand_uint32_range(0, ms);
|
||||||
vtimer_remove(&if_entry->rtr_adv_timer);
|
xtimer_remove(&if_entry->rtr_adv_timer);
|
||||||
#ifdef MODULE_GNRC_SIXLOWPAN_ND_ROUTER
|
#ifdef MODULE_GNRC_SIXLOWPAN_ND_ROUTER
|
||||||
/* in case of a 6LBR we have to check if the interface is actually
|
/* in case of a 6LBR we have to check if the interface is actually
|
||||||
* the 6lo interface */
|
* the 6lo interface */
|
||||||
if (if_entry->flags & GNRC_IPV6_NETIF_FLAGS_SIXLOWPAN) {
|
if (if_entry->flags & GNRC_IPV6_NETIF_FLAGS_SIXLOWPAN) {
|
||||||
gnrc_ipv6_nc_t *nc_entry = gnrc_ipv6_nc_get(iface, &ipv6->src);
|
gnrc_ipv6_nc_t *nc_entry = gnrc_ipv6_nc_get(iface, &ipv6->src);
|
||||||
if (nc_entry != NULL) {
|
if (nc_entry != NULL) {
|
||||||
vtimer_set_msg(&if_entry->rtr_adv_timer, delay, gnrc_ipv6_pid,
|
if_entry->rtr_adv_msg.type = GNRC_NDP_MSG_RTR_ADV_SIXLOWPAN_DELAY;
|
||||||
GNRC_NDP_MSG_RTR_ADV_SIXLOWPAN_DELAY, nc_entry);
|
if_entry->rtr_adv_msg.content.ptr = (char *) nc_entry;
|
||||||
|
xtimer_set_msg(&if_entry->rtr_adv_timer, delay, &if_entry->rtr_adv_msg,
|
||||||
|
gnrc_ipv6_pid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif defined(MODULE_GNRC_NDP_ROUTER) || defined(MODULE_GNRC_SIXLOWPAN_ND_BORDER_ROUTER)
|
#elif defined(MODULE_GNRC_NDP_ROUTER) || defined(MODULE_GNRC_SIXLOWPAN_ND_BORDER_ROUTER)
|
||||||
if (ipv6_addr_is_unspecified(&ipv6->src)) {
|
if (ipv6_addr_is_unspecified(&ipv6->src)) {
|
||||||
/* either multicast, if source unspecified */
|
/* either multicast, if source unspecified */
|
||||||
vtimer_set_msg(&if_entry->rtr_adv_timer, delay, gnrc_ipv6_pid,
|
if_entry->rtr_adv_msg.type = GNRC_NDP_MSG_RTR_ADV_RETRANS;
|
||||||
GNRC_NDP_MSG_RTR_ADV_RETRANS, if_entry);
|
if_entry->rtr_adv_msg.content.ptr = (char *) if_entry;
|
||||||
|
xtimer_set_msg(&if_entry->rtr_adv_timer, delay, &if_entry->rtr_adv_msg,
|
||||||
|
gnrc_ipv6_pid);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* or unicast, if source is known */
|
/* or unicast, if source is known */
|
||||||
/* XXX: can't just use GNRC_NETAPI_MSG_TYPE_SND, since the next retransmission
|
/* XXX: can't just use GNRC_NETAPI_MSG_TYPE_SND, since the next retransmission
|
||||||
* must also be set. */
|
* must also be set. */
|
||||||
gnrc_ipv6_nc_t *nc_entry = gnrc_ipv6_nc_get(iface, &ipv6->src);
|
gnrc_ipv6_nc_t *nc_entry = gnrc_ipv6_nc_get(iface, &ipv6->src);
|
||||||
xtimer_set_msg(&nc_entry->rtr_adv_timer, (uint32_t) timex_uint64(delay),
|
xtimer_set_msg(&nc_entry->rtr_adv_timer, delay, &nc_entry->rtr_adv_msg,
|
||||||
&nc_entry->rtr_adv_msg, gnrc_ipv6_pid);
|
gnrc_ipv6_pid);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@ -106,9 +106,11 @@ static void _send_rtr_adv(gnrc_ipv6_netif_t *iface, ipv6_addr_t *dst)
|
|||||||
}
|
}
|
||||||
if (!fin || (iface->rtr_adv_count > 1)) { /* regard for off-by-one-error */
|
if (!fin || (iface->rtr_adv_count > 1)) { /* regard for off-by-one-error */
|
||||||
/* reset timer for next router advertisement */
|
/* reset timer for next router advertisement */
|
||||||
vtimer_remove(&iface->rtr_adv_timer);
|
xtimer_remove(&iface->rtr_adv_timer);
|
||||||
vtimer_set_msg(&iface->rtr_adv_timer, timex_set(interval, 0),
|
iface->rtr_adv_msg.type = GNRC_NDP_MSG_RTR_ADV_RETRANS;
|
||||||
gnrc_ipv6_pid, GNRC_NDP_MSG_RTR_ADV_RETRANS, iface);
|
iface->rtr_adv_msg.content.ptr = (char *) iface;
|
||||||
|
xtimer_set_msg(&iface->rtr_adv_timer, interval * SEC_IN_USEC, &iface->rtr_adv_msg,
|
||||||
|
gnrc_ipv6_pid);
|
||||||
}
|
}
|
||||||
mutex_unlock(&iface->mutex);
|
mutex_unlock(&iface->mutex);
|
||||||
for (int i = 0; i < GNRC_IPV6_NETIF_ADDR_NUMOF; i++) {
|
for (int i = 0; i < GNRC_IPV6_NETIF_ADDR_NUMOF; i++) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user