blob: fea8fcff9820365e7b600a3891f3e5d3b9efdaaf [file] [log] [blame]
pakls0168a572022-09-14 03:05:11 +08001/*
2 *
3 * Copyright (c) 2020 Project CHIP Authors
4 * Copyright (c) 2019 Nest Labs, Inc.
5 *
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
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
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.
17 */
18
19#pragma once
20
21#include <platform/ConnectivityManager.h>
22#include <platform/internal/GenericConnectivityManagerImpl.h>
23#include <platform/internal/GenericConnectivityManagerImpl_UDP.h>
24
25#if INET_CONFIG_ENABLE_TCP_ENDPOINT
26#include <platform/internal/GenericConnectivityManagerImpl_TCP.h>
27#endif
28
29#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
30#include <platform/internal/GenericConnectivityManagerImpl_BLE.h>
31#else
32#include <platform/internal/GenericConnectivityManagerImpl_NoBLE.h>
33#endif
34#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
35#include <platform/internal/GenericConnectivityManagerImpl_Thread.h>
36#else
37#include <platform/internal/GenericConnectivityManagerImpl_NoThread.h>
38#endif
39#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
40#include <platform/internal/GenericConnectivityManagerImpl_WiFi.ipp>
41#else
42#include <platform/internal/GenericConnectivityManagerImpl_NoWiFi.h>
43#endif
44
45#include "filogic.h"
46
47namespace Inet {
48class IPAddress;
49} // namespace Inet
50
51namespace chip {
52namespace DeviceLayer {
53
54// class PlatformManagerImpl;
55
56/**
57 * Concrete implementation of the ConnectivityManager singleton object for MediaTek Genio platforms.
58 */
59class ConnectivityManagerImpl final : public ConnectivityManager,
60 public Internal::GenericConnectivityManagerImpl<ConnectivityManagerImpl>,
61 public Internal::GenericConnectivityManagerImpl_UDP<ConnectivityManagerImpl>,
62#if INET_CONFIG_ENABLE_TCP_ENDPOINT
63 public Internal::GenericConnectivityManagerImpl_TCP<ConnectivityManagerImpl>,
64#endif
65#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
66 public Internal::GenericConnectivityManagerImpl_BLE<ConnectivityManagerImpl>,
67#else
68 public Internal::GenericConnectivityManagerImpl_NoBLE<ConnectivityManagerImpl>,
69#endif
70#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
71 public Internal::GenericConnectivityManagerImpl_Thread<ConnectivityManagerImpl>,
72#else
73 public Internal::GenericConnectivityManagerImpl_NoThread<ConnectivityManagerImpl>,
74#endif
75#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
76 public Internal::GenericConnectivityManagerImpl_WiFi<ConnectivityManagerImpl>
77#else
78 public Internal::GenericConnectivityManagerImpl_NoWiFi<ConnectivityManagerImpl>
79#endif
80{
81 // Allow the ConnectivityManager interface class to delegate method calls to
82 // the implementation methods provided by this class.
83 friend class ConnectivityManager;
84
85private:
86 // ===== Members that implement the ConnectivityManager abstract interface.
87
88 bool _HaveIPv4InternetConnectivity(void);
89 bool _HaveIPv6InternetConnectivity(void);
90#if 0 // CHIP_DEVICE_CONFIG_ENABLE_THREAD
91 bool _HaveServiceConnectivity(void);
92#endif
93 CHIP_ERROR _Init(void);
94 void _OnPlatformEvent(const ChipDeviceEvent * event);
paklsb278e342022-11-07 19:11:56 +080095 void OnInternetConnectivityChangeEvent(const ChipDeviceEvent * event);
pakls0168a572022-09-14 03:05:11 +080096
97#if CHIP_DEVICE_CONFIG_ENABLE_WIFI
98 CHIP_ERROR WiFiInit(void);
99 WiFiStationMode GetFilogicStationMode(void);
100 WiFiAPMode GetFilogicAPMode(void);
101 filogic_wifi_opmode_t GetFilogicNextOpMode(WiFiStationMode wifiStationMode, WiFiAPMode wifiAPMode);
102 void SetFlogicNextMode(filogic_wifi_opmode_t nextMode);
103 void _OnWiFiPlatformEvent(const ChipDeviceEvent * event);
104#endif
105
106#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
107 using Flags = GenericConnectivityManagerImpl_WiFi::ConnectivityFlags;
108 WiFiStationMode _GetWiFiStationMode(void);
109 CHIP_ERROR _SetWiFiStationMode(WiFiStationMode val);
110 CHIP_ERROR _SetWiFiStationReconnectInterval(System::Clock::Timeout val);
111 CHIP_ERROR _GetAndLogWifiStatsCounters(void);
112 bool _IsWiFiStationEnabled(void);
113 bool _IsWiFiStationApplicationControlled(void);
114 bool _IsWiFiStationConnected(void);
115 bool _IsWiFiStationProvisioned(void);
116 void _ClearWiFiStationProvision(void);
pakls0168a572022-09-14 03:05:11 +0800117 void _OnWiFiScanDone();
118 void _OnWiFiStationProvisionChange();
119 System::Clock::Timeout _GetWiFiStationReconnectInterval(void);
120#endif
121#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_AP
122 void ChangeWiFiAPState(WiFiAPState newState);
123 void DriveAPState(void);
124 CHIP_ERROR ConfigureWiFiAP(void);
125 static void DriveAPState(::chip::System::Layer * aLayer, void * aAppState);
126 WiFiAPMode _GetWiFiAPMode(void);
127 CHIP_ERROR _SetWiFiAPMode(WiFiAPMode val);
128 bool _IsWiFiAPApplicationControlled(void);
129 bool _IsWiFiAPActive(void);
130 void _DemandStartWiFiAP(void);
131 void _StopOnDemandWiFiAP(void);
132 void _MaintainOnDemandWiFiAP(void);
133 System::Clock::Timeout _GetWiFiAPIdleTimeout(void);
134 void _SetWiFiAPIdleTimeout(System::Clock::Timeout val);
135#endif
136 // ===== Members for internal use by the following friends.
137
138 friend ConnectivityManager & ConnectivityMgr(void);
139 friend ConnectivityManagerImpl & ConnectivityMgrImpl(void);
140
141#if CHIP_DEVICE_CONFIG_ENABLE_WIFI
142 static ConnectivityManagerImpl sInstance;
143#endif
144
145 // ===== Private members reserved for use by this class only.
146#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
147 System::Clock::Timestamp mLastStationConnectFailTime;
148 WiFiStationMode mWiFiStationMode;
149 WiFiStationState mWiFiStationState;
150 System::Clock::Timeout mWiFiStationReconnectInterval;
151 BitFlags<Flags> mFlags;
152
153 void DriveStationState(void);
154 void OnStationConnected(void);
155 void OnStationDisconnected(void);
156 void ChangeWiFiStationState(WiFiStationState newState);
157 static void DriveStationState(::chip::System::Layer * aLayer, void * aAppState);
158
159 void UpdateInternetConnectivityState(bool haveIPv4Conn, bool haveIPv6Conn, const uint8_t * ipAddr);
160#endif
161#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_AP
162 WiFiAPMode mWiFiAPMode;
163 WiFiAPState mWiFiAPState;
164 System::Clock::Timeout mWiFiAPIdleTimeout;
165 System::Clock::Timestamp mLastAPDemandTime;
166#endif
167 void * mFilogicCtx;
168};
169
170inline bool ConnectivityManagerImpl::_HaveIPv4InternetConnectivity(void)
171{
172#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
173 return mFlags.Has(Flags::kHaveIPv4InternetConnectivity);
174#else
175 return false;
176#endif
177}
178
179inline bool ConnectivityManagerImpl::_HaveIPv6InternetConnectivity(void)
180{
181#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
182 return mFlags.Has(Flags::kHaveIPv6InternetConnectivity);
183#else
184 return false;
185#endif
186}
187
188#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
189inline bool ConnectivityManagerImpl::_IsWiFiStationApplicationControlled(void)
190{
191 return mWiFiStationMode == kWiFiStationMode_ApplicationControlled;
192}
193
194inline bool ConnectivityManagerImpl::_IsWiFiStationConnected(void)
195{
196 return mWiFiStationState == kWiFiStationState_Connected;
197}
198
199inline System::Clock::Timeout ConnectivityManagerImpl::_GetWiFiStationReconnectInterval(void)
200{
201 return mWiFiStationReconnectInterval;
202}
pakls0168a572022-09-14 03:05:11 +0800203#endif
204
205#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_AP
206inline ConnectivityManager::WiFiAPMode ConnectivityManagerImpl::_GetWiFiAPMode(void)
207{
208 return mWiFiAPMode;
209}
210
211inline bool ConnectivityManagerImpl::_IsWiFiAPApplicationControlled(void)
212{
213 return mWiFiAPMode == kWiFiAPMode_ApplicationControlled;
214}
215
216inline bool ConnectivityManagerImpl::_IsWiFiAPActive(void)
217{
218 return mWiFiAPState == kWiFiAPState_Active;
219}
220
221inline System::Clock::Timeout ConnectivityManagerImpl::_GetWiFiAPIdleTimeout(void)
222{
223 return mWiFiAPIdleTimeout;
224}
225#endif
226
227#if 0 // CHIP_DEVICE_CONFIG_ENABLE_THREAD
228inline bool ConnectivityManagerImpl::_HaveServiceConnectivity(void)
229{
230 return _HaveServiceConnectivityViaThread();
231}
232#endif
233
234/**
235 *
236 * Returns the public interface of the ConnectivityManager singleton object.
237 *
238 * Chip applications should use this to access features of the ConnectivityManager object
239 * that are common to all platforms.
240 */
241inline ConnectivityManager & ConnectivityMgr(void)
242{
243 return ConnectivityManagerImpl::sInstance;
244}
245
246/**
247 * Returns the platform-specific implementation of the ConnectivityManager singleton object.
248 *
249 * Chip applications can use this to gain access to features of the ConnectivityManager
250 * that are specific to the Genio platform.
251 */
252inline ConnectivityManagerImpl & ConnectivityMgrImpl(void)
253{
254 return ConnectivityManagerImpl::sInstance;
255}
256
257} // namespace DeviceLayer
258} // namespace chip