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.cpp
- Revision:
- 37:793b39683406
- Parent:
- 36:900e24b27bfb
- Child:
- 42:222a4f45f916
diff -r 900e24b27bfb -r 793b39683406 eth/eth.cpp --- a/eth/eth.cpp Mon Sep 25 07:09:32 2017 +0000 +++ b/eth/eth.cpp Wed Oct 04 07:51:02 2017 +0000 @@ -1,18 +1,17 @@ -#include "mbed.h" -#include "io.h" -#include "log.h" -#include "net.h" -#include "arp.h" -#include "ip4.h" -#include "ip6.h" -#include "phy.h" -#include "eth.h" -#include "mac.h" +#include "mbed.h" +#include "io.h" +#include "log.h" +#include "net.h" +#include "action.h" +#include "arp.h" +#include "ip4.h" +#include "ip6.h" +#include "phy.h" +#include "eth.h" +#include "mac.h" #define HEADER_SIZE 14 -#define DEBUG false - __packed struct header { char dst[6]; @@ -26,9 +25,9 @@ { switch (prototype) { - case ARP: strncpy (text, "ARP" , size); break; - case IPV4: strncpy (text, "IPV4", size); break; - case IPV6: strncpy (text, "IPV6", size); break; + case ARP: strncpy (text, "ARP" , size); break; + case IPV4: strncpy (text, "IPV4", size); break; + case IPV6: strncpy (text, "IPV6", size); break; default: snprintf(text, size, "%04hX", prototype); break; } } @@ -46,36 +45,41 @@ *pSize = HEADER_SIZE + dataLength; } -void LogHeader(struct header* pHeader, char* title) +void LogHeader(struct header* pHeader) { char text[20]; - LogTimeF("ETH %s\r\n", title); - MacToString(pHeader->dst, sizeof(text), text); - LogTimeF("Destination: %s\r\n", text); - MacToString(pHeader->src, sizeof(text), text); - LogTimeF("Source: %s\r\n", text); - EthProtocolToString(NetToHost16(pHeader->typ), sizeof(text), text); - LogTimeF("EtherType: %s\r\n", text); + Log("ETH header\r\n"); + MacToString(pHeader->dst, sizeof(text), text); LogF(" Destination: %s\r\n", text); + MacToString(pHeader->src, sizeof(text), text); LogF(" Source: %s\r\n", text); + EthProtocolToString(NetToHost16(pHeader->typ), sizeof(text), text); LogF(" EtherType: %s\r\n", text); } -int EthHandlePacket(void* pPacket, int* pSize) +static void (*pTraceBack)(void); +static void* tracePacket; +static void trace() { + pTraceBack(); + struct header * pHeader = (header*)tracePacket; + LogHeader(pHeader); +} +int EthHandlePacket(void (*traceback)(void), void* pPacket, int* pSize) +{ + pTraceBack = traceback; + tracePacket = pPacket; struct header * pHeader = (header*)pPacket; int dataLength = *pSize - HEADER_SIZE; void* pData = (char*)pPacket + HEADER_SIZE; if (!MacAccept(pHeader->dst)) return DO_NOTHING; - if (DEBUG) LogHeader(pHeader, "received packet"); - EthProtocol = NetToHost16(pHeader->typ); if (EthProtocol < 1500) return DO_NOTHING; //drop 802.3 messages int action = DO_NOTHING; switch (EthProtocol) { - case ARP: action = ArpHandleReceivedPacket(pHeader->src, pData, &dataLength, pHeader->dst); break; - case IPV4: action = Ip4HandleReceivedPacket(pHeader->src, pData, &dataLength, pHeader->dst); break; - case IPV6: action = Ip6HandleReceivedPacket(pHeader->src, pData, &dataLength, pHeader->dst); break; + case ARP: action = ArpHandleReceivedPacket(trace, pHeader->src, pData, &dataLength, pHeader->dst); break; + case IPV4: action = Ip4HandleReceivedPacket(trace, pHeader->src, pData, &dataLength, pHeader->dst); break; + case IPV6: action = Ip6HandleReceivedPacket(trace, pHeader->src, pData, &dataLength, pHeader->dst); break; case 0x6970: break; //Drop Sonos group membership packet case 0x7374: break; //Drop Sky Q packet case 0x7475: break; //Drop Sky Q packet @@ -83,11 +87,14 @@ case 0x8100: break; //Drop Sky Q VLAN 802.1Q packet case 0x887b: break; //Drop Sky Q packet default: - LogHeader(pHeader, "packet not handled"); + LogTimeF("ETH protocol %d not handled", EthProtocol); break; } finalisePacket(action, dataLength, pPacket, pSize); + + if (ActionGetTracePart(action)) LogHeader(pHeader); + return action; } int EthPollForPacketToSend(void* pPacket, int* pSize) @@ -119,7 +126,7 @@ finalisePacket(action, dataLength, pPacket, pSize); - if (DEBUG) LogHeader(pHeader, "sent packet"); + if (ActionGetTracePart(action)) LogHeader(pHeader); return action; }