A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.
Dependents: oldheating gps motorhome heating
Diff: ip6/icmp/ndp/ra.c
- Revision:
- 137:cf6e7db0e985
- Parent:
- 119:8e1a7805b801
--- a/ip6/icmp/ndp/ra.c Sat Apr 06 11:20:20 2019 +0000 +++ b/ip6/icmp/ndp/ra.c Sun Apr 07 11:05:16 2019 +0000 @@ -12,24 +12,24 @@ bool RaTrace = false; -__packed struct header +static uint8_t hdrGetHop (char* pPacket) { return *(pPacket + 0); } +static uint8_t hdrGetMo (char* pPacket) { return *(pPacket + 1); } +static uint16_t hdrGetLifetime (char* pPacket) { uint16_t r; NetInvert16(&r, pPacket + 2); return r; } +static uint32_t hdrGetReachable(char* pPacket) { uint32_t r; NetInvert32(&r, pPacket + 4); return r; } +static uint32_t hdrGetRetrans (char* pPacket) { uint32_t r; NetInvert32(&r, pPacket + 8); return r; } +static const int HEADER_LENGTH = 12; + +void logHeader(char* pPacket, int dataLength) { - uint8_t hop; - uint8_t mo; - uint16_t lifetime; - uint32_t reachable; - uint32_t retrans; -}; -void logHeader(struct header* pHeader, char* pData, int dataLength) -{ + char* pData = pPacket + HEADER_LENGTH; if (NetTraceVerbose) { Log("RA header\r\n"); - LogF(" Hop limit %d\r\n", pHeader->hop); - LogF(" M O %x\r\n", pHeader->mo); - LogF(" Lifetime %d\r\n", NetToHost16(pHeader->lifetime)); - LogF(" Reachable %d\r\n", NetToHost32(pHeader->reachable)); - LogF(" Retrans %d\r\n", NetToHost32(pHeader->retrans)); + LogF(" Hop limit %d\r\n", hdrGetHop (pPacket)); + LogF(" M O %x\r\n", hdrGetMo (pPacket)); + LogF(" Lifetime %d\r\n", hdrGetLifetime (pPacket)); + LogF(" Reachable %d\r\n", hdrGetReachable(pPacket)); + LogF(" Retrans %d\r\n", hdrGetRetrans (pPacket)); NdpLogOptionsVerbose(pData, dataLength); } else @@ -39,23 +39,22 @@ Log("\r\n"); } } -int RaHandleReceivedAdvertisement(void (*traceback)(void), void* pPacket, int* pSize) +int RaHandleReceivedAdvertisement(void (*traceback)(void), char* pPacket, int* pSize) { - struct header* pHeader = (struct header*)pPacket; - char* pData = (char*)pHeader + sizeof(struct header); - int dataLength = *pSize - sizeof(struct header); + char* pData = pPacket + HEADER_LENGTH; + int dataLength = *pSize - HEADER_LENGTH; - NdpHopLimit = pHeader->hop; - NdpManagedConfiguration = pHeader->mo & 0x80; - NdpOtherConfiguration = pHeader->mo & 0x40; - NdpSetLease (NetToHost16(pHeader->lifetime)); //This resets the NdpElapsedTimer + NdpHopLimit = hdrGetHop (pPacket); + NdpManagedConfiguration = hdrGetMo (pPacket) & 0x80; + NdpOtherConfiguration = hdrGetMo (pPacket) & 0x40; + NdpSetLease (hdrGetLifetime(pPacket)); //This resets the NdpElapsedTimer if (RaTrace) { if (NetTraceNewLine) Log("\r\n"); LogTimeF("NDP received router advertise\r\n"); if (NetTraceStack) traceback(); - logHeader(pHeader, pData, dataLength); + logHeader(pPacket, dataLength); } NdpDecodeOptions(pData, dataLength, NdpRouterMac, NULL);