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
udp/dns/dnslabel.c@128:79052cb4a41c, 2019-03-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |