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 Nov 14 17:43:08 2017 +0000
Revision:
56:35117a8b5c65
Parent:
55:e64b8b47a2b6
Child:
59:e0e556c8bd46
Corrected closing FIN requirement

Who changed what in which revision?

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