Я пытаюсь реализовать механизм защиты в 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. Кроме того, я подозреваю, что он запускается только на узле назначения, но не на промежуточных узлах.