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