Zigbee SDK Version 9.0 - Release Notes (Jan 22, 2026)#

Zigbee Version 9.0

Simplicity SDK Version 2025.12.0

Silicon Labs is the vendor of choice for OEMs developing Zigbee networking into their products. The Silicon Labs Zigbee platform is the most integrated, complete, and feature-rich Zigbee solution available.

Silicon Labs EmberZNet SDK contains Silicon Labs’ implementation of the Zigbee stack specification.

Click here for earlier releases.

Release Summary#

Key Features | API Changes | Bug Fixes | Chip Enablement

Key Features#

  • Zigbee 4.0 compliance with BDB 3.1 and R23 support.

  • Dynamic switching of Zigbee node type between router and sleepy end device.

  • Inter-PAN messages filtering update.

  • Software support for new Series 3 boards.

API Changes#

See Modified APIs.

Bug Fixes#

See Bug Fixes.

Chip Enablement#

SW support for two new boards: QFN40 5x5 Explorer Kit (BRD2719) and a Pro Kit consisting of a BRD4407A Radio Board (with 4 MB flash) packaged with a WPK. The IC OPN is SiMG301M104LIL for both products.

Key Features#

New Features | Enhancements | Removed Features | Deprecated Features

New Features#

Zigbee 4.0 compliance with BDB 3.1 and R23 support#

  • This release is Zigbee 4.0 certification-ready, with BDB 3.1 and R23 features incorporated.

  • BDB 3.1 builds upon and consumes the features of the revision 23 Zigbee PRO Core stack, which includes, but is not limited to, Dynamic Link Key (DLK) exchange, network commissioning with optional device interview, APS frame counter synchronization, and trust center swap out.

  • BDB 3.1 support also brings in support for a rejoining algorithm for network recovery when TC connectivity is lost. The new BDB 3.1 Rejoin Algorithm component handles trust center connectivity loss and implements the BDB 3.1 rejoin algorithm to rejoin the network when needed. This component is only necessary for Zigbee 4.0 joining devices, such as routers and end devices.

  • A new BDB 3.1 Trust Center Extension component has been added to perform necessary Zigbee 4.0 behavior for trust centers. This component handles auto-discovery of devices that join the network. The component will send binding requests to any end devices that support the Poll Control cluster, as mandated by the BDB specifications. This component is only necessary for Zigbee 4.0 trust centers or coordinators.

  • Two new sample applications are provided to showcase this functionality. The Zigbee - Z4Light application is a dual role coordinator/router application that can either act as trust center to form a Zigbee 4.0 network, or it can act as a Zigbee 4.0 router joining device. The new Zigbee - Z4Switch application acts as receiver-on-when-idle end device that can join a Zigbee 4.0 network. Both of these applications consume the previously mentioned components which provide new Zigbee 4.0 functionality. Users are reminded that these sample applications are examples of showcasing features and that users should extend, test, and validate final applications for conformance to the standards.

  • Zigbee 4.0 applications built using the Silicon Labs SDK automatically perform the Dynamic Link Key (DLK) procedure when joining. There are a number of new public APIs and callbacks that relate to the R23 joining flow of devices, which can be found in sl_zigbee_dlk_negotiation.h sl_zigbee_zdo_dlk_negotiation.h, sl_zigbee_dynamic_commissioning.h, and others.

  • sl_zigbee_dynamic_commissioning.h, for example, exposes callbacks to alert the user application for when a joining device completes DLK and is sent the network key. A public API is available to control whether the device interview step should be conducted or skipped when devices try to join the network.

Dynamic switching of Zigbee node type between router and sleepy end device#

  • This features allows an image to dynamically switch between a router and a sleepy end device at runtime.

  • There are two APIs provided to have a router transition to a sleepy end device and vice-versa. Once transitioned, the device will issue a network rejoin followed by a Device Announce to alert the network of the role change.

  • This feature is not to be confused with the multi-network feature, whereby an image can be configured with two device types operating on different networks (for that, see AN724).

Update Filtering of inter-PAN Messages#

  • Updated filtering of inter-PAN message to support multiple filters matching regardless of whether ZLL or custom filters match. The matched filter value will be passed up to the application using sli_802154_stack_filter_match_message_handler().

  • Previously, if a filter matched the stack-specified Zigbee Light Link (ZLL) or Green Power (GP) filter, the stack would consume the packet. With this update, the user application may configure a filter that is equivalent to the ZLL or GP filter and the user application will be alerted when a packet that matches the filter is received.

