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: udp/udp.cpp
- Revision:
- 59:e0e556c8bd46
- Parent:
- 57:e0fb648acf48
diff -r d48c899e482f -r e0e556c8bd46 udp/udp.cpp --- a/udp/udp.cpp Thu Dec 07 20:44:32 2017 +0000 +++ b/udp/udp.cpp Thu Dec 14 20:55:40 2017 +0000 @@ -16,7 +16,6 @@ bool UdpTrace = true; -#define HEADER_SIZE 8 __packed struct header { uint16_t srcPort; @@ -29,18 +28,27 @@ static uint16_t checksum; static uint16_t totalLength; -static int handlePort(void (*traceback)(void), int* pDataLength, void* pData) +static void readHeader(void* pPacket, uint16_t size) +{ + struct header* pHeader = (header*)pPacket; + + srcPort = NetToHost16(pHeader->srcPort); + dstPort = NetToHost16(pHeader->dstPort); + totalLength = NetToHost16(pHeader->totalLength); + checksum = NetToHost16(pHeader->checksum); +} +static int handlePort(void (*traceback)(void), int dataLengthRx, void* pDataRx, int* pPataLengthTx, void* pDataTx) { switch (dstPort) { //Handle these - case DHCP_CLIENT_PORT: return DhcpHandleResponse (traceback, pDataLength, pData); // 68 - case NTP_PORT: return NtpHandlePacketReceived(traceback, pDataLength, pData); // 123 - case DNS_UNICAST_CLIENT_PORT: return DnsHandlePacketReceived(traceback, DNS_PROTOCOL_UDNS, pDataLength, pData); //53053 - case DNS_MDNS_PORT: return DnsHandlePacketReceived(traceback, DNS_PROTOCOL_MDNS, pDataLength, pData); // 5353 - case DNS_LLMNR_CLIENT_PORT: return DnsHandlePacketReceived(traceback, DNS_PROTOCOL_LLMNR, pDataLength, pData); //53055 - case DNS_LLMNR_SERVER_PORT: return DnsHandlePacketReceived(traceback, DNS_PROTOCOL_LLMNR, pDataLength, pData); // 5355 - case TFTP_CLIENT_PORT: return TftpHandlePacketReceived(traceback, pDataLength, pData); //60690 + case DHCP_CLIENT_PORT: return DhcpHandleResponse (traceback, dataLengthRx, pDataRx, pPataLengthTx, pDataTx); // 68 + case NTP_PORT: return NtpHandlePacketReceived(traceback, dataLengthRx, pDataRx, pPataLengthTx, pDataTx); // 123 + case DNS_UNICAST_CLIENT_PORT: return DnsHandlePacketReceived(traceback, DNS_PROTOCOL_UDNS, dataLengthRx, pDataRx, pPataLengthTx, pDataTx); //53053 + case DNS_MDNS_PORT: return DnsHandlePacketReceived(traceback, DNS_PROTOCOL_MDNS, dataLengthRx, pDataRx, pPataLengthTx, pDataTx); // 5353 + case DNS_LLMNR_CLIENT_PORT: return DnsHandlePacketReceived(traceback, DNS_PROTOCOL_LLMNR, dataLengthRx, pDataRx, pPataLengthTx, pDataTx); //53055 + case DNS_LLMNR_SERVER_PORT: return DnsHandlePacketReceived(traceback, DNS_PROTOCOL_LLMNR, dataLengthRx, pDataRx, pPataLengthTx, pDataTx); // 5355 + case TFTP_CLIENT_PORT: return TftpHandlePacketReceived(traceback, dataLengthRx, pDataRx, pPataLengthTx, pDataTx); //60690 //Quietly drop these case DHCP_SERVER_PORT: //67 @@ -71,14 +79,18 @@ return DO_NOTHING; } } -int UdpHandleReceivedPacket(void (*traceback)(void), int* pSize, void* pPacket) +int UdpHandleReceivedPacket(void (*traceback)(void), int sizeRx, void* pPacketRx, int* pSizeTx, void* pPacketTx) { - void* pData = (char*)pPacket + HEADER_SIZE; - int dataLength = *pSize - HEADER_SIZE; + readHeader(pPacketRx, sizeRx); + + void* pDataRx = (char*)pPacketRx + sizeof(header); + void* pDataTx = (char*)pPacketTx + sizeof(header); + int dataLengthRx = sizeRx - sizeof(header); + int dataLengthTx = *pSizeTx - sizeof(header); - int action = handlePort(traceback, &dataLength, pData); + int action = handlePort(traceback, dataLengthRx, pDataRx, &dataLengthTx, pDataTx); - *pSize = dataLength + HEADER_SIZE; + *pSizeTx = dataLengthTx + sizeof(header); uint16_t tmpPort = dstPort; dstPort = srcPort; @@ -143,12 +155,12 @@ } int UdpPollForPacketToSend(int type, int* pSize, void* pPacket) { - void* pData = (char*)pPacket + HEADER_SIZE; - int dataLength = *pSize - HEADER_SIZE; + void* pData = (char*)pPacket + sizeof(header); + int dataLength = *pSize - sizeof(header); int action = pollForPacketToSend(type, &dataLength, pData); - *pSize = dataLength + HEADER_SIZE; + *pSize = dataLength + sizeof(header); return action; } @@ -184,12 +196,3 @@ struct header* pHeader = (header*)pPacket; pHeader->checksum = checksum; } -void UdpReadHeader(void* pPacket, uint16_t size) -{ - struct header* pHeader = (header*)pPacket; - - srcPort = NetToHost16(pHeader->srcPort); - dstPort = NetToHost16(pHeader->dstPort); - totalLength = NetToHost16(pHeader->totalLength); - checksum = NetToHost16(pHeader->checksum); -} \ No newline at end of file