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 wraps the calls to platform OTNS abstractions. 32 */ 33 34 #ifndef UTILS_OTNS_HPP_ 35 #define UTILS_OTNS_HPP_ 36 37 #include "openthread-core-config.h" 38 39 #if (OPENTHREAD_MTD || OPENTHREAD_FTD) && OPENTHREAD_CONFIG_OTNS_ENABLE 40 41 #include <openthread/thread.h> 42 #include <openthread/thread_ftd.h> 43 #include <openthread/platform/otns.h> 44 45 #include "coap/coap_message.hpp" 46 #include "common/locator.hpp" 47 #include "common/non_copyable.hpp" 48 #include "common/notifier.hpp" 49 #include "mac/mac_frame.hpp" 50 #include "mac/mac_types.hpp" 51 #include "net/ip6_address.hpp" 52 #include "thread/neighbor.hpp" 53 #include "thread/neighbor_table.hpp" 54 55 namespace ot { 56 namespace Utils { 57 58 /** 59 * Implements the OTNS Stub that interacts with OTNS. 60 * 61 */ 62 class Otns : public InstanceLocator, private NonCopyable 63 { 64 friend class ot::Notifier; 65 66 public: 67 /** 68 * Initializes the object. 69 * 70 * @param[in] aInstance A reference to the OpenThread instance. 71 * 72 */ Otns(Instance & aInstance)73 explicit Otns(Instance &aInstance) 74 : InstanceLocator(aInstance) 75 { 76 } 77 78 /** 79 * Emits radio short address to OTNS when changed. 80 * 81 * @param[in] aShortAddress The new short address. 82 * 83 */ 84 static void EmitShortAddress(uint16_t aShortAddress); 85 86 /** 87 * Emits radio extended address to OTNS when changed. 88 * 89 * @param[in] aExtAddress The new extended address. 90 * 91 */ 92 static void EmitExtendedAddress(const Mac::ExtAddress &aExtAddress); 93 94 /** 95 * Emits ping request information to OTNS when sending. 96 * 97 * @param[in] aPeerAddress The peer address of the ping request. 98 * @param[in] aPingLength The data length of the ping request. 99 * @param[in] aTimestamp The timestamp of the ping request. 100 * @param[in] aHopLimit The hop limit of the ping request. 101 * 102 */ 103 static void EmitPingRequest(const Ip6::Address &aPeerAddress, 104 uint16_t aPingLength, 105 uint32_t aTimestamp, 106 uint8_t aHopLimit); 107 108 /** 109 * Emits ping reply information to OTNS when received. 110 * 111 * @param[in] aPeerAddress The peer address of the ping request. 112 * @param[in] aPingLength The data length of the ping reply. 113 * @param[in] aTimestamp The timestamp of the ping reply. 114 * @param[in] aHopLimit The hop limit of the ping reply. 115 * 116 */ 117 static void EmitPingReply(const Ip6::Address &aPeerAddress, 118 uint16_t aPingLength, 119 uint32_t aTimestamp, 120 uint8_t aHopLimit); 121 122 /** 123 * Emits a neighbor table event to OTNS when a neighbor is added or removed. 124 * 125 * @param[in] aEvent The event type. 126 * @param[in] aNeighbor The neighbor that is added or removed. 127 * 128 */ 129 static void EmitNeighborChange(NeighborTable::Event aEvent, const Neighbor &aNeighbor); 130 131 /** 132 * Emits a transmit event to OTNS. 133 * 134 * @param[in] aFrame The frame of the transmission. 135 * 136 */ 137 static void EmitTransmit(const Mac::TxFrame &aFrame); 138 139 /** 140 * Emits the device mode to OTNS. 141 * 142 * @param[in] aMode The device mode. 143 * 144 */ 145 static void EmitDeviceMode(Mle::DeviceMode aMode); 146 147 /** 148 * Emits the sending COAP message info to OTNS. 149 * 150 * @param[in] aMessage The sending COAP message. 151 * @param[in] aMessageInfo The message info. 152 * 153 */ 154 static void EmitCoapSend(const Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo); 155 156 /** 157 * Emits the COAP message sending failure to OTNS. 158 * 159 * @param[in] aError The error in sending the COAP message. 160 * @param[in] aMessage The COAP message failed to send. 161 * @param[in] aMessageInfo The message info. 162 * 163 */ 164 static void EmitCoapSendFailure(Error aError, Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo); 165 166 /** 167 * Emits the received COAP message info to OTNS. 168 * 169 * @param[in] aMessage The received COAP message. 170 * @param[in] aMessageInfo The message info. 171 * 172 */ 173 static void EmitCoapReceive(const Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo); 174 175 private: 176 static void EmitStatus(const char *aFmt, ...); 177 void HandleNotifierEvents(Events aEvents); 178 }; 179 180 } // namespace Utils 181 } // namespace ot 182 183 #endif //(OPENTHREAD_MTD || OPENTHREAD_FTD) && OPENTHREAD_CONFIG_OTNS_ENABLE 184 185 #endif // UTILS_OTNS_HPP_ 186