From 61e2424c77896fba0468df80deec062d9e439bad Mon Sep 17 00:00:00 2001 From: Yonezawa-T2 Date: Tue, 8 Dec 2015 19:37:40 +0900 Subject: [PATCH] xbee: add packet filtering to emulate non-transitive network. When debugging multihop wireless network, it is useful to emulate non-transitive network, that is, node A can communicate with B and B can communicate with C, but A cannot communicate with C directly. If `XBEE_DENIED_ADDRESSES`, which is an array of XBee long addresses, is defined, packets from those addresses are dropped silently. Example: CFLAGS += "-DXBEE_DENIED_ADDRESSES={ 0x02, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0x02, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }" --- drivers/xbee/xbee.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/xbee/xbee.c b/drivers/xbee/xbee.c index 881539adf4e8..5c7a09acca7f 100644 --- a/drivers/xbee/xbee.c +++ b/drivers/xbee/xbee.c @@ -756,6 +756,23 @@ static void _isr_event(gnrc_netdev_t *netdev, uint32_t event_type) addr_len = 8; } +#ifdef XBEE_DENIED_ADDRESSES + if (addr_len == 8) { + uint8_t denied_addresses[] = XBEE_DENIED_ADDRESSES; + for (size_t i = 0; i < sizeof(denied_addresses) / 8; i++) { + if (memcmp(&(dev->rx_buf[1]), + &denied_addresses[i * 8], + addr_len) == 0) { + dev->rx_count = 0; + + DEBUG("xbee: dropping denied packet\n"); + + return; + } + } + } +#endif + /* check checksum for correctness */ for (int i = 0; i < dev->rx_limit; i++) { cksum += dev->rx_buf[i];