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 Network Data API.
32  */
33 
34 #include "openthread-core-config.h"
35 
36 #include <openthread/netdata.h>
37 
38 #include "common/as_core_type.hpp"
39 #include "common/locator_getters.hpp"
40 
41 using namespace ot;
42 
otNetDataGet(otInstance * aInstance,bool aStable,uint8_t * aData,uint8_t * aDataLength)43 otError otNetDataGet(otInstance *aInstance, bool aStable, uint8_t *aData, uint8_t *aDataLength)
44 {
45     AssertPointerIsNotNull(aData);
46     AssertPointerIsNotNull(aDataLength);
47 
48     return AsCoreType(aInstance).Get<NetworkData::Leader>().CopyNetworkData(
49         aStable ? NetworkData::kStableSubset : NetworkData::kFullSet, aData, *aDataLength);
50 }
51 
otNetDataGetLength(otInstance * aInstance)52 uint8_t otNetDataGetLength(otInstance *aInstance)
53 {
54     return AsCoreType(aInstance).Get<NetworkData::Leader>().GetLength();
55 }
56 
otNetDataGetMaxLength(otInstance * aInstance)57 uint8_t otNetDataGetMaxLength(otInstance *aInstance)
58 {
59     return AsCoreType(aInstance).Get<NetworkData::Leader>().GetMaxLength();
60 }
61 
otNetDataResetMaxLength(otInstance * aInstance)62 void otNetDataResetMaxLength(otInstance *aInstance)
63 {
64     AsCoreType(aInstance).Get<NetworkData::Leader>().ResetMaxLength();
65 }
66 
otNetDataGetNextOnMeshPrefix(otInstance * aInstance,otNetworkDataIterator * aIterator,otBorderRouterConfig * aConfig)67 otError otNetDataGetNextOnMeshPrefix(otInstance            *aInstance,
68                                      otNetworkDataIterator *aIterator,
69                                      otBorderRouterConfig  *aConfig)
70 {
71     AssertPointerIsNotNull(aIterator);
72 
73     return AsCoreType(aInstance).Get<NetworkData::Leader>().GetNextOnMeshPrefix(*aIterator, AsCoreType(aConfig));
74 }
75 
76 #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
otNetDataContainsOmrPrefix(otInstance * aInstance,const otIp6Prefix * aPrefix)77 bool otNetDataContainsOmrPrefix(otInstance *aInstance, const otIp6Prefix *aPrefix)
78 {
79     return AsCoreType(aInstance).Get<NetworkData::Leader>().ContainsOmrPrefix(AsCoreType(aPrefix));
80 }
81 #endif
82 
otNetDataGetNextRoute(otInstance * aInstance,otNetworkDataIterator * aIterator,otExternalRouteConfig * aConfig)83 otError otNetDataGetNextRoute(otInstance *aInstance, otNetworkDataIterator *aIterator, otExternalRouteConfig *aConfig)
84 {
85     AssertPointerIsNotNull(aIterator);
86 
87     return AsCoreType(aInstance).Get<NetworkData::Leader>().GetNextExternalRoute(*aIterator, AsCoreType(aConfig));
88 }
89 
otNetDataGetNextService(otInstance * aInstance,otNetworkDataIterator * aIterator,otServiceConfig * aConfig)90 otError otNetDataGetNextService(otInstance *aInstance, otNetworkDataIterator *aIterator, otServiceConfig *aConfig)
91 {
92     AssertPointerIsNotNull(aIterator);
93 
94     return AsCoreType(aInstance).Get<NetworkData::Leader>().GetNextService(*aIterator, AsCoreType(aConfig));
95 }
96 
otNetDataGetNextLowpanContextInfo(otInstance * aInstance,otNetworkDataIterator * aIterator,otLowpanContextInfo * aContextInfo)97 otError otNetDataGetNextLowpanContextInfo(otInstance            *aInstance,
98                                           otNetworkDataIterator *aIterator,
99                                           otLowpanContextInfo   *aContextInfo)
100 {
101     AssertPointerIsNotNull(aIterator);
102 
103     return AsCoreType(aInstance).Get<NetworkData::Leader>().GetNextLowpanContextInfo(*aIterator,
104                                                                                      AsCoreType(aContextInfo));
105 }
106 
otNetDataGetVersion(otInstance * aInstance)107 uint8_t otNetDataGetVersion(otInstance *aInstance)
108 {
109     return AsCoreType(aInstance).Get<Mle::MleRouter>().GetLeaderData().GetDataVersion(NetworkData::kFullSet);
110 }
111 
otNetDataGetStableVersion(otInstance * aInstance)112 uint8_t otNetDataGetStableVersion(otInstance *aInstance)
113 {
114     return AsCoreType(aInstance).Get<Mle::MleRouter>().GetLeaderData().GetDataVersion(NetworkData::kStableSubset);
115 }
116 
otNetDataSteeringDataCheckJoiner(otInstance * aInstance,const otExtAddress * aEui64)117 otError otNetDataSteeringDataCheckJoiner(otInstance *aInstance, const otExtAddress *aEui64)
118 {
119     return AsCoreType(aInstance).Get<NetworkData::Leader>().SteeringDataCheckJoiner(AsCoreType(aEui64));
120 }
121 
otNetDataSteeringDataCheckJoinerWithDiscerner(otInstance * aInstance,const otJoinerDiscerner * aDiscerner)122 otError otNetDataSteeringDataCheckJoinerWithDiscerner(otInstance *aInstance, const otJoinerDiscerner *aDiscerner)
123 {
124     return AsCoreType(aInstance).Get<NetworkData::Leader>().SteeringDataCheckJoiner(AsCoreType(aDiscerner));
125 }
126