/*----------------------------------------------------------------------------*/ void handle_beacon(packet_t* p) { add_neighbor(&(p->header.src),p->info.rssi); #if !SINK // TODO what if the network changes? uint8_t new_hops = get_payload_at(p, BEACON_HOPS_INDEX); if (new_hops <= conf.hops_from_sink-1 && p->info.rssi > conf.rssi_from_sink) { conf.nxh_vs_sink = p->header.src; conf.hops_from_sink = new_hops+1; conf.rssi_from_sink = p->info.rssi; conf.sink_address = p->header.nxh; } #endif packet_deallocate(p); }
/*----------------------------------------------------------------------------*/ void handle_beacon(packet_t* p) { add_neighbor(&(p->header.src),p->info.rssi); #if !SINK uint8_t new_hops = get_payload_at(p, BEACON_HOPS_INDEX); uint8_t new_distance = p->info.rssi; if (address_cmp(&(conf.nxh_vs_sink), &(p->header.src)) || #if MOBILE (new_distance < conf.distance_from_sink) #else (new_hops <= conf.hops_from_sink-1 && new_distance < conf.distance_from_sink) #endif ) { conf.nxh_vs_sink = p->header.src; conf.distance_from_sink = new_distance; conf.sink_address = p->header.nxh; conf.hops_from_sink = new_hops+1; } #endif packet_deallocate(p); }
/*----------------------------------------------------------------------------*/ void handle_open_path(packet_t* p) { int i; uint8_t n_windows = get_payload_at(p,OPEN_PATH_WINDOWS_INDEX); uint8_t start = n_windows*WINDOW_SIZE + 1; uint8_t path_len = (p->header.len - (start + PLD_INDEX))/ADDRESS_LENGTH; uint8_t my_index = 0; uint8_t my_position = 0; uint8_t end = p->header.len - PLD_INDEX; for (i = start; i < end; i += ADDRESS_LENGTH) { address_t tmp = get_address_from_array(&(p->payload[i])); if (is_my_address(&tmp)) { my_index = i; break; } my_position++; } if (my_position > 0) { uint8_t prev = my_index - ADDRESS_LENGTH; uint8_t first = start; entry_t* e = create_entry(); window_t* w = create_window(); w->operation = EQUAL; w->size = SIZE_2; w->lhs = DST_INDEX; w->lhs_location = PACKET; w->rhs = MERGE_BYTES(p->payload[first], p->payload[first+1]); w->rhs_location = CONST; add_window(e,w); for (i = 0; i<n_windows; ++i) { add_window(e, get_window_from_array(&(p->payload[i*WINDOW_SIZE + 1]))); } action_t* a = create_action(FORWARD_U, &(p->payload[prev]), ADDRESS_LENGTH); add_action(e,a); PRINTF("[PHD]: "); print_entry(e); PRINTF("\n"); add_entry(e); } if (my_position < path_len-1) { uint8_t next = my_index + ADDRESS_LENGTH; uint8_t last = end - ADDRESS_LENGTH; entry_t* e = create_entry(); window_t* w = create_window(); w->operation = EQUAL; w->size = SIZE_2; w->lhs = DST_INDEX; w->lhs_location = PACKET; w->rhs = MERGE_BYTES(p->payload[last], p->payload[last+1]); w->rhs_location = CONST; add_window(e,w); for (i = 0; i<n_windows; ++i) { add_window(e, get_window_from_array(&(p->payload[i*WINDOW_SIZE + 1]))); } action_t* a = create_action(FORWARD_U, &(p->payload[next]), ADDRESS_LENGTH); add_action(e,a); PRINTF("[PHD]: "); print_entry(e); PRINTF("\n"); add_entry(e); address_t next_address = get_address_from_array(&(p->payload[next])); p->header.nxh = next_address; p->header.dst = next_address; rf_unicast_send(p); } if (my_position == path_len-1){ packet_deallocate(p); } }