summaryrefslogtreecommitdiff
path: root/dnsserver.h
diff options
context:
space:
mode:
Diffstat (limited to 'dnsserver.h')
-rw-r--r--dnsserver.h65
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
+