Skip to content

Commit 515bd70

Browse files
committed
more wifi work
1 parent 2f5b8fd commit 515bd70

File tree

6 files changed

+168
-103
lines changed

6 files changed

+168
-103
lines changed

ports/zephyr-cp/common-hal/socketpool/SocketPool.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ void common_hal_socketpool_socketpool_construct(socketpool_socketpool_obj_t *sel
9393
// }
9494

9595
mp_obj_t common_hal_socketpool_getaddrinfo_raise(socketpool_socketpool_obj_t *self, const char *host, int port, int family, int type, int proto, int flags) {
96+
printk("common_hal_socketpool_getaddrinfo_raise\n");
9697
// const struct addrinfo hints = {
9798
// .ai_flags = flags,
9899
// .ai_family = family,

ports/zephyr-cp/common-hal/wifi/Radio.c

Lines changed: 46 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t
334334
params.ssid_length = ssid_len;
335335
params.psk = password;
336336
params.psk_length = password_len;
337-
params.timeout = (int)timeout;
337+
params.timeout = 5; // (int)timeout;
338338
params.channel = WIFI_CHANNEL_ANY;
339339
params.security = WIFI_SECURITY_TYPE_NONE;
340340
if (password_len > 0) {
@@ -352,118 +352,64 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t
352352
if (bssid_len > 0) {
353353
memcpy(params.bssid, bssid, bssid_len);
354354
}
355+
// Check to see if we're already connected
356+
// if we are to the network we want
357+
// then return immediately
358+
// if not
359+
// then disconnect.
355360
printk("net_mgmt\n");
356361
int res = net_mgmt(NET_REQUEST_WIFI_CONNECT, self->sta_netif, &params, sizeof(params));
357362
printk("net_mgmt returned\n");
358363
if (res != 0) {
359364
printk("Failed to start connect to wifi %d\n", res);
360365
return WIFI_RADIO_ERROR_AUTH_FAIL;
361366
}
362-
printk("sleeping past timeout %f\n", timeout);
363-
k_sleep(K_SECONDS(timeout + 2));
364-
365-
printk("sleeping 30 more seconds\n");
366-
k_sleep(K_SECONDS(30));
367-
// EventBits_t bits;
368-
// // can't block since both bits are false after wifi_init
369-
// // both bits are true after an existing connection stops
370-
// bits = xEventGroupWaitBits(self->event_group_handle,
371-
// WIFI_CONNECTED_BIT | WIFI_DISCONNECTED_BIT,
372-
// pdTRUE,
373-
// pdTRUE,
374-
// 0);
375-
// bool connected = ((bits & WIFI_CONNECTED_BIT) != 0) &&
376-
// !((bits & WIFI_DISCONNECTED_BIT) != 0);
377-
// if (connected) {
378-
// // SSIDs are up to 32 bytes. Assume it is null terminated if it is less.
379-
// if (memcmp(ssid, config->sta.ssid, ssid_len) == 0 &&
380-
// (ssid_len == 32 || strlen((const char *)config->sta.ssid) == ssid_len)) {
381-
// // Already connected to the desired network.
382-
// return WIFI_RADIO_ERROR_NONE;
383-
// } else {
384-
// xEventGroupClearBits(self->event_group_handle, WIFI_DISCONNECTED_BIT);
385-
// // Trying to switch networks so disconnect first.
386-
// esp_wifi_disconnect();
387-
// do {
388-
// RUN_BACKGROUND_TASKS;
389-
// bits = xEventGroupWaitBits(self->event_group_handle,
390-
// WIFI_DISCONNECTED_BIT,
391-
// pdTRUE,
392-
// pdTRUE,
393-
// 0);
394-
// } while ((bits & WIFI_DISCONNECTED_BIT) == 0 && !mp_hal_is_interrupted());
395-
// }
396-
// }
397-
// // explicitly clear bits since xEventGroupWaitBits may have timed out
398-
// xEventGroupClearBits(self->event_group_handle, WIFI_CONNECTED_BIT);
399-
// xEventGroupClearBits(self->event_group_handle, WIFI_DISCONNECTED_BIT);
400-
// set_mode_station(self, true);
401367

402-
// memcpy(&config->sta.ssid, ssid, ssid_len);
403-
// if (ssid_len < 32) {
404-
// config->sta.ssid[ssid_len] = 0;
405-
// }
406-
// memcpy(&config->sta.password, password, password_len);
407-
// config->sta.password[password_len] = 0;
408-
// config->sta.channel = channel;
409-
// // From esp_wifi_types.h:
410-
// // Generally, station_config.bssid_set needs to be 0; and it needs
411-
// // to be 1 only when users need to check the MAC address of the AP
412-
// if (bssid_len > 0) {
413-
// memcpy(&config->sta.bssid, bssid, bssid_len);
414-
// config->sta.bssid[bssid_len] = 0;
415-
// config->sta.bssid_set = true;
416-
// } else {
417-
// config->sta.bssid_set = false;
418-
// }
419-
// // If channel is 0 (default/unset) and BSSID is not given, do a full scan instead of fast scan
420-
// // This will ensure that the best AP in range is chosen automatically
421-
// if ((config->sta.bssid_set == 0) && (config->sta.channel == 0)) {
422-
// config->sta.scan_method = WIFI_ALL_CHANNEL_SCAN;
423-
// } else {
424-
// config->sta.scan_method = WIFI_FAST_SCAN;
425-
// }
426-
// esp_wifi_set_config(ESP_IF_WIFI_STA, config);
427-
// self->starting_retries = 5;
428-
// self->retries_left = 5;
429-
// esp_wifi_connect();
368+
k_poll_event_init(&self->events[0],
369+
K_POLL_TYPE_SEM_AVAILABLE,
370+
K_POLL_MODE_NOTIFY_ONLY,
371+
&mp_interrupt_sem);
430372

431-
// do {
432-
// RUN_BACKGROUND_TASKS;
433-
// bits = xEventGroupWaitBits(self->event_group_handle,
434-
// WIFI_CONNECTED_BIT | WIFI_DISCONNECTED_BIT,
435-
// pdTRUE,
436-
// pdTRUE,
437-
// 0);
438-
// // Don't retry anymore if we're over our time budget.
439-
// if (self->retries_left > 0 && common_hal_time_monotonic_ms() > end_time) {
440-
// self->retries_left = 0;
441-
// }
442-
// } while ((bits & (WIFI_CONNECTED_BIT | WIFI_DISCONNECTED_BIT)) == 0 && !mp_hal_is_interrupted());
443-
444-
// if ((bits & WIFI_DISCONNECTED_BIT) != 0) {
445-
// if (
446-
// (self->last_disconnect_reason == WIFI_REASON_AUTH_FAIL) ||
447-
// (self->last_disconnect_reason == WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT) ||
448-
// (self->last_disconnect_reason == WIFI_REASON_NO_AP_FOUND_W_COMPATIBLE_SECURITY) ||
449-
// (self->last_disconnect_reason == WIFI_REASON_NO_AP_FOUND_IN_AUTHMODE_THRESHOLD)
450-
// ) {
451-
// return WIFI_RADIO_ERROR_AUTH_FAIL;
452-
// } else if (self->last_disconnect_reason == WIFI_REASON_NO_AP_FOUND) {
453-
// return WIFI_RADIO_ERROR_NO_AP_FOUND;
454-
// }
455-
// return self->last_disconnect_reason;
456-
// } else {
457-
// // We're connected, allow us to retry if we get disconnected.
458-
// self->retries_left = self->starting_retries;
459-
// }
460-
return WIFI_RADIO_ERROR_NONE;
373+
k_poll_signal_init(&self->done);
374+
k_poll_event_init(&self->events[1],
375+
K_POLL_TYPE_SIGNAL,
376+
K_POLL_MODE_NOTIFY_ONLY,
377+
&self->done);
378+
379+
k_poll(self->events, ARRAY_SIZE(self->events), K_FOREVER);
380+
381+
if (mp_hal_is_interrupted()) {
382+
// Do we need to disconnect here?
383+
return WIFI_RADIO_ERROR_UNSPECIFIED;
384+
}
385+
386+
int signaled;
387+
int result;
388+
k_poll_signal_check(&self->done, &signaled, &result);
389+
if (!signaled) {
390+
return WIFI_RADIO_ERROR_UNSPECIFIED;
391+
}
392+
printk("common_hal_wifi_radio_connect done: %d\n", result);
393+
if (result == WIFI_STATUS_CONN_SUCCESS) {
394+
printk("success!\n");
395+
k_sleep(K_SECONDS(30));
396+
return WIFI_RADIO_ERROR_NONE;
397+
} else if (result == WIFI_STATUS_CONN_FAIL) {
398+
return WIFI_RADIO_ERROR_UNSPECIFIED;
399+
} else if (result == WIFI_STATUS_CONN_TIMEOUT) {
400+
return WIFI_RADIO_ERROR_UNSPECIFIED;
401+
} else if (result == WIFI_STATUS_CONN_WRONG_PASSWORD) {
402+
return WIFI_RADIO_ERROR_AUTH_FAIL;
403+
} else if (result == WIFI_STATUS_CONN_AP_NOT_FOUND) {
404+
return WIFI_RADIO_ERROR_NO_AP_FOUND;
405+
}
406+
407+
return WIFI_RADIO_ERROR_UNSPECIFIED;
461408
}
462409

463410
bool common_hal_wifi_radio_get_connected(wifi_radio_obj_t *self) {
464411
printk("common_hal_wifi_radio_get_connected\n");
465-
// return self->sta_mode && esp_netif_is_netif_up(self->netif);
466-
return false;
412+
return net_if_is_up(self->sta_netif);
467413
}
468414

469415
mp_obj_t common_hal_wifi_radio_get_ap_info(wifi_radio_obj_t *self) {

ports/zephyr-cp/common-hal/wifi/Radio.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
typedef struct {
2222
mp_obj_base_t base;
2323
wifi_scannednetworks_obj_t *current_scan;
24+
struct k_poll_signal done;
25+
struct k_poll_event events[2];
2426
// StaticEventGroup_t event_group;
2527
// EventGroupHandle_t event_group_handle;
2628
// wifi_config_t sta_config;

ports/zephyr-cp/common-hal/wifi/__init__.c

Lines changed: 116 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,29 @@ static void _event_handler(struct net_mgmt_event_callback *cb, uint32_t mgmt_eve
6969
break;
7070
case NET_EVENT_WIFI_CONNECT_RESULT:
7171
printk("NET_EVENT_WIFI_CONNECT_RESULT\n");
72+
const struct wifi_status *status = (const struct wifi_status *) cb->info;
73+
printk(" wifi status %d\n", status);
74+
switch (status->conn_status) {
75+
case WIFI_STATUS_CONN_SUCCESS:
76+
printk(" WIFI_STATUS_CONN_SUCCESS\n");
77+
break;
78+
case WIFI_STATUS_CONN_FAIL:
79+
printk(" WIFI_STATUS_CONN_FAIL\n");
80+
break;
81+
case WIFI_STATUS_CONN_WRONG_PASSWORD:
82+
printk(" WIFI_STATUS_CONN_WRONG_PASSWORD\n");
83+
break;
84+
case WIFI_STATUS_CONN_TIMEOUT:
85+
printk(" WIFI_STATUS_CONN_TIMEOUT\n");
86+
break;
87+
case WIFI_STATUS_CONN_AP_NOT_FOUND:
88+
printk(" WIFI_STATUS_CONN_AP_NOT_FOUND\n");
89+
break;
90+
default:
91+
printk(" wifi status %d status %d not found %d timeout %d\n", status->conn_status, status->status, WIFI_STATUS_CONN_AP_NOT_FOUND, WIFI_STATUS_CONN_TIMEOUT);
92+
break;
93+
}
94+
k_poll_signal_raise(&self->done, status->status);
7295
break;
7396
case NET_EVENT_WIFI_DISCONNECT_RESULT:
7497
printk("NET_EVENT_WIFI_DISCONNECT_RESULT\n");
@@ -106,6 +129,97 @@ static void _event_handler(struct net_mgmt_event_callback *cb, uint32_t mgmt_eve
106129
case NET_EVENT_WIFI_AP_STA_DISCONNECTED:
107130
printk("NET_EVENT_WIFI_AP_STA_DISCONNECTED\n");
108131
break;
132+
case NET_EVENT_IF_UP:
133+
printk("NET_EVENT_IF_UP\n");
134+
break;
135+
case NET_EVENT_IF_DOWN:
136+
printk("NET_EVENT_IF_DOWN\n");
137+
break;
138+
case NET_EVENT_L4_CONNECTED:
139+
printk("NET_EVENT_L4_CONNECTED\n");
140+
break;
141+
case NET_EVENT_L4_DISCONNECTED:
142+
printk("NET_EVENT_L4_DISCONNECTED\n");
143+
break;
144+
case NET_EVENT_IPV4_ADDR_ADD:
145+
printk("NET_EVENT_IPV4_ADDR_ADD\n");
146+
break;
147+
case NET_EVENT_SUPPLICANT_READY:
148+
printk("NET_EVENT_SUPPLICANT_READY\n");
149+
break;
150+
case NET_EVENT_SUPPLICANT_NOT_READY:
151+
printk("NET_EVENT_SUPPLICANT_NOT_READY\n");
152+
break;
153+
case NET_EVENT_SUPPLICANT_IFACE_ADDED:
154+
printk("NET_EVENT_SUPPLICANT_IFACE_ADDED\n");
155+
break;
156+
case NET_EVENT_SUPPLICANT_IFACE_REMOVED:
157+
printk("NET_EVENT_SUPPLICANT_IFACE_REMOVED\n");
158+
break;
159+
case NET_EVENT_SUPPLICANT_IFACE_REMOVING:
160+
printk("NET_EVENT_SUPPLICANT_IFACE_REMOVING\n");
161+
break;
162+
case NET_EVENT_SUPPLICANT_INT_EVENT:
163+
printk("NET_EVENT_SUPPLICANT_INT_EVENT\n");
164+
struct supplicant_int_event_data* event_data = (struct supplicant_int_event_data *)cb->info;
165+
union supplicant_event_data* data = (union supplicant_event_data*) event_data->data;
166+
switch (event_data->event) {
167+
case SUPPLICANT_EVENT_CONNECTED:
168+
printk(" SUPPLICANT_EVENT_CONNECTED\n");
169+
break;
170+
case SUPPLICANT_EVENT_DISCONNECTED:
171+
printk(" SUPPLICANT_EVENT_DISCONNECTED\n");
172+
break;
173+
case SUPPLICANT_EVENT_ASSOC_REJECT:
174+
printk(" SUPPLICANT_EVENT_ASSOC_REJECT\n");
175+
break;
176+
case SUPPLICANT_EVENT_AUTH_REJECT:
177+
printk(" SUPPLICANT_EVENT_AUTH_REJECT\n");
178+
break;
179+
case SUPPLICANT_EVENT_TERMINATING:
180+
printk(" SUPPLICANT_EVENT_TERMINATING\n");
181+
break;
182+
case SUPPLICANT_EVENT_SSID_TEMP_DISABLED:
183+
printk(" SUPPLICANT_EVENT_SSID_TEMP_DISABLED\n");
184+
break;
185+
case SUPPLICANT_EVENT_SSID_REENABLED:
186+
printk(" SUPPLICANT_EVENT_SSID_REENABLED\n");
187+
break;
188+
case SUPPLICANT_EVENT_SCAN_STARTED:
189+
printk(" SUPPLICANT_EVENT_SCAN_STARTED\n");
190+
break;
191+
case SUPPLICANT_EVENT_SCAN_RESULTS:
192+
printk(" SUPPLICANT_EVENT_SCAN_RESULTS\n");
193+
break;
194+
case SUPPLICANT_EVENT_SCAN_FAILED:
195+
printk(" SUPPLICANT_EVENT_SCAN_FAILED\n");
196+
break;
197+
case SUPPLICANT_EVENT_BSS_ADDED:
198+
printk(" SUPPLICANT_EVENT_BSS_ADDED\n");
199+
break;
200+
case SUPPLICANT_EVENT_BSS_REMOVED:
201+
printk(" SUPPLICANT_EVENT_BSS_REMOVED\n");
202+
break;
203+
case SUPPLICANT_EVENT_NETWORK_NOT_FOUND:
204+
printk(" SUPPLICANT_EVENT_NETWORK_NOT_FOUND\n");
205+
break;
206+
case SUPPLICANT_EVENT_NETWORK_ADDED:
207+
printk(" SUPPLICANT_EVENT_NETWORK_ADDED\n");
208+
break;
209+
case SUPPLICANT_EVENT_NETWORK_REMOVED:
210+
printk(" SUPPLICANT_EVENT_NETWORK_REMOVED\n");
211+
break;
212+
case SUPPLICANT_EVENT_DSCP_POLICY:
213+
printk(" SUPPLICANT_EVENT_DSCP_POLICY\n");
214+
break;
215+
case SUPPLICANT_EVENT_REGDOM_CHANGE:
216+
printk(" SUPPLICANT_EVENT_REGDOM_CHANGE\n");
217+
break;
218+
default:
219+
printk(" supplicant event %d\n", event_data->event);
220+
break;
221+
}
222+
break;
109223
}
110224
}
111225

@@ -292,8 +406,8 @@ void common_hal_wifi_init(bool user_initiated) {
292406
NET_EVENT_SUPPLICANT_NOT_READY |
293407
NET_EVENT_SUPPLICANT_IFACE_ADDED |
294408
NET_EVENT_SUPPLICANT_IFACE_REMOVED |
295-
NET_EVENT_SUPPLICANT_IFACE_REMOVING |
296-
NET_EVENT_SUPPLICANT_INT_EVENT);
409+
NET_EVENT_SUPPLICANT_IFACE_REMOVING); // |
410+
// NET_EVENT_SUPPLICANT_INT_EVENT);
297411

298412
net_mgmt_init_event_callback(&ipv4_cb, _event_handler, NET_EVENT_IPV4_ADDR_ADD);
299413

ports/zephyr-cp/prj.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,5 @@ CONFIG_DEBUG=y
3030
CONFIG_WIFI_NRF70_LOG_LEVEL_INF=y
3131

3232
CONFIG_WIFI_NM_WPA_SUPPLICANT_THREAD_STACK_SIZE=12288
33+
# For wpa_supplicant use.
34+
CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=8192

shared-bindings/wifi/Radio.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ typedef enum {
5151
WIFI_RADIO_ERROR_HANDSHAKE_TIMEOUT = 204,
5252
WIFI_RADIO_ERROR_CONNECTION_FAIL = 205,
5353
WIFI_RADIO_ERROR_AP_TSF_RESET = 206,
54-
WIFI_RADIO_ERRROR_ROAMING = 207,
54+
WIFI_RADIO_ERROR_ROAMING = 207,
5555
WIFI_RADIO_ASSOC_COMEBACK_TOO_LONG = 208,
5656
WIFI_RADIO_SA_QUERY_TIMEOUT = 209,
5757
WIFI_RADIO_NO_AP_FOUND_W_COMPATIBLE_SECURITY = 210, // collapsed to AUTH_FAIL

0 commit comments

Comments
 (0)