components/esp_matter: add CustomNetworkConfig support

Skip the Network Commissioning cluster on the root node when
CONFIG_CUSTOM_NETWORK_CONFIG is enabled, per Matter spec condition
(!CustomNetworkConfig). This allows devices with out-of-band network
configuration (rich UI, manufacturer-specific means) to omit the
cluster as the spec permits.

- Add CONFIG_CUSTOM_NETWORK_CONFIG Kconfig option
- Conditionally skip network_commissioning in root_node config/add
- Exclude integration.cpp from build when custom config enabled
- Add weak stubs for Plugin callbacks as fallback
- Also guarded secondary network device type and all the
  attributes and commands that are part of network commissioning
  cluster
This commit is contained in:
Shubham Patil
2026-04-08 14:57:03 +05:30
parent 11da6ed9b1
commit 6e999033d4
11 changed files with 59 additions and 1 deletions
+3
View File
@@ -0,0 +1,3 @@
[codespell]
ignore-regex = _
ignore-words-list = ot, bootup, requestor, pase, lits, kNo, currenty, rsource, CurrentY
+11 -1
View File
@@ -18,7 +18,7 @@ menu "ESP Matter"
string "ESP Matter NVS partition name" string "ESP Matter NVS partition name"
default "nvs" default "nvs"
help help
The NVS Partition name for ESP Matter to store the NONVOLATILE attribues The NVS Partition name for ESP Matter to store the NONVOLATILE attributes
config ESP_MATTER_DEFERRED_ATTR_PERSISTENCE_TIME_MS config ESP_MATTER_DEFERRED_ATTR_PERSISTENCE_TIME_MS
int "ESP Matter deferred attribute persistence time (ms)" int "ESP Matter deferred attribute persistence time (ms)"
@@ -238,6 +238,16 @@ menu "ESP Matter"
Disable this option to initialize Thread stack and start Thread task with more Disable this option to initialize Thread stack and start Thread task with more
flexibility. flexibility.
config CUSTOM_NETWORK_CONFIG
bool "Use custom network commissioning (skip Network Commissioning cluster)"
default n
help
Enable this if the device uses out-of-band-configured networking
(e.g. rich user interface, manufacturer-specific means, custom
commissioning flows). When enabled, the Network Commissioning
cluster will NOT be added to the root node endpoint, per the
Matter spec CustomNetworkConfig condition.
menu "Select Supported Matter Clusters" menu "Select Supported Matter Clusters"
visible if ESP_MATTER_ENABLE_DATA_MODEL visible if ESP_MATTER_ENABLE_DATA_MODEL
@@ -412,6 +412,7 @@ attribute_t *create_tc_update_deadline(cluster_t *cluster, nullable<uint32_t> va
} /* attribute */ } /* attribute */
} /* general_commissioning */ } /* general_commissioning */
#ifndef CONFIG_CUSTOM_NETWORK_CONFIG
namespace network_commissioning { namespace network_commissioning {
namespace attribute { namespace attribute {
@@ -483,6 +484,7 @@ attribute_t *create_thread_version(cluster_t *cluster, uint16_t value)
} /* attribute */ } /* attribute */
} /* network_commissioning */ } /* network_commissioning */
#endif // CONFIG_CUSTOM_NETWORK_CONFIG
namespace general_diagnostics { namespace general_diagnostics {
namespace attribute { namespace attribute {
@@ -131,6 +131,7 @@ attribute_t *create_tc_update_deadline(cluster_t *cluster, nullable<uint32_t> va
} /* attribute */ } /* attribute */
} /* general_commissioning */ } /* general_commissioning */
#ifndef CONFIG_CUSTOM_NETWORK_CONFIG
namespace network_commissioning { namespace network_commissioning {
namespace attribute { namespace attribute {
attribute_t *create_max_networks(cluster_t *cluster, uint8_t value); attribute_t *create_max_networks(cluster_t *cluster, uint8_t value);
@@ -146,6 +147,7 @@ attribute_t *create_supported_thread_features(cluster_t *cluster, uint16_t value
attribute_t *create_thread_version(cluster_t *cluster, uint16_t value); attribute_t *create_thread_version(cluster_t *cluster, uint16_t value);
} /* attribute */ } /* attribute */
} /* network_commissioning */ } /* network_commissioning */
#endif // CONFIG_CUSTOM_NETWORK_CONFIG
namespace general_diagnostics { namespace general_diagnostics {
namespace attribute { namespace attribute {
@@ -396,6 +396,7 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
} }
} /* general_commissioning */ } /* general_commissioning */
#ifndef CONFIG_CUSTOM_NETWORK_CONFIG
namespace network_commissioning { namespace network_commissioning {
const function_generic_t *function_list = NULL; const function_generic_t *function_list = NULL;
const int function_flags = CLUSTER_FLAG_NONE; const int function_flags = CLUSTER_FLAG_NONE;
@@ -447,6 +448,7 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
return cluster; return cluster;
} }
} /* network_commissioning */ } /* network_commissioning */
#endif // CONFIG_CUSTOM_NETWORK_CONFIG
namespace general_diagnostics { namespace general_diagnostics {
const function_generic_t *function_list = NULL; const function_generic_t *function_list = NULL;
@@ -121,6 +121,7 @@ typedef struct config {
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags); cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags);
} /* general_commissioning */ } /* general_commissioning */
#ifndef CONFIG_CUSTOM_NETWORK_CONFIG
namespace network_commissioning { namespace network_commissioning {
typedef struct config { typedef struct config {
uint32_t feature_map; uint32_t feature_map;
@@ -135,6 +136,7 @@ typedef struct config {
} config_t; } config_t;
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags); cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags);
} /* network_commissioning */ } /* network_commissioning */
#endif // CONFIG_CUSTOM_NETWORK_CONFIG
namespace diagnostic_logs { namespace diagnostic_logs {
using config_t = common::config_t; using config_t = common::config_t;
@@ -1892,6 +1892,7 @@ command_t *create_set_tc_acknowledgements_response(cluster_t *cluster)
} /* command */ } /* command */
} /* general_commissioning */ } /* general_commissioning */
#ifndef CONFIG_CUSTOM_NETWORK_CONFIG
namespace network_commissioning { namespace network_commissioning {
namespace command { namespace command {
@@ -1964,6 +1965,7 @@ command_t *create_connect_network_response(cluster_t *cluster)
} /* command */ } /* command */
} /* network_commissioning */ } /* network_commissioning */
#endif // CONFIG_CUSTOM_NETWORK_CONFIG
namespace administrator_commissioning { namespace administrator_commissioning {
namespace command { namespace command {
@@ -132,6 +132,7 @@ command_t *create_set_tc_acknowledgements_response(cluster_t *cluster);
} /* command */ } /* command */
} /* general_commissioning */ } /* general_commissioning */
#ifndef CONFIG_CUSTOM_NETWORK_CONFIG
namespace network_commissioning { namespace network_commissioning {
namespace command { namespace command {
command_t *create_scan_networks(cluster_t *cluster); command_t *create_scan_networks(cluster_t *cluster);
@@ -145,6 +146,7 @@ command_t *create_network_config_response(cluster_t *cluster);
command_t *create_connect_network_response(cluster_t *cluster); command_t *create_connect_network_response(cluster_t *cluster);
} /* command */ } /* command */
} /* network_commissioning */ } /* network_commissioning */
#endif // CONFIG_CUSTOM_NETWORK_CONFIG
namespace administrator_commissioning { namespace administrator_commissioning {
namespace command { namespace command {
@@ -73,7 +73,9 @@ esp_err_t add(endpoint_t *endpoint, config_t *config)
access_control::create(endpoint, &(config->access_control), CLUSTER_FLAG_SERVER); access_control::create(endpoint, &(config->access_control), CLUSTER_FLAG_SERVER);
basic_information::create(endpoint, &(config->basic_information), CLUSTER_FLAG_SERVER); basic_information::create(endpoint, &(config->basic_information), CLUSTER_FLAG_SERVER);
general_commissioning::create(endpoint, &(config->general_commissioning), CLUSTER_FLAG_SERVER); general_commissioning::create(endpoint, &(config->general_commissioning), CLUSTER_FLAG_SERVER);
#ifndef CONFIG_CUSTOM_NETWORK_CONFIG
network_commissioning::create(endpoint, &(config->network_commissioning), CLUSTER_FLAG_SERVER); network_commissioning::create(endpoint, &(config->network_commissioning), CLUSTER_FLAG_SERVER);
#endif // CONFIG_CUSTOM_NETWORK_CONFIG
general_diagnostics::create(endpoint, &(config->general_diagnostics), CLUSTER_FLAG_SERVER); general_diagnostics::create(endpoint, &(config->general_diagnostics), CLUSTER_FLAG_SERVER);
administrator_commissioning::create(endpoint, &(config->administrator_commissioning), CLUSTER_FLAG_SERVER, administrator_commissioning::create(endpoint, &(config->administrator_commissioning), CLUSTER_FLAG_SERVER,
ESP_MATTER_NONE_FEATURE_ID); ESP_MATTER_NONE_FEATURE_ID);
@@ -1916,6 +1918,7 @@ esp_err_t add(endpoint_t *endpoint, config_t *config)
} /* thread_border_router */ } /* thread_border_router */
#ifndef CONFIG_CUSTOM_NETWORK_CONFIG
namespace secondary_network_interface { namespace secondary_network_interface {
uint32_t get_device_type_id() uint32_t get_device_type_id()
{ {
@@ -1946,6 +1949,7 @@ esp_err_t add(endpoint_t *endpoint, config_t *config)
return ESP_OK; return ESP_OK;
} }
} /* secondary_network_interface */ } /* secondary_network_interface */
#endif // CONFIG_CUSTOM_NETWORK_CONFIG
namespace mounted_on_off_control { namespace mounted_on_off_control {
uint32_t get_device_type_id() uint32_t get_device_type_id()
@@ -197,7 +197,9 @@ typedef struct config {
cluster::access_control::config_t access_control; cluster::access_control::config_t access_control;
cluster::basic_information::config_t basic_information; cluster::basic_information::config_t basic_information;
cluster::general_commissioning::config_t general_commissioning; cluster::general_commissioning::config_t general_commissioning;
#ifndef CONFIG_CUSTOM_NETWORK_CONFIG
cluster::network_commissioning::config_t network_commissioning; cluster::network_commissioning::config_t network_commissioning;
#endif // CONFIG_CUSTOM_NETWORK_CONFIG
cluster::general_diagnostics::config_t general_diagnostics; cluster::general_diagnostics::config_t general_diagnostics;
cluster::administrator_commissioning::config_t administrator_commissioning; cluster::administrator_commissioning::config_t administrator_commissioning;
cluster::operational_credentials::config_t operational_credentials; cluster::operational_credentials::config_t operational_credentials;
@@ -900,6 +902,7 @@ endpoint_t *create(node_t *node, config_t *config, uint8_t flags, void *priv_dat
esp_err_t add(endpoint_t *endpoint, config_t *config); esp_err_t add(endpoint_t *endpoint, config_t *config);
} /* thread_border_router */ } /* thread_border_router */
#ifndef CONFIG_CUSTOM_NETWORK_CONFIG
namespace secondary_network_interface { namespace secondary_network_interface {
typedef struct config { typedef struct config {
cluster::descriptor::config_t descriptor; cluster::descriptor::config_t descriptor;
@@ -911,6 +914,7 @@ uint8_t get_device_type_version();
endpoint_t *create(node_t *node, config_t *config, uint8_t flags, void *priv_data); endpoint_t *create(node_t *node, config_t *config, uint8_t flags, void *priv_data);
esp_err_t add(endpoint_t *endpoint, config_t *config); esp_err_t add(endpoint_t *endpoint, config_t *config);
} /* secondary_network_interface */ } /* secondary_network_interface */
#endif // CONFIG_CUSTOM_NETWORK_CONFIG
namespace mounted_on_off_control { namespace mounted_on_off_control {
+25
View File
@@ -435,6 +435,31 @@ Please refer to the `advance setup`_ section in the programming guide.
This has been demonstrated in the `blemesh_bridge`_ and `light_wifi_prov`_ examples. This has been demonstrated in the `blemesh_bridge`_ and `light_wifi_prov`_ examples.
A1.17 Using custom network commissioning (CustomNetworkConfig)
--------------------------------------------------------------
If your device uses out-of-band-configured networking (for example a rich user interface,
manufacturer-specific means, or a custom commissioning flow), the Matter specification's
``CustomNetworkConfig`` condition allows you to omit the Network Commissioning cluster from
the root node endpoint.
To enable this in ESP-Matter, set the following Kconfig option:
::
CONFIG_CUSTOM_NETWORK_CONFIG=y
When this option is enabled:
- The Network Commissioning cluster will **not** be created on the root node endpoint.
- The ``secondary_network_interface`` endpoint type is also excluded from compilation.
- All Network Commissioning cluster code (attributes, commands, cluster creation) is
compiled out, reducing firmware size.
This is useful for devices that manage their own network configuration and do not need
the standard Matter Network Commissioning flow.
.. _bleprph: https://github.com/espressif/esp-idf/tree/b5ac4fbdf9e9fb320bb0a98ee4fbaa18f8566f37/examples/bluetooth/nimble/bleprph .. _bleprph: https://github.com/espressif/esp-idf/tree/b5ac4fbdf9e9fb320bb0a98ee4fbaa18f8566f37/examples/bluetooth/nimble/bleprph
.. _blecent: https://github.com/espressif/esp-idf/tree/b5ac4fbdf9e9fb320bb0a98ee4fbaa18f8566f37/examples/bluetooth/nimble/blecent .. _blecent: https://github.com/espressif/esp-idf/tree/b5ac4fbdf9e9fb320bb0a98ee4fbaa18f8566f37/examples/bluetooth/nimble/blecent
.. _bleprph_advertise(): https://github.com/espressif/esp-idf/blob/b5ac4fbdf9e9fb320bb0a98ee4fbaa18f8566f37/examples/bluetooth/nimble/bleprph/main/main.c#L146 .. _bleprph_advertise(): https://github.com/espressif/esp-idf/blob/b5ac4fbdf9e9fb320bb0a98ee4fbaa18f8566f37/examples/bluetooth/nimble/bleprph/main/main.c#L146