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:
Sun Sep 29 18:51:58 2019 +0000
Revision:
160:6a1d1d368f80
Parent:
138:5ff0c7069300
Child:
172:9bc3c7b2cca1
Corrected some minor bugs

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