1 /*
2 * Copyright (c) 2016, 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 the OpenThread Operational Dataset API (for both FTD and MTD).
32 */
33
34 #include "openthread-core-config.h"
35
36 #include <openthread/dataset.h>
37
38 #include "common/as_core_type.hpp"
39 #include "common/locator_getters.hpp"
40 #include "meshcop/dataset_manager.hpp"
41 #include "meshcop/meshcop.hpp"
42
43 using namespace ot;
44
otDatasetIsCommissioned(otInstance * aInstance)45 bool otDatasetIsCommissioned(otInstance *aInstance)
46 {
47 return AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().IsCommissioned();
48 }
49
otDatasetGetActive(otInstance * aInstance,otOperationalDataset * aDataset)50 otError otDatasetGetActive(otInstance *aInstance, otOperationalDataset *aDataset)
51 {
52 return AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().Read(AsCoreType(aDataset));
53 }
54
otDatasetGetActiveTlvs(otInstance * aInstance,otOperationalDatasetTlvs * aDataset)55 otError otDatasetGetActiveTlvs(otInstance *aInstance, otOperationalDatasetTlvs *aDataset)
56 {
57 AssertPointerIsNotNull(aDataset);
58
59 return AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().Read(*aDataset);
60 }
61
otDatasetSetActive(otInstance * aInstance,const otOperationalDataset * aDataset)62 otError otDatasetSetActive(otInstance *aInstance, const otOperationalDataset *aDataset)
63 {
64 AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().SaveLocal(AsCoreType(aDataset));
65
66 return OT_ERROR_NONE;
67 }
68
otDatasetSetActiveTlvs(otInstance * aInstance,const otOperationalDatasetTlvs * aDataset)69 otError otDatasetSetActiveTlvs(otInstance *aInstance, const otOperationalDatasetTlvs *aDataset)
70 {
71 AssertPointerIsNotNull(aDataset);
72
73 return AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().SaveLocal(*aDataset);
74 }
75
otDatasetGetPending(otInstance * aInstance,otOperationalDataset * aDataset)76 otError otDatasetGetPending(otInstance *aInstance, otOperationalDataset *aDataset)
77 {
78 return AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().Read(AsCoreType(aDataset));
79 }
80
otDatasetGetPendingTlvs(otInstance * aInstance,otOperationalDatasetTlvs * aDataset)81 otError otDatasetGetPendingTlvs(otInstance *aInstance, otOperationalDatasetTlvs *aDataset)
82 {
83 AssertPointerIsNotNull(aDataset);
84
85 return AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().Read(*aDataset);
86 }
87
otDatasetSetPending(otInstance * aInstance,const otOperationalDataset * aDataset)88 otError otDatasetSetPending(otInstance *aInstance, const otOperationalDataset *aDataset)
89 {
90 AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().SaveLocal(AsCoreType(aDataset));
91
92 return OT_ERROR_NONE;
93 }
94
otDatasetSetPendingTlvs(otInstance * aInstance,const otOperationalDatasetTlvs * aDataset)95 otError otDatasetSetPendingTlvs(otInstance *aInstance, const otOperationalDatasetTlvs *aDataset)
96 {
97 AssertPointerIsNotNull(aDataset);
98
99 return AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().SaveLocal(*aDataset);
100 }
101
otDatasetSendMgmtActiveGet(otInstance * aInstance,const otOperationalDatasetComponents * aDatasetComponents,const uint8_t * aTlvTypes,uint8_t aLength,const otIp6Address * aAddress)102 otError otDatasetSendMgmtActiveGet(otInstance *aInstance,
103 const otOperationalDatasetComponents *aDatasetComponents,
104 const uint8_t *aTlvTypes,
105 uint8_t aLength,
106 const otIp6Address *aAddress)
107 {
108 return AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().SendGetRequest(AsCoreType(aDatasetComponents),
109 aTlvTypes, aLength, aAddress);
110 }
111
otDatasetSendMgmtActiveSet(otInstance * aInstance,const otOperationalDataset * aDataset,const uint8_t * aTlvs,uint8_t aLength,otDatasetMgmtSetCallback aCallback,void * aContext)112 otError otDatasetSendMgmtActiveSet(otInstance *aInstance,
113 const otOperationalDataset *aDataset,
114 const uint8_t *aTlvs,
115 uint8_t aLength,
116 otDatasetMgmtSetCallback aCallback,
117 void *aContext)
118 {
119 return AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().SendSetRequest(AsCoreType(aDataset), aTlvs,
120 aLength, aCallback, aContext);
121 }
122
otDatasetSendMgmtPendingGet(otInstance * aInstance,const otOperationalDatasetComponents * aDatasetComponents,const uint8_t * aTlvTypes,uint8_t aLength,const otIp6Address * aAddress)123 otError otDatasetSendMgmtPendingGet(otInstance *aInstance,
124 const otOperationalDatasetComponents *aDatasetComponents,
125 const uint8_t *aTlvTypes,
126 uint8_t aLength,
127 const otIp6Address *aAddress)
128 {
129 return AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().SendGetRequest(AsCoreType(aDatasetComponents),
130 aTlvTypes, aLength, aAddress);
131 }
132
otDatasetSendMgmtPendingSet(otInstance * aInstance,const otOperationalDataset * aDataset,const uint8_t * aTlvs,uint8_t aLength,otDatasetMgmtSetCallback aCallback,void * aContext)133 otError otDatasetSendMgmtPendingSet(otInstance *aInstance,
134 const otOperationalDataset *aDataset,
135 const uint8_t *aTlvs,
136 uint8_t aLength,
137 otDatasetMgmtSetCallback aCallback,
138 void *aContext)
139 {
140 return AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().SendSetRequest(AsCoreType(aDataset), aTlvs,
141 aLength, aCallback, aContext);
142 }
143
144 #if OPENTHREAD_FTD
otDatasetGeneratePskc(const char * aPassPhrase,const otNetworkName * aNetworkName,const otExtendedPanId * aExtPanId,otPskc * aPskc)145 otError otDatasetGeneratePskc(const char *aPassPhrase,
146 const otNetworkName *aNetworkName,
147 const otExtendedPanId *aExtPanId,
148 otPskc *aPskc)
149 {
150 return MeshCoP::GeneratePskc(aPassPhrase, AsCoreType(aNetworkName), AsCoreType(aExtPanId), AsCoreType(aPskc));
151 }
152 #endif
153
otNetworkNameFromString(otNetworkName * aNetworkName,const char * aNameString)154 otError otNetworkNameFromString(otNetworkName *aNetworkName, const char *aNameString)
155 {
156 otError error = AsCoreType(aNetworkName).Set(aNameString);
157
158 return (error == OT_ERROR_ALREADY) ? OT_ERROR_NONE : error;
159 }
160
otDatasetParseTlvs(const otOperationalDatasetTlvs * aDatasetTlvs,otOperationalDataset * aDataset)161 otError otDatasetParseTlvs(const otOperationalDatasetTlvs *aDatasetTlvs, otOperationalDataset *aDataset)
162 {
163 Error error = kErrorNone;
164 MeshCoP::Dataset dataset;
165
166 AssertPointerIsNotNull(aDatasetTlvs);
167
168 SuccessOrExit(error = dataset.SetFrom(*aDatasetTlvs));
169 VerifyOrExit(dataset.ValidateTlvs() == kErrorNone, error = kErrorInvalidArgs);
170 dataset.ConvertTo(AsCoreType(aDataset));
171
172 exit:
173 return error;
174 }
175
otDatasetConvertToTlvs(const otOperationalDataset * aDataset,otOperationalDatasetTlvs * aDatasetTlvs)176 void otDatasetConvertToTlvs(const otOperationalDataset *aDataset, otOperationalDatasetTlvs *aDatasetTlvs)
177 {
178 MeshCoP::Dataset dataset;
179
180 AssertPointerIsNotNull(aDatasetTlvs);
181
182 dataset.SetFrom(AsCoreType(aDataset));
183 dataset.ConvertTo(*aDatasetTlvs);
184 }
185
otDatasetUpdateTlvs(const otOperationalDataset * aDataset,otOperationalDatasetTlvs * aDatasetTlvs)186 otError otDatasetUpdateTlvs(const otOperationalDataset *aDataset, otOperationalDatasetTlvs *aDatasetTlvs)
187 {
188 Error error = kErrorNone;
189 MeshCoP::Dataset dataset;
190
191 AssertPointerIsNotNull(aDatasetTlvs);
192
193 SuccessOrExit(error = dataset.SetFrom(*aDatasetTlvs));
194 SuccessOrExit(error = dataset.WriteTlvsFrom(AsCoreType(aDataset)));
195 dataset.ConvertTo(*aDatasetTlvs);
196
197 exit:
198 return error;
199 }
200