1*4a64e381SAndroid Build Coastguard Worker /* 2*4a64e381SAndroid Build Coastguard Worker * Copyright (c) 2017, The OpenThread Authors. 3*4a64e381SAndroid Build Coastguard Worker * All rights reserved. 4*4a64e381SAndroid Build Coastguard Worker * 5*4a64e381SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*4a64e381SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 7*4a64e381SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 8*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 9*4a64e381SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 10*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 11*4a64e381SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 12*4a64e381SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the 13*4a64e381SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products 14*4a64e381SAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 15*4a64e381SAndroid Build Coastguard Worker * 16*4a64e381SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17*4a64e381SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*4a64e381SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*4a64e381SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20*4a64e381SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21*4a64e381SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22*4a64e381SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23*4a64e381SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24*4a64e381SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25*4a64e381SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26*4a64e381SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE. 27*4a64e381SAndroid Build Coastguard Worker */ 28*4a64e381SAndroid Build Coastguard Worker 29*4a64e381SAndroid Build Coastguard Worker /** 30*4a64e381SAndroid Build Coastguard Worker * @file 31*4a64e381SAndroid Build Coastguard Worker * This file includes definition for Thread Management Framework(TMF) Tlv. 32*4a64e381SAndroid Build Coastguard Worker */ 33*4a64e381SAndroid Build Coastguard Worker 34*4a64e381SAndroid Build Coastguard Worker #ifndef OTBR_COMMON_TLV_HPP_ 35*4a64e381SAndroid Build Coastguard Worker #define OTBR_COMMON_TLV_HPP_ 36*4a64e381SAndroid Build Coastguard Worker 37*4a64e381SAndroid Build Coastguard Worker #include "openthread-br/config.h" 38*4a64e381SAndroid Build Coastguard Worker 39*4a64e381SAndroid Build Coastguard Worker #include <stdint.h> 40*4a64e381SAndroid Build Coastguard Worker #include <string.h> 41*4a64e381SAndroid Build Coastguard Worker 42*4a64e381SAndroid Build Coastguard Worker namespace otbr { 43*4a64e381SAndroid Build Coastguard Worker 44*4a64e381SAndroid Build Coastguard Worker /** 45*4a64e381SAndroid Build Coastguard Worker * This class implements TMF Tlv functionality. 46*4a64e381SAndroid Build Coastguard Worker */ 47*4a64e381SAndroid Build Coastguard Worker class Tlv 48*4a64e381SAndroid Build Coastguard Worker { 49*4a64e381SAndroid Build Coastguard Worker enum 50*4a64e381SAndroid Build Coastguard Worker { 51*4a64e381SAndroid Build Coastguard Worker kLengthEscape = 0xff, ///< This length value indicates the actual length is of two-bytes length. 52*4a64e381SAndroid Build Coastguard Worker }; 53*4a64e381SAndroid Build Coastguard Worker 54*4a64e381SAndroid Build Coastguard Worker public: 55*4a64e381SAndroid Build Coastguard Worker /** 56*4a64e381SAndroid Build Coastguard Worker * This method returns the Tlv type. 57*4a64e381SAndroid Build Coastguard Worker * 58*4a64e381SAndroid Build Coastguard Worker * @returns The Tlv type. 59*4a64e381SAndroid Build Coastguard Worker */ GetType(void) const60*4a64e381SAndroid Build Coastguard Worker uint8_t GetType(void) const { return mType; } 61*4a64e381SAndroid Build Coastguard Worker 62*4a64e381SAndroid Build Coastguard Worker /** 63*4a64e381SAndroid Build Coastguard Worker * This method sets the Tlv type. 64*4a64e381SAndroid Build Coastguard Worker */ SetType(uint8_t aType)65*4a64e381SAndroid Build Coastguard Worker void SetType(uint8_t aType) { mType = aType; } 66*4a64e381SAndroid Build Coastguard Worker 67*4a64e381SAndroid Build Coastguard Worker /** 68*4a64e381SAndroid Build Coastguard Worker * This method returns the Tlv length. 69*4a64e381SAndroid Build Coastguard Worker * 70*4a64e381SAndroid Build Coastguard Worker * @returns The Tlv length. 71*4a64e381SAndroid Build Coastguard Worker */ GetLength(void) const72*4a64e381SAndroid Build Coastguard Worker uint16_t GetLength(void) const 73*4a64e381SAndroid Build Coastguard Worker { 74*4a64e381SAndroid Build Coastguard Worker return (mLength != kLengthEscape ? mLength : static_cast<uint16_t>((&mLength)[1] << 8 | (&mLength)[2])); 75*4a64e381SAndroid Build Coastguard Worker } 76*4a64e381SAndroid Build Coastguard Worker 77*4a64e381SAndroid Build Coastguard Worker /** 78*4a64e381SAndroid Build Coastguard Worker * This method sets the length. 79*4a64e381SAndroid Build Coastguard Worker */ SetLength(uint16_t aLength,bool aForceExtended=false)80*4a64e381SAndroid Build Coastguard Worker void SetLength(uint16_t aLength, bool aForceExtended = false) 81*4a64e381SAndroid Build Coastguard Worker { 82*4a64e381SAndroid Build Coastguard Worker if (aLength >= kLengthEscape || aForceExtended) 83*4a64e381SAndroid Build Coastguard Worker { 84*4a64e381SAndroid Build Coastguard Worker mLength = kLengthEscape; 85*4a64e381SAndroid Build Coastguard Worker (&mLength)[1] = (aLength >> 8); 86*4a64e381SAndroid Build Coastguard Worker (&mLength)[2] = (aLength & 0xff); 87*4a64e381SAndroid Build Coastguard Worker } 88*4a64e381SAndroid Build Coastguard Worker else 89*4a64e381SAndroid Build Coastguard Worker { 90*4a64e381SAndroid Build Coastguard Worker mLength = static_cast<uint8_t>(aLength); 91*4a64e381SAndroid Build Coastguard Worker } 92*4a64e381SAndroid Build Coastguard Worker } 93*4a64e381SAndroid Build Coastguard Worker 94*4a64e381SAndroid Build Coastguard Worker /** 95*4a64e381SAndroid Build Coastguard Worker * This method returns a pointer to the value. 96*4a64e381SAndroid Build Coastguard Worker * 97*4a64e381SAndroid Build Coastguard Worker * @returns The Tlv value. 98*4a64e381SAndroid Build Coastguard Worker */ GetValue(void) const99*4a64e381SAndroid Build Coastguard Worker const void *GetValue(void) const 100*4a64e381SAndroid Build Coastguard Worker { 101*4a64e381SAndroid Build Coastguard Worker return reinterpret_cast<const uint8_t *>(this) + sizeof(mType) + 102*4a64e381SAndroid Build Coastguard Worker (mLength != kLengthEscape ? sizeof(mLength) : (sizeof(uint16_t) + sizeof(mLength))); 103*4a64e381SAndroid Build Coastguard Worker } 104*4a64e381SAndroid Build Coastguard Worker 105*4a64e381SAndroid Build Coastguard Worker /** 106*4a64e381SAndroid Build Coastguard Worker * This method returns the value as a uint16_t. 107*4a64e381SAndroid Build Coastguard Worker * 108*4a64e381SAndroid Build Coastguard Worker * @returns The uint16_t value. 109*4a64e381SAndroid Build Coastguard Worker */ GetValueUInt16(void) const110*4a64e381SAndroid Build Coastguard Worker uint16_t GetValueUInt16(void) const 111*4a64e381SAndroid Build Coastguard Worker { 112*4a64e381SAndroid Build Coastguard Worker const uint8_t *p = static_cast<const uint8_t *>(GetValue()); 113*4a64e381SAndroid Build Coastguard Worker 114*4a64e381SAndroid Build Coastguard Worker return static_cast<uint16_t>(p[0] << 8 | p[1]); 115*4a64e381SAndroid Build Coastguard Worker } 116*4a64e381SAndroid Build Coastguard Worker 117*4a64e381SAndroid Build Coastguard Worker /** 118*4a64e381SAndroid Build Coastguard Worker * This method returns the value as a uint8_t. 119*4a64e381SAndroid Build Coastguard Worker * 120*4a64e381SAndroid Build Coastguard Worker * @returns The uint8_t value. 121*4a64e381SAndroid Build Coastguard Worker */ GetValueUInt8(void) const122*4a64e381SAndroid Build Coastguard Worker uint8_t GetValueUInt8(void) const { return *static_cast<const uint8_t *>(GetValue()); } 123*4a64e381SAndroid Build Coastguard Worker 124*4a64e381SAndroid Build Coastguard Worker /** 125*4a64e381SAndroid Build Coastguard Worker * This method sets a uint64_t as the value. 126*4a64e381SAndroid Build Coastguard Worker * 127*4a64e381SAndroid Build Coastguard Worker * @param[in] aValue The uint64_t value. 128*4a64e381SAndroid Build Coastguard Worker */ SetValue(uint64_t aValue)129*4a64e381SAndroid Build Coastguard Worker void SetValue(uint64_t aValue) 130*4a64e381SAndroid Build Coastguard Worker { 131*4a64e381SAndroid Build Coastguard Worker uint8_t *value; 132*4a64e381SAndroid Build Coastguard Worker 133*4a64e381SAndroid Build Coastguard Worker SetLength(sizeof(aValue), false); 134*4a64e381SAndroid Build Coastguard Worker value = static_cast<uint8_t *>(GetValue()); 135*4a64e381SAndroid Build Coastguard Worker for (int i = 0; i < int{sizeof(aValue)}; ++i) 136*4a64e381SAndroid Build Coastguard Worker { 137*4a64e381SAndroid Build Coastguard Worker value[i] = (aValue >> (8 * (sizeof(aValue) - i - 1))) & 0xff; 138*4a64e381SAndroid Build Coastguard Worker } 139*4a64e381SAndroid Build Coastguard Worker } 140*4a64e381SAndroid Build Coastguard Worker 141*4a64e381SAndroid Build Coastguard Worker /** 142*4a64e381SAndroid Build Coastguard Worker * This method sets a uint32_t as the value. 143*4a64e381SAndroid Build Coastguard Worker * 144*4a64e381SAndroid Build Coastguard Worker * @param[in] aValue The uint32_t value. 145*4a64e381SAndroid Build Coastguard Worker */ SetValue(uint32_t aValue)146*4a64e381SAndroid Build Coastguard Worker void SetValue(uint32_t aValue) 147*4a64e381SAndroid Build Coastguard Worker { 148*4a64e381SAndroid Build Coastguard Worker uint8_t *value; 149*4a64e381SAndroid Build Coastguard Worker 150*4a64e381SAndroid Build Coastguard Worker SetLength(sizeof(aValue), false); 151*4a64e381SAndroid Build Coastguard Worker value = static_cast<uint8_t *>(GetValue()); 152*4a64e381SAndroid Build Coastguard Worker for (int i = 0; i < int{sizeof(aValue)}; ++i) 153*4a64e381SAndroid Build Coastguard Worker { 154*4a64e381SAndroid Build Coastguard Worker value[i] = (aValue >> (8 * (sizeof(aValue) - i - 1))) & 0xff; 155*4a64e381SAndroid Build Coastguard Worker } 156*4a64e381SAndroid Build Coastguard Worker } 157*4a64e381SAndroid Build Coastguard Worker 158*4a64e381SAndroid Build Coastguard Worker /** 159*4a64e381SAndroid Build Coastguard Worker * This method sets uint16_t as the value. 160*4a64e381SAndroid Build Coastguard Worker * 161*4a64e381SAndroid Build Coastguard Worker * @param[in] aValue The uint16_t value. 162*4a64e381SAndroid Build Coastguard Worker */ SetValue(uint16_t aValue)163*4a64e381SAndroid Build Coastguard Worker void SetValue(uint16_t aValue) 164*4a64e381SAndroid Build Coastguard Worker { 165*4a64e381SAndroid Build Coastguard Worker uint8_t *value; 166*4a64e381SAndroid Build Coastguard Worker 167*4a64e381SAndroid Build Coastguard Worker SetLength(sizeof(aValue), false); 168*4a64e381SAndroid Build Coastguard Worker value = static_cast<uint8_t *>(GetValue()); 169*4a64e381SAndroid Build Coastguard Worker value[0] = (aValue >> 8); 170*4a64e381SAndroid Build Coastguard Worker value[1] = (aValue & 0xff); 171*4a64e381SAndroid Build Coastguard Worker } 172*4a64e381SAndroid Build Coastguard Worker 173*4a64e381SAndroid Build Coastguard Worker /** 174*4a64e381SAndroid Build Coastguard Worker * This method sets uint8_t as the value. 175*4a64e381SAndroid Build Coastguard Worker * 176*4a64e381SAndroid Build Coastguard Worker * @param[in] aValue The uint8_t value. 177*4a64e381SAndroid Build Coastguard Worker */ SetValue(uint8_t aValue)178*4a64e381SAndroid Build Coastguard Worker void SetValue(uint8_t aValue) 179*4a64e381SAndroid Build Coastguard Worker { 180*4a64e381SAndroid Build Coastguard Worker SetLength(sizeof(aValue), false); 181*4a64e381SAndroid Build Coastguard Worker *static_cast<uint8_t *>(GetValue()) = aValue; 182*4a64e381SAndroid Build Coastguard Worker } 183*4a64e381SAndroid Build Coastguard Worker 184*4a64e381SAndroid Build Coastguard Worker /** 185*4a64e381SAndroid Build Coastguard Worker * This method sets int8_t as the value. 186*4a64e381SAndroid Build Coastguard Worker * 187*4a64e381SAndroid Build Coastguard Worker * @param[in] aValue The int8_t value. 188*4a64e381SAndroid Build Coastguard Worker */ SetValue(int8_t aValue)189*4a64e381SAndroid Build Coastguard Worker void SetValue(int8_t aValue) 190*4a64e381SAndroid Build Coastguard Worker { 191*4a64e381SAndroid Build Coastguard Worker SetLength(sizeof(aValue), false); 192*4a64e381SAndroid Build Coastguard Worker *static_cast<int8_t *>(GetValue()) = aValue; 193*4a64e381SAndroid Build Coastguard Worker } 194*4a64e381SAndroid Build Coastguard Worker 195*4a64e381SAndroid Build Coastguard Worker /** 196*4a64e381SAndroid Build Coastguard Worker * This method copies the value. 197*4a64e381SAndroid Build Coastguard Worker */ SetValue(const void * aValue,uint16_t aLength,bool aForceExtended=false)198*4a64e381SAndroid Build Coastguard Worker void SetValue(const void *aValue, uint16_t aLength, bool aForceExtended = false) 199*4a64e381SAndroid Build Coastguard Worker { 200*4a64e381SAndroid Build Coastguard Worker SetLength(aLength, aForceExtended); 201*4a64e381SAndroid Build Coastguard Worker memcpy(GetValue(), aValue, aLength); 202*4a64e381SAndroid Build Coastguard Worker } 203*4a64e381SAndroid Build Coastguard Worker 204*4a64e381SAndroid Build Coastguard Worker /** 205*4a64e381SAndroid Build Coastguard Worker * This method returns the pointer to the next Tlv. 206*4a64e381SAndroid Build Coastguard Worker * 207*4a64e381SAndroid Build Coastguard Worker * @returns A pointer to the next Tlv. 208*4a64e381SAndroid Build Coastguard Worker */ GetNext(void) const209*4a64e381SAndroid Build Coastguard Worker const Tlv *GetNext(void) const 210*4a64e381SAndroid Build Coastguard Worker { 211*4a64e381SAndroid Build Coastguard Worker return reinterpret_cast<const Tlv *>(static_cast<const uint8_t *>(GetValue()) + GetLength()); 212*4a64e381SAndroid Build Coastguard Worker } 213*4a64e381SAndroid Build Coastguard Worker 214*4a64e381SAndroid Build Coastguard Worker /** 215*4a64e381SAndroid Build Coastguard Worker * This method returns the pointer to the next Tlv. 216*4a64e381SAndroid Build Coastguard Worker * 217*4a64e381SAndroid Build Coastguard Worker * @returns A pointer to the next Tlv. 218*4a64e381SAndroid Build Coastguard Worker */ GetNext(void)219*4a64e381SAndroid Build Coastguard Worker Tlv *GetNext(void) { return reinterpret_cast<Tlv *>(static_cast<uint8_t *>(GetValue()) + GetLength()); } 220*4a64e381SAndroid Build Coastguard Worker 221*4a64e381SAndroid Build Coastguard Worker private: GetValue(void)222*4a64e381SAndroid Build Coastguard Worker void *GetValue(void) 223*4a64e381SAndroid Build Coastguard Worker { 224*4a64e381SAndroid Build Coastguard Worker return reinterpret_cast<uint8_t *>(this) + sizeof(mType) + 225*4a64e381SAndroid Build Coastguard Worker (mLength != kLengthEscape ? sizeof(mLength) : (sizeof(uint16_t) + sizeof(mLength))); 226*4a64e381SAndroid Build Coastguard Worker } 227*4a64e381SAndroid Build Coastguard Worker uint8_t mType; 228*4a64e381SAndroid Build Coastguard Worker uint8_t mLength; 229*4a64e381SAndroid Build Coastguard Worker }; 230*4a64e381SAndroid Build Coastguard Worker 231*4a64e381SAndroid Build Coastguard Worker namespace Meshcop { 232*4a64e381SAndroid Build Coastguard Worker 233*4a64e381SAndroid Build Coastguard Worker enum 234*4a64e381SAndroid Build Coastguard Worker { 235*4a64e381SAndroid Build Coastguard Worker kState = 16, 236*4a64e381SAndroid Build Coastguard Worker kCommissionerId = 10, 237*4a64e381SAndroid Build Coastguard Worker kCommissionerSessionId = 11, 238*4a64e381SAndroid Build Coastguard Worker kJoinerDtlsEncapsulation = 17, 239*4a64e381SAndroid Build Coastguard Worker kSteeringData = 8, 240*4a64e381SAndroid Build Coastguard Worker kJoinerUdpPort = 18, 241*4a64e381SAndroid Build Coastguard Worker kJoinerIid = 19, 242*4a64e381SAndroid Build Coastguard Worker kJoinerRouterLocator = 20, 243*4a64e381SAndroid Build Coastguard Worker kJoinerRouterKek = 21, 244*4a64e381SAndroid Build Coastguard Worker kUdpEncapsulation = 48, 245*4a64e381SAndroid Build Coastguard Worker kIPv6Address = 49, 246*4a64e381SAndroid Build Coastguard Worker }; 247*4a64e381SAndroid Build Coastguard Worker 248*4a64e381SAndroid Build Coastguard Worker enum 249*4a64e381SAndroid Build Coastguard Worker { 250*4a64e381SAndroid Build Coastguard Worker kStateAccepted = 1, 251*4a64e381SAndroid Build Coastguard Worker kStatePending = 0, 252*4a64e381SAndroid Build Coastguard Worker kStateRejected = -1, 253*4a64e381SAndroid Build Coastguard Worker }; 254*4a64e381SAndroid Build Coastguard Worker 255*4a64e381SAndroid Build Coastguard Worker } // namespace Meshcop 256*4a64e381SAndroid Build Coastguard Worker 257*4a64e381SAndroid Build Coastguard Worker } // namespace otbr 258*4a64e381SAndroid Build Coastguard Worker 259*4a64e381SAndroid Build Coastguard Worker #endif // OTBR_COMMON_TLV_HPP_ 260