3 * Copyright (c) 2020-2021 Project CHIP Authors
4 * Copyright (c) 2018 Nest Labs, Inc.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <platform/ConnectivityManager.h>
23 #include <platform/internal/GenericConnectivityManagerImpl.h>
24 #include <platform/internal/GenericConnectivityManagerImpl_WiFi.h>
25 #if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
26 #include <platform/internal/GenericConnectivityManagerImpl_BLE.h>
28 #include <platform/internal/GenericConnectivityManagerImpl_NoBLE.h>
30 #include <platform/internal/GenericConnectivityManagerImpl_NoThread.h>
31 #include <support/BitFlags.h>
33 #include "esp_event.h"
40 namespace DeviceLayer {
42 class PlatformManagerImpl;
46 class NetworkProvisioningServerImpl;
47 template <class ImplClass>
48 class GenericNetworkProvisioningServerImpl;
50 } // namespace Internal
53 * Concrete implementation of the ConnectivityManager singleton object for the ESP32 platform.
55 class ConnectivityManagerImpl final : public ConnectivityManager,
56 public Internal::GenericConnectivityManagerImpl<ConnectivityManagerImpl>,
57 public Internal::GenericConnectivityManagerImpl_WiFi<ConnectivityManagerImpl>,
58 #if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
59 public Internal::GenericConnectivityManagerImpl_BLE<ConnectivityManagerImpl>,
61 public Internal::GenericConnectivityManagerImpl_NoBLE<ConnectivityManagerImpl>,
63 public Internal::GenericConnectivityManagerImpl_NoThread<ConnectivityManagerImpl>
66 // Allow the ConnectivityManager interface class to delegate method calls to
67 // the implementation methods provided by this class.
68 friend class ConnectivityManager;
71 using Flags = GenericConnectivityManagerImpl_WiFi::ConnectivityFlags;
72 // ===== Members that implement the ConnectivityManager abstract interface.
74 WiFiStationMode _GetWiFiStationMode(void);
75 CHIP_ERROR _SetWiFiStationMode(WiFiStationMode val);
76 bool _IsWiFiStationEnabled(void);
77 bool _IsWiFiStationApplicationControlled(void);
78 bool _IsWiFiStationConnected(void);
79 uint32_t _GetWiFiStationReconnectIntervalMS(void);
80 CHIP_ERROR _SetWiFiStationReconnectIntervalMS(uint32_t val);
81 bool _IsWiFiStationProvisioned(void);
82 void _ClearWiFiStationProvision(void);
83 WiFiAPMode _GetWiFiAPMode(void);
84 CHIP_ERROR _SetWiFiAPMode(WiFiAPMode val);
85 bool _IsWiFiAPActive(void);
86 bool _IsWiFiAPApplicationControlled(void);
87 void _DemandStartWiFiAP(void);
88 void _StopOnDemandWiFiAP(void);
89 void _MaintainOnDemandWiFiAP(void);
90 uint32_t _GetWiFiAPIdleTimeoutMS(void);
91 void _SetWiFiAPIdleTimeoutMS(uint32_t val);
92 CHIP_ERROR _GetAndLogWifiStatsCounters(void);
93 bool _HaveIPv4InternetConnectivity(void);
94 bool _HaveIPv6InternetConnectivity(void);
95 bool _HaveServiceConnectivity(void);
96 CHIP_ERROR _Init(void);
97 void _OnPlatformEvent(const ChipDeviceEvent * event);
98 bool _CanStartWiFiScan();
99 void _OnWiFiScanDone();
100 void _OnWiFiStationProvisionChange();
102 // ===== Members for internal use by the following friends.
104 friend ConnectivityManager & ConnectivityMgr(void);
105 friend ConnectivityManagerImpl & ConnectivityMgrImpl(void);
107 static ConnectivityManagerImpl sInstance;
109 // ===== Private members reserved for use by this class only.
111 uint64_t mLastStationConnectFailTime;
112 uint64_t mLastAPDemandTime;
113 WiFiStationMode mWiFiStationMode;
114 WiFiStationState mWiFiStationState;
115 WiFiAPMode mWiFiAPMode;
116 WiFiAPState mWiFiAPState;
117 uint32_t mWiFiStationReconnectIntervalMS;
118 uint32_t mWiFiAPIdleTimeoutMS;
119 BitFlags<Flags> mFlags;
121 void DriveStationState(void);
122 void OnStationConnected(void);
123 void OnStationDisconnected(void);
124 void ChangeWiFiStationState(WiFiStationState newState);
125 static void DriveStationState(::chip::System::Layer * aLayer, void * aAppState, ::chip::System::Error aError);
127 void DriveAPState(void);
128 CHIP_ERROR ConfigureWiFiAP(void);
129 void ChangeWiFiAPState(WiFiAPState newState);
130 static void DriveAPState(::chip::System::Layer * aLayer, void * aAppState, ::chip::System::Error aError);
132 void UpdateInternetConnectivityState(void);
133 void OnStationIPv4AddressAvailable(const ip_event_got_ip_t & got_ip);
134 void OnStationIPv4AddressLost(void);
135 void OnIPv6AddressAvailable(const ip_event_got_ip6_t & got_ip);
137 static void RefreshMessageLayer(void);
140 inline bool ConnectivityManagerImpl::_IsWiFiStationApplicationControlled(void)
142 return mWiFiStationMode == kWiFiStationMode_ApplicationControlled;
145 inline bool ConnectivityManagerImpl::_IsWiFiStationConnected(void)
147 return mWiFiStationState == kWiFiStationState_Connected;
150 inline bool ConnectivityManagerImpl::_IsWiFiAPApplicationControlled(void)
152 return mWiFiAPMode == kWiFiAPMode_ApplicationControlled;
155 inline uint32_t ConnectivityManagerImpl::_GetWiFiStationReconnectIntervalMS(void)
157 return mWiFiStationReconnectIntervalMS;
160 inline ConnectivityManager::WiFiAPMode ConnectivityManagerImpl::_GetWiFiAPMode(void)
165 inline bool ConnectivityManagerImpl::_IsWiFiAPActive(void)
167 return mWiFiAPState == kWiFiAPState_Active;
170 inline uint32_t ConnectivityManagerImpl::_GetWiFiAPIdleTimeoutMS(void)
172 return mWiFiAPIdleTimeoutMS;
175 inline bool ConnectivityManagerImpl::_HaveIPv4InternetConnectivity(void)
177 return mFlags.Has(Flags::kHaveIPv4InternetConnectivity);
180 inline bool ConnectivityManagerImpl::_HaveIPv6InternetConnectivity(void)
182 return mFlags.Has(Flags::kHaveIPv6InternetConnectivity);
185 inline bool ConnectivityManagerImpl::_CanStartWiFiScan()
187 return mWiFiStationState != kWiFiStationState_Connecting;
190 inline bool ConnectivityManagerImpl::_HaveServiceConnectivity(void)
192 return HaveServiceConnectivityViaThread();
196 * Returns the public interface of the ConnectivityManager singleton object.
198 * Chip applications should use this to access features of the ConnectivityManager object
199 * that are common to all platforms.
201 inline ConnectivityManager & ConnectivityMgr(void)
203 return ConnectivityManagerImpl::sInstance;
207 * Returns the platform-specific implementation of the ConnectivityManager singleton object.
209 * Chip applications can use this to gain access to features of the ConnectivityManager
210 * that are specific to the ESP32 platform.
212 inline ConnectivityManagerImpl & ConnectivityMgrImpl(void)
214 return ConnectivityManagerImpl::sInstance;
217 } // namespace DeviceLayer