-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathWifiInterfaceAbstraction.h
309 lines (270 loc) · 8.92 KB
/
WifiInterfaceAbstraction.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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
/*
*
* Copyright (c) 2022 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
#include <app/icd/server/ICDServerConfig.h>
#include <cmsis_os2.h>
#include <lib/support/BitFlags.h>
#include <platform/silabs/wifi/wfx_msgs.h>
#include <sl_cmsis_os2_common.h>
#include "sl_status.h"
#include <lib/core/CHIPError.h>
#include <lib/support/Span.h>
#include <stdbool.h>
/* LwIP includes. */
#include "lwip/ip_addr.h"
#include "lwip/netif.h"
#include "lwip/netifapi.h"
#include "lwip/tcpip.h"
#if (SLI_SI91X_MCU_INTERFACE | EXP_BOARD)
#include "rsi_common_apis.h"
#include "sl_si91x_types.h"
#include "sl_wifi_constants.h"
#include "sl_wifi_device.h"
/*
* Interface to RSI Sapis
*/
#define WFX_RSI_DHCP_POLL_INTERVAL (250) /* Poll interval in ms for DHCP */
// MAX SSID LENGTH excluding NULL character
#define WFX_MAX_SSID_LENGTH (32)
// MAX PASSKEY LENGTH including NULL character
#define WFX_MAX_PASSKEY_LENGTH (SL_WIFI_MAX_PSK_LENGTH)
#define SL_WIFI_ALLOCATE_COMMAND_BUFFER_WAIT_TIME_MS (1000)
#else
// MAX SSID LENGTH excluding NULL character
#define WFX_MAX_SSID_LENGTH (32)
// MAX PASSKEY LENGTH including NULL character
#define WFX_MAX_PASSKEY_LENGTH (64)
#endif // (SLI_SI91X_MCU_INTERFACE | EXP_BOARD)
#define MAX_JOIN_RETRIES_COUNT (5)
#define BSSID_LEN (6)
#define MAC_ADDRESS_FIRST_OCTET (6)
#define CONNECTION_STATUS_SUCCESS (1)
#define IP_STATUS_FAIL (0)
#define GET_IPV6_FAIL (0)
#define IP_STATUS_SUCCESS (1)
// TASK and Interrupt Macros
#define SUCCESS_STATUS (1)
using namespace ::chip;
enum class WifiState : uint16_t
{
kStationInit = (1 << 0),
kAPReady = (1 << 1),
kStationProvisioned = (1 << 2),
kStationConnecting = (1 << 3),
kStationConnected = (1 << 4),
kStationDhcpDone = (1 << 6), /* Requested to do DHCP after conn */
kStationMode = (1 << 7), /* Enable Station Mode */
kAPMode = (1 << 8), /* Enable AP Mode */
kStationReady = (kStationConnected | kStationDhcpDone),
kStationStarted = (1 << 9), /* RSI task started */
kScanStarted = (1 << 10), /* Scan Started */
};
enum class WifiEvent : uint8_t
{
kStationConnect = 0,
kStationDisconnect = 1,
kAPStart = 2,
kAPStop = 3,
kScan = 4, /* This is used as scan result and start */
kStationStartJoin = 5,
kStationDoDhcp = 6,
kStationDhcpDone = 7,
kStationDhcpPoll = 8
};
typedef enum
{
WIFI_EVENT,
IP_EVENT,
} wfx_event_base_t;
/* Note that these are same as RSI_security */
typedef enum
{
WFX_SEC_UNSPECIFIED = 0,
WFX_SEC_NONE = 1,
WFX_SEC_WEP = 2,
WFX_SEC_WPA = 3,
WFX_SEC_WPA2 = 4,
WFX_SEC_WPA3 = 5,
WFX_SEC_WPA_WPA2_MIXED = 6,
} wfx_sec_t;
typedef struct
{
char ssid[WFX_MAX_SSID_LENGTH + 1] = { 0 };
size_t ssid_length = 0;
char passkey[WFX_MAX_PASSKEY_LENGTH + 1] = { 0 };
size_t passkey_length = 0;
wfx_sec_t security = WFX_SEC_UNSPECIFIED;
} wfx_wifi_provision_t;
typedef enum
{
WIFI_MODE_NULL = 0,
WIFI_MODE_STA,
WIFI_MODE_AP,
WIFI_MODE_APSTA,
WIFI_MODE_MAX,
} wifi_mode_t;
typedef struct wfx_wifi_scan_result
{
char ssid[WFX_MAX_SSID_LENGTH + 1];
size_t ssid_length;
wfx_sec_t security;
uint8_t bssid[BSSID_LEN];
uint8_t chan;
int16_t rssi; /* I suspect this is in dBm - so signed */
} wfx_wifi_scan_result_t;
typedef struct wfx_wifi_scan_ext
{
uint32_t beacon_lost_count;
uint32_t beacon_rx_count;
uint32_t mcast_rx_count;
uint32_t mcast_tx_count;
uint32_t ucast_rx_count;
uint32_t ucast_tx_count;
uint32_t overrun_count;
} wfx_wifi_scan_ext_t;
typedef enum
{
IP_EVENT_STA_GOT_IP,
IP_EVENT_GOT_IP6,
IP_EVENT_STA_LOST_IP,
} ip_event_id_t;
#ifdef RS911X_WIFI
/*
* This Sh%t is here to support WFXUtils - and the Matter stuff that uses it
* We took it from the SDK (for WF200)
*/
typedef enum
{
SL_WFX_STA_INTERFACE = 0, ///< Interface 0, linked to the station
SL_WFX_SOFTAP_INTERFACE = 1, ///< Interface 1, linked to the softap
} sl_wfx_interface_t;
#endif
typedef struct wfx_rsi_s
{
chip::BitFlags<WifiState> dev_state;
uint16_t ap_chan; /* The chan our STA is using */
wfx_wifi_provision_t sec;
#ifdef SL_WFX_CONFIG_SCAN
void (*scan_cb)(wfx_wifi_scan_result_t *);
char * scan_ssid; /* Which one are we scanning for */
size_t scan_ssid_length;
#endif
#ifdef SL_WFX_CONFIG_SOFTAP
sl_wfx_mac_address_t softap_mac;
#endif
sl_wfx_mac_address_t sta_mac;
sl_wfx_mac_address_t ap_mac; /* To which our STA is connected */
sl_wfx_mac_address_t ap_bssid; /* To which our STA is connected */
uint16_t join_retries;
uint8_t ip4_addr[4]; /* Not sure if this is enough */
} WfxRsi_t;
sl_status_t wfx_wifi_start(void);
void wfx_enable_sta_mode(void);
void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * addr);
void wfx_set_wifi_provision(wfx_wifi_provision_t * wifiConfig);
bool wfx_get_wifi_provision(wfx_wifi_provision_t * wifiConfig);
bool wfx_is_sta_mode_enabled(void);
int32_t wfx_get_ap_info(wfx_wifi_scan_result_t * ap);
int32_t wfx_get_ap_ext(wfx_wifi_scan_ext_t * extra_info);
int32_t wfx_reset_counts();
void wfx_clear_wifi_provision(void);
sl_status_t wfx_connect_to_ap(void);
void wfx_setup_ip6_link_local(sl_wfx_interface_t);
bool wfx_is_sta_connected(void);
sl_status_t sl_matter_wifi_disconnect(void);
#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
bool wfx_have_ipv4_addr(sl_wfx_interface_t);
#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
bool wfx_have_ipv6_addr(sl_wfx_interface_t);
wifi_mode_t wfx_get_wifi_mode(void);
CHIP_ERROR wfx_start_scan(chip::ByteSpan ssid,
void (*scan_cb)(wfx_wifi_scan_result_t *)); /* true returned if successfully started */
void wfx_cancel_scan(void);
/*
* Call backs into the Matter Platform code
*/
void sl_matter_wifi_task_started(void);
void wfx_connected_notify(int32_t status, sl_wfx_mac_address_t * ap);
void wfx_disconnected_notify(int32_t status);
/* Implemented for LWIP */
void wfx_lwip_set_sta_link_up(void);
void wfx_lwip_set_sta_link_down(void);
void sl_matter_lwip_start(void);
struct netif * wfx_get_netif(sl_wfx_interface_t interface);
#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
void wfx_dhcp_got_ipv4(uint32_t);
void wfx_ip_changed_notify(int got_ip);
#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
void wfx_ipv6_notify(int got_ip);
void wfx_retry_connection(uint16_t retryAttempt);
#ifdef RS911X_WIFI
#if !(EXP_BOARD) // for RS9116
void * wfx_rsi_alloc_pkt(void);
/* RSI for LWIP */
void wfx_rsi_pkt_add_data(void * p, uint8_t * buf, uint16_t len, uint16_t off);
int32_t wfx_rsi_send_data(void * p, uint16_t len);
#endif //!(EXP_BOARD)
#endif // RS911X_WIFI
bool wfx_hw_ready(void);
#if CHIP_CONFIG_ENABLE_ICD_SERVER
#ifdef RS911X_WIFI // for RS9116, 917 NCP and 917 SoC
/* RSI Power Save */
#if (SLI_SI91X_MCU_INTERFACE | EXP_BOARD)
sl_status_t ConfigurePowerSave(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_si91x_performance_profile_t sl_si91x_wifi_state,
uint32_t listenInterval);
#else
sl_status_t ConfigurePowerSave();
#endif /* (SLI_SI91X_MCU_INTERFACE | EXP_BOARD) */
#endif /* RS911X_WIFI */
/**
* @brief Configures the broadcast filter.
*
* @param[in] enableBroadcastFilter Boolean to enable or disable the broadcast filter.
* @return sl_status_t Returns the status of the operation.
*/
sl_status_t ConfigureBroadcastFilter(bool enableBroadcastFilter);
#endif // CHIP_CONFIG_ENABLE_ICD_SERVER
void sl_matter_wifi_task(void * arg);
#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
void wfx_ip_changed_notify(int got_ip);
#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t * ap);
int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t * extra_info);
int32_t wfx_rsi_reset_count();
int32_t sl_wifi_platform_disconnect();
/**
* @brief Posts an event to the Wi-Fi task
*
* @param[in] event Event to process.
*/
void sl_matter_wifi_post_event(WifiEvent event);
#ifdef __cplusplus
extern "C" {
#endif
#if (SLI_SI91X_MCU_INTERFACE)
#if SL_ICD_ENABLED
// TODO : This should be moved outside of the Wifi interface functions
void sl_button_on_change(uint8_t btn, uint8_t btnAction);
#endif /* SL_ICD_ENABLED */
#endif /* SLI_SI91X_MCU_INTERFACE */
#ifdef WF200_WIFI
void sl_wfx_host_gpio_init(void);
void wfx_bus_start(void);
#endif /* WF200_WIFI */
#ifdef __cplusplus
}
#endif