From eae0e4c724df65d33f45696ba74dc2c791b07f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20G=C3=BCndo=C4=9Fan?= <cnkgndgn@gmail.com> Date: Wed, 23 Mar 2016 11:17:37 +0100 Subject: [PATCH] gnrc_rpl: new default route when old one was deleted --- sys/net/gnrc/routing/rpl/gnrc_rpl_dodag.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/sys/net/gnrc/routing/rpl/gnrc_rpl_dodag.c b/sys/net/gnrc/routing/rpl/gnrc_rpl_dodag.c index f827659e4c..43be9ee63f 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; } -- GitLab