Software support for new Series 3 boards#

QFN40 5x5 Explorer Kit (BRD2719) and a Pro Kit consisting of a BRD4407A Radio Board (with 4 MB flash) packaged with a WPK.

Enhancements#

Code quality enhancements include reduced compiler warnings in all Zigbee sample aplications for various configurations.

Removed Features#

None.

Deprecated Features#

Deprecated Feature

Planned Removal Date

The Zigbee Classic Key Storage component will be removed in a future release. This component handles storing encryption keys in plaintext NVM3 tokens. Future versions of software will instead use the Zigbee Secure Key Storage component, where keys are stored in PSA storage. See AN1311 for more information on PSA storage. Users will note that there already exists a Zigbee Secure Key Storage Upgrade component to move keys from classic key storage (NVM3 tokens) to secure key storage (PSA).

June 2026

API Changes#

New APIs | Modified APIs | Removed APIs | Deprecated APIs

New APIs#

New API Signature

Deprecated API replaced by this (if any)

void sl_zigbee_af_bdb_3dot1_enable_rejoin_algorithm(bool enable)

sl_status_t sl_zigbee_af_switch_role_router(void)

sl_status_t sl_zigbee_af_switch_role_sleepy_end_device(void)

Modified APIs#

None.

Removed APIs#

None.

Deprecated APIs#

None.

Bug Fixes#

ID Issue Description GitHub / Salesforce Reference (if any) Affected Software Variants, Hardware, Modes, Host Interfaces
1564136 An issue has been fixed where the key establishment handler was not invoked with status=SL_ZIGBEE_TC_REQUESTER_VERIFY_KEY_SUCCESS when a device performed an on-network Trust Center Link Key update. None All variants
1564130 The default for Device Database configuration item, SL_ZIGBEE_AF_MAX_CLUSTERS_PER_ENDPOINT, has been changed from 10 to 15. None All variants
1564130 The Device Query Service component now probes RX-off-when-idle devices when they are discovered on the network. Previously, the component would skip these sleepy devices. The new configuration item SL_ZIGBEE_AF_PLUGIN_DEVICE_QUERY_SERVICE_IGNORE_RX_OFF_WHEN_IDLE_DEVICES has been introduced to control this behavior, whose default value is false. None All variants
1564130 The APIs sl_zigbee_af_device_database_add and sl_zigbee_af_device_database_add_device_with_all_info have been changed to return a sl_status_t from a structure pointer in order to better indicate reasons for failure. None All variants
1564130 A sl_zigbee_key_status_t value has been added, SL_ZIGBEE_TC_AUTHENTICATION_TOKEN_ESTABLISHED. When the key establishment handler is invoked on the Trust Center with this status, it indicates that a non-trust center node has retrieved an authentication token. None All variants
1556156 The APIs sl_zigbee_set_token_data() and sl_zigbee_get_token() have been fixed to work with counter-type tokens for applications utilizing the Common Token Manager component None All variants
1519392 Certain applications seeing a duplicate definition of MILLISECOND_TICKS_PER_SECOND have been fixed None All variants
1519440 Fixed an issue whereby a legacy token header file was not wrapped by an ifdef check for SL_CATALOG_TOKEN_MANAGER_PRESENT None All variants
1517385 Fixed an issue whereby the second RAIL handle in the ncp-uart-hw-gp-multi-rail application failed to send a pre-configured outgoing GPDF in response to an incoming bidirectional GPDF with its rx-after-tx bit set None All variants
1512285 Fixed an issue whereby multi-PAN applications using a custom security network type (SLI_ZIGBEE_NETWORK_SECURITY_TYPE_CUSTOM) failed to have devices join this custom security network None All variants
1510195 Fixed an issue whereby Zigbee UART NCP applications using FreeRTOS would hang or not work None All variants
1509825 Document UG600 has been fixed. The routine setConfigurationValue returns a sl_status_t status, but prior versions had the return as an ezsp status None All variants
1503319 Fixed an issue whereby the Zigbee - NCP ncp-spi application would not build for parts that lacked SPI functionality None All variants
1502013 The APIs sl_zigbee_get_token_info, sl_zigbee_get_token_data, and sl_zigbee_set_token_data have had their declarations moved from stack-info.h to sl_zigbee_token.h None All variants
1502013 The zigbee_token_interface component now requires the common_token_manager component to be present None All variants
1502013 The file format for the Trust Center Backup token file has been changed to accommodate integration with the Common Token Manager component. Users should not expect older token files to work with newer versions of the SDK. NOTE: the Trust Center backup and swapout feature, as used in conjunction with the Zigbee Token Interface component, does not support swapping in a Trust Center that is running a newer version of the SDK firmware. Users must ensure that the swap out process results in a new Trust Center that is running the same software version. The TC's firmware may be upgraded post-swap out None All variants
1502013 The size field of sl_zigbee_token_info_t has been updated from uint8_t to uint32_t to accommodate integration with the Common Token Manager component None All variants
1495635 Fixed an incorrect messageTag data type in the sendUnicast and sendBroadcast EZSP documentation None All variants
1494526 Fixed an issue where the API sl_zigbee_token_factory_reset would fail to delete all security keys in storage. The offset of ZB_PSA_KEY_ID_GP_PROXY_TABLE_END and ZB_PSA_KEY_ID_GP_SINK_TABLE_END were incorrect, and thus would fail to have all their (Green Power) keys deleted after the API had been called None All variants
1487643 Fixed an issue whereby several applications, such as Zigbee GP - Z3LightCombo, Zigbee - GPD Sensor, Zigbee - Z3Light, Zigbee - Z3Switch, and Zigbee - NCP MpNcpSpi, would fail to either generate or build due to invalid pin configurations or an out-of-RAM issue when building for certain parts. Invalid pin configurations included building on parts that had one pin out for both LED and buttons, for instance None All variants
1484473 Fixed an issue where the broadcast originator fails to send broadcast messages when using an alias ID rather than its own node ID as the broadcast source ID None All variants
1481868 The End Device Support component is now enforced when a user creates an end device or sleepy end device application. This component was always required, but has always been enabled at the project level None All variants
1474962 Fixed an issue where the stack was incorrectly updating the local nwkUpdateId when receving a Mgmt_NWK_Update_req with the ScanDuration set to 0xFF None All variants
1468883 Fixed an issue whereby a router would not rejoin its original network first if a second network with the same extended PAN ID appeared. A separate issue was fixed where a router would correctly return back to its existing network parameters if it failed to join a different PAN None All variants
1467032 An issue has been fixed in the Green Power Client component whereby the GP Proxy table size (gpProxyTableSize) was set to an invalid size None All variants
1464564 The Network Steering default primary scan channel mask has been changed from 0x0318C800 to 0x02108800 in order to align with the suggested default in the Base Device Behavior specification. Users remain the have the option to override this value as desired None All variants
1464196 The SL_ZIGBEE_AF_PLUGIN_NETWORK_STEERING_ENABLE_AUTOSTART configuration default has been updated from true to false. This configuration item has also been updated to stop zigbee_z3_light from automatically forming a distributed network upon network-steering failing to find any suitable networks None All variants
1459106 Fixed an issue where the APS Duplicate Rejection feature did not work properly None All variants
1455879 Fixed an intermittent failure when running GP Commissioning where the transmit channel is the same as operational channel None All variants

