From d382feabbe20741baaa5157fe4910fe793c66fff Mon Sep 17 00:00:00 2001 From: Martine Lenders Date: Fri, 27 Mar 2015 22:14:32 +0100 Subject: [PATCH 1/3] netif_hdr: add flags for broadcast and multicast --- sys/include/net/ng_netif/hdr.h | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/sys/include/net/ng_netif/hdr.h b/sys/include/net/ng_netif/hdr.h index a7510b2a0836..8e58c0da33a3 100644 --- a/sys/include/net/ng_netif/hdr.h +++ b/sys/include/net/ng_netif/hdr.h @@ -32,6 +32,37 @@ extern "C" { #endif +/** + * @{ + * @name Flags for the ng_netif_hdr_t + */ +/** + * @brief Send packet broadcast. + * + * @details Packets with this flag set must be send broadcast. + * ng_netif_hdr_t::dst_l2addr_len and any appended destination + * address must be ignored. + * If the link layer does not support broadcast the packet must be + * dropped silently. + */ +#define NG_NETIF_HDR_FLAGS_BROADCAST (0x80) + +/** + * @brief Send packet multicast. + * + * @details Packets with this flag set must be send multicast. + * ng_netif_hdr_t::dst_l2addr_len and any appended destination + * address must be ignored. + * The context for the multicast address must be derived from the + * network layer destination address. + * If the link layer does not support multicast it should interpret + * this flag the same way it does @ref NG_NETIF_HDR_FLAGS_BROADCAST. + */ +#define NG_NETIF_HDR_FLAGS_MULTICAST (0x40) +/** + * @} + */ + /** * @brief Generic network interface header * @@ -42,6 +73,7 @@ typedef struct __attribute__((packed)) { uint8_t src_l2addr_len; /**< length of l2 source address in byte */ uint8_t dst_l2addr_len; /**< length of l2 destination address in byte */ kernel_pid_t if_pid; /**< PID of network interface */ + uint8_t flags; /**< flags as defined above */ uint8_t rssi; /**< rssi of received packet (optional) */ uint8_t lqi; /**< lqi of received packet (optional) */ } ng_netif_hdr_t; @@ -61,6 +93,7 @@ static inline void ng_netif_hdr_init(ng_netif_hdr_t *hdr, uint8_t src_l2addr_len hdr->if_pid = KERNEL_PID_UNDEF; hdr->rssi = 0; hdr->lqi = 0; + hdr->flags = 0; } /** From 26e72b594f7b34a8ce156c3decb994fa30a1b8c0 Mon Sep 17 00:00:00 2001 From: Martine Lenders Date: Fri, 27 Mar 2015 22:29:54 +0100 Subject: [PATCH 2/3] drivers.xbee: adapt driver for bc/mc flags --- drivers/xbee/xbee.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/xbee/xbee.c b/drivers/xbee/xbee.c index 0aca6e9d7635..d43abc336246 100644 --- a/drivers/xbee/xbee.c +++ b/drivers/xbee/xbee.c @@ -486,6 +486,12 @@ int xbee_init(xbee_t *dev, uart_t uart, uint32_t baudrate, return 0; } +static inline bool _is_broadcast(ng_netif_hdr_t *hdr) { + /* IEEE 802.15.4 does not support multicast so we need to check both flags */ + return (bool)(hdr->flags & (NG_NETIF_HDR_FLAGS_BROADCAST | + NG_NETIF_HDR_FLAGS_MULTICAST)); +} + int _send(ng_netdev_t *netdev, ng_pktsnip_t *pkt) { xbee_t *dev = (xbee_t *)netdev; @@ -510,9 +516,10 @@ int _send(ng_netdev_t *netdev, ng_pktsnip_t *pkt) ng_pktbuf_release(pkt); return -EOVERFLOW; } - /* get netif header check address length */ + /* get netif header check address length and flags */ hdr = (ng_netif_hdr_t *)pkt->data; - if (!(hdr->dst_l2addr_len == 2 || hdr->dst_l2addr_len == 8)) { + if (!((hdr->dst_l2addr_len == 2) || (hdr->dst_l2addr_len == 8) || + _is_broadcast(hdr))) { ng_pktbuf_release(pkt); return -ENOMSG; } @@ -523,6 +530,13 @@ int _send(ng_netdev_t *netdev, ng_pktsnip_t *pkt) dev->tx_buf[0] = API_START_DELIMITER; dev->tx_buf[4] = 0; /* set to zero to disable response frame */ /* set size, API id and address field depending on dst address length */ + if (_is_broadcast(hdr)) { + dev->tx_buf[1] = (uint8_t)((size + 5) >> 8); + dev->tx_buf[2] = (uint8_t)(size + 5); + dev->tx_buf[3] = API_ID_TX_SHORT_ADDR; + dev->tx_buf[4] = 0xff; + dev->tx_buf[5] = 0xff; + } if (hdr->dst_l2addr_len == 2) { dev->tx_buf[1] = (uint8_t)((size + 5) >> 8); dev->tx_buf[2] = (uint8_t)(size + 5); From fa2ab8b7cd69418b0e5c4a350a4be35d0df2986e Mon Sep 17 00:00:00 2001 From: Martine Lenders Date: Fri, 27 Mar 2015 22:30:42 +0100 Subject: [PATCH 3/3] shell: adapt netif shell commands for bc flag --- sys/shell/commands/sc_netif.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/sys/shell/commands/sc_netif.c b/sys/shell/commands/sc_netif.c index 6f48786dd31a..f069e8309cab 100644 --- a/sys/shell/commands/sc_netif.c +++ b/sys/shell/commands/sc_netif.c @@ -296,10 +296,10 @@ int _netif_send(int argc, char **argv) size_t addr_len; ng_pktsnip_t *pkt; ng_netif_hdr_t *nethdr; - + uint8_t flags = 0x00; if (argc < 4) { - printf("usage: %s \n", argv[0]); + printf("usage: %s [|bcast] \n", argv[0]); return 1; } @@ -315,8 +315,13 @@ int _netif_send(int argc, char **argv) addr_len = ng_netif_addr_from_str(addr, sizeof(addr), argv[2]); if (addr_len == 0) { - puts("error: invalid address given"); - return 1; + if (strcmp(argv[2], "bcast") == 0) { + flags |= NG_NETIF_HDR_FLAGS_BROADCAST; + } + else { + puts("error: invalid address given"); + return 1; + } } /* put packet together */ @@ -326,6 +331,7 @@ int _netif_send(int argc, char **argv) nethdr = (ng_netif_hdr_t *)pkt->data; ng_netif_hdr_init(nethdr, 0, addr_len); ng_netif_hdr_set_dst_addr(nethdr, addr, addr_len); + nethdr->flags = flags; /* and send it */ ng_netapi_send(dev, pkt);