• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *    Copyright (c) 2021, 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 includes DNS utilities.
32  *
33  */
34 #ifndef OTBR_COMMON_DNS_UTILS_HPP_
35 #define OTBR_COMMON_DNS_UTILS_HPP_
36 
37 #include "common/types.hpp"
38 
39 /**
40  * This structure represents DNS Name information.
41  *
42  * @sa SplitFullDnsName
43  *
44  */
45 struct DnsNameInfo
46 {
47     std::string mInstanceName; ///< Instance name, or empty if the DNS name is not a service instance.
48     std::string mServiceName;  ///< Service name, or empty if the DNS name is not a service or service instance.
49     std::string mHostName;     ///< Host name, or empty if the DNS name is not a host name.
50     std::string mDomain;       ///< Domain name.
51 
52     /**
53      * This method returns if the DNS name is a service instance.
54      *
55      * @returns Whether the DNS name is a service instance.
56      *
57      */
IsServiceInstanceDnsNameInfo58     bool IsServiceInstance(void) const { return !mInstanceName.empty(); };
59 
60     /**
61      * This method returns if the DNS name is a service.
62      *
63      * @returns Whether the DNS name is a service.
64      *
65      */
IsServiceDnsNameInfo66     bool IsService(void) const { return !mServiceName.empty() && mInstanceName.empty(); }
67 
68     /**
69      * This method returns if the DNS name is a host.
70      *
71      * @returns Whether the DNS name is a host.
72      *
73      */
IsHostDnsNameInfo74     bool IsHost(void) const { return mServiceName.empty(); }
75 };
76 
77 /**
78  * This method splits a full DNS name into name components.
79  *
80  * @param[in] aName  The full DNS name to dissect.
81  *
82  * @returns A `DnsNameInfo` structure containing DNS name information.
83  *
84  * @sa DnsNameInfo
85  *
86  */
87 DnsNameInfo SplitFullDnsName(const std::string &aName);
88 
89 /**
90  * This function splits a full service name into components.
91  *
92  * @param[in]  aFullName  The full service name to split.
93  * @param[out] aType      A reference to a string to receive the service type.
94  * @param[out] aDomain    A reference to a string to receive the domain.
95  *
96  * @retval OTBR_ERROR_NONE          Successfully split the full service name.
97  * @retval OTBR_ERROR_INVALID_ARGS  If the full service name is not valid.
98  *
99  */
100 otbrError SplitFullServiceName(const std::string &aFullName, std::string &aType, std::string &aDomain);
101 
102 /**
103  * This function splits a full service instance name into components.
104  *
105  * @param[in]  aFullName      The full service instance name to split.
106  * @param[out] aInstanceName  A reference to a string to receive the instance name.
107  * @param[out] aType          A reference to a string to receive the service type.
108  * @param[out] aDomain        A reference to a string to receive the domain.
109  *
110  * @retval OTBR_ERROR_NONE          Successfully split the full service instance name.
111  * @retval OTBR_ERROR_INVALID_ARGS  If the full service instance name is not valid.
112  *
113  */
114 otbrError SplitFullServiceInstanceName(const std::string &aFullName,
115                                        std::string &      aInstanceName,
116                                        std::string &      aType,
117                                        std::string &      aDomain);
118 
119 /**
120  * This function splits a full host name into components.
121  *
122  * @param[in]  aFullName  The full host name to split.
123  * @param[out] aHostName  A reference to a string to receive the host name.
124  * @param[out] aDomain    A reference to a string to receive the domain.
125  *
126  * @retval OTBR_ERROR_NONE          Successfully split the full host name.
127  * @retval OTBR_ERROR_INVALID_ARGS  If the full host name is not valid.
128  *
129  */
130 otbrError SplitFullHostName(const std::string &aFullName, std::string &aHostName, std::string &aDomain);
131 
132 #endif // OTBR_COMMON_DNS_UTILS_HPP_
133