Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 79d35ef

Browse files
WiFi: Support for hidden networks and misc fixes.
- Add support for connecting to hidden networks (issue #855). - Implement `begin()` for OPEN security. - Deprecate WEP security (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 79d35ef

File tree

2 files changed

+78
-40
lines changed

2 files changed

+78
-40
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) {
86+
return begin(ssid, NULL, ENC_TYPE_NONE);
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_UNKNOWN;
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 & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,6 @@ class WiFiClass : public MbedSocketClass {
6767
*/
6868
int begin(const char* ssid);
6969

70-
/* Start Wifi connection with WEP encryption.
71-
* Configure a key into the device. The key type (WEP-40, WEP-104)
72-
* is determined by the size of the key (5 bytes for WEP-40, 13 bytes for WEP-104).
73-
*
74-
* param ssid: Pointer to the SSID string.
75-
* param key_idx: The key index to set. Valid values are 0-3.
76-
* param key: Key input buffer.
77-
*/
78-
int begin(const char* ssid, uint8_t key_idx, const char* key);
79-
8070
void MACAddress(uint8_t *mac_address);
8171

8272
/* Start Wifi connection with passphrase
@@ -86,7 +76,7 @@ class WiFiClass : public MbedSocketClass {
8676
* param passphrase: Passphrase. Valid characters in a passphrase
8777
* must be between ASCII 32-126 (decimal).
8878
*/
89-
int begin(const char* ssid, const char* passphrase);
79+
int begin(const char* ssid, const char* passphrase, wl_enc_type security = ENC_TYPE_CCMP);
9080

9181
// Inherit config methods from the parent class
9282
using MbedSocketClass::config;
@@ -201,6 +191,7 @@ class WiFiClass : public MbedSocketClass {
201191
WiFiInterface* wifi_if = nullptr;
202192
WiFiAccessPoint* ap_list = nullptr;
203193
uint8_t connected_ap;
194+
nsapi_security_t _security;
204195
int setSSID(const char* ssid);
205196
void ensureDefaultAPNetworkConfiguration();
206197
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)

AltStyle によって変換されたページ (->オリジナル) /