xref: /aosp_15_r20/external/openthread/src/cli/cli_mdns.hpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
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 contains definitions for CLI to DNS (client and resolver).
32   */
33  
34  #ifndef CLI_MDNS_HPP_
35  #define CLI_MDNS_HPP_
36  
37  #include "openthread-core-config.h"
38  
39  #include <openthread/mdns.h>
40  
41  #include "cli/cli_config.h"
42  #include "cli/cli_utils.hpp"
43  
44  #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE && OPENTHREAD_CONFIG_MULTICAST_DNS_PUBLIC_API_ENABLE
45  
46  namespace ot {
47  namespace Cli {
48  
49  /**
50   * Implements the mDNS CLI interpreter.
51   *
52   */
53  class Mdns : private Utils
54  {
55  public:
56      /**
57       * Constructor.
58       *
59       * @param[in]  aInstance            The OpenThread Instance.
60       * @param[in]  aOutputImplementer   An `OutputImplementer`.
61       *
62       */
Mdns(otInstance * aInstance,OutputImplementer & aOutputImplementer)63      Mdns(otInstance *aInstance, OutputImplementer &aOutputImplementer)
64          : Utils(aInstance, aOutputImplementer)
65          , mInfraIfIndex(0)
66          , mRequestId(0)
67          , mWaitingForCallback(false)
68      {
69      }
70  
71      /**
72       * Processes a CLI sub-command.
73       *
74       * @param[in]  aArgs     An array of command line arguments.
75       *
76       * @retval OT_ERROR_NONE              Successfully executed the CLI command.
77       * @retval OT_ERROR_PENDING           The CLI command was successfully started but final result is pending.
78       * @retval OT_ERROR_INVALID_COMMAND   Invalid or unknown CLI command.
79       * @retval OT_ERROR_INVALID_ARGS      Invalid arguments.
80       * @retval ...                        Error during execution of the CLI command.
81       *
82       */
83      otError Process(Arg aArgs[]);
84  
85  private:
86      using Command = CommandEntry<Mdns>;
87  
88      static constexpr uint8_t  kIndentSize     = 4;
89      static constexpr uint16_t kMaxAddresses   = 16;
90      static constexpr uint16_t kStringSize     = 400;
91      static constexpr uint16_t kMaxSubTypes    = 8;
92      static constexpr uint16_t kMaxTxtDataSize = 200;
93      static constexpr uint16_t kMaxKeyDataSize = 200;
94  
95      enum IpAddressType : uint8_t
96      {
97          kIp6Address,
98          kIp4Address,
99      };
100  
101      struct Buffers // Used to populate `otMdnsService` field
102      {
103          char        mString[kStringSize];
104          const char *mSubTypeLabels[kMaxSubTypes];
105          uint8_t     mTxtData[kMaxTxtDataSize];
106      };
107  
108      template <CommandId kCommandId> otError Process(Arg aArgs[]);
109  
110      void    OutputHost(const otMdnsHost &aHost);
111      void    OutputService(const otMdnsService &aService);
112      void    OutputKey(const otMdnsKey &aKey);
113      void    OutputState(otMdnsEntryState aState);
114      void    OutputCacheInfo(const otMdnsCacheInfo &aInfo);
115      otError ProcessRegisterHost(Arg aArgs[]);
116      otError ProcessRegisterService(Arg aArgs[]);
117      otError ProcessRegisterKey(Arg aArgs[]);
118      void    HandleRegisterationDone(otMdnsRequestId aRequestId, otError aError);
119      void    HandleBrowseResult(const otMdnsBrowseResult &aResult);
120      void    HandleSrvResult(const otMdnsSrvResult &aResult);
121      void    HandleTxtResult(const otMdnsTxtResult &aResult);
122      void    HandleAddressResult(const otMdnsAddressResult &aResult, IpAddressType aType);
123  
124      static otError ParseStartOrStop(const Arg &aArg, bool &aIsStart);
125      static void    HandleRegisterationDone(otInstance *aInstance, otMdnsRequestId aRequestId, otError aError);
126      static void    HandleBrowseResult(otInstance *aInstance, const otMdnsBrowseResult *aResult);
127      static void    HandleSrvResult(otInstance *aInstance, const otMdnsSrvResult *aResult);
128      static void    HandleTxtResult(otInstance *aInstance, const otMdnsTxtResult *aResult);
129      static void    HandleIp6AddressResult(otInstance *aInstance, const otMdnsAddressResult *aResult);
130      static void    HandleIp4AddressResult(otInstance *aInstance, const otMdnsAddressResult *aResult);
131  
132      static otError ParseServiceArgs(Arg aArgs[], otMdnsService &aService, Buffers &aBuffers);
133  
134      uint32_t        mInfraIfIndex;
135      otMdnsRequestId mRequestId;
136      bool            mWaitingForCallback;
137  };
138  
139  } // namespace Cli
140  } // namespace ot
141  
142  #endif // OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE && OPENTHREAD_CONFIG_MULTICAST_DNS_PUBLIC_API_ENABLE
143  
144  #endif // CLI_MDNS_HPP_
145