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); if (entry != NULL) { entry->lifetime = lifetime; return; } for (uint8_t i = 0; i < RPL_MAX_ROUTING_ENTRIES; i++) { if (!routing_table[i].used) { routing_table[i].address = *addr; routing_table[i].next_hop = *next_hop; routing_table[i].lifetime = lifetime; routing_table[i].used = 1; break; } } }
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); if (entry != NULL) { entry->lifetime = lifetime; return; } DEBUGF("Adding routing entry %s\n", ipv6_addr_to_str(addr_str, IPV6_MAX_ADDR_STR_LEN, addr)); for (uint8_t i = 0; i < rpl_max_routing_entries; i++) { if (!rpl_routing_table[i].used) { memcpy(&rpl_routing_table[i].address, addr, sizeof(ipv6_addr_t)); memcpy(&rpl_routing_table[i].next_hop, next_hop, sizeof(ipv6_addr_t)); rpl_routing_table[i].lifetime = lifetime; rpl_routing_table[i].used = 1; break; } } }
void rpl_add_srh_entry(ipv6_addr_t *child, ipv6_addr_t *parent, uint16_t lifetime) { rpl_routing_entry_t *entry = rpl_find_routing_entry(child); /* If we already have this entry and the parent from parent/child is the same as already * registered, we only update the lifetime. If only the parent of the child changes, we * delete the previous entry and add it below. */ if (entry != NULL) { if (ipv6_addr_is_equal(parent, &entry->next_hop)) { entry->lifetime = lifetime; return; } else { rpl_del_routing_entry(child); } } /* This maybe a bit confusing since the root also using the standard routing table, * but in this case the code stays cleaner - especially for rt_over_timer from trickle.c. * Just keep in mind that address is now child (unique, iteration variable) and parent is * now next_hop. The whole routing table transforms to a list of children and their parents, * so that route aggregation can be done properly. */ DEBUGF("Adding source-routing entry child: %s\n", ipv6_addr_to_str(addr_str, IPV6_MAX_ADDR_STR_LEN, child)); DEBUGF("Adding source-routing entry parent: %s\n", ipv6_addr_to_str(addr_str, IPV6_MAX_ADDR_STR_LEN, parent)); for (uint8_t i = 0; i < rpl_max_routing_entries; i++) { if (!rpl_routing_table[i].used) { memcpy(&rpl_routing_table[i].address, child, sizeof(ipv6_addr_t)); memcpy(&rpl_routing_table[i].next_hop, parent, sizeof(ipv6_addr_t)); rpl_routing_table[i].lifetime = lifetime; rpl_routing_table[i].used = 1; break; } } }