Andrew Boyson / net

Dependents:   oldheating gps motorhome heating

Revision:
172:9bc3c7b2cca1
Parent:
160:6a1d1d368f80
Child:
173:9bc30cd82a76
--- a/ip6/icmp/ndp/ndp.c	Sat Dec 12 20:10:02 2020 +0000
+++ b/ip6/icmp/ndp/ndp.c	Wed Dec 16 17:33:22 2020 +0000
@@ -16,12 +16,20 @@
 
 char     NdpRouterMac[6];
 
-int      NdpPrefixLength            = 0;
-bool     NdpPrefixFlagL             = false;
-bool     NdpPrefixFlagA             = false;
-uint32_t NdpPrefixValidLifetime     = 0;
-uint32_t NdpPrefixPreferredLifetime = 0;
-char     NdpPrefix[16];
+
+int      NdpGlobalPrefixLength            = 0;
+bool     NdpGlobalPrefixFlagL             = false;
+bool     NdpGlobalPrefixFlagA             = false;
+uint32_t NdpGlobalPrefixValidLifetime     = 0;
+uint32_t NdpGlobalPrefixPreferredLifetime = 0;
+char     NdpGlobalPrefix[16];
+
+int      NdpUniqueLocalPrefixLength            = 0;
+bool     NdpUniqueLocalPrefixFlagL             = false;
+bool     NdpUniqueLocalPrefixFlagA             = false;
+uint32_t NdpUniqueLocalPrefixValidLifetime     = 0;
+uint32_t NdpUniqueLocalPrefixPreferredLifetime = 0;
+char     NdpUniqueLocalPrefix[16];
 
 uint32_t NdpDnsLifetime = 0;
 char     NdpDnsServer[16];
@@ -56,9 +64,9 @@
             LogTime("NDP lease has expired -> clearing NDP information\r\n");
         }
         elapsedLifeMsTimer = MsTimerCount;
-        Ip6AddressClear(NdpPrefix);
-        SlaacMakeGlobal(NdpPrefix);
-        Ip6AddressClear(NdpDnsServer);
+        Ip6AddrClear(SlaacUniqueLocalIp);
+        Ip6AddrClear(SlaacGlobalIp);
+        Ip6AddrClear(NdpDnsServer);
     }
     
     return false;
@@ -67,11 +75,10 @@
 bool NdpIpNeedsToBeRouted(char* ip)
 {
     //Check address is assigned to internet
-    if (*(ip + 0) != 0x20) return false;
-    if (*(ip + 1) != 0x00) return false;
+    if (!Ip6AddrIsGlobal(ip)) return false;
 
     //Check it is not our own prefix
-    if (memcmp(ip, NdpPrefix, 8) == 0) return false;
+    if (memcmp(ip, NdpGlobalPrefix, 8) == 0) return false;
 
     return true;
 }
@@ -99,13 +106,34 @@
             if (dstMac) MacCopy(dstMac, p);
             break;
         case 3:
-            NdpPrefixLength = *p;                                   p += 1;
-            NdpPrefixFlagL = *p & 0x80; NdpPrefixFlagA = *p & 0x40; p += 1;
-            NdpPrefixValidLifetime = decodeUint32(p);               p += 4;
-            NdpPrefixPreferredLifetime = decodeUint32(p);           p += 4;
-            /*Ignore the reserved2 field*/                          p += 4;
-            Ip6AddressCopy(NdpPrefix, p); SlaacMakeGlobal(NdpPrefix);
-            break;
+            {
+                int      length = *p;                               p += 1;
+                uint8_t   flags = *p;                               p += 1;
+                uint32_t validLifetime     = decodeUint32(p);       p += 4;
+                uint32_t preferredLifetime = decodeUint32(p);       p += 4;
+                /*Ignore the reserved2 field*/                      p += 4;
+                if (Ip6AddrIsGlobal(p))
+                {
+                    Ip6AddrCopy(NdpGlobalPrefix,                   p);
+                                NdpGlobalPrefixLength            = length;
+                                NdpGlobalPrefixFlagL             = flags & 0x80;
+                                NdpGlobalPrefixFlagA             = flags & 0x40;
+                                NdpGlobalPrefixValidLifetime     = validLifetime;
+                                NdpGlobalPrefixPreferredLifetime = preferredLifetime;
+                                SlaacMakeGlobal(p);
+                }
+                else if (Ip6AddrIsUniqueLocal(p))
+                {
+                    Ip6AddrCopy(NdpUniqueLocalPrefix,                   p);
+                                NdpUniqueLocalPrefixLength            = length;
+                                NdpUniqueLocalPrefixFlagL             = flags & 0x80;
+                                NdpUniqueLocalPrefixFlagA             = flags & 0x40;
+                                NdpUniqueLocalPrefixValidLifetime     = validLifetime;
+                                NdpUniqueLocalPrefixPreferredLifetime = preferredLifetime;
+                                SlaacMakeUniqueLocal(p);
+                }
+                break;
+            }
         case 5:
             /*Ignore the reserved field*/                           p += 2;
             NdpMtu = decodeUint32(p);
@@ -113,7 +141,7 @@
         case 25:
             /*Ignore the reserved field*/                           p += 2;
             NdpDnsLifetime = decodeUint32(p);                       p += 4;
-            Ip6AddressCopy(NdpDnsServer, p);
+            Ip6AddrCopy(NdpDnsServer, p);
             break;
     }
     return size * 8;
@@ -145,14 +173,14 @@
             value = decodeUint32(p);       Log("    Prefix valid     "); LogF("%u", value); Log("\r\n"); p += 4;
             value = decodeUint32(p);       Log("    Prefix preferred "); LogF("%u", value); Log("\r\n"); p += 4;
             /*Ignore the Reserved2 field*/                                                               p += 4;
-                                           Log("    Prefix           "); Ip6AddressLog(p);  Log("\r\n"); break;
+                                           Log("    Prefix           "); Ip6AddrLog(p);  Log("\r\n"); break;
         case 5:
             /*Ignore the reserved field*/                                                                p += 2;
             value = decodeUint32(p);       Log("    MTU              "); LogF("%u", value); Log("\r\n"); break;
         case 25:
             /*Ignore the reserved field*/                                                                p += 2;
             value = decodeUint32(p);       Log("    DNS lifetime     "); LogF("%u", value); Log("\r\n"); p += 4;
-                                           Log("    DNS Server       "); Ip6AddressLog(p);  Log("\r\n"); break;
+                                           Log("    DNS Server       "); Ip6AddrLog(p);  Log("\r\n"); break;
         default:
                                            Log("    Unknown option   "); LogF("%d", type);  Log("\r\n"); break;
     }
@@ -181,7 +209,7 @@
             p += 4; //Preferred lifetime
             p += 4; //Reserved 2
             Log(" prefix ");
-            Ip6AddressLog(p); //IP6 address
+            Ip6AddrLog(p); //IP6 address
             break;
         case 5:
             p += 2; //Skip past the reserved field
@@ -193,7 +221,7 @@
             p += 2; //Skip past the reserved field
             p += 4; //DNS lifetime
             Log(" DNS ");
-            Ip6AddressLog(p);
+            Ip6AddrLog(p);
             break;
         default:
             LogF(" ? %d", type);