Chip Enablement#

Chip Family OPNs / Boards / OPN Combinations Supported Software Variants (if applicable) Supported Modes Supported Host Interfaces
SiMG301 SiMG301M104LIL based QFN40 5x5 Explorer Kit (BRD2719) and a Pro Kit consisting of a BRD4407A Radio Board (with 4 MB flash) N/A
  • SoC
  • NCP
UART

Application Example Changes#

New Examples | Modified Examples | Removed Examples | Deprecated Examples

New Examples#

Example Name Description Supported Software Variants (if applicable) Supported Modes Supported OPNs / Boards / OPN Combinations Supported Host Interfaces

Zigbee - Z4Light (zigbee_z4_light.slcp).

See readme here

A Zigbee 4.0 coordinator/router demonstrating R23 and BDB 3.1 features All variants SoC All parts N/A

Zigbee - Z4Switch (zigbee_z4_switch.slcp).

See readme here

A Zigbee 4.0 end device demonstrating R23 and BDB 3.1 features All variants SoC All parts N/A

Modified Examples#

None.

Removed Examples#

None.

Deprecated Examples#

None.

Known Issues and Limitations#

ID Issue or Limitation Description GitHub / Salesforce Reference (if any) Workaround (if any) Affected Software Variants, Hardware, Modes, Host Interfaces
1503910 For Series 3 parts, the boot time is inconsistent because of the NVM3 repack invoked during initialization. To optimize application performance, it is recommended for users to implement user NVM3 repacks periodically during application downtime. None Please refer to the NVM3 documentation regarding implementing the user triggered repack function. A code example to call the user repack is provided below this table. Series 3
1507499 Applications utilizing direct SPI access (that is, without the use of CPC) are currently not working for series 3 hardware. This includes the "Zigbee - NCP ncp-spi" and "Zigbee - NCP MpNcpSpi" applications, as well as any application that brings in the "NCP SPI" component. Generations of such applications will fail, indicating unmet dependencies or incompatible dependencies. None None Series 3 NCP
1446942 sl_zigbee_af_get_command_aps_frame() is currently not thread safe. Users may notice that subsequent calls to any of the sl_zigbee_af_send_command_* APIs result in incorrect APS frames being transmitted. This issue will be fixed in a future release. None None All variants
1477680 The following two issues are present for the Sleepy to Sleepy applications
  1. Default zigbee_ble_sleepy_to_sleepy sample apps do not build on sisdk-2025.6 and future when the Window Covering cluster is included in ZAP configuration for MG21 and MG24.
  2. Building an application for MG27 using the suggested workaround for issue 1 does not work as expected.
