• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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