diff --git a/Sming/Core/Network/DNSServer.h b/Sming/Core/Network/DNSServer.h index 16350bbd69..933570dd04 100644 --- a/Sming/Core/Network/DNSServer.h +++ b/Sming/Core/Network/DNSServer.h @@ -1,100 +1,3 @@ -/**** - * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development. - * Created 2015 by Skurydin Alexey - * http://github.com/SmingHub/Sming - * All files of the Sming Core are provided under the LGPL v3 license. - * - * DnsServer.h - * - * File Author: https://github.com/patrickjahns - * - * The code is a port of the following projects - * https://github.com/israellot/esp-ginx/tree/master/app/dns - * https://github.com/esp8266/Arduino/tree/master/libraries/DNSServer - * Created on March 4, 2016 - * - ****/ +#include "DnsServer.h" -/** @defgroup dnsserver DNS server - * @brief Provides DNS server - * @ingroup udp - * @{ - */ -#pragma once - -#include "UdpConnection.h" -#include "WString.h" - -#define DNS_QR_QUERY 0 -#define DNS_QR_RESPONSE 1 -#define DNS_OPCODE_QUERY 0 - -enum class DNSReplyCode { - NoError = 0, - FormError = 1, - ServerFailure = 2, - NonExistentDomain = 3, - NotImplemented = 4, - Refused = 5, - YXDomain = 6, - YXRRSet = 7, - NXRRSet = 8 -}; - -struct DNSHeader { - uint16_t ID; // identification number - char RD : 1; // recursion desired - char TC : 1; // truncated message - char AA : 1; // authoritive answer - char OPCode : 4; // message_type - char QR : 1; // query/response flag - char RCode : 4; // response code - char Z : 3; // its z! reserved - char RA : 1; // recursion available - uint16_t QDCount; // number of question entries - uint16_t ANCount; // number of answer entries - uint16_t NSCount; // number of authority entries - uint16_t ARCount; // number of resource entries -}; - -class DNSServer : public UdpConnection -{ -public: - DNSServer() - { - } - - void setErrorReplyCode(DNSReplyCode replyCode) - { - errorReplyCode = replyCode; - } - - void setTTL(uint32_t ttl) - { - this->ttl = ttl; - } - - // Returns true if successful, false if there are no sockets available - bool start(uint16_t port, const String& domainName, const IpAddress& resolvedIP); - - // stops the DNS server - void stop(); - -protected: - void onReceive(pbuf* buf, IpAddress remoteIP, uint16_t remotePort) override; - -private: - uint16_t port = 0; - String domainName; - ip_addr resolvedIP; - char* buffer = nullptr; - DNSHeader* dnsHeader = nullptr; - uint32_t ttl = 60; - DNSReplyCode errorReplyCode = DNSReplyCode::NonExistentDomain; - - static void downcaseAndRemoveWwwPrefix(String& domainName); - String getDomainNameWithoutWwwPrefix(); - bool requestIncludesOnlyOneQuestion(); -}; - -/** @} */ +#warning "Please include `DnsServer.h` instead of `DNSServer.h`" diff --git a/Sming/Core/Network/DNSServer.cpp b/Sming/Core/Network/DnsServer.cpp similarity index 87% rename from Sming/Core/Network/DNSServer.cpp rename to Sming/Core/Network/DnsServer.cpp index 1dfd66f209..e0fa97e577 100644 --- a/Sming/Core/Network/DNSServer.cpp +++ b/Sming/Core/Network/DnsServer.cpp @@ -15,11 +15,11 @@ * ****/ -#include "DNSServer.h" +#include "DnsServer.h" #include "UdpConnection.h" #include "WString.h" -bool DNSServer::start(uint16_t port, const String& domainName, const IpAddress& resolvedIP) +bool DnsServer::start(uint16_t port, const String& domainName, const IpAddress& resolvedIP) { this->port = port; buffer = nullptr; @@ -29,26 +29,26 @@ bool DNSServer::start(uint16_t port, const String& domainName, const IpAddress& return listen(this->port) == 1; } -void DNSServer::stop() +void DnsServer::stop() { close(); delete[] buffer; buffer = nullptr; } -void DNSServer::downcaseAndRemoveWwwPrefix(String& domainName) +void DnsServer::downcaseAndRemoveWwwPrefix(String& domainName) { domainName.toLowerCase(); domainName.replace(F("www."), String::empty); } -bool DNSServer::requestIncludesOnlyOneQuestion() +bool DnsServer::requestIncludesOnlyOneQuestion() { return ntohs(dnsHeader->QDCount) == 1 && dnsHeader->ANCount == 0 && dnsHeader->NSCount == 0 && dnsHeader->ARCount == 0; } -void DNSServer::onReceive(pbuf* buf, IpAddress remoteIP, uint16_t remotePort) +void DnsServer::onReceive(pbuf* buf, IpAddress remoteIP, uint16_t remotePort) { delete[] buffer; buffer = new char[buf->tot_len]; @@ -59,7 +59,7 @@ void DNSServer::onReceive(pbuf* buf, IpAddress remoteIP, uint16_t remotePort) pbuf_copy_partial(buf, buffer, buf->tot_len, 0); debug_d("DNS REQ for %s from %s:%d", getDomainNameWithoutWwwPrefix().c_str(), remoteIP.toString().c_str(), remotePort); - dnsHeader = reinterpret_cast(buffer); + dnsHeader = reinterpret_cast(buffer); if(dnsHeader->QR == DNS_QR_QUERY && dnsHeader->OPCode == DNS_OPCODE_QUERY && requestIncludesOnlyOneQuestion() && (domainName == "*" || getDomainNameWithoutWwwPrefix() == domainName)) { char response[buf->tot_len + 16]; @@ -101,7 +101,7 @@ void DNSServer::onReceive(pbuf* buf, IpAddress remoteIP, uint16_t remotePort) dnsHeader->QR = DNS_QR_RESPONSE; dnsHeader->RCode = char(errorReplyCode); dnsHeader->QDCount = 0; - sendTo(remoteIP, remotePort, buffer, sizeof(DNSHeader)); + sendTo(remoteIP, remotePort, buffer, sizeof(DnsHeader)); } delete[] buffer; @@ -110,7 +110,7 @@ void DNSServer::onReceive(pbuf* buf, IpAddress remoteIP, uint16_t remotePort) UdpConnection::onReceive(buf, remoteIP, remotePort); } -String DNSServer::getDomainNameWithoutWwwPrefix() +String DnsServer::getDomainNameWithoutWwwPrefix() { String parsedDomainName; if(buffer == nullptr) { diff --git a/Sming/Core/Network/DnsServer.h b/Sming/Core/Network/DnsServer.h new file mode 100644 index 0000000000..3ca9ef9a33 --- /dev/null +++ b/Sming/Core/Network/DnsServer.h @@ -0,0 +1,103 @@ +/**** + * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development. + * Created 2015 by Skurydin Alexey + * http://github.com/SmingHub/Sming + * All files of the Sming Core are provided under the LGPL v3 license. + * + * DnsServer.h + * + * File Author: https://github.com/patrickjahns + * + * The code is a port of the following projects + * https://github.com/israellot/esp-ginx/tree/master/app/dns + * https://github.com/esp8266/Arduino/tree/master/libraries/DNSServer + * Created on March 4, 2016 + * + ****/ + +/** @defgroup dnsserver DNS server + * @brief Provides DNS server + * @ingroup udp + * @{ + */ +#pragma once + +#include "UdpConnection.h" +#include "WString.h" + +#define DNS_QR_QUERY 0 +#define DNS_QR_RESPONSE 1 +#define DNS_OPCODE_QUERY 0 + +enum class DnsReplyCode { + NoError = 0, + FormError = 1, + ServerFailure = 2, + NonExistentDomain = 3, + NotImplemented = 4, + Refused = 5, + YXDomain = 6, + YXRRSet = 7, + NXRRSet = 8 +}; + +struct DnsHeader { + uint16_t ID; // identification number + char RD : 1; // recursion desired + char TC : 1; // truncated message + char AA : 1; // authoritive answer + char OPCode : 4; // message_type + char QR : 1; // query/response flag + char RCode : 4; // response code + char Z : 3; // its z! reserved + char RA : 1; // recursion available + uint16_t QDCount; // number of question entries + uint16_t ANCount; // number of answer entries + uint16_t NSCount; // number of authority entries + uint16_t ARCount; // number of resource entries +}; + +class DnsServer : public UdpConnection +{ +public: + DnsServer() + { + } + + void setErrorReplyCode(DnsReplyCode replyCode) + { + errorReplyCode = replyCode; + } + + void setTTL(uint32_t ttl) + { + this->ttl = ttl; + } + + // Returns true if successful, false if there are no sockets available + bool start(uint16_t port, const String& domainName, const IpAddress& resolvedIP); + + // stops the DNS server + void stop(); + +protected: + void onReceive(pbuf* buf, IpAddress remoteIP, uint16_t remotePort) override; + +private: + uint16_t port = 0; + String domainName; + ip_addr resolvedIP; + char* buffer = nullptr; + DnsHeader* dnsHeader = nullptr; + uint32_t ttl = 60; + DnsReplyCode errorReplyCode = DnsReplyCode::NonExistentDomain; + + static void downcaseAndRemoveWwwPrefix(String& domainName); + String getDomainNameWithoutWwwPrefix(); + bool requestIncludesOnlyOneQuestion(); +}; + +/** @deprecated Use `DnsServer` */ +typedef DnsServer DNSServer SMING_DEPRECATED; + +/** @} */ diff --git a/Sming/Core/SmingCore.h b/Sming/Core/SmingCore.h index abcd6c3328..9a8e8f869a 100644 --- a/Sming/Core/SmingCore.h +++ b/Sming/Core/SmingCore.h @@ -35,7 +35,7 @@ #include "Platform/AccessPoint.h" #include "Platform/WDT.h" -#include "Network/DNSServer.h" +#include "Network/DnsServer.h" #include "Network/HttpClient.h" #include "Network/MqttClient.h" #include "Network/NtpClient.h" diff --git a/samples/DNSCaptivePortal/.cproject b/samples/DnsCaptivePortal/.cproject similarity index 100% rename from samples/DNSCaptivePortal/.cproject rename to samples/DnsCaptivePortal/.cproject diff --git a/samples/DNSCaptivePortal/.project b/samples/DnsCaptivePortal/.project similarity index 96% rename from samples/DNSCaptivePortal/.project rename to samples/DnsCaptivePortal/.project index cadccea2db..605ea2c903 100644 --- a/samples/DNSCaptivePortal/.project +++ b/samples/DnsCaptivePortal/.project @@ -1,6 +1,6 @@ - DNSCaptivePortal + DnsCaptivePortal SmingFramework diff --git a/samples/DNSCaptivePortal/Makefile b/samples/DnsCaptivePortal/Makefile similarity index 100% rename from samples/DNSCaptivePortal/Makefile rename to samples/DnsCaptivePortal/Makefile diff --git a/samples/DNSCaptivePortal/README.rst b/samples/DnsCaptivePortal/README.rst similarity index 100% rename from samples/DNSCaptivePortal/README.rst rename to samples/DnsCaptivePortal/README.rst diff --git a/samples/DNSCaptivePortal/app/application.cpp b/samples/DnsCaptivePortal/app/application.cpp similarity index 97% rename from samples/DNSCaptivePortal/app/application.cpp rename to samples/DnsCaptivePortal/app/application.cpp index 2b9dcb41df..c06c947f1f 100644 --- a/samples/DNSCaptivePortal/app/application.cpp +++ b/samples/DnsCaptivePortal/app/application.cpp @@ -1,6 +1,6 @@ #include -DNSServer dnsServer; +DnsServer dnsServer; HttpServer server; #define DNS_PORT 53 diff --git a/samples/DNSCaptivePortal/component.mk b/samples/DnsCaptivePortal/component.mk similarity index 100% rename from samples/DNSCaptivePortal/component.mk rename to samples/DnsCaptivePortal/component.mk