From 837a2727f688b3b88fd12fee48dee6a9f5826ca7 Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Thu, 12 Dec 2019 15:58:44 +0100 Subject: [PATCH 1/2] ieee802154: add definitions for 802.15.4 PHY modes This adds PHY modes for IEEE 802.15.4-2003 and IEEE 802.15.4g-2012. --- sys/include/net/ieee802154.h | 16 +++++++++++++++- sys/include/net/netopt.h | 5 +++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/sys/include/net/ieee802154.h b/sys/include/net/ieee802154.h index 19da9c5d6424..00603381f0eb 100644 --- a/sys/include/net/ieee802154.h +++ b/sys/include/net/ieee802154.h @@ -94,7 +94,21 @@ extern "C" { #define IEEE802154_CHANNEL_MAX (26U) /**< Maximum channel for 2.4 GHz band */ /** @} */ -#define IEEE802154_FRAME_LEN_MAX (127U) /**< maximum frame length */ +#define IEEE802154_FRAME_LEN_MAX (127U) /**< maximum 802.15.4 frame length */ +#define IEEE802154G_FRAME_LEN_MAX (2047U) /**< maximum 802.15.4g-2012 frame length */ + +/** + * @brief 802.15.4 PHY modes + */ +enum { + IEEE802154_PHY_DISABLED, /**< PHY disabled, no mode selected */ + IEEE802154_PHY_BPSK, /**< Binary Phase Shift Keying */ + IEEE802154_PHY_ASK, /**< Amplitude-Shift Keying */ + IEEE802154_PHY_OQPSK, /**< Offset Quadrature Phase-Shift Keying */ + IEEE802154_PHY_MR_OQPSK, /**< Multi-Rate Offset Quadrature Phase-Shift Keying */ + IEEE802154_PHY_MR_OFDM, /**< Multi-Rate Orthogonal Frequency-Division Multiplexing */ + IEEE802154_PHY_MR_FSK /**< Multi-Rate Frequency Shift Keying */ +}; /** * @brief Special address definitions diff --git a/sys/include/net/netopt.h b/sys/include/net/netopt.h index b1739646c32d..1c3bced33151 100644 --- a/sys/include/net/netopt.h +++ b/sys/include/net/netopt.h @@ -651,6 +651,11 @@ typedef enum { */ NETOPT_LORAWAN_MIN_RX_SYMBOL, + /** + * @brief (uint8_t) 802.15.4 PHY mode + */ + NETOPT_IEEE802154_PHY, + /** * @brief (uint8_t*) phy layer syncword */ From 2f271f8a3b0dc1334c7507995a520e237ef5a206 Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Thu, 12 Dec 2019 16:02:09 +0100 Subject: [PATCH 2/2] drivers/netdev_ieee802154: return PDU based on PHY mode IEEE 802.15.4g-2012 specifies a PDU of 2047 for it's PHY modes, so query the driver for the mode before returning the PDU. --- drivers/netdev_ieee802154/netdev_ieee802154.c | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/netdev_ieee802154/netdev_ieee802154.c b/drivers/netdev_ieee802154/netdev_ieee802154.c index 623604f39027..926d6ca3c3bb 100644 --- a/drivers/netdev_ieee802154/netdev_ieee802154.c +++ b/drivers/netdev_ieee802154/netdev_ieee802154.c @@ -71,6 +71,25 @@ void netdev_ieee802154_reset(netdev_ieee802154_t *dev) dev->netdev.driver->set(&dev->netdev, NETOPT_NID, &dev->pan, sizeof(dev->pan)); } +static inline uint16_t _get_ieee802154_pdu(netdev_ieee802154_t *dev) +{ + uint8_t type; + int res = dev->netdev.driver->get(&dev->netdev, NETOPT_IEEE802154_PHY, &type, sizeof(type)); + + if (res < 0) { + return IEEE802154_FRAME_LEN_MAX; + } + + switch (type) { + case IEEE802154_PHY_MR_OQPSK: + case IEEE802154_PHY_MR_OFDM: + case IEEE802154_PHY_MR_FSK: + return IEEE802154G_FRAME_LEN_MAX; + default: + return IEEE802154_FRAME_LEN_MAX; + } +} + int netdev_ieee802154_get(netdev_ieee802154_t *dev, netopt_t opt, void *value, size_t max_len) { @@ -152,9 +171,10 @@ int netdev_ieee802154_get(netdev_ieee802154_t *dev, netopt_t opt, void *value, #endif case NETOPT_MAX_PDU_SIZE: assert(max_len >= sizeof(int16_t)); - *((uint16_t *)value) = (IEEE802154_FRAME_LEN_MAX - - IEEE802154_MAX_HDR_LEN) - - IEEE802154_FCS_LEN; + + *((uint16_t *)value) = (_get_ieee802154_pdu(dev) + - IEEE802154_MAX_HDR_LEN) + - IEEE802154_FCS_LEN; res = sizeof(uint16_t); break; default: