Skip to content

Commit 1277a11

Browse files
committed
WiFi: Support for hidden networks and misc fixes.
- Add support for connecting to hidden networks (issue #855). - Implement `begin()` for WEP (issue #819). - Add sanity checks to all functions accepting network index from the user. Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
1 parent 59ec204 commit 1277a11

File tree

2 files changed

+78
-30
lines changed

2 files changed

+78
-30
lines changed

libraries/WiFi/src/WiFi.cpp

Lines changed: 76 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,39 @@
33
#define SSID_MAX_LENGTH 32
44
#define SSID_MAX_COUNT 64
55

6+
static uint8_t sec2enum(nsapi_security_t sec) {
7+
switch (sec) {
8+
case NSAPI_SECURITY_NONE:
9+
return ENC_TYPE_NONE;
10+
case NSAPI_SECURITY_WEP:
11+
return ENC_TYPE_WEP;
12+
case NSAPI_SECURITY_WPA:
13+
return ENC_TYPE_TKIP;
14+
case NSAPI_SECURITY_WPA2:
15+
return ENC_TYPE_CCMP;
16+
case NSAPI_SECURITY_WPA_WPA2:
17+
return ENC_TYPE_CCMP;
18+
case NSAPI_SECURITY_UNKNOWN:
19+
default:
20+
return ENC_TYPE_AUTO;
21+
}
22+
}
23+
24+
static nsapi_security_t enum2sec(wl_enc_type sec) {
25+
switch (sec) {
26+
case ENC_TYPE_NONE:
27+
return NSAPI_SECURITY_NONE;
28+
case ENC_TYPE_WEP:
29+
return NSAPI_SECURITY_WEP;
30+
case ENC_TYPE_TKIP:
31+
return NSAPI_SECURITY_WPA;
32+
case ENC_TYPE_CCMP:
33+
return NSAPI_SECURITY_WPA_WPA2;
34+
default:
35+
return NSAPI_SECURITY_UNKNOWN;
36+
}
37+
}
38+
639
bool arduino::WiFiClass::isVisible(const char* ssid) {
740
for (int i = 0; i < SSID_MAX_COUNT; i++) {
841
if (strncmp(ap_list[i].get_ssid(), ssid, SSID_MAX_LENGTH) == 0) {
@@ -13,18 +46,21 @@ bool arduino::WiFiClass::isVisible(const char* ssid) {
1346
return false;
1447
}
1548

16-
int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) {
49+
int arduino::WiFiClass::begin(const char* ssid, const char* passphrase, wl_enc_type security) {
1750
if (wifi_if == nullptr) {
1851
return 0;
1952
}
2053

2154
wifi_if->attach(&arduino::WiFiClass::statusCallback);
2255

2356
scanNetworks();
24-
// use scan result to populate security field
25-
if (!isVisible(ssid)) {
26-
_currentNetworkStatus = WL_CONNECT_FAILED;
27-
return _currentNetworkStatus;
57+
58+
if (isVisible(ssid)) {
59+
// Set the network security mode from the scan result.
60+
_security = ap_list[connected_ap].get_security();
61+
} else {
62+
// For hidden networks, the security mode must be set explicitly.
63+
_security = enum2sec(security);
2864
}
2965

3066
wifi_if->set_dhcp(!_useStaticIP);
@@ -36,7 +72,7 @@ int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) {
3672
wifi_if->add_dns_server(_dnsServer1, if_name); // pushes dnsServer2 at index 1
3773
}
3874

39-
nsapi_error_t result = wifi_if->connect(ssid, passphrase, ap_list[connected_ap].get_security());
75+
nsapi_error_t result = wifi_if->connect(ssid, passphrase, _security);
4076

4177
if(result == NSAPI_ERROR_IS_CONNECTED) {
4278
wifi_if->disconnect();
@@ -46,6 +82,10 @@ int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) {
4682
return _currentNetworkStatus;
4783
}
4884

85+
int arduino::WiFiClass::begin(const char* ssid, uint8_t key_idx, const char* key) {
86+
return begin(ssid, key, ENC_TYPE_WEP);
87+
}
88+
4989
//Config Wifi to set Static IP && Disable DHCP
5090
void arduino::WiFiClass::config(const char* localip, const char* netmask, const char* gateway){
5191
SocketHelpers::config(IPAddress(localip), dnsIP(0), IPAddress(gateway), IPAddress(netmask));
@@ -161,25 +201,8 @@ int arduino::WiFiClass::setSSID(const char* ssid) {
161201
return 1;
162202
}
163203

164-
static uint8_t sec2enum(nsapi_security_t sec) {
165-
switch (sec) {
166-
case NSAPI_SECURITY_NONE:
167-
return ENC_TYPE_NONE;
168-
case NSAPI_SECURITY_WEP:
169-
return ENC_TYPE_WEP;
170-
case NSAPI_SECURITY_WPA:
171-
return ENC_TYPE_TKIP;
172-
case NSAPI_SECURITY_WPA2:
173-
return ENC_TYPE_CCMP;
174-
case NSAPI_SECURITY_WPA_WPA2:
175-
return ENC_TYPE_CCMP;
176-
case NSAPI_SECURITY_UNKNOWN:
177-
default:
178-
return ENC_TYPE_AUTO;
179-
}
180-
}
181-
182204
int8_t arduino::WiFiClass::scanNetworks() {
205+
connected_ap = SSID_MAX_COUNT;
183206
uint8_t count = SSID_MAX_COUNT;
184207
if (ap_list != nullptr) {
185208
free(ap_list);
@@ -189,23 +212,39 @@ int8_t arduino::WiFiClass::scanNetworks() {
189212
}
190213

191214
char* arduino::WiFiClass::SSID(uint8_t networkItem) {
215+
if (networkItem >= SSID_MAX_COUNT) {
216+
return NULL;
217+
}
192218
return (char*)ap_list[networkItem].get_ssid();
193219
}
194220

195221
int32_t arduino::WiFiClass::RSSI(uint8_t networkItem) {
222+
if (networkItem >= SSID_MAX_COUNT) {
223+
return 0;
224+
}
196225
return ap_list[networkItem].get_rssi();
197226
}
198227

199228
uint8_t arduino::WiFiClass::encryptionType(uint8_t networkItem) {
229+
if (networkItem >= SSID_MAX_COUNT) {
230+
return ENC_TYPE_NONE;
231+
}
200232
return sec2enum(ap_list[networkItem].get_security());
201233
}
202234

203235
uint8_t* arduino::WiFiClass::BSSID(uint8_t networkItem, uint8_t* bssid) {
204-
memcpy(bssid, ap_list[networkItem].get_bssid(), 6);
236+
if (networkItem >= SSID_MAX_COUNT) {
237+
memset(bssid, 0, 6);
238+
} else {
239+
memcpy(bssid, ap_list[networkItem].get_bssid(), 6);
240+
}
205241
return bssid;
206242
}
207243

208244
uint8_t arduino::WiFiClass::channel(uint8_t networkItem) {
245+
if (networkItem >= SSID_MAX_COUNT) {
246+
return -1;
247+
}
209248
return ap_list[networkItem].get_channel();
210249
}
211250

@@ -218,13 +257,21 @@ uint8_t arduino::WiFiClass::status() {
218257
}
219258

220259
uint8_t arduino::WiFiClass::encryptionType() {
221-
return sec2enum(ap_list[connected_ap].get_security());
260+
if (connected_ap >= SSID_MAX_COUNT) {
261+
return sec2enum(_security);
262+
} else {
263+
return sec2enum(ap_list[connected_ap].get_security());
264+
}
222265
}
223266

224267
uint8_t* arduino::WiFiClass::BSSID(unsigned char* bssid) {
225-
const uint8_t* reverse_bssid = ap_list[connected_ap].get_bssid();
226-
for (int b = 0; b < 6; b++) {
227-
bssid[b] = reverse_bssid[5 - b];
268+
if (connected_ap >= SSID_MAX_COUNT) {
269+
memset(bssid, 0, 6);
270+
} else {
271+
const uint8_t* reverse_bssid = ap_list[connected_ap].get_bssid();
272+
for (int b = 0; b < 6; b++) {
273+
bssid[b] = reverse_bssid[5 - b];
274+
}
228275
}
229276
return bssid;
230277
}

libraries/WiFi/src/WiFi.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class WiFiClass : public MbedSocketClass {
8686
* param passphrase: Passphrase. Valid characters in a passphrase
8787
* must be between ASCII 32-126 (decimal).
8888
*/
89-
int begin(const char* ssid, const char* passphrase);
89+
int begin(const char* ssid, const char* passphrase, wl_enc_type security = ENC_TYPE_CCMP);
9090

9191
// Inherit config methods from the parent class
9292
using MbedSocketClass::config;
@@ -201,6 +201,7 @@ class WiFiClass : public MbedSocketClass {
201201
WiFiInterface* wifi_if = nullptr;
202202
WiFiAccessPoint* ap_list = nullptr;
203203
uint8_t connected_ap;
204+
nsapi_security_t _security;
204205
int setSSID(const char* ssid);
205206
void ensureDefaultAPNetworkConfiguration();
206207
static void* handleAPEvents(whd_interface_t ifp, const whd_event_header_t* event_header, const uint8_t* event_data, void* handler_user_data);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy