blob: b7ae80cd05f219a573de2858e0a9cae2be26a1c4 [file] [log] [blame]
/*
* Copyright (c) 2020, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions for Multicast Listeners Table.
*/
#ifndef MULTICAST_LISTENERS_TABLE_HPP
#define MULTICAST_LISTENERS_TABLE_HPP
#include "openthread-core-config.h"
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE
#include <openthread/backbone_router_ftd.h>
#include "common/non_copyable.hpp"
#include "common/notifier.hpp"
#include "common/time.hpp"
#include "net/ip6_address.hpp"
namespace ot {
namespace BackboneRouter {
/**
* This class implements the definitions for Multicast Listeners Table.
*
*/
class MulticastListenersTable : public InstanceLocator, private NonCopyable
{
class IteratorBuilder;
public:
/**
* This class represents a Multicast Listener entry.
*
*/
class Listener : public Clearable<Listener>
{
friend class MulticastListenersTable;
public:
/**
* This constructor initializes the `Listener` object.
*
*/
Listener(void) { Clear(); }
/**
* This method returns the Multicast Listener address.
*
* @returns The Multicast Listener address.
*
*/
const Ip6::Address &GetAddress(void) const { return mAddress; }
/**
* This method returns the expire time of the Multicast Listener.
*
* @returns The Multicast Listener expire time.
*
*/
const TimeMilli GetExpireTime(void) const { return mExpireTime; }
private:
void SetAddress(const Ip6::Address &aAddress) { mAddress = aAddress; }
void SetExpireTime(TimeMilli aExpireTime) { mExpireTime = aExpireTime; }
bool operator<(const Listener &aOther) const { return GetExpireTime() < aOther.GetExpireTime(); }
Ip6::Address mAddress;
TimeMilli mExpireTime;
};
/**
* This constructor initializes the Multicast Listeners Table.
*
* @param[in] aInstance A reference to the OpenThread instance.
*
*/
explicit MulticastListenersTable(Instance &aInstance)
: InstanceLocator(aInstance)
, mNumValidListeners(0)
, mCallback(nullptr)
, mCallbackContext(nullptr)
{
}
/**
* This method adds a Multicast Listener with given address and expire time.
*
* @param[in] aAddress The Multicast Listener address.
* @param[in] aExpireTime The Multicast Listener expire time.
*
* @retval kErrorNone If the Multicast Listener was successfully added.
* @retval kErrorInvalidArgs If the Multicast Listener address was invalid.
* @retval kErrorNoBufs No space available to save the Multicast Listener.
*
*/
Error Add(const Ip6::Address &aAddress, TimeMilli aExpireTime);
/**
* This method removes a given Multicast Listener.
*
* @param[in] aAddress The Multicast Listener address.
*
*/
void Remove(const Ip6::Address &aAddress);
/**
* This method removes expired Multicast Listeners.
*
*/
void Expire(void);
/**
* This method counts the number of valid Multicast Listeners.
*
* @returns The number of valid Multicast Listeners.
*
*/
uint16_t Count(void) const { return mNumValidListeners; }
/**
* This method enables range-based `for` loop iteration over all Multicast Listeners.
*
* This method should be used as follows:
*
* for (MulticastListenersTable::Listener &listener : Get<MulticastListenersTable>().Iterate())
*
* @returns An IteratorBuilder instance.
*
*/
IteratorBuilder Iterate(void) { return IteratorBuilder(GetInstance()); }
/**
* This method removes all the Multicast Listeners.
*
*/
void Clear(void);
/**
* This method sets the Multicast Listener callback.
*
* @param[in] aCallback The callback function.
* @param[in] aContext A user context pointer.
*
*/
void SetCallback(otBackboneRouterMulticastListenerCallback aCallback, void *aContext);
/**
* This method gets the next Multicast Listener.
*
* @param[in] aIterator A pointer to the Multicast Listener Iterator.
* @param[out] aListenerInfo A pointer to where the Multicast Listener info is placed.
*
* @retval kErrorNone Successfully found the next Multicast Listener info.
* @retval kErrorNotFound No subsequent Multicast Listener was found.
*
*/
Error GetNext(otBackboneRouterMulticastListenerIterator &aIterator,
otBackboneRouterMulticastListenerInfo & aListenerInfo);
private:
static constexpr uint16_t kMulticastListenersTableSize = OPENTHREAD_CONFIG_MAX_MULTICAST_LISTENERS;
static_assert(
kMulticastListenersTableSize >= 75,
"Thread 1.2 Conformance requires the Multicast Listener Table size to be larger than or equal to 75.");
class IteratorBuilder : InstanceLocator
{
public:
explicit IteratorBuilder(Instance &aInstance)
: InstanceLocator(aInstance)
{
}
Listener *begin(void);
Listener *end(void);
};
void LogMulticastListenersTable(const char * aAction,
const Ip6::Address &aAddress,
TimeMilli aExpireTime,
Error aError);
void FixHeap(uint16_t aIndex);
bool SiftHeapElemDown(uint16_t aIndex);
void SiftHeapElemUp(uint16_t aIndex);
void CheckInvariants(void) const;
Listener mListeners[kMulticastListenersTableSize];
uint16_t mNumValidListeners;
otBackboneRouterMulticastListenerCallback mCallback;
void * mCallbackContext;
};
} // namespace BackboneRouter
/**
* @}
*/
} // namespace ot
#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE
#endif // MULTICAST_LISTENERS_TABLE_HPP