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

Revision:
59:e0e556c8bd46
Parent:
57:e0fb648acf48
--- 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