blob: ffe14a47d6ea462ecf58c8a4416a41e8ea73abcf [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 generating and processing MeshCoP TLVs.
*
*/
#ifndef MESHCOP_TLVS_HPP_
#define MESHCOP_TLVS_HPP_
#include "openthread-core-config.h"
#include <openthread/commissioner.h>
#include <openthread/dataset.h>
#include <openthread/platform/radio.h>
#include "common/const_cast.hpp"
#include "common/encoding.hpp"
#include "common/message.hpp"
#include "common/string.hpp"
#include "common/tlvs.hpp"
#include "mac/mac_types.hpp"
#include "meshcop/extended_panid.hpp"
#include "meshcop/network_name.hpp"
#include "meshcop/timestamp.hpp"
#include "net/ip6_address.hpp"
#include "radio/radio.hpp"
#include "thread/key_manager.hpp"
#include "thread/mle_types.hpp"
namespace ot {
namespace MeshCoP {
using ot::Encoding::BigEndian::HostSwap16;
using ot::Encoding::BigEndian::HostSwap32;
using ot::Encoding::BigEndian::ReadUint24;
using ot::Encoding::BigEndian::WriteUint24;
/**
* This class implements MeshCoP TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class Tlv : public ot::Tlv
{
public:
/**
* MeshCoP TLV Types.
*
*/
enum Type : uint8_t
{
kChannel = OT_MESHCOP_TLV_CHANNEL, ///< Channel TLV
kPanId = OT_MESHCOP_TLV_PANID, ///< PAN ID TLV
kExtendedPanId = OT_MESHCOP_TLV_EXTPANID, ///< Extended PAN ID TLV
kNetworkName = OT_MESHCOP_TLV_NETWORKNAME, ///< Network Name TLV
kPskc = OT_MESHCOP_TLV_PSKC, ///< PSKc TLV
kNetworkKey = OT_MESHCOP_TLV_NETWORKKEY, ///< Network Network Key TLV
kNetworkKeySequence = OT_MESHCOP_TLV_NETWORK_KEY_SEQUENCE, ///< Network Key Sequence TLV
kMeshLocalPrefix = OT_MESHCOP_TLV_MESHLOCALPREFIX, ///< Mesh Local Prefix TLV
kSteeringData = OT_MESHCOP_TLV_STEERING_DATA, ///< Steering Data TLV
kBorderAgentLocator = OT_MESHCOP_TLV_BORDER_AGENT_RLOC, ///< Border Agent Locator TLV
kCommissionerId = OT_MESHCOP_TLV_COMMISSIONER_ID, ///< Commissioner ID TLV
kCommissionerSessionId = OT_MESHCOP_TLV_COMM_SESSION_ID, ///< Commissioner Session ID TLV
kSecurityPolicy = OT_MESHCOP_TLV_SECURITYPOLICY, ///< Security Policy TLV
kGet = OT_MESHCOP_TLV_GET, ///< Get TLV
kActiveTimestamp = OT_MESHCOP_TLV_ACTIVETIMESTAMP, ///< Active Timestamp TLV
kCommissionerUdpPort = OT_MESHCOP_TLV_COMMISSIONER_UDP_PORT, ///< Commissioner UDP Port TLV
kState = OT_MESHCOP_TLV_STATE, ///< State TLV
kJoinerDtlsEncapsulation = OT_MESHCOP_TLV_JOINER_DTLS, ///< Joiner DTLS Encapsulation TLV
kJoinerUdpPort = OT_MESHCOP_TLV_JOINER_UDP_PORT, ///< Joiner UDP Port TLV
kJoinerIid = OT_MESHCOP_TLV_JOINER_IID, ///< Joiner IID TLV
kJoinerRouterLocator = OT_MESHCOP_TLV_JOINER_RLOC, ///< Joiner Router Locator TLV
kJoinerRouterKek = OT_MESHCOP_TLV_JOINER_ROUTER_KEK, ///< Joiner Router KEK TLV
kProvisioningUrl = OT_MESHCOP_TLV_PROVISIONING_URL, ///< Provisioning URL TLV
kVendorName = OT_MESHCOP_TLV_VENDOR_NAME_TLV, ///< meshcop Vendor Name TLV
kVendorModel = OT_MESHCOP_TLV_VENDOR_MODEL_TLV, ///< meshcop Vendor Model TLV
kVendorSwVersion = OT_MESHCOP_TLV_VENDOR_SW_VERSION_TLV, ///< meshcop Vendor SW Version TLV
kVendorData = OT_MESHCOP_TLV_VENDOR_DATA_TLV, ///< meshcop Vendor Data TLV
kVendorStackVersion = OT_MESHCOP_TLV_VENDOR_STACK_VERSION_TLV, ///< meshcop Vendor Stack Version TLV
kUdpEncapsulation = OT_MESHCOP_TLV_UDP_ENCAPSULATION_TLV, ///< meshcop UDP encapsulation TLV
kIp6Address = OT_MESHCOP_TLV_IPV6_ADDRESS_TLV, ///< meshcop IPv6 address TLV
kPendingTimestamp = OT_MESHCOP_TLV_PENDINGTIMESTAMP, ///< Pending Timestamp TLV
kDelayTimer = OT_MESHCOP_TLV_DELAYTIMER, ///< Delay Timer TLV
kChannelMask = OT_MESHCOP_TLV_CHANNELMASK, ///< Channel Mask TLV
kCount = OT_MESHCOP_TLV_COUNT, ///< Count TLV
kPeriod = OT_MESHCOP_TLV_PERIOD, ///< Period TLV
kScanDuration = OT_MESHCOP_TLV_SCAN_DURATION, ///< Scan Duration TLV
kEnergyList = OT_MESHCOP_TLV_ENERGY_LIST, ///< Energy List TLV
kDiscoveryRequest = OT_MESHCOP_TLV_DISCOVERYREQUEST, ///< Discovery Request TLV
kDiscoveryResponse = OT_MESHCOP_TLV_DISCOVERYRESPONSE, ///< Discovery Response TLV
kJoinerAdvertisement = OT_MESHCOP_TLV_JOINERADVERTISEMENT, ///< Joiner Advertisement TLV
};
/**
* This method returns the Type value.
*
* @returns The Type value.
*
*/
Type GetType(void) const { return static_cast<Type>(ot::Tlv::GetType()); }
/**
* This method sets the Type value.
*
* @param[in] aType The Type value.
*
*/
void SetType(Type aType) { ot::Tlv::SetType(static_cast<uint8_t>(aType)); }
/**
* This method returns a pointer to the next TLV.
*
* @returns A pointer to the next TLV.
*
*/
Tlv *GetNext(void) { return As<Tlv>(ot::Tlv::GetNext()); }
/**
* This method returns a pointer to the next TLV.
*
* @returns A pointer to the next TLV.
*
*/
const Tlv *GetNext(void) const { return As<Tlv>(ot::Tlv::GetNext()); }
/**
* This static method reads the requested TLV out of @p aMessage.
*
* @param[in] aMessage A reference to the message.
* @param[in] aType The Type value to search for.
* @param[in] aMaxLength Maximum number of bytes to read.
* @param[out] aTlv A reference to the TLV that will be copied to.
*
* @retval kErrorNone Successfully copied the TLV.
* @retval kErrorNotFound Could not find the TLV with Type @p aType.
*
*/
static Error FindTlv(const Message &aMessage, Type aType, uint16_t aMaxLength, Tlv &aTlv)
{
return ot::Tlv::FindTlv(aMessage, static_cast<uint8_t>(aType), aMaxLength, aTlv);
}
/**
* This static method reads the requested TLV out of @p aMessage.
*
* This method can be used independent of whether the read TLV (from message) is an Extended TLV or not.
*
* @tparam TlvType The TlvType to search for (must be a sub-class of `Tlv`).
*
* @param[in] aMessage A reference to the message.
* @param[out] aTlv A reference to the TLV that will be copied to.
*
* @retval kErrorNone Successfully copied the TLV.
* @retval kErrorNotFound Could not find the TLV with Type @p aType.
*
*/
template <typename TlvType> static Error FindTlv(const Message &aMessage, TlvType &aTlv)
{
return ot::Tlv::FindTlv(aMessage, aTlv);
}
/**
* This static method indicates whether a TLV appears to be well-formed.
*
* @param[in] aTlv A reference to the TLV.
*
* @returns TRUE if the TLV appears to be well-formed, FALSE otherwise.
*
*/
static bool IsValid(const Tlv &aTlv);
/**
* This static method searches in a given sequence of TLVs to find the first TLV with a given template Type.
*
* @param[in] aTlvsStart A pointer to the start of the sequence of TLVs to search within.
* @param[in] aTlvsLength The length (number of bytes) in TLV sequence.
* @param[in] aType The TLV Type to search for.
*
* @returns A pointer to the TLV if found, or `nullptr` if not found.
*
*/
static Tlv *FindTlv(uint8_t *aTlvsStart, uint16_t aTlvsLength, Type aType)
{
return AsNonConst(FindTlv(AsConst(aTlvsStart), aTlvsLength, aType));
}
/**
* This static method searches in a given sequence of TLVs to find the first TLV with a given template Type.
*
* @param[in] aTlvsStart A pointer to the start of the sequence of TLVs to search within.
* @param[in] aTlvsLength The length (number of bytes) in TLV sequence.
* @param[in] aType The TLV Type to search for.
*
* @returns A pointer to the TLV if found, or `nullptr` if not found.
*
*/
static const Tlv *FindTlv(const uint8_t *aTlvsStart, uint16_t aTlvsLength, Type aType);
/**
* This static template method searches in a given sequence of TLVs to find the first TLV with a give template
* `TlvType`.
*
* @param[in] aTlvsStart A pointer to the start of the sequence of TLVs to search within.
* @param[in] aTlvsLength The length (number of bytes) in TLV sequence.
*
* @returns A pointer to the TLV if found, or `nullptr` if not found.
*
*/
template <typename TlvType> static TlvType *FindTlv(uint8_t *aTlvsStart, uint16_t aTlvsLength)
{
return As<TlvType>(FindTlv(aTlvsStart, aTlvsLength, static_cast<Tlv::Type>(TlvType::kType)));
}
/**
* This static template method searches in a given sequence of TLVs to find the first TLV with a give template
* `TlvType`.
*
* @param[in] aTlvsStart A pointer to the start of the sequence of TLVs to search within.
* @param[in] aTlvsLength The length (number of bytes) in TLV sequence.
*
* @returns A pointer to the TLV if found, or `nullptr` if not found.
*
*/
template <typename TlvType> static const TlvType *FindTlv(const uint8_t *aTlvsStart, uint16_t aTlvsLength)
{
return As<TlvType>(FindTlv(aTlvsStart, aTlvsLength, static_cast<Tlv::Type>(TlvType::kType)));
}
} OT_TOOL_PACKED_END;
/**
* This class implements extended MeshCoP TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ExtendedTlv : public ot::ExtendedTlv
{
public:
/**
* This method returns the Type value.
*
* @returns The Type value.
*
*/
MeshCoP::Tlv::Type GetType(void) const { return static_cast<MeshCoP::Tlv::Type>(ot::ExtendedTlv::GetType()); }
/**
* This method sets the Type value.
*
* @param[in] aType The Type value.
*
*/
void SetType(MeshCoP::Tlv::Type aType) { ot::ExtendedTlv::SetType(static_cast<uint8_t>(aType)); }
} OT_TOOL_PACKED_END;
/**
* This class defines Commissioner UDP Port TLV constants and types.
*
*/
typedef UintTlvInfo<Tlv::kCommissionerUdpPort, uint16_t> CommissionerUdpPortTlv;
/**
* This class defines IPv6 Address TLV constants and types.
*
*/
typedef SimpleTlvInfo<Tlv::kIp6Address, Ip6::Address> Ip6AddressTlv;
/**
* This class defines Joiner IID TLV constants and types.
*
*/
typedef SimpleTlvInfo<Tlv::kJoinerIid, Ip6::InterfaceIdentifier> JoinerIidTlv;
/**
* This class defines Joiner Router Locator TLV constants and types.
*
*/
typedef UintTlvInfo<Tlv::kJoinerRouterLocator, uint16_t> JoinerRouterLocatorTlv;
/**
* This class defines Joiner Router KEK TLV constants and types.
*
*/
typedef SimpleTlvInfo<Tlv::kJoinerRouterKek, Kek> JoinerRouterKekTlv;
/**
* This class defines Count TLV constants and types.
*
*/
typedef UintTlvInfo<Tlv::kCount, uint8_t> CountTlv;
/**
* This class defines Period TLV constants and types.
*
*/
typedef UintTlvInfo<Tlv::kPeriod, uint16_t> PeriodTlv;
/**
* This class defines Scan Duration TLV constants and types.
*
*/
typedef UintTlvInfo<Tlv::kScanDuration, uint16_t> ScanDurationTlv;
/**
* This class implements Channel TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ChannelTlv : public Tlv, public TlvInfo<Tlv::kChannel>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kChannel);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const;
/**
* This method returns the ChannelPage value.
*
* @returns The ChannelPage value.
*
*/
uint8_t GetChannelPage(void) const { return mChannelPage; }
/**
* This method sets the ChannelPage value.
*
* @param[in] aChannelPage The ChannelPage value.
*
*/
void SetChannelPage(uint8_t aChannelPage) { mChannelPage = aChannelPage; }
/**
* This method returns the Channel value.
*
* @returns The Channel value.
*
*/
uint16_t GetChannel(void) const { return HostSwap16(mChannel); }
/**
* This method sets the Channel value.
* Note: This method also sets the channel page according to the channel value.
*
* @param[in] aChannel The Channel value.
*
*/
void SetChannel(uint16_t aChannel);
private:
uint8_t mChannelPage;
uint16_t mChannel;
} OT_TOOL_PACKED_END;
/**
* This class implements PAN ID TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class PanIdTlv : public Tlv, public UintTlvInfo<Tlv::kPanId, uint16_t>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kPanId);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the PAN ID value.
*
* @returns The PAN ID value.
*
*/
uint16_t GetPanId(void) const { return HostSwap16(mPanId); }
/**
* This method sets the PAN ID value.
*
* @param[in] aPanId The PAN ID value.
*
*/
void SetPanId(uint16_t aPanId) { mPanId = HostSwap16(aPanId); }
private:
uint16_t mPanId;
} OT_TOOL_PACKED_END;
/**
* This class implements Extended PAN ID TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ExtendedPanIdTlv : public Tlv, public SimpleTlvInfo<Tlv::kExtendedPanId, ExtendedPanId>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kExtendedPanId);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the Extended PAN ID value.
*
* @returns The Extended PAN ID value.
*
*/
const ExtendedPanId &GetExtendedPanId(void) const { return mExtendedPanId; }
/**
* This method sets the Extended PAN ID value.
*
* @param[in] aExtendedPanId An Extended PAN ID value.
*
*/
void SetExtendedPanId(const ExtendedPanId &aExtendedPanId) { mExtendedPanId = aExtendedPanId; }
private:
ExtendedPanId mExtendedPanId;
} OT_TOOL_PACKED_END;
/**
* This class implements Network Name TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class NetworkNameTlv : public Tlv, public TlvInfo<Tlv::kNetworkName>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kNetworkName);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const;
/**
* This method gets the Network Name value.
*
* @returns The Network Name value (as `NameData`).
*
*/
NameData GetNetworkName(void) const;
/**
* This method sets the Network Name value.
*
* @param[in] aNameData A Network Name value (as `NameData`).
*
*/
void SetNetworkName(const NameData &aNameData);
private:
char mNetworkName[NetworkName::kMaxSize];
} OT_TOOL_PACKED_END;
/**
* This class implements PSKc TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class PskcTlv : public Tlv, public SimpleTlvInfo<Tlv::kPskc, Pskc>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kPskc);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the PSKc value.
*
* @returns The PSKc value.
*
*/
const Pskc &GetPskc(void) const { return mPskc; }
/**
* This method sets the PSKc value.
*
* @param[in] aPskc A pointer to the PSKc value.
*
*/
void SetPskc(const Pskc &aPskc) { mPskc = aPskc; }
private:
Pskc mPskc;
} OT_TOOL_PACKED_END;
/**
* This class implements Network Network Key TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class NetworkKeyTlv : public Tlv, public SimpleTlvInfo<Tlv::kNetworkKey, NetworkKey>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kNetworkKey);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the Network Network Key value.
*
* @returns The Network Network Key value.
*
*/
const NetworkKey &GetNetworkKey(void) const { return mNetworkKey; }
/**
* This method sets the Network Network Key value.
*
* @param[in] aNetworkKey The Network Network Key.
*
*/
void SetNetworkKey(const NetworkKey &aNetworkKey) { mNetworkKey = aNetworkKey; }
private:
NetworkKey mNetworkKey;
} OT_TOOL_PACKED_END;
/**
* This class implements Network Key Sequence TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class NetworkKeySequenceTlv : public Tlv, public UintTlvInfo<Tlv::kNetworkKeySequence, uint32_t>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kNetworkKeySequence);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the Network Key Sequence value.
*
* @returns The Network Key Sequence value.
*
*/
uint32_t GetNetworkKeySequence(void) const { return HostSwap32(mNetworkKeySequence); }
/**
* This method sets the Network Key Sequence value.
*
* @param[in] aNetworkKeySequence The Network Key Sequence value.
*
*/
void SetNetworkKeySequence(uint32_t aNetworkKeySequence) { mNetworkKeySequence = HostSwap32(aNetworkKeySequence); }
private:
uint32_t mNetworkKeySequence;
} OT_TOOL_PACKED_END;
/**
* This class implements Mesh Local Prefix TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class MeshLocalPrefixTlv : public Tlv, public SimpleTlvInfo<Tlv::kMeshLocalPrefix, Mle::MeshLocalPrefix>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kMeshLocalPrefix);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the size (in bytes) of the Mesh Local Prefix field.
*
* @returns The size (in bytes) of the Mesh Local Prefix field (8 bytes).
*
*/
uint8_t GetMeshLocalPrefixLength(void) const { return sizeof(mMeshLocalPrefix); }
/**
* This method returns the Mesh Local Prefix value.
*
* @returns The Mesh Local Prefix value.
*
*/
const Mle::MeshLocalPrefix &GetMeshLocalPrefix(void) const { return mMeshLocalPrefix; }
/**
* This method sets the Mesh Local Prefix value.
*
* @param[in] aMeshLocalPrefix A pointer to the Mesh Local Prefix value.
*
*/
void SetMeshLocalPrefix(const Mle::MeshLocalPrefix &aMeshLocalPrefix) { mMeshLocalPrefix = aMeshLocalPrefix; }
private:
Mle::MeshLocalPrefix mMeshLocalPrefix;
} OT_TOOL_PACKED_END;
class SteeringData;
/**
* This class implements Steering Data TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class SteeringDataTlv : public Tlv, public TlvInfo<Tlv::kSteeringData>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kSteeringData);
SetLength(sizeof(*this) - sizeof(Tlv));
Clear();
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() > 0; }
/**
* This method returns the Steering Data length.
*
* @returns The Steering Data length.
*
*/
uint8_t GetSteeringDataLength(void) const
{
return GetLength() <= sizeof(mSteeringData) ? GetLength() : sizeof(mSteeringData);
}
/**
* This method sets all bits in the Bloom Filter to zero.
*
*/
void Clear(void) { memset(mSteeringData, 0, GetSteeringDataLength()); }
/**
* This method copies the Steering Data from the TLV into a given `SteeringData` variable.
*
* @param[out] aSteeringData A reference to a `SteeringData` to copy into.
*
*/
void CopyTo(SteeringData &aSteeringData) const;
private:
uint8_t mSteeringData[OT_STEERING_DATA_MAX_LENGTH];
} OT_TOOL_PACKED_END;
/**
* This class implements Border Agent Locator TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class BorderAgentLocatorTlv : public Tlv, public UintTlvInfo<Tlv::kBorderAgentLocator, uint16_t>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kBorderAgentLocator);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the Border Agent Locator value.
*
* @returns The Border Agent Locator value.
*
*/
uint16_t GetBorderAgentLocator(void) const { return HostSwap16(mLocator); }
/**
* This method sets the Border Agent Locator value.
*
* @param[in] aLocator The Border Agent Locator value.
*
*/
void SetBorderAgentLocator(uint16_t aLocator) { mLocator = HostSwap16(aLocator); }
private:
uint16_t mLocator;
} OT_TOOL_PACKED_END;
/**
* This class implements the Commissioner ID TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class CommissionerIdTlv : public Tlv, public TlvInfo<Tlv::kCommissionerId>
{
public:
static constexpr uint8_t kMaxLength = 64; ///< maximum length (bytes)
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kCommissionerId);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method returns the Commissioner ID length.
*
* @returns The Commissioner ID length.
*
*/
uint8_t GetCommissionerIdLength(void) const
{
return GetLength() <= sizeof(mCommissionerId) ? GetLength() : sizeof(mCommissionerId);
}
/**
* This method returns the Commissioner ID value.
*
* @returns The Commissioner ID value.
*
*/
const char *GetCommissionerId(void) const { return mCommissionerId; }
/**
* This method sets the Commissioner ID value.
*
* @param[in] aCommissionerId A pointer to the Commissioner ID value.
*
*/
void SetCommissionerId(const char *aCommissionerId)
{
uint16_t length = StringLength(aCommissionerId, sizeof(mCommissionerId));
memcpy(mCommissionerId, aCommissionerId, length);
SetLength(static_cast<uint8_t>(length));
}
private:
char mCommissionerId[kMaxLength];
} OT_TOOL_PACKED_END;
/**
* This class implements Commissioner Session ID TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class CommissionerSessionIdTlv : public Tlv, public UintTlvInfo<Tlv::kCommissionerSessionId, uint16_t>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kCommissionerSessionId);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the Commissioner Session ID value.
*
* @returns The Commissioner Session ID value.
*
*/
uint16_t GetCommissionerSessionId(void) const { return HostSwap16(mSessionId); }
/**
* This method sets the Commissioner Session ID value.
*
* @param[in] aSessionId The Commissioner Session ID value.
*
*/
void SetCommissionerSessionId(uint16_t aSessionId) { mSessionId = HostSwap16(aSessionId); }
private:
uint16_t mSessionId;
} OT_TOOL_PACKED_END;
/**
* This class implements Security Policy TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class SecurityPolicyTlv : public Tlv, public TlvInfo<Tlv::kSecurityPolicy>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kSecurityPolicy);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const;
/**
* This method returns the Security Policy.
*
* @returns The Security Policy.
*
*/
SecurityPolicy GetSecurityPolicy(void) const;
/**
* This method sets the Security Policy.
*
* @param[in] aSecurityPolicy The Security Policy which will be set.
*
*/
void SetSecurityPolicy(const SecurityPolicy &aSecurityPolicy);
private:
static constexpr uint8_t kThread11FlagsLength = 1; // The Thread 1.1 Security Policy Flags length.
static constexpr uint8_t kThread12FlagsLength = 2; // The Thread 1.2 Security Policy Flags length.
void SetRotationTime(uint16_t aRotationTime) { mRotationTime = HostSwap16(aRotationTime); }
uint16_t GetRotationTime(void) const { return HostSwap16(mRotationTime); }
uint8_t GetFlagsLength(void) const { return GetLength() - sizeof(mRotationTime); }
uint16_t mRotationTime;
#if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2
uint8_t mFlags[kThread12FlagsLength];
#else
uint8_t mFlags[kThread11FlagsLength];
#endif
} OT_TOOL_PACKED_END;
/**
* This class implements Active Timestamp TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ActiveTimestampTlv : public Tlv, public SimpleTlvInfo<Tlv::kActiveTimestamp, Timestamp>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kActiveTimestamp);
SetLength(sizeof(*this) - sizeof(Tlv));
mTimestamp.Clear();
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method gets the timestamp.
*
* @returns The timestamp.
*
*/
const Timestamp &GetTimestamp(void) const { return mTimestamp; }
/**
* This method returns a reference to the timestamp.
*
* @returns A reference to the timestamp.
*
*/
Timestamp &GetTimestamp(void) { return mTimestamp; }
/**
* This method sets the timestamp.
*
* @param[in] aTimestamp The new timestamp.
*
*/
void SetTimestamp(const Timestamp &aTimestamp) { mTimestamp = aTimestamp; }
private:
Timestamp mTimestamp;
} OT_TOOL_PACKED_END;
/**
* This class implements State TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class StateTlv : public Tlv, public UintTlvInfo<Tlv::kState, uint8_t>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kState);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* State values.
*
*/
enum State : uint8_t
{
kReject = 0xff, ///< Reject (-1)
kPending = 0, ///< Pending
kAccept = 1, ///< Accept
};
/**
* This method returns the State value.
*
* @returns The State value.
*
*/
State GetState(void) const { return static_cast<State>(mState); }
/**
* This method sets the State value.
*
* @param[in] aState The State value.
*
*/
void SetState(State aState) { mState = static_cast<uint8_t>(aState); }
private:
uint8_t mState;
} OT_TOOL_PACKED_END;
/**
* This class implements Joiner UDP Port TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class JoinerUdpPortTlv : public Tlv, public UintTlvInfo<Tlv::kJoinerUdpPort, uint16_t>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kJoinerUdpPort);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the UDP Port value.
*
* @returns The UDP Port value.
*
*/
uint16_t GetUdpPort(void) const { return HostSwap16(mUdpPort); }
/**
* This method sets the UDP Port value.
*
* @param[in] aUdpPort The UDP Port value.
*
*/
void SetUdpPort(uint16_t aUdpPort) { mUdpPort = HostSwap16(aUdpPort); }
private:
uint16_t mUdpPort;
} OT_TOOL_PACKED_END;
/**
* This class implements Pending Timestamp TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class PendingTimestampTlv : public Tlv, public SimpleTlvInfo<Tlv::kPendingTimestamp, Timestamp>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kPendingTimestamp);
SetLength(sizeof(*this) - sizeof(Tlv));
mTimestamp.Clear();
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method gets the timestamp.
*
* @returns The timestamp.
*
*/
const Timestamp &GetTimestamp(void) const { return mTimestamp; }
/**
* This method returns a reference to the timestamp.
*
* @returns A reference to the timestamp.
*
*/
Timestamp &GetTimestamp(void) { return mTimestamp; }
/**
* This method sets the timestamp.
*
* @param[in] aTimestamp The new timestamp.
*
*/
void SetTimestamp(const Timestamp &aTimestamp) { mTimestamp = aTimestamp; }
private:
Timestamp mTimestamp;
} OT_TOOL_PACKED_END;
/**
* This class implements Delay Timer TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class DelayTimerTlv : public Tlv, public UintTlvInfo<Tlv::kDelayTimer, uint32_t>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kDelayTimer);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the Delay Timer value.
*
* @returns The Delay Timer value.
*
*/
uint32_t GetDelayTimer(void) const { return HostSwap32(mDelayTimer); }
/**
* This method sets the Delay Timer value.
*
* @param[in] aDelayTimer The Delay Timer value.
*
*/
void SetDelayTimer(uint32_t aDelayTimer) { mDelayTimer = HostSwap32(aDelayTimer); }
static constexpr uint32_t kMaxDelayTimer = 259200; ///< Maximum delay timer value for a Pending Dataset in seconds
/**
* Minimum Delay Timer value for a Pending Operational Dataset (ms)
*
*/
static constexpr uint32_t kDelayTimerMinimal = OPENTHREAD_CONFIG_TMF_PENDING_DATASET_MINIMUM_DELAY;
/**
* Default Delay Timer value for a Pending Operational Dataset (ms)
*
*/
static constexpr uint32_t kDelayTimerDefault = OPENTHREAD_CONFIG_TMF_PENDING_DATASET_DEFAULT_DELAY;
private:
uint32_t mDelayTimer;
} OT_TOOL_PACKED_END;
// forward declare ChannelMaskTlv
class ChannelMaskTlv;
/**
* This class implements Channel Mask Entry generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ChannelMaskEntryBase
{
public:
/**
* This method gets the ChannelPage value.
*
* @returns The ChannelPage value.
*
*/
uint8_t GetChannelPage(void) const { return mChannelPage; }
/**
* This method sets the ChannelPage value.
*
* @param[in] aChannelPage The ChannelPage value.
*
*/
void SetChannelPage(uint8_t aChannelPage) { mChannelPage = aChannelPage; }
/**
* This method gets the MaskLength value.
*
* @returns The MaskLength value.
*
*/
uint8_t GetMaskLength(void) const { return mMaskLength; }
/**
* This method sets the MaskLength value.
*
* @param[in] aMaskLength The MaskLength value.
*
*/
void SetMaskLength(uint8_t aMaskLength) { mMaskLength = aMaskLength; }
/**
* This method returns the total size of this Channel Mask Entry including the mask.
*
* @returns The total size of this entry (number of bytes).
*
*/
uint16_t GetEntrySize(void) const { return sizeof(ChannelMaskEntryBase) + mMaskLength; }
/**
* This method clears the bit corresponding to @p aChannel in ChannelMask.
*
* @param[in] aChannel The channel in ChannelMask to clear.
*
*/
void ClearChannel(uint8_t aChannel)
{
uint8_t *mask = reinterpret_cast<uint8_t *>(this) + sizeof(*this);
mask[aChannel / 8] &= ~(0x80 >> (aChannel % 8));
}
/**
* This method sets the bit corresponding to @p aChannel in ChannelMask.
*
* @param[in] aChannel The channel in ChannelMask to set.
*
*/
void SetChannel(uint8_t aChannel)
{
uint8_t *mask = reinterpret_cast<uint8_t *>(this) + sizeof(*this);
mask[aChannel / 8] |= 0x80 >> (aChannel % 8);
}
/**
* This method indicates whether or not the bit corresponding to @p aChannel in ChannelMask is set.
*
* @param[in] aChannel The channel in ChannelMask to get.
*
*/
bool IsChannelSet(uint8_t aChannel) const
{
const uint8_t *mask = reinterpret_cast<const uint8_t *>(this) + sizeof(*this);
return (aChannel < (mMaskLength * 8)) ? ((mask[aChannel / 8] & (0x80 >> (aChannel % 8))) != 0) : false;
}
/**
* This method gets the next Channel Mask Entry in a Channel Mask TLV.
*
* @returns A pointer to next Channel Mask Entry.
*
*/
const ChannelMaskEntryBase *GetNext(void) const
{
return reinterpret_cast<const ChannelMaskEntryBase *>(reinterpret_cast<const uint8_t *>(this) + GetEntrySize());
}
/**
* This method gets the next Channel Mask Entry in a Channel Mask TLV.
*
* @returns A pointer to next Channel Mask Entry.
*
*/
ChannelMaskEntryBase *GetNext(void) { return AsNonConst(AsConst(this)->GetNext()); }
private:
uint8_t mChannelPage;
uint8_t mMaskLength;
} OT_TOOL_PACKED_END;
/**
* This class implements Channel Mask Entry Page 0 generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ChannelMaskEntry : public ChannelMaskEntryBase
{
public:
/**
* This method initializes the entry.
*
*/
void Init(void)
{
SetChannelPage(0);
SetMaskLength(sizeof(mMask));
}
/**
* This method indicates whether or not the entry appears to be well-formed.
*
* @retval TRUE If the entry appears to be well-formed.
* @retval FALSE If the entry does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetMaskLength() == sizeof(mMask); }
/**
* This method returns the Channel Mask value as a `uint32_t` bit mask.
*
* @returns The Channel Mask value.
*
*/
uint32_t GetMask(void) const { return Encoding::Reverse32(HostSwap32(mMask)); }
/**
* This method sets the Channel Mask value.
*
* @param[in] aMask The Channel Mask value.
*
*/
void SetMask(uint32_t aMask) { mMask = HostSwap32(Encoding::Reverse32(aMask)); }
private:
uint32_t mMask;
} OT_TOOL_PACKED_END;
/**
* This class implements Channel Mask TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ChannelMaskBaseTlv : public Tlv, public TlvInfo<Tlv::kChannelMask>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kChannelMask);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const;
/**
* This method gets the first Channel Mask Entry in the Channel Mask TLV.
*
* @returns A pointer to first Channel Mask Entry or `nullptr` if not found.
*
*/
const ChannelMaskEntryBase *GetFirstEntry(void) const;
/**
* This method gets the first Channel Mask Entry in the Channel Mask TLV.
*
* @returns A pointer to first Channel Mask Entry or `nullptr` if not found.
*
*/
ChannelMaskEntryBase *GetFirstEntry(void);
} OT_TOOL_PACKED_END;
/**
* This class implements Channel Mask TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ChannelMaskTlv : public ChannelMaskBaseTlv
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kChannelMask);
SetLength(sizeof(*this) - sizeof(Tlv));
memset(mEntries, 0, sizeof(mEntries));
}
/**
* This method sets the Channel Mask Entries.
*
* @param[in] aChannelMask The Channel Mask value.
*
*/
void SetChannelMask(uint32_t aChannelMask);
/**
* This method returns the Channel Mask value as a `uint32_t` bit mask.
*
* @returns The Channel Mask or 0 if not found.
*
*/
uint32_t GetChannelMask(void) const;
/**
* This method reads message and returns the Channel Mask value as a `uint32_t` bit mask.
*
* @param[in] aMessage A reference to the message.
*
* @returns The Channel Mask or 0 if not found.
*
*/
static uint32_t GetChannelMask(const Message &aMessage);
private:
static constexpr uint8_t kNumMaskEntries = Radio::kNumChannelPages;
ChannelMaskEntry mEntries[kNumMaskEntries];
} OT_TOOL_PACKED_END;
/**
* This class implements Energy List TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class EnergyListTlv : public Tlv, public TlvInfo<Tlv::kEnergyList>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kEnergyList);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return true; }
} OT_TOOL_PACKED_END;
/**
* This class implements Provisioning URL TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ProvisioningUrlTlv : public Tlv, public TlvInfo<Tlv::kProvisioningUrl>
{
public:
/**
* Maximum number of chars in the Provisioning URL string.
*
*/
static constexpr uint16_t kMaxLength = OT_PROVISIONING_URL_MAX_SIZE;
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kProvisioningUrl);
SetLength(0);
}
/*
* This method returns the Provisioning URL length.
*
* @returns The Provisioning URL length.
*
*/
uint8_t GetProvisioningUrlLength(void) const
{
return GetLength() <= sizeof(mProvisioningUrl) ? GetLength() : sizeof(mProvisioningUrl);
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const
{
return GetType() == kProvisioningUrl && mProvisioningUrl[GetProvisioningUrlLength()] == '\0';
}
/**
* This method returns the Provisioning URL value.
*
* @returns The Provisioning URL value.
*
*/
const char *GetProvisioningUrl(void) const { return mProvisioningUrl; }
/**
* This method sets the Provisioning URL value.
*
* @param[in] aProvisioningUrl A pointer to the Provisioning URL value.
*
*/
void SetProvisioningUrl(const char *aProvisioningUrl)
{
uint16_t len = aProvisioningUrl ? StringLength(aProvisioningUrl, kMaxLength) : 0;
SetLength(static_cast<uint8_t>(len));
if (len > 0)
{
memcpy(mProvisioningUrl, aProvisioningUrl, len);
}
}
private:
char mProvisioningUrl[kMaxLength];
} OT_TOOL_PACKED_END;
/**
* This class implements Vendor Name TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class VendorNameTlv : public Tlv, public TlvInfo<Tlv::kVendorName>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kVendorName);
SetLength(0);
}
/**
* This method returns the Vendor Name length.
*
* @returns The Vendor Name length.
*
*/
uint8_t GetVendorNameLength(void) const
{
return GetLength() <= sizeof(mVendorName) ? GetLength() : sizeof(mVendorName);
}
/**
* This method returns the Vendor Name value.
*
* @returns The Vendor Name value.
*
*/
const char *GetVendorName(void) const { return mVendorName; }
/**
* This method sets the Vendor Name value.
*
* @param[in] aVendorName A pointer to the Vendor Name value.
*
*/
void SetVendorName(const char *aVendorName)
{
uint16_t len = (aVendorName == nullptr) ? 0 : StringLength(aVendorName, sizeof(mVendorName));
SetLength(static_cast<uint8_t>(len));
if (len > 0)
{
memcpy(mVendorName, aVendorName, len);
}
}
private:
static constexpr uint8_t kMaxLength = 32;
char mVendorName[kMaxLength];
} OT_TOOL_PACKED_END;
/**
* This class implements Vendor Model TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class VendorModelTlv : public Tlv, public TlvInfo<Tlv::kVendorModel>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kVendorModel);
SetLength(0);
}
/**
* This method returns the Vendor Model length.
*
* @returns The Vendor Model length.
*
*/
uint8_t GetVendorModelLength(void) const
{
return GetLength() <= sizeof(mVendorModel) ? GetLength() : sizeof(mVendorModel);
}
/**
* This method returns the Vendor Model value.
*
* @returns The Vendor Model value.
*
*/
const char *GetVendorModel(void) const { return mVendorModel; }
/**
* This method sets the Vendor Model value.
*
* @param[in] aVendorModel A pointer to the Vendor Model value.
*
*/
void SetVendorModel(const char *aVendorModel)
{
uint16_t len = (aVendorModel == nullptr) ? 0 : StringLength(aVendorModel, sizeof(mVendorModel));
SetLength(static_cast<uint8_t>(len));
if (len > 0)
{
memcpy(mVendorModel, aVendorModel, len);
}
}
private:
static constexpr uint8_t kMaxLength = 32;
char mVendorModel[kMaxLength];
} OT_TOOL_PACKED_END;
/**
* This class implements Vendor SW Version TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class VendorSwVersionTlv : public Tlv, public TlvInfo<Tlv::kVendorSwVersion>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kVendorSwVersion);
SetLength(0);
}
/**
* This method returns the Vendor SW Version length.
*
* @returns The Vendor SW Version length.
*
*/
uint8_t GetVendorSwVersionLength(void) const
{
return GetLength() <= sizeof(mVendorSwVersion) ? GetLength() : sizeof(mVendorSwVersion);
}
/**
* This method returns the Vendor SW Version value.
*
* @returns The Vendor SW Version value.
*
*/
const char *GetVendorSwVersion(void) const { return mVendorSwVersion; }
/**
* This method sets the Vendor SW Version value.
*
* @param[in] aVendorSwVersion A pointer to the Vendor SW Version value.
*
*/
void SetVendorSwVersion(const char *aVendorSwVersion)
{
uint16_t len = (aVendorSwVersion == nullptr) ? 0 : StringLength(aVendorSwVersion, sizeof(mVendorSwVersion));
SetLength(static_cast<uint8_t>(len));
if (len > 0)
{
memcpy(mVendorSwVersion, aVendorSwVersion, len);
}
}
private:
static constexpr uint8_t kMaxLength = 16;
char mVendorSwVersion[kMaxLength];
} OT_TOOL_PACKED_END;
/**
* This class implements Vendor Data TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class VendorDataTlv : public Tlv, public TlvInfo<Tlv::kVendorData>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kVendorData);
SetLength(0);
}
/**
* This method returns the Vendor Data length.
*
* @returns The Vendor Data length.
*
*/
uint8_t GetVendorDataLength(void) const
{
return GetLength() <= sizeof(mVendorData) ? GetLength() : sizeof(mVendorData);
}
/**
* This method returns the Vendor Data value.
*
* @returns The Vendor Data value.
*
*/
const char *GetVendorData(void) const { return mVendorData; }
/**
* This method sets the Vendor Data value.
*
* @param[in] aVendorData A pointer to the Vendor Data value.
*
*/
void SetVendorData(const char *aVendorData)
{
uint16_t len = (aVendorData == nullptr) ? 0 : StringLength(aVendorData, sizeof(mVendorData));
SetLength(static_cast<uint8_t>(len));
if (len > 0)
{
memcpy(mVendorData, aVendorData, len);
}
}
private:
static constexpr uint8_t kMaxLength = 64;
char mVendorData[kMaxLength];
} OT_TOOL_PACKED_END;
/**
* This class implements Vendor Stack Version TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class VendorStackVersionTlv : public Tlv, public TlvInfo<Tlv::kVendorStackVersion>
{
public:
/**
* Default constructor.
*
*/
VendorStackVersionTlv(void)
: mBuildRevision(0)
, mMinorMajor(0)
{
}
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kVendorStackVersion);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the Stack Vendor OUI value.
*
* @returns The Vendor Stack Vendor OUI value.
*
*/
uint32_t GetOui(void) const { return ReadUint24(mOui); }
/**
* This method returns the Stack Vendor OUI value.
*
* @param[in] aOui The Vendor Stack Vendor OUI value.
*
*/
void SetOui(uint32_t aOui) { WriteUint24(aOui, mOui); }
/**
* This method returns the Build value.
*
* @returns The Build value.
*
*/
uint16_t GetBuild(void) const { return (HostSwap16(mBuildRevision) & kBuildMask) >> kBuildOffset; }
/**
* This method sets the Build value.
*
* @param[in] aBuild The Build value.
*
*/
void SetBuild(uint16_t aBuild)
{
mBuildRevision =
HostSwap16((HostSwap16(mBuildRevision) & ~kBuildMask) | ((aBuild << kBuildOffset) & kBuildMask));
}
/**
* This method returns the Revision value.
*
* @returns The Revision value.
*
*/
uint8_t GetRevision(void) const { return (HostSwap16(mBuildRevision) & kRevMask) >> kRevOffset; }
/**
* This method sets the Revision value.
*
* @param[in] aRevision The Revision value.
*
*/
void SetRevision(uint8_t aRevision)
{
mBuildRevision = HostSwap16((HostSwap16(mBuildRevision) & ~kRevMask) | ((aRevision << kRevOffset) & kRevMask));
}
/**
* This method returns the Minor value.
*
* @returns The Minor value.
*
*/
uint8_t GetMinor(void) const { return (mMinorMajor & kMinorMask) >> kMinorOffset; }
/**
* This method sets the Minor value.
*
* @param[in] aMinor The Minor value.
*
*/
void SetMinor(uint8_t aMinor)
{
mMinorMajor = (mMinorMajor & ~kMinorMask) | ((aMinor << kMinorOffset) & kMinorMask);
}
/**
* This method returns the Major value.
*
* @returns The Major value.
*
*/
uint8_t GetMajor(void) const { return (mMinorMajor & kMajorMask) >> kMajorOffset; }
/**
* This method sets the Major value.
*
* @param[in] aMajor The Major value.
*
*/
void SetMajor(uint8_t aMajor)
{
mMinorMajor = (mMinorMajor & ~kMajorMask) | ((aMajor << kMajorOffset) & kMajorMask);
}
private:
// For `mBuildRevision`
static constexpr uint8_t kBuildOffset = 4;
static constexpr uint16_t kBuildMask = 0xfff << kBuildOffset;
static constexpr uint8_t kRevOffset = 0;
static constexpr uint16_t kRevMask = 0xf << kBuildOffset;
// For `mMinorMajor`
static constexpr uint8_t kMinorOffset = 4;
static constexpr uint8_t kMinorMask = 0xf << kMinorOffset;
static constexpr uint8_t kMajorOffset = 0;
static constexpr uint8_t kMajorMask = 0xf << kMajorOffset;
uint8_t mOui[3];
uint16_t mBuildRevision;
uint8_t mMinorMajor;
} OT_TOOL_PACKED_END;
/**
* This class implements UDP Encapsulation TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class UdpEncapsulationTlv : public ExtendedTlv, public TlvInfo<MeshCoP::Tlv::kUdpEncapsulation>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(MeshCoP::Tlv::kUdpEncapsulation);
SetLength(sizeof(*this) - sizeof(ExtendedTlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(ExtendedTlv); }
/**
* This method returns the source port.
*
* @returns The source port.
*
*/
uint16_t GetSourcePort(void) const { return HostSwap16(mSourcePort); }
/**
* This method updates the source port.
*
* @param[in] aSourcePort The source port.
*
*/
void SetSourcePort(uint16_t aSourcePort) { mSourcePort = HostSwap16(aSourcePort); }
/**
* This method returns the destination port.
*
* @returns The destination port.
*
*/
uint16_t GetDestinationPort(void) const { return HostSwap16(mDestinationPort); }
/**
* This method updates the destination port.
*
* @param[in] aDestinationPort The destination port.
*
*/
void SetDestinationPort(uint16_t aDestinationPort) { mDestinationPort = HostSwap16(aDestinationPort); }
/**
* This method returns the calculated UDP length.
*
* @returns The calculated UDP length.
*
*/
uint16_t GetUdpLength(void) const { return GetLength() - sizeof(mSourcePort) - sizeof(mDestinationPort); }
/**
* This method updates the UDP length.
*
* @param[in] aLength The length of UDP payload in bytes.
*
*/
void SetUdpLength(uint16_t aLength) { SetLength(sizeof(mSourcePort) + sizeof(mDestinationPort) + aLength); }
private:
uint16_t mSourcePort;
uint16_t mDestinationPort;
} OT_TOOL_PACKED_END;
/**
* This class implements Discovery Request TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class DiscoveryRequestTlv : public Tlv, public TlvInfo<Tlv::kDiscoveryRequest>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kDiscoveryRequest);
SetLength(sizeof(*this) - sizeof(Tlv));
mFlags = 0;
mReserved = 0;
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the Version value.
*
* @returns The Version value.
*
*/
uint8_t GetVersion(void) const { return mFlags >> kVersionOffset; }
/**
* This method sets the Version value.
*
* @param[in] aVersion The Version value.
*
*/
void SetVersion(uint8_t aVersion)
{
mFlags = (mFlags & ~kVersionMask) | ((aVersion << kVersionOffset) & kVersionMask);
}
/**
* This method indicates whether or not the Joiner flag is set.
*
* @retval TRUE If the Joiner flag is set.
* @retval FALSE If the Joiner flag is not set.
*
*/
bool IsJoiner(void) const { return (mFlags & kJoinerMask) != 0; }
/**
* This method sets the Joiner flag.
*
* @param[in] aJoiner TRUE if set, FALSE otherwise.
*
*/
void SetJoiner(bool aJoiner)
{
if (aJoiner)
{
mFlags |= kJoinerMask;
}
else
{
mFlags &= ~kJoinerMask;
}
}
private:
static constexpr uint8_t kVersionOffset = 4;
static constexpr uint8_t kVersionMask = 0xf << kVersionOffset;
static constexpr uint8_t kJoinerOffset = 3;
static constexpr uint8_t kJoinerMask = 1 << kJoinerOffset;
uint8_t mFlags;
uint8_t mReserved;
} OT_TOOL_PACKED_END;
/**
* This class implements Discovery Response TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class DiscoveryResponseTlv : public Tlv, public TlvInfo<Tlv::kDiscoveryResponse>
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kDiscoveryResponse);
SetLength(sizeof(*this) - sizeof(Tlv));
mFlags = 0;
mReserved = 0;
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the Version value.
*
* @returns The Version value.
*
*/
uint8_t GetVersion(void) const { return mFlags >> kVersionOffset; }
/**
* This method sets the Version value.
*
* @param[in] aVersion The Version value.
*
*/
void SetVersion(uint8_t aVersion)
{
mFlags = (mFlags & ~kVersionMask) | ((aVersion << kVersionOffset) & kVersionMask);
}
/**
* This method indicates whether or not the Native Commissioner flag is set.
*
* @retval TRUE If the Native Commissioner flag is set.
* @retval FALSE If the Native Commissioner flag is not set.
*
*/
bool IsNativeCommissioner(void) const { return (mFlags & kNativeMask) != 0; }
/**
* This method sets the Native Commissioner flag.
*
* @param[in] aNativeCommissioner TRUE if set, FALSE otherwise.
*
*/
void SetNativeCommissioner(bool aNativeCommissioner)
{
if (aNativeCommissioner)
{
mFlags |= kNativeMask;
}
else
{
mFlags &= ~kNativeMask;
}
}
/**
* This method indicates whether or not the Commercial Commissioning Mode flag is set.
*
* @retval TRUE If the Commercial Commissioning Mode flag is set.
* @retval FALSE If the Commercial Commissioning Mode flag is not set.
*
*/
bool IsCommercialCommissioningMode(void) const { return (mFlags & kCCMMask) != 0; }
/**
* This method sets the Commercial Commissioning Mode flag.
*
* @param[in] aCCM TRUE if set, FALSE otherwise.
*
*/
void SetCommercialCommissioningMode(bool aCCM)
{
if (aCCM)
{
mFlags |= kCCMMask;
}
else
{
mFlags &= ~kCCMMask;
}
}
private:
static constexpr uint8_t kVersionOffset = 4;
static constexpr uint8_t kVersionMask = 0xf << kVersionOffset;
static constexpr uint8_t kNativeOffset = 3;
static constexpr uint8_t kNativeMask = 1 << kNativeOffset;
static constexpr uint8_t kCCMOffset = 2;
static constexpr uint8_t kCCMMask = 1 << kCCMOffset;
uint8_t mFlags;
uint8_t mReserved;
} OT_TOOL_PACKED_END;
/**
* This class implements Joiner Advertisement TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class JoinerAdvertisementTlv : public Tlv, public TlvInfo<Tlv::kJoinerAdvertisement>
{
public:
static constexpr uint8_t kAdvDataMaxLength = OT_JOINER_ADVDATA_MAX_LENGTH; ///< The Max Length of AdvData
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kJoinerAdvertisement);
SetLength(sizeof(*this) - sizeof(Tlv));
}
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() >= sizeof(mOui) && GetLength() <= sizeof(mOui) + sizeof(mAdvData); }
/**
* This method returns the Vendor OUI value.
*
* @returns The Vendor OUI value.
*
*/
uint32_t GetOui(void) const { return ReadUint24(mOui); }
/**
* This method sets the Vendor OUI value.
*
* @param[in] aOui The Vendor OUI value.
*
*/
void SetOui(uint32_t aOui) { return WriteUint24(aOui, mOui); }
/**
* This method returns the Adv Data length.
*
* @returns The AdvData length.
*
*/
uint8_t GetAdvDataLength(void) const { return GetLength() - sizeof(mOui); }
/**
* This method returns the Adv Data value.
*
* @returns A pointer to the Adv Data value.
*
*/
const uint8_t *GetAdvData(void) const { return mAdvData; }
/**
* This method sets the Adv Data value.
*
* @param[in] aAdvData A pointer to the AdvData value.
* @param[in] aAdvDataLength The length of AdvData in bytes.
*
*/
void SetAdvData(const uint8_t *aAdvData, uint8_t aAdvDataLength)
{
OT_ASSERT((aAdvData != nullptr) && (aAdvDataLength > 0) && (aAdvDataLength <= kAdvDataMaxLength));
SetLength(aAdvDataLength + sizeof(mOui));
memcpy(mAdvData, aAdvData, aAdvDataLength);
}
private:
uint8_t mOui[3];
uint8_t mAdvData[kAdvDataMaxLength];
} OT_TOOL_PACKED_END;
} // namespace MeshCoP
} // namespace ot
#endif // MESHCOP_TLVS_HPP_