@@ -1546,10 +1546,12 @@ bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2
1546
1546
// ------------------------------------------------ Generic Network function ---------------------------------------------
1547
1547
// -----------------------------------------------------------------------------------------------------------------------
1548
1548
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;
1551
1553
int result;
1552
- };
1554
+ } gethostbynameParameters_t ;
1553
1555
1554
1556
/* *
1555
1557
* DNS callback
@@ -1559,45 +1561,26 @@ struct dns_api_msg6 {
1559
1561
*/
1560
1562
static void wifi_dns_found_callback (const char *name, const ip_addr_t *ipaddr, void *callback_arg)
1561
1563
{
1564
+ gethostbynameParameters_t *parameters = static_cast <gethostbynameParameters_t *>(callback_arg);
1562
1565
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 ;
1564
1572
}
1565
1573
xEventGroupSetBits (_arduino_event_group, WIFI_DNS_DONE_BIT);
1566
1574
}
1567
1575
1568
- typedef struct gethostbynameParameters {
1569
- const char *hostname;
1570
- ip_addr_t addr;
1571
- void *callback_arg;
1572
- } gethostbynameParameters_t;
1573
-
1574
1576
/* *
1575
1577
* Callback to execute dns_gethostbyname in lwIP's TCP/IP context
1576
1578
* @param param Parameters for dns_gethostbyname call
1577
1579
*/
1578
1580
static esp_err_t wifi_gethostbyname_tcpip_ctx (void *param)
1579
1581
{
1580
1582
gethostbynameParameters_t *parameters = static_cast <gethostbynameParameters_t *>(param);
1581
- return dns_gethostbyname (parameters->hostname , ¶meters->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 , ¶meters->addr , &wifi_dns_found_callback, parameters, parameters->addr_type );
1601
1584
}
1602
1585
1603
1586
/* *
@@ -1607,60 +1590,39 @@ static void wifi_dns6_found_callback(const char *name, const ip_addr_t *ipaddr,
1607
1590
* @return 1 if aIPAddrString was successfully converted to an IP address,
1608
1591
* else error code
1609
1592
*/
1610
- int WiFiGenericClass::hostByName (const char * aHostname, IPAddress& aResult)
1593
+ int WiFiGenericClass::hostByName (const char * aHostname, IPAddress& aResult, bool preferV6 )
1611
1594
{
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)) {
1618
1605
waitStatusBits (WIFI_DNS_IDLE_BIT, 16000 );
1619
1606
clearStatusBits (WIFI_DNS_IDLE_BIT | WIFI_DNS_DONE_BIT);
1620
- err_t err = esp_netif_tcpip_exec (wifi_gethostbyname_tcpip_ctx, ¶ms);
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, ¶ms);
1609
+ if (err == ERR_OK) {
1610
+ aResult.from_ip_addr_t (&(params.addr ));
1611
+ } else if (err == ERR_INPROGRESS) {
1624
1612
waitStatusBits (WIFI_DNS_DONE_BIT, 15000 ); // real internal timeout in lwip library is 14[s]
1625
1613
clearStatusBits (WIFI_DNS_DONE_BIT);
1614
+ if (params.result == 1 ) {
1615
+ aResult.from_ip_addr_t (&(params.addr ));
1616
+ err = ERR_OK;
1617
+ }
1626
1618
}
1627
1619
setStatusBits (WIFI_DNS_IDLE_BIT);
1628
- if ((uint32_t )aResult == 0 ){
1629
- log_e (" DNS Failed for %s" , aHostname);
1630
- }
1631
1620
}
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 ;
1661
1623
}
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;
1664
1626
}
1665
1627
1666
1628
IPAddress WiFiGenericClass::calculateNetworkID (IPAddress ip, IPAddress subnet) {
0 commit comments