forked from project-chip/connectedhomeip
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNetworkCommissioningWiFiDriver.h
151 lines (130 loc) · 5.01 KB
/
NetworkCommissioningWiFiDriver.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
*
* Copyright (c) 2021 Project CHIP Authors
*
* 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.
*/
#pragma once
#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
#include <platform/NetworkCommissioning.h>
#include <platform/silabs/wifi/WifiInterface.h>
namespace chip {
namespace DeviceLayer {
namespace NetworkCommissioning {
namespace {
inline constexpr uint8_t kMaxWiFiNetworks = 1;
inline constexpr uint8_t kWiFiScanNetworksTimeOutSeconds = 10;
inline constexpr uint8_t kWiFiConnectNetworkTimeoutSeconds = 20;
} // namespace
CHIP_ERROR GetConnectedNetwork(Network & network);
template <typename T>
class SlScanResponseIterator : public Iterator<T>
{
public:
SlScanResponseIterator(T * apScanResponse) : mpScanResponse(apScanResponse) {}
size_t Count() override { return itemCount; }
bool Next(T & item) override
{
if (mpScanResponse == nullptr || currentIterating >= itemCount)
{
return false;
}
item = mpScanResponse[currentIterating];
currentIterating++;
return true;
}
void Release() override
{
itemCount = currentIterating = 0;
Platform::MemoryFree(mpScanResponse);
mpScanResponse = nullptr;
}
void Add(T * pResponse)
{
size_t tempCount = itemCount + 1;
mpScanResponse = static_cast<T *>(Platform::MemoryRealloc(mpScanResponse, kItemSize * tempCount));
if (mpScanResponse)
{
// first item at index. update after the copy.
memcpy(&(mpScanResponse[itemCount]), pResponse, kItemSize);
itemCount = tempCount;
}
}
private:
size_t currentIterating = 0;
size_t itemCount = 0;
static constexpr size_t kItemSize = sizeof(T);
T * mpScanResponse;
};
class SlWiFiDriver final : public WiFiDriver
{
public:
class WiFiNetworkIterator final : public NetworkIterator
{
public:
WiFiNetworkIterator(SlWiFiDriver * aDriver) : mDriver(aDriver) {}
size_t Count() override;
bool Next(Network & item) override;
void Release() override { delete this; }
~WiFiNetworkIterator() = default;
private:
SlWiFiDriver * mDriver;
bool mExhausted = false;
};
struct WiFiNetwork
{
char ssid[DeviceLayer::Internal::kMaxWiFiSSIDLength];
uint8_t ssidLen = 0;
char credentials[DeviceLayer::Internal::kMaxWiFiKeyLength];
uint8_t credentialsLen = 0;
};
// BaseDriver
NetworkIterator * GetNetworks() override { return new WiFiNetworkIterator(this); }
CHIP_ERROR Init(NetworkStatusChangeCallback * networkStatusChangeCallback) override;
// WirelessDriver
uint8_t GetMaxNetworks() override { return kMaxWiFiNetworks; }
uint8_t GetScanNetworkTimeoutSeconds() override { return kWiFiScanNetworksTimeOutSeconds; }
uint8_t GetConnectNetworkTimeoutSeconds() override { return kWiFiConnectNetworkTimeoutSeconds; }
CHIP_ERROR CommitConfiguration() override;
CHIP_ERROR RevertConfiguration() override;
Status RemoveNetwork(ByteSpan networkId, MutableCharSpan & outDebugText, uint8_t & outNetworkIndex) override;
Status ReorderNetwork(ByteSpan networkId, uint8_t index, MutableCharSpan & outDebugText) override;
void ConnectNetwork(ByteSpan networkId, ConnectCallback * callback) override;
// WiFiDriver
Status AddOrUpdateNetwork(ByteSpan ssid, ByteSpan credentials, MutableCharSpan & outDebugText,
uint8_t & outNetworkIndex) override;
void ScanNetworks(ByteSpan ssid, ScanCallback * callback) override;
CHIP_ERROR ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, const char * key, uint8_t keyLen);
chip::BitFlags<WiFiSecurity> ConvertSecuritytype(wfx_sec_t security);
uint32_t GetSupportedWiFiBandsMask() const override;
void OnConnectWiFiNetwork();
void UpdateNetworkingStatus();
static SlWiFiDriver & GetInstance()
{
static SlWiFiDriver instance;
return instance;
}
private:
bool NetworkMatch(const WiFiNetwork & network, ByteSpan networkId);
bool StartScanWiFiNetworks(ByteSpan ssid);
static void OnScanWiFiNetworkDone(wfx_wifi_scan_result_t * aScanResult);
WiFiNetwork mSavedNetwork = {};
WiFiNetwork mStagingNetwork = {};
ScanCallback * mpScanCallback;
ConnectCallback * mpConnectCallback;
NetworkStatusChangeCallback * mpStatusChangeCallback = nullptr;
};
} // namespace NetworkCommissioning
} // namespace DeviceLayer
} // namespace chip
#endif