None
  • Workaround issue 1: remove the Window Covering cluster
  • No workaround currently available for issue 2
Zigbee BLE Sleepy To Sleepy Apps
1479979 The zigbee daemon (zigbeed) has an issue where it exits spontaneously when installed using 32-bit Debian packages. None Users may use the Docker-based zigbeed to circumvent the issue until a fix is provided in a future SDK release Zigbeed CMP
1571691 An issue is present where a device can fail to join a large network (>30 devices) if the coordinator is using the Zigbee Secure Key Storage component, which is enabled by default. The problem is seen when the joining device associates successfully, but the update of the trust center link key fails, which results in the joining device leaving the network. When this issue occurs, all APS link keys on the trust center are seemingly wiped, including those found in the link key table and transient key table, as can be seen in the output to the command "keys print." With all APS keys temporarily wiped, encrypted APS communications with the trust center fail. None Set the SL_PSA_KEY_USER_SLOT_COUNT configuration item to the maximum number of devices in the network when configuring the coordinator image (SoC or NCP). If using Simplicity Studio, the configuration is found under the PSA Configuration component. Note: trust centers using the Zigbee Classic Key Storage component are unaffected by this issue and thus require no workaround, which includes zigbeed, or the Zigbee Daemon. SoC and NCP trust centers using the Zigbee Secure Key Storage component
1571186 An issue is present whereby an event that is armed in interrupt context does not fire when expected None As a workaround, users may issue a call to sl_zigbee_wakeup_common_task() after arming the event to get the event to fire on time All variants

Code example for Known Issue 1503910:

 // Set the user repack threshold
                static uint32_t user_repack_threshold = 1024;
                /***************************************************************************//**
                * Perform a user-triggered repack with a configurable threshold.
                *
                * This function sets the number of bytes (threshold) that must remain free
                * before a forced repack is triggered. It performs repack operations until
                * the threshold is satisfied or no further memory can be freed.
                ******************************************************************************/
                void nvm3_repack_with_threshold(void)
                {
                  sl_status_t sta;
                  nvm3_MemInfo_t memInfo;
                  size_t initMemInfo;  // Get available memory
                  if (nvm3_getMemInfo(nvm3_defaultHandle, &memInfo) != SL_STATUS_OK) {
                    printf("Get memory info failed at startup\r\n");
                    return;
                  }  // Set the repack headroom to user threshold
                  nvm3_defaultInit->repackHeadroom = user_repack_threshold;
                  sta = nvm3_open(nvm3_defaultHandle, nvm3_defaultInit);
                  if (sta != SL_STATUS_OK) {
                    printf("NVM3 re-open with increased headroom failed: %lu\r\n", sta);
                    return;
                  }
                  initMemInfo = memInfo.availableMemory;
                  int repack =0;
                  while (user_repack_threshold > memInfo.availableMemory) {
                    repack++;
                    sta = nvm3_repack(nvm3_defaultHandle);
                    if (sta != SL_STATUS_OK) {
                      printf("ERROR: NVM3 repack failed! Status: %lu\r\n", sta);
                      EFM_ASSERT(sta == SL_STATUS_OK);
                      break;
                    }
                    nvm3_getMemInfo(nvm3_defaultHandle, &memInfo);
                  }
                  return;
                }