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:
61:aad055f1b0d1
Parent:
59:e0e556c8bd46
Child:
71:736a5747ade1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ip6/udptcp6.c	Thu Jan 11 17:38:21 2018 +0000
@@ -0,0 +1,119 @@
+#include <stdint.h>
+#include <string.h>
+
+#include    "log.h"
+#include    "net.h"
+#include "action.h"
+#include    "eth.h"
+#include   "dhcp.h"
+#include     "ns.h"
+#include     "ip.h"
+#include "ip6addr.h"
+#include  "slaac.h"
+#include    "tcp.h"
+#include    "udp.h"
+
+static uint16_t calculateChecksum(uint8_t pro, char* pSrcIp, char* pDstIp, int size, void* pPacket)
+{
+    __packed struct pseudo
+    {
+        char src[16];
+        char dst[16];
+        uint8_t  zer;
+        uint8_t  pro;
+        uint16_t len;
+    } pseudo;
+    
+    memcpy(pseudo.src, pSrcIp, 16);
+    memcpy(pseudo.dst, pDstIp, 16);
+    pseudo.zer = 0;
+    pseudo.pro = pro;
+    pseudo.len = NetToHost16(size);
+
+    return NetCheckSumTwo(sizeof(pseudo), &pseudo, size, pPacket);
+}
+static void finalisePacket(uint8_t pro, int action, int scope, void* pPacket, int size, char* pSrcIp, char* pDstIp)
+{    
+    if (!action) return;
+    
+      Ip6AddressFromDest (ActionGetDestPart(action), pDstIp);
+    SlaacAddressFromScope(scope,                     pSrcIp);
+        
+    switch (pro)
+    {
+        case TCP: TcpMakeHeader(size, pPacket); break;
+        case UDP: UdpMakeHeader(size, pPacket); break;
+    }
+    
+    uint16_t checksum = calculateChecksum(pro, pSrcIp, pDstIp, size, pPacket);
+    
+    switch (pro)
+    {
+        case TCP: TcpAddChecksum(pPacket, checksum); break;
+        case UDP: UdpAddChecksum(pPacket, checksum); break;
+    }
+    
+    if (ActionGetTracePart(action))
+    {
+        switch (pro)
+        {
+            case TCP: TcpLogHeader(0); break;
+            case UDP: UdpLogHeader(0); break;
+        }
+    }
+}
+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("UdpTcp6 - traceback unrecognised protocol %d\r\n", tracePacketProtocol); break;
+    }
+}
+
+int Tcp6HandleReceivedPacket(void (*traceback)(void), int scope, void* pPacketRx, int sizeRx, void* pPacketTx, int* pSizeTx, char* pSrcIp, char* pDstIp)
+{
+    pTraceBack = traceback;
+    tracePacketProtocol = TCP;
+    calculatedChecksum = calculateChecksum(TCP, pSrcIp, pDstIp, sizeRx, pPacketRx);
+    
+    int action = TcpHandleReceivedPacket(trace, sizeRx, pPacketRx, pSizeTx, pPacketTx);
+    
+    Ip6AddressCopy(pDstIp, pSrcIp);
+    
+    finalisePacket(TCP, action, scope, pPacketTx, *pSizeTx, pSrcIp, pDstIp);
+        
+    return action;
+}
+
+int Udp6HandleReceivedPacket(void (*traceback)(void), int scope, void* pPacketRx, int sizeRx, void* pPacketTx, int* pSizeTx, char* pSrcIp, char* pDstIp)
+{
+    pTraceBack = traceback;
+    tracePacketProtocol = UDP;
+    calculatedChecksum = calculateChecksum(UDP, pSrcIp, pDstIp, sizeRx, pPacketRx);
+        
+    int action = UdpHandleReceivedPacket(trace, sizeRx, pPacketRx, pSizeTx, pPacketTx);
+        
+    Ip6AddressCopy(pDstIp, pSrcIp);
+    
+    finalisePacket(UDP, action, scope, pPacketTx, *pSizeTx, pSrcIp, pDstIp);
+        
+    return action;
+}
+int Udp6PollForPacketToSend(void* pPacket, int* pSize, char* pSrcIp, char* pDstIp)
+{        
+    int action = UdpPollForPacketToSend(IPV6, pSize, pPacket);
+    
+    int scope = SCOPE_LOCAL;
+
+    finalisePacket(UDP, action, scope, pPacket, *pSize, pSrcIp, pDstIp);
+                
+    return action;
+
+}
+