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
Diff: ip6/udptcp6.cpp
- Revision:
- 11:c051adb70c5a
- Child:
- 14:e75a59c1123d
diff -r f0854784e960 -r c051adb70c5a ip6/udptcp6.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ip6/udptcp6.cpp Tue Apr 18 19:07:05 2017 +0000 @@ -0,0 +1,102 @@ +#include "mbed.h" +#include "log.h" +#include "net.h" +#include "dhcp.h" +#include "ndp.h" +#include "ip6.h" +#include "slaac.h" +#include "tcp.h" +#include "udp.h" + +#define DEBUG false + +static uint16_t calculateChecksum(uint8_t pro, char* pSrcIp, char* pDstIp, int size, void* pPacket) +{ + __packed struct pseudo + { + char src[16]; + char dst[16]; + uint8_t zer; + uint8_t pro; + uint16_t len; + } pseudo; + + memcpy(pseudo.src, pSrcIp, 16); + memcpy(pseudo.dst, pDstIp, 16); + pseudo.zer = 0; + pseudo.pro = pro; + pseudo.len = NetToHost16(size); + + return NetCheckSumTwo(sizeof(pseudo), &pseudo, size, pPacket); +} + + +static void finalisePacket(uint8_t pro, int action, void* pPacket, int size, char* pSrcIp, char* pDstIp) +{ + if (!action) return; + + Ip6DestIpFromAction(action, pDstIp); + + memcpy(pSrcIp, SlaacLinkLocalIp, 16); + + switch (pro) + { + case TCP: TcpMakeHeader(size, pPacket); break; + case UDP: UdpMakeHeader(size, pPacket); break; + } + uint16_t checksum = calculateChecksum(pro, pSrcIp, pDstIp, size, pPacket); + + switch (pro) + { + case TCP: TcpAddChecksum(pPacket, checksum); break; + case UDP: UdpAddChecksum(pPacket, checksum); break; + } + + switch (pro) + { + case TCP: if (DEBUG) TcpLogHeader("IPv6 packet sent", pPacket, 0); break; + case UDP: if (DEBUG) UdpLogHeader("IPv6 packet sent", pPacket, 0); break; + } +} + +int Tcp6HandleReceivedPacket(char* pSrcIp, char* pDstIp, int *pSize, void * pPacket) +{ + uint16_t calculatedChecksum = calculateChecksum(TCP, pSrcIp, pDstIp, *pSize, pPacket); + if (DEBUG) TcpLogHeader("IPv6 packet received", pPacket, calculatedChecksum); + + TcpReadHeader(pPacket, *pSize); + + int action = TcpHandleReceivedPacket(pSize, pPacket); + + memcpy(pDstIp, pSrcIp, 16); + + finalisePacket(TCP, action, pPacket, *pSize, pSrcIp, pDstIp); + + return action; +} + +int Udp6HandleReceivedPacket(char* pSrcIp, char* pDstIp, int *pSize, void * pPacket) +{ + uint16_t calculatedChecksum = calculateChecksum(UDP, pSrcIp, pDstIp, *pSize, pPacket); + if (DEBUG) UdpLogHeader("IPv6 packet received", pPacket, calculatedChecksum); + + UdpReadHeader(pPacket, *pSize); + + int action = UdpHandleReceivedPacket(pSize, pPacket); + + memcpy(pDstIp, pSrcIp, 16); + + finalisePacket(UDP, action, pPacket, *pSize, pSrcIp, pDstIp); + + return action; +} +int Udp6PollForPacketToSend(void* pPacket, int* pSize, char* pSrcIp, char* pDstIp) +{ + int action = UdpPollForPacketToSend(IPV6, pSize, pPacket); + + finalisePacket(UDP, action, pPacket, *pSize, pSrcIp, pDstIp); + + return action; + +} +