Пример #1
0
/*----------------------------------------------------------------------------*/
  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);
  }
Пример #2
0
/*----------------------------------------------------------------------------*/
  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);
  }
Пример #3
0
/*----------------------------------------------------------------------------*/
  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);
    }
  }