A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.

Dependents:   oldheating gps motorhome heating

Committer:
andrewboyson
Date:
Thu Apr 02 19:08:25 2020 +0000
Revision:
167:3ba4e3c49631
Parent:
128:79052cb4a41c
Child:
182:ff48c6ea91c1
Modified resolution cache ajaxs to include the index

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 128:79052cb4a41c 1 #include <stdbool.h>
andrewboyson 128:79052cb4a41c 2 #include <string.h>
andrewboyson 128:79052cb4a41c 3
andrewboyson 128:79052cb4a41c 4 #include "dns.h"
andrewboyson 128:79052cb4a41c 5 #include "dnslabel.h"
andrewboyson 128:79052cb4a41c 6 #include "dhcp.h"
andrewboyson 128:79052cb4a41c 7
andrewboyson 128:79052cb4a41c 8 void DnsLabelCopy(char* dst, char* src)
andrewboyson 128:79052cb4a41c 9 {
andrewboyson 128:79052cb4a41c 10 strncpy(dst, src, DNS_MAX_LABEL_LENGTH); //Copies up to 63 bytes
andrewboyson 128:79052cb4a41c 11 dst[DNS_MAX_LABEL_LENGTH] = 0; //dst[63] is the 64th position from 0..63 is set to null. All labels must be declared as a size of 64
andrewboyson 128:79052cb4a41c 12 }
andrewboyson 128:79052cb4a41c 13
andrewboyson 128:79052cb4a41c 14 bool DnsLabelIsSame(char* pA, char* pB)
andrewboyson 128:79052cb4a41c 15 {
andrewboyson 128:79052cb4a41c 16 while(true)
andrewboyson 128:79052cb4a41c 17 {
andrewboyson 128:79052cb4a41c 18 char a = *pA++;
andrewboyson 128:79052cb4a41c 19 char b = *pB++;
andrewboyson 128:79052cb4a41c 20 if (a >= 'A' && a <= 'Z') a |= 0x20; //Make lower case
andrewboyson 128:79052cb4a41c 21 if (b >= 'A' && b <= 'Z') b |= 0x20; //Make lower case
andrewboyson 128:79052cb4a41c 22 if (a != b) return false; //If different then stop and return the fact
andrewboyson 128:79052cb4a41c 23 if (!a) break; //No need to check 'b' too as it will necessarily be equal to 'a' at this point.
andrewboyson 128:79052cb4a41c 24 }
andrewboyson 128:79052cb4a41c 25 return true; //If we get here the strings must equate.
andrewboyson 128:79052cb4a41c 26 }
andrewboyson 128:79052cb4a41c 27
andrewboyson 128:79052cb4a41c 28 int DnsLabelMakeFullNameFromName(int protocol, const char* p, int size, char* result)
andrewboyson 128:79052cb4a41c 29 {
andrewboyson 128:79052cb4a41c 30 int i = 0;
andrewboyson 128:79052cb4a41c 31 char c;
andrewboyson 128:79052cb4a41c 32
andrewboyson 128:79052cb4a41c 33 while (i < size - 1)
andrewboyson 128:79052cb4a41c 34 {
andrewboyson 128:79052cb4a41c 35 c = *p++;
andrewboyson 128:79052cb4a41c 36 if (!c) break;
andrewboyson 128:79052cb4a41c 37 *result++ = c;
andrewboyson 128:79052cb4a41c 38 i++;
andrewboyson 128:79052cb4a41c 39 }
andrewboyson 128:79052cb4a41c 40 if (protocol == DNS_PROTOCOL_MDNS)
andrewboyson 128:79052cb4a41c 41 {
andrewboyson 128:79052cb4a41c 42 p = ".local";
andrewboyson 128:79052cb4a41c 43 while (i < size - 1)
andrewboyson 128:79052cb4a41c 44 {
andrewboyson 128:79052cb4a41c 45 c = *p++;
andrewboyson 128:79052cb4a41c 46 if (!c) break;
andrewboyson 128:79052cb4a41c 47 *result++ = c;
andrewboyson 128:79052cb4a41c 48 i++;
andrewboyson 128:79052cb4a41c 49 }
andrewboyson 128:79052cb4a41c 50 }
andrewboyson 128:79052cb4a41c 51 if (protocol == DNS_PROTOCOL_UDNS && DhcpDomainName[0]) //Shouldn't do this in IPv6 as DHCP is IPv4 only
andrewboyson 128:79052cb4a41c 52 {
andrewboyson 128:79052cb4a41c 53 if (i < size - 1)
andrewboyson 128:79052cb4a41c 54 {
andrewboyson 128:79052cb4a41c 55 *result++ = '.';
andrewboyson 128:79052cb4a41c 56 i++;
andrewboyson 128:79052cb4a41c 57 }
andrewboyson 128:79052cb4a41c 58 p = DhcpDomainName;
andrewboyson 128:79052cb4a41c 59 while (i < size - 1)
andrewboyson 128:79052cb4a41c 60 {
andrewboyson 128:79052cb4a41c 61 c = *p++;
andrewboyson 128:79052cb4a41c 62 if (!c) break;
andrewboyson 128:79052cb4a41c 63 *result++ = c;
andrewboyson 128:79052cb4a41c 64 i++;
andrewboyson 128:79052cb4a41c 65 }
andrewboyson 128:79052cb4a41c 66 }
andrewboyson 128:79052cb4a41c 67 *result = 0; //Terminate the resulting string
andrewboyson 128:79052cb4a41c 68 return i;
andrewboyson 128:79052cb4a41c 69 }
andrewboyson 128:79052cb4a41c 70 int DnsLabelStripNameFromFullName(int protocol, char* p, int size, char* result)
andrewboyson 128:79052cb4a41c 71 {
andrewboyson 128:79052cb4a41c 72 int i = 0;
andrewboyson 128:79052cb4a41c 73 char c;
andrewboyson 128:79052cb4a41c 74
andrewboyson 128:79052cb4a41c 75 while (i < size - 1)
andrewboyson 128:79052cb4a41c 76 {
andrewboyson 128:79052cb4a41c 77 c = *p++;
andrewboyson 128:79052cb4a41c 78 if (c == 0) break; //End of the fqdn so stop
andrewboyson 128:79052cb4a41c 79 if (c == '.')
andrewboyson 128:79052cb4a41c 80 {
andrewboyson 128:79052cb4a41c 81 if (protocol == DNS_PROTOCOL_UDNS)
andrewboyson 128:79052cb4a41c 82 {
andrewboyson 128:79052cb4a41c 83 if (strcmp(p, DhcpDomainName) == 0) break; //Strip the domain from a UDNS fqdn if, and only if, it matches the domain given in DHCP. IPv4 only.
andrewboyson 128:79052cb4a41c 84 }
andrewboyson 128:79052cb4a41c 85 else
andrewboyson 128:79052cb4a41c 86 {
andrewboyson 128:79052cb4a41c 87 break; //Strip the domain from an LLMNR (there shouldn't be one) or MDNS (it should always be '.local') fqdn
andrewboyson 128:79052cb4a41c 88 }
andrewboyson 128:79052cb4a41c 89 }
andrewboyson 128:79052cb4a41c 90 *result++ = c;
andrewboyson 128:79052cb4a41c 91 i++;
andrewboyson 128:79052cb4a41c 92 }
andrewboyson 128:79052cb4a41c 93 *result = 0; //Terminate the copied string
andrewboyson 128:79052cb4a41c 94 return i;
andrewboyson 128:79052cb4a41c 95 }