diff --git a/sys/net/gnrc/routing/rpl/gnrc_rpl_dodag.c b/sys/net/gnrc/routing/rpl/gnrc_rpl_dodag.c index f827659e4c0ebb72510167fe204201936fe65309..43be9ee63fe2c1ab3b54102409512c5b04b64eca 100644 --- a/sys/net/gnrc/routing/rpl/gnrc_rpl_dodag.c +++ b/sys/net/gnrc/routing/rpl/gnrc_rpl_dodag.c @@ -192,12 +192,30 @@ bool gnrc_rpl_parent_add_by_addr(gnrc_rpl_dodag_t *dodag, ipv6_addr_t *addr, bool gnrc_rpl_parent_remove(gnrc_rpl_parent_t *parent) { - if (parent == parent->dodag->parents) { + assert(parent != NULL); + + gnrc_rpl_dodag_t *dodag = parent->dodag; + + if (parent == dodag->parents) { fib_remove_entry(&gnrc_ipv6_fib_table, (uint8_t *) ipv6_addr_unspecified.u8, sizeof(ipv6_addr_t)); + + /* set the default route to the next parent for now */ + if (parent->next) { + uint32_t now = xtimer_now() / SEC_IN_USEC; + fib_add_entry(&gnrc_ipv6_fib_table, + dodag->iface, + (uint8_t *) ipv6_addr_unspecified.u8, + sizeof(ipv6_addr_t), + FIB_FLAG_NET_PREFIX, + parent->next->addr.u8, + sizeof(ipv6_addr_t), + FIB_FLAG_RPL_ROUTE, + (parent->next->lifetime - now) * SEC_IN_MS); + } } - LL_DELETE(parent->dodag->parents, parent); + LL_DELETE(dodag->parents, parent); memset(parent, 0, sizeof(gnrc_rpl_parent_t)); return true; }