From 402103a25ab72eade67316849469def3141ee32d Mon Sep 17 00:00:00 2001 From: chbansal Date: Mon, 15 Jul 2024 10:32:13 +0530 Subject: [PATCH 01/15] adding the Queue filter to filter non matter mdns packets --- src/platform/silabs/ConnectivityManagerImpl.h | 4 + .../silabs/ConnectivityManagerImpl_WIFI.cpp | 11 ++ src/platform/silabs/EndpointQueueFilter.cpp | 143 ++++++++++++++++++ src/platform/silabs/EndpointQueueFilter.h | 85 +++++++++++ src/platform/silabs/SiWx917/BUILD.gn | 2 + src/platform/silabs/efr32/BUILD.gn | 1 + 6 files changed, 246 insertions(+) create mode 100644 src/platform/silabs/EndpointQueueFilter.cpp create mode 100644 src/platform/silabs/EndpointQueueFilter.h diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index 54a6b97c5e5fa1..fbad91ecf3a66d 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -37,6 +37,7 @@ #endif #if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION #include +#include "EndpointQueueFilter.h" #else #include #endif @@ -132,6 +133,9 @@ class ConnectivityManagerImpl final : public ConnectivityManager, void UpdateInternetConnectivityState(void); #endif +#ifdef SL_WIFI + Inet::Silabs::EndpointQueueFilter mEndpointQueueFilter; +#endif }; inline bool ConnectivityManagerImpl::_HaveIPv4InternetConnectivity(void) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 0d9d63317ef637..7f3698c3c1607d 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -41,6 +41,7 @@ #include "CHIPDevicePlatformConfig.h" #include +#include "EndpointQueueFilter.h" using namespace ::chip; using namespace ::chip::Inet; @@ -52,6 +53,7 @@ namespace DeviceLayer { ConnectivityManagerImpl ConnectivityManagerImpl::sInstance; + CHIP_ERROR ConnectivityManagerImpl::_Init() { CHIP_ERROR err; @@ -426,6 +428,15 @@ void ConnectivityManagerImpl::UpdateInternetConnectivityState(void) event.InternetConnectivityChange.IPv6 = GetConnectivityChange(hadIPv6Conn, haveIPv6Conn); event.InternetConnectivityChange.ipAddress = addr; + { + sl_wfx_mac_address_t macaddr; + wfx_get_wifi_mac_addr(SL_WFX_STA_INTERFACE, &macaddr); + mEndpointQueueFilter.SetMacAddr(ByteSpan(macaddr.octet)); + chip::Inet::UDPEndPointImpl::SetQueueFilter(&mEndpointQueueFilter); + } + + (void) PlatformMgr().PostEvent(&event); + if (haveIPv4Conn != hadIPv4Conn) { ChipLogProgress(DeviceLayer, "%s Internet connectivity %s", "IPv4", (haveIPv4Conn) ? "ESTABLISHED" : "LOST"); diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp new file mode 100644 index 00000000000000..d938fa5392f5a4 --- /dev/null +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -0,0 +1,143 @@ +#include "EndpointQueueFilter.h" +#include +#include +#include + +namespace chip { +namespace Inet { + +using FilterOutcome = EndpointQueueFilter::FilterOutcome; +using namespace chip::Logging; + +namespace { + +bool IsValidMdnsHostName(const chip::CharSpan & hostName) +{ + for (size_t i = 0; i < hostName.size(); ++i) + { + char ch_data = *(hostName.data() + i); + if (!((ch_data >= '0' && ch_data <= '9') || (ch_data >= 'A' && ch_data <= 'F'))) + { + return false; + } + } + return true; +} + +bool PayloadContains(const chip::System::PacketBufferHandle & payload, const chip::ByteSpan & byteSpan) +{ + if (payload->HasChainedBuffer() || payload->TotalLength() < byteSpan.size()) + { + return false; + } + for (size_t i = 0; i <= payload->TotalLength() - byteSpan.size(); ++i) + { + if (memcmp(payload->Start() + i, byteSpan.data(), byteSpan.size()) == 0) + { + return true; + } + } + return false; +} + +bool PayloadContainsCaseInsensitive(const chip::System::PacketBufferHandle & payload, const ByteSpan & name) +{ + ReturnErrorCodeIf(name.size() < HostNameFilter::kHostNameLengthMax, false); + + uint8_t lower_case[HostNameFilter::kHostNameLengthMax]; + memcpy(lower_case, name.data(), name.size()); + for (size_t i = 0; i < sizeof(lower_case); ++i) + { + if (lower_case[i] <= 'F' && lower_case[i] >= 'A') + { + lower_case[i] = static_cast('a' + lower_case[i] - 'A'); + } + } + return PayloadContains(payload, name) || PayloadContains(payload, ByteSpan(lower_case)); +} + +} // namespace + + +FilterOutcome MdnsBroadcastFilter::Filter(const void * endpoint, const IPPacketInfo & pktInfo, + const chip::System::PacketBufferHandle & pktPayload) +{ + if (pktInfo.DestPort == kMdnsPort) + { +#if INET_CONFIG_ENABLE_IPV4 + ip_addr_t mdnsIPv4BroadcastAddr = IPADDR4_INIT_BYTES(224, 0, 0, 251); + if (pktInfo.DestAddress == chip::Inet::IPAddress(mdnsIPv4BroadcastAddr)) + { + return FilterOutcome::kAllowPacket; + } +#endif + ip_addr_t mdnsIPv6BroadcastAddr = IPADDR6_INIT_HOST(0xFF020000, 0, 0, 0xFB); + if (pktInfo.DestAddress == chip::Inet::IPAddress(mdnsIPv6BroadcastAddr)) + { + return FilterOutcome::kAllowPacket; + } + } + return FilterOutcome::kDropPacket; +} + + +FilterOutcome HostNameFilter::Filter(const void * endpoint, const IPPacketInfo & pktInfo, + const chip::System::PacketBufferHandle & pktPayload) +{ + // Drop the mDNS packets which don't contain 'matter' or ''. + const uint8_t matterBytes[] = { 'm', 'a', 't', 't', 'e', 'r' }; + if (PayloadContains(pktPayload, ByteSpan(matterBytes)) || PayloadContainsCaseInsensitive(pktPayload, ByteSpan(mHostName))) + { + return FilterOutcome::kAllowPacket; + } + return FilterOutcome::kDropPacket; +} + + +CHIP_ERROR HostNameFilter::SetHostName(const chip::CharSpan & name) +{ + ReturnErrorCodeIf(name.size() != sizeof(mHostName), CHIP_ERROR_INVALID_ARGUMENT); + ReturnErrorCodeIf(!IsValidMdnsHostName(name), CHIP_ERROR_INVALID_ARGUMENT); + memcpy(mHostName, name.data(), name.size()); + return CHIP_NO_ERROR; +} + + +CHIP_ERROR HostNameFilter::SetMacAddr(const chip::ByteSpan & mac_addr) +{ + ReturnErrorCodeIf(mac_addr.size() < 6, CHIP_ERROR_INVALID_ARGUMENT); + const uint8_t *p = mac_addr.data(); + snprintf((char*)mHostName, sizeof(mHostName), "%02x%02x%02x%02x%02x%02x", p[0], p[1], p[2], p[3], p[4], p[5]); + return CHIP_NO_ERROR; +} + + +namespace Silabs { + +EndpointQueueFilter::EndpointQueueFilter() : + mTooManyFilter(kDefaultAllowedQueuedPackets) {} + +EndpointQueueFilter::EndpointQueueFilter(size_t maxAllowedQueuedPackets) : + mTooManyFilter(maxAllowedQueuedPackets) {} + + +FilterOutcome EndpointQueueFilter::FilterBeforeEnqueue(const void * endpoint, const IPPacketInfo & pktInfo, + const chip::System::PacketBufferHandle & pktPayload) +{ + ReturnErrorCodeIf(FilterOutcome::kDropPacket == mTooManyFilter.FilterBeforeEnqueue(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); + ReturnErrorCodeIf(FilterOutcome::kDropPacket == mMdnsFilter.Filter(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); + ReturnErrorCodeIf(FilterOutcome::kDropPacket == mHostNameFilter.Filter(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); + return FilterOutcome::kAllowPacket; +} + + +FilterOutcome EndpointQueueFilter::FilterAfterDequeue(const void * endpoint, const IPPacketInfo & pktInfo, + const chip::System::PacketBufferHandle & pktPayload) +{ + ReturnErrorCodeIf(FilterOutcome::kDropPacket == mTooManyFilter.FilterAfterDequeue(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); + return FilterOutcome::kAllowPacket; +} + +} // Silabs +} // Inet +} // chip diff --git a/src/platform/silabs/EndpointQueueFilter.h b/src/platform/silabs/EndpointQueueFilter.h new file mode 100644 index 00000000000000..f9b956b98d9eca --- /dev/null +++ b/src/platform/silabs/EndpointQueueFilter.h @@ -0,0 +1,85 @@ +/* + * + * Copyright (c) 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 + * + * 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. + */ + +#pragma once + +#include + +namespace chip { +namespace Inet { + +struct EndpointFilter +{ + virtual ~EndpointFilter() = default; + virtual EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, + const chip::System::PacketBufferHandle & pktPayload) = 0; +}; + + +struct MdnsBroadcastFilter : EndpointFilter +{ + static constexpr size_t kMdnsPort = 5353; + + EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, + const chip::System::PacketBufferHandle & pktPayload) override; +}; + + +struct HostNameFilter : EndpointFilter +{ + static constexpr size_t kHostNameLengthMax = 13; + + EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, + const chip::System::PacketBufferHandle & pktPayload) override; + + CHIP_ERROR SetHostName(const chip::CharSpan & name); + CHIP_ERROR SetMacAddr(const chip::ByteSpan & addr); +private: + uint8_t mHostName[kHostNameLengthMax] = { 0 }; +}; + + +namespace Silabs { + +class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter +{ +public: + static constexpr size_t kDefaultAllowedQueuedPackets = 10; + + EndpointQueueFilter(); + EndpointQueueFilter(size_t maxAllowedQueuedPackets); + + FilterOutcome FilterBeforeEnqueue(const void * endpoint, const IPPacketInfo & pktInfo, + const chip::System::PacketBufferHandle & pktPayload) override; + + FilterOutcome FilterAfterDequeue(const void * endpoint, const IPPacketInfo & pktInfo, + const chip::System::PacketBufferHandle & pktPayload); + + CHIP_ERROR SetMacAddr(const chip::ByteSpan & addr) + { + return mHostNameFilter.SetMacAddr(addr); + } + +private: + DropIfTooManyQueuedPacketsFilter mTooManyFilter; + MdnsBroadcastFilter mMdnsFilter; + HostNameFilter mHostNameFilter; +}; + +} // Silabs +} // Inet +} // chip diff --git a/src/platform/silabs/SiWx917/BUILD.gn b/src/platform/silabs/SiWx917/BUILD.gn index 826d8accd974d7..c9ba550275f7e8 100644 --- a/src/platform/silabs/SiWx917/BUILD.gn +++ b/src/platform/silabs/SiWx917/BUILD.gn @@ -52,6 +52,8 @@ static_library("SiWx917") { "${silabs_platform_dir}/ConnectivityManagerImpl_WIFI.cpp", "${silabs_platform_dir}/DiagnosticDataProviderImpl.cpp", "${silabs_platform_dir}/DiagnosticDataProviderImpl.h", + "${silabs_platform_dir}/EndpointQueueFilter.cpp", + "${silabs_platform_dir}/EndpointQueueFilter.h", "${silabs_platform_dir}/InetPlatformConfig.h", "${silabs_platform_dir}/KeyValueStoreManagerImpl.cpp", "${silabs_platform_dir}/KeyValueStoreManagerImpl.h", diff --git a/src/platform/silabs/efr32/BUILD.gn b/src/platform/silabs/efr32/BUILD.gn index f39628d4845726..69602185baf355 100644 --- a/src/platform/silabs/efr32/BUILD.gn +++ b/src/platform/silabs/efr32/BUILD.gn @@ -158,6 +158,7 @@ static_library("efr32") { if (chip_enable_wifi) { sources += [ "${silabs_platform_dir}/ConnectivityManagerImpl_WIFI.cpp", + "${silabs_platform_dir}/EndpointQueueFilter.cpp", "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.cpp", "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.h", ] From 84358173cd1f93d02205d3e3eaf37e08ef05f9e5 Mon Sep 17 00:00:00 2001 From: chbansal Date: Mon, 15 Jul 2024 20:25:27 +0530 Subject: [PATCH 02/15] renaming and fixing the mdns filter --- src/platform/silabs/ConnectivityManagerImpl.h | 2 +- src/platform/silabs/EndpointQueueFilter.cpp | 15 +++++++++------ src/platform/silabs/EndpointQueueFilter.h | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index fbad91ecf3a66d..739ba81b9c50c3 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -134,7 +134,7 @@ class ConnectivityManagerImpl final : public ConnectivityManager, void UpdateInternetConnectivityState(void); #endif #ifdef SL_WIFI - Inet::Silabs::EndpointQueueFilter mEndpointQueueFilter; + Inet::SilabsEndpointQueueFilter::EndpointQueueFilter mEndpointQueueFilter; #endif }; diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp index d938fa5392f5a4..ed0be9873842cd 100644 --- a/src/platform/silabs/EndpointQueueFilter.cpp +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -43,7 +43,6 @@ bool PayloadContains(const chip::System::PacketBufferHandle & payload, const chi bool PayloadContainsCaseInsensitive(const chip::System::PacketBufferHandle & payload, const ByteSpan & name) { ReturnErrorCodeIf(name.size() < HostNameFilter::kHostNameLengthMax, false); - uint8_t lower_case[HostNameFilter::kHostNameLengthMax]; memcpy(lower_case, name.data(), name.size()); for (size_t i = 0; i < sizeof(lower_case); ++i) @@ -112,7 +111,7 @@ CHIP_ERROR HostNameFilter::SetMacAddr(const chip::ByteSpan & mac_addr) } -namespace Silabs { +namespace SilabsEndpointQueueFilter { EndpointQueueFilter::EndpointQueueFilter() : mTooManyFilter(kDefaultAllowedQueuedPackets) {} @@ -124,9 +123,13 @@ EndpointQueueFilter::EndpointQueueFilter(size_t maxAllowedQueuedPackets) : FilterOutcome EndpointQueueFilter::FilterBeforeEnqueue(const void * endpoint, const IPPacketInfo & pktInfo, const chip::System::PacketBufferHandle & pktPayload) { - ReturnErrorCodeIf(FilterOutcome::kDropPacket == mTooManyFilter.FilterBeforeEnqueue(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); - ReturnErrorCodeIf(FilterOutcome::kDropPacket == mMdnsFilter.Filter(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); - ReturnErrorCodeIf(FilterOutcome::kDropPacket == mHostNameFilter.Filter(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); + VerifyOrReturnError(FilterOutcome::kAllowPacket == mTooManyFilter.FilterBeforeEnqueue(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); + if (FilterOutcome::kAllowPacket == mMdnsFilter.Filter(endpoint, pktInfo, pktPayload)) { + return FilterOutcome::kAllowPacket; + } + if (FilterOutcome::kAllowPacket == mHostNameFilter.Filter(endpoint, pktInfo, pktPayload)) { + return FilterOutcome::kAllowPacket; + } return FilterOutcome::kAllowPacket; } @@ -138,6 +141,6 @@ FilterOutcome EndpointQueueFilter::FilterAfterDequeue(const void * endpoint, con return FilterOutcome::kAllowPacket; } -} // Silabs +} // SilabsEndpointQueueFilter } // Inet } // chip diff --git a/src/platform/silabs/EndpointQueueFilter.h b/src/platform/silabs/EndpointQueueFilter.h index f9b956b98d9eca..63b4305a6ad341 100644 --- a/src/platform/silabs/EndpointQueueFilter.h +++ b/src/platform/silabs/EndpointQueueFilter.h @@ -53,7 +53,7 @@ struct HostNameFilter : EndpointFilter }; -namespace Silabs { +namespace SilabsEndpointQueueFilter { class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter { @@ -80,6 +80,6 @@ class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter HostNameFilter mHostNameFilter; }; -} // Silabs +} // SilabsEndpointQueueFilter } // Inet } // chip From 3c1b2817f639792a1a2630c6b8892e1d29ff87b1 Mon Sep 17 00:00:00 2001 From: chbansal Date: Mon, 15 Jul 2024 20:31:40 +0530 Subject: [PATCH 03/15] adding the icd condition on the filter --- src/platform/silabs/ConnectivityManagerImpl.h | 4 ++-- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index 739ba81b9c50c3..54bbde0a8e08bf 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -132,9 +132,9 @@ class ConnectivityManagerImpl final : public ConnectivityManager, static void DriveStationState(::chip::System::Layer * aLayer, void * aAppState); void UpdateInternetConnectivityState(void); -#endif -#ifdef SL_WIFI +#if CHIP_CONFIG_ENABLE_ICD_SERVER Inet::SilabsEndpointQueueFilter::EndpointQueueFilter mEndpointQueueFilter; +#endif // CHIP_CONFIG_ENABLE_ICD_SERVER #endif }; diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 7f3698c3c1607d..370769a136dde6 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -428,12 +428,14 @@ void ConnectivityManagerImpl::UpdateInternetConnectivityState(void) event.InternetConnectivityChange.IPv6 = GetConnectivityChange(hadIPv6Conn, haveIPv6Conn); event.InternetConnectivityChange.ipAddress = addr; +#if CHIP_CONFIG_ENABLE_ICD_SERVER { sl_wfx_mac_address_t macaddr; wfx_get_wifi_mac_addr(SL_WFX_STA_INTERFACE, &macaddr); mEndpointQueueFilter.SetMacAddr(ByteSpan(macaddr.octet)); chip::Inet::UDPEndPointImpl::SetQueueFilter(&mEndpointQueueFilter); } +#endif // CHIP_CONFIG_ENABLE_ICD_SERVER (void) PlatformMgr().PostEvent(&event); From f82257697a52f2319f2068dd9428ae027c051283 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Mon, 15 Jul 2024 15:10:43 +0000 Subject: [PATCH 04/15] Restyled by clang-format --- src/platform/silabs/ConnectivityManagerImpl.h | 2 +- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 1 - src/platform/silabs/EndpointQueueFilter.cpp | 47 +++++++++---------- src/platform/silabs/EndpointQueueFilter.h | 23 ++++----- 4 files changed, 31 insertions(+), 42 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl.h b/src/platform/silabs/ConnectivityManagerImpl.h index 54bbde0a8e08bf..ab62d4d350a859 100644 --- a/src/platform/silabs/ConnectivityManagerImpl.h +++ b/src/platform/silabs/ConnectivityManagerImpl.h @@ -36,8 +36,8 @@ #include #endif #if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION -#include #include "EndpointQueueFilter.h" +#include #else #include #endif diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 370769a136dde6..9f0eeffd8a8dfa 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -53,7 +53,6 @@ namespace DeviceLayer { ConnectivityManagerImpl ConnectivityManagerImpl::sInstance; - CHIP_ERROR ConnectivityManagerImpl::_Init() { CHIP_ERROR err; diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp index ed0be9873842cd..38b902e573bf33 100644 --- a/src/platform/silabs/EndpointQueueFilter.cpp +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -1,12 +1,12 @@ #include "EndpointQueueFilter.h" +#include #include #include -#include namespace chip { namespace Inet { -using FilterOutcome = EndpointQueueFilter::FilterOutcome; +using FilterOutcome = EndpointQueueFilter::FilterOutcome; using namespace chip::Logging; namespace { @@ -57,9 +57,8 @@ bool PayloadContainsCaseInsensitive(const chip::System::PacketBufferHandle & pay } // namespace - FilterOutcome MdnsBroadcastFilter::Filter(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) + const chip::System::PacketBufferHandle & pktPayload) { if (pktInfo.DestPort == kMdnsPort) { @@ -79,9 +78,8 @@ FilterOutcome MdnsBroadcastFilter::Filter(const void * endpoint, const IPPacketI return FilterOutcome::kDropPacket; } - FilterOutcome HostNameFilter::Filter(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) + const chip::System::PacketBufferHandle & pktPayload) { // Drop the mDNS packets which don't contain 'matter' or ''. const uint8_t matterBytes[] = { 'm', 'a', 't', 't', 'e', 'r' }; @@ -92,7 +90,6 @@ FilterOutcome HostNameFilter::Filter(const void * endpoint, const IPPacketInfo & return FilterOutcome::kDropPacket; } - CHIP_ERROR HostNameFilter::SetHostName(const chip::CharSpan & name) { ReturnErrorCodeIf(name.size() != sizeof(mHostName), CHIP_ERROR_INVALID_ARGUMENT); @@ -101,46 +98,44 @@ CHIP_ERROR HostNameFilter::SetHostName(const chip::CharSpan & name) return CHIP_NO_ERROR; } - CHIP_ERROR HostNameFilter::SetMacAddr(const chip::ByteSpan & mac_addr) { ReturnErrorCodeIf(mac_addr.size() < 6, CHIP_ERROR_INVALID_ARGUMENT); - const uint8_t *p = mac_addr.data(); - snprintf((char*)mHostName, sizeof(mHostName), "%02x%02x%02x%02x%02x%02x", p[0], p[1], p[2], p[3], p[4], p[5]); + const uint8_t * p = mac_addr.data(); + snprintf((char *) mHostName, sizeof(mHostName), "%02x%02x%02x%02x%02x%02x", p[0], p[1], p[2], p[3], p[4], p[5]); return CHIP_NO_ERROR; } - namespace SilabsEndpointQueueFilter { -EndpointQueueFilter::EndpointQueueFilter() : - mTooManyFilter(kDefaultAllowedQueuedPackets) {} - -EndpointQueueFilter::EndpointQueueFilter(size_t maxAllowedQueuedPackets) : - mTooManyFilter(maxAllowedQueuedPackets) {} +EndpointQueueFilter::EndpointQueueFilter() : mTooManyFilter(kDefaultAllowedQueuedPackets) {} +EndpointQueueFilter::EndpointQueueFilter(size_t maxAllowedQueuedPackets) : mTooManyFilter(maxAllowedQueuedPackets) {} FilterOutcome EndpointQueueFilter::FilterBeforeEnqueue(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) + const chip::System::PacketBufferHandle & pktPayload) { - VerifyOrReturnError(FilterOutcome::kAllowPacket == mTooManyFilter.FilterBeforeEnqueue(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); - if (FilterOutcome::kAllowPacket == mMdnsFilter.Filter(endpoint, pktInfo, pktPayload)) { + VerifyOrReturnError(FilterOutcome::kAllowPacket == mTooManyFilter.FilterBeforeEnqueue(endpoint, pktInfo, pktPayload), + FilterOutcome::kDropPacket); + if (FilterOutcome::kAllowPacket == mMdnsFilter.Filter(endpoint, pktInfo, pktPayload)) + { return FilterOutcome::kAllowPacket; } - if (FilterOutcome::kAllowPacket == mHostNameFilter.Filter(endpoint, pktInfo, pktPayload)) { + if (FilterOutcome::kAllowPacket == mHostNameFilter.Filter(endpoint, pktInfo, pktPayload)) + { return FilterOutcome::kAllowPacket; } return FilterOutcome::kAllowPacket; } - FilterOutcome EndpointQueueFilter::FilterAfterDequeue(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) + const chip::System::PacketBufferHandle & pktPayload) { - ReturnErrorCodeIf(FilterOutcome::kDropPacket == mTooManyFilter.FilterAfterDequeue(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); + ReturnErrorCodeIf(FilterOutcome::kDropPacket == mTooManyFilter.FilterAfterDequeue(endpoint, pktInfo, pktPayload), + FilterOutcome::kDropPacket); return FilterOutcome::kAllowPacket; } -} // SilabsEndpointQueueFilter -} // Inet -} // chip +} // namespace SilabsEndpointQueueFilter +} // namespace Inet +} // namespace chip diff --git a/src/platform/silabs/EndpointQueueFilter.h b/src/platform/silabs/EndpointQueueFilter.h index 63b4305a6ad341..df7df70cd79a4b 100644 --- a/src/platform/silabs/EndpointQueueFilter.h +++ b/src/platform/silabs/EndpointQueueFilter.h @@ -24,35 +24,33 @@ namespace Inet { struct EndpointFilter { - virtual ~EndpointFilter() = default; + virtual ~EndpointFilter() = default; virtual EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) = 0; + const chip::System::PacketBufferHandle & pktPayload) = 0; }; - struct MdnsBroadcastFilter : EndpointFilter { static constexpr size_t kMdnsPort = 5353; EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) override; + const chip::System::PacketBufferHandle & pktPayload) override; }; - struct HostNameFilter : EndpointFilter { static constexpr size_t kHostNameLengthMax = 13; EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) override; + const chip::System::PacketBufferHandle & pktPayload) override; CHIP_ERROR SetHostName(const chip::CharSpan & name); CHIP_ERROR SetMacAddr(const chip::ByteSpan & addr); + private: uint8_t mHostName[kHostNameLengthMax] = { 0 }; }; - namespace SilabsEndpointQueueFilter { class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter @@ -69,10 +67,7 @@ class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter FilterOutcome FilterAfterDequeue(const void * endpoint, const IPPacketInfo & pktInfo, const chip::System::PacketBufferHandle & pktPayload); - CHIP_ERROR SetMacAddr(const chip::ByteSpan & addr) - { - return mHostNameFilter.SetMacAddr(addr); - } + CHIP_ERROR SetMacAddr(const chip::ByteSpan & addr) { return mHostNameFilter.SetMacAddr(addr); } private: DropIfTooManyQueuedPacketsFilter mTooManyFilter; @@ -80,6 +75,6 @@ class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter HostNameFilter mHostNameFilter; }; -} // SilabsEndpointQueueFilter -} // Inet -} // chip +} // namespace SilabsEndpointQueueFilter +} // namespace Inet +} // namespace chip From 40e42b531c8a0ece9a74a16b785ced0f3fe27a0b Mon Sep 17 00:00:00 2001 From: chbansal Date: Mon, 22 Jul 2024 11:41:48 +0530 Subject: [PATCH 05/15] refactoring the code and addressing review comments --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 8 +- src/platform/silabs/EndpointQueueFilter.cpp | 111 ++++++------------ src/platform/silabs/EndpointQueueFilter.h | 18 +-- 3 files changed, 50 insertions(+), 87 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 9f0eeffd8a8dfa..661af1a81f3bb3 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -431,8 +431,12 @@ void ConnectivityManagerImpl::UpdateInternetConnectivityState(void) { sl_wfx_mac_address_t macaddr; wfx_get_wifi_mac_addr(SL_WFX_STA_INTERFACE, &macaddr); - mEndpointQueueFilter.SetMacAddr(ByteSpan(macaddr.octet)); - chip::Inet::UDPEndPointImpl::SetQueueFilter(&mEndpointQueueFilter); + if (mEndpointQueueFilter.SetHostName(ByteSpan(macaddr.octet)) == CHIP_NO_ERROR) + { + chip::Inet::UDPEndPointImpl::SetQueueFilter(&mEndpointQueueFilter); + } else { + ChipLogError(DeviceLayer, "Failed to set host name filter"); + } } #endif // CHIP_CONFIG_ENABLE_ICD_SERVER diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp index 38b902e573bf33..1a1f365bd4e3bf 100644 --- a/src/platform/silabs/EndpointQueueFilter.cpp +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -2,20 +2,20 @@ #include #include #include +#include namespace chip { namespace Inet { using FilterOutcome = EndpointQueueFilter::FilterOutcome; -using namespace chip::Logging; namespace { -bool IsValidMdnsHostName(const chip::CharSpan & hostName) +bool IsValidMdnsHostName(uint8_t * hostName) { - for (size_t i = 0; i < hostName.size(); ++i) + for (size_t i = 0; i < sizeof(hostName); ++i) { - char ch_data = *(hostName.data() + i); + char ch_data = hostName[i]; if (!((ch_data >= '0' && ch_data <= '9') || (ch_data >= 'A' && ch_data <= 'F'))) { return false; @@ -24,85 +24,57 @@ bool IsValidMdnsHostName(const chip::CharSpan & hostName) return true; } -bool PayloadContains(const chip::System::PacketBufferHandle & payload, const chip::ByteSpan & byteSpan) +bool IsMdnsBroadcastPacket(const void * endpoint, const IPPacketInfo & pktInfo, const System::PacketBufferHandle & pktPayload) { - if (payload->HasChainedBuffer() || payload->TotalLength() < byteSpan.size()) - { - return false; - } - for (size_t i = 0; i <= payload->TotalLength() - byteSpan.size(); ++i) - { - if (memcmp(payload->Start() + i, byteSpan.data(), byteSpan.size()) == 0) - { - return true; - } - } - return false; + // if the packet is not a broadcast packet to mDNS port, drop it. + VerifyOrReturnValue(pktInfo.DestPort == 5353, false); +#if INET_CONFIG_ENABLE_IPV4 + ip_addr_t mdnsIPv4BroadcastAddr = IPADDR4_INIT_BYTES(224, 0, 0, 251); + VerifyOrReturnValue(pktInfo.DestAddress == Inet::IPAddress(mdnsIPv4BroadcastAddr), false); +#endif + ip_addr_t mdnsIPv6BroadcastAddr = IPADDR6_INIT_HOST(0xFF020000, 0, 0, 0xFB); + VerifyOrReturnValue(pktInfo.DestAddress == Inet::IPAddress(mdnsIPv6BroadcastAddr), false); + return true; } -bool PayloadContainsCaseInsensitive(const chip::System::PacketBufferHandle & payload, const ByteSpan & name) +bool PayloadContainsCaseInsensitive(const System::PacketBufferHandle & payload, const ByteSpan & pattern) { - ReturnErrorCodeIf(name.size() < HostNameFilter::kHostNameLengthMax, false); - uint8_t lower_case[HostNameFilter::kHostNameLengthMax]; - memcpy(lower_case, name.data(), name.size()); - for (size_t i = 0; i < sizeof(lower_case); ++i) + if (payload->TotalLength() == 0 || pattern.size() == 0) { - if (lower_case[i] <= 'F' && lower_case[i] >= 'A') - { - lower_case[i] = static_cast('a' + lower_case[i] - 'A'); - } + return false; } - return PayloadContains(payload, name) || PayloadContains(payload, ByteSpan(lower_case)); -} -} // namespace - -FilterOutcome MdnsBroadcastFilter::Filter(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) -{ - if (pktInfo.DestPort == kMdnsPort) + if (payload->HasChainedBuffer() || payload->TotalLength() < pattern.size()) { -#if INET_CONFIG_ENABLE_IPV4 - ip_addr_t mdnsIPv4BroadcastAddr = IPADDR4_INIT_BYTES(224, 0, 0, 251); - if (pktInfo.DestAddress == chip::Inet::IPAddress(mdnsIPv4BroadcastAddr)) - { - return FilterOutcome::kAllowPacket; - } -#endif - ip_addr_t mdnsIPv6BroadcastAddr = IPADDR6_INIT_HOST(0xFF020000, 0, 0, 0xFB); - if (pktInfo.DestAddress == chip::Inet::IPAddress(mdnsIPv6BroadcastAddr)) - { - return FilterOutcome::kAllowPacket; - } + return false; } - return FilterOutcome::kDropPacket; + + std::basic_string_view payloadView(payload->Start(), payload->TotalLength()); + std::basic_string_view patternView(pattern.data(), pattern.size()); + return payloadView.find(patternView) != std::basic_string_view::npos; } +} // namespace + FilterOutcome HostNameFilter::Filter(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) + const System::PacketBufferHandle & pktPayload) { // Drop the mDNS packets which don't contain 'matter' or ''. const uint8_t matterBytes[] = { 'm', 'a', 't', 't', 'e', 'r' }; - if (PayloadContains(pktPayload, ByteSpan(matterBytes)) || PayloadContainsCaseInsensitive(pktPayload, ByteSpan(mHostName))) + if (PayloadContainsCaseInsensitive(pktPayload, ByteSpan(matterBytes)) || + PayloadContainsCaseInsensitive(pktPayload, ByteSpan(mHostName))) { return FilterOutcome::kAllowPacket; } - return FilterOutcome::kDropPacket; -} -CHIP_ERROR HostNameFilter::SetHostName(const chip::CharSpan & name) -{ - ReturnErrorCodeIf(name.size() != sizeof(mHostName), CHIP_ERROR_INVALID_ARGUMENT); - ReturnErrorCodeIf(!IsValidMdnsHostName(name), CHIP_ERROR_INVALID_ARGUMENT); - memcpy(mHostName, name.data(), name.size()); - return CHIP_NO_ERROR; + return FilterOutcome::kDropPacket; } -CHIP_ERROR HostNameFilter::SetMacAddr(const chip::ByteSpan & mac_addr) +CHIP_ERROR HostNameFilter::SetHostName(const ByteSpan & hostName) { - ReturnErrorCodeIf(mac_addr.size() < 6, CHIP_ERROR_INVALID_ARGUMENT); - const uint8_t * p = mac_addr.data(); - snprintf((char *) mHostName, sizeof(mHostName), "%02x%02x%02x%02x%02x%02x", p[0], p[1], p[2], p[3], p[4], p[5]); + const uint8_t * p = hostName.data(); + snprintf((char *) mHostName, sizeof(mHostName), "%02X%02X%02X%02X%02X%02X", p[0], p[1], p[2], p[3], p[4], p[5]); + ReturnErrorCodeIf(!IsValidMdnsHostName(mHostName), CHIP_ERROR_INVALID_ARGUMENT); return CHIP_NO_ERROR; } @@ -113,27 +85,22 @@ EndpointQueueFilter::EndpointQueueFilter() : mTooManyFilter(kDefaultAllowedQueue EndpointQueueFilter::EndpointQueueFilter(size_t maxAllowedQueuedPackets) : mTooManyFilter(maxAllowedQueuedPackets) {} FilterOutcome EndpointQueueFilter::FilterBeforeEnqueue(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) + const System::PacketBufferHandle & pktPayload) { VerifyOrReturnError(FilterOutcome::kAllowPacket == mTooManyFilter.FilterBeforeEnqueue(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); - if (FilterOutcome::kAllowPacket == mMdnsFilter.Filter(endpoint, pktInfo, pktPayload)) - { - return FilterOutcome::kAllowPacket; - } - if (FilterOutcome::kAllowPacket == mHostNameFilter.Filter(endpoint, pktInfo, pktPayload)) + + if (!IsMdnsBroadcastPacket(endpoint, pktInfo, pktPayload)) { return FilterOutcome::kAllowPacket; } - return FilterOutcome::kAllowPacket; + return mHostNameFilter.Filter(endpoint, pktInfo, pktPayload); } FilterOutcome EndpointQueueFilter::FilterAfterDequeue(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) + const System::PacketBufferHandle & pktPayload) { - ReturnErrorCodeIf(FilterOutcome::kDropPacket == mTooManyFilter.FilterAfterDequeue(endpoint, pktInfo, pktPayload), - FilterOutcome::kDropPacket); - return FilterOutcome::kAllowPacket; + return mTooManyFilter.FilterAfterDequeue(endpoint, pktInfo, pktPayload); } } // namespace SilabsEndpointQueueFilter diff --git a/src/platform/silabs/EndpointQueueFilter.h b/src/platform/silabs/EndpointQueueFilter.h index df7df70cd79a4b..96dddf8a3aa4f7 100644 --- a/src/platform/silabs/EndpointQueueFilter.h +++ b/src/platform/silabs/EndpointQueueFilter.h @@ -29,26 +29,19 @@ struct EndpointFilter const chip::System::PacketBufferHandle & pktPayload) = 0; }; -struct MdnsBroadcastFilter : EndpointFilter -{ - static constexpr size_t kMdnsPort = 5353; - - EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) override; -}; - struct HostNameFilter : EndpointFilter { - static constexpr size_t kHostNameLengthMax = 13; + static constexpr size_t kHostNameLengthMax = 13; // 6 bytes in hex and null terminator. EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, const chip::System::PacketBufferHandle & pktPayload) override; - CHIP_ERROR SetHostName(const chip::CharSpan & name); - CHIP_ERROR SetMacAddr(const chip::ByteSpan & addr); + // CHIP_ERROR SetHostName(const chip::CharSpan & name); + CHIP_ERROR SetHostName(const chip::ByteSpan & addr); private: uint8_t mHostName[kHostNameLengthMax] = { 0 }; + static constexpr size_t kMdnsPort = 5353; }; namespace SilabsEndpointQueueFilter { @@ -67,11 +60,10 @@ class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter FilterOutcome FilterAfterDequeue(const void * endpoint, const IPPacketInfo & pktInfo, const chip::System::PacketBufferHandle & pktPayload); - CHIP_ERROR SetMacAddr(const chip::ByteSpan & addr) { return mHostNameFilter.SetMacAddr(addr); } + CHIP_ERROR SetHostName(const chip::ByteSpan & addr) { return mHostNameFilter.SetHostName(addr); } private: DropIfTooManyQueuedPacketsFilter mTooManyFilter; - MdnsBroadcastFilter mMdnsFilter; HostNameFilter mHostNameFilter; }; From 100e570d37c75be7c1ce472ab57735b645d22602 Mon Sep 17 00:00:00 2001 From: chirag-silabs Date: Mon, 21 Oct 2024 11:40:06 +0530 Subject: [PATCH 06/15] Addressing review comments --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 8 ++- src/platform/silabs/EndpointQueueFilter.cpp | 60 ++++++++++++------- src/platform/silabs/EndpointQueueFilter.h | 18 ++++-- 3 files changed, 61 insertions(+), 25 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 661af1a81f3bb3..7a54e43428edb0 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -431,7 +431,13 @@ void ConnectivityManagerImpl::UpdateInternetConnectivityState(void) { sl_wfx_mac_address_t macaddr; wfx_get_wifi_mac_addr(SL_WFX_STA_INTERFACE, &macaddr); - if (mEndpointQueueFilter.SetHostName(ByteSpan(macaddr.octet)) == CHIP_NO_ERROR) + char macaddrString[13]; // 12 characters + null terminator + sprintf(macaddrString,"%02X%02X%02X%02X%02X%02X", macaddr.octet[0], macaddr.octet[1], macaddr.octet[2], macaddr.octet[3], macaddr.octet[4], macaddr.octet[5]); + EndpointQueueFilterConfig config; + config.allowedQueuedPackets = 20; // Set the desired value + + mEndpointQueueFilter.SetConfig(config); + if (mEndpointQueueFilter.SetHostName(chip::CharSpan(macaddrString)) == CHIP_NO_ERROR) { chip::Inet::UDPEndPointImpl::SetQueueFilter(&mEndpointQueueFilter); } else { diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp index 1a1f365bd4e3bf..084e20fad6175e 100644 --- a/src/platform/silabs/EndpointQueueFilter.cpp +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -2,8 +2,8 @@ #include #include #include -#include - +#include +#include namespace chip { namespace Inet { @@ -11,12 +11,12 @@ using FilterOutcome = EndpointQueueFilter::FilterOutcome; namespace { -bool IsValidMdnsHostName(uint8_t * hostName) +bool IsValidMdnsHostName(const CharSpan & hostName) { - for (size_t i = 0; i < sizeof(hostName); ++i) + for (size_t i = 0; i < hostName.size(); ++i) { - char ch_data = hostName[i]; - if (!((ch_data >= '0' && ch_data <= '9') || (ch_data >= 'A' && ch_data <= 'F'))) + char ch_data = *(hostName.data()); + if (!((ch_data >= '0' && ch_data <= '9') || (ch_data >= 'A' && ch_data <= 'F') || (ch_data >= 'a' && ch_data <= 'f'))) { return false; } @@ -24,17 +24,23 @@ bool IsValidMdnsHostName(uint8_t * hostName) return true; } -bool IsMdnsBroadcastPacket(const void * endpoint, const IPPacketInfo & pktInfo, const System::PacketBufferHandle & pktPayload) +bool IsMdnsBroadcastPacket(const IPPacketInfo & pktInfo, const System::PacketBufferHandle & pktPayload) { // if the packet is not a broadcast packet to mDNS port, drop it. VerifyOrReturnValue(pktInfo.DestPort == 5353, false); #if INET_CONFIG_ENABLE_IPV4 ip_addr_t mdnsIPv4BroadcastAddr = IPADDR4_INIT_BYTES(224, 0, 0, 251); - VerifyOrReturnValue(pktInfo.DestAddress == Inet::IPAddress(mdnsIPv4BroadcastAddr), false); + if (pktInfo.DestAddress == Inet::IPAddress(mdnsIPv4BroadcastAddr) + { + return true; + } #endif ip_addr_t mdnsIPv6BroadcastAddr = IPADDR6_INIT_HOST(0xFF020000, 0, 0, 0xFB); - VerifyOrReturnValue(pktInfo.DestAddress == Inet::IPAddress(mdnsIPv6BroadcastAddr), false); - return true; + if (pktInfo.DestAddress == Inet::IPAddress(mdnsIPv6BroadcastAddr)) + { + return true; + } + return false; } bool PayloadContainsCaseInsensitive(const System::PacketBufferHandle & payload, const ByteSpan & pattern) @@ -49,9 +55,25 @@ bool PayloadContainsCaseInsensitive(const System::PacketBufferHandle & payload, return false; } - std::basic_string_view payloadView(payload->Start(), payload->TotalLength()); - std::basic_string_view patternView(pattern.data(), pattern.size()); - return payloadView.find(patternView) != std::basic_string_view::npos; + CharSpan payloadView(reinterpret_cast(payload->Start()), payload->TotalLength()); + CharSpan patternView(reinterpret_cast(pattern.data()), pattern.size()); + + auto toLower = [](char c) { return std::tolower(static_cast(c)); }; + + auto it = std::search( + payloadView.data(), payloadView.data() + payloadView.size(), + patternView.data(), patternView.data() + patternView.size(), + [&](char a, char b) { return toLower(a) == toLower(b); }); + + return (it != payloadView.data() + payloadView.size()); + + + + // CharSpan payloadView((const char *)payload->Start(), payload->TotalLength()); + // CharSpan patternView((const char *)pattern.data(), pattern.size()); + // std::basic_string_view payloadView(payload->Start(), payload->TotalLength()); + // std::basic_string_view patternView(pattern.data(), pattern.size()); + // return (payloadView.data()).find(patternView.data()) != std::basic_string_view::npos; } } // namespace @@ -66,21 +88,19 @@ FilterOutcome HostNameFilter::Filter(const void * endpoint, const IPPacketInfo & { return FilterOutcome::kAllowPacket; } - return FilterOutcome::kDropPacket; } -CHIP_ERROR HostNameFilter::SetHostName(const ByteSpan & hostName) +CHIP_ERROR HostNameFilter::SetHostName(const CharSpan & hostName) { - const uint8_t * p = hostName.data(); - snprintf((char *) mHostName, sizeof(mHostName), "%02X%02X%02X%02X%02X%02X", p[0], p[1], p[2], p[3], p[4], p[5]); - ReturnErrorCodeIf(!IsValidMdnsHostName(mHostName), CHIP_ERROR_INVALID_ARGUMENT); + ReturnErrorCodeIf(!IsValidMdnsHostName(hostName), CHIP_ERROR_INVALID_ARGUMENT); + memcpy(mHostName, hostName.data(), hostName.size()); return CHIP_NO_ERROR; } namespace SilabsEndpointQueueFilter { -EndpointQueueFilter::EndpointQueueFilter() : mTooManyFilter(kDefaultAllowedQueuedPackets) {} +EndpointQueueFilter::EndpointQueueFilter() : mTooManyFilter(mConfig.allowedQueuedPackets) {} EndpointQueueFilter::EndpointQueueFilter(size_t maxAllowedQueuedPackets) : mTooManyFilter(maxAllowedQueuedPackets) {} @@ -90,7 +110,7 @@ FilterOutcome EndpointQueueFilter::FilterBeforeEnqueue(const void * endpoint, co VerifyOrReturnError(FilterOutcome::kAllowPacket == mTooManyFilter.FilterBeforeEnqueue(endpoint, pktInfo, pktPayload), FilterOutcome::kDropPacket); - if (!IsMdnsBroadcastPacket(endpoint, pktInfo, pktPayload)) + if (!IsMdnsBroadcastPacket(pktInfo, pktPayload)) { return FilterOutcome::kAllowPacket; } diff --git a/src/platform/silabs/EndpointQueueFilter.h b/src/platform/silabs/EndpointQueueFilter.h index 96dddf8a3aa4f7..e95102cb3cabf4 100644 --- a/src/platform/silabs/EndpointQueueFilter.h +++ b/src/platform/silabs/EndpointQueueFilter.h @@ -29,6 +29,11 @@ struct EndpointFilter const chip::System::PacketBufferHandle & pktPayload) = 0; }; +struct EndpointQueueFilterConfig +{ + size_t allowedQueuedPackets = 10; // Default value +}; + struct HostNameFilter : EndpointFilter { static constexpr size_t kHostNameLengthMax = 13; // 6 bytes in hex and null terminator. @@ -36,8 +41,8 @@ struct HostNameFilter : EndpointFilter EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, const chip::System::PacketBufferHandle & pktPayload) override; - // CHIP_ERROR SetHostName(const chip::CharSpan & name); - CHIP_ERROR SetHostName(const chip::ByteSpan & addr); + CHIP_ERROR SetHostName(const chip::CharSpan & name); + // CHIP_ERROR SetHostName(const chip::ByteSpan & addr); private: uint8_t mHostName[kHostNameLengthMax] = { 0 }; @@ -49,8 +54,8 @@ namespace SilabsEndpointQueueFilter { class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter { public: - static constexpr size_t kDefaultAllowedQueuedPackets = 10; + EndpointQueueFilterConfig mConfig; EndpointQueueFilter(); EndpointQueueFilter(size_t maxAllowedQueuedPackets); @@ -60,7 +65,12 @@ class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter FilterOutcome FilterAfterDequeue(const void * endpoint, const IPPacketInfo & pktInfo, const chip::System::PacketBufferHandle & pktPayload); - CHIP_ERROR SetHostName(const chip::ByteSpan & addr) { return mHostNameFilter.SetHostName(addr); } + + CHIP_ERROR SetHostName(const chip::CharSpan & addr) { return mHostNameFilter.SetHostName(addr); } + // CHIP_ERROR SetHostName(const chip::ByteSpan & addr) { return mHostNameFilter.SetHostName(addr); } + + // Method to set the configuration + void SetConfig(const EndpointQueueFilterConfig & config) { mConfig = config; } private: DropIfTooManyQueuedPacketsFilter mTooManyFilter; From 305287f2a05ca104ff01d149f1615d56a8c1657d Mon Sep 17 00:00:00 2001 From: chirag-silabs Date: Mon, 21 Oct 2024 11:44:06 +0530 Subject: [PATCH 07/15] removing the commented code --- src/platform/silabs/EndpointQueueFilter.cpp | 8 -------- src/platform/silabs/EndpointQueueFilter.h | 2 -- 2 files changed, 10 deletions(-) diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp index 084e20fad6175e..8e272770a7216b 100644 --- a/src/platform/silabs/EndpointQueueFilter.cpp +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -66,14 +66,6 @@ bool PayloadContainsCaseInsensitive(const System::PacketBufferHandle & payload, [&](char a, char b) { return toLower(a) == toLower(b); }); return (it != payloadView.data() + payloadView.size()); - - - - // CharSpan payloadView((const char *)payload->Start(), payload->TotalLength()); - // CharSpan patternView((const char *)pattern.data(), pattern.size()); - // std::basic_string_view payloadView(payload->Start(), payload->TotalLength()); - // std::basic_string_view patternView(pattern.data(), pattern.size()); - // return (payloadView.data()).find(patternView.data()) != std::basic_string_view::npos; } } // namespace diff --git a/src/platform/silabs/EndpointQueueFilter.h b/src/platform/silabs/EndpointQueueFilter.h index e95102cb3cabf4..5faaa20c7cec94 100644 --- a/src/platform/silabs/EndpointQueueFilter.h +++ b/src/platform/silabs/EndpointQueueFilter.h @@ -42,7 +42,6 @@ struct HostNameFilter : EndpointFilter const chip::System::PacketBufferHandle & pktPayload) override; CHIP_ERROR SetHostName(const chip::CharSpan & name); - // CHIP_ERROR SetHostName(const chip::ByteSpan & addr); private: uint8_t mHostName[kHostNameLengthMax] = { 0 }; @@ -67,7 +66,6 @@ class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter CHIP_ERROR SetHostName(const chip::CharSpan & addr) { return mHostNameFilter.SetHostName(addr); } - // CHIP_ERROR SetHostName(const chip::ByteSpan & addr) { return mHostNameFilter.SetHostName(addr); } // Method to set the configuration void SetConfig(const EndpointQueueFilterConfig & config) { mConfig = config; } From a19a69b20d63f57bb4ddcedb2b61d07cafa352a7 Mon Sep 17 00:00:00 2001 From: chirag-silabs Date: Mon, 21 Oct 2024 12:39:39 +0530 Subject: [PATCH 08/15] restyling the PR --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 9 ++++++--- src/platform/silabs/EndpointQueueFilter.cpp | 10 ++++------ src/platform/silabs/EndpointQueueFilter.h | 4 +--- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 7a54e43428edb0..8a12619b478bf6 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -432,7 +432,8 @@ void ConnectivityManagerImpl::UpdateInternetConnectivityState(void) sl_wfx_mac_address_t macaddr; wfx_get_wifi_mac_addr(SL_WFX_STA_INTERFACE, &macaddr); char macaddrString[13]; // 12 characters + null terminator - sprintf(macaddrString,"%02X%02X%02X%02X%02X%02X", macaddr.octet[0], macaddr.octet[1], macaddr.octet[2], macaddr.octet[3], macaddr.octet[4], macaddr.octet[5]); + sprintf(macaddrString, "%02X%02X%02X%02X%02X%02X", macaddr.octet[0], macaddr.octet[1], macaddr.octet[2], + macaddr.octet[3], macaddr.octet[4], macaddr.octet[5]); EndpointQueueFilterConfig config; config.allowedQueuedPackets = 20; // Set the desired value @@ -440,9 +441,11 @@ void ConnectivityManagerImpl::UpdateInternetConnectivityState(void) if (mEndpointQueueFilter.SetHostName(chip::CharSpan(macaddrString)) == CHIP_NO_ERROR) { chip::Inet::UDPEndPointImpl::SetQueueFilter(&mEndpointQueueFilter); - } else { + } + else + { ChipLogError(DeviceLayer, "Failed to set host name filter"); - } + } } #endif // CHIP_CONFIG_ENABLE_ICD_SERVER diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp index 8e272770a7216b..f7f66d91be1a17 100644 --- a/src/platform/silabs/EndpointQueueFilter.cpp +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -1,9 +1,9 @@ #include "EndpointQueueFilter.h" +#include +#include #include #include #include -#include -#include namespace chip { namespace Inet { @@ -60,10 +60,8 @@ bool PayloadContainsCaseInsensitive(const System::PacketBufferHandle & payload, auto toLower = [](char c) { return std::tolower(static_cast(c)); }; - auto it = std::search( - payloadView.data(), payloadView.data() + payloadView.size(), - patternView.data(), patternView.data() + patternView.size(), - [&](char a, char b) { return toLower(a) == toLower(b); }); + auto it = std::search(payloadView.data(), payloadView.data() + payloadView.size(), patternView.data(), + patternView.data() + patternView.size(), [&](char a, char b) { return toLower(a) == toLower(b); }); return (it != payloadView.data() + payloadView.size()); } diff --git a/src/platform/silabs/EndpointQueueFilter.h b/src/platform/silabs/EndpointQueueFilter.h index 5faaa20c7cec94..cd5a548203ee50 100644 --- a/src/platform/silabs/EndpointQueueFilter.h +++ b/src/platform/silabs/EndpointQueueFilter.h @@ -45,7 +45,7 @@ struct HostNameFilter : EndpointFilter private: uint8_t mHostName[kHostNameLengthMax] = { 0 }; - static constexpr size_t kMdnsPort = 5353; + static constexpr size_t kMdnsPort = 5353; }; namespace SilabsEndpointQueueFilter { @@ -53,7 +53,6 @@ namespace SilabsEndpointQueueFilter { class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter { public: - EndpointQueueFilterConfig mConfig; EndpointQueueFilter(); EndpointQueueFilter(size_t maxAllowedQueuedPackets); @@ -64,7 +63,6 @@ class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter FilterOutcome FilterAfterDequeue(const void * endpoint, const IPPacketInfo & pktInfo, const chip::System::PacketBufferHandle & pktPayload); - CHIP_ERROR SetHostName(const chip::CharSpan & addr) { return mHostNameFilter.SetHostName(addr); } // Method to set the configuration From a24ab0fbf093f212e159f192e941e44986840350 Mon Sep 17 00:00:00 2001 From: chirag-silabs Date: Mon, 21 Oct 2024 19:12:03 +0530 Subject: [PATCH 09/15] addressing review comments and fixing the build --- src/platform/silabs/EndpointQueueFilter.h | 16 ++++++++-------- src/platform/silabs/efr32/BUILD.gn | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/platform/silabs/EndpointQueueFilter.h b/src/platform/silabs/EndpointQueueFilter.h index cd5a548203ee50..02eb7b79e267a3 100644 --- a/src/platform/silabs/EndpointQueueFilter.h +++ b/src/platform/silabs/EndpointQueueFilter.h @@ -24,9 +24,9 @@ namespace Inet { struct EndpointFilter { - virtual ~EndpointFilter() = default; + virtual ~EndpointFilter() = default; virtual EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) = 0; + const System::PacketBufferHandle & pktPayload) = 0; }; struct EndpointQueueFilterConfig @@ -39,9 +39,9 @@ struct HostNameFilter : EndpointFilter static constexpr size_t kHostNameLengthMax = 13; // 6 bytes in hex and null terminator. EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) override; + const System::PacketBufferHandle & pktPayload) override; - CHIP_ERROR SetHostName(const chip::CharSpan & name); + CHIP_ERROR SetHostName(const CharSpan & name); private: uint8_t mHostName[kHostNameLengthMax] = { 0 }; @@ -50,7 +50,7 @@ struct HostNameFilter : EndpointFilter namespace SilabsEndpointQueueFilter { -class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter +class EndpointQueueFilter : public Inet::EndpointQueueFilter { public: EndpointQueueFilterConfig mConfig; @@ -58,12 +58,12 @@ class EndpointQueueFilter : public chip::Inet::EndpointQueueFilter EndpointQueueFilter(size_t maxAllowedQueuedPackets); FilterOutcome FilterBeforeEnqueue(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload) override; + const System::PacketBufferHandle & pktPayload) override; FilterOutcome FilterAfterDequeue(const void * endpoint, const IPPacketInfo & pktInfo, - const chip::System::PacketBufferHandle & pktPayload); + const System::PacketBufferHandle & pktPayload); - CHIP_ERROR SetHostName(const chip::CharSpan & addr) { return mHostNameFilter.SetHostName(addr); } + CHIP_ERROR SetHostName(const CharSpan & addr) { return mHostNameFilter.SetHostName(addr); } // Method to set the configuration void SetConfig(const EndpointQueueFilterConfig & config) { mConfig = config; } diff --git a/src/platform/silabs/efr32/BUILD.gn b/src/platform/silabs/efr32/BUILD.gn index 69602185baf355..e0f3e3820a425e 100644 --- a/src/platform/silabs/efr32/BUILD.gn +++ b/src/platform/silabs/efr32/BUILD.gn @@ -159,6 +159,7 @@ static_library("efr32") { sources += [ "${silabs_platform_dir}/ConnectivityManagerImpl_WIFI.cpp", "${silabs_platform_dir}/EndpointQueueFilter.cpp", + "${silabs_platform_dir}/EndpointQueueFilter.h", "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.cpp", "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.h", ] From 60fe92ae5eafdc2cf0b67a93c6a8e5f4cbfad887 Mon Sep 17 00:00:00 2001 From: chirag-silabs Date: Mon, 21 Oct 2024 20:11:15 +0530 Subject: [PATCH 10/15] fixing the build --- src/platform/silabs/EndpointQueueFilter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp index f7f66d91be1a17..b397be53619af2 100644 --- a/src/platform/silabs/EndpointQueueFilter.cpp +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -1,8 +1,8 @@ #include "EndpointQueueFilter.h" #include #include +#include #include -#include #include namespace chip { namespace Inet { From 68fade8dc5fefd9a907b97813a693c774ce251a4 Mon Sep 17 00:00:00 2001 From: chirag-silabs Date: Tue, 22 Oct 2024 15:11:54 +0530 Subject: [PATCH 11/15] fixing the build issue --- src/platform/silabs/EndpointQueueFilter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp index b397be53619af2..cdc03f8f094853 100644 --- a/src/platform/silabs/EndpointQueueFilter.cpp +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -1,8 +1,8 @@ #include "EndpointQueueFilter.h" #include #include -#include #include +#include #include namespace chip { namespace Inet { @@ -83,7 +83,7 @@ FilterOutcome HostNameFilter::Filter(const void * endpoint, const IPPacketInfo & CHIP_ERROR HostNameFilter::SetHostName(const CharSpan & hostName) { - ReturnErrorCodeIf(!IsValidMdnsHostName(hostName), CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(IsValidMdnsHostName(hostName), CHIP_ERROR_INVALID_ARGUMENT); memcpy(mHostName, hostName.data(), hostName.size()); return CHIP_NO_ERROR; } From ae3755506fc0d52cd80b13f1bae8bd06b7e815c9 Mon Sep 17 00:00:00 2001 From: chirag-silabs Date: Wed, 13 Nov 2024 23:57:50 +0530 Subject: [PATCH 12/15] changing charspan to span and addressing review comments --- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 10 ++++--- src/platform/silabs/EndpointQueueFilter.cpp | 29 ++++++++++--------- src/platform/silabs/EndpointQueueFilter.h | 4 +-- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index 8a12619b478bf6..c590e77409499c 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -438,9 +438,13 @@ void ConnectivityManagerImpl::UpdateInternetConnectivityState(void) config.allowedQueuedPackets = 20; // Set the desired value mEndpointQueueFilter.SetConfig(config); - if (mEndpointQueueFilter.SetHostName(chip::CharSpan(macaddrString)) == CHIP_NO_ERROR) + + // Convert macaddrString to Span + Span macaddrSpan(reinterpret_cast(macaddrString), sizeof(macaddrString)); + + if (mEndpointQueueFilter.SetHostName(macaddrSpan) == CHIP_NO_ERROR) { - chip::Inet::UDPEndPointImpl::SetQueueFilter(&mEndpointQueueFilter); + UDPEndPointImpl::SetQueueFilter(&mEndpointQueueFilter); } else { @@ -449,8 +453,6 @@ void ConnectivityManagerImpl::UpdateInternetConnectivityState(void) } #endif // CHIP_CONFIG_ENABLE_ICD_SERVER - (void) PlatformMgr().PostEvent(&event); - if (haveIPv4Conn != hadIPv4Conn) { ChipLogProgress(DeviceLayer, "%s Internet connectivity %s", "IPv4", (haveIPv4Conn) ? "ESTABLISHED" : "LOST"); diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp index cdc03f8f094853..8de74246091f62 100644 --- a/src/platform/silabs/EndpointQueueFilter.cpp +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -4,6 +4,10 @@ #include #include #include +#include + +using namespace ::chip; + namespace chip { namespace Inet { @@ -11,7 +15,7 @@ using FilterOutcome = EndpointQueueFilter::FilterOutcome; namespace { -bool IsValidMdnsHostName(const CharSpan & hostName) +bool IsValidMdnsHostName(const Span & hostName) { for (size_t i = 0; i < hostName.size(); ++i) { @@ -30,7 +34,7 @@ bool IsMdnsBroadcastPacket(const IPPacketInfo & pktInfo, const System::PacketBuf VerifyOrReturnValue(pktInfo.DestPort == 5353, false); #if INET_CONFIG_ENABLE_IPV4 ip_addr_t mdnsIPv4BroadcastAddr = IPADDR4_INIT_BYTES(224, 0, 0, 251); - if (pktInfo.DestAddress == Inet::IPAddress(mdnsIPv4BroadcastAddr) + if (pktInfo.DestAddress == Inet::IPAddress(mdnsIPv4BroadcastAddr)) { return true; } @@ -43,7 +47,7 @@ bool IsMdnsBroadcastPacket(const IPPacketInfo & pktInfo, const System::PacketBuf return false; } -bool PayloadContainsCaseInsensitive(const System::PacketBufferHandle & payload, const ByteSpan & pattern) +bool PayloadContainsCaseInsensitive(const System::PacketBufferHandle & payload, const Span & pattern) { if (payload->TotalLength() == 0 || pattern.size() == 0) { @@ -55,15 +59,14 @@ bool PayloadContainsCaseInsensitive(const System::PacketBufferHandle & payload, return false; } - CharSpan payloadView(reinterpret_cast(payload->Start()), payload->TotalLength()); - CharSpan patternView(reinterpret_cast(pattern.data()), pattern.size()); + Span payloadView(payload->Start(), payload->TotalLength()); - auto toLower = [](char c) { return std::tolower(static_cast(c)); }; + auto toLower = [](unsigned char c) { return std::tolower(static_cast(c)); }; - auto it = std::search(payloadView.data(), payloadView.data() + payloadView.size(), patternView.data(), - patternView.data() + patternView.size(), [&](char a, char b) { return toLower(a) == toLower(b); }); + auto it = std::search(payloadView.begin(), payloadView.end(), pattern.begin(), pattern.end(), + [&](unsigned char a, unsigned char b) { return toLower(a) == toLower(b); }); - return (it != payloadView.data() + payloadView.size()); + return (it != payloadView.end()); } } // namespace @@ -72,16 +75,16 @@ FilterOutcome HostNameFilter::Filter(const void * endpoint, const IPPacketInfo & const System::PacketBufferHandle & pktPayload) { // Drop the mDNS packets which don't contain 'matter' or ''. - const uint8_t matterBytes[] = { 'm', 'a', 't', 't', 'e', 'r' }; - if (PayloadContainsCaseInsensitive(pktPayload, ByteSpan(matterBytes)) || - PayloadContainsCaseInsensitive(pktPayload, ByteSpan(mHostName))) + const unsigned char matterBytes[] = { 'm', 'a', 't', 't', 'e', 'r' }; + if (PayloadContainsCaseInsensitive(pktPayload, Span(matterBytes, sizeof(matterBytes))) || + PayloadContainsCaseInsensitive(pktPayload, Span(mHostName, sizeof(mHostName)))) { return FilterOutcome::kAllowPacket; } return FilterOutcome::kDropPacket; } -CHIP_ERROR HostNameFilter::SetHostName(const CharSpan & hostName) +CHIP_ERROR HostNameFilter::SetHostName(Span & hostName) { VerifyOrReturnError(IsValidMdnsHostName(hostName), CHIP_ERROR_INVALID_ARGUMENT); memcpy(mHostName, hostName.data(), hostName.size()); diff --git a/src/platform/silabs/EndpointQueueFilter.h b/src/platform/silabs/EndpointQueueFilter.h index 02eb7b79e267a3..779fcab6951dfa 100644 --- a/src/platform/silabs/EndpointQueueFilter.h +++ b/src/platform/silabs/EndpointQueueFilter.h @@ -41,7 +41,7 @@ struct HostNameFilter : EndpointFilter EndpointQueueFilter::FilterOutcome Filter(const void * endpoint, const IPPacketInfo & pktInfo, const System::PacketBufferHandle & pktPayload) override; - CHIP_ERROR SetHostName(const CharSpan & name); + CHIP_ERROR SetHostName(Span & name); private: uint8_t mHostName[kHostNameLengthMax] = { 0 }; @@ -63,7 +63,7 @@ class EndpointQueueFilter : public Inet::EndpointQueueFilter FilterOutcome FilterAfterDequeue(const void * endpoint, const IPPacketInfo & pktInfo, const System::PacketBufferHandle & pktPayload); - CHIP_ERROR SetHostName(const CharSpan & addr) { return mHostNameFilter.SetHostName(addr); } + CHIP_ERROR SetHostName(Span & addr) { return mHostNameFilter.SetHostName(addr); } // Method to set the configuration void SetConfig(const EndpointQueueFilterConfig & config) { mConfig = config; } From a99409b6eecf605ca792a14e832e10fb84ba9a49 Mon Sep 17 00:00:00 2001 From: chirag-silabs Date: Thu, 14 Nov 2024 00:07:48 +0530 Subject: [PATCH 13/15] restyling the PR --- src/platform/silabs/EndpointQueueFilter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp index 8de74246091f62..14dd25ef0f643c 100644 --- a/src/platform/silabs/EndpointQueueFilter.cpp +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -1,10 +1,10 @@ #include "EndpointQueueFilter.h" #include #include +#include #include #include #include -#include using namespace ::chip; From f237fde72bcbb77cff83f7418b7bd9f07dd6418f Mon Sep 17 00:00:00 2001 From: chirag-silabs Date: Wed, 20 Nov 2024 23:45:32 +0530 Subject: [PATCH 14/15] address review comments --- src/platform/silabs/EndpointQueueFilter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/platform/silabs/EndpointQueueFilter.cpp b/src/platform/silabs/EndpointQueueFilter.cpp index 14dd25ef0f643c..9a46f858cecc7e 100644 --- a/src/platform/silabs/EndpointQueueFilter.cpp +++ b/src/platform/silabs/EndpointQueueFilter.cpp @@ -61,7 +61,7 @@ bool PayloadContainsCaseInsensitive(const System::PacketBufferHandle & payload, Span payloadView(payload->Start(), payload->TotalLength()); - auto toLower = [](unsigned char c) { return std::tolower(static_cast(c)); }; + auto toLower = [](unsigned char c) { return std::tolower(c); }; auto it = std::search(payloadView.begin(), payloadView.end(), pattern.begin(), pattern.end(), [&](unsigned char a, unsigned char b) { return toLower(a) == toLower(b); }); @@ -76,8 +76,8 @@ FilterOutcome HostNameFilter::Filter(const void * endpoint, const IPPacketInfo & { // Drop the mDNS packets which don't contain 'matter' or ''. const unsigned char matterBytes[] = { 'm', 'a', 't', 't', 'e', 'r' }; - if (PayloadContainsCaseInsensitive(pktPayload, Span(matterBytes, sizeof(matterBytes))) || - PayloadContainsCaseInsensitive(pktPayload, Span(mHostName, sizeof(mHostName)))) + if (PayloadContainsCaseInsensitive(pktPayload, Span(matterBytes)) || + PayloadContainsCaseInsensitive(pktPayload, Span(mHostName))) { return FilterOutcome::kAllowPacket; } From 8cde8fd8a703da972bc86a853d86c93b8204c47b Mon Sep 17 00:00:00 2001 From: chirag-silabs Date: Wed, 20 Nov 2024 23:52:20 +0530 Subject: [PATCH 15/15] restyling the PR --- src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index c590e77409499c..3887e2eb64202d 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -40,8 +40,8 @@ #endif #include "CHIPDevicePlatformConfig.h" -#include #include "EndpointQueueFilter.h" +#include using namespace ::chip; using namespace ::chip::Inet;