extmod/modlwip: Support family specification in getaddrinfo.
`socket.getaddrinfo()` supports the specification of an address family; however, the LwIP implementation does not use it. This change allows the application to specify the address family request in DNS resolution. If no family is specified, it falls back to the default preference configured with `network.ipconfig()`. Signed-off-by: Jared Hancock <jared.hancock@centeredsolutions.com>
This commit is contained in:
parent
14ccdeb4d7
commit
f10707febb
1 changed files with 16 additions and 3 deletions
|
|
@ -1802,10 +1802,11 @@ static mp_obj_t lwip_getaddrinfo(size_t n_args, const mp_obj_t *args) {
|
|||
mp_obj_t host_in = args[0], port_in = args[1];
|
||||
const char *host = mp_obj_str_get_str(host_in);
|
||||
mp_int_t port = mp_obj_get_int(port_in);
|
||||
mp_int_t family = 0;
|
||||
|
||||
// If constraints were passed then check they are compatible with the supported params
|
||||
if (n_args > 2) {
|
||||
mp_int_t family = mp_obj_get_int(args[2]);
|
||||
family = mp_obj_get_int(args[2]);
|
||||
mp_int_t type = 0;
|
||||
mp_int_t proto = 0;
|
||||
mp_int_t flags = 0;
|
||||
|
|
@ -1818,7 +1819,7 @@ static mp_obj_t lwip_getaddrinfo(size_t n_args, const mp_obj_t *args) {
|
|||
}
|
||||
}
|
||||
}
|
||||
if (!((family == 0 || family == MOD_NETWORK_AF_INET)
|
||||
if (!((family == 0 || family == MOD_NETWORK_AF_INET || family == MOD_NETWORK_AF_INET6)
|
||||
&& (type == 0 || type == MOD_NETWORK_SOCK_STREAM)
|
||||
&& proto == 0
|
||||
&& flags == 0)) {
|
||||
|
|
@ -1829,11 +1830,23 @@ static mp_obj_t lwip_getaddrinfo(size_t n_args, const mp_obj_t *args) {
|
|||
getaddrinfo_state_t state;
|
||||
state.status = 0;
|
||||
|
||||
#if LWIP_VERSION_MAJOR >= 2
|
||||
// If family was specified, then try and resolve the address type as
|
||||
// requested. Otherwise, use the default from network configuration.
|
||||
if (family == MOD_NETWORK_AF_INET) {
|
||||
family = LWIP_DNS_ADDRTYPE_IPV4;
|
||||
} else if (family == MOD_NETWORK_AF_INET6) {
|
||||
family = LWIP_DNS_ADDRTYPE_IPV6;
|
||||
} else {
|
||||
family = mp_mod_network_prefer_dns_use_ip_version == 4 ? LWIP_DNS_ADDRTYPE_IPV4_IPV6 : LWIP_DNS_ADDRTYPE_IPV6_IPV4;
|
||||
}
|
||||
#endif
|
||||
|
||||
MICROPY_PY_LWIP_ENTER
|
||||
#if LWIP_VERSION_MAJOR < 2
|
||||
err_t ret = dns_gethostbyname(host, (ip_addr_t *)&state.ipaddr, lwip_getaddrinfo_cb, &state);
|
||||
#else
|
||||
err_t ret = dns_gethostbyname_addrtype(host, (ip_addr_t *)&state.ipaddr, lwip_getaddrinfo_cb, &state, mp_mod_network_prefer_dns_use_ip_version == 4 ? LWIP_DNS_ADDRTYPE_IPV4_IPV6 : LWIP_DNS_ADDRTYPE_IPV6_IPV4);
|
||||
err_t ret = dns_gethostbyname_addrtype(host, (ip_addr_t *)&state.ipaddr, lwip_getaddrinfo_cb, &state, family);
|
||||
#endif
|
||||
MICROPY_PY_LWIP_EXIT
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue