From cfc2feca1de5a07a59773e2cdd2872510766a010 Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Thu, 12 Dec 2019 16:02:09 +0100 Subject: [PATCH] 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. If none of the new modes is used, don't query the driver to not incure a penalty on existing platforms. --- drivers/netdev_ieee802154/netdev_ieee802154.c | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/drivers/netdev_ieee802154/netdev_ieee802154.c b/drivers/netdev_ieee802154/netdev_ieee802154.c index 4a168d876c..3a973a1a6c 100644 --- a/drivers/netdev_ieee802154/netdev_ieee802154.c +++ b/drivers/netdev_ieee802154/netdev_ieee802154.c @@ -71,6 +71,36 @@ 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) +{ +#if defined(MODULE_NETDEV_IEEE802154_MR_OQPSK) || \ + defined(MODULE_NETDEV_IEEE802154_MR_OFDM) || \ + defined(MODULE_NETDEV_IEEE802154_MR_FSK) + uint8_t type = IEEE802154_PHY_DISABLED; + dev->netdev.driver->get(&dev->netdev, NETOPT_IEEE802154_PHY, &type, sizeof(type)); +#else + (void) dev; +#endif + +#ifdef MODULE_NETDEV_IEEE802154_MR_OQPSK + if (type == IEEE802154_PHY_MR_OQPSK) { + return IEEE802154G_FRAME_LEN_MAX; + } +#endif +#ifdef MODULE_NETDEV_IEEE802154_MR_OFDM + if (type == IEEE802154_PHY_MR_OFDM) { + return IEEE802154G_FRAME_LEN_MAX; + } +#endif +#ifdef MODULE_NETDEV_IEEE802154_MR_FSK + if (type == IEEE802154_PHY_MR_FSK) { + return IEEE802154G_FRAME_LEN_MAX; + } +#endif + + return IEEE802154_FRAME_LEN_MAX; +} + int netdev_ieee802154_get(netdev_ieee802154_t *dev, netopt_t opt, void *value, size_t max_len) { @@ -152,9 +182,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: