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:
Mon Mar 11 16:42:45 2019 +0000
Revision:
128:79052cb4a41c
Child:
182:ff48c6ea91c1
Tidied up the DNS label module and removed some declarations that had not left room for the terminating null.

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 }