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 Apr 18 19:07:05 2017 +0000
Revision:
11:c051adb70c5a
Child:
14:e75a59c1123d
Tidied IPv6 code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 11:c051adb70c5a 1 #include "mbed.h"
andrewboyson 11:c051adb70c5a 2 #include "log.h"
andrewboyson 11:c051adb70c5a 3 #include "net.h"
andrewboyson 11:c051adb70c5a 4 #include "dhcp.h"
andrewboyson 11:c051adb70c5a 5 #include "ndp.h"
andrewboyson 11:c051adb70c5a 6 #include "ip6.h"
andrewboyson 11:c051adb70c5a 7 #include "slaac.h"
andrewboyson 11:c051adb70c5a 8 #include "tcp.h"
andrewboyson 11:c051adb70c5a 9 #include "udp.h"
andrewboyson 11:c051adb70c5a 10
andrewboyson 11:c051adb70c5a 11 #define DEBUG false
andrewboyson 11:c051adb70c5a 12
andrewboyson 11:c051adb70c5a 13 static uint16_t calculateChecksum(uint8_t pro, char* pSrcIp, char* pDstIp, int size, void* pPacket)
andrewboyson 11:c051adb70c5a 14 {
andrewboyson 11:c051adb70c5a 15 __packed struct pseudo
andrewboyson 11:c051adb70c5a 16 {
andrewboyson 11:c051adb70c5a 17 char src[16];
andrewboyson 11:c051adb70c5a 18 char dst[16];
andrewboyson 11:c051adb70c5a 19 uint8_t zer;
andrewboyson 11:c051adb70c5a 20 uint8_t pro;
andrewboyson 11:c051adb70c5a 21 uint16_t len;
andrewboyson 11:c051adb70c5a 22 } pseudo;
andrewboyson 11:c051adb70c5a 23
andrewboyson 11:c051adb70c5a 24 memcpy(pseudo.src, pSrcIp, 16);
andrewboyson 11:c051adb70c5a 25 memcpy(pseudo.dst, pDstIp, 16);
andrewboyson 11:c051adb70c5a 26 pseudo.zer = 0;
andrewboyson 11:c051adb70c5a 27 pseudo.pro = pro;
andrewboyson 11:c051adb70c5a 28 pseudo.len = NetToHost16(size);
andrewboyson 11:c051adb70c5a 29
andrewboyson 11:c051adb70c5a 30 return NetCheckSumTwo(sizeof(pseudo), &pseudo, size, pPacket);
andrewboyson 11:c051adb70c5a 31 }
andrewboyson 11:c051adb70c5a 32
andrewboyson 11:c051adb70c5a 33
andrewboyson 11:c051adb70c5a 34 static void finalisePacket(uint8_t pro, int action, void* pPacket, int size, char* pSrcIp, char* pDstIp)
andrewboyson 11:c051adb70c5a 35 {
andrewboyson 11:c051adb70c5a 36 if (!action) return;
andrewboyson 11:c051adb70c5a 37
andrewboyson 11:c051adb70c5a 38 Ip6DestIpFromAction(action, pDstIp);
andrewboyson 11:c051adb70c5a 39
andrewboyson 11:c051adb70c5a 40 memcpy(pSrcIp, SlaacLinkLocalIp, 16);
andrewboyson 11:c051adb70c5a 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 11:c051adb70c5a 55 switch (pro)
andrewboyson 11:c051adb70c5a 56 {
andrewboyson 11:c051adb70c5a 57 case TCP: if (DEBUG) TcpLogHeader("IPv6 packet sent", pPacket, 0); break;
andrewboyson 11:c051adb70c5a 58 case UDP: if (DEBUG) UdpLogHeader("IPv6 packet sent", pPacket, 0); break;
andrewboyson 11:c051adb70c5a 59 }
andrewboyson 11:c051adb70c5a 60 }
andrewboyson 11:c051adb70c5a 61
andrewboyson 11:c051adb70c5a 62 int Tcp6HandleReceivedPacket(char* pSrcIp, char* pDstIp, int *pSize, void * pPacket)
andrewboyson 11:c051adb70c5a 63 {
andrewboyson 11:c051adb70c5a 64 uint16_t calculatedChecksum = calculateChecksum(TCP, pSrcIp, pDstIp, *pSize, pPacket);
andrewboyson 11:c051adb70c5a 65 if (DEBUG) TcpLogHeader("IPv6 packet received", pPacket, calculatedChecksum);
andrewboyson 11:c051adb70c5a 66
andrewboyson 11:c051adb70c5a 67 TcpReadHeader(pPacket, *pSize);
andrewboyson 11:c051adb70c5a 68
andrewboyson 11:c051adb70c5a 69 int action = TcpHandleReceivedPacket(pSize, pPacket);
andrewboyson 11:c051adb70c5a 70
andrewboyson 11:c051adb70c5a 71 memcpy(pDstIp, pSrcIp, 16);
andrewboyson 11:c051adb70c5a 72
andrewboyson 11:c051adb70c5a 73 finalisePacket(TCP, action, pPacket, *pSize, pSrcIp, pDstIp);
andrewboyson 11:c051adb70c5a 74
andrewboyson 11:c051adb70c5a 75 return action;
andrewboyson 11:c051adb70c5a 76 }
andrewboyson 11:c051adb70c5a 77
andrewboyson 11:c051adb70c5a 78 int Udp6HandleReceivedPacket(char* pSrcIp, char* pDstIp, int *pSize, void * pPacket)
andrewboyson 11:c051adb70c5a 79 {
andrewboyson 11:c051adb70c5a 80 uint16_t calculatedChecksum = calculateChecksum(UDP, pSrcIp, pDstIp, *pSize, pPacket);
andrewboyson 11:c051adb70c5a 81 if (DEBUG) UdpLogHeader("IPv6 packet received", pPacket, calculatedChecksum);
andrewboyson 11:c051adb70c5a 82
andrewboyson 11:c051adb70c5a 83 UdpReadHeader(pPacket, *pSize);
andrewboyson 11:c051adb70c5a 84
andrewboyson 11:c051adb70c5a 85 int action = UdpHandleReceivedPacket(pSize, pPacket);
andrewboyson 11:c051adb70c5a 86
andrewboyson 11:c051adb70c5a 87 memcpy(pDstIp, pSrcIp, 16);
andrewboyson 11:c051adb70c5a 88
andrewboyson 11:c051adb70c5a 89 finalisePacket(UDP, action, pPacket, *pSize, pSrcIp, pDstIp);
andrewboyson 11:c051adb70c5a 90
andrewboyson 11:c051adb70c5a 91 return action;
andrewboyson 11:c051adb70c5a 92 }
andrewboyson 11:c051adb70c5a 93 int Udp6PollForPacketToSend(void* pPacket, int* pSize, char* pSrcIp, char* pDstIp)
andrewboyson 11:c051adb70c5a 94 {
andrewboyson 11:c051adb70c5a 95 int action = UdpPollForPacketToSend(IPV6, pSize, pPacket);
andrewboyson 11:c051adb70c5a 96
andrewboyson 11:c051adb70c5a 97 finalisePacket(UDP, action, pPacket, *pSize, pSrcIp, pDstIp);
andrewboyson 11:c051adb70c5a 98
andrewboyson 11:c051adb70c5a 99 return action;
andrewboyson 11:c051adb70c5a 100
andrewboyson 11:c051adb70c5a 101 }
andrewboyson 11:c051adb70c5a 102