From 845cffad040fdfff39fccb1ef9ee81555618847c Mon Sep 17 00:00:00 2001 From: Simon Piriou Date: Wed, 19 Nov 2025 19:37:43 +0100 Subject: [PATCH] net: l2: ieee802154: add support for MLME coordinator address There are two ways in the current implementation to join a network, either with an association request or a via MLME-SET(macShortAddress) to rejoin a previously associated network. The coordinator address needs to be valid in the rejoin case. It can be lost, for example if the device power cycles. This commit fixes that gap with new MLME GET/SET for: - macCoordShortAddress - macCoordExtendedAddress Signed-off-by: Simon Piriou --- include/zephyr/net/ieee802154_mgmt.h | 28 ++++++++++++++++++++++ subsys/net/l2/ieee802154/ieee802154_mgmt.c | 26 ++++++++++++++++++-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/include/zephyr/net/ieee802154_mgmt.h b/include/zephyr/net/ieee802154_mgmt.h index 970f8a89a9c66..307456246cd99 100644 --- a/include/zephyr/net/ieee802154_mgmt.h +++ b/include/zephyr/net/ieee802154_mgmt.h @@ -72,6 +72,10 @@ enum net_request_ieee802154_cmd { NET_REQUEST_IEEE802154_CMD_SET_TX_POWER, NET_REQUEST_IEEE802154_CMD_SET_SECURITY_SETTINGS, NET_REQUEST_IEEE802154_CMD_GET_SECURITY_SETTINGS, + NET_REQUEST_IEEE802154_CMD_SET_COORD_EXT_ADDR, + NET_REQUEST_IEEE802154_CMD_GET_COORD_EXT_ADDR, + NET_REQUEST_IEEE802154_CMD_SET_COORD_SHORT_ADDR, + NET_REQUEST_IEEE802154_CMD_GET_COORD_SHORT_ADDR, }; /** @@ -207,6 +211,30 @@ NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_SHORT_ADDR); NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_IEEE802154_GET_SHORT_ADDR); +/** MLME-SET(macCoordShortAddress) request */ +#define NET_REQUEST_IEEE802154_SET_COORD_SHORT_ADDR \ + (NET_IEEE802154_BASE | NET_REQUEST_IEEE802154_CMD_SET_COORD_SHORT_ADDR) + +NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_COORD_SHORT_ADDR); + +/** MLME-GET(macCoordShortAddress) request */ +#define NET_REQUEST_IEEE802154_GET_COORD_SHORT_ADDR \ + (NET_IEEE802154_BASE | NET_REQUEST_IEEE802154_CMD_GET_COORD_SHORT_ADDR) + +NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_IEEE802154_GET_COORD_SHORT_ADDR); + +/** MLME-SET(macCoordExtendedAddress) request */ +#define NET_REQUEST_IEEE802154_SET_COORD_EXT_ADDR \ + (NET_IEEE802154_BASE | NET_REQUEST_IEEE802154_CMD_SET_COORD_EXT_ADDR) + +NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_COORD_EXT_ADDR); + +/** MLME-GET(macCoordExtendedAddress) request */ +#define NET_REQUEST_IEEE802154_GET_COORD_EXT_ADDR \ + (NET_IEEE802154_BASE | NET_REQUEST_IEEE802154_CMD_GET_COORD_EXT_ADDR) + +NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_IEEE802154_GET_COORD_EXT_ADDR); + /** * MLME-SET(phyUnicastTxPower/phyBroadcastTxPower) request (currently * not distinguished) diff --git a/subsys/net/l2/ieee802154/ieee802154_mgmt.c b/subsys/net/l2/ieee802154/ieee802154_mgmt.c index cfd8cae625044..8ecc8653f6b1e 100644 --- a/subsys/net/l2/ieee802154/ieee802154_mgmt.c +++ b/subsys/net/l2/ieee802154/ieee802154_mgmt.c @@ -747,7 +747,8 @@ static int ieee802154_set_parameters(uint64_t mgmt_request, return -EINVAL; } - if (mgmt_request == NET_REQUEST_IEEE802154_SET_EXT_ADDR) { + if ((mgmt_request == NET_REQUEST_IEEE802154_SET_EXT_ADDR) || + (mgmt_request == NET_REQUEST_IEEE802154_SET_COORD_EXT_ADDR)) { if (len != IEEE802154_EXT_ADDR_LENGTH) { return -EINVAL; } @@ -791,6 +792,10 @@ static int ieee802154_set_parameters(uint64_t mgmt_request, ctx->pan_id = value; ieee802154_radio_filter_pan_id(iface, ctx->pan_id); } + } else if (mgmt_request == NET_REQUEST_IEEE802154_SET_COORD_EXT_ADDR) { + sys_memcpy_swap(ctx->coord_ext_addr, data, IEEE802154_EXT_ADDR_LENGTH); + } else if (mgmt_request == NET_REQUEST_IEEE802154_SET_COORD_SHORT_ADDR) { + ctx->coord_short_addr = value; } else if (mgmt_request == NET_REQUEST_IEEE802154_SET_EXT_ADDR) { uint8_t ext_addr_le[IEEE802154_EXT_ADDR_LENGTH]; @@ -853,6 +858,12 @@ NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_SHORT_ADDR, NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_TX_POWER, ieee802154_set_parameters); +NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_COORD_EXT_ADDR, + ieee802154_set_parameters); + +NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_COORD_SHORT_ADDR, + ieee802154_set_parameters); + static int ieee802154_get_parameters(uint64_t mgmt_request, struct net_if *iface, void *data, size_t len) @@ -865,7 +876,8 @@ static int ieee802154_get_parameters(uint64_t mgmt_request, return -EINVAL; } - if (mgmt_request == NET_REQUEST_IEEE802154_GET_EXT_ADDR) { + if (mgmt_request == NET_REQUEST_IEEE802154_GET_EXT_ADDR || + mgmt_request == NET_REQUEST_IEEE802154_GET_COORD_EXT_ADDR) { if (len != IEEE802154_EXT_ADDR_LENGTH) { NET_ERR("Could not get parameter: invalid extended address length"); return -EINVAL; @@ -889,6 +901,10 @@ static int ieee802154_get_parameters(uint64_t mgmt_request, sys_memcpy_swap(data, ctx->ext_addr, IEEE802154_EXT_ADDR_LENGTH); } else if (mgmt_request == NET_REQUEST_IEEE802154_GET_SHORT_ADDR) { *value = ctx->short_addr; + } else if (mgmt_request == NET_REQUEST_IEEE802154_GET_COORD_EXT_ADDR) { + sys_memcpy_swap(data, ctx->coord_ext_addr, IEEE802154_EXT_ADDR_LENGTH); + } else if (mgmt_request == NET_REQUEST_IEEE802154_GET_COORD_SHORT_ADDR) { + *value = ctx->coord_short_addr; } else if (mgmt_request == NET_REQUEST_IEEE802154_GET_TX_POWER) { int16_t *s_value = (int16_t *)data; @@ -911,6 +927,12 @@ NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_GET_EXT_ADDR, NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_GET_SHORT_ADDR, ieee802154_get_parameters); +NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_GET_COORD_EXT_ADDR, + ieee802154_get_parameters); + +NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_GET_COORD_SHORT_ADDR, + ieee802154_get_parameters); + NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_GET_TX_POWER, ieee802154_get_parameters);