diff --git a/lib/default/DnsClient/src/DnsClient.cpp b/lib/default/DnsClient/src/DnsClient.cpp index e46ff43e1..19bc4444d 100644 --- a/lib/default/DnsClient/src/DnsClient.cpp +++ b/lib/default/DnsClient/src/DnsClient.cpp @@ -51,23 +51,20 @@ #define htons(x) ( ((x)<< 8 & 0xFF00) | ((x)>> 8 & 0x00FF) ) #endif - void DNSClient::begin(const IPAddress& aDNSServer) { iDNSServer = aDNSServer; iRequestId = 0; } -void DNSClient::setTimeout(uint16_t aTimeout) { +void DNSClient::setTimeout(uint32_t aTimeout) { iTimeout = aTimeout; } int DNSClient::getHostByName(const char* aHostname, IPAddress& aResult) { - int ret =0; - // See if it's a numeric IP address if (aResult.fromString(aHostname)) { // It is, our work here is done - return 1; + return SUCCESS; } // Check we've got a valid DNS server to use @@ -75,6 +72,7 @@ int DNSClient::getHostByName(const char* aHostname, IPAddress& aResult) { return INVALID_SERVER; } + int ret = 0; // Find a socket to use if (iUdp.begin(1024+(millis() & 0xF)) == 1) { // Try up to three times @@ -107,10 +105,9 @@ int DNSClient::getHostByName(const char* aHostname, IPAddress& aResult) { return ret; } -uint16_t DNSClient::BuildRequest(const char* aName) { +int DNSClient::BuildRequest(const char* aName) { // Build header - // 1 1 1 1 1 1 - // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ // | ID | // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ @@ -178,10 +175,10 @@ uint16_t DNSClient::BuildRequest(const char* aName) { twoByteBuffer = htons(CLASS_IN); // Internet class of question iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer)); // Success! Everything buffered okay - return 1; + return SUCCESS; } -uint16_t DNSClient::ProcessResponse(uint16_t aTimeout, IPAddress& aAddress) { +int DNSClient::ProcessResponse(uint32_t aTimeout, IPAddress& aAddress) { uint32_t startTime = millis(); // Wait for a response packet @@ -236,7 +233,7 @@ uint16_t DNSClient::ProcessResponse(uint16_t aTimeout, IPAddress& aAddress) { // Skip over any questions memcpy(&staging, &header[4], sizeof(uint16_t)); - for (uint16_t i =0; i < htons(staging); i++) { + for (uint32_t i = 0; i < htons(staging); i++) { // Skip over the name uint8_t len; do { @@ -251,7 +248,7 @@ uint16_t DNSClient::ProcessResponse(uint16_t aTimeout, IPAddress& aAddress) { } while (len != 0); // Now jump over the type and class - for (int i =0; i < 4; i++) { + for (uint32_t i = 0; i < 4; i++) { iUdp.read(); // we don't care about the returned byte } } @@ -261,7 +258,7 @@ uint16_t DNSClient::ProcessResponse(uint16_t aTimeout, IPAddress& aAddress) { // type A answer) and some authority and additional resource records but // we're going to ignore all of them. - for (uint16_t i =0; i < answerCount; i++) { + for (uint32_t i = 0; i < answerCount; i++) { // Skip the name uint8_t len; do { @@ -297,7 +294,7 @@ uint16_t DNSClient::ProcessResponse(uint16_t aTimeout, IPAddress& aAddress) { iUdp.read((uint8_t*)&answerClass, sizeof(answerClass)); // Ignore the Time-To-Live as we don't do any caching - for (int i =0; i < TTL_SIZE; i++) { + for (uint32_t i = 0; i < TTL_SIZE; i++) { iUdp.read(); // We don't care about the returned byte } @@ -323,7 +320,7 @@ uint16_t DNSClient::ProcessResponse(uint16_t aTimeout, IPAddress& aAddress) { } } else { // This isn't an answer type we're after, move onto the next one - for (uint16_t i =0; i < htons(header_flags); i++) { + for (uint32_t i = 0; i < htons(header_flags); i++) { iUdp.read(); // we don't care about the returned byte } } diff --git a/lib/default/DnsClient/src/DnsClient.h b/lib/default/DnsClient/src/DnsClient.h index af1dfe42e..42f29b190 100644 --- a/lib/default/DnsClient/src/DnsClient.h +++ b/lib/default/DnsClient/src/DnsClient.h @@ -20,7 +20,7 @@ class DNSClient { public: void begin(const IPAddress& aDNSServer); - void setTimeout(uint16_t aTimeout = 1000); + void setTimeout(uint32_t aTimeout = 1000); /* Resolve the given hostname to an IP address. @param aHostname Name to be resolved @@ -30,8 +30,8 @@ public: int getHostByName(const char* aHostname, IPAddress& aResult); protected: - uint16_t BuildRequest(const char* aName); - uint16_t ProcessResponse(uint16_t aTimeout, IPAddress& aAddress); + int BuildRequest(const char* aName); + int ProcessResponse(uint32_t aTimeout, IPAddress& aAddress); IPAddress iDNSServer; uint16_t iRequestId; diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index 2e516b737..0cb2d6af2 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -2455,7 +2455,7 @@ void SyslogAsync(bool refresh) { if (!WifiHostByName(SettingsText(SET_SYSLOG_HOST), temp_syslog_host_addr)) { // If sleep enabled this might result in exception so try to do it once using hash TasmotaGlobal.syslog_level = 0; TasmotaGlobal.syslog_timer = SYSLOG_TIMER; - AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION "Loghost DNS resolve failed (%s). " D_RETRY_IN " %d " D_UNIT_SECOND), SettingsText(SET_SYSLOG_HOST), SYSLOG_TIMER); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_RETRY_IN " %d " D_UNIT_SECOND), SYSLOG_TIMER); return; } syslog_host_hash = current_hash; diff --git a/tasmota/tasmota_support/support_wifi.ino b/tasmota/tasmota_support/support_wifi.ino index d2c5c7ca9..1a6fd6f6f 100644 --- a/tasmota/tasmota_support/support_wifi.ino +++ b/tasmota/tasmota_support/support_wifi.ino @@ -733,7 +733,11 @@ bool WifiHostByName(const char* aHostname, IPAddress& aResult) { // Use this instead of WiFi.hostByName or connect(host_name,.. to block less if DNS server is not found uint32_t dns_address = (!TasmotaGlobal.global_state.eth_down) ? Settings->eth_ipv4_address[3] : Settings->ipv4_address[3]; DnsClient.begin((IPAddress)dns_address); - return (1 == DnsClient.getHostByName(aHostname, aResult)); + if (DnsClient.getHostByName(aHostname, aResult) != 1) { + AddLog(LOG_LEVEL_DEBUG, PSTR("DNS: Unable to resolve '%s'"), aHostname); + return false; + } + return true; } void WifiPollNtp() { @@ -793,7 +797,7 @@ uint32_t WifiGetNtp(void) { } if (!WifiHostByName(ntp_server, time_server_ip)) { ntp_server_id++; - AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: Unable to resolve '%s'"), ntp_server); +// AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: Unable to resolve '%s'"), ntp_server); return 0; } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_40_telegram.ino b/tasmota/tasmota_xdrv_driver/xdrv_40_telegram.ino index a988fff8f..ab40d9f59 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_40_telegram.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_40_telegram.ino @@ -107,9 +107,13 @@ String TelegramConnectToTelegram(const String &command) { String host = F("api.telegram.org"); String response = ""; + IPAddress telegram_host_ip; + if (!WifiHostByName(host.c_str(), telegram_host_ip)) { + return response; + } uint32_t tls_connect_time = millis(); - if (telegramClient->connect(host.c_str(), 443)) { - +// if (telegramClient->connect(host.c_str(), 443)) { + if (telegramClient->connect(telegram_host_ip, 443)) { // AddLog(LOG_LEVEL_DEBUG, PSTR("TGM: Connected in %d ms, max ThunkStack used %d"), millis() - tls_connect_time, telegramClient->getMaxThunkStackUse()); // telegramClient->println("GET /"+command); // Fails after 20210621