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