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:
Tue Oct 23 06:46:50 2018 +0000
Revision:
73:43e3d7fb3d60
Parent:
71:736a5747ade1
Child:
74:c3756bfa960e
Separated the TCP header into its own module

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