From 13b8c04c6f603030b484ba455d690719f49e86fa Mon Sep 17 00:00:00 2001 From: Joakim Eriksson Date: Tue, 22 Sep 2015 22:12:06 +0200 Subject: [PATCH] fixed so that nbr policy for RPL Root do not save room for parents --- core/net/rpl/rpl-icmp6.c | 2 +- core/net/rpl/rpl-nbr-policy.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/core/net/rpl/rpl-icmp6.c b/core/net/rpl/rpl-icmp6.c index af7a05d67..6ff0dcfee 100644 --- a/core/net/rpl/rpl-icmp6.c +++ b/core/net/rpl/rpl-icmp6.c @@ -820,7 +820,7 @@ dao_input(void) PRINTF("RPL: adding DAO route\n"); /* Update and add neighbor - if no room - fail. */ - if((nbr = rpl_icmp6_update_nbr_table(&dao_sender_addr, NBR_TABLE_REASON_RPL_DAO, NULL)) == NULL) { + if((nbr = rpl_icmp6_update_nbr_table(&dao_sender_addr, NBR_TABLE_REASON_RPL_DAO, instance)) == NULL) { PRINTF("RPL: Out of Memory, dropping DAO from "); PRINT6ADDR(&dao_sender_addr); PRINTF(", "); diff --git a/core/net/rpl/rpl-nbr-policy.c b/core/net/rpl/rpl-nbr-policy.c index 7b0e28ff1..9c750a7e0 100644 --- a/core/net/rpl/rpl-nbr-policy.c +++ b/core/net/rpl/rpl-nbr-policy.c @@ -62,7 +62,6 @@ * NOTE: this policy assumes that all neighbors end up being IPv6 * neighbors and are not only MAC neighbors. */ - #define MAX_CHILDREN (NBR_TABLE_MAX_NEIGHBORS - 2) #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN]) @@ -212,13 +211,21 @@ find_removable_dio(uip_ipaddr_t *from, rpl_dio_t *dio) } /*---------------------------------------------------------------------------*/ const linkaddr_t * -find_removable_dao(uip_ipaddr_t *from) +find_removable_dao(uip_ipaddr_t *from, rpl_instance_t *instance) { + int max = MAX_CHILDREN; update_nbr(); + if(instance != NULL) { + /* No need to reserve space for parents for RPL ROOT */ + if(instance->current_dag->rank == ROOT_RANK(instance)) { + max = NBR_TABLE_MAX_NEIGHBORS; + } + } + /* Check if this DAO sender is not yet neighbor and there is already too many children. */ - if(num_children >= MAX_CHILDREN) { + if(num_children >= max) { PRINTF("Can not add another child - already at max.\n"); return NULL; } @@ -234,7 +241,7 @@ rpl_nbr_policy_find_removable(nbr_table_reason_t reason,void * data) { case NBR_TABLE_REASON_RPL_DIO: return find_removable_dio(&UIP_IP_BUF->srcipaddr, data); case NBR_TABLE_REASON_RPL_DAO: - return find_removable_dao(&UIP_IP_BUF->srcipaddr); + return find_removable_dao(&UIP_IP_BUF->srcipaddr, data); case NBR_TABLE_REASON_RPL_DIS: return find_removable_dis(&UIP_IP_BUF->srcipaddr); default: