From ed919ebd769d6ff37636a1beba304b830d065e9d Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Fri, 4 Jan 2019 12:04:32 +0000 Subject: [PATCH] DNSServer: Clarify and tidy writing the answer record Modify the code used to write the answer record back to the server so that it is clearer that we are writing network byte order 16-bit quantities, and to clarify what's happening with the pointer used at the start of the answer. --- libraries/DNSServer/src/DNSServer.cpp | 29 +++++++++++++++++---------- libraries/DNSServer/src/DNSServer.h | 1 + 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/libraries/DNSServer/src/DNSServer.cpp b/libraries/DNSServer/src/DNSServer.cpp index 25f382e354..31d2c90792 100644 --- a/libraries/DNSServer/src/DNSServer.cpp +++ b/libraries/DNSServer/src/DNSServer.cpp @@ -186,36 +186,43 @@ void DNSServer::processNextRequest() respondToRequest(buffer.get(), currentPacketSize); } +void DNSServer::writeNBOShort(uint16_t value) +{ + _udp.write((unsigned char *)&value, 2); +} + void DNSServer::replyWithIP(DNSHeader *dnsHeader, unsigned char * query, size_t queryLength) { + uint16_t value; + dnsHeader->QR = DNS_QR_RESPONSE; dnsHeader->QDCount = lwip_htons(1); dnsHeader->ANCount = lwip_htons(1); dnsHeader->NSCount = 0; dnsHeader->ARCount = 0; - //_dnsHeader->RA = 1; - _udp.beginPacket(_udp.remoteIP(), _udp.remotePort()); _udp.write((unsigned char *) dnsHeader, sizeof(DNSHeader)); _udp.write(query, queryLength); - _udp.write((uint8_t)192); // answer name is a pointer - _udp.write((uint8_t)12); // pointer to offset at 0x00c + // Rather than restate the name here, we use a pointer to the name contained + // in the query section. Pointers have the top two bits set. + value = 0xC000 | DNS_HEADER_SIZE; + writeNBOShort(lwip_htons(value)); + + // Answer is type A (an IPv4 address) + writeNBOShort(lwip_htons(DNS_QTYPE_A)); - _udp.write((uint8_t)0); // 0x0001 answer is type A query (host address) - _udp.write((uint8_t)1); + // Answer is in the Internet Class + writeNBOShort(lwip_htons(DNS_QCLASS_IN)); - _udp.write((uint8_t)0); //0x0001 answer is class IN (internet address) - _udp.write((uint8_t)1); - + // Output TTL (already NBO) _udp.write((unsigned char*)&_ttl, 4); // Length of RData is 4 bytes (because, in this case, RData is IPv4) - _udp.write((uint8_t)0); - _udp.write((uint8_t)4); + writeNBOShort(lwip_htons(sizeof(_resolvedIP))); _udp.write(_resolvedIP, sizeof(_resolvedIP)); _udp.endPacket(); } diff --git a/libraries/DNSServer/src/DNSServer.h b/libraries/DNSServer/src/DNSServer.h index 95800e23af..0f3ebd7a34 100644 --- a/libraries/DNSServer/src/DNSServer.h +++ b/libraries/DNSServer/src/DNSServer.h @@ -82,5 +82,6 @@ class DNSServer void replyWithError(DNSHeader *dnsHeader, DNSReplyCode rcode); void respondToRequest(uint8_t *buffer, size_t length); + void writeNBOShort(uint16_t value); }; #endif