1 /*
2 * Copyright (c) 2024, 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 #ifndef OT_NEXUS_NODE_HPP_
30 #define OT_NEXUS_NODE_HPP_
31
32 #include "instance/instance.hpp"
33
34 #include "nexus_alarm.hpp"
35 #include "nexus_core.hpp"
36 #include "nexus_radio.hpp"
37 #include "nexus_settings.hpp"
38 #include "nexus_utils.hpp"
39
40 namespace ot {
41 namespace Nexus {
42
43 class Node : public Heap::Allocatable<Node>, public LinkedListEntry<Node>, private Instance
44 {
45 friend class Heap::Allocatable<Node>;
46
47 public:
48 enum JoinMode : uint8_t
49 {
50 kAsFtd,
51 kAsFed,
52 kAsMed,
53 kAsSed,
54 };
55
56 void Form(void);
57 void Join(Node &aNode, JoinMode aJoinMode = kAsFtd);
58 void AllowList(Node &aNode);
59 void UnallowList(Node &aNode);
60
61 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
62
Get(void)63 template <typename Type> Type &Get(void)
64 {
65 Core::Get().SetActiveNode(this);
66 return Instance::Get<Type>();
67 }
68
GetInstance(void)69 Instance &GetInstance(void)
70 {
71 Core::Get().SetActiveNode(this);
72 return *this;
73 }
74
GetId(void)75 uint32_t GetId(void) { return GetInstance().GetId(); }
76
From(otInstance * aInstance)77 static Node &From(otInstance *aInstance) { return static_cast<Node &>(*aInstance); }
78
79 Node *mNext;
80 Radio mRadio;
81 Alarm mAlarm;
82 Settings mSettings;
83 bool mPendingTasklet;
84
85 private:
86 Node(void) = default;
87 };
88
AsNode(otInstance * aInstance)89 inline Node &AsNode(otInstance *aInstance) { return Node::From(aInstance); }
90
91 } // namespace Nexus
92 } // namespace ot
93
94 #endif // OT_NEXUS_NODE_HPP_
95