From a06c667af59861de2a7eeb1c6ef36dcd0b87d60b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20G=C3=BCndo=C4=9Fan?= Date: Thu, 8 Jan 2015 11:36:26 +0100 Subject: [PATCH] rpl: remove routing table dependent code This PR removes code depending on a routing table with an entries size > 0. Currently, all those functions and symbols are compiled into the binary, even when there is no effective space in the routing table (as it is the case for normal nodes in non-storing mode) --- sys/net/routing/rpl/rpl.c | 36 +++++++++++++------ .../rpl/rpl_nonstoring/rpl_nonstoring.c | 2 +- sys/net/routing/rpl/rpl_storing/rpl_storing.c | 2 ++ sys/net/routing/rpl/trickle.c | 5 ++- sys/shell/commands/sc_rpl.c | 8 +++-- 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/sys/net/routing/rpl/rpl.c b/sys/net/routing/rpl/rpl.c index c66ab8fb0c..8e285f0995 100644 --- a/sys/net/routing/rpl/rpl.c +++ b/sys/net/routing/rpl/rpl.c @@ -66,8 +66,9 @@ ipv6_srh_t *srh_header; msg_t srh_m_send, srh_m_recv; #endif +#if RPL_MAX_ROUTING_ENTRIES != 0 rpl_routing_entry_t rpl_routing_table[RPL_MAX_ROUTING_ENTRIES]; - +#endif uint8_t rpl_max_routing_entries; ipv6_addr_t my_address; @@ -80,16 +81,10 @@ uint8_t rpl_init(int if_id) rpl_instances_init(); /* initialize routing table */ +#if RPL_MAX_ROUTING_ENTRIES != 0 rpl_max_routing_entries = RPL_MAX_ROUTING_ENTRIES; rpl_clear_routing_table(); - - if (rpl_routing_table == NULL) { - DEBUGF("Routing table init failed!\n"); - return SIXLOWERROR_NULLPTR; - } - else { - DEBUGF("Routing table init finished!\n"); - } +#endif init_trickle(); rpl_process_pid = thread_create(rpl_process_buf, RPL_PROCESS_STACKSIZE, @@ -223,6 +218,7 @@ void *rpl_process(void *arg) } } } +#if RPL_MAX_ROUTING_ENTRIES != 0 else { srh_header = rpl_get_srh_header(ipv6_buf); @@ -231,7 +227,7 @@ void *rpl_process(void *arg) rpl_srh_sendto(payload, NTOHS(ipv6_buf->length), &ipv6_buf->srcaddr, &ipv6_buf->destaddr, srh_header, srh_header->hdrextlen + sizeof(ipv6_srh_t)); } } - +#endif } #endif @@ -316,6 +312,7 @@ ipv6_addr_t *rpl_get_next_hop(ipv6_addr_t *addr) DEBUGF("Looking up the next hop to %s\n", ipv6_addr_to_str(addr_str, IPV6_MAX_ADDR_STR_LEN, addr)); +#if RPL_MAX_ROUTING_ENTRIES != 0 for (uint8_t i = 0; i < rpl_max_routing_entries; i++) { if (rpl_routing_table[i].used) { DEBUGF("checking %d: %s\n", i, ipv6_addr_to_str(addr_str, IPV6_MAX_ADDR_STR_LEN, &rpl_routing_table[i].address)); @@ -334,10 +331,14 @@ ipv6_addr_t *rpl_get_next_hop(ipv6_addr_t *addr) } } } +#else + (void) addr; +#endif return (rpl_get_my_preferred_parent()); } +#if RPL_MAX_ROUTING_ENTRIES != 0 void rpl_add_routing_entry(ipv6_addr_t *addr, ipv6_addr_t *next_hop, uint16_t lifetime) { rpl_routing_entry_t *entry = rpl_find_routing_entry(addr); @@ -359,7 +360,9 @@ void rpl_add_routing_entry(ipv6_addr_t *addr, ipv6_addr_t *next_hop, uint16_t li } } } +#endif +#if RPL_MAX_ROUTING_ENTRIES != 0 void rpl_del_routing_entry(ipv6_addr_t *addr) { @@ -372,7 +375,9 @@ void rpl_del_routing_entry(ipv6_addr_t *addr) } } } +#endif +#if RPL_MAX_ROUTING_ENTRIES != 0 rpl_routing_entry_t *rpl_find_routing_entry(ipv6_addr_t *addr) { @@ -386,7 +391,9 @@ rpl_routing_entry_t *rpl_find_routing_entry(ipv6_addr_t *addr) return NULL; } +#endif +#if RPL_MAX_ROUTING_ENTRIES != 0 void rpl_clear_routing_table(void) { @@ -394,15 +401,21 @@ void rpl_clear_routing_table(void) memset(&rpl_routing_table[i], 0, sizeof(rpl_routing_table[i])); } } +#endif rpl_routing_entry_t *rpl_get_routing_table(void) { +#if RPL_MAX_ROUTING_ENTRIES != 0 return rpl_routing_table; +#else + return NULL; +#endif } #if RPL_DEFAULT_MOP == RPL_NON_STORING_MODE /* everything from here on is non-storing mode related */ +#if RPL_MAX_ROUTING_ENTRIES != 0 void rpl_add_srh_entry(ipv6_addr_t *child, ipv6_addr_t *parent, uint16_t lifetime) { @@ -440,6 +453,7 @@ void rpl_add_srh_entry(ipv6_addr_t *child, ipv6_addr_t *parent, uint16_t lifetim } } } +#endif /** * @brief Checks if two IPv6 host suffixes are equal. @@ -455,6 +469,7 @@ int ipv6_suffix_is_equal(const ipv6_addr_t *a, const ipv6_addr_t *b) (a->uint32[3] == b->uint32[3]); } +#if RPL_MAX_ROUTING_ENTRIES != 0 ipv6_srh_t *rpl_get_srh_header(ipv6_hdr_t *act_ipv6_hdr) { uint8_t route_length = RPL_MAX_SRH_PATH_LENGTH; @@ -523,6 +538,7 @@ ipv6_srh_t *rpl_get_srh_header(ipv6_hdr_t *act_ipv6_hdr) /* set the destination-address in ipv6-buf->destaddr, which is the pointer of child */ return srh_header; } +#endif void rpl_remove_srh_header(ipv6_hdr_t *ipv6_header, const void *buf, uint8_t nextheader) { diff --git a/sys/net/routing/rpl/rpl_nonstoring/rpl_nonstoring.c b/sys/net/routing/rpl/rpl_nonstoring/rpl_nonstoring.c index 890fae9d69..196fd0b3ea 100644 --- a/sys/net/routing/rpl/rpl_nonstoring/rpl_nonstoring.c +++ b/sys/net/routing/rpl/rpl_nonstoring/rpl_nonstoring.c @@ -676,7 +676,7 @@ void rpl_recv_DAO_mode(void) &rpl_opt_target_buf->target)); DEBUGF("Transit: %s\n", ipv6_addr_to_str(addr_str_mode, IPV6_MAX_ADDR_STR_LEN, &rpl_opt_transit_buf->parent)); -#if RPL_DEFAULT_MOP == RPL_NON_STORING_MODE +#if (RPL_DEFAULT_MOP == RPL_NON_STORING_MODE) && (RPL_MAX_ROUTING_ENTRIES != 0) rpl_add_srh_entry(&rpl_opt_target_buf->target, &rpl_opt_transit_buf->parent, rpl_opt_transit_buf->path_lifetime * my_dodag->lifetime_unit); #endif diff --git a/sys/net/routing/rpl/rpl_storing/rpl_storing.c b/sys/net/routing/rpl/rpl_storing/rpl_storing.c index 9ecce2c8f1..1ceb85d232 100644 --- a/sys/net/routing/rpl/rpl_storing/rpl_storing.c +++ b/sys/net/routing/rpl/rpl_storing/rpl_storing.c @@ -691,12 +691,14 @@ void rpl_recv_DAO_mode(void) len += rpl_opt_transit_buf->length; /* route lifetime seconds = (DAO lifetime) * (Unit Lifetime) */ +#if RPL_MAX_ROUTING_ENTRIES != 0 DEBUG("Adding routing information: Target: %s, Source: %s, Lifetime: %u\n", ipv6_addr_to_str(addr_str_mode, IPV6_MAX_ADDR_STR_LEN, &rpl_opt_target_buf->target), ipv6_addr_to_str(addr_str_mode, IPV6_MAX_ADDR_STR_LEN, &ipv6_buf->srcaddr), (rpl_opt_transit_buf->path_lifetime * my_dodag->lifetime_unit)); rpl_add_routing_entry(&rpl_opt_target_buf->target, &ipv6_buf->srcaddr, rpl_opt_transit_buf->path_lifetime * my_dodag->lifetime_unit); +#endif increment_seq = 1; break; } diff --git a/sys/net/routing/rpl/trickle.c b/sys/net/routing/rpl/trickle.c index 9195917930..af05fe7a5e 100644 --- a/sys/net/routing/rpl/trickle.c +++ b/sys/net/routing/rpl/trickle.c @@ -246,12 +246,15 @@ static void *rt_timer_over(void *arg) { (void) arg; +#if RPL_MAX_ROUTING_ENTRIES != 0 rpl_routing_entry_t *rt; +#endif while (1) { rpl_dodag_t *my_dodag = rpl_get_my_dodag(); if (my_dodag != NULL) { +#if RPL_MAX_ROUTING_ENTRIES != 0 rt = rpl_get_routing_table(); for (uint8_t i = 0; i < rpl_max_routing_entries; i++) { @@ -264,7 +267,7 @@ static void *rt_timer_over(void *arg) } } } - +#endif /* Parent is NULL for root too */ if (my_dodag->my_preferred_parent != NULL) { if (my_dodag->my_preferred_parent->lifetime <= 1) { diff --git a/sys/shell/commands/sc_rpl.c b/sys/shell/commands/sc_rpl.c index b5a282dd3e..b0f1d71e71 100644 --- a/sys/shell/commands/sc_rpl.c +++ b/sys/shell/commands/sc_rpl.c @@ -20,13 +20,15 @@ #include "rpl.h" +#if RPL_MAX_ROUTING_ENTRIES != 0 static char addr_str[IPV6_MAX_ADDR_STR_LEN]; - +#endif void _rpl_route_handler(int argc, char **argv) { (void) argc; (void) argv; +#if RPL_MAX_ROUTING_ENTRIES != 0 rpl_routing_entry_t *rtable; rtable = rpl_get_routing_table(); unsigned c = 0; @@ -48,6 +50,8 @@ void _rpl_route_handler(int argc, char **argv) } puts("--------------------------------------------------------------------"); printf(" %u routing table entries\n", c); - +#else + puts("No routing table available"); +#endif puts("$"); }