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