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:
15:6ca6778168b1
Child:
47:73af5c0b0dc2
--- a/ip4/udptcp4.cpp	Mon Sep 25 07:09:32 2017 +0000
+++ b/ip4/udptcp4.cpp	Wed Oct 04 07:51:02 2017 +0000
@@ -1,14 +1,13 @@
-#include "mbed.h"
-#include  "log.h"
-#include  "net.h"
-#include "dhcp.h"
-#include  "eth.h"
-#include   "ip.h"
-#include  "ip4.h"
-#include  "tcp.h"
-#include  "udp.h"
-
-#define DEBUG false
+#include   "mbed.h"
+#include    "log.h"
+#include    "net.h"
+#include "action.h"
+#include   "dhcp.h"
+#include    "eth.h"
+#include     "ip.h"
+#include    "ip4.h"
+#include    "tcp.h"
+#include    "udp.h"
 
 static uint16_t calculateChecksum(uint8_t pro, uint32_t srcIp, uint32_t dstIp, int size, void* pPacket)
 {
@@ -33,7 +32,7 @@
 {    
     if (!action) return;
     
-    Ip4DestIpFromAction(action, pDstIp);
+    Ip4DestIpFromDest(ActionGetDestPart(action), pDstIp);
     
     *pSrcIp = DhcpLocalIp;
     
@@ -51,21 +50,38 @@
         case UDP: UdpAddChecksum(pPacket, checksum); break;
     }
     
-    switch (pro)
+    if (ActionGetTracePart(action))
     {
-        case TCP: if (DEBUG)TcpLogHeader("IPv4 packet sent", pPacket, 0); break;
-        case UDP: if (DEBUG)UdpLogHeader("IPv4 packet sent", pPacket, 0); break;
+        switch (pro)
+        {
+            case TCP: TcpLogHeader(0); break;
+            case UDP: UdpLogHeader(0); break;
+        }
     }
 }
 
-int Tcp4HandleReceivedPacket(uint32_t* pSrcIp, uint32_t* pDstIp, int* pSize, void * pPacket)
+static void (*pTraceBack)(void);
+static int tracePacketProtocol;
+static uint16_t calculatedChecksum;
+static void trace()
+{
+    pTraceBack();
+    switch(tracePacketProtocol)
+    {
+        case UDP: UdpLogHeader(calculatedChecksum); break;
+        case TCP: TcpLogHeader(calculatedChecksum); break;
+        default: LogTimeF("UdpTcp4 - traceback unrecognised protocol %d\r\n", tracePacketProtocol); break;
+    }
+}
+int Tcp4HandleReceivedPacket(void (*traceback)(void), uint32_t* pSrcIp, uint32_t* pDstIp, int* pSize, void * pPacket)
 {   
-    uint16_t calculatedChecksum = calculateChecksum(TCP, *pSrcIp, *pDstIp, *pSize, pPacket);
-    if (DEBUG) TcpLogHeader("IPv4 packet received", pPacket, calculatedChecksum);
+    pTraceBack = traceback;
+    tracePacketProtocol = TCP;
+    calculatedChecksum = calculateChecksum(TCP, *pSrcIp, *pDstIp, *pSize, pPacket);
  
     TcpReadHeader(pPacket, *pSize);
         
-    int action = TcpHandleReceivedPacket(pSize, pPacket);
+    int action = TcpHandleReceivedPacket(trace, pSize, pPacket);
     
     *pDstIp = *pSrcIp;
     
@@ -74,14 +90,15 @@
     return action;
 }
 
-int Udp4HandleReceivedPacket(uint32_t* pSrcIp, uint32_t* pDstIp, int* pSize, void * pPacket)
+int Udp4HandleReceivedPacket(void (*traceback)(void), uint32_t* pSrcIp, uint32_t* pDstIp, int* pSize, void* pPacket)
 {   
-    uint16_t calculatedChecksum = calculateChecksum(UDP, *pSrcIp, *pDstIp, *pSize, pPacket);
-    if (DEBUG) UdpLogHeader("IPv4 packet received", pPacket, calculatedChecksum);
+    pTraceBack = traceback;
+    tracePacketProtocol = UDP;
+    calculatedChecksum = calculateChecksum(UDP, *pSrcIp, *pDstIp, *pSize, pPacket);
  
     UdpReadHeader(pPacket, *pSize);
     
-    int action = UdpHandleReceivedPacket(pSize, pPacket);
+    int action = UdpHandleReceivedPacket(trace, pSize, pPacket);
 
     *pDstIp = *pSrcIp;