#ifndef NET_NETIF_HPP_
#define NET_NETIF_HPP_
#include "openthread-core-config.h"
#include "common/linked_list.hpp"
#include "common/locator.hpp"
#include "common/message.hpp"
#include "common/non_copyable.hpp"
#include "common/tasklet.hpp"
#include "mac/mac_types.hpp"
#include "net/ip6_address.hpp"
#include "net/socket.hpp"
namespace ot {
namespace Ip6 {
class Ip6;
class NetifUnicastAddress : public otNetifAddress, public LinkedListEntry<NetifUnicastAddress>
{
friend class Netif;
public:
void Clear(void) { memset(this, 0, sizeof(*this)); }
const Address &GetAddress(void) const { return static_cast<const Address &>(mAddress); }
Address &GetAddress(void) { return static_cast<Address &>(mAddress); }
uint8_t GetScope(void) const
{
return mScopeOverrideValid ? static_cast<uint8_t>(mScopeOverride) : GetAddress().GetScope();
}
private:
bool IsInUse(void) const { return GetNext() != this; }
void MarkAsNotInUse(void) { SetNext(this); }
};
class NetifMulticastAddress : public otNetifMulticastAddress, public LinkedListEntry<NetifMulticastAddress>
{
friend class Netif;
public:
void Clear(void) { memset(this, 0, sizeof(*this)); }
const Address &GetAddress(void) const { return static_cast<const Address &>(mAddress); }
Address &GetAddress(void) { return static_cast<Address &>(mAddress); }
const NetifMulticastAddress *GetNext(void) const { return static_cast<const NetifMulticastAddress *>(mNext); }
NetifMulticastAddress *GetNext(void)
{
return static_cast<NetifMulticastAddress *>(const_cast<otNetifMulticastAddress *>(mNext));
}
private:
bool IsInUse(void) const { return GetNext() != this; }
void MarkAsNotInUse(void) { mNext = this; }
};
class Netif : public InstanceLocator, public LinkedListEntry<Netif>, private NonCopyable
{
friend class Ip6;
friend class Address;
public:
Netif(Instance &aInstance);
void SetAddressCallback(otIp6AddressCallback aCallback, void *aCallbackContext);
const NetifUnicastAddress *GetUnicastAddresses(void) const { return mUnicastAddresses.GetHead(); }
void AddUnicastAddress(NetifUnicastAddress &aAddress);
void RemoveUnicastAddress(const NetifUnicastAddress &aAddress);
bool HasUnicastAddress(const NetifUnicastAddress &aAddress) const { return mUnicastAddresses.Contains(aAddress); }
otError AddExternalUnicastAddress(const NetifUnicastAddress &aAddress);
otError RemoveExternalUnicastAddress(const Address &aAddress);
void RemoveAllExternalUnicastAddresses(void);
bool IsUnicastAddress(const Address &aAddress) const;
bool IsMulticastSubscribed(const Address &aAddress) const;
void SubscribeAllRoutersMulticast(void);
void UnsubscribeAllRoutersMulticast(void);
const NetifMulticastAddress *GetMulticastAddresses(void) const { return mMulticastAddresses.GetHead(); }
void SubscribeMulticast(NetifMulticastAddress &aAddress);
void UnsubscribeMulticast(const NetifMulticastAddress &aAddress);
otError GetNextExternalMulticast(uint8_t &aIterator, Address &aAddress) const;
otError SubscribeExternalMulticast(const Address &aAddress);
otError UnsubscribeExternalMulticast(const Address &aAddress);
void UnsubscribeAllExternalMulticastAddresses(void);
bool IsMulticastPromiscuousEnabled(void) const { return mMulticastPromiscuous; }
void SetMulticastPromiscuous(bool aEnabled) { mMulticastPromiscuous = aEnabled; }
protected:
void SubscribeAllNodesMulticast(void);
void UnsubscribeAllNodesMulticast(void);
private:
enum
{
kMulticastPrefixLength = 128, };
LinkedList<NetifUnicastAddress> mUnicastAddresses;
LinkedList<NetifMulticastAddress> mMulticastAddresses;
bool mMulticastPromiscuous;
otIp6AddressCallback mAddressCallback;
void * mAddressCallbackContext;
NetifUnicastAddress mExtUnicastAddresses[OPENTHREAD_CONFIG_IP6_MAX_EXT_UCAST_ADDRS];
NetifMulticastAddress mExtMulticastAddresses[OPENTHREAD_CONFIG_IP6_MAX_EXT_MCAST_ADDRS];
static const otNetifMulticastAddress kRealmLocalAllMplForwardersMulticastAddress;
static const otNetifMulticastAddress kLinkLocalAllNodesMulticastAddress;
static const otNetifMulticastAddress kRealmLocalAllNodesMulticastAddress;
static const otNetifMulticastAddress kLinkLocalAllRoutersMulticastAddress;
static const otNetifMulticastAddress kRealmLocalAllRoutersMulticastAddress;
};
} }
#endif