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:
Fri May 05 17:44:16 2017 +0000
Revision:
14:e75a59c1123d
Parent:
11:c051adb70c5a
Child:
29:39277bf2003d
Made IP addresses and ports available to debug messages

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