From 8f032744731f3441116c65b1b11d28d5380102ce Mon Sep 17 00:00:00 2001 From: QuentinCaldeira-eaton <164154640+QuentinCaldeira-eaton@users.noreply.github.com> Date: Fri, 30 Aug 2024 11:13:03 +0200 Subject: [PATCH] Get OnNetwork commissioning working (#34978) * Update Zephyr platform to get working commissioning for onnetwork purposes * Restyled by whitespace * Remove unwanted and unnecessary comments Signed-off-by: Caldeira, Quentin * Bring Openthread default config back * Bring back udp and tcp configurations --------- Signed-off-by: Caldeira, Quentin Co-authored-by: Restyled.io --- config/zephyr/chip-module/CMakeLists.txt | 258 +++++++++--------- config/zephyr/chip-module/Kconfig.mbedtls | 9 +- src/platform/Zephyr/BUILD.gn | 1 + .../Zephyr/ConnectivityManagerImpl.cpp | 82 +++++- src/platform/Zephyr/ConnectivityManagerImpl.h | 2 +- 5 files changed, 219 insertions(+), 133 deletions(-) diff --git a/config/zephyr/chip-module/CMakeLists.txt b/config/zephyr/chip-module/CMakeLists.txt index 575e4ff24b4827..8449398b4f480b 100644 --- a/config/zephyr/chip-module/CMakeLists.txt +++ b/config/zephyr/chip-module/CMakeLists.txt @@ -1,140 +1,142 @@ # -# Copyright (c) 2022-2023 Project CHIP Authors +# Copyright (c) 2022-2023 Project CHIP Authors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. # # -# @file -# CMake sub-project defining 'chip' target which represents CHIP library -# Since CHIP doesn't provide native CMake support, ExternalProject -# module is used to build the required artifacts with GN meta-build -# system. It is assumed that find_package(Zephyr) has been called before -# including this file. +# @file +# CMake sub-project defining 'chip' target which represents CHIP library +# Since CHIP doesn't provide native CMake support, ExternalProject +# module is used to build the required artifacts with GN meta-build +# system. It is assumed that find_package(Zephyr) has been called before +# including this file. # -if (CONFIG_CHIP) - -include(ExternalProject) -include(../zephyr-util.cmake) - -# -# ============================================================================== -# Prepare CHIP configuration based on the project Kconfig configuration -# ============================================================================== -# Set paths -if (NOT CHIP_ROOT) - get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../.. REALPATH) -endif() -get_filename_component(GN_ROOT_TARGET ${CHIP_ROOT}/config/zephyr/chip-gn REALPATH) -get_filename_component(COMMON_CMAKE_SOURCE_DIR ${CHIP_ROOT}/config/common/cmake REALPATH) - - -# Get common Cmake sources -include(${COMMON_CMAKE_SOURCE_DIR}/chip_gn_args.cmake) -include(${COMMON_CMAKE_SOURCE_DIR}/chip_gn.cmake) - -if (CONFIG_POSIX_API) - matter_add_flags(-D_DEFAULT_SOURCE) - matter_add_flags(-isystem${ZEPHYR_BASE}/include/zephyr/posix) -endif() - -if(CONFIG_MBEDTLS) - zephyr_include_directories($) - zephyr_compile_definitions($) -endif() - -zephyr_get_compile_flags(ZEPHYR_CFLAGS_C C) -matter_add_cflags("${ZEPHYR_CFLAGS_C}") -zephyr_get_compile_flags(ZEPHYR_CFLAGS_CC CXX) -matter_add_cxxflags("${ZEPHYR_CFLAGS_CC}") -zephyr_get_gnu_cpp_standard(ZEPHYR_GNU_CPP_STD) -matter_add_cxxflags("${ZEPHYR_GNU_CPP_STD}") - -# Set up custom OpenThread configuration - -if (CONFIG_CHIP_OPENTHREAD_CONFIG) - get_filename_component(CHIP_OPENTHREAD_CONFIG - ${CONFIG_CHIP_OPENTHREAD_CONFIG} - REALPATH - BASE_DIR ${CMAKE_SOURCE_DIR} +if(CONFIG_CHIP) + include(ExternalProject) + include(../zephyr-util.cmake) + + # + # ============================================================================== + # Prepare CHIP configuration based on the project Kconfig configuration + # ============================================================================== + # Set paths + if(NOT CHIP_ROOT) + get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../.. REALPATH) + endif() + + get_filename_component(GN_ROOT_TARGET ${CHIP_ROOT}/config/zephyr/chip-gn REALPATH) + get_filename_component(COMMON_CMAKE_SOURCE_DIR ${CHIP_ROOT}/config/common/cmake REALPATH) + + # Get common Cmake sources + include(${COMMON_CMAKE_SOURCE_DIR}/chip_gn_args.cmake) + include(${COMMON_CMAKE_SOURCE_DIR}/chip_gn.cmake) + + if(CONFIG_POSIX_API) + matter_add_flags(-D_DEFAULT_SOURCE) + matter_add_flags(-isystem${ZEPHYR_BASE}/include/zephyr/posix) + endif() + + if(CONFIG_MBEDTLS) + zephyr_include_directories($) + zephyr_compile_definitions($) + endif() + + zephyr_get_compile_flags(ZEPHYR_CFLAGS_C C) + matter_add_cflags("${ZEPHYR_CFLAGS_C}") + zephyr_get_compile_flags(ZEPHYR_CFLAGS_CC CXX) + matter_add_cxxflags("${ZEPHYR_CFLAGS_CC}") + zephyr_get_gnu_cpp_standard(ZEPHYR_GNU_CPP_STD) + matter_add_cxxflags("${ZEPHYR_GNU_CPP_STD}") + + # Set up custom OpenThread configuration + if(CONFIG_CHIP_OPENTHREAD_CONFIG) + get_filename_component(CHIP_OPENTHREAD_CONFIG + ${CONFIG_CHIP_OPENTHREAD_CONFIG} + REALPATH + BASE_DIR ${CMAKE_SOURCE_DIR} + ) + zephyr_set_openthread_config(${CHIP_OPENTHREAD_CONFIG}) + endif() + + # ============================================================================== + # Generate configuration for CHIP GN build system + # ============================================================================== + matter_common_gn_args( + DEBUG CONFIG_DEBUG + LIB_SHELL CONFIG_CHIP_LIB_SHELL + LIB_TESTS CONFIG_CHIP_BUILD_TESTS + PROJECT_CONFIG ${CONFIG_CHIP_PROJECT_CONFIG} ) - zephyr_set_openthread_config(${CHIP_OPENTHREAD_CONFIG}) -endif() - -# ============================================================================== -# Generate configuration for CHIP GN build system -# ============================================================================== -matter_common_gn_args( - DEBUG CONFIG_DEBUG - LIB_SHELL CONFIG_CHIP_LIB_SHELL - LIB_TESTS CONFIG_CHIP_BUILD_TESTS - PROJECT_CONFIG ${CONFIG_CHIP_PROJECT_CONFIG} -) - -matter_add_gn_arg_string("zephyr_ar" ${CMAKE_AR}) -matter_add_gn_arg_string("zephyr_cc" ${CMAKE_C_COMPILER}) -matter_add_gn_arg_string("zephyr_cxx" ${CMAKE_CXX_COMPILER}) -matter_add_gn_arg_bool ("chip_logging" CONFIG_LOG) -matter_add_gn_arg_bool ("chip_error_logging" CONFIG_MATTER_LOG_LEVEL GREATER_EQUAL 1) -matter_add_gn_arg_bool ("chip_progress_logging" CONFIG_MATTER_LOG_LEVEL GREATER_EQUAL 3) -matter_add_gn_arg_bool ("chip_detail_logging" CONFIG_MATTER_LOG_LEVEL GREATER_EQUAL 4) -matter_add_gn_arg_bool ("chip_automation_logging" FALSE) -matter_add_gn_arg_bool ("chip_enable_openthread" CONFIG_NET_L2_OPENTHREAD) -matter_add_gn_arg_bool ("chip_openthread_ftd" CONFIG_OPENTHREAD_FTD) -matter_add_gn_arg_bool ("chip_inet_config_enable_ipv4" CONFIG_CHIP_IPV4) -matter_add_gn_arg_bool ("chip_enable_wifi" CONFIG_WIFI) -matter_add_gn_arg_bool ("chip_config_network_layer_ble" CONFIG_BT) -matter_add_gn_arg_bool ("chip_mdns_minimal" CONFIG_WIFI) -matter_add_gn_arg_bool ("chip_mdns_minimal" CONFIG_NET_L2_ETHERNET) -matter_add_gn_arg_bool ("chip_mdns_platform" CONFIG_NET_L2_OPENTHREAD) -matter_add_gn_arg_bool ("chip_inet_config_enable_tcp_endpoint" CONFIG_CHIP_BUILD_TESTS) -matter_add_gn_arg_bool ("chip_inet_config_enable_udp_endpoint" CONFIG_NET_UDP) -matter_add_gn_arg_bool ("chip_inet_config_enable_tcp_endpoint" CONFIG_NET_TCP) -matter_add_gn_arg_bool ("chip_malloc_sys_heap" CONFIG_CHIP_MALLOC_SYS_HEAP) - - -if (CONFIG_CHIP_ENABLE_DNSSD_SRP) - matter_add_gn_arg_string("chip_mdns" "platform") -endif() - -if(CONFIG_WIFI) - matter_add_gn_arg_string("chip_mdns" "minimal") -elseif (CONFIG_NET_L2_ETHERNET) - matter_add_gn_arg_string("chip_mdns" "minimal") -elseif (CONFIG_NET_L2_OPENTHREAD) - matter_add_gn_arg_string("chip_mdns" "platform") -else() - matter_add_gn_arg_string("chip_mdns" "none") -endif() - -if (CONFIG_CHIP_PW_RPC) - set(PIGWEED_DIR "//third_party/pigweed/repo") - matter_add_gn_arg_string("pw_assert_BACKEND" ${PIGWEED_DIR}/pw_assert_log:check_backend) - matter_add_gn_arg_string("pw_log_BACKEND" ${PIGWEED_DIR}/pw_log_basic) - matter_add_gn_arg("pw_build_LINK_DEPS" [\"${PIGWEED_DIR}/pw_assert:impl\",\ \"${PIGWEED_DIR}/pw_log:impl\"]) -endif() - -matter_generate_args_tmp_file() - -# ============================================================================== -# Build chip library -# ============================================================================== -matter_build(chip - LIB_SHELL ${CONFIG_CHIP_LIB_SHELL} - LIB_TESTS ${CONFIG_CHIP_BUILD_TESTS} - GN_DEPENDENCIES kernel -) -set_property(GLOBAL APPEND PROPERTY ZEPHYR_INTERFACE_LIBS chip) + matter_add_gn_arg_string("zephyr_ar" ${CMAKE_AR}) + matter_add_gn_arg_string("zephyr_cc" ${CMAKE_C_COMPILER}) + matter_add_gn_arg_string("zephyr_cxx" ${CMAKE_CXX_COMPILER}) + matter_add_gn_arg_bool("chip_logging" CONFIG_LOG) + matter_add_gn_arg_bool("chip_error_logging" CONFIG_MATTER_LOG_LEVEL GREATER_EQUAL 1) + matter_add_gn_arg_bool("chip_progress_logging" CONFIG_MATTER_LOG_LEVEL GREATER_EQUAL 3) + matter_add_gn_arg_bool("chip_detail_logging" CONFIG_MATTER_LOG_LEVEL GREATER_EQUAL 4) + matter_add_gn_arg_bool("chip_automation_logging" FALSE) + matter_add_gn_arg_bool("chip_enable_openthread" CONFIG_NET_L2_OPENTHREAD) + matter_add_gn_arg_bool("chip_openthread_ftd" CONFIG_OPENTHREAD_FTD) + matter_add_gn_arg_bool("chip_inet_config_enable_ipv4" CONFIG_CHIP_IPV4) + matter_add_gn_arg_bool("chip_enable_wifi" CONFIG_WIFI) + matter_add_gn_arg_bool("chip_config_network_layer_ble" CONFIG_BT) + matter_add_gn_arg_bool("chip_mdns_minimal" CONFIG_WIFI) + matter_add_gn_arg_bool("chip_mdns_minimal" CONFIG_NET_L2_ETHERNET) + matter_add_gn_arg_bool("chip_mdns_platform" CONFIG_NET_L2_OPENTHREAD) + matter_add_gn_arg_bool("chip_inet_config_enable_tcp_endpoint" CONFIG_CHIP_BUILD_TESTS) + matter_add_gn_arg_bool("chip_malloc_sys_heap" CONFIG_CHIP_MALLOC_SYS_HEAP) + matter_add_gn_arg_bool("chip_inet_config_enable_tcp_endpoint" FALSE) + matter_add_gn_arg_bool("chip_enable_read_client" CONFIG_CHIP_ENABLE_READ_CLIENT) + + if(BOARD STREQUAL "native_posix") + matter_add_gn_arg_string("target_cpu" "x86") + elseif(BOARD STREQUAL "native_posix_64") + matter_add_gn_arg_string("target_cpu" "x64") + endif() + + if(CONFIG_CHIP_ENABLE_DNSSD_SRP) + matter_add_gn_arg_string("chip_mdns" "platform") + endif() + + if(CONFIG_WIFI) + matter_add_gn_arg_string("chip_mdns" "minimal") + elseif(CONFIG_NET_L2_ETHERNET) + matter_add_gn_arg_string("chip_mdns" "minimal") + elseif(CONFIG_NET_L2_OPENTHREAD) + matter_add_gn_arg_string("chip_mdns" "platform") + else() + matter_add_gn_arg_string("chip_mdns" "none") + endif() + + if(CONFIG_CHIP_PW_RPC) + set(PIGWEED_DIR "//third_party/pigweed/repo") + matter_add_gn_arg_string("pw_assert_BACKEND" ${PIGWEED_DIR}/pw_assert_log:check_backend) + matter_add_gn_arg_string("pw_log_BACKEND" ${PIGWEED_DIR}/pw_log_basic) + matter_add_gn_arg("pw_build_LINK_DEPS" [\"${PIGWEED_DIR}/pw_assert:impl\",\ \"${PIGWEED_DIR}/pw_log:impl\"]) + endif() + + matter_generate_args_tmp_file() + + # ============================================================================== + # Build chip library + # ============================================================================== + matter_build(chip + LIB_SHELL ${CONFIG_CHIP_LIB_SHELL} + LIB_TESTS ${CONFIG_CHIP_BUILD_TESTS} + GN_DEPENDENCIES kernel + ) + set_property(GLOBAL APPEND PROPERTY ZEPHYR_INTERFACE_LIBS chip) endif() # CONFIG_CHIP \ No newline at end of file diff --git a/config/zephyr/chip-module/Kconfig.mbedtls b/config/zephyr/chip-module/Kconfig.mbedtls index 3e4fdc1895db3c..72b1563b1e808d 100644 --- a/config/zephyr/chip-module/Kconfig.mbedtls +++ b/config/zephyr/chip-module/Kconfig.mbedtls @@ -61,4 +61,11 @@ config MBEDTLS_ECDH_C config MBEDTLS_ECDSA_C default y -endif #CHIP \ No newline at end of file +config MBEDTLS_X509_CSR_WRITE_C + default y + +config MBEDTLS_PK_WRITE_C + default y + +endif #CHIP + diff --git a/src/platform/Zephyr/BUILD.gn b/src/platform/Zephyr/BUILD.gn index f1d9bdb2cef34f..035c13a1cd7a5f 100644 --- a/src/platform/Zephyr/BUILD.gn +++ b/src/platform/Zephyr/BUILD.gn @@ -40,6 +40,7 @@ static_library("Zephyr") { "DiagnosticDataProviderImpl.h", "DiagnosticDataProviderImplGetter.cpp", "InetPlatformConfig.h", + "InetUtils.cpp", "KeyValueStoreManagerImpl.cpp", "KeyValueStoreManagerImpl.h", "PlatformManagerImpl.cpp", diff --git a/src/platform/Zephyr/ConnectivityManagerImpl.cpp b/src/platform/Zephyr/ConnectivityManagerImpl.cpp index 17cdf46370f2d2..d13a4cebc4e5f6 100644 --- a/src/platform/Zephyr/ConnectivityManagerImpl.cpp +++ b/src/platform/Zephyr/ConnectivityManagerImpl.cpp @@ -17,11 +17,16 @@ #include +#include +#include +#include #include +#include #include -#include -#include +#ifndef CONFIG_ARCH_POSIX +#include +#endif #include @@ -34,15 +39,62 @@ #endif #if CHIP_DEVICE_CONFIG_ENABLE_THREAD +#include #include #endif -using namespace ::chip; +using namespace ::chip::Inet; using namespace ::chip::DeviceLayer::Internal; namespace chip { namespace DeviceLayer { +namespace { +CHIP_ERROR JoinLeaveMulticastGroup(net_if * iface, const Inet::IPAddress & address, + UDPEndPointImplSockets::MulticastOperation operation) +{ +#if CHIP_DEVICE_CONFIG_ENABLE_THREAD + if (net_if_l2(iface) == &NET_L2_GET_NAME(OPENTHREAD)) + { + const otIp6Address otAddress = ToOpenThreadIP6Address(address); + const auto handler = operation == UDPEndPointImplSockets::MulticastOperation::kJoin ? otIp6SubscribeMulticastAddress + : otIp6UnsubscribeMulticastAddress; + otError error; + + ThreadStackMgr().LockThreadStack(); + error = handler(openthread_get_default_instance(), &otAddress); + ThreadStackMgr().UnlockThreadStack(); + + return MapOpenThreadError(error); + } +#endif + +#if CHIP_DEVICE_CONFIG_ENABLE_WIFI || CHIP_DEVICE_CONFIG_ENABLE_ETHERNET + const in6_addr in6Addr = InetUtils::ToZephyrAddr(address); + + if (operation == UDPEndPointImplSockets::MulticastOperation::kJoin) + { + net_if_mcast_addr * maddr = net_if_ipv6_maddr_add(iface, &in6Addr); + + if (maddr && !net_if_ipv6_maddr_is_joined(maddr)) + { + net_if_ipv6_maddr_join(iface, maddr); + } + } + else if (operation == UDPEndPointImplSockets::MulticastOperation::kLeave) + { + VerifyOrReturnError(net_if_ipv6_maddr_rm(iface, &in6Addr), CHIP_ERROR_INVALID_ADDRESS); + } + else + { + return CHIP_ERROR_INCORRECT_STATE; + } +#endif + + return CHIP_NO_ERROR; +} +} // namespace + ConnectivityManagerImpl ConnectivityManagerImpl::sInstance; CHIP_ERROR ConnectivityManagerImpl::_Init() @@ -50,6 +102,30 @@ CHIP_ERROR ConnectivityManagerImpl::_Init() #if CHIP_DEVICE_CONFIG_ENABLE_THREAD GenericConnectivityManagerImpl_Thread::_Init(); #endif +#if CHIP_DEVICE_CONFIG_ENABLE_WIFI + ReturnErrorOnFailure(InitWiFi()); +#endif + +#if CHIP_DEVICE_CONFIG_ENABLE_THREAD || CHIP_DEVICE_CONFIG_ENABLE_WIFI || CHIP_DEVICE_CONFIG_ENABLE_ETHERNET + UDPEndPointImplSockets::SetMulticastGroupHandler( + [](InterfaceId interfaceId, const IPAddress & address, UDPEndPointImplSockets::MulticastOperation operation) { + if (interfaceId.IsPresent()) + { + net_if * iface = InetUtils::GetInterface(interfaceId); + VerifyOrReturnError(iface != nullptr, INET_ERROR_UNKNOWN_INTERFACE); + + return JoinLeaveMulticastGroup(iface, address, operation); + } + + // If the interface is not specified, join or leave the multicast group on all interfaces. + for (int i = 1; net_if * iface = net_if_get_by_index(i); i++) + { + ReturnErrorOnFailure(JoinLeaveMulticastGroup(iface, address, operation)); + } + + return CHIP_NO_ERROR; + }); +#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD || CHIP_DEVICE_CONFIG_ENABLE_WIFI return CHIP_NO_ERROR; } diff --git a/src/platform/Zephyr/ConnectivityManagerImpl.h b/src/platform/Zephyr/ConnectivityManagerImpl.h index 4c003f23a4861a..0a60770157087e 100644 --- a/src/platform/Zephyr/ConnectivityManagerImpl.h +++ b/src/platform/Zephyr/ConnectivityManagerImpl.h @@ -100,7 +100,7 @@ inline ConnectivityManager & ConnectivityMgr(void) * Returns the platform-specific implementation of the ConnectivityManager singleton object. * * chip applications can use this to gain access to features of the ConnectivityManager - * that are specific to the ESP32 platform. + * that are specific to the Zephyr platform. */ inline ConnectivityManagerImpl & ConnectivityMgrImpl(void) {