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
--- 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);