void routingtable_break_and_get_all_hopping_over(struct netaddr *hop, struct unreachable_node unreachable_nodes[], size_t *len) { *len = 0; /* to be sure */ for (unsigned i = 0; i < AODVV2_MAX_ROUTING_ENTRIES; i++) { _reset_entry_if_stale(i); if (netaddr_cmp(&routing_table[i].nextHopAddr, hop) == 0) { if (routing_table[i].state == ROUTE_STATE_ACTIVE && *len < AODVV2_MAX_UNREACHABLE_NODES) { /* when the max number of unreachable nodes is reached we're screwed. * the above check is just damage control. */ unreachable_nodes[*len].addr = routing_table[i].addr; unreachable_nodes[*len].seqnum = routing_table[i].seqnum; (*len)++; DEBUG("\t[routing] unreachable node found: %s\n", netaddr_to_string(&nbuf, &routing_table[i].nextHopAddr)); } routing_table[i].state = ROUTE_STATE_INVALID; DEBUG("\t[routing] number of unreachable nodes: %i\n", *len); } } }
void routingtable_delete_entry(struct netaddr *addr, aodvv2_metric_t metricType) { for (unsigned i = 0; i < AODVV2_MAX_ROUTING_ENTRIES; i++) { _reset_entry_if_stale(i); if (!netaddr_cmp(&routing_table[i].addr, addr) && routing_table[i].metricType == metricType) { memset(&routing_table[i], 0, sizeof(routing_table[i])); return; } } }
/* * retrieve pointer to a comparable (according to Section 6.7.) * RREQ table entry if it exists and NULL otherwise. * Two AODVv2 RREQ messages are comparable if: * - they have the same metric type * - they have the same OrigNode and TargNode addresses */ static struct aodvv2_rreq_entry *_get_comparable_rreq(struct aodvv2_packet_data *packet_data) { for (unsigned i = 0; i < AODVV2_RREQ_BUF; i++) { _reset_entry_if_stale(i); if (!netaddr_cmp(&rreq_table[i].origNode, &packet_data->origNode.addr) && !netaddr_cmp(&rreq_table[i].targNode, &packet_data->targNode.addr) && rreq_table[i].metricType == packet_data->metricType) { return &rreq_table[i]; } } return NULL; }
struct aodvv2_routing_entry_t *routingtable_get_entry(struct netaddr *addr, aodvv2_metric_t metricType) { for (unsigned i = 0; i < AODVV2_MAX_ROUTING_ENTRIES; i++) { _reset_entry_if_stale(i); if (!netaddr_cmp(&routing_table[i].addr, addr) && routing_table[i].metricType == metricType) { DEBUG("[routing] found entry for %s :", netaddr_to_string(&nbuf, addr)); #if ENABLE_DEBUG print_routingtable_entry(&routing_table[i]); #endif return &routing_table[i]; } } return NULL; }