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