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