Skip to content

Commit b37ce6c

Browse files
committed
Combine hostByName to support both IPv6 and IPv4 results
1 parent 41fb1a1 commit b37ce6c

File tree

3 files changed

+39
-91
lines changed

3 files changed

+39
-91
lines changed

libraries/WiFi/src/WiFiClient.cpp

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -319,21 +319,8 @@ int WiFiClient::connect(const char *host, uint16_t port)
319319

320320
int WiFiClient::connect(const char *host, uint16_t port, int32_t timeout_ms)
321321
{
322-
if (WiFiGenericClass::getStatusBits() & WIFI_WANT_IP6_BIT) {
323-
ip_addr_t srv6;
324-
if(!WiFiGenericClass::hostByName6(host, srv6)){
325-
return 0;
326-
}
327-
if (srv6.type == IPADDR_TYPE_V4) {
328-
IPAddress ip(srv6.u_addr.ip4.addr);
329-
return connect(ip, port, timeout_ms);
330-
} else {
331-
IPAddress ip(IPv6, (uint8_t*)&srv6.u_addr.ip6.addr[0]);
332-
return connect(ip, port, timeout_ms);
333-
}
334-
}
335322
IPAddress srv((uint32_t)0);
336-
if(!WiFiGenericClass::hostByName(host, srv)){
323+
if(!WiFiGenericClass::hostByName(host, srv, (WiFiGenericClass::getStatusBits() & WIFI_WANT_IP6_BIT))){
337324
return 0;
338325
}
339326
return connect(srv, port, timeout_ms);

libraries/WiFi/src/WiFiGeneric.cpp

Lines changed: 37 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,10 +1546,12 @@ bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2
15461546
// ------------------------------------------------ Generic Network function ---------------------------------------------
15471547
// -----------------------------------------------------------------------------------------------------------------------
15481548

1549-
struct dns_api_msg6 {
1550-
ip_addr_t ip_addr;
1549+
typedef struct gethostbynameParameters {
1550+
const char *hostname;
1551+
ip_addr_t addr;
1552+
uint8_t addr_type;
15511553
int result;
1552-
};
1554+
} gethostbynameParameters_t;
15531555

15541556
/**
15551557
* DNS callback
@@ -1559,45 +1561,26 @@ struct dns_api_msg6 {
15591561
*/
15601562
static void wifi_dns_found_callback(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
15611563
{
1564+
gethostbynameParameters_t *parameters = static_cast<gethostbynameParameters_t *>(callback_arg);
15621565
if(ipaddr) {
1563-
(*reinterpret_cast<IPAddress*>(callback_arg)) = ipaddr->u_addr.ip4.addr;
1566+
if(parameters->result == 0){
1567+
memcpy(&(parameters->addr), ipaddr, sizeof(ip_addr_t));
1568+
parameters->result = 1;
1569+
}
1570+
} else {
1571+
parameters->result = -1;
15641572
}
15651573
xEventGroupSetBits(_arduino_event_group, WIFI_DNS_DONE_BIT);
15661574
}
15671575

1568-
typedef struct gethostbynameParameters {
1569-
const char *hostname;
1570-
ip_addr_t addr;
1571-
void *callback_arg;
1572-
} gethostbynameParameters_t;
1573-
15741576
/**
15751577
* Callback to execute dns_gethostbyname in lwIP's TCP/IP context
15761578
* @param param Parameters for dns_gethostbyname call
15771579
*/
15781580
static esp_err_t wifi_gethostbyname_tcpip_ctx(void *param)
15791581
{
15801582
gethostbynameParameters_t *parameters = static_cast<gethostbynameParameters_t *>(param);
1581-
return dns_gethostbyname(parameters->hostname, &parameters->addr, &wifi_dns_found_callback, parameters->callback_arg);
1582-
}
1583-
1584-
/**
1585-
* IPv6 compatible DNS callback
1586-
* @param name
1587-
* @param ipaddr
1588-
* @param callback_arg
1589-
*/
1590-
static void wifi_dns6_found_callback(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
1591-
{
1592-
struct dns_api_msg6 *msg = (struct dns_api_msg6 *)callback_arg;
1593-
1594-
if(ipaddr && !msg->result) {
1595-
msg->ip_addr = *ipaddr;
1596-
msg->result = 1;
1597-
} else {
1598-
msg->result = -1;
1599-
}
1600-
xEventGroupSetBits(_arduino_event_group, WIFI_DNS_DONE_BIT);
1583+
return dns_gethostbyname_addrtype(parameters->hostname, &parameters->addr, &wifi_dns_found_callback, parameters, parameters->addr_type);
16011584
}
16021585

16031586
/**
@@ -1607,60 +1590,39 @@ static void wifi_dns6_found_callback(const char *name, const ip_addr_t *ipaddr,
16071590
* @return 1 if aIPAddrString was successfully converted to an IP address,
16081591
* else error code
16091592
*/
1610-
int WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResult)
1593+
int WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResult, bool preferV6)
16111594
{
1612-
if (!aResult.fromString(aHostname))
1613-
{
1614-
gethostbynameParameters_t params;
1615-
params.hostname = aHostname;
1616-
params.callback_arg = &aResult;
1617-
aResult = static_cast<uint32_t>(0);
1595+
err_t err = ERR_OK;
1596+
gethostbynameParameters_t params;
1597+
1598+
aResult = static_cast<uint32_t>(0);
1599+
params.hostname = aHostname;
1600+
params.addr_type = preferV6?LWIP_DNS_ADDRTYPE_IPV6_IPV4:LWIP_DNS_ADDRTYPE_IPV4_IPV6;
1601+
params.result = 0;
1602+
aResult.to_ip_addr_t(&(params.addr));
1603+
1604+
if (!aResult.fromString(aHostname)) {
16181605
waitStatusBits(WIFI_DNS_IDLE_BIT, 16000);
16191606
clearStatusBits(WIFI_DNS_IDLE_BIT | WIFI_DNS_DONE_BIT);
1620-
err_t err = esp_netif_tcpip_exec(wifi_gethostbyname_tcpip_ctx, &params);
1621-
if(err == ERR_OK && params.addr.u_addr.ip4.addr) {
1622-
aResult = params.addr.u_addr.ip4.addr;
1623-
} else if(err == ERR_INPROGRESS) {
1607+
1608+
err = esp_netif_tcpip_exec(wifi_gethostbyname_tcpip_ctx, &params);
1609+
if (err == ERR_OK) {
1610+
aResult.from_ip_addr_t(&(params.addr));
1611+
} else if (err == ERR_INPROGRESS) {
16241612
waitStatusBits(WIFI_DNS_DONE_BIT, 15000); //real internal timeout in lwip library is 14[s]
16251613
clearStatusBits(WIFI_DNS_DONE_BIT);
1614+
if (params.result == 1) {
1615+
aResult.from_ip_addr_t(&(params.addr));
1616+
err = ERR_OK;
1617+
}
16261618
}
16271619
setStatusBits(WIFI_DNS_IDLE_BIT);
1628-
if((uint32_t)aResult == 0){
1629-
log_e("DNS Failed for %s", aHostname);
1630-
}
16311620
}
1632-
return (uint32_t)aResult != 0;
1633-
}
1634-
1635-
/**
1636-
* Resolve the given hostname to an IP6 address.
1637-
* @param aHostname Name to be resolved
1638-
* @param aResult IPv6Address structure to store the returned IP address
1639-
* @return 1 if aHostname was successfully converted to an IP address,
1640-
* else error code
1641-
*/
1642-
int WiFiGenericClass::hostByName6(const char* aHostname, ip_addr_t& aResult)
1643-
{
1644-
ip_addr_t addr;
1645-
struct dns_api_msg6 arg;
1646-
1647-
memset(&arg, 0x0, sizeof(arg));
1648-
waitStatusBits(WIFI_DNS_IDLE_BIT, 16000);
1649-
clearStatusBits(WIFI_DNS_IDLE_BIT | WIFI_DNS_DONE_BIT);
1650-
1651-
err_t err = dns_gethostbyname_addrtype(aHostname, &addr, &wifi_dns6_found_callback,
1652-
&arg, LWIP_DNS_ADDRTYPE_IPV6_IPV4);
1653-
if(err == ERR_OK) {
1654-
aResult = addr;
1655-
} else if(err == ERR_INPROGRESS) {
1656-
waitStatusBits(WIFI_DNS_DONE_BIT, 15000); //real internal timeout in lwip library is 14[s]
1657-
clearStatusBits(WIFI_DNS_DONE_BIT);
1658-
if (arg.result == 1) {
1659-
aResult = arg.ip_addr;
1660-
}
1621+
if (err == ERR_OK) {
1622+
return 1;
16611623
}
1662-
setStatusBits(WIFI_DNS_IDLE_BIT);
1663-
return (uint32_t)err == ERR_OK || (err == ERR_INPROGRESS && arg.result == 1);
1624+
log_e("DNS Failed for '%s' with error '%d' and result '%d'", aHostname, err, params.result);
1625+
return err;
16641626
}
16651627

16661628
IPAddress WiFiGenericClass::calculateNetworkID(IPAddress ip, IPAddress subnet) {

libraries/WiFi/src/WiFiGeneric.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ class WiFiGenericClass
198198
static const char * getHostname();
199199
static bool setHostname(const char * hostname);
200200
static bool hostname(const String& aHostname) { return setHostname(aHostname.c_str()); }
201-
static int hostByName6(const char *aHostname, ip_addr_t& aResult);
202201

203202
static esp_err_t _eventCallback(arduino_event_t *event);
204203

@@ -219,7 +218,7 @@ class WiFiGenericClass
219218
static bool _isReconnectableReason(uint8_t reason);
220219

221220
public:
222-
static int hostByName(const char *aHostname, IPAddress &aResult);
221+
static int hostByName(const char *aHostname, IPAddress &aResult, bool preferV6=false);
223222

224223
static IPAddress calculateNetworkID(IPAddress ip, IPAddress subnet);
225224
static IPAddress calculateBroadcast(IPAddress ip, IPAddress subnet);

0 commit comments

Comments
 (0)