From ddc1c7c8b1ca513d862f41f1daf48fe0a7367137 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Tue, 20 Dec 2022 09:27:49 -0800 Subject: [PATCH] [netif] add helper to signal fixed multicast address changes (#8559) This commit adds a private method `SignalMulticastAddressChange()` which signals changes to fixes multicast addresses. --- src/core/net/netif.cpp | 87 ++++++++++++------------------------------ src/core/net/netif.hpp | 4 ++ 2 files changed, 28 insertions(+), 63 deletions(-) diff --git a/src/core/net/netif.cpp b/src/core/net/netif.cpp index 3fa84cc1c..a6b2564c9 100644 --- a/src/core/net/netif.cpp +++ b/src/core/net/netif.cpp @@ -143,25 +143,7 @@ void Netif::SubscribeAllNodesMulticast(void) tail->SetNext(&linkLocalAllNodesAddress); } - Get().Signal(kEventIp6MulticastSubscribed); - -#if !OPENTHREAD_CONFIG_HISTORY_TRACKER_ENABLE - VerifyOrExit(mAddressCallback != nullptr); -#endif - - for (const MulticastAddress *entry = &linkLocalAllNodesAddress; entry; entry = entry->GetNext()) - { -#if OPENTHREAD_CONFIG_HISTORY_TRACKER_ENABLE - Get().RecordAddressEvent(kAddressAdded, *entry, kOriginThread); - - if (mAddressCallback != nullptr) -#endif - { - AddressInfo addressInfo(*entry); - - mAddressCallback(&addressInfo, kAddressAdded, mAddressCallbackContext); - } - } + SignalMulticastAddressChange(kAddressAdded, &linkLocalAllNodesAddress, nullptr); exit: return; @@ -199,25 +181,7 @@ void Netif::UnsubscribeAllNodesMulticast(void) prev->SetNext(nullptr); } - Get().Signal(kEventIp6MulticastUnsubscribed); - -#if !OPENTHREAD_CONFIG_HISTORY_TRACKER_ENABLE - VerifyOrExit(mAddressCallback != nullptr); -#endif - - for (const MulticastAddress *entry = &linkLocalAllNodesAddress; entry; entry = entry->GetNext()) - { -#if OPENTHREAD_CONFIG_HISTORY_TRACKER_ENABLE - Get().RecordAddressEvent(kAddressRemoved, *entry, kOriginThread); - - if (mAddressCallback != nullptr) -#endif - { - AddressInfo addressInfo(*entry); - - mAddressCallback(&addressInfo, kAddressRemoved, mAddressCallbackContext); - } - } + SignalMulticastAddressChange(kAddressRemoved, &linkLocalAllNodesAddress, nullptr); exit: return; @@ -260,26 +224,7 @@ void Netif::SubscribeAllRoutersMulticast(void) prev->SetNext(&linkLocalAllRoutersAddress); } - Get().Signal(kEventIp6MulticastSubscribed); - -#if !OPENTHREAD_CONFIG_HISTORY_TRACKER_ENABLE - VerifyOrExit(mAddressCallback != nullptr); -#endif - - for (const MulticastAddress *entry = &linkLocalAllRoutersAddress; entry != &linkLocalAllNodesAddress; - entry = entry->GetNext()) - { -#if OPENTHREAD_CONFIG_HISTORY_TRACKER_ENABLE - Get().RecordAddressEvent(kAddressAdded, *entry, kOriginThread); - - if (mAddressCallback != nullptr) -#endif - { - AddressInfo addressInfo(*entry); - - mAddressCallback(&addressInfo, kAddressAdded, mAddressCallbackContext); - } - } + SignalMulticastAddressChange(kAddressAdded, &linkLocalAllRoutersAddress, &linkLocalAllNodesAddress); exit: return; @@ -312,27 +257,43 @@ void Netif::UnsubscribeAllRoutersMulticast(void) prev->SetNext(&linkLocalAllNodesAddress); } - Get().Signal(kEventIp6MulticastUnsubscribed); + SignalMulticastAddressChange(kAddressRemoved, &linkLocalAllRoutersAddress, &linkLocalAllNodesAddress); + +exit: + return; +} + +void Netif::SignalMulticastAddressChange(AddressEvent aAddressEvent, + const MulticastAddress *aStart, + const MulticastAddress *aEnd) +{ + // Signal changes to fixed multicast addresses from `aStart` up to + // (not including) `aEnd`. `aAddressEvent` indicates whether + // addresses were subscribed or unsubscribed. + + Get().Signal(aAddressEvent == kAddressAdded ? kEventIp6MulticastSubscribed + : kEventIp6MulticastUnsubscribed); #if !OPENTHREAD_CONFIG_HISTORY_TRACKER_ENABLE VerifyOrExit(mAddressCallback != nullptr); #endif - for (const MulticastAddress *entry = &linkLocalAllRoutersAddress; entry != &linkLocalAllNodesAddress; - entry = entry->GetNext()) + for (const MulticastAddress *entry = aStart; entry != aEnd; entry = entry->GetNext()) { #if OPENTHREAD_CONFIG_HISTORY_TRACKER_ENABLE - Get().RecordAddressEvent(kAddressRemoved, *entry, kOriginThread); + Get().RecordAddressEvent(aAddressEvent, *entry, kOriginThread); if (mAddressCallback != nullptr) #endif { AddressInfo addressInfo(*entry); - mAddressCallback(&addressInfo, kAddressRemoved, mAddressCallbackContext); + mAddressCallback(&addressInfo, aAddressEvent, mAddressCallbackContext); } } + ExitNow(); + exit: return; } diff --git a/src/core/net/netif.hpp b/src/core/net/netif.hpp index 3ad61a7c0..808d42348 100644 --- a/src/core/net/netif.hpp +++ b/src/core/net/netif.hpp @@ -644,6 +644,10 @@ protected: void UnsubscribeAllNodesMulticast(void); private: + void SignalMulticastAddressChange(AddressEvent aAddressEvent, + const MulticastAddress *aStart, + const MulticastAddress *aEnd); + LinkedList mUnicastAddresses; LinkedList mMulticastAddresses; bool mMulticastPromiscuous;