blob: eb7c53a12e88298fe0958598236474ca386dccc5 [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/crc16.hpp"
#include "common/encoding.hpp"
#include "common/message.hpp"
#include "common/string.hpp"
#include "common/tlvs.hpp"
#include "mac/mac_types.hpp"
#include "meshcop/timestamp.hpp"
#include "net/ip6_address.hpp"
#include "radio/radio.hpp"
#include "thread/key_manager.hpp"
namespace ot {
namespace MeshCoP {
using ot::Encoding::Reverse32;
using ot::Encoding::BigEndian::HostSwap16;
using ot::Encoding::BigEndian::HostSwap32;
/**
* This class implements MeshCoP TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class Tlv : public ot::Tlv
{
public:
/**
* MeshCoP TLV Types.
*
*/
enum Type
{
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
kNetworkMasterKey = OT_MESHCOP_TLV_MASTERKEY, ///< Network Master 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
kIPv6Address = 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
};
/**
* 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 static_cast<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 static_cast<const 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 OT_ERROR_NONE Successfully copied the TLV.
* @retval OT_ERROR_NOT_FOUND Could not find the TLV with Type @p aType.
*
*/
static otError GetTlv(const Message &aMessage, Type aType, uint16_t aMaxLength, Tlv &aTlv)
{
return ot::Tlv::Get(aMessage, static_cast<uint8_t>(aType), aMaxLength, aTlv);
}
/**
* This static method finds the offset and length of a given TLV type.
*
* @param[in] aMessage A reference to the message.
* @param[in] aType The Type value to search for.
* @param[out] aOffset The offset where the value starts.
* @param[out] aLength The length of the value.
*
* @retval OT_ERROR_NONE Successfully found the TLV.
* @retval OT_ERROR_NOT_FOUND Could not find the TLV with Type @p aType.
*
*/
static otError GetValueOffset(const Message &aMessage, Type aType, uint16_t &aOffset, uint16_t &aLength)
{
return ot::Tlv::GetValueOffset(aMessage, static_cast<uint8_t>(aType), aOffset, aLength);
}
/**
* 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);
} 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 implements Channel TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ChannelTlv : public Tlv
{
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:
/**
* 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:
/**
* 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 Mac::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 Mac::ExtendedPanId &aExtendedPanId) { mExtendedPanId = aExtendedPanId; }
private:
Mac::ExtendedPanId mExtendedPanId;
} OT_TOOL_PACKED_END;
/**
* This class implements Network Name TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class NetworkNameTlv : public Tlv
{
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 { return true; }
/**
* This method gets the Network Name value.
*
* @returns The Network Name value (as `NetworkName::Data`).
*
*/
Mac::NetworkName::Data GetNetworkName(void) const;
/**
* This method sets the Network Name value.
*
* @param[in] aNameData A Network Name value (as `NetworkName::Data`).
*
*/
void SetNetworkName(const Mac::NetworkName::Data &aNameData);
private:
char mNetworkName[Mac::NetworkName::kMaxSize];
} OT_TOOL_PACKED_END;
/**
* This class implements PSKc TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class PskcTlv : public Tlv
{
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 Master Key TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class NetworkMasterKeyTlv : public Tlv
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kNetworkMasterKey);
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 Master Key value.
*
* @returns The Network Master Key value.
*
*/
const MasterKey &GetNetworkMasterKey(void) const { return mNetworkMasterKey; }
/**
* This method sets the Network Master Key value.
*
* @param[in] aMasterKey The Network Master Key.
*
*/
void SetNetworkMasterKey(const MasterKey &aMasterKey) { mNetworkMasterKey = aMasterKey; }
private:
MasterKey mNetworkMasterKey;
} OT_TOOL_PACKED_END;
/**
* This class implements Network Key Sequence TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class NetworkKeySequenceTlv : public Tlv
{
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:
/**
* 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 otMeshLocalPrefix &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 otMeshLocalPrefix &aMeshLocalPrefix) { mMeshLocalPrefix = aMeshLocalPrefix; }
private:
otMeshLocalPrefix mMeshLocalPrefix;
} OT_TOOL_PACKED_END;
/**
* This class implements Steering Data TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class SteeringDataTlv : public Tlv
{
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()); }
/**
* Ths method sets all bits in the Bloom Filter to one.
*
*/
void Set(void) { memset(mSteeringData, 0xff, GetSteeringDataLength()); }
/**
* Ths method indicates whether or not the SteeringData allows all Joiners.
*
* @retval TRUE If the SteeringData allows all Joiners.
* @retval FALSE If the SteeringData doesn't allow any Joiner.
*
*/
bool DoesAllowAny(void)
{
bool rval = true;
for (uint8_t i = 0; i < GetSteeringDataLength(); i++)
{
if (mSteeringData[i] != 0xff)
{
rval = false;
break;
}
}
return rval;
}
/**
* This method returns the number of bits in the Bloom Filter.
*
* @returns The number of bits in the Bloom Filter.
*
*/
uint8_t GetNumBits(void) const { return GetSteeringDataLength() * 8; }
/**
* This method indicates whether or not bit @p aBit is set.
*
* @param[in] aBit The bit offset.
*
* @retval TRUE If bit @p aBit is set.
* @retval FALSE If bit @p aBit is not set.
*
*/
bool GetBit(uint8_t aBit) const
{
return (mSteeringData[GetSteeringDataLength() - 1 - (aBit / 8)] & (1 << (aBit % 8))) != 0;
}
/**
* This method clears bit @p aBit.
*
* @param[in] aBit The bit offset.
*
*/
void ClearBit(uint8_t aBit) { mSteeringData[GetSteeringDataLength() - 1 - (aBit / 8)] &= ~(1 << (aBit % 8)); }
/**
* This method sets bit @p aBit.
*
* @param[in] aBit The bit offset.
*
*/
void SetBit(uint8_t aBit) { mSteeringData[GetSteeringDataLength() - 1 - (aBit / 8)] |= 1 << (aBit % 8); }
/**
* Ths method indicates whether or not the SteeringData is all zeros.
*
* @retval TRUE If the SteeringData is all zeros.
* @retval FALSE If the SteeringData isn't all zeros.
*
*/
bool IsCleared(void) const;
/**
* This method computes the Bloom Filter.
*
* @param[in] aJoinerId The Joiner ID.
*
*/
void ComputeBloomFilter(const otExtAddress &aJoinerId);
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:
/**
* 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] aBorderAgentLocator 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:
enum
{
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:
/**
* 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] aCommissionerSessionId 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:
/**
* 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 { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the Rotation Time value.
*
* @returns The Rotation Time value.
*
*/
uint16_t GetRotationTime(void) const { return HostSwap16(mRotationTime); }
/**
* This method sets the Rotation Time value.
*
* @param[in] aRotationTime The Rotation Time value.
*
*/
void SetRotationTime(uint16_t aRotationTime) { mRotationTime = HostSwap16(aRotationTime); }
enum
{
kObtainMasterKeyFlag = OT_SECURITY_POLICY_OBTAIN_MASTER_KEY, ///< Obtaining the Master Key
kNativeCommissioningFlag = OT_SECURITY_POLICY_NATIVE_COMMISSIONING, ///< Native Commissioning
kRoutersFlag = OT_SECURITY_POLICY_ROUTERS, ///< Routers enabled
kExternalCommissionerFlag = OT_SECURITY_POLICY_EXTERNAL_COMMISSIONER, ///< External Commissioner allowed
kBeaconsFlag = OT_SECURITY_POLICY_BEACONS, ///< Beacons enabled
};
/**
* This method returns the Flags value.
*
* @returns The Flags value.
*
*/
uint8_t GetFlags(void) const { return mFlags; }
/**
* This method sets the Flags value.
*
* @param[in] aFlags The Flags value.
*
*/
void SetFlags(uint8_t aFlags) { mFlags = aFlags; }
private:
uint16_t mRotationTime;
uint8_t mFlags;
} OT_TOOL_PACKED_END;
/**
* This class implements Active Timestamp TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ActiveTimestampTlv : public Tlv, public Timestamp
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kActiveTimestamp);
SetLength(sizeof(*this) - sizeof(Tlv));
Timestamp::Init();
}
/**
* 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); }
} OT_TOOL_PACKED_END;
/**
* This class implements Commissioner UDP Port TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class CommissionerUdpPortTlv : public Tlv
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kCommissionerUdpPort);
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 State TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class StateTlv : public Tlv
{
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
{
kReject = -1, ///< Reject
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:
/**
* 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 Joiner IID TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class JoinerIidTlv : public Tlv
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kJoinerIid);
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 a pointer to the Joiner IID.
*
* @returns A pointer to the Joiner IID.
*
*/
const uint8_t *GetIid(void) const { return mIid; }
/**
* This method sets the Joiner IID.
*
* @param[in] aIid A pointer to the Joiner IID.
*
*/
void SetIid(const uint8_t *aIid) { memcpy(mIid, aIid, sizeof(mIid)); }
private:
uint8_t mIid[8];
} OT_TOOL_PACKED_END;
/**
* This class implements Joiner Router Locator TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class JoinerRouterLocatorTlv : public Tlv
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kJoinerRouterLocator);
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 Joiner Router Locator value.
*
* @returns The Joiner Router Locator value.
*
*/
uint16_t GetJoinerRouterLocator(void) const { return HostSwap16(mLocator); }
/**
* This method sets the Joiner Router Locator value.
*
* @param[in] aJoinerRouterLocator The Joiner Router Locator value.
*
*/
void SetJoinerRouterLocator(uint16_t aLocator) { mLocator = HostSwap16(aLocator); }
private:
uint16_t mLocator;
} OT_TOOL_PACKED_END;
/**
* This class implements Joiner Router KEK TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class JoinerRouterKekTlv : public Tlv
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kJoinerRouterKek);
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 a pointer to the Joiner Router KEK.
*
* @returns A pointer to the Joiner Router KEK.
*
*/
const uint8_t *GetKek(void) const { return mKek; }
/**
* This method sets the Joiner Router KEK.
*
* @param[in] aIid A pointer to the Joiner Router KEK.
*
*/
void SetKek(const uint8_t *aKek) { memcpy(mKek, aKek, sizeof(mKek)); }
private:
uint8_t mKek[16];
} OT_TOOL_PACKED_END;
/**
* This class implements Pending Timestamp TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class PendingTimestampTlv : public Tlv, public Timestamp
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kPendingTimestamp);
SetLength(sizeof(*this) - sizeof(Tlv));
Timestamp::Init();
}
/**
* 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); }
} OT_TOOL_PACKED_END;
/**
* This class implements Delay Timer TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class DelayTimerTlv : public Tlv
{
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); }
enum
{
kMaxDelayTimer = 259200, ///< maximum delay timer value for a Pending Dataset in seconds
/**
* Minimum Delay Timer value for a Pending Operational Dataset (ms)
*
*/
kDelayTimerMinimal = OPENTHREAD_CONFIG_TMF_PENDING_DATASET_MINIMUM_DELAY,
/**
* Default Delay Timer value for a Pending Operational Dataset (ms)
*
*/
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 const_cast<ChannelMaskEntryBase *>(static_cast<const ChannelMaskEntryBase *>(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 Reverse32(HostSwap32(mMask)); }
/**
* This method sets the Channel Mask value.
*
* @param[in] aMask The Channel Mask value.
*
*/
void SetMask(uint32_t aMask) { mMask = HostSwap32(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:
/**
* 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 { return true; }
/**
* This method gets the first Channel Mask Entry in the Channel Mask TLV.
*
* @returns A pointer to first Channel Mask Entry or NULL 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 NULL 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] aMask 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:
enum
{
kNumMaskEntries = Radio::kNumChannelPages,
};
ChannelMaskEntry mEntries[kNumMaskEntries];
} OT_TOOL_PACKED_END;
/**
* This class implements Count TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class CountTlv : public Tlv
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kCount);
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 Count value.
*
* @returns The Count value.
*
*/
uint8_t GetCount(void) const { return mCount; }
/**
* This method sets the Count value.
*
* @param[in] aCount The Count value.
*
*/
void SetCount(uint8_t aCount) { mCount = aCount; }
private:
uint8_t mCount;
} OT_TOOL_PACKED_END;
/**
* This class implements Period TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class PeriodTlv : public Tlv
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kPeriod);
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 Period value.
*
* @returns The Period value.
*
*/
uint16_t GetPeriod(void) const { return HostSwap16(mPeriod); }
/**
* This method sets the Period value.
*
* @param[in] aPeriod The Period value.
*
*/
void SetPeriod(uint16_t aPeriod) { mPeriod = HostSwap16(aPeriod); }
private:
uint16_t mPeriod;
} OT_TOOL_PACKED_END;
/**
* This class implements Scan Duration TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class ScanDurationTlv : public Tlv
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kScanDuration);
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 Scan Duration value.
*
* @returns The Scan Duration value.
*
*/
uint16_t GetScanDuration(void) const { return HostSwap16(mScanDuration); }
/**
* This method sets the Scan Duration value.
*
* @param[in] aScanDuration The Scan Duration value.
*
*/
void SetScanDuration(uint16_t aScanDuration) { mScanDuration = HostSwap16(aScanDuration); }
private:
uint16_t mScanDuration;
} OT_TOOL_PACKED_END;
/**
* This class implements Energy List TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class EnergyListTlv : public Tlv
{
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:
enum
{
kMaxLength = OT_PROVISIONING_URL_MAX_SIZE, // Maximum number of chars in the Provisioning URL string.
};
/**
* 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 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:
/**
* 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 == NULL) ? 0 : StringLength(aVendorName, sizeof(mVendorName));
SetLength(static_cast<uint8_t>(len));
if (len > 0)
{
memcpy(mVendorName, aVendorName, len);
}
}
private:
enum
{
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:
/**
* 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 == NULL) ? 0 : StringLength(aVendorModel, sizeof(mVendorModel));
SetLength(static_cast<uint8_t>(len));
if (len > 0)
{
memcpy(mVendorModel, aVendorModel, len);
}
}
private:
enum
{
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:
/**
* 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 == NULL) ? 0 : StringLength(aVendorSwVersion, sizeof(mVendorSwVersion));
SetLength(static_cast<uint8_t>(len));
if (len > 0)
{
memcpy(mVendorSwVersion, aVendorSwVersion, len);
}
}
private:
enum
{
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:
/**
* 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 == NULL) ? 0 : StringLength(aVendorData, sizeof(mVendorData));
SetLength(static_cast<uint8_t>(len));
if (len > 0)
{
memcpy(mVendorData, aVendorData, len);
}
}
private:
enum
{
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:
/**
* 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 (static_cast<uint32_t>(mOui[0]) << 16) | (static_cast<uint32_t>(mOui[1]) << 8) |
static_cast<uint32_t>(mOui[2]);
}
/**
* This method returns the Stack Vendor OUI value.
*
* @param[in] aOui The Vendor Stack Vendor OUI value.
*
*/
void SetOui(uint32_t aOui)
{
mOui[0] = (aOui >> 16) & 0xff;
mOui[1] = (aOui >> 8) & 0xff;
mOui[2] = aOui & 0xff;
}
/**
* 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:
uint8_t mOui[3];
enum
{
kBuildOffset = 4,
kBuildMask = 0xfff << kBuildOffset,
kRevOffset = 0,
kRevMask = 0xf << kBuildOffset,
};
uint16_t mBuildRevision;
enum
{
kMinorOffset = 4,
kMinorMask = 0xf << kMinorOffset,
kMajorOffset = 0,
kMajorMask = 0xf << kMajorOffset,
};
uint8_t mMinorMajor;
} OT_TOOL_PACKED_END;
/**
* This class implements IPv6 Address TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class IPv6AddressTlv : public Tlv
{
public:
/**
* This method initializes the TLV.
*
*/
void Init(void)
{
SetType(kIPv6Address);
SetLength(sizeof(mAddress));
}
/**
* This method returns the IPv6 Address.
*
* @returns A reference to the IPv6 Address.
*
*/
const Ip6::Address &GetAddress(void) const { return mAddress; }
/**
* This method sets the IPv6 Address.
*
* @param[in] aAddress A reference to the IPv6 Address.
*
*/
void SetAddress(const Ip6::Address &aAddress) { mAddress = aAddress; }
private:
Ip6::Address mAddress;
} OT_TOOL_PACKED_END;
/**
* This class implements UDP Encapsulation TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class UdpEncapsulationTlv : public ExtendedTlv
{
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:
/**
* 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:
enum
{
kVersionOffset = 4,
kVersionMask = 0xf << kVersionOffset,
kJoinerOffset = 3,
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:
/**
* 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;
}
}
private:
enum
{
kVersionOffset = 4,
kVersionMask = 0xf << kVersionOffset,
kNativeOffset = 3,
kNativeMask = 1 << kNativeOffset,
};
uint8_t mFlags;
uint8_t mReserved;
} OT_TOOL_PACKED_END;
} // namespace MeshCoP
} // namespace ot
#endif // MESHCOP_TLVS_HPP_