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:
Wed Oct 04 07:51:02 2017 +0000
Revision:
37:793b39683406
Parent:
36:900e24b27bfb
Child:
44:83ce5ace337b
Added trace back and trace forward to log messages

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 37:793b39683406 9 #include "ip6.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 11:c051adb70c5a 35 static void finalisePacket(uint8_t pro, int action, void* pPacket, int size, char* pSrcIp, char* pDstIp)
andrewboyson 11:c051adb70c5a 36 {
andrewboyson 11:c051adb70c5a 37 if (!action) return;
andrewboyson 11:c051adb70c5a 38
andrewboyson 37:793b39683406 39 Ip6DestIpFromDest(ActionGetDestPart(action), pDstIp);
andrewboyson 11:c051adb70c5a 40
andrewboyson 36:900e24b27bfb 41 Ip6Copy(pSrcIp, SlaacLinkLocalIp);
andrewboyson 11:c051adb70c5a 42
andrewboyson 11:c051adb70c5a 43 switch (pro)
andrewboyson 11:c051adb70c5a 44 {
andrewboyson 11:c051adb70c5a 45 case TCP: TcpMakeHeader(size, pPacket); break;
andrewboyson 11:c051adb70c5a 46 case UDP: UdpMakeHeader(size, pPacket); break;
andrewboyson 11:c051adb70c5a 47 }
andrewboyson 11:c051adb70c5a 48 uint16_t checksum = calculateChecksum(pro, pSrcIp, pDstIp, size, pPacket);
andrewboyson 11:c051adb70c5a 49
andrewboyson 11:c051adb70c5a 50 switch (pro)
andrewboyson 11:c051adb70c5a 51 {
andrewboyson 11:c051adb70c5a 52 case TCP: TcpAddChecksum(pPacket, checksum); break;
andrewboyson 11:c051adb70c5a 53 case UDP: UdpAddChecksum(pPacket, checksum); break;
andrewboyson 11:c051adb70c5a 54 }
andrewboyson 11:c051adb70c5a 55
andrewboyson 37:793b39683406 56 if (ActionGetTracePart(action))
andrewboyson 11:c051adb70c5a 57 {
andrewboyson 37:793b39683406 58 switch (pro)
andrewboyson 37:793b39683406 59 {
andrewboyson 37:793b39683406 60 case TCP: TcpLogHeader(0); break;
andrewboyson 37:793b39683406 61 case UDP: UdpLogHeader(0); break;
andrewboyson 37:793b39683406 62 }
andrewboyson 37:793b39683406 63 }
andrewboyson 37:793b39683406 64 }
andrewboyson 37:793b39683406 65 static void (*pTraceBack)(void);
andrewboyson 37:793b39683406 66 static int tracePacketProtocol;
andrewboyson 37:793b39683406 67 static uint16_t calculatedChecksum;
andrewboyson 37:793b39683406 68 static void trace()
andrewboyson 37:793b39683406 69 {
andrewboyson 37:793b39683406 70 pTraceBack();
andrewboyson 37:793b39683406 71 switch(tracePacketProtocol)
andrewboyson 37:793b39683406 72 {
andrewboyson 37:793b39683406 73 case UDP: UdpLogHeader(calculatedChecksum); break;
andrewboyson 37:793b39683406 74 case TCP: TcpLogHeader(calculatedChecksum); break;
andrewboyson 37:793b39683406 75 default: LogTimeF("UdpTcp6 - traceback unrecognised protocol %d\r\n", tracePacketProtocol); break;
andrewboyson 11:c051adb70c5a 76 }
andrewboyson 11:c051adb70c5a 77 }
andrewboyson 11:c051adb70c5a 78
andrewboyson 37:793b39683406 79 int Tcp6HandleReceivedPacket(void (*traceback)(void), char* pSrcIp, char* pDstIp, int *pSize, void * pPacket)
andrewboyson 11:c051adb70c5a 80 {
andrewboyson 37:793b39683406 81 pTraceBack = traceback;
andrewboyson 37:793b39683406 82 tracePacketProtocol = TCP;
andrewboyson 37:793b39683406 83 calculatedChecksum = calculateChecksum(TCP, pSrcIp, pDstIp, *pSize, pPacket);
andrewboyson 11:c051adb70c5a 84
andrewboyson 11:c051adb70c5a 85 TcpReadHeader(pPacket, *pSize);
andrewboyson 11:c051adb70c5a 86
andrewboyson 37:793b39683406 87 int action = TcpHandleReceivedPacket(trace, pSize, pPacket);
andrewboyson 11:c051adb70c5a 88
andrewboyson 36:900e24b27bfb 89 Ip6Copy(pDstIp, pSrcIp);
andrewboyson 11:c051adb70c5a 90
andrewboyson 11:c051adb70c5a 91 finalisePacket(TCP, action, pPacket, *pSize, pSrcIp, pDstIp);
andrewboyson 11:c051adb70c5a 92
andrewboyson 11:c051adb70c5a 93 return action;
andrewboyson 11:c051adb70c5a 94 }
andrewboyson 11:c051adb70c5a 95
andrewboyson 37:793b39683406 96 int Udp6HandleReceivedPacket(void (*traceback)(void), char* pSrcIp, char* pDstIp, int *pSize, void * pPacket)
andrewboyson 11:c051adb70c5a 97 {
andrewboyson 37:793b39683406 98 pTraceBack = traceback;
andrewboyson 37:793b39683406 99 tracePacketProtocol = UDP;
andrewboyson 37:793b39683406 100 calculatedChecksum = calculateChecksum(UDP, pSrcIp, pDstIp, *pSize, pPacket);
andrewboyson 11:c051adb70c5a 101
andrewboyson 11:c051adb70c5a 102 UdpReadHeader(pPacket, *pSize);
andrewboyson 11:c051adb70c5a 103
andrewboyson 37:793b39683406 104 int action = UdpHandleReceivedPacket(trace, pSize, pPacket);
andrewboyson 11:c051adb70c5a 105
andrewboyson 36:900e24b27bfb 106 Ip6Copy(pDstIp, pSrcIp);
andrewboyson 11:c051adb70c5a 107
andrewboyson 11:c051adb70c5a 108 finalisePacket(UDP, action, pPacket, *pSize, pSrcIp, pDstIp);
andrewboyson 11:c051adb70c5a 109
andrewboyson 11:c051adb70c5a 110 return action;
andrewboyson 11:c051adb70c5a 111 }
andrewboyson 11:c051adb70c5a 112 int Udp6PollForPacketToSend(void* pPacket, int* pSize, char* pSrcIp, char* pDstIp)
andrewboyson 11:c051adb70c5a 113 {
andrewboyson 11:c051adb70c5a 114 int action = UdpPollForPacketToSend(IPV6, pSize, pPacket);
andrewboyson 11:c051adb70c5a 115
andrewboyson 11:c051adb70c5a 116 finalisePacket(UDP, action, pPacket, *pSize, pSrcIp, pDstIp);
andrewboyson 11:c051adb70c5a 117
andrewboyson 11:c051adb70c5a 118 return action;
andrewboyson 11:c051adb70c5a 119
andrewboyson 11:c051adb70c5a 120 }
andrewboyson 11:c051adb70c5a 121