Andrew Boyson / net

Dependents:   oldheating gps motorhome heating

Revision:
172:9bc3c7b2cca1
Parent:
169:336d499dc560
Child:
177:2cd7fde8bfe5
--- a/udp/dns/dnsserver.c	Sat Dec 12 20:10:02 2020 +0000
+++ b/udp/dns/dnsserver.c	Wed Dec 16 17:33:22 2020 +0000
@@ -15,13 +15,15 @@
 
 bool DnsServerTrace = false;
 
-#define RECORD_NONE        0
-#define RECORD_PTR4        1
-#define RECORD_PTR6_LOCAL  2
-#define RECORD_PTR6_GLOBAL 3
-#define RECORD_A           4
-#define RECORD_AAAA_LOCAL  5
-#define RECORD_AAAA_GLOBAL 6
+#define RECORD_NONE               0
+#define RECORD_PTR4               1
+#define RECORD_PTR6_LINK_LOCAL    2
+#define RECORD_PTR6_UNIQUE_LOCAL  3
+#define RECORD_PTR6_GLOBAL        4
+#define RECORD_A                  5
+#define RECORD_AAAA_LINK_LOCAL    6
+#define RECORD_AAAA_UNIQUE_LOCAL  7
+#define RECORD_AAAA_GLOBAL        8
 
 #define MAX_ANSWERS 4
 
@@ -71,6 +73,7 @@
         bool nodeIsName6 = DnsNameComparePtr(p, myFullName6);
         bool nodeIsAddr4 = DnsNameCompareIp4(p, DhcpLocalIp);
         bool nodeIsLocl6 = DnsNameCompareIp6(p, SlaacLinkLocalIp);
+        bool nodeIsUniq6 = DnsNameCompareIp6(p, SlaacUniqueLocalIp);
         bool nodeIsGlob6 = DnsNameCompareIp6(p, SlaacGlobalIp);
         p += nameLength;                          //Skip past the name
                 
@@ -84,9 +87,12 @@
         
         //Handle the questions
         if (nodeIsName4 && recordType == DNS_RECORD_A   )   answers[answerCount++] = RECORD_A;
-        if (nodeIsName6 && recordType == DNS_RECORD_AAAA) { answers[answerCount++] = RECORD_AAAA_LOCAL; answers[answerCount++] = RECORD_AAAA_GLOBAL; }
+        if (nodeIsName6 && recordType == DNS_RECORD_AAAA) { answers[answerCount++] = RECORD_AAAA_LINK_LOCAL;
+                                                            answers[answerCount++] = RECORD_AAAA_UNIQUE_LOCAL;
+                                                            answers[answerCount++] = RECORD_AAAA_GLOBAL; }
         if (nodeIsAddr4 && recordType == DNS_RECORD_PTR )   answers[answerCount++] = RECORD_PTR4;
-        if (nodeIsLocl6 && recordType == DNS_RECORD_PTR )   answers[answerCount++] = RECORD_PTR6_LOCAL;
+        if (nodeIsLocl6 && recordType == DNS_RECORD_PTR )   answers[answerCount++] = RECORD_PTR6_LINK_LOCAL;
+        if (nodeIsUniq6 && recordType == DNS_RECORD_PTR )   answers[answerCount++] = RECORD_PTR6_UNIQUE_LOCAL;
         if (nodeIsGlob6 && recordType == DNS_RECORD_PTR )   answers[answerCount++] = RECORD_PTR6_GLOBAL;
     }
     return 0;
