diff --git a/include/nuttx/wireless/ieee802154/ieee802154_device.h b/include/nuttx/wireless/ieee802154/ieee802154_device.h index 3edf202a020..acbf8fe2e61 100644 --- a/include/nuttx/wireless/ieee802154/ieee802154_device.h +++ b/include/nuttx/wireless/ieee802154/ieee802154_device.h @@ -67,7 +67,14 @@ struct mac802154dev_rxframe_s { struct ieee802154_data_ind_s meta; uint8_t payload[IEEE802154_MAX_PHY_PACKET_SIZE]; - uint16_t length; + uint8_t length; + + /* In promiscous mode, the entire frame is passed to the application inside + * the payload field. The offset field is used to specify the start of the + * actual payload, skipping the 802.15.4 header. + */ + + uint8_t offset; }; #endif /* CONFIG_WIRELESS_IEEE802154 */ diff --git a/wireless/ieee802154/mac802154_device.c b/wireless/ieee802154/mac802154_device.c index dd3bd769e4a..3ab60e4a08f 100644 --- a/wireless/ieee802154/mac802154_device.c +++ b/wireless/ieee802154/mac802154_device.c @@ -468,16 +468,18 @@ static ssize_t mac802154dev_read(FAR struct file *filep, FAR char *buffer, if (ret == 0 && req.attrval.mac.promisc_mode) { rx->length = ind->frame->io_len + 2; + rx->offset = ind->frame->io_offset; - /* Copy the data from the IOB to the user supplied struct */ + /* Copy the entire frame from the IOB to the user supplied struct */ memcpy(&rx->payload[0], &ind->frame->io_data[0], rx->length); } else { rx->length = (ind->frame->io_len - ind->frame->io_offset); + rx->offset = 0; - /* Copy the data from the IOB to the user supplied struct */ + /* Copy just the payload from the IOB to the user supplied struct */ memcpy(&rx->payload[0], &ind->frame->io_data[ind->frame->io_offset], rx->length); diff --git a/wireless/ieee802154/mac802154_getset.c b/wireless/ieee802154/mac802154_getset.c index 25f9a7068af..5d836842750 100644 --- a/wireless/ieee802154/mac802154_getset.c +++ b/wireless/ieee802154/mac802154_getset.c @@ -123,7 +123,13 @@ int mac802154_req_get(MACHANDLE mac, enum ieee802154_attr_e attr, { attrval->mac.resp_waittime = priv->resp_waittime; } - break;; + break; + + case IEEE802154_ATTR_MAC_PROMISCUOUS_MODE: + { + attrval->mac.promisc_mode = priv->promisc; + } + break; default: {