7 #ifndef ZRTOS_VFS_MODULE_DNS_H 8 #define ZRTOS_VFS_MODULE_DNS_H 66 char name[DNS_MAX_NAME_LENGTH];
73 #define SOCKET_NONE 255 75 #define UDP_HEADER_SIZE 8 76 ZRTOS_VFS_MODULE_DNS_HEADER_SIZE 12
78 #define QUERY_FLAG (0) 79 #define RESPONSE_FLAG (1<<15) 80 #define QUERY_RESPONSE_MASK (1<<15) 81 #define OPCODE_STANDARD_QUERY (0) 82 #define OPCODE_INVERSE_QUERY (1<<11) 83 #define OPCODE_STATUS_REQUEST (2<<11) 84 #define OPCODE_MASK (15<<11) 85 #define AUTHORITATIVE_FLAG (1<<10) 86 #define TRUNCATION_FLAG (1<<9) 87 #define RECURSION_DESIRED_FLAG (1<<8) 88 #define RECURSION_AVAILABLE_FLAG (1<<7) 89 #define RESP_NO_ERROR (0) 90 #define RESP_FORMAT_ERROR (1) 91 #define RESP_SERVER_FAILURE (2) 92 #define RESP_NAME_ERROR (3) 93 #define RESP_NOT_IMPLEMENTED (4) 94 #define RESP_REFUSED (5) 95 #define RESP_MASK (15) 96 #define TYPE_A (0x0001) 97 #define CLASS_IN (0x0001) 98 #define LABEL_COMPRESSION_MASK (0xC0) 100 ZRTOS_VFS_MODULE_DNS_PORT 53
105 #define INVALID_SERVER -2 107 #define INVALID_RESPONSE -4 109 void DNSClient::begin(
const IPAddress& aDNSServer)
111 iDNSServer = aDNSServer;
116 int DNSClient::inet_aton(
const char* aIPAddrString, IPAddress& aResult)
119 const char* p =aIPAddrString;
121 ( (*p ==
'.') || ((*p >=
'0') && (*p <=
'9')) ))
132 while (*p && (segment < 4))
137 if (segmentValue > 255)
144 aResult[segment] = (byte)segmentValue;
152 segmentValue = (segmentValue*10)+(*p -
'0');
158 if ((segmentValue > 255) || (segment > 3))
166 aResult[segment] = (byte)segmentValue;
176 int DNSClient::getHostByName(
const char* aHostname, IPAddress& aResult)
181 if (inet_aton(aHostname, aResult))
188 if (iDNSServer == INADDR_NONE)
194 if (iUdp.begin(1024+(millis() & 0xF)) == 1)
201 ret = iUdp.beginPacket(iDNSServer, DNS_PORT);
205 ret = BuildRequest(aHostname);
209 ret = iUdp.endPacket();
213 int wait_retries = 0;
215 while ((wait_retries < 3) && (ret ==
TIMED_OUT))
217 ret = ProcessResponse(5000, aResult);
233 uint16_t DNSClient::BuildRequest(
const char* aName)
253 iRequestId = millis();
254 uint16_t twoByteBuffer;
258 iUdp.write((
uint8_t*)&iRequestId,
sizeof(iRequestId));
261 iUdp.write((
uint8_t*)&twoByteBuffer,
sizeof(twoByteBuffer));
263 twoByteBuffer = htons(1);
264 iUdp.write((
uint8_t*)&twoByteBuffer,
sizeof(twoByteBuffer));
267 iUdp.write((
uint8_t*)&twoByteBuffer,
sizeof(twoByteBuffer));
269 iUdp.write((
uint8_t*)&twoByteBuffer,
sizeof(twoByteBuffer));
271 iUdp.write((
uint8_t*)&twoByteBuffer,
sizeof(twoByteBuffer));
274 const char* start =aName;
275 const char* end =start;
282 while (*end && (*end !=
'.') )
291 iUdp.write(&len,
sizeof(len));
293 iUdp.write((
uint8_t*)start, end-start);
301 iUdp.write(&len,
sizeof(len));
303 twoByteBuffer = htons(
TYPE_A);
304 iUdp.write((
uint8_t*)&twoByteBuffer,
sizeof(twoByteBuffer));
307 iUdp.write((
uint8_t*)&twoByteBuffer,
sizeof(twoByteBuffer));
313 uint16_t DNSClient::ProcessResponse(uint16_t aTimeout, IPAddress& aAddress)
315 uint32_t startTime = millis();
318 while(iUdp.parsePacket() <= 0)
320 if((millis() - startTime) > aTimeout)
327 uint8_t header[DNS_HEADER_SIZE];
329 if ( (iDNSServer != iUdp.remoteIP()) ||
330 (iUdp.remotePort() != DNS_PORT) )
337 if (iUdp.available() < DNS_HEADER_SIZE)
341 iUdp.read(header, DNS_HEADER_SIZE);
343 uint16_t header_flags = htons(*((uint16_t*)&header[2]));
345 if ( ( iRequestId != (*((uint16_t*)&header[0])) ) ||
362 uint16_t answerCount = htons(*((uint16_t*)&header[6]));
363 if (answerCount == 0 )
371 for (uint16_t i =0; i < htons(*((uint16_t*)&header[4])); i++)
377 iUdp.read(&len,
sizeof(len));
390 for (
int i =0; i < 4; i++)
401 for (uint16_t i =0; i < answerCount; i++)
407 iUdp.read(&len,
sizeof(len));
439 uint16_t answerClass;
440 iUdp.read((
uint8_t*)&answerType,
sizeof(answerType));
441 iUdp.read((
uint8_t*)&answerClass,
sizeof(answerClass));
451 iUdp.read((
uint8_t*)&header_flags,
sizeof(header_flags));
453 if ( (htons(answerType) ==
TYPE_A) && (htons(answerClass) ==
CLASS_IN) )
455 if (htons(header_flags) != 4)
462 iUdp.read(aAddress.raw_address(), 4);
468 for (uint16_t i =0; i < htons(header_flags); i++)
zrtos_vfs_module_dns_header_flags_1_t
#define LABEL_COMPRESSION_MASK
#define QUERY_RESPONSE_MASK
zrtos_vfs_module_dns_header_flags_0_t
#define RECURSION_DESIRED_FLAG
#define OPCODE_STANDARD_QUERY