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

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