Skip to content

Commit 02e7e0f

Browse files
maciejbaczmanskirlubos
authored andcommitted
[nrf fromtree] drivers: ieee802154: fix ACK header IE implementation
- In `set_vendor_ie_header_lm`, case when `link_metrics_data_len == 0` has been ignored. This commit fixes that by setting `header_ie->length = 0` before returning. - current implementation of enh ACK header IE returns `-ENOTSUP` when `ack_ie.header_ie == NULL` or `ack_ie.header_ie->length == 0`. This commit fixes that by refactoring checks in `nrf5_configure`. Co-authored-by: Przemyslaw Bida <[email protected]> Signed-off-by: Maciej Baczmanski <[email protected]> (cherry picked from commit d76bcd3)
1 parent 593e6c8 commit 02e7e0f

File tree

2 files changed

+24
-27
lines changed

2 files changed

+24
-27
lines changed

drivers/ieee802154/ieee802154_nrf5.c

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -899,35 +899,38 @@ static int nrf5_configure(const struct device *dev,
899899
uint8_t ext_addr_le[EXTENDED_ADDRESS_SIZE];
900900
uint8_t short_addr_le[SHORT_ADDRESS_SIZE];
901901
uint8_t element_id;
902+
bool valid_vendor_specific_ie = false;
902903

903904
if (config->ack_ie.short_addr == IEEE802154_BROADCAST_ADDRESS ||
904905
config->ack_ie.ext_addr == NULL) {
905906
return -ENOTSUP;
906907
}
907908

908-
element_id = ieee802154_header_ie_get_element_id(config->ack_ie.header_ie);
909+
sys_put_le16(config->ack_ie.short_addr, short_addr_le);
910+
sys_memcpy_swap(ext_addr_le, config->ack_ie.ext_addr, EXTENDED_ADDRESS_SIZE);
909911

910-
if (element_id != IEEE802154_HEADER_IE_ELEMENT_ID_CSL_IE &&
911-
(!IS_ENABLED(CONFIG_NET_L2_OPENTHREAD) ||
912-
element_id != IEEE802154_HEADER_IE_ELEMENT_ID_VENDOR_SPECIFIC_IE)) {
913-
return -ENOTSUP;
914-
}
912+
if (config->ack_ie.header_ie == NULL || config->ack_ie.header_ie->length == 0) {
913+
nrf_802154_ack_data_clear(short_addr_le, false, NRF_802154_ACK_DATA_IE);
914+
nrf_802154_ack_data_clear(ext_addr_le, true, NRF_802154_ACK_DATA_IE);
915+
} else {
916+
element_id = ieee802154_header_ie_get_element_id(config->ack_ie.header_ie);
915917

916918
#if defined(CONFIG_NET_L2_OPENTHREAD)
917-
uint8_t vendor_oui_le[IEEE802154_OPENTHREAD_VENDOR_OUI_LEN] =
918-
IEEE802154_OPENTHREAD_THREAD_IE_VENDOR_OUI;
919+
uint8_t vendor_oui_le[IEEE802154_OPENTHREAD_VENDOR_OUI_LEN] =
920+
IEEE802154_OPENTHREAD_THREAD_IE_VENDOR_OUI;
919921

920-
if (element_id == IEEE802154_HEADER_IE_ELEMENT_ID_VENDOR_SPECIFIC_IE &&
921-
memcmp(config->ack_ie.header_ie->content.vendor_specific.vendor_oui,
922-
vendor_oui_le, sizeof(vendor_oui_le))) {
923-
return -ENOTSUP;
924-
}
922+
if (element_id == IEEE802154_HEADER_IE_ELEMENT_ID_VENDOR_SPECIFIC_IE &&
923+
memcmp(config->ack_ie.header_ie->content.vendor_specific.vendor_oui,
924+
vendor_oui_le, sizeof(vendor_oui_le)) == 0) {
925+
valid_vendor_specific_ie = true;
926+
}
925927
#endif
926928

927-
sys_put_le16(config->ack_ie.short_addr, short_addr_le);
928-
sys_memcpy_swap(ext_addr_le, config->ack_ie.ext_addr, EXTENDED_ADDRESS_SIZE);
929+
if (element_id != IEEE802154_HEADER_IE_ELEMENT_ID_CSL_IE &&
930+
!valid_vendor_specific_ie) {
931+
return -ENOTSUP;
932+
}
929933

930-
if (config->ack_ie.header_ie && config->ack_ie.header_ie->length > 0) {
931934
nrf_802154_ack_data_set(short_addr_le, false, config->ack_ie.header_ie,
932935
config->ack_ie.header_ie->length +
933936
IEEE802154_HEADER_IE_HEADER_LENGTH,
@@ -936,9 +939,6 @@ static int nrf5_configure(const struct device *dev,
936939
config->ack_ie.header_ie->length +
937940
IEEE802154_HEADER_IE_HEADER_LENGTH,
938941
NRF_802154_ACK_DATA_IE);
939-
} else {
940-
nrf_802154_ack_data_clear(short_addr_le, false, NRF_802154_ACK_DATA_IE);
941-
nrf_802154_ack_data_clear(ext_addr_le, true, NRF_802154_ACK_DATA_IE);
942942
}
943943
} break;
944944

modules/openthread/platform/radio.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,7 +1348,7 @@ uint8_t otPlatRadioGetCslUncertainty(otInstance *aInstance)
13481348
* | IE_VENDOR_THREAD_ACK_PROBING_ID | LINK_METRIC_TOKEN | LINK_METRIC_TOKEN|
13491349
* |---------------------------------|-------------------|------------------|
13501350
*/
1351-
static uint8_t set_vendor_ie_header_lm(bool lqi, bool link_margin, bool rssi, uint8_t *ie_header)
1351+
static void set_vendor_ie_header_lm(bool lqi, bool link_margin, bool rssi, uint8_t *ie_header)
13521352
{
13531353
/* Vendor-specific IE identifier */
13541354
const uint8_t ie_vendor_id = 0x00;
@@ -1362,7 +1362,6 @@ static uint8_t set_vendor_ie_header_lm(bool lqi, bool link_margin, bool rssi, ui
13621362
const uint8_t ie_vendor_thread_margin_token = 0x02;
13631363
/* Thread Vendor-specific ACK Probing IE LQI value placeholder */
13641364
const uint8_t ie_vendor_thread_lqi_token = 0x03;
1365-
const uint8_t ie_header_size = 2;
13661365
const uint8_t oui_size = 3;
13671366
const uint8_t sub_type = 1;
13681367
const uint8_t id_offset = 7;
@@ -1380,7 +1379,8 @@ static uint8_t set_vendor_ie_header_lm(bool lqi, bool link_margin, bool rssi, ui
13801379
__ASSERT(ie_header, "Invalid argument");
13811380

13821381
if (link_metrics_data_len == 0) {
1383-
return 0;
1382+
ie_header[0] = 0;
1383+
return;
13841384
}
13851385

13861386
/* Set Element ID */
@@ -1415,8 +1415,6 @@ static uint8_t set_vendor_ie_header_lm(bool lqi, bool link_margin, bool rssi, ui
14151415
if (rssi) {
14161416
ie_header[link_metrics_idx++] = ie_vendor_thread_rssi_token;
14171417
}
1418-
1419-
return ie_header_size + content_len;
14201418
}
14211419

14221420
otError otPlatRadioConfigureEnhAckProbing(otInstance *aInstance, otLinkMetrics aLinkMetrics,
@@ -1428,13 +1426,12 @@ otError otPlatRadioConfigureEnhAckProbing(otInstance *aInstance, otLinkMetrics a
14281426
.ack_ie.ext_addr = aExtAddress->m8,
14291427
};
14301428
uint8_t header_ie_buf[OT_ACK_IE_MAX_SIZE];
1431-
uint16_t header_ie_len;
14321429
int result;
14331430

14341431
ARG_UNUSED(aInstance);
14351432

1436-
header_ie_len = set_vendor_ie_header_lm(aLinkMetrics.mLqi, aLinkMetrics.mLinkMargin,
1437-
aLinkMetrics.mRssi, header_ie_buf);
1433+
set_vendor_ie_header_lm(aLinkMetrics.mLqi, aLinkMetrics.mLinkMargin,
1434+
aLinkMetrics.mRssi, header_ie_buf);
14381435
config.ack_ie.header_ie = (struct ieee802154_header_ie *)header_ie_buf;
14391436
result = radio_api->configure(radio_dev, IEEE802154_CONFIG_ENH_ACK_HEADER_IE, &config);
14401437

0 commit comments

Comments
 (0)