Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: oldheating gps motorhome heating
Diff: ip6/icmp/ndp/ndp.c
- 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);