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:
Mon Oct 29 09:33:44 2018 +0000
Revision:
74:c3756bfa960e
Parent:
73:43e3d7fb3d60
Child:
80:4ef1500fca1d
Introduced the polling for and split Tcp into tcpSend and TcpRecv. Testied and working.

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