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/icmp6.c
- 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);