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

Committer:
andrewboyson
Date:
Fri Jul 19 17:48:06 2019 +0000
Revision:
151:bde6f7da1755
Parent:
138:5ff0c7069300
Child:
172:9bc3c7b2cca1
Removed private key and certificate from semihost storage as found to be unreliable (though secure) and moved it into flash storage (reliable, simple, but visible on mbed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 61:aad055f1b0d1 1 #include <stdint.h>
andrewboyson 61:aad055f1b0d1 2 #include <string.h>
andrewboyson 61:aad055f1b0d1 3
andrewboyson 74:c3756bfa960e 4 #include "log.h"
andrewboyson 74:c3756bfa960e 5 #include "net.h"
andrewboyson 74:c3756bfa960e 6 #include "action.h"
andrewboyson 74:c3756bfa960e 7 #include "eth.h"
andrewboyson 74:c3756bfa960e 8 #include "dhcp.h"
andrewboyson 74:c3756bfa960e 9 #include "ns.h"
andrewboyson 74:c3756bfa960e 10 #include "ip.h"
andrewboyson 49:1a6336f2b3f9 11 #include "ip6addr.h"
andrewboyson 74:c3756bfa960e 12 #include "slaac.h"
andrewboyson 74:c3756bfa960e 13 #include "tcp.h"
andrewboyson 74:c3756bfa960e 14 #include "tcprecv.h"
andrewboyson 74:c3756bfa960e 15 #include "tcpsend.h"
andrewboyson 74:c3756bfa960e 16 #include "tcphdr.h"
andrewboyson 74:c3756bfa960e 17 #include "udp.h"
andrewboyson 74:c3756bfa960e 18 #include "led.h"
andrewboyson 74:c3756bfa960e 19 #include "ar6.h"
andrewboyson 136:8a65abb0dc63 20 #include "checksum.h"
andrewboyson 11:c051adb70c5a 21
andrewboyson 11:c051adb70c5a 22 static uint16_t calculateChecksum(uint8_t pro, char* pSrcIp, char* pDstIp, int size, void* pPacket)
andrewboyson 136:8a65abb0dc63 23 {
andrewboyson 136:8a65abb0dc63 24 uint32_t sum = 0;
andrewboyson 136:8a65abb0dc63 25 uint16_t pro16 = pro;
andrewboyson 136:8a65abb0dc63 26 sum = CheckSumAddDirect(sum, 16, pSrcIp );
andrewboyson 136:8a65abb0dc63 27 sum = CheckSumAddDirect(sum, 16, pDstIp );
andrewboyson 136:8a65abb0dc63 28 sum = CheckSumAddInvert(sum, 2, &pro16 );
andrewboyson 136:8a65abb0dc63 29 sum = CheckSumAddInvert(sum, 2, &size );
andrewboyson 136:8a65abb0dc63 30 return CheckSumFinDirect(sum, size, pPacket);
andrewboyson 11:c051adb70c5a 31 }
andrewboyson 44:83ce5ace337b 32 static void finalisePacket(uint8_t pro, int action, int scope, void* pPacket, int size, char* pSrcIp, char* pDstIp)
andrewboyson 11:c051adb70c5a 33 {
andrewboyson 11:c051adb70c5a 34 if (!action) return;
andrewboyson 11:c051adb70c5a 35
andrewboyson 49:1a6336f2b3f9 36 Ip6AddressFromDest (ActionGetDestPart(action), pDstIp);
andrewboyson 49:1a6336f2b3f9 37 SlaacAddressFromScope(scope, pSrcIp);
andrewboyson 44:83ce5ace337b 38
andrewboyson 11:c051adb70c5a 39 switch (pro)
andrewboyson 11:c051adb70c5a 40 {
andrewboyson 74:c3756bfa960e 41 case TCP: TcpHdrWriteToPacket(pPacket); break;
andrewboyson 11:c051adb70c5a 42 case UDP: UdpMakeHeader(size, pPacket); break;
andrewboyson 11:c051adb70c5a 43 }
andrewboyson 61:aad055f1b0d1 44
andrewboyson 11:c051adb70c5a 45 uint16_t checksum = calculateChecksum(pro, pSrcIp, pDstIp, size, pPacket);
andrewboyson 11:c051adb70c5a 46
andrewboyson 11:c051adb70c5a 47 switch (pro)
andrewboyson 11:c051adb70c5a 48 {
andrewboyson 137:cf6e7db0e985 49 case TCP: TcpHdrSetChecksum(pPacket, checksum); break;
andrewboyson 138:5ff0c7069300 50 case UDP: UdpHdrSetChecksum(pPacket, checksum); break;
andrewboyson 11:c051adb70c5a 51 }
andrewboyson 11:c051adb70c5a 52
andrewboyson 37:793b39683406 53 if (ActionGetTracePart(action))
andrewboyson 11:c051adb70c5a 54 {
andrewboyson 37:793b39683406 55 switch (pro)
andrewboyson 37:793b39683406 56 {
andrewboyson 73:43e3d7fb3d60 57 case TCP: TcpHdrLog(0); break;
andrewboyson 56:35117a8b5c65 58 case UDP: UdpLogHeader(0); break;
andrewboyson 37:793b39683406 59 }
andrewboyson 37:793b39683406 60 }
andrewboyson 37:793b39683406 61 }
andrewboyson 37:793b39683406 62 static void (*pTraceBack)(void);
andrewboyson 37:793b39683406 63 static int tracePacketProtocol;
andrewboyson 37:793b39683406 64 static uint16_t calculatedChecksum;
andrewboyson 37:793b39683406 65 static void trace()
andrewboyson 37:793b39683406 66 {
andrewboyson 37:793b39683406 67 pTraceBack();
andrewboyson 37:793b39683406 68 switch(tracePacketProtocol)
andrewboyson 37:793b39683406 69 {
andrewboyson 56:35117a8b5c65 70 case UDP: UdpLogHeader(calculatedChecksum); break;
andrewboyson 73:43e3d7fb3d60 71 case TCP: TcpHdrLog(calculatedChecksum); break;
andrewboyson 37:793b39683406 72 default: LogTimeF("UdpTcp6 - traceback unrecognised protocol %d\r\n", tracePacketProtocol); break;
andrewboyson 11:c051adb70c5a 73 }
andrewboyson 11:c051adb70c5a 74 }
andrewboyson 11:c051adb70c5a 75
andrewboyson 74:c3756bfa960e 76 int Tcp6HandleReceivedPacket(void (*traceback)(void), int scope, void* pPacketRx, int sizeRx, void* pPacketTx, int* pSizeTx, char* pSrcIp, char* pDstIp, int remArIndex)
andrewboyson 11:c051adb70c5a 77 {
andrewboyson 37:793b39683406 78 pTraceBack = traceback;
andrewboyson 37:793b39683406 79 tracePacketProtocol = TCP;
andrewboyson 59:e0e556c8bd46 80 calculatedChecksum = calculateChecksum(TCP, pSrcIp, pDstIp, sizeRx, pPacketRx);
andrewboyson 11:c051adb70c5a 81
andrewboyson 80:4ef1500fca1d 82 int action = TcpHandleReceivedPacket(trace, sizeRx, pPacketRx, pSizeTx, pPacketTx, IPV6, remArIndex, scope);
andrewboyson 11:c051adb70c5a 83
andrewboyson 49:1a6336f2b3f9 84 Ip6AddressCopy(pDstIp, pSrcIp);
andrewboyson 11:c051adb70c5a 85
andrewboyson 59:e0e556c8bd46 86 finalisePacket(TCP, action, scope, pPacketTx, *pSizeTx, pSrcIp, pDstIp);
andrewboyson 11:c051adb70c5a 87
andrewboyson 11:c051adb70c5a 88 return action;
andrewboyson 11:c051adb70c5a 89 }
andrewboyson 11:c051adb70c5a 90
andrewboyson 59:e0e556c8bd46 91 int Udp6HandleReceivedPacket(void (*traceback)(void), int scope, void* pPacketRx, int sizeRx, void* pPacketTx, int* pSizeTx, char* pSrcIp, char* pDstIp)
andrewboyson 11:c051adb70c5a 92 {
andrewboyson 37:793b39683406 93 pTraceBack = traceback;
andrewboyson 37:793b39683406 94 tracePacketProtocol = UDP;
andrewboyson 59:e0e556c8bd46 95 calculatedChecksum = calculateChecksum(UDP, pSrcIp, pDstIp, sizeRx, pPacketRx);
andrewboyson 59:e0e556c8bd46 96
andrewboyson 59:e0e556c8bd46 97 int action = UdpHandleReceivedPacket(trace, sizeRx, pPacketRx, pSizeTx, pPacketTx);
andrewboyson 44:83ce5ace337b 98
andrewboyson 49:1a6336f2b3f9 99 Ip6AddressCopy(pDstIp, pSrcIp);
andrewboyson 11:c051adb70c5a 100
andrewboyson 59:e0e556c8bd46 101 finalisePacket(UDP, action, scope, pPacketTx, *pSizeTx, pSrcIp, pDstIp);
andrewboyson 11:c051adb70c5a 102
andrewboyson 11:c051adb70c5a 103 return action;
andrewboyson 11:c051adb70c5a 104 }
andrewboyson 71:736a5747ade1 105 int Tcp6PollForPacketToSend(void* pPacket, int* pSize, char* pSrcIp, char* pDstIp)
andrewboyson 74:c3756bfa960e 106 {
andrewboyson 74:c3756bfa960e 107 int remArIndex = -1;
andrewboyson 80:4ef1500fca1d 108 int locIpScope = SCOPE_LOCAL;
andrewboyson 80:4ef1500fca1d 109 int action = TcpPollForPacketToSend(pSize, pPacket, IPV6, &remArIndex, &locIpScope);
andrewboyson 74:c3756bfa960e 110 if (action && remArIndex >= 0) Ar6IndexToIp(remArIndex, pDstIp);
andrewboyson 71:736a5747ade1 111
andrewboyson 71:736a5747ade1 112
andrewboyson 80:4ef1500fca1d 113 finalisePacket(TCP, action, locIpScope, pPacket, *pSize, pSrcIp, pDstIp);
andrewboyson 71:736a5747ade1 114
andrewboyson 71:736a5747ade1 115 return action;
andrewboyson 71:736a5747ade1 116
andrewboyson 71:736a5747ade1 117 }
andrewboyson 11:c051adb70c5a 118 int Udp6PollForPacketToSend(void* pPacket, int* pSize, char* pSrcIp, char* pDstIp)
andrewboyson 11:c051adb70c5a 119 {
andrewboyson 11:c051adb70c5a 120 int action = UdpPollForPacketToSend(IPV6, pSize, pPacket);
andrewboyson 11:c051adb70c5a 121
andrewboyson 44:83ce5ace337b 122 int scope = SCOPE_LOCAL;
andrewboyson 44:83ce5ace337b 123
andrewboyson 44:83ce5ace337b 124 finalisePacket(UDP, action, scope, pPacket, *pSize, pSrcIp, pDstIp);
andrewboyson 11:c051adb70c5a 125
andrewboyson 11:c051adb70c5a 126 return action;
andrewboyson 11:c051adb70c5a 127
andrewboyson 11:c051adb70c5a 128 }
andrewboyson 11:c051adb70c5a 129