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: 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 */