| /* |
| * |
| * Copyright (c) 2020 Project CHIP Authors |
| * Copyright (c) 2019 Nest Labs, Inc. |
| * All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** |
| * @file |
| * Provides a generic implementation of ThreadStackManager features |
| * for use on platforms that use OpenThread. |
| */ |
| |
| #pragma once |
| |
| #include <openthread/instance.h> |
| |
| namespace chip { |
| namespace DeviceLayer { |
| |
| class ThreadStackManagerImpl; |
| |
| namespace Internal { |
| |
| class DeviceNetworkInfo; |
| |
| /** |
| * Provides a generic implementation of ThreadStackManager features that works in conjunction |
| * with OpenThread. |
| * |
| * This class contains implementations of select features from the ThreadStackManager abstract |
| * interface that are suitable for use on devices that employ OpenThread. It is intended to |
| * be inherited, directly or indirectly, by the ThreadStackManagerImpl class, which also appears |
| * as the template's ImplClass parameter. |
| * |
| * The class is designed to be independent of the choice of host OS (e.g. RTOS or posix) and |
| * network stack (e.g. LwIP or other IP stack). |
| */ |
| template <class ImplClass> |
| class GenericThreadStackManagerImpl_OpenThread |
| { |
| public: |
| // ===== Platform-specific methods directly callable by the application. |
| |
| otInstance * OTInstance() const; |
| static void OnOpenThreadStateChange(uint32_t flags, void * context); |
| |
| protected: |
| // ===== Methods that implement the ThreadStackManager abstract interface. |
| |
| void _ProcessThreadActivity(void); |
| bool _HaveRouteToAddress(const Inet::IPAddress & destAddr); |
| void _OnPlatformEvent(const ChipDeviceEvent * event); |
| bool _IsThreadEnabled(void); |
| CHIP_ERROR _SetThreadEnabled(bool val); |
| bool _IsThreadProvisioned(void); |
| bool _IsThreadAttached(void); |
| CHIP_ERROR _GetThreadProvision(DeviceNetworkInfo & netInfo, bool includeCredentials); |
| CHIP_ERROR _SetThreadProvision(const DeviceNetworkInfo & netInfo); |
| void _ErasePersistentInfo(void); |
| ConnectivityManager::ThreadDeviceType _GetThreadDeviceType(void); |
| CHIP_ERROR _SetThreadDeviceType(ConnectivityManager::ThreadDeviceType deviceType); |
| void _GetThreadPollingConfig(ConnectivityManager::ThreadPollingConfig & pollingConfig); |
| CHIP_ERROR _SetThreadPollingConfig(const ConnectivityManager::ThreadPollingConfig & pollingConfig); |
| bool _HaveMeshConnectivity(void); |
| void _OnMessageLayerActivityChanged(bool messageLayerIsActive); |
| CHIP_ERROR _GetAndLogThreadStatsCounters(void); |
| CHIP_ERROR _GetAndLogThreadTopologyMinimal(void); |
| CHIP_ERROR _GetAndLogThreadTopologyFull(void); |
| CHIP_ERROR _GetPrimary802154MACAddress(uint8_t * buf); |
| void _OnWoBLEAdvertisingStart(void); |
| void _OnWoBLEAdvertisingStop(void); |
| |
| // ===== Members available to the implementation subclass. |
| |
| CHIP_ERROR DoInit(otInstance * otInst); |
| bool IsThreadAttachedNoLock(void); |
| bool IsThreadInterfaceUpNoLock(void); |
| CHIP_ERROR AdjustPollingInterval(void); |
| |
| CHIP_ERROR _JoinerStart(void); |
| |
| private: |
| // ===== Private members for use by this class only. |
| |
| otInstance * mOTInst; |
| ConnectivityManager::ThreadPollingConfig mPollingConfig; |
| |
| static void OnJoinerComplete(otError aError, void * aContext); |
| void OnJoinerComplete(otError aError); |
| |
| inline ImplClass * Impl() { return static_cast<ImplClass *>(this); } |
| }; |
| |
| // Instruct the compiler to instantiate the template only when explicitly told to do so. |
| extern template class GenericThreadStackManagerImpl_OpenThread<ThreadStackManagerImpl>; |
| |
| /** |
| * Returns the underlying OpenThread instance object. |
| */ |
| template <class ImplClass> |
| inline otInstance * GenericThreadStackManagerImpl_OpenThread<ImplClass>::OTInstance() const |
| { |
| return mOTInst; |
| } |
| |
| template <class ImplClass> |
| inline void GenericThreadStackManagerImpl_OpenThread<ImplClass>::_OnWoBLEAdvertisingStart(void) |
| { |
| // Do nothing by default. |
| } |
| |
| template <class ImplClass> |
| inline void GenericThreadStackManagerImpl_OpenThread<ImplClass>::_OnWoBLEAdvertisingStop(void) |
| { |
| // Do nothing by default. |
| } |
| |
| } // namespace Internal |
| } // namespace DeviceLayer |
| } // namespace chip |