From a0454b3787e96547488753b36994e8792c00827e Mon Sep 17 00:00:00 2001 From: Martine Lenders Date: Fri, 30 Sep 2016 13:06:20 +0200 Subject: [PATCH] ieee802154: remove need for IEEE802154_BCAST flag --- sys/include/net/ieee802154.h | 25 +++++--- .../netdev2/gnrc_netdev2_ieee802154.c | 16 ++--- sys/net/link_layer/ieee802154/ieee802154.c | 61 +++++++++---------- 3 files changed, 54 insertions(+), 48 deletions(-) diff --git a/sys/include/net/ieee802154.h b/sys/include/net/ieee802154.h index 14fb31663f..65f59862e7 100644 --- a/sys/include/net/ieee802154.h +++ b/sys/include/net/ieee802154.h @@ -78,12 +78,24 @@ extern "C" { /** @} */ /** - * @brief Flag for @ref ieee802154_set_frame_hdr to indicate to ignore @p dst - * and @p dst_len and send broadcast. - * @note This flag is RIOT internal and shall not be used in the FCF of - * packets send over the air + * @brief Special address defintions + * @{ */ -#define IEEE802154_BCAST (0x80) +/** + * @brief Static initializer for broadcast address + */ +#define IEEE802154_ADDR_BCAST { 0xff, 0xff } + +/** + * @brief Length in byte of @ref IEEE802154_ADDR_BCAST + */ +#define IEEE802154_ADDR_BCAST_LEN (IEEE802154_SHORT_ADDRESS_LEN) + +/** + * @brief Broadcast address + */ +extern const uint8_t ieee802154_addr_bcast[IEEE802154_ADDR_BCAST_LEN]; +/** @} */ /** * @brief Initializes an IEEE 802.15.4 MAC frame header in @p buf. @@ -121,9 +133,6 @@ extern "C" { * @ref IEEE802154_FCF_SECURITY_EN, * @ref IEEE802154_FCF_FRAME_PEND, and * @ref IEEE802154_FCF_ACK_REQ. - * Additionally the @ref IEEE802154_BCAST flag can be set - * do ignore @p dst and @p dst_len and just set `ff:ff` - * (broadcast) as destination address * @param[in] seq Sequence number for frame. * * The version field in the FCF will be set implicitly to version 1. diff --git a/sys/net/gnrc/link_layer/netdev2/gnrc_netdev2_ieee802154.c b/sys/net/gnrc/link_layer/netdev2/gnrc_netdev2_ieee802154.c index 60ac303e84..4903662e1d 100644 --- a/sys/net/gnrc/link_layer/netdev2/gnrc_netdev2_ieee802154.c +++ b/sys/net/gnrc/link_layer/netdev2/gnrc_netdev2_ieee802154.c @@ -144,9 +144,9 @@ static int _send(gnrc_netdev2_t *gnrc_netdev2, gnrc_pktsnip_t *pkt) netdev2_ieee802154_t *state = (netdev2_ieee802154_t *)gnrc_netdev2->dev; gnrc_netif_hdr_t *netif_hdr; gnrc_pktsnip_t *vec_snip; - uint8_t *src, *dst = NULL; + const uint8_t *src, *dst = NULL; int res = 0; - size_t n, src_len; + size_t n, src_len, dst_len; uint8_t mhr[IEEE802154_MAX_HDR_LEN]; uint8_t flags = (uint8_t)(state->flags & NETDEV2_IEEE802154_SEND_MASK); le_uint16_t dev_pan = byteorder_btols(byteorder_htons(state->pan)); @@ -164,10 +164,12 @@ static int _send(gnrc_netdev2_t *gnrc_netdev2, gnrc_pktsnip_t *pkt) /* prepare destination address */ if (netif_hdr->flags & /* If any of these flags is set so this is correct */ (GNRC_NETIF_HDR_FLAGS_BROADCAST | GNRC_NETIF_HDR_FLAGS_MULTICAST)) { - flags |= IEEE802154_BCAST; + dst = ieee802154_addr_bcast; + dst_len = IEEE802154_ADDR_BCAST_LEN; } else { dst = gnrc_netif_hdr_get_dst_addr(netif_hdr); + dst_len = netif_hdr->dst_l2addr_len; } src_len = netif_hdr->src_l2addr_len; if (src_len > 0) { @@ -183,9 +185,8 @@ static int _send(gnrc_netdev2_t *gnrc_netdev2, gnrc_pktsnip_t *pkt) } /* fill MAC header, seq should be set by device */ if ((res = ieee802154_set_frame_hdr(mhr, src, src_len, - dst, netif_hdr->dst_l2addr_len, - dev_pan, dev_pan, flags, - state->seq++)) == 0) { + dst, dst_len, dev_pan, + dev_pan, flags, state->seq++)) == 0) { DEBUG("_send_ieee802154: Error preperaring frame\n"); return -EINVAL; } @@ -199,7 +200,8 @@ static int _send(gnrc_netdev2_t *gnrc_netdev2, gnrc_pktsnip_t *pkt) vector[0].iov_base = mhr; vector[0].iov_len = (size_t)res; #ifdef MODULE_NETSTATS_L2 - if (flags & IEEE802154_BCAST) { + if (netif_hdr->flags & + (GNRC_NETIF_HDR_FLAGS_BROADCAST | GNRC_NETIF_HDR_FLAGS_MULTICAST)) { gnrc_netdev2->dev->stats.tx_mcast_count++; } else { diff --git a/sys/net/link_layer/ieee802154/ieee802154.c b/sys/net/link_layer/ieee802154/ieee802154.c index 6bc2bd5c44..ae687703d6 100644 --- a/sys/net/link_layer/ieee802154/ieee802154.c +++ b/sys/net/link_layer/ieee802154/ieee802154.c @@ -15,9 +15,12 @@ #include #include +#include #include "net/ieee802154.h" +const uint8_t ieee802154_addr_bcast[IEEE802154_ADDR_BCAST_LEN] = IEEE802154_ADDR_BCAST; + size_t ieee802154_set_frame_hdr(uint8_t *buf, const uint8_t *src, size_t src_len, const uint8_t *dst, size_t dst_len, le_uint16_t src_pan, le_uint16_t dst_pan, @@ -25,15 +28,12 @@ size_t ieee802154_set_frame_hdr(uint8_t *buf, const uint8_t *src, size_t src_len { int pos = 3; /* 0-1: FCS, 2: seq */ uint8_t type = (flags & IEEE802154_FCF_TYPE_MASK); - uint8_t bcast = (flags & IEEE802154_BCAST); - buf[0] = flags & (~IEEE802154_BCAST); + buf[0] = flags; buf[1] = IEEE802154_FCF_VERS_V1; if (((src_len != 0) && (src == NULL)) || - ((!bcast) && (dst_len != 0) && (dst == NULL)) || - ((flags & IEEE802154_FCF_PAN_COMP) && - (((!bcast) && (dst_len == 0)) || (src_len == 0)))) { + ((dst_len != 0) && (dst == NULL))) { return 0; } @@ -46,39 +46,34 @@ size_t ieee802154_set_frame_hdr(uint8_t *buf, const uint8_t *src, size_t src_len /* set sequence number */ buf[2] = seq; - if (bcast || (dst_len != 0)) { + if (dst_len != 0) { buf[pos++] = dst_pan.u8[0]; buf[pos++] = dst_pan.u8[1]; } /* fill in destination address */ - if (bcast) { - /* no ACK_REQ for broadcast */ - buf[0] &= ~IEEE802154_FCF_ACK_REQ; - buf[1] &= ~IEEE802154_FCF_DST_ADDR_MASK; - buf[1] |= IEEE802154_FCF_DST_ADDR_SHORT; - buf[pos++] = 0xff; - buf[pos++] = 0xff; - } - else { - switch (dst_len) { - case 0: - buf[1] |= IEEE802154_FCF_DST_ADDR_VOID; - break; - case 2: - buf[1] |= IEEE802154_FCF_DST_ADDR_SHORT; - buf[pos++] = dst[1]; - buf[pos++] = dst[0]; - break; - case 8: - buf[1] |= IEEE802154_FCF_DST_ADDR_LONG; - for (int i = 7; i >= 0; i--) { - buf[pos++] = dst[i]; - } - break; - default: - return 0; - } + switch (dst_len) { + case 0: + buf[1] |= IEEE802154_FCF_DST_ADDR_VOID; + break; + case 2: + if (memcmp(dst, ieee802154_addr_bcast, + sizeof(ieee802154_addr_bcast)) == 0) { + /* do not request ACKs for broadcast address */ + buf[0] &= ~IEEE802154_FCF_ACK_REQ; + } + buf[1] |= IEEE802154_FCF_DST_ADDR_SHORT; + buf[pos++] = dst[1]; + buf[pos++] = dst[0]; + break; + case 8: + buf[1] |= IEEE802154_FCF_DST_ADDR_LONG; + for (int i = 7; i >= 0; i--) { + buf[pos++] = dst[i]; + } + break; + default: + return 0; } /* fill in source PAN ID (if applicable) */