1 /*
2 * Copyright (c) 2024, 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 mDNS API.
32 */
33
34 #include "openthread-core-config.h"
35
36 #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE && OPENTHREAD_CONFIG_MULTICAST_DNS_PUBLIC_API_ENABLE
37
38 #include "instance/instance.hpp"
39
40 using namespace ot;
41
otMdnsSetEnabled(otInstance * aInstance,bool aEnable,uint32_t aInfraIfIndex)42 otError otMdnsSetEnabled(otInstance *aInstance, bool aEnable, uint32_t aInfraIfIndex)
43 {
44 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().SetEnabled(aEnable, aInfraIfIndex);
45 }
46
otMdnsIsEnabled(otInstance * aInstance)47 bool otMdnsIsEnabled(otInstance *aInstance) { return AsCoreType(aInstance).Get<Dns::Multicast::Core>().IsEnabled(); }
48
otMdnsSetQuestionUnicastAllowed(otInstance * aInstance,bool aAllow)49 void otMdnsSetQuestionUnicastAllowed(otInstance *aInstance, bool aAllow)
50 {
51 AsCoreType(aInstance).Get<Dns::Multicast::Core>().SetQuestionUnicastAllowed(aAllow);
52 }
53
otMdnsIsQuestionUnicastAllowed(otInstance * aInstance)54 bool otMdnsIsQuestionUnicastAllowed(otInstance *aInstance)
55 {
56 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().IsQuestionUnicastAllowed();
57 }
58
otMdnsSetConflictCallback(otInstance * aInstance,otMdnsConflictCallback aCallback)59 void otMdnsSetConflictCallback(otInstance *aInstance, otMdnsConflictCallback aCallback)
60 {
61 AsCoreType(aInstance).Get<Dns::Multicast::Core>().SetConflictCallback(aCallback);
62 }
63
otMdnsRegisterHost(otInstance * aInstance,const otMdnsHost * aHost,otMdnsRequestId aRequestId,otMdnsRegisterCallback aCallback)64 otError otMdnsRegisterHost(otInstance *aInstance,
65 const otMdnsHost *aHost,
66 otMdnsRequestId aRequestId,
67 otMdnsRegisterCallback aCallback)
68 {
69 AssertPointerIsNotNull(aHost);
70
71 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().RegisterHost(*aHost, aRequestId, aCallback);
72 }
73
otMdnsUnregisterHost(otInstance * aInstance,const otMdnsHost * aHost)74 otError otMdnsUnregisterHost(otInstance *aInstance, const otMdnsHost *aHost)
75 {
76 AssertPointerIsNotNull(aHost);
77
78 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().UnregisterHost(*aHost);
79 }
80
otMdnsRegisterService(otInstance * aInstance,const otMdnsService * aService,otMdnsRequestId aRequestId,otMdnsRegisterCallback aCallback)81 otError otMdnsRegisterService(otInstance *aInstance,
82 const otMdnsService *aService,
83 otMdnsRequestId aRequestId,
84 otMdnsRegisterCallback aCallback)
85 {
86 AssertPointerIsNotNull(aService);
87
88 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().RegisterService(*aService, aRequestId, aCallback);
89 }
90
otMdnsUnregisterService(otInstance * aInstance,const otMdnsService * aService)91 otError otMdnsUnregisterService(otInstance *aInstance, const otMdnsService *aService)
92 {
93 AssertPointerIsNotNull(aService);
94
95 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().UnregisterService(*aService);
96 }
97
otMdnsRegisterKey(otInstance * aInstance,const otMdnsKey * aKey,otMdnsRequestId aRequestId,otMdnsRegisterCallback aCallback)98 otError otMdnsRegisterKey(otInstance *aInstance,
99 const otMdnsKey *aKey,
100 otMdnsRequestId aRequestId,
101 otMdnsRegisterCallback aCallback)
102 {
103 AssertPointerIsNotNull(aKey);
104
105 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().RegisterKey(*aKey, aRequestId, aCallback);
106 }
107
otMdnsUnregisterKey(otInstance * aInstance,const otMdnsKey * aKey)108 otError otMdnsUnregisterKey(otInstance *aInstance, const otMdnsKey *aKey)
109 {
110 AssertPointerIsNotNull(aKey);
111
112 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().UnregisterKey(*aKey);
113 }
114
115 #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENTRY_ITERATION_API_ENABLE
116
otMdnsAllocateIterator(otInstance * aInstance)117 otMdnsIterator *otMdnsAllocateIterator(otInstance *aInstance)
118 {
119 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().AllocateIterator();
120 }
121
otMdnsFreeIterator(otInstance * aInstance,otMdnsIterator * aIterator)122 void otMdnsFreeIterator(otInstance *aInstance, otMdnsIterator *aIterator)
123 {
124 AssertPointerIsNotNull(aIterator);
125
126 AsCoreType(aInstance).Get<Dns::Multicast::Core>().FreeIterator(*aIterator);
127 }
128
otMdnsGetNextHost(otInstance * aInstance,otMdnsIterator * aIterator,otMdnsHost * aHost,otMdnsEntryState * aState)129 otError otMdnsGetNextHost(otInstance *aInstance, otMdnsIterator *aIterator, otMdnsHost *aHost, otMdnsEntryState *aState)
130 {
131 AssertPointerIsNotNull(aIterator);
132 AssertPointerIsNotNull(aHost);
133 AssertPointerIsNotNull(aState);
134
135 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().GetNextHost(*aIterator, *aHost, *aState);
136 }
137
otMdnsGetNextService(otInstance * aInstance,otMdnsIterator * aIterator,otMdnsService * aService,otMdnsEntryState * aState)138 otError otMdnsGetNextService(otInstance *aInstance,
139 otMdnsIterator *aIterator,
140 otMdnsService *aService,
141 otMdnsEntryState *aState)
142 {
143 AssertPointerIsNotNull(aIterator);
144 AssertPointerIsNotNull(aService);
145 AssertPointerIsNotNull(aState);
146
147 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().GetNextService(*aIterator, *aService, *aState);
148 }
149
otMdnsGetNextKey(otInstance * aInstance,otMdnsIterator * aIterator,otMdnsKey * aKey,otMdnsEntryState * aState)150 otError otMdnsGetNextKey(otInstance *aInstance, otMdnsIterator *aIterator, otMdnsKey *aKey, otMdnsEntryState *aState)
151 {
152 AssertPointerIsNotNull(aIterator);
153 AssertPointerIsNotNull(aKey);
154 AssertPointerIsNotNull(aState);
155
156 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().GetNextKey(*aIterator, *aKey, *aState);
157 }
158
159 #endif // OPENTHREAD_CONFIG_MULTICAST_DNS_ENTRY_ITERATION_API_ENABLE
160
otMdnsStartBrowser(otInstance * aInstance,const otMdnsBrowser * aBroswer)161 otError otMdnsStartBrowser(otInstance *aInstance, const otMdnsBrowser *aBroswer)
162 {
163 AssertPointerIsNotNull(aBroswer);
164
165 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().StartBrowser(*aBroswer);
166 }
167
otMdnsStopBrowser(otInstance * aInstance,const otMdnsBrowser * aBroswer)168 otError otMdnsStopBrowser(otInstance *aInstance, const otMdnsBrowser *aBroswer)
169 {
170 AssertPointerIsNotNull(aBroswer);
171
172 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().StopBrowser(*aBroswer);
173 }
174
otMdnsStartSrvResolver(otInstance * aInstance,const otMdnsSrvResolver * aResolver)175 otError otMdnsStartSrvResolver(otInstance *aInstance, const otMdnsSrvResolver *aResolver)
176 {
177 AssertPointerIsNotNull(aResolver);
178
179 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().StartSrvResolver(*aResolver);
180 }
181
otMdnsStopSrvResolver(otInstance * aInstance,const otMdnsSrvResolver * aResolver)182 otError otMdnsStopSrvResolver(otInstance *aInstance, const otMdnsSrvResolver *aResolver)
183 {
184 AssertPointerIsNotNull(aResolver);
185
186 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().StopSrvResolver(*aResolver);
187 }
188
otMdnsStartTxtResolver(otInstance * aInstance,const otMdnsTxtResolver * aResolver)189 otError otMdnsStartTxtResolver(otInstance *aInstance, const otMdnsTxtResolver *aResolver)
190 {
191 AssertPointerIsNotNull(aResolver);
192
193 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().StartTxtResolver(*aResolver);
194 }
195
otMdnsStopTxtResolver(otInstance * aInstance,const otMdnsTxtResolver * aResolver)196 otError otMdnsStopTxtResolver(otInstance *aInstance, const otMdnsTxtResolver *aResolver)
197 {
198 AssertPointerIsNotNull(aResolver);
199
200 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().StopTxtResolver(*aResolver);
201 }
202
otMdnsStartIp6AddressResolver(otInstance * aInstance,const otMdnsAddressResolver * aResolver)203 otError otMdnsStartIp6AddressResolver(otInstance *aInstance, const otMdnsAddressResolver *aResolver)
204 {
205 AssertPointerIsNotNull(aResolver);
206
207 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().StartIp6AddressResolver(*aResolver);
208 }
209
otMdnsStopIp6AddressResolver(otInstance * aInstance,const otMdnsAddressResolver * aResolver)210 otError otMdnsStopIp6AddressResolver(otInstance *aInstance, const otMdnsAddressResolver *aResolver)
211 {
212 AssertPointerIsNotNull(aResolver);
213
214 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().StopIp6AddressResolver(*aResolver);
215 }
216
otMdnsStartIp4AddressResolver(otInstance * aInstance,const otMdnsAddressResolver * aResolver)217 otError otMdnsStartIp4AddressResolver(otInstance *aInstance, const otMdnsAddressResolver *aResolver)
218 {
219 AssertPointerIsNotNull(aResolver);
220
221 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().StartIp4AddressResolver(*aResolver);
222 }
223
otMdnsStopIp4AddressResolver(otInstance * aInstance,const otMdnsAddressResolver * aResolver)224 otError otMdnsStopIp4AddressResolver(otInstance *aInstance, const otMdnsAddressResolver *aResolver)
225 {
226 AssertPointerIsNotNull(aResolver);
227
228 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().StopIp4AddressResolver(*aResolver);
229 }
230
231 #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENTRY_ITERATION_API_ENABLE
232
otMdnsGetNextBrowser(otInstance * aInstance,otMdnsIterator * aIterator,otMdnsBrowser * aBrowser,otMdnsCacheInfo * aInfo)233 otError otMdnsGetNextBrowser(otInstance *aInstance,
234 otMdnsIterator *aIterator,
235 otMdnsBrowser *aBrowser,
236 otMdnsCacheInfo *aInfo)
237 {
238 AssertPointerIsNotNull(aIterator);
239 AssertPointerIsNotNull(aBrowser);
240 AssertPointerIsNotNull(aInfo);
241
242 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().GetNextBrowser(*aIterator, *aBrowser, *aInfo);
243 }
244
otMdnsGetNextSrvResolver(otInstance * aInstance,otMdnsIterator * aIterator,otMdnsSrvResolver * aResolver,otMdnsCacheInfo * aInfo)245 otError otMdnsGetNextSrvResolver(otInstance *aInstance,
246 otMdnsIterator *aIterator,
247 otMdnsSrvResolver *aResolver,
248 otMdnsCacheInfo *aInfo)
249 {
250 AssertPointerIsNotNull(aIterator);
251 AssertPointerIsNotNull(aResolver);
252 AssertPointerIsNotNull(aInfo);
253
254 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().GetNextSrvResolver(*aIterator, *aResolver, *aInfo);
255 }
256
otMdnsGetNextTxtResolver(otInstance * aInstance,otMdnsIterator * aIterator,otMdnsTxtResolver * aResolver,otMdnsCacheInfo * aInfo)257 otError otMdnsGetNextTxtResolver(otInstance *aInstance,
258 otMdnsIterator *aIterator,
259 otMdnsTxtResolver *aResolver,
260 otMdnsCacheInfo *aInfo)
261 {
262 AssertPointerIsNotNull(aIterator);
263 AssertPointerIsNotNull(aResolver);
264 AssertPointerIsNotNull(aInfo);
265
266 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().GetNextTxtResolver(*aIterator, *aResolver, *aInfo);
267 }
268
otMdnsGetNextIp6AddressResolver(otInstance * aInstance,otMdnsIterator * aIterator,otMdnsAddressResolver * aResolver,otMdnsCacheInfo * aInfo)269 otError otMdnsGetNextIp6AddressResolver(otInstance *aInstance,
270 otMdnsIterator *aIterator,
271 otMdnsAddressResolver *aResolver,
272 otMdnsCacheInfo *aInfo)
273 {
274 AssertPointerIsNotNull(aIterator);
275 AssertPointerIsNotNull(aResolver);
276 AssertPointerIsNotNull(aInfo);
277
278 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().GetNextIp6AddressResolver(*aIterator, *aResolver, *aInfo);
279 }
280
otMdnsGetNextIp4AddressResolver(otInstance * aInstance,otMdnsIterator * aIterator,otMdnsAddressResolver * aResolver,otMdnsCacheInfo * aInfo)281 otError otMdnsGetNextIp4AddressResolver(otInstance *aInstance,
282 otMdnsIterator *aIterator,
283 otMdnsAddressResolver *aResolver,
284 otMdnsCacheInfo *aInfo)
285 {
286 AssertPointerIsNotNull(aIterator);
287 AssertPointerIsNotNull(aResolver);
288 AssertPointerIsNotNull(aInfo);
289
290 return AsCoreType(aInstance).Get<Dns::Multicast::Core>().GetNextIp4AddressResolver(*aIterator, *aResolver, *aInfo);
291 }
292
293 #endif // OPENTHREAD_CONFIG_MULTICAST_DNS_ENTRY_ITERATION_API_ENABLE
294
295 #endif // OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE && OPENTHREAD_CONFIG_MULTICAST_DNS_PUBLIC_API_ENABLE
296