blob: 6988aa6e5deca36577e52b9c2133951ac304abc2 [file] [log] [blame]
/*
* Copyright (c) 2016, 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 IPv6 addresses.
*/
#ifndef IP6_ADDRESS_HPP_
#define IP6_ADDRESS_HPP_
#include "utils/wrap_stdint.h"
#include <openthread/types.h>
#include "mac/mac_frame.hpp"
namespace ot {
namespace Ip6 {
/**
* @addtogroup core-ip6-ip6
*
* @{
*
*/
/**
* This class implements an IPv6 address object.
*
*/
OT_TOOL_PACKED_BEGIN
class Address: public otIp6Address
{
public:
/**
* Masks
*
*/
enum
{
kAloc16Mask = 0xfc, ///< The mask for Aloc16.
kRloc16ReservedBitMask = 0x02, ///< The mask for the reserved bit of Rloc16.
};
/**
* Constants
*
*/
enum
{
kInterfaceIdentifierSize = 8, ///< Interface Identifier size in bytes.
kIp6AddressStringSize = 40, ///< Max buffer size in bytes to store an IPv6 address in string format.
kMeshLocalPrefixLength = 64, ///< Length of Thread mesh local prefix.
};
/**
* IPv6 Address Scopes
*/
enum
{
kNodeLocalScope = 0, ///< Node-Local scope
kInterfaceLocalScope = 1, ///< Interface-Local scope
kLinkLocalScope = 2, ///< Link-Local scope
kRealmLocalScope = 3, ///< Realm-Local scope
kAdminLocalScope = 4, ///< Admin-Local scope
kSiteLocalScope = 5, ///< Site-Local scope
kOrgLocalScope = 8, ///< Organization-Local scope
kGlobalScope = 14, ///< Global scope
};
/**
* This method indicates whether or not the IPv6 address is the Unspecified Address.
*
* @retval TRUE If the IPv6 address is the Unspecified Address.
* @retval FALSE If the IPv6 address is not the Unspecified Address.
*
*/
bool IsUnspecified(void) const;
/**
* This method indicates whether or not the IPv6 address is the Loopback Address.
*
* @retval TRUE If the IPv6 address is the Loopback Address.
* @retval FALSE If the IPv6 address is not the Loopback Address.
*
*/
bool IsLoopback(void) const;
/**
* This method indicates whether or not the IPv6 address scope is Interface-Local.
*
* @retval TRUE If the IPv6 address scope is Interface-Local.
* @retval FALSE If the IPv6 address scope is not Interface-Local.
*
*/
bool IsInterfaceLocal(void) const;
/**
* This method indicates whether or not the IPv6 address scope is Link-Local.
*
* @retval TRUE If the IPv6 address scope is Link-Local.
* @retval FALSE If the IPv6 address scope is not Link-Local.
*
*/
bool IsLinkLocal(void) const;
/**
* This method indicates whether or not the IPv6 address is multicast address.
*
* @retval TRUE If the IPv6 address is a multicast address.
* @retval FALSE If the IPv6 address scope is not a multicast address.
*
*/
bool IsMulticast(void) const;
/**
* This method indicates whether or not the IPv6 address is a link-local multicast address.
*
* @retval TRUE If the IPv6 address is a link-local multicast address.
* @retval FALSE If the IPv6 address scope is not a link-local multicast address.
*
*/
bool IsLinkLocalMulticast(void) const;
/**
* This method indicates whether or not the IPv6 address is a link-local all nodes multicast address.
*
* @retval TRUE If the IPv6 address is a link-local all nodes multicast address.
* @retval FALSE If the IPv6 address is not a link-local all nodes multicast address.
*
*/
bool IsLinkLocalAllNodesMulticast(void) const;
/**
* This method indicates whether or not the IPv6 address is a link-local all routers multicast address.
*
* @retval TRUE If the IPv6 address is a link-local all routers multicast address.
* @retval FALSE If the IPv6 address is not a link-local all routers multicast address.
*
*/
bool IsLinkLocalAllRoutersMulticast(void) const;
/**
* This method indicates whether or not the IPv6 address is a realm-local multicast address.
*
* @retval TRUE If the IPv6 address is a realm-local multicast address.
* @retval FALSE If the IPv6 address scope is not a realm-local multicast address.
*
*/
bool IsRealmLocalMulticast(void) const;
/**
* This method indicates whether or not the IPv6 address is a realm-local all nodes multicast address.
*
* @retval TRUE If the IPv6 address is a realm-local all nodes multicast address.
* @retval FALSE If the IPv6 address is not a realm-local all nodes multicast address.
*
*/
bool IsRealmLocalAllNodesMulticast(void) const;
/**
* This method indicates whether or not the IPv6 address is a realm-local all routers multicast address.
*
* @retval TRUE If the IPv6 address is a realm-local all routers multicast address.
* @retval FALSE If the IPv6 address is not a realm-local all routers multicast address.
*
*/
bool IsRealmLocalAllRoutersMulticast(void) const;
/**
* This method indicates whether or not the IPv6 address is a realm-local all MPL forwarders address.
*
* @retval TRUE If the IPv6 address is a realm-local all MPL forwarders address.
* @retval FALSE If the IPv6 address is not a realm-local all MPL forwarders address.
*
*/
bool IsRealmLocalAllMplForwarders(void) const;
/**
* This method indicates whether or not the IPv6 address is a RLOC address.
*
* @retval TRUE If the IPv6 address is a RLOC address.
* @retval FALSE If the IPv6 address is not a RLOC address.
*
*/
bool IsRoutingLocator(void) const;
/**
* This method indicates whether or not the IPv6 address is an Anycast RLOC address.
*
* @retval TRUE If the IPv6 address is an Anycast RLOC address.
* @retval FALSE If the IPv6 address is not an Anycast RLOC address.
*
*/
bool IsAnycastRoutingLocator(void) const;
/**
* This method indicates whether or not the IPv6 address is Subnet-Router Anycast (RFC 4291),
*
* @retval TRUE If the IPv6 address is a Subnet-Router Anycast address.
* @retval FALSE If the IPv6 address is not a Subnet-Router Anycast address.
*
*/
bool IsSubnetRouterAnycast(void) const;
/**
* This method indicates whether or not the IPv6 address is Reserved Subnet Anycast (RFC 2526),
*
* @retval TRUE If the IPv6 address is a Reserved Subnet Anycast address.
* @retval FALSE If the IPv6 address is not a Reserved Subnet Anycast address.
*
*/
bool IsReservedSubnetAnycast(void) const;
/**
* This method indicates whether or not the IPv6 address contains Reserved IPv6 IID (RFC 5453),
*
* @retval TRUE If the IPv6 address contains a reserved IPv6 IID.
* @retval FALSE If the IPv6 address does not contain a reserved IPv6 IID.
*
*/
bool IsIidReserved(void) const;
/**
* This method returns a pointer to the Interface Identifier.
*
* @returns A pointer to the Interface Identifier.
*
*/
const uint8_t *GetIid(void) const;
/**
* This method returns a pointer to the Interface Identifier.
*
* @returns A pointer to the Interface Identifier.
*
*/
uint8_t *GetIid(void);
/**
* This method sets the Interface Identifier.
*
* @param[in] aIid A reference to the Interface Identifier.
*
*/
void SetIid(const uint8_t *aIid);
/**
* This method sets the Interface Identifier.
*
* @param[in] aEui64 A reference to the IEEE EUI-64 address.
*
*/
void SetIid(const Mac::ExtAddress &aEui64);
/**
* This method returns the IPv6 address scope.
*
* @returns The IPv6 address scope.
*
*/
uint8_t GetScope(void) const;
/**
* This method returns the number of IPv6 prefix bits that match.
*
* @param[in] aOther The IPv6 address to match against.
*
* @returns The number of IPv6 prefix bits that match.
*
*/
uint8_t PrefixMatch(const Address &aOther) const;
/**
* This method evaluates whether or not the IPv6 addresses match.
*
* @param[in] aOther The IPv6 address to compare.
*
* @retval TRUE If the IPv6 addresses match.
* @retval FALSE If the IPv6 addresses do not match.
*
*/
bool operator==(const Address &aOther) const;
/**
* This method evaluates whether or not the IPv6 addresses differ.
*
* @param[in] aOther The IPv6 address to compare.
*
* @retval TRUE If the IPv6 addresses differ.
* @retval FALSE If the IPv6 addresses do not differ.
*
*/
bool operator!=(const Address &aOther) const;
/**
* This method converts an IPv6 address string to binary.
*
* @param[in] aBuf A pointer to the NULL-terminated string.
*
* @retval OT_ERROR_NONE Successfully parsed the IPv6 address string.
* @retval OT_ERROR_INVALID_ARGS Failed to parse the IPv6 address string.
*
*/
otError FromString(const char *aBuf);
/**
* This method converts an IPv6 address object to a NULL-terminated string.
*
* @param[out] aBuf A pointer to the buffer.
* @param[in] aSize The maximum size of the buffer.
*
* @returns A pointer to the buffer.
*
*/
const char *ToString(char *aBuf, uint16_t aSize) const;
/**
* This method returns the number of IPv6 prefix bits that match.
*
* @param[in] aPrefixA A pointer to the prefix to match.
* @param[in] aPrefixB A pointer to the prefix to match against.
* @param[in] aMaxLength Number of bytes of the two prefixes.
*
* @returns The number of prefix bits that match.
*
*/
static uint8_t PrefixMatch(const uint8_t *aPrefixA, const uint8_t *aPrefixB, uint8_t aMaxLength);
private:
enum
{
kInterfaceIdentifierOffset = 8, ///< Interface Identifier offset in bytes.
};
} OT_TOOL_PACKED_END;
/**
* @}
*
*/
} // namespace Ip6
} // namespace ot
#endif // NET_IP6_ADDRESS_HPP_