xref: /aosp_15_r20/external/ot-br-posix/src/common/dns_utils.hpp (revision 4a64e381480ef79f0532b2421e44e6ee336b8e0d)
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 #ifndef OTBR_COMMON_DNS_UTILS_HPP_
34 #define OTBR_COMMON_DNS_UTILS_HPP_
35 
36 #include "openthread-br/config.h"
37 
38 #include "common/types.hpp"
39 
40 /**
41  * This structure represents DNS Name information.
42  *
43  * @sa SplitFullDnsName
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      */
IsServiceInstanceDnsNameInfo57     bool IsServiceInstance(void) const { return !mInstanceName.empty(); };
58 
59     /**
60      * This method returns if the DNS name is a service.
61      *
62      * @returns Whether the DNS name is a service.
63      */
IsServiceDnsNameInfo64     bool IsService(void) const { return !mServiceName.empty() && mInstanceName.empty(); }
65 
66     /**
67      * This method returns if the DNS name is a host.
68      *
69      * @returns Whether the DNS name is a host.
70      */
IsHostDnsNameInfo71     bool IsHost(void) const { return mServiceName.empty(); }
72 };
73 
74 /**
75  * This method splits a full DNS name into name components.
76  *
77  * @param[in] aName  The full DNS name to dissect.
78  *
79  * @returns A `DnsNameInfo` structure containing DNS name information.
80  *
81  * @sa DnsNameInfo
82  */
83 DnsNameInfo SplitFullDnsName(const std::string &aName);
84 
85 /**
86  * This function splits a full service name into components.
87  *
88  * @param[in]  aFullName  The full service name to split.
89  * @param[out] aType      A reference to a string to receive the service type.
90  * @param[out] aDomain    A reference to a string to receive the domain.
91  *
92  * @retval OTBR_ERROR_NONE          Successfully split the full service name.
93  * @retval OTBR_ERROR_INVALID_ARGS  If the full service name is not valid.
94  */
95 otbrError SplitFullServiceName(const std::string &aFullName, std::string &aType, std::string &aDomain);
96 
97 /**
98  * This function splits a full service instance name into components.
99  *
100  * @param[in]  aFullName      The full service instance name to split.
101  * @param[out] aInstanceName  A reference to a string to receive the instance name.
102  * @param[out] aType          A reference to a string to receive the service type.
103  * @param[out] aDomain        A reference to a string to receive the domain.
104  *
105  * @retval OTBR_ERROR_NONE          Successfully split the full service instance name.
106  * @retval OTBR_ERROR_INVALID_ARGS  If the full service instance name is not valid.
107  */
108 otbrError SplitFullServiceInstanceName(const std::string &aFullName,
109                                        std::string       &aInstanceName,
110                                        std::string       &aType,
111                                        std::string       &aDomain);
112 
113 /**
114  * This function splits a full host name into components.
115  *
116  * @param[in]  aFullName  The full host name to split.
117  * @param[out] aHostName  A reference to a string to receive the host name.
118  * @param[out] aDomain    A reference to a string to receive the domain.
119  *
120  * @retval OTBR_ERROR_NONE          Successfully split the full host name.
121  * @retval OTBR_ERROR_INVALID_ARGS  If the full host name is not valid.
122  */
123 otbrError SplitFullHostName(const std::string &aFullName, std::string &aHostName, std::string &aDomain);
124 
125 #endif // OTBR_COMMON_DNS_UTILS_HPP_
126