Skip to content

Commit 86f7a38

Browse files
committed
Add wifi.radio.addresses, .addresses_ap, .dns
1 parent 9088488 commit 86f7a38

File tree

7 files changed

+170
-24
lines changed

7 files changed

+170
-24
lines changed

ports/espressif/common-hal/socketpool/Socket.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
#include "components/lwip/lwip/src/include/lwip/netdb.h"
2727
#include "components/vfs/include/esp_vfs_eventfd.h"
2828

29-
static void resolve_host_or_throw(socketpool_socket_obj_t *self, const char *hostname, struct sockaddr_storage *addr, int port) {
29+
void socketpool_resolve_host_or_throw(int family, int type, const char *hostname, struct sockaddr_storage *addr, int port) {
3030
struct addrinfo *result_i;
3131
const struct addrinfo hints = {
32-
.ai_family = self->family,
33-
.ai_socktype = self->type,
32+
.ai_family = family,
33+
.ai_socktype = type,
3434
};
3535
int error = socketpool_getaddrinfo_common(hostname, port, &hints, &result_i);
3636
if (error != 0 || result_i == NULL) {
@@ -40,6 +40,10 @@ static void resolve_host_or_throw(socketpool_socket_obj_t *self, const char *hos
4040
lwip_freeaddrinfo(result_i);
4141
}
4242

43+
static void resolve_host_or_throw(socketpool_socket_obj_t *self, const char *hostname, struct sockaddr_storage *addr, int port) {
44+
socketpool_resolve_host_or_throw(self->family, self->type, hostname, addr, port);
45+
}
46+
4347
StackType_t socket_select_stack[2 * configMINIMAL_STACK_SIZE];
4448

4549
/* Socket state table:

ports/espressif/common-hal/socketpool/__init__.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99
struct addrinfo;
1010

1111
int socketpool_getaddrinfo_common(const char *host, int service, const struct addrinfo *hints, struct addrinfo **res);
12+
void socketpool_resolve_host_or_throw(int family, int type, const char *hostname, struct sockaddr_storage *addr, int port);

ports/espressif/common-hal/wifi/Radio.c

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "shared-bindings/wifi/AuthMode.h"
2121
#include "shared-bindings/time/__init__.h"
2222
#include "shared-module/ipaddress/__init__.h"
23+
#include "common-hal/socketpool/__init__.h"
2324

2425
#include "components/esp_netif/include/esp_netif_net_stack.h"
2526
#include "components/esp_wifi/include/esp_wifi.h"
@@ -452,24 +453,38 @@ mp_obj_t common_hal_wifi_radio_get_ipv4_subnet_ap(wifi_radio_obj_t *self) {
452453
return common_hal_ipaddress_new_ipv4address(self->ap_ip_info.netmask.addr);
453454
}
454455

455-
mp_obj_t common_hal_wifi_radio_get_ipv6_addresses(wifi_radio_obj_t *self) {
456-
if (!esp_netif_is_netif_up(self->netif)) {
457-
return mp_const_none;
456+
static mp_obj_t common_hal_wifi_radio_get_addresses_netif(wifi_radio_obj_t *self, esp_netif_t *netif) {
457+
if (!esp_netif_is_netif_up(netif)) {
458+
return mp_const_empty_tuple;
458459
}
460+
esp_netif_ip_info_t ip_info;
461+
esp_netif_get_ip_info(netif, &ip_info);
462+
int n_addresses4 = ip_info.ip.addr != INADDR_NONE;
463+
459464
esp_ip6_addr_t addresses[LWIP_IPV6_NUM_ADDRESSES];
460-
int n_addresses = esp_netif_get_all_ip6(self->netif, &addresses[0]);
461-
if (!n_addresses) {
462-
return mp_const_none;
463-
}
465+
int n_addresses6 = esp_netif_get_all_ip6(netif, &addresses[0]);
466+
int n_addresses = n_addresses4 + n_addresses6;
467+
464468
mp_obj_tuple_t *result = MP_OBJ_TO_PTR(mp_obj_new_tuple(n_addresses, NULL));
465-
for (int i = 0; i < n_addresses; i++) {
466-
char buf[IP6ADDR_STRLEN_MAX];
467-
inet_ntop(AF_INET6, &addresses[i], buf, sizeof(buf));
468-
result->items[i] = mp_obj_new_str(buf, strlen(buf));
469+
for (int i = 0; i < n_addresses6; i++) {
470+
result->items[i] = espaddr6_to_str(&addresses[i]);
469471
}
472+
473+
if (n_addresses4) {
474+
result->items[n_addresses6] = espaddr4_to_str(&ip_info.ip);
475+
}
476+
470477
return MP_OBJ_FROM_PTR(result);
471478
}
472479

480+
mp_obj_t common_hal_wifi_radio_get_addresses(wifi_radio_obj_t *self) {
481+
return common_hal_wifi_radio_get_addresses_netif(self, self->netif);
482+
}
483+
484+
mp_obj_t common_hal_wifi_radio_get_addresses_ap(wifi_radio_obj_t *self) {
485+
return common_hal_wifi_radio_get_addresses_netif(self, self->ap_netif);
486+
}
487+
473488
uint32_t wifi_radio_get_ipv4_address(wifi_radio_obj_t *self) {
474489
if (!esp_netif_is_netif_up(self->netif)) {
475490
return 0;
@@ -501,6 +516,9 @@ mp_obj_t common_hal_wifi_radio_get_ipv4_dns(wifi_radio_obj_t *self) {
501516

502517
esp_netif_get_dns_info(self->netif, ESP_NETIF_DNS_MAIN, &self->dns_info);
503518

519+
if (self->dns_info.ip.type != ESP_IPADDR_TYPE_V4) {
520+
return mp_const_none;
521+
}
504522
// dns_info is of type esp_netif_dns_info_t, which is just ever so slightly
505523
// different than esp_netif_ip_info_t used for
506524
// common_hal_wifi_radio_get_ipv4_address (includes both ipv4 and 6),
@@ -621,3 +639,21 @@ void common_hal_wifi_radio_gc_collect(wifi_radio_obj_t *self) {
621639
// Only bother to scan the actual object references.
622640
gc_collect_ptr(self->current_scan);
623641
}
642+
643+
mp_obj_t common_hal_wifi_radio_get_dns(wifi_radio_obj_t *self) {
644+
if (!esp_netif_is_netif_up(self->netif)) {
645+
return mp_const_none;
646+
}
647+
648+
esp_netif_get_dns_info(self->netif, ESP_NETIF_DNS_MAIN, &self->dns_info);
649+
650+
return espaddr_to_str(&self->dns_info.ip);
651+
}
652+
653+
void common_hal_wifi_radio_set_dns(wifi_radio_obj_t *self, mp_obj_t dns_addr_obj) {
654+
struct sockaddr_storage addr_storage;
655+
socketpool_resolve_host_or_throw(AF_UNSPEC, SOCK_STREAM, mp_obj_str_get_str(dns_addr_obj), &addr_storage, 1);
656+
esp_netif_dns_info_t dns_info;
657+
sockaddr_to_espaddr(&addr_storage, &dns_info.ip);
658+
esp_netif_set_dns_info(self->netif, ESP_NETIF_DNS_MAIN, &dns_info);
659+
}

ports/espressif/common-hal/wifi/__init__.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ wifi_radio_obj_t common_hal_wifi_radio_obj;
2727
#include "supervisor/port.h"
2828
#include "supervisor/workflow.h"
2929

30+
#include "lwip/sockets.h"
31+
3032
#if CIRCUITPY_STATUS_BAR
3133
#include "supervisor/shared/status_bar.h"
3234
#endif
@@ -255,3 +257,61 @@ void ipaddress_ipaddress_to_esp_idf_ip4(mp_obj_t ip_address, esp_ip4_addr_t *esp
255257
void common_hal_wifi_gc_collect(void) {
256258
common_hal_wifi_radio_gc_collect(&common_hal_wifi_radio_obj);
257259
}
260+
261+
static mp_obj_t espaddrx_to_str(const void *espaddr, uint8_t esptype) {
262+
char buf[IPADDR_STRLEN_MAX];
263+
inet_ntop(esptype == ESP_IPADDR_TYPE_V6 ? AF_INET6 : AF_INET, espaddr, buf, sizeof(buf));
264+
return mp_obj_new_str(buf, strlen(buf));
265+
}
266+
267+
mp_obj_t espaddr_to_str(const esp_ip_addr_t *espaddr) {
268+
return espaddrx_to_str(espaddr, espaddr->type);
269+
}
270+
271+
mp_obj_t espaddr4_to_str(const esp_ip4_addr_t *espaddr) {
272+
return espaddrx_to_str(espaddr, ESP_IPADDR_TYPE_V4);
273+
}
274+
275+
mp_obj_t espaddr6_to_str(const esp_ip6_addr_t *espaddr) {
276+
return espaddrx_to_str(espaddr, ESP_IPADDR_TYPE_V6);
277+
}
278+
279+
mp_obj_t sockaddr_to_str(const struct sockaddr_storage *sockaddr) {
280+
char buf[IPADDR_STRLEN_MAX];
281+
if (sockaddr->ss_family == AF_INET6) {
282+
const struct sockaddr_in6 *addr6 = (const void *)sockaddr;
283+
inet_ntop(AF_INET6, &addr6->sin6_addr, buf, sizeof(buf));
284+
} else {
285+
const struct sockaddr_in *addr = (const void *)sockaddr;
286+
inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf));
287+
}
288+
return mp_obj_new_str(buf, strlen(buf));
289+
}
290+
291+
void sockaddr_to_espaddr(const struct sockaddr_storage *sockaddr, esp_ip_addr_t *espaddr) {
292+
if (sockaddr->ss_family == AF_INET6) {
293+
const struct sockaddr_in6 *addr6 = (const void *)sockaddr;
294+
MP_STATIC_ASSERT(sizeof(espaddr->u_addr.ip6.addr) == sizeof(addr6->sin6_addr));
295+
memcpy(&espaddr->u_addr.ip6.addr, &addr6->sin6_addr, sizeof(espaddr->u_addr.ip6.addr));
296+
espaddr->u_addr.ip6.zone = addr6->sin6_scope_id;
297+
espaddr->type = ESP_IPADDR_TYPE_V6;
298+
} else {
299+
const struct sockaddr_in *addr = (const void *)sockaddr;
300+
MP_STATIC_ASSERT(sizeof(espaddr->u_addr.ip4.addr) == sizeof(addr->sin_addr));
301+
memcpy(&espaddr->u_addr.ip4.addr, &addr->sin_addr, sizeof(espaddr->u_addr.ip4.addr));
302+
espaddr->type = ESP_IPADDR_TYPE_V4;
303+
}
304+
}
305+
306+
void espaddr_to_sockaddr(const esp_ip_addr_t *espaddr, struct sockaddr_storage *sockaddr, int port) {
307+
if (espaddr->type == ESP_IPADDR_TYPE_V6) {
308+
struct sockaddr_in6 *addr6 = (void *)sockaddr;
309+
MP_STATIC_ASSERT(sizeof(espaddr->u_addr.ip6.addr) == sizeof(addr6->sin6_addr));
310+
memcpy(&addr6->sin6_addr, &espaddr->u_addr.ip6.addr, sizeof(espaddr->u_addr.ip6.addr));
311+
addr6->sin6_scope_id = espaddr->u_addr.ip6.zone;
312+
} else {
313+
struct sockaddr_in *addr = (void *)sockaddr;
314+
MP_STATIC_ASSERT(sizeof(espaddr->u_addr.ip4.addr) == sizeof(addr->sin_addr));
315+
memcpy(&addr->sin_addr, &espaddr->u_addr.ip4.addr, sizeof(espaddr->u_addr.ip4.addr));
316+
}
317+
}

ports/espressif/common-hal/wifi/__init__.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,16 @@
1111
#include "lwip/api.h"
1212
#include "components/esp_wifi/include/esp_wifi.h"
1313

14+
struct sockaddr_storage;
15+
1416
void wifi_reset(void);
1517

1618
void ipaddress_ipaddress_to_esp_idf(mp_obj_t ip_address, ip_addr_t *esp_ip_address);
1719
void ipaddress_ipaddress_to_esp_idf_ip4(mp_obj_t ip_address, esp_ip4_addr_t *esp_ip_address);
20+
21+
mp_obj_t sockaddr_to_str(const struct sockaddr_storage *addr);
22+
mp_obj_t espaddr_to_str(const esp_ip_addr_t *espaddr);
23+
mp_obj_t espaddr4_to_str(const esp_ip4_addr_t *espaddr);
24+
mp_obj_t espaddr6_to_str(const esp_ip6_addr_t *espaddr);
25+
void sockaddr_to_espaddr(const struct sockaddr_storage *sockaddr, esp_ip_addr_t *espaddr);
26+
void espaddr_to_sockaddr(const esp_ip_addr_t *espaddr, struct sockaddr_storage *sockaddr, int port);

shared-bindings/wifi/Radio.c

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -596,18 +596,29 @@ static mp_obj_t wifi_radio_set_ipv4_address_ap(size_t n_args, const mp_obj_t *po
596596
}
597597
static MP_DEFINE_CONST_FUN_OBJ_KW(wifi_radio_set_ipv4_address_ap_obj, 1, wifi_radio_set_ipv4_address_ap);
598598

599-
//| ipv6_addresses: Sequence[str]
600-
//| """IPv6 address(es) of the station when connected to an access point. None otherwise. (read-only)"""
601-
static mp_obj_t _wifi_radio_get_ipv6_addresses(mp_obj_t self) {
602-
return common_hal_wifi_radio_get_ipv6_addresses(self);
599+
//| addresses: Sequence[str]
600+
//| """Address(es) of the station when connected to an access point. Empty sequence when not connected. (read-only)"""
601+
static mp_obj_t _wifi_radio_get_addresses(mp_obj_t self) {
602+
return common_hal_wifi_radio_get_addresses(self);
603603
}
604-
MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_ipv6_addresses_obj, _wifi_radio_get_ipv6_addresses);
604+
MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_addresses_obj, _wifi_radio_get_addresses);
605+
606+
MP_PROPERTY_GETTER(wifi_radio_addresses_obj,
607+
(mp_obj_t)&wifi_radio_get_addresses_obj);
608+
609+
//| addresses_ap: Sequence[str]
610+
//| """Address(es) of the access point when enabled. Empty sequence when disabled. (read-only)"""
611+
static mp_obj_t _wifi_radio_get_addresses_ap(mp_obj_t self) {
612+
return common_hal_wifi_radio_get_addresses_ap(self);
613+
}
614+
MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_addresses_ap_obj, _wifi_radio_get_addresses_ap);
615+
616+
MP_PROPERTY_GETTER(wifi_radio_addresses_ap_obj,
617+
(mp_obj_t)&wifi_radio_get_addresses_ap_obj);
605618

606-
MP_PROPERTY_GETTER(wifi_radio_ipv6_addresses_obj,
607-
(mp_obj_t)&wifi_radio_get_ipv6_addresses_obj);
608619

609620
#if 0
610-
MP_WEAK mp_obj_t common_hal_wifi_radio_get_ipv6_addresses(wifi_radio_obj_t *self) {
621+
MP_WEAK mp_obj_t common_hal_wifi_radio_get_addresses(wifi_radio_obj_t *self) {
611622
return mp_const_none;
612623
}
613624
#endif
@@ -650,6 +661,24 @@ MP_PROPERTY_GETSET(wifi_radio_ipv4_dns_obj,
650661
(mp_obj_t)&wifi_radio_get_ipv4_dns_obj,
651662
(mp_obj_t)&wifi_radio_set_ipv4_dns_obj);
652663

664+
//| dns: str
665+
//| """Address of the DNS server to be used."""
666+
static mp_obj_t wifi_radio_get_dns(mp_obj_t self) {
667+
return common_hal_wifi_radio_get_dns(self);
668+
}
669+
MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_dns_obj, wifi_radio_get_dns);
670+
671+
static mp_obj_t wifi_radio_set_dns(mp_obj_t self, mp_obj_t dns_addr) {
672+
common_hal_wifi_radio_set_dns(self, dns_addr);
673+
674+
return mp_const_none;
675+
}
676+
MP_DEFINE_CONST_FUN_OBJ_2(wifi_radio_set_dns_obj, wifi_radio_set_dns);
677+
678+
MP_PROPERTY_GETSET(wifi_radio_dns_obj,
679+
(mp_obj_t)&wifi_radio_get_dns_obj,
680+
(mp_obj_t)&wifi_radio_set_dns_obj);
681+
653682
//| ap_info: Optional[Network]
654683
//| """Network object containing BSSID, SSID, authmode, channel, country and RSSI when connected to an access point. None otherwise."""
655684
static mp_obj_t wifi_radio_get_ap_info(mp_obj_t self) {
@@ -784,11 +813,14 @@ static const mp_rom_map_elem_t wifi_radio_locals_dict_table[] = {
784813
{ MP_ROM_QSTR(MP_QSTR_ipv4_subnet_ap), MP_ROM_PTR(&wifi_radio_ipv4_subnet_ap_obj) },
785814
{ MP_ROM_QSTR(MP_QSTR_ipv4_address), MP_ROM_PTR(&wifi_radio_ipv4_address_obj) },
786815
{ MP_ROM_QSTR(MP_QSTR_ipv4_address_ap), MP_ROM_PTR(&wifi_radio_ipv4_address_ap_obj) },
787-
{ MP_ROM_QSTR(MP_QSTR_ipv6_addresses), MP_ROM_PTR(&wifi_radio_ipv6_addresses_obj) },
788816

789817
{ MP_ROM_QSTR(MP_QSTR_set_ipv4_address), MP_ROM_PTR(&wifi_radio_set_ipv4_address_obj) },
790818
{ MP_ROM_QSTR(MP_QSTR_set_ipv4_address_ap), MP_ROM_PTR(&wifi_radio_set_ipv4_address_ap_obj) },
791819

820+
{ MP_ROM_QSTR(MP_QSTR_addresses), MP_ROM_PTR(&wifi_radio_addresses_obj) },
821+
{ MP_ROM_QSTR(MP_QSTR_addresses_ap), MP_ROM_PTR(&wifi_radio_addresses_ap_obj) },
822+
{ MP_ROM_QSTR(MP_QSTR_dns), MP_ROM_PTR(&wifi_radio_dns_obj) },
823+
792824
{ MP_ROM_QSTR(MP_QSTR_ping), MP_ROM_PTR(&wifi_radio_ping_obj) },
793825
};
794826

shared-bindings/wifi/Radio.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,11 @@ uint32_t wifi_radio_get_ipv4_address(wifi_radio_obj_t *self);
105105
extern mp_obj_t common_hal_wifi_radio_get_ipv4_address(wifi_radio_obj_t *self);
106106
extern mp_obj_t common_hal_wifi_radio_get_ipv4_address_ap(wifi_radio_obj_t *self);
107107

108-
mp_obj_t common_hal_wifi_radio_get_ipv6_addresses(wifi_radio_obj_t *self);
108+
mp_obj_t common_hal_wifi_radio_get_addresses(wifi_radio_obj_t *self);
109+
mp_obj_t common_hal_wifi_radio_get_addresses_ap(wifi_radio_obj_t *self);
110+
111+
extern mp_obj_t common_hal_wifi_radio_get_dns(wifi_radio_obj_t *self);
112+
extern void common_hal_wifi_radio_set_dns(wifi_radio_obj_t *self, mp_obj_t dns_addr);
109113

110114
extern void common_hal_wifi_radio_set_ipv4_address(wifi_radio_obj_t *self, mp_obj_t ipv4, mp_obj_t netmask, mp_obj_t gateway, mp_obj_t ipv4_dns_addr);
111115
extern void common_hal_wifi_radio_set_ipv4_address_ap(wifi_radio_obj_t *self, mp_obj_t ipv4, mp_obj_t netmask, mp_obj_t gateway);

0 commit comments

Comments
 (0)