1 /*
2 * Copyright (c) 2020, 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 includes definitions for Thread URIs.
32 */
33
34 #include "uri_paths.hpp"
35
36 #include "instance/instance.hpp"
37
38 namespace ot {
39
40 namespace UriList {
41
42 struct Entry
43 {
44 const char *mPath;
45
AreInOrderot::UriList::Entry46 constexpr static bool AreInOrder(const Entry &aFirst, const Entry &aSecond)
47 {
48 return AreStringsInOrder(aFirst.mPath, aSecond.mPath);
49 }
50
Compareot::UriList::Entry51 int Compare(const char *aPath) const { return strcmp(aPath, mPath); }
52 };
53
54 // The list of URI paths (MUST be sorted alphabetically)
55 static constexpr Entry kEntries[] = {
56 {"a/ae"}, // (0) kUriAddressError
57 {"a/an"}, // (1) kUriAddressNotify
58 {"a/aq"}, // (2) kUriAddressQuery
59 {"a/ar"}, // (3) kUriAddressRelease
60 {"a/as"}, // (4) kUriAddressSolicit
61 {"a/sd"}, // (5) kUriServerData
62 {"a/yl"}, // (6) kUriAnycastLocate
63 {"b/ba"}, // (7) kUriBackboneAnswer
64 {"b/bmr"}, // (8) kUriBackboneMlr
65 {"b/bq"}, // (9) kUriBackboneQuery
66 {"c/ab"}, // (10) kUriAnnounceBegin
67 {"c/ag"}, // (11) kUriActiveGet
68 {"c/ar"}, // (12) kUriActiveReplace
69 {"c/as"}, // (13) kUriActiveSet
70 {"c/ca"}, // (14) kUriCommissionerKeepAlive
71 {"c/cg"}, // (15) kUriCommissionerGet
72 {"c/cp"}, // (16) kUriCommissionerPetition
73 {"c/cs"}, // (17) kUriCommissionerSet
74 {"c/dc"}, // (18) kUriDatasetChanged
75 {"c/er"}, // (19) kUriEnergyReport
76 {"c/es"}, // (20) kUriEnergyScan
77 {"c/je"}, // (21) kUriJoinerEntrust
78 {"c/jf"}, // (22) kUriJoinerFinalize
79 {"c/la"}, // (23) kUriLeaderKeepAlive
80 {"c/lp"}, // (24) kUriLeaderPetition
81 {"c/pc"}, // (25) kUriPanIdConflict
82 {"c/pg"}, // (26) kUriPendingGet
83 {"c/pq"}, // (27) kUriPanIdQuery
84 {"c/ps"}, // (28) kUriPendingSet
85 {"c/rx"}, // (29) kUriRelayRx
86 {"c/tx"}, // (30) kUriRelayTx
87 {"c/ur"}, // (31) kUriProxyRx
88 {"c/ut"}, // (32) kUriProxyTx
89 {"d/da"}, // (33) kUriDiagnosticGetAnswer
90 {"d/dg"}, // (34) kUriDiagnosticGetRequest
91 {"d/dq"}, // (35) kUriDiagnosticGetQuery
92 {"d/dr"}, // (36) kUriDiagnosticReset
93 {"n/dn"}, // (37) kUriDuaRegistrationNotify
94 {"n/dr"}, // (38) kUriDuaRegistrationRequest
95 {"n/mr"}, // (39) kUriMlr
96 };
97
98 static_assert(BinarySearch::IsSorted(kEntries), "kEntries is not sorted");
99
100 struct UriEnumCheck
101 {
102 InitEnumValidatorCounter();
103 ValidateNextEnum(kUriAddressError);
104 ValidateNextEnum(kUriAddressNotify);
105 ValidateNextEnum(kUriAddressQuery);
106 ValidateNextEnum(kUriAddressRelease);
107 ValidateNextEnum(kUriAddressSolicit);
108 ValidateNextEnum(kUriServerData);
109 ValidateNextEnum(kUriAnycastLocate);
110 ValidateNextEnum(kUriBackboneAnswer);
111 ValidateNextEnum(kUriBackboneMlr);
112 ValidateNextEnum(kUriBackboneQuery);
113 ValidateNextEnum(kUriAnnounceBegin);
114 ValidateNextEnum(kUriActiveGet);
115 ValidateNextEnum(kUriActiveReplace);
116 ValidateNextEnum(kUriActiveSet);
117 ValidateNextEnum(kUriCommissionerKeepAlive);
118 ValidateNextEnum(kUriCommissionerGet);
119 ValidateNextEnum(kUriCommissionerPetition);
120 ValidateNextEnum(kUriCommissionerSet);
121 ValidateNextEnum(kUriDatasetChanged);
122 ValidateNextEnum(kUriEnergyReport);
123 ValidateNextEnum(kUriEnergyScan);
124 ValidateNextEnum(kUriJoinerEntrust);
125 ValidateNextEnum(kUriJoinerFinalize);
126 ValidateNextEnum(kUriLeaderKeepAlive);
127 ValidateNextEnum(kUriLeaderPetition);
128 ValidateNextEnum(kUriPanIdConflict);
129 ValidateNextEnum(kUriPendingGet);
130 ValidateNextEnum(kUriPanIdQuery);
131 ValidateNextEnum(kUriPendingSet);
132 ValidateNextEnum(kUriRelayRx);
133 ValidateNextEnum(kUriRelayTx);
134 ValidateNextEnum(kUriProxyRx);
135 ValidateNextEnum(kUriProxyTx);
136 ValidateNextEnum(kUriDiagnosticGetAnswer);
137 ValidateNextEnum(kUriDiagnosticGetRequest);
138 ValidateNextEnum(kUriDiagnosticGetQuery);
139 ValidateNextEnum(kUriDiagnosticReset);
140 ValidateNextEnum(kUriDuaRegistrationNotify);
141 ValidateNextEnum(kUriDuaRegistrationRequest);
142 ValidateNextEnum(kUriMlr);
143 };
144
145 } // namespace UriList
146
PathForUri(Uri aUri)147 const char *PathForUri(Uri aUri)
148 {
149 OT_ASSERT(aUri != kUriUnknown);
150
151 return UriList::kEntries[aUri].mPath;
152 }
153
UriFromPath(const char * aPath)154 Uri UriFromPath(const char *aPath)
155 {
156 Uri uri = kUriUnknown;
157 const UriList::Entry *entry = BinarySearch::Find(aPath, UriList::kEntries);
158
159 VerifyOrExit(entry != nullptr);
160 uri = static_cast<Uri>(entry - UriList::kEntries);
161
162 exit:
163 return uri;
164 }
165
UriToString(void)166 template <> const char *UriToString<kUriAddressError>(void) { return "AddressError"; }
UriToString(void)167 template <> const char *UriToString<kUriAddressNotify>(void) { return "AddressNotify"; }
UriToString(void)168 template <> const char *UriToString<kUriAddressQuery>(void) { return "AddressQuery"; }
UriToString(void)169 template <> const char *UriToString<kUriAddressRelease>(void) { return "AddressRelease"; }
UriToString(void)170 template <> const char *UriToString<kUriAddressSolicit>(void) { return "AddressSolicit"; }
UriToString(void)171 template <> const char *UriToString<kUriServerData>(void) { return "ServerData"; }
UriToString(void)172 template <> const char *UriToString<kUriAnycastLocate>(void) { return "AnycastLocate"; }
UriToString(void)173 template <> const char *UriToString<kUriBackboneAnswer>(void) { return "BackboneAnswer"; }
UriToString(void)174 template <> const char *UriToString<kUriBackboneMlr>(void) { return "BackboneMlr"; }
UriToString(void)175 template <> const char *UriToString<kUriBackboneQuery>(void) { return "BackboneQuery"; }
UriToString(void)176 template <> const char *UriToString<kUriAnnounceBegin>(void) { return "AnnounceBegin"; }
UriToString(void)177 template <> const char *UriToString<kUriActiveGet>(void) { return "ActiveGet"; }
UriToString(void)178 template <> const char *UriToString<kUriActiveReplace>(void) { return "ActiveReplace"; }
UriToString(void)179 template <> const char *UriToString<kUriActiveSet>(void) { return "ActiveSet"; }
UriToString(void)180 template <> const char *UriToString<kUriCommissionerKeepAlive>(void) { return "CommissionerKeepAlive"; }
UriToString(void)181 template <> const char *UriToString<kUriCommissionerGet>(void) { return "CommissionerGet"; }
UriToString(void)182 template <> const char *UriToString<kUriCommissionerPetition>(void) { return "CommissionerPetition"; }
UriToString(void)183 template <> const char *UriToString<kUriCommissionerSet>(void) { return "CommissionerSet"; }
UriToString(void)184 template <> const char *UriToString<kUriDatasetChanged>(void) { return "DatasetChanged"; }
UriToString(void)185 template <> const char *UriToString<kUriEnergyReport>(void) { return "EnergyReport"; }
UriToString(void)186 template <> const char *UriToString<kUriEnergyScan>(void) { return "EnergyScan"; }
UriToString(void)187 template <> const char *UriToString<kUriJoinerEntrust>(void) { return "JoinerEntrust"; }
UriToString(void)188 template <> const char *UriToString<kUriJoinerFinalize>(void) { return "JoinerFinalize"; }
UriToString(void)189 template <> const char *UriToString<kUriLeaderKeepAlive>(void) { return "LeaderKeepAlive"; }
UriToString(void)190 template <> const char *UriToString<kUriLeaderPetition>(void) { return "LeaderPetition"; }
UriToString(void)191 template <> const char *UriToString<kUriPanIdConflict>(void) { return "PanIdConflict"; }
UriToString(void)192 template <> const char *UriToString<kUriPendingGet>(void) { return "PendingGet"; }
UriToString(void)193 template <> const char *UriToString<kUriPanIdQuery>(void) { return "PanIdQuery"; }
UriToString(void)194 template <> const char *UriToString<kUriPendingSet>(void) { return "PendingSet"; }
UriToString(void)195 template <> const char *UriToString<kUriRelayRx>(void) { return "RelayRx"; }
UriToString(void)196 template <> const char *UriToString<kUriRelayTx>(void) { return "RelayTx"; }
UriToString(void)197 template <> const char *UriToString<kUriProxyRx>(void) { return "ProxyRx"; }
UriToString(void)198 template <> const char *UriToString<kUriProxyTx>(void) { return "ProxyTx"; }
UriToString(void)199 template <> const char *UriToString<kUriDiagnosticGetAnswer>(void) { return "DiagGetAnswer"; }
UriToString(void)200 template <> const char *UriToString<kUriDiagnosticGetRequest>(void) { return "DiagGetRequest"; }
UriToString(void)201 template <> const char *UriToString<kUriDiagnosticGetQuery>(void) { return "DiagGetQuery"; }
UriToString(void)202 template <> const char *UriToString<kUriDiagnosticReset>(void) { return "DiagReset"; }
UriToString(void)203 template <> const char *UriToString<kUriDuaRegistrationNotify>(void) { return "DuaRegNotify"; }
UriToString(void)204 template <> const char *UriToString<kUriDuaRegistrationRequest>(void) { return "DuaRegRequest"; }
UriToString(void)205 template <> const char *UriToString<kUriMlr>(void) { return "Mlr"; }
206
207 } // namespace ot
208