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: eth/eth.c
- Revision:
- 136:8a65abb0dc63
- Parent:
- 98:b977424ec7f7
- Child:
- 142:a8c0890a58d1
--- a/eth/eth.c Sat Mar 23 12:25:48 2019 +0000 +++ b/eth/eth.c Sat Apr 06 11:20:20 2019 +0000 @@ -13,13 +13,13 @@ #define MTU 1500 //header variables -__packed struct header -{ - char dst[6]; - char src[6]; - uint16_t typ; -}; -static uint16_t protocol; +static char* hdrDstPtr(char* pPacket) { return pPacket + 0; } +static char* hdrSrcPtr(char* pPacket) { return pPacket + 6; } +static char* hdrTypPtr(char* pPacket) { return pPacket + 12; } +#define HEADER_LENGTH 14 +static uint16_t hdrTypGet(char* pPacket) { uint16_t res; NetInvert16(&res, hdrTypPtr(pPacket) ); return res; } +static void hdrTypSet(char* pPacket, uint16_t value) { NetInvert16( hdrTypPtr(pPacket), &value); } + void EthProtocolLog(uint16_t prototype) { switch (prototype) @@ -30,64 +30,58 @@ default: LogF("%04hX", prototype); break; } } -void LogHeader(struct header* pHeader) +void LogHeader(char* pPacket) { if (NetTraceVerbose) { Log("ETH header\r\n"); - Log(" Destination: "); MacLog(pHeader->dst); Log("\r\n"); - Log(" Source: "); MacLog(pHeader->src); Log("\r\n"); - Log(" EtherType: "); EthProtocolLog(NetToHost16(pHeader->typ)); Log("\r\n"); + Log(" Destination: "); MacLog(hdrDstPtr(pPacket)); Log("\r\n"); + Log(" Source: "); MacLog(hdrSrcPtr(pPacket)); Log("\r\n"); + Log(" EtherType: "); EthProtocolLog(hdrTypGet(pPacket)); Log("\r\n"); } else { Log("ETH header "); - EthProtocolLog(NetToHost16(pHeader->typ)); + EthProtocolLog(hdrTypGet(pPacket)); Log(" "); - MacLog(pHeader->src); + MacLog(hdrSrcPtr(pPacket)); Log(" >>> "); - MacLog(pHeader->dst); + MacLog(hdrDstPtr(pPacket)); Log("\r\n"); } } -static void* tracePacket; -static void trace() -{ - struct header * pHeader = (struct header*)tracePacket; - LogHeader(pHeader); -} -int EthHandlePacket(void* pPacketRx, int sizeRx, void* pPacketTx, int* pSizeTx) +static char* tracePacket; +static void trace() { LogHeader(tracePacket); } +int EthHandlePacket(char* pPacketRx, int sizeRx, char* pPacketTx, int* pSizeTx) { int lastFaultPoint = FaultPoint; FaultPoint = FAULT_POINT_EthHandlePacket; tracePacket = pPacketRx; - struct header * pHeaderRx = (struct header*)pPacketRx; - struct header * pHeaderTx = (struct header*)pPacketTx; - void* pDataRx = (char*)pPacketRx + sizeof(struct header); - void* pDataTx = (char*)pPacketTx + sizeof(struct header); - int dataLengthRx = sizeRx - sizeof(struct header); - int dataLengthTx = *pSizeTx - sizeof(struct header); + char* pDataRx = pPacketRx + HEADER_LENGTH; + char* pDataTx = pPacketTx + HEADER_LENGTH; + int dataLengthRx = sizeRx - HEADER_LENGTH; + int dataLengthTx = *pSizeTx - HEADER_LENGTH; if (dataLengthTx > MTU) dataLengthTx = MTU; //Limit the transmitted length to the maximum ethernet frame payload length - if (!MacAccept(pHeaderRx->dst)) + if (!MacAccept(hdrDstPtr(pPacketRx))) { FaultPoint = lastFaultPoint; return DO_NOTHING; } - protocol = NetToHost16(pHeaderRx->typ); + uint16_t protocol = hdrTypGet(pPacketRx); if (protocol < 1500) { FaultPoint = lastFaultPoint; return DO_NOTHING; //drop 802.3 messages } - NetTraceHostCheckMac(pHeaderRx->src); + NetTraceHostCheckMac(hdrSrcPtr(pPacketRx)); int action = DO_NOTHING; - char* macRemote = pHeaderRx->src; + char* macRemote = hdrSrcPtr(pPacketRx); switch (protocol) { case ARP: action = ArpHandleReceivedPacket(trace, pDataRx, dataLengthRx, pDataTx, &dataLengthTx); break; @@ -110,26 +104,25 @@ } MacMakeFromDest(ActionGetDestPart(action), protocol, macRemote); - MacCopy(pHeaderTx->src, MacLocal); - MacCopy(pHeaderTx->dst, macRemote); - pHeaderTx->typ = NetToHost16(protocol); + MacCopy(hdrSrcPtr(pPacketTx), MacLocal); + MacCopy(hdrDstPtr(pPacketTx), macRemote); + hdrTypSet(pPacketTx, protocol); - *pSizeTx = sizeof(struct header) + dataLengthTx; + *pSizeTx = HEADER_LENGTH + dataLengthTx; - if (ActionGetTracePart(action)) LogHeader(pHeaderTx); + if (ActionGetTracePart(action)) LogHeader(pPacketTx); FaultPoint = lastFaultPoint; return action; } -int EthPollForPacketToSend(void* pPacket, int* pSize) +int EthPollForPacketToSend(char* pPacket, int* pSize) { - struct header * pHeader = (struct header*)pPacket; - void* pData = (char*)pPacket + sizeof(struct header); + char* pData = pPacket + HEADER_LENGTH; + int dataLength = *pSize - HEADER_LENGTH; + if (dataLength > MTU) dataLength = MTU; //Limit the transmitted length to the maximum ethernet frame payload length - int dataLength = *pSize - sizeof(struct header); - if (dataLength > MTU) dataLength = MTU; //Limit the transmitted length to the maximum ethernet frame payload length - protocol = 0; int action = DO_NOTHING; + uint16_t protocol = 0; if (!action) { action = ArpPollForPacketToSend(pData, &dataLength); @@ -138,25 +131,25 @@ if (!action) { - action = Ip6PollForPacketToSend(pData, &dataLength, pHeader->dst); + action = Ip6PollForPacketToSend(pData, &dataLength, hdrDstPtr(pPacket)); protocol = IPV6; } if (!action) { - action = Ip4PollForPacketToSend(pData, &dataLength, pHeader->dst); + action = Ip4PollForPacketToSend(pData, &dataLength, hdrDstPtr(pPacket)); protocol = IPV4; } if (!action) return DO_NOTHING; - MacMakeFromDest(ActionGetDestPart(action), protocol, pHeader->dst); - MacCopy(pHeader->src, MacLocal); - pHeader->typ = NetToHost16(protocol); + MacMakeFromDest(ActionGetDestPart(action), protocol, hdrDstPtr(pPacket)); + MacCopy(hdrSrcPtr(pPacket), MacLocal); + hdrTypSet(pPacket, protocol); - *pSize = sizeof(struct header) + dataLength; + *pSize = HEADER_LENGTH + dataLength; - if (ActionGetTracePart(action)) LogHeader(pHeader); + if (ActionGetTracePart(action)) LogHeader(pPacket); return action; }