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/ns.cpp
- Revision:
- 47:73af5c0b0dc2
- Parent:
- 46:40d33e9037e4
- Child:
- 48:952dddb74b8b
diff -r 40d33e9037e4 -r 73af5c0b0dc2 ip6/icmp/ndp/ns.cpp
--- a/ip6/icmp/ndp/ns.cpp Tue Oct 24 07:01:35 2017 +0000
+++ b/ip6/icmp/ndp/ns.cpp Thu Oct 26 14:50:24 2017 +0000
@@ -8,91 +8,47 @@
#include "ar.h"
#include "ip6.h"
#include "slaac.h"
+#include "ndp.h"
bool NsTraceRecvSol = false;
bool NsTraceRecvAdv = false;
bool NsTraceSendSol = false;
-static char srcMAC[6];
-static char tgtMAC[6];
-
char NsAddressToResolve[16];
bool NsResolveRequestFlag = false;
-static int logOptions(char* p)
+__packed struct header
{
- int type = *p++;
- int size = *p++;
- char text[100];
- switch (type)
- {
- case 1:
- MacToString(p, sizeof(text), text);
- LogF(" Src MAC %s\r\n", text);
- break;
- case 2:
- MacToString(p, sizeof(text), text);
- LogF(" Tgt MAC %s\r\n", text);
- break;
- default:
- LogF(" Unknown option %d\r\n", type);
- break;
- }
- return size * 8;
-}
+ uint32_t reserved;
+ char target[16];
+};
-void logHeader(void* pPacket, int* pSize)
+static void logHeader(void* pPacket, int size)
{
- __packed struct header
- {
- uint32_t reserved;
- char target[16];
- };
struct header* pHeader = (header*)pPacket;
char* pData = (char*)pHeader + sizeof(struct header);
- int dataLength = *pSize - sizeof(struct header);
-
- Log("NDP header\r\n");
- LogF(" Size %d\r\n", *pSize);
- char text[100];
- Ip6AddressToString(pHeader->target, sizeof(text), text);
- LogF(" Target %s\r\n", text);
-
- char* p = pData;
- char* pE = pData + dataLength;
+ int dataLength = size - sizeof(struct header);
- while(p < pE) p += logOptions(p);
-}
-
-static int decodeOptions(char* p)
-{
- int type = *p++;
- int size = *p++;
- switch (type)
+ if (NetTraceVerbose)
{
- case 1:
- memcpy(srcMAC, p, 6);
- break;
- case 2:
- memcpy(tgtMAC, p, 6);
- break;
- default:
- LogF(" Unknown option %d\r\n", type);
- break;
+ Log("NS header\r\n");
+ LogF(" Size %d\r\n", size);
+ LogF(" Target "); Ip6AddressLog(pHeader->target); Log("\r\n");
+ NdpLogOptionsVerbose(pData, dataLength);
}
- return size * 8;
+ else
+ {
+ Log("NS header ");
+ Ip6AddressLog(pHeader->target);
+ NdpLogOptionsQuiet(pData, dataLength);
+ Log("\r\n");
+ }
}
int NsHandleReceivedSolicitation(void (*traceback)(void), void* pPacket, int* pSize, uint8_t* pType, uint8_t* pCode)
{
- __packed struct header
- {
- uint32_t reserved;
- char target[16];
- };
struct header* pHeader = (header*)pPacket;
char* pData = (char*)pHeader + sizeof(struct header);
- int dataLength = *pSize - sizeof(struct header);
//Check it is us
if (!SlaacScope(pHeader->target)) return DO_NOTHING;
@@ -102,12 +58,8 @@
if (NetTraceNewLine) Log("\r\n");
LogTimeF("NDP received neighbour solicit\r\n");
if (NetTraceStack) traceback();
- logHeader(pPacket, pSize);
+ logHeader(pPacket, *pSize);
}
- char* p = pData;
- char* pE = pData + dataLength;
-
- while(p < pE) p += decodeOptions(p);
//Send advertisement
*pType = 136;
@@ -115,26 +67,19 @@
pHeader->reserved = 0x00000060; //R=0 (not a router); S=1 (solicited); O=1 (override)
//pHeader->target is unchanged
- p = pData;
- *p++ = 2; //Target MAC option
- *p++ = 1; //8 bytes
- memcpy(p, MacLocal, 6);
- p += 6;
+ //Add target MAC
+ char* p = pData;
+ p += NdpAddOptionTargetMac(p, MacLocal);
*pSize = sizeof(struct header) + p - pData;
- if (NsTraceRecvSol) logHeader(pPacket, pSize);
+ if (NsTraceRecvSol) logHeader(pPacket, *pSize);
return ActionMakeFromDestAndTrace(UNICAST, NsTraceRecvSol && NetTraceStack);
}
int NsHandleReceivedAdvertisement(void (*traceback)(void), void* pPacket, int* pSize)
{
- __packed struct header
- {
- uint32_t reserved;
- char target[16];
- };
struct header* pHeader = (header*)pPacket;
char* pData = (char*)pHeader + sizeof(struct header);
int dataLength = *pSize - sizeof(struct header);
@@ -144,15 +89,13 @@
if (NetTraceNewLine) Log("\r\n");
LogTimeF("NDP received neighbour advertise\r\n");
if (NetTraceStack) traceback();
- logHeader(pPacket, pSize);
+ logHeader(pPacket, *pSize);
}
- char* p = pData;
- char* pE = pData + dataLength;
+ char tgtMac[6];
+ NdpDecodeOptions(pData, dataLength, NULL, tgtMac);
- while(p < pE) p += decodeOptions(p);
-
- ArAddIp6Record(tgtMAC, pHeader->target);
+ ArAddIp6Record(tgtMac, pHeader->target);
NrMakeRequestForNameFromIp6(pHeader->target);
return DO_NOTHING;
@@ -162,25 +105,17 @@
{
if (!NsResolveRequestFlag) return DO_NOTHING;
NsResolveRequestFlag = false;
-
- __packed struct header
- {
- uint32_t reserved;
- char target[16];
- };
- struct header* pHeader = (header*)pPacket;
- pHeader->reserved = 0;
- memcpy(pHeader->target, NsAddressToResolve, 16);
*pType = 135; //Neighbour solicitation
*pCode = 0;
+
+ struct header* pHeader = (header*)pPacket;
+ pHeader->reserved = 0;
+ Ip6Copy(pHeader->target, NsAddressToResolve);
char* pData = (char*)pHeader + sizeof(struct header);
char* p = pData;
- *p++ = 1; //Source MAC option
- *p++ = 1; //8 bytes
- memcpy(p, MacLocal, 6);
- p += 6;
+ p += NdpAddOptionSourceMac(p, MacLocal);
*pSize = sizeof(struct header) + p - pData;
@@ -188,7 +123,7 @@
{
if (NetTraceNewLine) Log("\r\n");
LogTimeF("NDP sent neighbour solicit\r\n");
- logHeader(pPacket, pSize);
+ logHeader(pPacket, *pSize);
}
return ActionMakeFromDestAndTrace(MULTICAST_NODE, NsTraceSendSol && NetTraceStack);