From abb713402ef6423e1eaaeeaa9a0901156e7f82ef Mon Sep 17 00:00:00 2001 From: Damian Krolik Date: Mon, 19 Oct 2020 08:19:18 +0200 Subject: [PATCH 1/7] [thread] Add method to retrieve SLAAC IPv6 address --- src/include/platform/ThreadStackManager.h | 6 ++++++ src/platform/Linux/ThreadStackManagerImpl.cpp | 5 +++++ src/platform/Linux/ThreadStackManagerImpl.h | 2 ++ .../GenericThreadStackManagerImpl_OpenThread.cpp | 15 +++++++++++++++ .../GenericThreadStackManagerImpl_OpenThread.h | 1 + 5 files changed, 29 insertions(+) diff --git a/src/include/platform/ThreadStackManager.h b/src/include/platform/ThreadStackManager.h index 37a98be04116d4..6fc999213753a3 100644 --- a/src/include/platform/ThreadStackManager.h +++ b/src/include/platform/ThreadStackManager.h @@ -76,6 +76,7 @@ class ThreadStackManager CHIP_ERROR GetAndLogThreadTopologyMinimal(); CHIP_ERROR GetAndLogThreadTopologyFull(); CHIP_ERROR GetPrimary802154MACAddress(uint8_t * buf); + CHIP_ERROR GetSlaacIPv6Address(chip::Inet::IPAddress & addr); CHIP_ERROR JoinerStart(); CHIP_ERROR SetThreadProvision(const Internal::DeviceNetworkInfo & netInfo); @@ -305,6 +306,11 @@ inline CHIP_ERROR ThreadStackManager::GetPrimary802154MACAddress(uint8_t * buf) return static_cast(this)->_GetPrimary802154MACAddress(buf); } +inline CHIP_ERROR ThreadStackManager::GetSlaacIPv6Address(chip::Inet::IPAddress & addr) +{ + return static_cast(this)->_GetSlaacIPv6Address(addr); +} + inline CHIP_ERROR ThreadStackManager::JoinerStart() { return static_cast(this)->_JoinerStart(); diff --git a/src/platform/Linux/ThreadStackManagerImpl.cpp b/src/platform/Linux/ThreadStackManagerImpl.cpp index d6ca94015e9ed5..66e6c21aca08d6 100644 --- a/src/platform/Linux/ThreadStackManagerImpl.cpp +++ b/src/platform/Linux/ThreadStackManagerImpl.cpp @@ -417,6 +417,11 @@ CHIP_ERROR ThreadStackManagerImpl::_GetPrimary802154MACAddress(uint8_t * buf) return OTBR_TO_CHIP_ERROR(error); } +CHIP_ERROR ThreadStackManagerImpl::_GetSlaacIPv6Address(chip::Inet::IPAddress & addr) +{ + return CHIP_ERROR_NOT_IMPLEMENTED; +} + CHIP_ERROR ThreadStackManagerImpl::_JoinerStart() { return CHIP_ERROR_NOT_IMPLEMENTED; diff --git a/src/platform/Linux/ThreadStackManagerImpl.h b/src/platform/Linux/ThreadStackManagerImpl.h index 3c36c898535e04..74ac498e84d341 100644 --- a/src/platform/Linux/ThreadStackManagerImpl.h +++ b/src/platform/Linux/ThreadStackManagerImpl.h @@ -83,6 +83,8 @@ class ThreadStackManagerImpl : public ThreadStackManager CHIP_ERROR _GetPrimary802154MACAddress(uint8_t * buf); + CHIP_ERROR _GetSlaacIPv6Address(chip::Inet::IPAddress & addr); + CHIP_ERROR _JoinerStart(); ~ThreadStackManagerImpl() = default; diff --git a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp index 1bd1fec4c47539..70d16b09b35a43 100644 --- a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp +++ b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp @@ -771,6 +771,21 @@ CHIP_ERROR GenericThreadStackManagerImpl_OpenThread::_GetPrimary80215 return CHIP_NO_ERROR; }; +template +CHIP_ERROR GenericThreadStackManagerImpl_OpenThread::_GetSlaacIPv6Address(chip::Inet::IPAddress & addr) +{ + for (const otNetifAddress * otAddr = otIp6GetUnicastAddresses(mOTInst); otAddr != nullptr; otAddr = otAddr->mNext) + { + if (otAddr->mValid && otAddr->mAddressOrigin == OT_ADDRESS_ORIGIN_SLAAC) + { + addr = ToIPAddress(otAddr->mAddress); + return CHIP_NO_ERROR; + } + } + + return CHIP_ERROR_INCORRECT_STATE; +} + template CHIP_ERROR GenericThreadStackManagerImpl_OpenThread::DoInit(otInstance * otInst) { diff --git a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.h b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.h index 9957ecac07c73c..faf78046fbfac5 100644 --- a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.h +++ b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.h @@ -80,6 +80,7 @@ class GenericThreadStackManagerImpl_OpenThread CHIP_ERROR _GetAndLogThreadTopologyMinimal(void); CHIP_ERROR _GetAndLogThreadTopologyFull(void); CHIP_ERROR _GetPrimary802154MACAddress(uint8_t * buf); + CHIP_ERROR _GetSlaacIPv6Address(chip::Inet::IPAddress & addr); void _OnWoBLEAdvertisingStart(void); void _OnWoBLEAdvertisingStop(void); From 353e1faa2473066197d8afeae3494ff69559fd50 Mon Sep 17 00:00:00 2001 From: Damian Krolik Date: Mon, 19 Oct 2020 12:28:20 +0200 Subject: [PATCH 2/7] [transport] Handle Thread Association request Currently, NetworkProvisioning class, which takes part in rendezvous over BLE session, only supports WiFi provisioning and Thread provisioning is partially implemented in RendezvousServer (Application layer). Move the Thread provisioning code to the BLE transport layer to process both network types in the same way. Also reply to Thread Association request with SLAAC/On-Mesh IPv6 Address once that is assigned so that the controller knows that provisioning completed successfully and how to reach the device. --- .../chip-app-server/RendezvousServer.cpp | 72 ++--------- .../include/RendezvousServer.h | 6 + src/transport/NetworkProvisioning.cpp | 118 ++++++++++++++++-- src/transport/NetworkProvisioning.h | 18 ++- 4 files changed, 138 insertions(+), 76 deletions(-) diff --git a/examples/common/chip-app-server/RendezvousServer.cpp b/examples/common/chip-app-server/RendezvousServer.cpp index 14d7c33ef2d0fd..bddb2df09f730f 100644 --- a/examples/common/chip-app-server/RendezvousServer.cpp +++ b/examples/common/chip-app-server/RendezvousServer.cpp @@ -25,7 +25,6 @@ #if CHIP_ENABLE_OPENTHREAD #include -#include #endif using namespace ::chip::Inet; @@ -34,7 +33,16 @@ using namespace ::chip::DeviceLayer; namespace chip { -RendezvousServer::RendezvousServer() : mRendezvousSession(this) {} +void AccesoryNetworkProvisioningDelegate::ProvisionThread(const DeviceLayer::Internal::DeviceNetworkInfo & threadData) +{ +#if CHIP_ENABLE_OPENTHREAD + ThreadStackMgr().SetThreadEnabled(false); + ThreadStackMgr().SetThreadProvision(threadData); + ThreadStackMgr().SetThreadEnabled(true); +#endif // CHIP_ENABLE_OPENTHREAD +} + +RendezvousServer::RendezvousServer() : mRendezvousSession(this, &mNetworkProvisioningDelegate) {} CHIP_ERROR RendezvousServer::Init(const RendezvousParameters & params) { @@ -58,66 +66,6 @@ void RendezvousServer::OnRendezvousConnectionClosed() void RendezvousServer::OnRendezvousMessageReceived(PacketBuffer * buffer) { -#if CHIP_ENABLE_OPENTHREAD - uint16_t bufferLen = buffer->DataLength(); - uint8_t * data = buffer->Start(); - chip::DeviceLayer::Internal::DeviceNetworkInfo networkInfo; - ChipLogProgress(AppServer, "Receive BLE message size=%u", bufferLen); - - VerifyOrExit(bufferLen >= sizeof(networkInfo.ThreadNetworkName), - ChipLogProgress(AppServer, "Invalid network provision message")); - memcpy(networkInfo.ThreadNetworkName, data, sizeof(networkInfo.ThreadNetworkName)); - data += sizeof(networkInfo.ThreadNetworkName); - bufferLen -= sizeof(networkInfo.ThreadNetworkName); - - VerifyOrExit(bufferLen >= sizeof(networkInfo.ThreadExtendedPANId), - ChipLogProgress(AppServer, "Invalid network provision message")); - memcpy(networkInfo.ThreadExtendedPANId, data, sizeof(networkInfo.ThreadExtendedPANId)); - data += sizeof(networkInfo.ThreadExtendedPANId); - bufferLen -= sizeof(networkInfo.ThreadExtendedPANId); - - VerifyOrExit(bufferLen >= sizeof(networkInfo.ThreadMeshPrefix), - ChipLogProgress(AppServer, "Invalid network provision message")); - memcpy(networkInfo.ThreadMeshPrefix, data, sizeof(networkInfo.ThreadMeshPrefix)); - data += sizeof(networkInfo.ThreadMeshPrefix); - bufferLen -= sizeof(networkInfo.ThreadMeshPrefix); - - VerifyOrExit(bufferLen >= sizeof(networkInfo.ThreadMasterKey), ChipLogProgress(AppServer, "Invalid network provision message")); - memcpy(networkInfo.ThreadMasterKey, data, sizeof(networkInfo.ThreadMasterKey)); - data += sizeof(networkInfo.ThreadMasterKey); - bufferLen -= sizeof(networkInfo.ThreadMasterKey); - - VerifyOrExit(bufferLen >= sizeof(networkInfo.ThreadPSKc), ChipLogProgress(AppServer, "Invalid network provision message")); - memcpy(networkInfo.ThreadPSKc, data, sizeof(networkInfo.ThreadPSKc)); - data += sizeof(networkInfo.ThreadPSKc); - bufferLen -= sizeof(networkInfo.ThreadPSKc); - - VerifyOrExit(bufferLen >= sizeof(networkInfo.ThreadPANId), ChipLogProgress(AppServer, "Invalid network provision message")); - networkInfo.ThreadPANId = data[0] | (data[1] << 8); - data += sizeof(networkInfo.ThreadPANId); - bufferLen -= sizeof(networkInfo.ThreadPANId); - - VerifyOrExit(bufferLen >= sizeof(networkInfo.ThreadChannel), ChipLogProgress(AppServer, "Invalid network provision message")); - networkInfo.ThreadChannel = data[0]; - data += sizeof(networkInfo.ThreadChannel); - bufferLen -= sizeof(networkInfo.ThreadChannel); - - VerifyOrExit(bufferLen >= 3, ChipLogProgress(AppServer, "Invalid network provision message")); - networkInfo.FieldPresent.ThreadExtendedPANId = *data; - data++; - networkInfo.FieldPresent.ThreadMeshPrefix = *data; - data++; - networkInfo.FieldPresent.ThreadPSKc = *data; - data++; - networkInfo.NetworkId = 0; - networkInfo.FieldPresent.NetworkId = true; - - ThreadStackMgr().SetThreadEnabled(false); - ThreadStackMgr().SetThreadProvision(networkInfo); - ThreadStackMgr().SetThreadEnabled(true); - -#endif -exit: chip::System::PacketBuffer::Free(buffer); } diff --git a/examples/common/chip-app-server/include/RendezvousServer.h b/examples/common/chip-app-server/include/RendezvousServer.h index ce19810a6d6525..bb386facecc591 100644 --- a/examples/common/chip-app-server/include/RendezvousServer.h +++ b/examples/common/chip-app-server/include/RendezvousServer.h @@ -22,6 +22,11 @@ namespace chip { +class AccesoryNetworkProvisioningDelegate : public DeviceNetworkProvisioningDelegate +{ + void ProvisionThread(const DeviceLayer::Internal::DeviceNetworkInfo & threadData) override; +}; + class RendezvousServer : public RendezvousSessionDelegate { public: @@ -36,6 +41,7 @@ class RendezvousServer : public RendezvousSessionDelegate void OnRendezvousStatusUpdate(Status status, CHIP_ERROR err) override; private: + AccesoryNetworkProvisioningDelegate mNetworkProvisioningDelegate; RendezvousSession mRendezvousSession; }; diff --git a/src/transport/NetworkProvisioning.cpp b/src/transport/NetworkProvisioning.cpp index 505bbdad14641d..79b2c976e07c84 100644 --- a/src/transport/NetworkProvisioning.cpp +++ b/src/transport/NetworkProvisioning.cpp @@ -35,9 +35,6 @@ void NetworkProvisioning::Init(NetworkProvisioningDelegate * delegate, DeviceNet if (deviceDelegate != nullptr) { mDeviceDelegate = deviceDelegate; -#if CONFIG_DEVICE_LAYER - DeviceLayer::PlatformMgr().AddEventHandler(ConnectivityHandler, reinterpret_cast(this)); -#endif } } @@ -67,7 +64,7 @@ CHIP_ERROR NetworkProvisioning::HandleNetworkProvisioningMessage(uint8_t msgType size_t len = msgBuf->DataLength(); size_t offset = 0; - ChipLogProgress(NetworkProvisioning, "Received kWiFiAssociationRequest. DeviceDelegate %p\n", mDeviceDelegate); + ChipLogProgress(NetworkProvisioning, "Received kWiFiAssociationRequest. DeviceDelegate %p", mDeviceDelegate); VerifyOrExit(mDeviceDelegate != nullptr, err = CHIP_ERROR_INCORRECT_STATE); @@ -77,13 +74,23 @@ CHIP_ERROR NetworkProvisioning::HandleNetworkProvisioningMessage(uint8_t msgType err = DecodeString(&buffer[offset], len - offset, bbufPW, offset); // TODO: Check for the error once network provisioning is moved to delegate calls - mDeviceDelegate->ProvisionNetwork(SSID, passwd); +#if CONFIG_DEVICE_LAYER + // Start listening for Internet connectivity changes to be able to respond with assigned IP Address + DeviceLayer::PlatformMgr().AddEventHandler(ConnectivityHandler, reinterpret_cast(this)); +#endif + + mDeviceDelegate->ProvisionWiFi(SSID, passwd); err = CHIP_NO_ERROR; } break; + case NetworkProvisioning::MsgTypes::kThreadAssociationRequest: + ChipLogProgress(NetworkProvisioning, "Received kThreadAssociationRequest"); + err = DecodeThreadAssociationRequest(msgBuf); + break; + case NetworkProvisioning::MsgTypes::kIPAddressAssigned: { - ChipLogProgress(NetworkProvisioning, "Received kIPAddressAssigned\n"); + ChipLogProgress(NetworkProvisioning, "Received kIPAddressAssigned"); if (!Inet::IPAddress::FromString(Uint8::to_const_char(msgBuf->Start()), msgBuf->DataLength(), mDeviceAddress)) { ExitNow(err = CHIP_ERROR_INVALID_ADDRESS); @@ -207,18 +214,107 @@ CHIP_ERROR NetworkProvisioning::SendNetworkCredentials(const char * ssid, const return err; } +#ifdef CHIP_ENABLE_OPENTHREAD +CHIP_ERROR NetworkProvisioning::DecodeThreadAssociationRequest(System::PacketBuffer * msgBuf) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + DeviceLayer::Internal::DeviceNetworkInfo networkInfo = {}; + uint8_t * data = msgBuf->Start(); + size_t dataLen = msgBuf->DataLength(); + + VerifyOrExit(mDeviceDelegate != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + + VerifyOrExit(dataLen >= sizeof(networkInfo.ThreadNetworkName), + ChipLogProgress(NetworkProvisioning, "Invalid network provision message")); + memcpy(networkInfo.ThreadNetworkName, data, sizeof(networkInfo.ThreadNetworkName)); + data += sizeof(networkInfo.ThreadNetworkName); + dataLen -= sizeof(networkInfo.ThreadNetworkName); + + VerifyOrExit(dataLen >= sizeof(networkInfo.ThreadExtendedPANId), + ChipLogProgress(NetworkProvisioning, "Invalid network provision message")); + memcpy(networkInfo.ThreadExtendedPANId, data, sizeof(networkInfo.ThreadExtendedPANId)); + data += sizeof(networkInfo.ThreadExtendedPANId); + dataLen -= sizeof(networkInfo.ThreadExtendedPANId); + + VerifyOrExit(dataLen >= sizeof(networkInfo.ThreadMeshPrefix), + ChipLogProgress(NetworkProvisioning, "Invalid network provision message")); + memcpy(networkInfo.ThreadMeshPrefix, data, sizeof(networkInfo.ThreadMeshPrefix)); + data += sizeof(networkInfo.ThreadMeshPrefix); + dataLen -= sizeof(networkInfo.ThreadMeshPrefix); + + VerifyOrExit(dataLen >= sizeof(networkInfo.ThreadNetworkKey), + ChipLogProgress(NetworkProvisioning, "Invalid network provision message")); + memcpy(networkInfo.ThreadNetworkKey, data, sizeof(networkInfo.ThreadNetworkKey)); + data += sizeof(networkInfo.ThreadNetworkKey); + dataLen -= sizeof(networkInfo.ThreadNetworkKey); + + VerifyOrExit(dataLen >= sizeof(networkInfo.ThreadPSKc), + ChipLogProgress(NetworkProvisioning, "Invalid network provision message")); + memcpy(networkInfo.ThreadPSKc, data, sizeof(networkInfo.ThreadPSKc)); + data += sizeof(networkInfo.ThreadPSKc); + dataLen -= sizeof(networkInfo.ThreadPSKc); + + VerifyOrExit(dataLen >= sizeof(networkInfo.ThreadPANId), + ChipLogProgress(NetworkProvisioning, "Invalid network provision message")); + networkInfo.ThreadPANId = Encoding::LittleEndian::Get16(data); + data += sizeof(networkInfo.ThreadPANId); + dataLen -= sizeof(networkInfo.ThreadPANId); + + VerifyOrExit(dataLen >= sizeof(networkInfo.ThreadChannel), + ChipLogProgress(NetworkProvisioning, "Invalid network provision message")); + networkInfo.ThreadChannel = data[0]; + data += sizeof(networkInfo.ThreadChannel); + dataLen -= sizeof(networkInfo.ThreadChannel); + + VerifyOrExit(dataLen >= 3, ChipLogProgress(NetworkProvisioning, "Invalid network provision message")); + networkInfo.FieldPresent.ThreadExtendedPANId = *data; + data++; + networkInfo.FieldPresent.ThreadMeshPrefix = *data; + data++; + networkInfo.FieldPresent.ThreadPSKc = *data; + data++; + networkInfo.NetworkId = 0; + networkInfo.FieldPresent.NetworkId = true; + +#if CONFIG_DEVICE_LAYER + // Start listening for OpenThread changes to be able to respond with SLAAC/On-Mesh IP Address + DeviceLayer::PlatformMgr().AddEventHandler(ConnectivityHandler, reinterpret_cast(this)); +#endif + + mDeviceDelegate->ProvisionThread(networkInfo); +exit: + return err; +} +#else // CHIP_ENABLE_OPENTHREAD +CHIP_ERROR NetworkProvisioning::DecodeThreadAssociationRequest(System::PacketBuffer *) +{ + return CHIP_ERROR_INVALID_MESSAGE_TYPE; +} +#endif // CHIP_ENABLE_OPENTHREAD + #if CONFIG_DEVICE_LAYER void NetworkProvisioning::ConnectivityHandler(const DeviceLayer::ChipDeviceEvent * event, intptr_t arg) { NetworkProvisioning * session = reinterpret_cast(arg); VerifyOrExit(session != nullptr, /**/); - VerifyOrExit(event->Type == DeviceLayer::DeviceEventType::kInternetConnectivityChange, /**/); - VerifyOrExit(event->InternetConnectivityChange.IPv4 == DeviceLayer::kConnectivity_Established, /**/); - Inet::IPAddress addr; - Inet::IPAddress::FromString(event->InternetConnectivityChange.address, addr); - (void) session->SendIPAddress(addr); + if (event->Type == DeviceLayer::DeviceEventType::kInternetConnectivityChange && + event->InternetConnectivityChange.IPv4 == DeviceLayer::kConnectivity_Established) + { + Inet::IPAddress addr; + Inet::IPAddress::FromString(event->InternetConnectivityChange.address, addr); + (void) session->SendIPAddress(addr); + } + +#if CHIP_DEVICE_CONFIG_ENABLE_THREAD + if (event->Type == DeviceLayer::DeviceEventType::kThreadStateChange && event->ThreadStateChange.AddressChanged) + { + Inet::IPAddress addr; + SuccessOrExit(DeviceLayer::ThreadStackMgr().GetSlaacIPv6Address(addr)); + (void) session->SendIPAddress(addr); + } +#endif exit: return; diff --git a/src/transport/NetworkProvisioning.h b/src/transport/NetworkProvisioning.h index a954559d9fd44e..7967d29868572f 100644 --- a/src/transport/NetworkProvisioning.h +++ b/src/transport/NetworkProvisioning.h @@ -24,6 +24,7 @@ #pragma once #include +#include #include #include #include @@ -45,7 +46,15 @@ class DLL_EXPORT DeviceNetworkProvisioningDelegate * @param ssid WiFi SSID * @param passwd WiFi password */ - virtual void ProvisionNetwork(const char * ssid, const char * passwd) {} + virtual void ProvisionWiFi(const char * ssid, const char * passwd) {} + + /** + * @brief + * Called to provision Thread credentials in a device + * + * @param threadData Thread settings and credentials + */ + virtual void ProvisionThread(const DeviceLayer::Internal::DeviceNetworkInfo & threadData) {} virtual ~DeviceNetworkProvisioningDelegate() {} }; @@ -89,8 +98,9 @@ class DLL_EXPORT NetworkProvisioning public: enum MsgTypes : uint8_t { - kWiFiAssociationRequest = 0, - kIPAddressAssigned = 1, + kWiFiAssociationRequest = 0, + kIPAddressAssigned = 1, + kThreadAssociationRequest = 2 }; void Init(NetworkProvisioningDelegate * delegate, DeviceNetworkProvisioningDelegate * deviceDelegate); @@ -129,6 +139,8 @@ class DLL_EXPORT NetworkProvisioning CHIP_ERROR EncodeString(const char * str, BufBound & bbuf); CHIP_ERROR DecodeString(const uint8_t * input, size_t input_len, BufBound & bbuf, size_t & consumed); + CHIP_ERROR DecodeThreadAssociationRequest(System::PacketBuffer * msgBuf); + #if CONFIG_DEVICE_LAYER static void ConnectivityHandler(const DeviceLayer::ChipDeviceEvent * event, intptr_t arg); #endif // CONFIG_DEVICE_LAYER From 620025723cfccb57355fe655af9584798a1b24ee Mon Sep 17 00:00:00 2001 From: Damian Krolik Date: Mon, 19 Oct 2020 12:33:11 +0200 Subject: [PATCH 3/7] [nrfconnect] Initialize memory allocator More and more CHIP components rely on CHIP memory allocator. Also PlatformManager::AddEventHandler() used in this PR needs dynamic memory allocation. Run MemoryInit() on the app startup. --- examples/lighting-app/nrfconnect/main/main.cpp | 8 ++++++++ examples/lock-app/nrfconnect/main/main.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/examples/lighting-app/nrfconnect/main/main.cpp b/examples/lighting-app/nrfconnect/main/main.cpp index d440e3c902039f..ce40b2daec3a26 100644 --- a/examples/lighting-app/nrfconnect/main/main.cpp +++ b/examples/lighting-app/nrfconnect/main/main.cpp @@ -19,6 +19,7 @@ #include "AppTask.h" #include +#include #include @@ -34,6 +35,13 @@ int main(void) k_thread_priority_set(k_current_get(), K_PRIO_COOP(CONFIG_NUM_COOP_PRIORITIES - 1)); + ret = chip::Platform::MemoryInit(); + if (ret != CHIP_NO_ERROR) + { + LOG_ERR("Platform::MemoryInit() failed"); + goto exit; + } + LOG_INF("Init CHIP stack"); ret = PlatformMgr().InitChipStack(); if (ret != CHIP_NO_ERROR) diff --git a/examples/lock-app/nrfconnect/main/main.cpp b/examples/lock-app/nrfconnect/main/main.cpp index 4086d6462812be..403bd8de1445e4 100644 --- a/examples/lock-app/nrfconnect/main/main.cpp +++ b/examples/lock-app/nrfconnect/main/main.cpp @@ -22,6 +22,7 @@ #include #include +#include LOG_MODULE_REGISTER(app); @@ -35,6 +36,13 @@ int main() k_thread_priority_set(k_current_get(), K_PRIO_COOP(CONFIG_NUM_COOP_PRIORITIES - 1)); + ret = chip::Platform::MemoryInit(); + if (ret != CHIP_NO_ERROR) + { + LOG_ERR("Platform::MemoryInit() failed"); + goto exit; + } + LOG_INF("Init CHIP stack"); ret = PlatformMgr().InitChipStack(); if (ret != CHIP_NO_ERROR) From 59597933344eb37033b10eebe81ed4f4feb1a367 Mon Sep 17 00:00:00 2001 From: Damian Krolik Date: Mon, 19 Oct 2020 12:46:35 +0200 Subject: [PATCH 4/7] [esp32] Fix build --- .../server/esp32/main/DeviceNetworkProvisioningDelegate.cpp | 2 +- .../esp32/main/include/DeviceNetworkProvisioningDelegate.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/wifi-echo/server/esp32/main/DeviceNetworkProvisioningDelegate.cpp b/examples/wifi-echo/server/esp32/main/DeviceNetworkProvisioningDelegate.cpp index 38fc55b21121c6..ed257860b526d5 100644 --- a/examples/wifi-echo/server/esp32/main/DeviceNetworkProvisioningDelegate.cpp +++ b/examples/wifi-echo/server/esp32/main/DeviceNetworkProvisioningDelegate.cpp @@ -22,7 +22,7 @@ using namespace ::chip; -void ESP32NetworkProvisioningDelegate::ProvisionNetwork(const char * ssid, const char * key) +void ESP32NetworkProvisioningDelegate::ProvisionWiFi(const char * ssid, const char * key) { ChipLogProgress(NetworkProvisioning, "ESP32NetworkProvisioningDelegate: SSID: %s, key: %s", ssid, key); SetWiFiStationProvisioning(ssid, key); diff --git a/examples/wifi-echo/server/esp32/main/include/DeviceNetworkProvisioningDelegate.h b/examples/wifi-echo/server/esp32/main/include/DeviceNetworkProvisioningDelegate.h index 3f09d08751f4d6..f0a9ec4895d439 100644 --- a/examples/wifi-echo/server/esp32/main/include/DeviceNetworkProvisioningDelegate.h +++ b/examples/wifi-echo/server/esp32/main/include/DeviceNetworkProvisioningDelegate.h @@ -32,5 +32,5 @@ class ESP32NetworkProvisioningDelegate : public DeviceNetworkProvisioningDelegat * @param ssid WiFi SSID * @param passwd WiFi password */ - void ProvisionNetwork(const char * ssid, const char * passwd) override; + void ProvisionWiFi(const char * ssid, const char * passwd) override; }; From 2bbfbda5ea2e9430470f46dd6ea8902029b03d0e Mon Sep 17 00:00:00 2001 From: Damian Krolik Date: Mon, 19 Oct 2020 18:40:15 +0200 Subject: [PATCH 5/7] Fix typo and use more accurate error code --- examples/common/chip-app-server/RendezvousServer.cpp | 2 +- examples/common/chip-app-server/include/RendezvousServer.h | 4 ++-- .../OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/common/chip-app-server/RendezvousServer.cpp b/examples/common/chip-app-server/RendezvousServer.cpp index bddb2df09f730f..76de08e2cfdc42 100644 --- a/examples/common/chip-app-server/RendezvousServer.cpp +++ b/examples/common/chip-app-server/RendezvousServer.cpp @@ -33,7 +33,7 @@ using namespace ::chip::DeviceLayer; namespace chip { -void AccesoryNetworkProvisioningDelegate::ProvisionThread(const DeviceLayer::Internal::DeviceNetworkInfo & threadData) +void AccessoryNetworkProvisioningDelegate::ProvisionThread(const DeviceLayer::Internal::DeviceNetworkInfo & threadData) { #if CHIP_ENABLE_OPENTHREAD ThreadStackMgr().SetThreadEnabled(false); diff --git a/examples/common/chip-app-server/include/RendezvousServer.h b/examples/common/chip-app-server/include/RendezvousServer.h index bb386facecc591..a46aa61c1043f6 100644 --- a/examples/common/chip-app-server/include/RendezvousServer.h +++ b/examples/common/chip-app-server/include/RendezvousServer.h @@ -22,7 +22,7 @@ namespace chip { -class AccesoryNetworkProvisioningDelegate : public DeviceNetworkProvisioningDelegate +class AccessoryNetworkProvisioningDelegate : public DeviceNetworkProvisioningDelegate { void ProvisionThread(const DeviceLayer::Internal::DeviceNetworkInfo & threadData) override; }; @@ -41,7 +41,7 @@ class RendezvousServer : public RendezvousSessionDelegate void OnRendezvousStatusUpdate(Status status, CHIP_ERROR err) override; private: - AccesoryNetworkProvisioningDelegate mNetworkProvisioningDelegate; + AccessoryNetworkProvisioningDelegate mNetworkProvisioningDelegate; RendezvousSession mRendezvousSession; }; diff --git a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp index 70d16b09b35a43..e869b83ac1ae47 100644 --- a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp +++ b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp @@ -783,7 +783,7 @@ CHIP_ERROR GenericThreadStackManagerImpl_OpenThread::_GetSlaacIPv6Add } } - return CHIP_ERROR_INCORRECT_STATE; + return CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND; } template From 20bce109ccab4ac2f83305c39a68a7c3fb3ecaca Mon Sep 17 00:00:00 2001 From: Damian Krolik Date: Tue, 20 Oct 2020 08:53:45 +0200 Subject: [PATCH 6/7] Let RendezvousServer implement DeviceNetworkProvisioningDelegate --- .../chip-app-server/RendezvousServer.cpp | 20 +++++++++---------- .../include/RendezvousServer.h | 14 ++++++------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/examples/common/chip-app-server/RendezvousServer.cpp b/examples/common/chip-app-server/RendezvousServer.cpp index 76de08e2cfdc42..bb6f8e7043a108 100644 --- a/examples/common/chip-app-server/RendezvousServer.cpp +++ b/examples/common/chip-app-server/RendezvousServer.cpp @@ -33,16 +33,7 @@ using namespace ::chip::DeviceLayer; namespace chip { -void AccessoryNetworkProvisioningDelegate::ProvisionThread(const DeviceLayer::Internal::DeviceNetworkInfo & threadData) -{ -#if CHIP_ENABLE_OPENTHREAD - ThreadStackMgr().SetThreadEnabled(false); - ThreadStackMgr().SetThreadProvision(threadData); - ThreadStackMgr().SetThreadEnabled(true); -#endif // CHIP_ENABLE_OPENTHREAD -} - -RendezvousServer::RendezvousServer() : mRendezvousSession(this, &mNetworkProvisioningDelegate) {} +RendezvousServer::RendezvousServer() : mRendezvousSession(this, this) {} CHIP_ERROR RendezvousServer::Init(const RendezvousParameters & params) { @@ -90,4 +81,13 @@ void RendezvousServer::OnRendezvousStatusUpdate(Status status, CHIP_ERROR err) return; } +void RendezvousServer::ProvisionThread(const DeviceLayer::Internal::DeviceNetworkInfo & threadData) +{ +#if CHIP_ENABLE_OPENTHREAD + ThreadStackMgr().SetThreadEnabled(false); + ThreadStackMgr().SetThreadProvision(threadData); + ThreadStackMgr().SetThreadEnabled(true); +#endif // CHIP_ENABLE_OPENTHREAD +} + } // namespace chip diff --git a/examples/common/chip-app-server/include/RendezvousServer.h b/examples/common/chip-app-server/include/RendezvousServer.h index a46aa61c1043f6..1c2e0538b09694 100644 --- a/examples/common/chip-app-server/include/RendezvousServer.h +++ b/examples/common/chip-app-server/include/RendezvousServer.h @@ -22,26 +22,26 @@ namespace chip { -class AccessoryNetworkProvisioningDelegate : public DeviceNetworkProvisioningDelegate -{ - void ProvisionThread(const DeviceLayer::Internal::DeviceNetworkInfo & threadData) override; -}; - -class RendezvousServer : public RendezvousSessionDelegate +class RendezvousServer : public RendezvousSessionDelegate, public DeviceNetworkProvisioningDelegate { public: RendezvousServer(); CHIP_ERROR Init(const RendezvousParameters & params); + //////////////// RendezvousSessionDelegate Implementation /////////////////// + void OnRendezvousConnectionOpened() override; void OnRendezvousConnectionClosed() override; void OnRendezvousError(CHIP_ERROR err) override; void OnRendezvousMessageReceived(System::PacketBuffer * buffer) override; void OnRendezvousStatusUpdate(Status status, CHIP_ERROR err) override; + //////////// DeviceNetworkProvisioningDelegate Implementation /////////////// + + void ProvisionThread(const DeviceLayer::Internal::DeviceNetworkInfo & threadData) override; + private: - AccessoryNetworkProvisioningDelegate mNetworkProvisioningDelegate; RendezvousSession mRendezvousSession; }; From bf4739ecbdd4d6056b3c3e412452634fb712dc1d Mon Sep 17 00:00:00 2001 From: Damian Krolik Date: Thu, 22 Oct 2020 08:52:17 +0200 Subject: [PATCH 7/7] Fix after rebase --- src/transport/NetworkProvisioning.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/transport/NetworkProvisioning.cpp b/src/transport/NetworkProvisioning.cpp index 79b2c976e07c84..888a3cf411319d 100644 --- a/src/transport/NetworkProvisioning.cpp +++ b/src/transport/NetworkProvisioning.cpp @@ -242,11 +242,11 @@ CHIP_ERROR NetworkProvisioning::DecodeThreadAssociationRequest(System::PacketBuf data += sizeof(networkInfo.ThreadMeshPrefix); dataLen -= sizeof(networkInfo.ThreadMeshPrefix); - VerifyOrExit(dataLen >= sizeof(networkInfo.ThreadNetworkKey), + VerifyOrExit(dataLen >= sizeof(networkInfo.ThreadMasterKey), ChipLogProgress(NetworkProvisioning, "Invalid network provision message")); - memcpy(networkInfo.ThreadNetworkKey, data, sizeof(networkInfo.ThreadNetworkKey)); - data += sizeof(networkInfo.ThreadNetworkKey); - dataLen -= sizeof(networkInfo.ThreadNetworkKey); + memcpy(networkInfo.ThreadMasterKey, data, sizeof(networkInfo.ThreadMasterKey)); + data += sizeof(networkInfo.ThreadMasterKey); + dataLen -= sizeof(networkInfo.ThreadMasterKey); VerifyOrExit(dataLen >= sizeof(networkInfo.ThreadPSKc), ChipLogProgress(NetworkProvisioning, "Invalid network provision message"));