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/ip6.cpp
- Revision:
- 44:83ce5ace337b
- Parent:
- 43:bc028d5a6424
- Child:
- 46:40d33e9037e4
--- a/ip6/ip6.cpp Thu Oct 19 20:56:58 2017 +0000
+++ b/ip6/ip6.cpp Sun Oct 22 17:19:17 2017 +0000
@@ -75,7 +75,7 @@
char Ip6Mdns [] = {0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb};
char Ip6Llmnr [] = {0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03};
-void Ip6DestIpFromDest(int dest, char* pDstIp)
+void Ip6DstIpFromDest(int dest, char* pDstIp)
{
switch (dest)
{
@@ -91,6 +91,12 @@
break;
}
}
+void Ip6SrcIpFromScope(int scope, char* pSrcIp)
+{
+ if (scope == SCOPE_GLOBAL) Ip6Copy(pSrcIp, SlaacGlobalIp );
+ else Ip6Copy(pSrcIp, SlaacLinkLocalIp);
+ //Note that scope could be SCOPE_NONE if source was multicast in which case should return the link local ip.
+}
#define HEADER_LENGTH 40
__packed struct header
@@ -125,7 +131,7 @@
{
pHeader->versionTrafficFlow = version << 4;
pHeader->protocol = protocol;
- pHeader->hoplimit = 255;
+ pHeader->hoplimit = hoplimit;
Ip6Copy(pHeader->dst, dstIp);
Ip6Copy(pHeader->src, srcIp);
pHeader->dataLength = NetToHost16(dataLength);
@@ -149,7 +155,7 @@
}
else
{
- Log("IP6 header ");
+ Log("IP6 header ");
IpProtocolToString(protocol, sizeof(text), text);
Log(text);
Log(" ");
@@ -207,12 +213,12 @@
struct header * pHeader = (header*)pPacket;
readHeader(pHeader);
- bool isMe = SlaacIsMe(dstIp);
+ int scope = SlaacScope(dstIp);
bool isMulticast = dstIp[0] == 0xFF;
bool isSolicited = getIsSolicited(dstIp);
bool isGroup = getIsSameGroup(dstIp, SlaacLinkLocalIp);
- bool doIt = isMe || (isMulticast && !isSolicited) || (isGroup && isSolicited);
+ bool doIt = scope || (isMulticast && !isSolicited) || (isGroup && isSolicited);
if (!doIt)
{
@@ -233,17 +239,18 @@
int action = DO_NOTHING;
switch (protocol)
{
- case HOPOPT: action = DO_NOTHING; break;
- case ICMP6: action = Icmp6HandleReceivedPacket(trace, srcIp, dstIp, &dataLength, pData); break;
- case UDP: action = Udp6HandleReceivedPacket(trace, srcIp, dstIp, &dataLength, pData); break;
- case TCP: action = Tcp6HandleReceivedPacket(trace, srcIp, dstIp, &dataLength, pData); break;
+ case HOPOPT: action = DO_NOTHING; break;
+ case ICMP6: action = Icmp6HandleReceivedPacket(trace, scope, srcIp, dstIp, &dataLength, pData); break;
+ case UDP: action = Udp6HandleReceivedPacket(trace, scope, srcIp, dstIp, &dataLength, pData); break;
+ case TCP: action = Tcp6HandleReceivedPacket(trace, scope, srcIp, dstIp, &dataLength, pData); break;
default:
LogTimeF("IP6 protocol %d unhandled\r\n", protocol);
return DO_NOTHING;
}
if (!action) return DO_NOTHING;
- MacCopy(pDstMac, pSrcMac);
+ if (RaIpNeedsToBeRouted(dstIp)) MacCopy(pDstMac, RaRouterMac); //Send to the router MAC
+ else MacCopy(pDstMac, pSrcMac); //Send back to the source
writeHeader(pHeader);
@@ -281,7 +288,8 @@
case UNICAST_DNS:
case UNICAST_DHCP:
case UNICAST_NTP:
- ArIpToMac6(dstIp, pDstMac); //Make the remote MAC from NP
+ if (RaIpNeedsToBeRouted(dstIp)) MacCopy(pDstMac, RaRouterMac); //Send to the router MAC
+ else ArIpToMac6(dstIp, pDstMac); //Make the remote MAC from NP
break;
case MULTICAST_NODE:
case MULTICAST_ROUTER: