xref: /aosp_15_r20/external/ot-br-posix/src/common/tlv.hpp (revision 4a64e381480ef79f0532b2421e44e6ee336b8e0d)
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