From 54500028c16d35d80e0d7fce734915c317f4ad36 Mon Sep 17 00:00:00 2001 From: Jean-Francois Penven <67962328+jepenven-silabs@users.noreply.github.com> Date: Fri, 22 Apr 2022 14:53:57 -0400 Subject: [PATCH] [Inet] Fix Interface Address Iterator OpenThread (#17648) * Fix Interface Address Iterator OpenThread * Apply PR comments --- src/inet/InetInterface.cpp | 28 ++++++++++++++++++++++---- src/inet/InetInterface.h | 6 ++---- src/inet/UDPEndPointImplOpenThread.cpp | 8 ++++++++ src/inet/UDPEndPointImplOpenThread.h | 4 +++- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/inet/InetInterface.cpp b/src/inet/InetInterface.cpp index e6125a14508066..5d0eb3aa94243f 100644 --- a/src/inet/InetInterface.cpp +++ b/src/inet/InetInterface.cpp @@ -57,6 +57,10 @@ #include #endif // CHIP_SYSTEM_CONFIG_USE_ZEPHYR_NET_IF +#if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT +#include +#endif + #include #include @@ -105,15 +109,31 @@ bool InterfaceIterator::Next() // TODO : Cleanup #17346 return false; } + +InterfaceAddressIterator::InterfaceAddressIterator() +{ + mNetifAddrList = nullptr; + mCurAddr = nullptr; +} + bool InterfaceAddressIterator::HasCurrent() { - return mIntfIter.HasCurrent(); + return (mNetifAddrList != nullptr) ? (mCurAddr != nullptr) : Next(); } bool InterfaceAddressIterator::Next() { - // TODO : Cleanup #17346 - return false; + if (mNetifAddrList == nullptr) + { + mNetifAddrList = otIp6GetUnicastAddresses(Inet::globalOtInstance); + mCurAddr = mNetifAddrList; + } + else if (mCurAddr != nullptr) + { + mCurAddr = mCurAddr->mNext; + } + + return (mCurAddr != nullptr); } CHIP_ERROR InterfaceAddressIterator::GetAddress(IPAddress & outIPAddress) { @@ -122,7 +142,7 @@ CHIP_ERROR InterfaceAddressIterator::GetAddress(IPAddress & outIPAddress) return CHIP_ERROR_SENTINEL; } - outIPAddress = IPAddress((*(mAddrInfoList[mCurAddrIndex].mAddress))); + outIPAddress = IPAddress(mCurAddr->mAddress); return CHIP_NO_ERROR; } diff --git a/src/inet/InetInterface.h b/src/inet/InetInterface.h index e0a3ac1aaba725..d87c1080b89e6c 100644 --- a/src/inet/InetInterface.h +++ b/src/inet/InetInterface.h @@ -540,15 +540,13 @@ class DLL_EXPORT InterfaceAddressIterator int mCurAddrIndex = -1; #endif // CHIP_SYSTEM_CONFIG_USE_ZEPHYR_NET_IF #if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT - otIp6AddressInfo * mAddrInfoList; - int mCurAddrIndex; - InterfaceIterator mIntfIter; + const otNetifAddress * mNetifAddrList; + const otNetifAddress * mCurAddr; #endif // #if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT }; #if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT inline InterfaceIterator::InterfaceIterator(void) {} -inline InterfaceAddressIterator::InterfaceAddressIterator(void) {} inline InterfaceIterator::~InterfaceIterator() = default; inline InterfaceAddressIterator::~InterfaceAddressIterator() = default; inline bool InterfaceIterator::HasCurrent(void) diff --git a/src/inet/UDPEndPointImplOpenThread.cpp b/src/inet/UDPEndPointImplOpenThread.cpp index 2887f2f0997b21..5fe066cfb3dcf7 100644 --- a/src/inet/UDPEndPointImplOpenThread.cpp +++ b/src/inet/UDPEndPointImplOpenThread.cpp @@ -30,6 +30,8 @@ namespace chip { namespace Inet { +otInstance * globalOtInstance; + void UDPEndPointImplOT::handleUdpReceive(void * aContext, otMessage * aMessage, const otMessageInfo * aMessageInfo) { UDPEndPointImplOT * ep = static_cast(aContext); @@ -169,6 +171,12 @@ void UDPEndPointImplOT::HandleDataReceived(System::PacketBufferHandle && msg) } } +void UDPEndPointImplOT::SetNativeParams(void * params) +{ + mOTInstance = static_cast(params); + globalOtInstance = mOTInstance; +} + CHIP_ERROR UDPEndPointImplOT::SetMulticastLoopback(IPVersion aIPVersion, bool aLoopback) { (void) aIPVersion; diff --git a/src/inet/UDPEndPointImplOpenThread.h b/src/inet/UDPEndPointImplOpenThread.h index f1ad4eaf0451fc..b566c4187695d3 100644 --- a/src/inet/UDPEndPointImplOpenThread.h +++ b/src/inet/UDPEndPointImplOpenThread.h @@ -32,6 +32,8 @@ namespace chip { namespace Inet { +extern otInstance * globalOtInstance; + class UDPEndPointImplOT : public UDPEndPoint, public EndPointStateOpenThread { public: @@ -44,7 +46,7 @@ class UDPEndPointImplOT : public UDPEndPoint, public EndPointStateOpenThread uint16_t GetBoundPort() const override; void Free() override; void HandleDataReceived(System::PacketBufferHandle && msg); - inline void SetNativeParams(void * params) { mOTInstance = static_cast(params); } + void SetNativeParams(void * params); CHIP_ERROR SetMulticastLoopback(IPVersion aIPVersion, bool aLoopback) override; CHIP_ERROR BindInterfaceImpl(IPAddressType addressType, InterfaceId interfaceId) override;