| /* |
| * Copyright (c) 2020, The OpenThread Authors. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * 3. Neither the name of the copyright holder nor the |
| * names of its contributors may be used to endorse or promote products |
| * derived from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| /** |
| * @file |
| * This file includes definitions for Thread helper. |
| */ |
| |
| #ifndef OTBR_THREAD_HELPER_HPP_ |
| #define OTBR_THREAD_HELPER_HPP_ |
| |
| #include <chrono> |
| #include <functional> |
| #include <map> |
| #include <random> |
| #include <string> |
| #include <vector> |
| |
| #include <openthread/instance.h> |
| #include <openthread/ip6.h> |
| #include <openthread/jam_detection.h> |
| #include <openthread/joiner.h> |
| #include <openthread/netdata.h> |
| #include <openthread/thread.h> |
| |
| namespace otbr { |
| namespace Ncp { |
| class ControllerOpenThread; |
| } |
| } // namespace otbr |
| |
| namespace otbr { |
| namespace agent { |
| |
| /** |
| * This class implements Thread helper. |
| */ |
| class ThreadHelper |
| { |
| public: |
| using DeviceRoleHandler = std::function<void(otDeviceRole)>; |
| using ScanHandler = std::function<void(otError, const std::vector<otActiveScanResult> &)>; |
| using ResultHandler = std::function<void(otError)>; |
| using UpdateMeshCopTxtHandler = std::function<void(std::map<std::string, std::vector<uint8_t>>)>; |
| |
| /** |
| * The constructor of a Thread helper. |
| * |
| * @param[in] aInstance The Thread instance. |
| * @param[in] aNcp The ncp controller. |
| * |
| */ |
| ThreadHelper(otInstance *aInstance, otbr::Ncp::ControllerOpenThread *aNcp); |
| |
| /** |
| * This method adds a callback for device role change. |
| * |
| * @param[in] aHandler The device role handler. |
| * |
| */ |
| void AddDeviceRoleHandler(DeviceRoleHandler aHandler); |
| |
| /** |
| * This method permits unsecure join on port. |
| * |
| * @param[in] aPort The port number. |
| * @param[in] aSeconds The timeout to close the port, 0 for never close. |
| * |
| * @returns The error value of underlying OpenThread api calls. |
| * |
| */ |
| otError PermitUnsecureJoin(uint16_t aPort, uint32_t aSeconds); |
| |
| /** |
| * This method performs a Thread network scan. |
| * |
| * @param[in] aHandler The scan result handler. |
| * |
| */ |
| void Scan(ScanHandler aHandler); |
| |
| /** |
| * This method attaches the device to the Thread network. |
| * |
| * @note The joiner start and the attach proccesses are exclusive |
| * |
| * @param[in] aNetworkName The network name. |
| * @param[in] aPanId The pan id, UINT16_MAX for random. |
| * @param[in] aExtPanId The extended pan id, UINT64_MAX for random. |
| * @param[in] aNetworkKey The network key, empty for random. |
| * @param[in] aPSKc The pre-shared commissioner key, empty for random. |
| * @param[in] aChannelMask A bitmask for valid channels, will random select one. |
| * @param[in] aHandler The attach result handler. |
| * |
| */ |
| void Attach(const std::string & aNetworkName, |
| uint16_t aPanId, |
| uint64_t aExtPanId, |
| const std::vector<uint8_t> &aNetworkKey, |
| const std::vector<uint8_t> &aPSKc, |
| uint32_t aChannelMask, |
| ResultHandler aHandler); |
| |
| /** |
| * This method detaches the device from the Thread network. |
| * |
| * @returns The error value of underlying OpenThread API calls. |
| * |
| */ |
| otError Detach(void); |
| |
| /** |
| * This method attaches the device to the Thread network. |
| * |
| * @note The joiner start and the attach proccesses are exclusive, and the |
| * network parameter will be set through the active dataset. |
| * |
| * @param[in] aHandler The attach result handler. |
| * |
| */ |
| void Attach(ResultHandler aHandler); |
| |
| /** |
| * This method makes all nodes in the current network attach to the network specified by the dataset TLVs. |
| * |
| * @param[in] aDatasetTlvs The dataset TLVs. |
| * @param[in] aHandler The result handler. |
| * |
| */ |
| void AttachAllNodesTo(const std::vector<uint8_t> &aDatasetTlvs, ResultHandler aHandler); |
| |
| /** |
| * This method resets the OpenThread stack. |
| * |
| * @returns The error value of underlying OpenThread api calls. |
| * |
| */ |
| otError Reset(void); |
| |
| /** |
| * This method triggers a thread join process. |
| * |
| * @note The joiner start and the attach proccesses are exclusive |
| * |
| * @param[in] aPskd The pre-shared key for device. |
| * @param[in] aProvisioningUrl The provision url. |
| * @param[in] aVendorName The vendor name. |
| * @param[in] aVendorModel The vendor model. |
| * @param[in] aVendorSwVersion The vendor software version. |
| * @param[in] aVendorData The vendor custom data. |
| * @param[in] aHandler The join result handler. |
| * |
| */ |
| void JoinerStart(const std::string &aPskd, |
| const std::string &aProvisioningUrl, |
| const std::string &aVendorName, |
| const std::string &aVendorModel, |
| const std::string &aVendorSwVersion, |
| const std::string &aVendorData, |
| ResultHandler aHandler); |
| |
| /** |
| * This method tries to restore the network after reboot |
| * |
| * @returns The error value of underlying OpenThread api calls. |
| * |
| */ |
| otError TryResumeNetwork(void); |
| |
| /** |
| * This method returns the underlying OpenThread instance. |
| * |
| * @returns The underlying instance. |
| * |
| */ |
| otInstance *GetInstance(void) { return mInstance; } |
| |
| /** |
| * This method handles OpenThread state changed notification. |
| * |
| * @param[in] aFlags A bit-field indicating specific state that has changed. See `OT_CHANGED_*` definitions. |
| * |
| */ |
| void StateChangedCallback(otChangedFlags aFlags); |
| |
| #if OTBR_ENABLE_DBUS_SERVER |
| /** |
| * This method sets a callback for calls of UpdateVendorMeshCopTxtEntries D-Bus API. |
| * |
| * @param[in] aHandler The handler on MeshCoP TXT changes. |
| * |
| */ |
| void SetUpdateMeshCopTxtHandler(UpdateMeshCopTxtHandler aHandler) |
| { |
| mUpdateMeshCopTxtHandler = std::move(aHandler); |
| } |
| |
| /** |
| * This method handles MeshCoP TXT updates done by UpdateVendorMeshCopTxtEntries D-Bus API. |
| * |
| * @param[in] aUpdate The key-value pairs to be updated in the TXT record. |
| * |
| */ |
| void OnUpdateMeshCopTxt(std::map<std::string, std::vector<uint8_t>> aUpdate) |
| { |
| if (mUpdateMeshCopTxtHandler) |
| { |
| mUpdateMeshCopTxtHandler(std::move(aUpdate)); |
| } |
| } |
| #endif |
| |
| /** |
| * This method logs OpenThread action result. |
| * |
| * @param[in] aAction The action OpenThread performs. |
| * @param[in] aError The action result. |
| * |
| */ |
| static void LogOpenThreadResult(const char *aAction, otError aError); |
| |
| private: |
| static void ActiveScanHandler(otActiveScanResult *aResult, void *aThreadHelper); |
| void ActiveScanHandler(otActiveScanResult *aResult); |
| |
| static void JoinerCallback(otError aError, void *aThreadHelper); |
| void JoinerCallback(otError aResult); |
| |
| static void MgmtSetResponseHandler(otError aResult, void *aContext); |
| void MgmtSetResponseHandler(otError aResult); |
| |
| void RandomFill(void *aBuf, size_t size); |
| uint8_t RandomChannelFromChannelMask(uint32_t aChannelMask); |
| |
| otInstance *mInstance; |
| |
| otbr::Ncp::ControllerOpenThread *mNcp; |
| |
| ScanHandler mScanHandler; |
| std::vector<otActiveScanResult> mScanResults; |
| |
| std::vector<DeviceRoleHandler> mDeviceRoleHandlers; |
| |
| std::map<uint16_t, size_t> mUnsecurePortRefCounter; |
| |
| ResultHandler mAttachHandler; |
| ResultHandler mJoinerHandler; |
| |
| std::random_device mRandomDevice; |
| |
| #if OTBR_ENABLE_DBUS_SERVER |
| UpdateMeshCopTxtHandler mUpdateMeshCopTxtHandler; |
| #endif |
| }; |
| |
| } // namespace agent |
| } // namespace otbr |
| |
| #endif // OTBR_THREAD_HELPER_HPP_ |