1 /*
2 * Copyright (c) 2022, The OpenThread Authors.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. Neither the name of the copyright holder nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 /**
30 * @file
31 * This file implements function for generating and processing MLE TLVs.
32 */
33
34 #include "mle_tlvs.hpp"
35
36 #include "common/code_utils.hpp"
37
38 namespace ot {
39 namespace Mle {
40
41 #if !OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
42
Init(void)43 void RouteTlv::Init(void)
44 {
45 SetType(kRoute);
46 SetLength(sizeof(*this) - sizeof(Tlv));
47 mRouterIdMask.Clear();
48 memset(mRouteData, 0, sizeof(mRouteData));
49 }
50
IsValid(void) const51 bool RouteTlv::IsValid(void) const
52 {
53 bool isValid = false;
54 uint8_t numAllocatedIds;
55
56 VerifyOrExit(GetLength() >= sizeof(mRouterIdSequence) + sizeof(mRouterIdMask));
57
58 numAllocatedIds = mRouterIdMask.GetNumberOfAllocatedIds();
59 VerifyOrExit(numAllocatedIds <= Mle::kMaxRouters);
60
61 isValid = (GetRouteDataLength() >= numAllocatedIds);
62
63 exit:
64 return isValid;
65 }
66
67 #endif // #if !OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
68
IncrementLinkQuality(LinkQuality aLinkQuality)69 void ConnectivityTlv::IncrementLinkQuality(LinkQuality aLinkQuality)
70 {
71 switch (aLinkQuality)
72 {
73 case kLinkQuality0:
74 break;
75 case kLinkQuality1:
76 mLinkQuality1++;
77 break;
78 case kLinkQuality2:
79 mLinkQuality2++;
80 break;
81 case kLinkQuality3:
82 mLinkQuality3++;
83 break;
84 }
85 }
86
GetParentPriority(void) const87 int8_t ConnectivityTlv::GetParentPriority(void) const
88 {
89 return Preference::From2BitUint(mFlags >> kFlagsParentPriorityOffset);
90 }
91
SetParentPriority(int8_t aParentPriority)92 void ConnectivityTlv::SetParentPriority(int8_t aParentPriority)
93 {
94 mFlags = static_cast<uint8_t>(Preference::To2BitUint(aParentPriority) << kFlagsParentPriorityOffset);
95 }
96
97 } // namespace Mle
98 } // namespace ot
99