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:
37:793b39683406
Parent:
36:900e24b27bfb
Child:
42:222a4f45f916
--- 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;
 }