如何在传输中找到数据包的最后继电器节点



我正在尝试在RPL中实现安全机制。为此,我需要记录一个数据包的来源。例如,如果一个数据包是从a-> b-> c-> d传输的,我想在C上发现数据包通过B,并且类似地适用于d。

我已经在uip6.c文件中添加了一些代码,以从PacketBuffer拔出发件人地址,但始终为null。

我正在存储最后一个节点地址以及收到完整数据包的时间。这些是数据结构。

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

我到目前为止写的主要代码是在第1108行以下的uip_process()中(Master Branch(。

  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");

我希望它能给我Packetbuf的地址,但它总是无效的。另外,我怀疑它仅在目标节点上运行,而不是在中间节点上运行。

您可以调试执行。为此,只是将debug_none设置为uip6.c中的debug_print,然后解析串行日志以查找数据包所采用的路径。

相关内容

最新更新