1 /*
2 * Copyright (c) 2020, 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 Link Metrics API.
32 */
33
34 #include "openthread-core-config.h"
35
36 #if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE || OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
37
38 #include <openthread/link_metrics.h>
39
40 #include "common/instance.hpp"
41 #include "net/ip6_address.hpp"
42
43 using namespace ot;
44
otLinkMetricsQuery(otInstance * aInstance,const otIp6Address * aDestination,uint8_t aSeriesId,const otLinkMetrics * aLinkMetricsFlags,otLinkMetricsReportCallback aCallback,void * aCallbackContext)45 otError otLinkMetricsQuery(otInstance * aInstance,
46 const otIp6Address * aDestination,
47 uint8_t aSeriesId,
48 const otLinkMetrics * aLinkMetricsFlags,
49 otLinkMetricsReportCallback aCallback,
50 void * aCallbackContext)
51 {
52 OT_ASSERT(aDestination != nullptr);
53
54 static_cast<Instance *>(aInstance)->Get<LinkMetrics::LinkMetrics>().SetReportCallback(aCallback, aCallbackContext);
55
56 return static_cast<Instance *>(aInstance)->Get<LinkMetrics::LinkMetrics>().Query(
57 static_cast<const Ip6::Address &>(*aDestination), aSeriesId,
58 static_cast<const LinkMetrics::Metrics *>(aLinkMetricsFlags));
59 }
60
otLinkMetricsConfigForwardTrackingSeries(otInstance * aInstance,const otIp6Address * aDestination,uint8_t aSeriesId,const otLinkMetricsSeriesFlags aSeriesFlags,const otLinkMetrics * aLinkMetricsFlags,otLinkMetricsMgmtResponseCallback aCallback,void * aCallbackContext)61 otError otLinkMetricsConfigForwardTrackingSeries(otInstance * aInstance,
62 const otIp6Address * aDestination,
63 uint8_t aSeriesId,
64 const otLinkMetricsSeriesFlags aSeriesFlags,
65 const otLinkMetrics * aLinkMetricsFlags,
66 otLinkMetricsMgmtResponseCallback aCallback,
67 void * aCallbackContext)
68 {
69 OT_ASSERT(aDestination != nullptr);
70
71 LinkMetrics::LinkMetrics &linkMetrics = static_cast<Instance *>(aInstance)->Get<LinkMetrics::LinkMetrics>();
72
73 linkMetrics.SetMgmtResponseCallback(aCallback, aCallbackContext);
74
75 return linkMetrics.SendMgmtRequestForwardTrackingSeries(
76 static_cast<const Ip6::Address &>(*aDestination), aSeriesId, aSeriesFlags,
77 static_cast<const LinkMetrics::Metrics *>(aLinkMetricsFlags));
78 }
79
80 #if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
otLinkMetricsConfigEnhAckProbing(otInstance * aInstance,const otIp6Address * aDestination,otLinkMetricsEnhAckFlags aEnhAckFlags,const otLinkMetrics * aLinkMetricsFlags,otLinkMetricsMgmtResponseCallback aCallback,void * aCallbackContext,otLinkMetricsEnhAckProbingIeReportCallback aEnhAckCallback,void * aEnhAckCallbackContext)81 otError otLinkMetricsConfigEnhAckProbing(otInstance * aInstance,
82 const otIp6Address * aDestination,
83 otLinkMetricsEnhAckFlags aEnhAckFlags,
84 const otLinkMetrics * aLinkMetricsFlags,
85 otLinkMetricsMgmtResponseCallback aCallback,
86 void * aCallbackContext,
87 otLinkMetricsEnhAckProbingIeReportCallback aEnhAckCallback,
88 void * aEnhAckCallbackContext)
89 {
90 OT_ASSERT(aDestination != nullptr);
91
92 LinkMetrics::LinkMetrics &linkMetrics = static_cast<Instance *>(aInstance)->Get<LinkMetrics::LinkMetrics>();
93
94 linkMetrics.SetMgmtResponseCallback(aCallback, aCallbackContext);
95 linkMetrics.SetEnhAckProbingCallback(aEnhAckCallback, aEnhAckCallbackContext);
96
97 return linkMetrics.SendMgmtRequestEnhAckProbing(static_cast<const Ip6::Address &>(*aDestination),
98 static_cast<LinkMetrics::EnhAckFlags>(aEnhAckFlags),
99 static_cast<const LinkMetrics::Metrics *>(aLinkMetricsFlags));
100 }
101
otLinkMetricsSendLinkProbe(otInstance * aInstance,const otIp6Address * aDestination,uint8_t aSeriesId,uint8_t aLength)102 otError otLinkMetricsSendLinkProbe(otInstance * aInstance,
103 const otIp6Address *aDestination,
104 uint8_t aSeriesId,
105 uint8_t aLength)
106 {
107 OT_ASSERT(aDestination != nullptr);
108 LinkMetrics::LinkMetrics &linkMetrics = static_cast<Instance *>(aInstance)->Get<LinkMetrics::LinkMetrics>();
109
110 return linkMetrics.SendLinkProbe(static_cast<const Ip6::Address &>(*aDestination), aSeriesId, aLength);
111 }
112 #endif
113
114 #endif // OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE || OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
115