3 * Copyright (c) 2020 Project CHIP Authors
4 * Copyright (c) 2018 Nest Labs, Inc.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * Defines the public interface for the Device Layer ConnectivityManager object.
26 #include <support/CodeUtils.h>
35 namespace DeviceLayer {
39 class GenericPlatformManagerImpl;
41 class GenericPlatformManagerImpl_FreeRTOS;
43 class GenericPlatformManagerImpl_POSIX;
44 } // namespace Internal
46 class ConnectivityManagerImpl;
49 * Provides control of network connectivity for a chip device.
51 class ConnectivityManager
53 using ImplClass = ::chip::DeviceLayer::ConnectivityManagerImpl;
56 // ===== Members that define the public interface of the ConnectivityManager
60 kWiFiStationMode_NotSupported = 0,
61 kWiFiStationMode_ApplicationControlled = 1,
62 kWiFiStationMode_Disabled = 2,
63 kWiFiStationMode_Enabled = 3,
68 kWiFiAPMode_NotSupported = 0,
69 kWiFiAPMode_ApplicationControlled = 1,
70 kWiFiAPMode_Disabled = 2,
71 kWiFiAPMode_Enabled = 3,
72 kWiFiAPMode_OnDemand = 4,
73 kWiFiAPMode_OnDemand_NoStationProvision = 5,
78 kThreadMode_NotSupported = 0,
79 kThreadMode_ApplicationControlled = 1,
80 kThreadMode_Disabled = 2,
81 kThreadMode_Enabled = 3,
86 kWiFiStationState_NotConnected,
87 kWiFiStationState_Connecting,
88 kWiFiStationState_Connecting_Succeeded,
89 kWiFiStationState_Connecting_Failed,
90 kWiFiStationState_Connected,
91 kWiFiStationState_Disconnecting,
96 kWiFiAPState_NotActive,
97 kWiFiAPState_Activating,
99 kWiFiAPState_Deactivating,
102 enum CHIPoBLEServiceMode
104 kCHIPoBLEServiceMode_NotSupported = 0,
105 kCHIPoBLEServiceMode_Enabled = 1,
106 kCHIPoBLEServiceMode_Disabled = 2,
109 enum ThreadDeviceType
111 kThreadDeviceType_NotSupported = 0,
112 kThreadDeviceType_Router = 1,
113 kThreadDeviceType_FullEndDevice = 2,
114 kThreadDeviceType_MinimalEndDevice = 3,
115 kThreadDeviceType_SleepyEndDevice = 4,
118 enum BLEAdvertisingMode
120 kFastAdvertising = 0,
121 kSlowAdvertising = 1,
124 struct ThreadPollingConfig;
126 // WiFi station methods
127 WiFiStationMode GetWiFiStationMode();
128 CHIP_ERROR SetWiFiStationMode(WiFiStationMode val);
129 bool IsWiFiStationEnabled();
130 bool IsWiFiStationApplicationControlled();
131 bool IsWiFiStationConnected();
132 uint32_t GetWiFiStationReconnectIntervalMS();
133 CHIP_ERROR SetWiFiStationReconnectIntervalMS(uint32_t val);
134 bool IsWiFiStationProvisioned();
135 void ClearWiFiStationProvision();
136 CHIP_ERROR GetAndLogWifiStatsCounters();
139 WiFiAPMode GetWiFiAPMode();
140 CHIP_ERROR SetWiFiAPMode(WiFiAPMode val);
141 bool IsWiFiAPActive();
142 bool IsWiFiAPApplicationControlled();
143 void DemandStartWiFiAP();
144 void StopOnDemandWiFiAP();
145 void MaintainOnDemandWiFiAP();
146 uint32_t GetWiFiAPIdleTimeoutMS();
147 void SetWiFiAPIdleTimeoutMS(uint32_t val);
150 ThreadMode GetThreadMode();
151 CHIP_ERROR SetThreadMode(ThreadMode val);
152 bool IsThreadEnabled();
153 bool IsThreadApplicationControlled();
154 ThreadDeviceType GetThreadDeviceType();
155 CHIP_ERROR SetThreadDeviceType(ThreadDeviceType deviceType);
156 void GetThreadPollingConfig(ThreadPollingConfig & pollingConfig);
157 CHIP_ERROR SetThreadPollingConfig(const ThreadPollingConfig & pollingConfig);
158 bool IsThreadAttached();
159 bool IsThreadProvisioned();
160 void ErasePersistentInfo();
161 bool HaveServiceConnectivityViaThread();
163 // Internet connectivity methods
164 bool HaveIPv4InternetConnectivity();
165 bool HaveIPv6InternetConnectivity();
167 // Service connectivity methods
168 bool HaveServiceConnectivity();
170 // CHIPoBLE service methods
171 Ble::BleLayer * GetBleLayer();
172 CHIPoBLEServiceMode GetCHIPoBLEServiceMode();
173 CHIP_ERROR SetCHIPoBLEServiceMode(CHIPoBLEServiceMode val);
174 bool IsBLEAdvertisingEnabled();
175 CHIP_ERROR SetBLEAdvertisingEnabled(bool val);
176 bool IsBLEAdvertising();
177 CHIP_ERROR SetBLEAdvertisingMode(BLEAdvertisingMode mode);
178 CHIP_ERROR GetBLEDeviceName(char * buf, size_t bufSize);
179 CHIP_ERROR SetBLEDeviceName(const char * deviceName);
180 uint16_t NumBLEConnections();
182 // User selected mode methods
183 bool IsUserSelectedModeActive();
184 void SetUserSelectedMode(bool val);
185 uint16_t GetUserSelectedModeTimeout();
186 void SetUserSelectedModeTimeout(uint16_t val);
189 static const char * WiFiStationModeToStr(WiFiStationMode mode);
190 static const char * WiFiAPModeToStr(WiFiAPMode mode);
191 static const char * WiFiStationStateToStr(WiFiStationState state);
192 static const char * WiFiAPStateToStr(WiFiAPState state);
193 static const char * CHIPoBLEServiceModeToStr(CHIPoBLEServiceMode mode);
196 // ===== Members for internal use by the following friends.
198 friend class PlatformManagerImpl;
200 friend class Internal::GenericPlatformManagerImpl;
202 friend class Internal::GenericPlatformManagerImpl_FreeRTOS;
204 friend class Internal::GenericPlatformManagerImpl_POSIX;
207 void OnPlatformEvent(const ChipDeviceEvent * event);
208 bool CanStartWiFiScan();
209 void OnWiFiScanDone();
210 void OnWiFiStationProvisionChange();
213 // Construction/destruction limited to subclasses.
214 ConnectivityManager() = default;
215 ~ConnectivityManager() = default;
217 // No copy, move or assignment.
218 ConnectivityManager(const ConnectivityManager &) = delete;
219 ConnectivityManager(const ConnectivityManager &&) = delete;
220 ConnectivityManager & operator=(const ConnectivityManager &) = delete;
224 * Information describing the desired Thread polling behavior of a device.
226 struct ConnectivityManager::ThreadPollingConfig
228 uint32_t ActivePollingIntervalMS; /**< Interval at which the device polls its parent Thread router when
229 when there are active chip exchanges in progress. Only meaningful
230 when the device is acting as a sleepy end node. */
232 uint32_t InactivePollingIntervalMS; /**< Interval at which the device polls its parent Thread router when
233 when there are NO active chip exchanges in progress. Only meaningful
234 when the device is acting as a sleepy end node. */
236 void Clear() { memset(this, 0, sizeof(*this)); }
240 * Returns a reference to the public interface of the ConnectivityManager singleton object.
242 * chip applications should use this to access features of the ConnectivityManager object
243 * that are common to all platforms.
245 extern ConnectivityManager & ConnectivityMgr();
248 * Returns the platform-specific implementation of the ConnectivityManager singleton object.
250 * chip applications can use this to gain access to features of the ConnectivityManager
251 * that are specific to the selected platform.
253 extern ConnectivityManagerImpl & ConnectivityMgrImpl();
255 } // namespace DeviceLayer
258 /* Include a header file containing the implementation of the ConfigurationManager
259 * object for the selected platform.
261 #ifdef EXTERNAL_CONNECTIVITYMANAGERIMPL_HEADER
262 #include EXTERNAL_CONNECTIVITYMANAGERIMPL_HEADER
263 #elif defined(CHIP_DEVICE_LAYER_TARGET)
264 #define CONNECTIVITYMANAGERIMPL_HEADER <platform/CHIP_DEVICE_LAYER_TARGET/ConnectivityManagerImpl.h>
265 #include CONNECTIVITYMANAGERIMPL_HEADER
266 #endif // defined(CHIP_DEVICE_LAYER_TARGET)
269 namespace DeviceLayer {
271 inline ConnectivityManager::WiFiStationMode ConnectivityManager::GetWiFiStationMode()
273 return static_cast<ImplClass *>(this)->_GetWiFiStationMode();
276 inline CHIP_ERROR ConnectivityManager::SetWiFiStationMode(WiFiStationMode val)
278 return static_cast<ImplClass *>(this)->_SetWiFiStationMode(val);
281 inline bool ConnectivityManager::IsWiFiStationEnabled()
283 return static_cast<ImplClass *>(this)->_IsWiFiStationEnabled();
286 inline bool ConnectivityManager::IsWiFiStationApplicationControlled()
288 return static_cast<ImplClass *>(this)->_IsWiFiStationApplicationControlled();
291 inline bool ConnectivityManager::IsWiFiStationConnected()
293 return static_cast<ImplClass *>(this)->_IsWiFiStationConnected();
296 inline uint32_t ConnectivityManager::GetWiFiStationReconnectIntervalMS()
298 return static_cast<ImplClass *>(this)->_GetWiFiStationReconnectIntervalMS();
301 inline CHIP_ERROR ConnectivityManager::SetWiFiStationReconnectIntervalMS(uint32_t val)
303 return static_cast<ImplClass *>(this)->_SetWiFiStationReconnectIntervalMS(val);
306 inline bool ConnectivityManager::IsWiFiStationProvisioned()
308 return static_cast<ImplClass *>(this)->_IsWiFiStationProvisioned();
311 inline void ConnectivityManager::ClearWiFiStationProvision()
313 static_cast<ImplClass *>(this)->_ClearWiFiStationProvision();
316 inline ConnectivityManager::WiFiAPMode ConnectivityManager::GetWiFiAPMode()
318 return static_cast<ImplClass *>(this)->_GetWiFiAPMode();
321 inline CHIP_ERROR ConnectivityManager::SetWiFiAPMode(WiFiAPMode val)
323 return static_cast<ImplClass *>(this)->_SetWiFiAPMode(val);
326 inline bool ConnectivityManager::IsWiFiAPActive()
328 return static_cast<ImplClass *>(this)->_IsWiFiAPActive();
331 inline bool ConnectivityManager::IsWiFiAPApplicationControlled()
333 return static_cast<ImplClass *>(this)->_IsWiFiAPApplicationControlled();
336 inline void ConnectivityManager::DemandStartWiFiAP()
338 static_cast<ImplClass *>(this)->_DemandStartWiFiAP();
341 inline void ConnectivityManager::StopOnDemandWiFiAP()
343 static_cast<ImplClass *>(this)->_StopOnDemandWiFiAP();
346 inline void ConnectivityManager::MaintainOnDemandWiFiAP()
348 static_cast<ImplClass *>(this)->_MaintainOnDemandWiFiAP();
351 inline uint32_t ConnectivityManager::GetWiFiAPIdleTimeoutMS()
353 return static_cast<ImplClass *>(this)->_GetWiFiAPIdleTimeoutMS();
356 inline void ConnectivityManager::SetWiFiAPIdleTimeoutMS(uint32_t val)
358 static_cast<ImplClass *>(this)->_SetWiFiAPIdleTimeoutMS(val);
361 inline CHIP_ERROR ConnectivityManager::GetAndLogWifiStatsCounters()
363 return static_cast<ImplClass *>(this)->_GetAndLogWifiStatsCounters();
366 inline bool ConnectivityManager::HaveIPv4InternetConnectivity()
368 return static_cast<ImplClass *>(this)->_HaveIPv4InternetConnectivity();
371 inline bool ConnectivityManager::HaveIPv6InternetConnectivity()
373 return static_cast<ImplClass *>(this)->_HaveIPv6InternetConnectivity();
376 inline bool ConnectivityManager::HaveServiceConnectivity()
378 return static_cast<ImplClass *>(this)->_HaveServiceConnectivity();
381 inline ConnectivityManager::ThreadMode ConnectivityManager::GetThreadMode()
383 return static_cast<ImplClass *>(this)->_GetThreadMode();
386 inline CHIP_ERROR ConnectivityManager::SetThreadMode(ThreadMode val)
388 return static_cast<ImplClass *>(this)->_SetThreadMode(val);
391 inline bool ConnectivityManager::IsThreadEnabled()
393 return static_cast<ImplClass *>(this)->_IsThreadEnabled();
396 inline bool ConnectivityManager::IsThreadApplicationControlled()
398 return static_cast<ImplClass *>(this)->_IsThreadApplicationControlled();
401 inline ConnectivityManager::ThreadDeviceType ConnectivityManager::GetThreadDeviceType()
403 return static_cast<ImplClass *>(this)->_GetThreadDeviceType();
406 inline CHIP_ERROR ConnectivityManager::SetThreadDeviceType(ThreadDeviceType deviceType)
408 return static_cast<ImplClass *>(this)->_SetThreadDeviceType(deviceType);
411 inline void ConnectivityManager::GetThreadPollingConfig(ThreadPollingConfig & pollingConfig)
413 return static_cast<ImplClass *>(this)->_GetThreadPollingConfig(pollingConfig);
416 inline CHIP_ERROR ConnectivityManager::SetThreadPollingConfig(const ThreadPollingConfig & pollingConfig)
418 return static_cast<ImplClass *>(this)->_SetThreadPollingConfig(pollingConfig);
421 inline bool ConnectivityManager::IsThreadAttached()
423 return static_cast<ImplClass *>(this)->_IsThreadAttached();
426 inline bool ConnectivityManager::IsThreadProvisioned()
428 return static_cast<ImplClass *>(this)->_IsThreadProvisioned();
431 inline void ConnectivityManager::ErasePersistentInfo()
433 static_cast<ImplClass *>(this)->_ErasePersistentInfo();
436 inline bool ConnectivityManager::HaveServiceConnectivityViaThread()
438 return static_cast<ImplClass *>(this)->_HaveServiceConnectivityViaThread();
441 inline Ble::BleLayer * ConnectivityManager::GetBleLayer()
443 return static_cast<ImplClass *>(this)->_GetBleLayer();
446 inline ConnectivityManager::CHIPoBLEServiceMode ConnectivityManager::GetCHIPoBLEServiceMode()
448 return static_cast<ImplClass *>(this)->_GetCHIPoBLEServiceMode();
451 inline CHIP_ERROR ConnectivityManager::SetCHIPoBLEServiceMode(CHIPoBLEServiceMode val)
453 return static_cast<ImplClass *>(this)->_SetCHIPoBLEServiceMode(val);
456 inline bool ConnectivityManager::IsBLEAdvertisingEnabled()
458 return static_cast<ImplClass *>(this)->_IsBLEAdvertisingEnabled();
461 inline CHIP_ERROR ConnectivityManager::SetBLEAdvertisingEnabled(bool val)
463 return static_cast<ImplClass *>(this)->_SetBLEAdvertisingEnabled(val);
466 inline bool ConnectivityManager::IsBLEAdvertising()
468 return static_cast<ImplClass *>(this)->_IsBLEAdvertising();
471 inline CHIP_ERROR ConnectivityManager::SetBLEAdvertisingMode(BLEAdvertisingMode mode)
473 return static_cast<ImplClass *>(this)->_SetBLEAdvertisingMode(mode);
476 inline CHIP_ERROR ConnectivityManager::GetBLEDeviceName(char * buf, size_t bufSize)
478 return static_cast<ImplClass *>(this)->_GetBLEDeviceName(buf, bufSize);
481 inline CHIP_ERROR ConnectivityManager::SetBLEDeviceName(const char * deviceName)
483 return static_cast<ImplClass *>(this)->_SetBLEDeviceName(deviceName);
486 inline uint16_t ConnectivityManager::NumBLEConnections()
488 return static_cast<ImplClass *>(this)->_NumBLEConnections();
491 inline bool ConnectivityManager::IsUserSelectedModeActive()
493 return static_cast<ImplClass *>(this)->_IsUserSelectedModeActive();
496 inline void ConnectivityManager::SetUserSelectedMode(bool val)
498 static_cast<ImplClass *>(this)->_SetUserSelectedMode(val);
501 inline uint16_t ConnectivityManager::GetUserSelectedModeTimeout()
503 return static_cast<ImplClass *>(this)->_GetUserSelectedModeTimeout();
506 inline void ConnectivityManager::SetUserSelectedModeTimeout(uint16_t val)
508 static_cast<ImplClass *>(this)->_SetUserSelectedModeTimeout(val);
511 inline const char * ConnectivityManager::WiFiStationModeToStr(WiFiStationMode mode)
513 return ImplClass::_WiFiStationModeToStr(mode);
516 inline const char * ConnectivityManager::WiFiAPModeToStr(WiFiAPMode mode)
518 return ImplClass::_WiFiAPModeToStr(mode);
521 inline const char * ConnectivityManager::WiFiStationStateToStr(WiFiStationState state)
523 return ImplClass::_WiFiStationStateToStr(state);
526 inline const char * ConnectivityManager::WiFiAPStateToStr(WiFiAPState state)
528 return ImplClass::_WiFiAPStateToStr(state);
531 inline const char * ConnectivityManager::CHIPoBLEServiceModeToStr(CHIPoBLEServiceMode mode)
533 return ImplClass::_CHIPoBLEServiceModeToStr(mode);
536 inline CHIP_ERROR ConnectivityManager::Init()
538 return static_cast<ImplClass *>(this)->_Init();
541 inline void ConnectivityManager::OnPlatformEvent(const ChipDeviceEvent * event)
543 static_cast<ImplClass *>(this)->_OnPlatformEvent(event);
546 inline bool ConnectivityManager::CanStartWiFiScan()
548 return static_cast<ImplClass *>(this)->_CanStartWiFiScan();
551 inline void ConnectivityManager::OnWiFiScanDone()
553 static_cast<ImplClass *>(this)->_OnWiFiScanDone();
556 inline void ConnectivityManager::OnWiFiStationProvisionChange()
558 static_cast<ImplClass *>(this)->_OnWiFiStationProvisionChange();
561 } // namespace DeviceLayer