@@ -107,24 +113,28 @@
         //Encode the node name
         switch (answers[i])
         {
-            case RECORD_A:           DnsNameEncodePtr(myFullName4,      &p); break;
-            case RECORD_AAAA_LOCAL:  DnsNameEncodePtr(myFullName6,      &p); break;  
-            case RECORD_AAAA_GLOBAL: DnsNameEncodePtr(myFullName6,      &p); break;
-            case RECORD_PTR4:        DnsNameEncodeIp4(DhcpLocalIp,      &p); break;
-            case RECORD_PTR6_LOCAL:  DnsNameEncodeIp6(SlaacLinkLocalIp, &p); break;
-            case RECORD_PTR6_GLOBAL: DnsNameEncodeIp6(SlaacGlobalIp,    &p); break;
+            case RECORD_A:                 DnsNameEncodePtr(myFullName4,        &p); break;
+            case RECORD_AAAA_LINK_LOCAL:   DnsNameEncodePtr(myFullName6,        &p); break;
+            case RECORD_AAAA_UNIQUE_LOCAL: DnsNameEncodePtr(myFullName6,        &p); break;
+            case RECORD_AAAA_GLOBAL:       DnsNameEncodePtr(myFullName6,        &p); break;
+            case RECORD_PTR4:              DnsNameEncodeIp4(DhcpLocalIp,        &p); break;
+            case RECORD_PTR6_LINK_LOCAL:   DnsNameEncodeIp6(SlaacLinkLocalIp,   &p); break;
+            case RECORD_PTR6_UNIQUE_LOCAL: DnsNameEncodeIp6(SlaacUniqueLocalIp, &p); break;
+            case RECORD_PTR6_GLOBAL:       DnsNameEncodeIp6(SlaacGlobalIp,      &p); break;
         }
         
         //Add the 16 bit type
         *p++ = 0;
         switch (answers[i])
         {
-            case RECORD_A:           *p++ = DNS_RECORD_A;    break;
-            case RECORD_AAAA_LOCAL:  *p++ = DNS_RECORD_AAAA; break;
-            case RECORD_AAAA_GLOBAL: *p++ = DNS_RECORD_AAAA; break;
-            case RECORD_PTR4:        *p++ = DNS_RECORD_PTR;  break;
-            case RECORD_PTR6_LOCAL:  *p++ = DNS_RECORD_PTR;  break;
-            case RECORD_PTR6_GLOBAL: *p++ = DNS_RECORD_PTR;  break;
+            case RECORD_A:                 *p++ = DNS_RECORD_A;    break;
+            case RECORD_AAAA_LINK_LOCAL:   *p++ = DNS_RECORD_AAAA; break;
+            case RECORD_AAAA_UNIQUE_LOCAL: *p++ = DNS_RECORD_AAAA; break;
+            case RECORD_AAAA_GLOBAL:       *p++ = DNS_RECORD_AAAA; break;
+            case RECORD_PTR4:              *p++ = DNS_RECORD_PTR;  break;
+            case RECORD_PTR6_LINK_LOCAL:   *p++ = DNS_RECORD_PTR;  break;
+            case RECORD_PTR6_UNIQUE_LOCAL: *p++ = DNS_RECORD_PTR;  break;
+            case RECORD_PTR6_GLOBAL:       *p++ = DNS_RECORD_PTR;  break;
         }
         
         //Add the class
@@ -139,23 +149,27 @@
         *p++ = 0;
         switch (answers[i])
         {
-            case RECORD_A:           *p++ =  4;                    break;
-            case RECORD_AAAA_LOCAL:  *p++ = 16;                    break;
-            case RECORD_AAAA_GLOBAL: *p++ = 16;                    break;
-            case RECORD_PTR4:        *p++ = myFullName4Length + 2; break; //add a byte for the initial length and another for the terminating zero length
-            case RECORD_PTR6_LOCAL:  *p++ = myFullName6Length + 2; break;
-            case RECORD_PTR6_GLOBAL: *p++ = myFullName6Length + 2; break;
+            case RECORD_A:                 *p++ =  4;                    break;
+            case RECORD_AAAA_LINK_LOCAL:   *p++ = 16;                    break;
+            case RECORD_AAAA_UNIQUE_LOCAL: *p++ = 16;                    break;
+            case RECORD_AAAA_GLOBAL:       *p++ = 16;                    break;
+            case RECORD_PTR4:              *p++ = myFullName4Length + 2; break; //add a byte for the initial length and another for the terminating zero length
+            case RECORD_PTR6_LINK_LOCAL:   *p++ = myFullName6Length + 2; break;
+            case RECORD_PTR6_UNIQUE_LOCAL: *p++ = myFullName6Length + 2; break;
+            case RECORD_PTR6_GLOBAL:       *p++ = myFullName6Length + 2; break;
         }
         
         //Add the payload
         switch (answers[i])
         {
-            case RECORD_A:           memcpy(p, &DhcpLocalIp,      4); p +=  4; break;
-            case RECORD_AAAA_LOCAL:  memcpy(p, SlaacLinkLocalIp, 16); p += 16; break;
-            case RECORD_AAAA_GLOBAL: memcpy(p, SlaacGlobalIp,    16); p += 16; break;
-            case RECORD_PTR4:        DnsNameEncodePtr(myFullName4, &p);        break;
-            case RECORD_PTR6_LOCAL:  DnsNameEncodePtr(myFullName6, &p);        break;
-            case RECORD_PTR6_GLOBAL: DnsNameEncodePtr(myFullName6, &p);        break;
+            case RECORD_A:                 memcpy(p, &DhcpLocalIp,        4); p +=  4; break;
+            case RECORD_AAAA_LINK_LOCAL:   memcpy(p, SlaacLinkLocalIp,   16); p += 16; break;
+            case RECORD_AAAA_UNIQUE_LOCAL: memcpy(p, SlaacUniqueLocalIp, 16); p += 16; break;
+            case RECORD_AAAA_GLOBAL:       memcpy(p, SlaacGlobalIp,      16); p += 16; break;
+            case RECORD_PTR4:              DnsNameEncodePtr(myFullName4, &p);          break;
+            case RECORD_PTR6_LINK_LOCAL:   DnsNameEncodePtr(myFullName6, &p);          break;
+            case RECORD_PTR6_UNIQUE_LOCAL: DnsNameEncodePtr(myFullName6, &p);          break;
+            case RECORD_PTR6_GLOBAL:       DnsNameEncodePtr(myFullName6, &p);          break;
         }
         //Increment the number of good answers to send
         DnsHdrAncount++;