diff options
Diffstat (limited to 'dnsserver.h')
| -rw-r--r-- | dnsserver.h | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/dnsserver.h b/dnsserver.h new file mode 100644 index 0000000..6a6c518 --- /dev/null +++ b/dnsserver.h @@ -0,0 +1,65 @@ +#include <WiFiUdp.h> +#include <lwip/def.h> + +#ifndef __DNSSERVER_H__ +#define __DNSSERVER_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 + unsigned char RD : 1; // recursion desired + unsigned char TC : 1; // truncated message + unsigned char AA : 1; // authoritive answer + unsigned char OPCode : 4; // message_type + unsigned char QR : 1; // query/response flag + unsigned char RCode : 4; // response code + unsigned char Z : 3; // its z! reserved + unsigned 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: + DNSServer(); + void processNextRequest(); + bool start(const IPAddress &resolvedIP); + void stop(); + + private: + WiFiUDP _udp; + uint16_t _port; + String _domainName; + unsigned char _resolvedIP[4]; + int _currentPacketSize; + unsigned char* _buffer; + DNSHeader* _dnsHeader; + uint32_t _ttl; + DNSReplyCode _errorReplyCode; + + bool requestIncludesOnlyOneQuestion(); + void replyWithIP(); +}; + +#endif + |
