Andrew Boyson / net

Dependents:   oldheating gps motorhome heating

Revision:
138:5ff0c7069300
Parent:
136:8a65abb0dc63
Child:
172:9bc3c7b2cca1
--- a/ip6/icmp/icmp6.c	Sun Apr 07 11:05:16 2019 +0000
+++ b/ip6/icmp/icmp6.c	Sun Apr 07 18:36:42 2019 +0000
@@ -13,12 +13,11 @@
 #include   "dest6.h"
 #include "checksum.h"
 
-__packed struct header
-{
-    uint8_t  type;
-    uint8_t  code;
-    uint16_t checksum;
-};
+static char* hdrPtrType    (char* pPacket) { return pPacket + 0; } //1
+static char* hdrPtrCode    (char* pPacket) { return pPacket + 1; } //1
+static char* hdrPtrChecksum(char* pPacket) { return pPacket + 2; } //2
+static const int HEADER_LENGTH = 4;
+
 static uint8_t  type;
 static uint8_t  code;
 static uint16_t checksum;
@@ -39,7 +38,7 @@
         default:  LogF("Unknown type %u", type    ); break;
     }
 }
-static uint16_t calculateChecksum(char* pSrcIp, char* pDstIp, int size, void* pPacket)
+static uint16_t calculateChecksum(char* pSrcIp, char* pDstIp, int size, char* pPacket)
 {   
     uint32_t sum = 0;
     uint32_t pro32 = ICMP6;
@@ -66,22 +65,21 @@
         Log("\r\n");
     }
 }
-static void readHeader(char* pSrcIp, char* pDstIp, void* pPacket, int size)
+static void readHeader(char* pSrcIp, char* pDstIp, char* pPacket, int size)
 {
-    struct header* pHeader = (struct header*)pPacket;
-                  type =             pHeader->type;
-                  code =             pHeader->code;
-              checksum = NetToHost16(pHeader->checksum);
+    type = *hdrPtrType(pPacket);
+    code = *hdrPtrCode(pPacket);
+    NetDirect16(&checksum, hdrPtrChecksum(pPacket));
     calculatedChecksum = calculateChecksum(pSrcIp, pDstIp, size, pPacket);
 }
-static void writeHeader(void* pPacket, int size, char* pSrcIp, char* pDstIp)
-{    
-    struct header* pHeader = (struct header*)pPacket;
-    pHeader->type     = type;
-    pHeader->code     = code;
-    pHeader->checksum = 0;
+static void writeHeader(char* pPacket, int size, char* pSrcIp, char* pDstIp)
+{
+    *hdrPtrType(pPacket) = type;
+    *hdrPtrCode(pPacket) = code;
+    checksum = 0;
+    NetDirect16(hdrPtrChecksum(pPacket), &checksum);
     checksum = calculateChecksum(pSrcIp, pDstIp, size, pPacket);
-    pHeader->checksum = checksum;
+    NetDirect16(hdrPtrChecksum(pPacket), &checksum);
     calculatedChecksum = 0;
 }
 static void (*pTraceBack)(void);
@@ -90,16 +88,16 @@
     pTraceBack();
     logHeader();
 }
-int Icmp6HandleReceivedPacket(void (*traceback)(void), int scope, void* pPacketRx, int sizeRx, void* pPacketTx, int* pSizeTx, char* pSrcIp, char* pDstIp)
+int Icmp6HandleReceivedPacket(void (*traceback)(void), int scope, char* pPacketRx, int sizeRx, char* pPacketTx, int* pSizeTx, char* pSrcIp, char* pDstIp)
 {
     pTraceBack = traceback;
         
     readHeader(pSrcIp, pDstIp, pPacketRx, sizeRx);
     
-    int dataLengthRx =           sizeRx - sizeof(struct header);
-    int dataLengthTx =         *pSizeTx - sizeof(struct header);
-    char* pPayloadRx = (char*)pPacketRx + sizeof(struct header);
-    char* pPayloadTx = (char*)pPacketTx + sizeof(struct header);
+    int dataLengthRx =    sizeRx - HEADER_LENGTH;
+    int dataLengthTx =  *pSizeTx - HEADER_LENGTH;
+    char* pPayloadRx = pPacketRx + HEADER_LENGTH;
+    char* pPayloadTx = pPacketTx + HEADER_LENGTH;
 
     int action = DO_NOTHING;
     switch (type)
@@ -131,7 +129,7 @@
     SlaacAddressFromScope(scope,                     pSrcIp);
       Ip6AddressFromDest (ActionGetDestPart(action), pDstIp);
 
-    *pSizeTx = sizeof(struct header) + dataLengthTx;
+    *pSizeTx = HEADER_LENGTH + dataLengthTx;
     
     writeHeader(pPacketTx, *pSizeTx, pSrcIp, pDstIp);
     
@@ -139,10 +137,10 @@
     
     return action;
 }
-int Icmp6PollForPacketToSend(void* pPacket, int* pSize, char* pSrcIp, char* pDstIp)
+int Icmp6PollForPacketToSend(char* pPacket, int* pSize, char* pSrcIp, char* pDstIp)
 {    
-    char* pData = (char*)pPacket + sizeof(struct header);
-    int dataLength = *pSize - sizeof(struct header);
+    char* pData    = pPacket + HEADER_LENGTH;
+    int dataLength =  *pSize - HEADER_LENGTH;
     int action  = DO_NOTHING;
     if (!action) action = RsGetWaitingSolicitation(pData, &dataLength, &type, &code);
     if (!action) action = NsGetWaitingSolicitation(pData, &dataLength, &type, &code);
@@ -152,7 +150,7 @@
     SlaacAddressFromScope(scope,                     pSrcIp);
       Ip6AddressFromDest (ActionGetDestPart(action), pDstIp);
 
-    *pSize = sizeof(struct header) + dataLength;
+    *pSize = HEADER_LENGTH + dataLength;
     
     writeHeader(pPacket, *pSize, pSrcIp, pDstIp);