xref: /aosp_15_r20/external/openthread/src/cli/cli_link_metrics.hpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1  /*
2   *  Copyright (c) 2023, 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 the CLI interpreter for Link Metrics function.
32   */
33  
34  #ifndef CLI_LINK_METRICS_HPP_
35  #define CLI_LINK_METRICS_HPP_
36  
37  #include "openthread-core-config.h"
38  
39  #include <openthread/link_metrics.h>
40  
41  #include "cli/cli_utils.hpp"
42  
43  #if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
44  
45  namespace ot {
46  namespace Cli {
47  
48  /**
49   * Implements the Link Metrics CLI interpreter.
50   *
51   */
52  
53  class LinkMetrics : private Utils
54  {
55  public:
56      /**
57       * Constructor
58       *
59       * @param[in]  aInstance            The OpenThread Instance.
60       * @param[in]  aOutputImplementer   An `OutputImplementer`.
61       *
62       */
63      LinkMetrics(otInstance *aInstance, OutputImplementer &aOutputImplementer);
64  
65      /**
66       * Processes a CLI sub-command.
67       *
68       * @param[in]  aArgs     An array of command line arguments.
69       *
70       * @retval OT_ERROR_NONE              Successfully executed the CLI command.
71       * @retval OT_ERROR_PENDING           The CLI command was successfully started but final result is pending.
72       * @retval OT_ERROR_INVALID_COMMAND   Invalid or unknown CLI command.
73       * @retval OT_ERROR_INVALID_ARGS      Invalid arguments.
74       * @retval ...                        Error during execution of the CLI command.
75       *
76       */
77      otError Process(Arg aArgs[]);
78  
79  private:
80      static constexpr uint8_t kIndentSize = 4;
81  
82      using Command = CommandEntry<LinkMetrics>;
83  
84      template <CommandId kCommandId> otError Process(Arg aArgs[]);
85  
86      otError ParseLinkMetricsFlags(otLinkMetrics &aLinkMetrics, const Arg &aFlags);
87  
88      void PrintLinkMetricsValue(const otLinkMetricsValues *aMetricsValues);
89  
90      static void HandleLinkMetricsReport(const otIp6Address        *aAddress,
91                                          const otLinkMetricsValues *aMetricsValues,
92                                          otLinkMetricsStatus        aStatus,
93                                          void                      *aContext);
94  
95      void HandleLinkMetricsReport(const otIp6Address        *aAddress,
96                                   const otLinkMetricsValues *aMetricsValues,
97                                   otLinkMetricsStatus        aStatus);
98  
99      static void HandleLinkMetricsConfigForwardTrackingSeriesMgmtResponse(const otIp6Address *aAddress,
100                                                                           otLinkMetricsStatus aStatus,
101                                                                           void               *aContext);
102      void        HandleLinkMetricsConfigForwardTrackingSeriesMgmtResponse(const otIp6Address *aAddress,
103                                                                           otLinkMetricsStatus aStatus);
104      static void HandleLinkMetricsConfigEnhAckProbingMgmtResponse(const otIp6Address *aAddress,
105                                                                   otLinkMetricsStatus aStatus,
106                                                                   void               *aContext);
107      void HandleLinkMetricsConfigEnhAckProbingMgmtResponse(const otIp6Address *aAddress, otLinkMetricsStatus aStatus);
108      void HandleLinkMetricsMgmtResponse(const otIp6Address *aAddress, otLinkMetricsStatus aStatus);
109  
110      static void HandleLinkMetricsEnhAckProbingIe(otShortAddress             aShortAddress,
111                                                   const otExtAddress        *aExtAddress,
112                                                   const otLinkMetricsValues *aMetricsValues,
113                                                   void                      *aContext);
114  
115      void HandleLinkMetricsEnhAckProbingIe(otShortAddress             aShortAddress,
116                                            const otExtAddress        *aExtAddress,
117                                            const otLinkMetricsValues *aMetricsValues);
118  
119      const char *LinkMetricsStatusToStr(otLinkMetricsStatus aStatus);
120  
121      void OutputResult(otError aError);
122  
123      bool mQuerySync : 1;
124      bool mConfigForwardTrackingSeriesSync : 1;
125      bool mConfigEnhAckProbingSync : 1;
126  };
127  
128  } // namespace Cli
129  } // namespace ot
130  
131  #endif // OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
132  
133  #endif // CLI_LINK_METRICS_HPP_
134