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.
This commit is contained in:
Benjamin Valentin 2019-12-12 16:02:09 +01:00 committed by Benjamin Valentin
parent c77119957f
commit cfc2feca1d

View File

@ -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)); 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, int netdev_ieee802154_get(netdev_ieee802154_t *dev, netopt_t opt, void *value,
size_t max_len) size_t max_len)
{ {
@ -152,9 +182,10 @@ int netdev_ieee802154_get(netdev_ieee802154_t *dev, netopt_t opt, void *value,
#endif #endif
case NETOPT_MAX_PDU_SIZE: case NETOPT_MAX_PDU_SIZE:
assert(max_len >= sizeof(int16_t)); assert(max_len >= sizeof(int16_t));
*((uint16_t *)value) = (IEEE802154_FRAME_LEN_MAX -
IEEE802154_MAX_HDR_LEN) - *((uint16_t *)value) = (_get_ieee802154_pdu(dev)
IEEE802154_FCS_LEN; - IEEE802154_MAX_HDR_LEN)
- IEEE802154_FCS_LEN;
res = sizeof(uint16_t); res = sizeof(uint16_t);
break; break;
default: default: