Как найти последний ретрансляционный узел пакета данных в пути? - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь реализовать механизм защиты в RPL. Для этого мне нужно войти, откуда пришел пакет. Например, если пакет передается из A -> B -> C -> D, я хочу узнать в C, что пакет прошел через B, и аналогично для D.

Я добавил некоторый код в файл uip6.c, чтобы получить адрес отправителя из буфера пакетов, но он всегда нулевой.

Я сохраняю адрес последнего узла и время получения полного пакета. Это структуры данных.

struct packet_time_entry {
  linkaddr_t *source;
  uint32_t time;
};
MEMB(packet_time_mem, struct packet_time_entry, 16);
LIST(packet_time);

Основной код, который я написал до сих пор, это в uip_process() ниже строки 1108 (основная ветвь).

  struct packet_time_entry *p = memb_alloc(&packet_time_mem);
  p->time = clock_time();
  linkaddr_copy(p->source, packetbuf_addr(PACKETBUF_ADDR_SENDER));

  struct packet_time_entry *i;
  for (i = list_head(packet_time); i != NULL; i = list_item_next(i)) {
    if (linkaddr_cmp(i->source, p->source))
      list_remove(packet_time, i);
  }
  list_add(packet_time, p);
  PRINTF("Entry ");
  PRINTLLADDR((uip_lladdr_t*) p->source);  // always NULL 
  PRINTF("| %lu", p->time);
  PRINTF("\n");

Я ожидаю, что он даст мне адрес из packagebuf, но он всегда NULL. Кроме того, я подозреваю, что он запускается только на узле назначения, но не на промежуточных узлах.

1 Ответ

0 голосов
/ 23 мая 2019

Вы можете отладить выполнение. Для этого просто установите DEBUG_NONE в DEBUG_PRINT в uip6.c, а затем проанализируйте последовательный журнал, чтобы найти путь, пройденный пакетом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...