Skip to content
Snippets Groups Projects
Commit 67602bb4 authored by Martine Lenders's avatar Martine Lenders
Browse files

Merge pull request #2600 from authmillenon/ipv6_nc/feat/mc-translation

[RFC] ng_netif_hdr: add flags for multicast and broadcast
parents 1af61260 fa2ab8b7
No related branches found
No related tags found
No related merge requests found
...@@ -486,6 +486,12 @@ int xbee_init(xbee_t *dev, uart_t uart, uint32_t baudrate, ...@@ -486,6 +486,12 @@ int xbee_init(xbee_t *dev, uart_t uart, uint32_t baudrate,
return 0; 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) int _send(ng_netdev_t *netdev, ng_pktsnip_t *pkt)
{ {
xbee_t *dev = (xbee_t *)netdev; xbee_t *dev = (xbee_t *)netdev;
...@@ -510,9 +516,10 @@ int _send(ng_netdev_t *netdev, ng_pktsnip_t *pkt) ...@@ -510,9 +516,10 @@ int _send(ng_netdev_t *netdev, ng_pktsnip_t *pkt)
ng_pktbuf_release(pkt); ng_pktbuf_release(pkt);
return -EOVERFLOW; return -EOVERFLOW;
} }
/* get netif header check address length */ /* get netif header check address length and flags */
hdr = (ng_netif_hdr_t *)pkt->data; 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); ng_pktbuf_release(pkt);
return -ENOMSG; return -ENOMSG;
} }
...@@ -523,6 +530,13 @@ int _send(ng_netdev_t *netdev, ng_pktsnip_t *pkt) ...@@ -523,6 +530,13 @@ int _send(ng_netdev_t *netdev, ng_pktsnip_t *pkt)
dev->tx_buf[0] = API_START_DELIMITER; dev->tx_buf[0] = API_START_DELIMITER;
dev->tx_buf[4] = 0; /* set to zero to disable response frame */ dev->tx_buf[4] = 0; /* set to zero to disable response frame */
/* set size, API id and address field depending on dst address length */ /* 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) { if (hdr->dst_l2addr_len == 2) {
dev->tx_buf[1] = (uint8_t)((size + 5) >> 8); dev->tx_buf[1] = (uint8_t)((size + 5) >> 8);
dev->tx_buf[2] = (uint8_t)(size + 5); dev->tx_buf[2] = (uint8_t)(size + 5);
......
...@@ -32,6 +32,37 @@ ...@@ -32,6 +32,37 @@
extern "C" { extern "C" {
#endif #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 * @brief Generic network interface header
* *
...@@ -42,6 +73,7 @@ typedef struct __attribute__((packed)) { ...@@ -42,6 +73,7 @@ typedef struct __attribute__((packed)) {
uint8_t src_l2addr_len; /**< length of l2 source address in byte */ uint8_t src_l2addr_len; /**< length of l2 source address in byte */
uint8_t dst_l2addr_len; /**< length of l2 destination address in byte */ uint8_t dst_l2addr_len; /**< length of l2 destination address in byte */
kernel_pid_t if_pid; /**< PID of network interface */ 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 rssi; /**< rssi of received packet (optional) */
uint8_t lqi; /**< lqi of received packet (optional) */ uint8_t lqi; /**< lqi of received packet (optional) */
} ng_netif_hdr_t; } 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 ...@@ -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->if_pid = KERNEL_PID_UNDEF;
hdr->rssi = 0; hdr->rssi = 0;
hdr->lqi = 0; hdr->lqi = 0;
hdr->flags = 0;
} }
/** /**
......
...@@ -369,10 +369,10 @@ int _netif_send(int argc, char **argv) ...@@ -369,10 +369,10 @@ int _netif_send(int argc, char **argv)
size_t addr_len; size_t addr_len;
ng_pktsnip_t *pkt; ng_pktsnip_t *pkt;
ng_netif_hdr_t *nethdr; ng_netif_hdr_t *nethdr;
uint8_t flags = 0x00;
if (argc < 4) { if (argc < 4) {
printf("usage: %s <if> <addr> <data>\n", argv[0]); printf("usage: %s <if> [<addr>|bcast] <data>\n", argv[0]);
return 1; return 1;
} }
...@@ -388,8 +388,13 @@ int _netif_send(int argc, char **argv) ...@@ -388,8 +388,13 @@ int _netif_send(int argc, char **argv)
addr_len = ng_netif_addr_from_str(addr, sizeof(addr), argv[2]); addr_len = ng_netif_addr_from_str(addr, sizeof(addr), argv[2]);
if (addr_len == 0) { if (addr_len == 0) {
puts("error: invalid address given"); if (strcmp(argv[2], "bcast") == 0) {
return 1; flags |= NG_NETIF_HDR_FLAGS_BROADCAST;
}
else {
puts("error: invalid address given");
return 1;
}
} }
/* put packet together */ /* put packet together */
...@@ -399,6 +404,7 @@ int _netif_send(int argc, char **argv) ...@@ -399,6 +404,7 @@ int _netif_send(int argc, char **argv)
nethdr = (ng_netif_hdr_t *)pkt->data; nethdr = (ng_netif_hdr_t *)pkt->data;
ng_netif_hdr_init(nethdr, 0, addr_len); ng_netif_hdr_init(nethdr, 0, addr_len);
ng_netif_hdr_set_dst_addr(nethdr, addr, addr_len); ng_netif_hdr_set_dst_addr(nethdr, addr, addr_len);
nethdr->flags = flags;
/* and send it */ /* and send it */
ng_netapi_send(dev, pkt); ng_netapi_send(dev, pkt);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment