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:
136:8a65abb0dc63
Parent:
128:79052cb4a41c
Child:
172:9bc3c7b2cca1
diff -r a7f026a09543 -r 8a65abb0dc63 udp/dns/dnshdr.c
--- a/udp/dns/dnshdr.c	Sat Mar 23 12:25:48 2019 +0000
+++ b/udp/dns/dnshdr.c	Sat Apr 06 11:20:20 2019 +0000
@@ -14,18 +14,6 @@
 
 #define HEADER_LENGTH 12
 
-__packed struct header
-{
-    uint16_t id;
-    uint8_t  uflags;
-    uint8_t  lflags;
-    
-    uint16_t qdcount;
-    uint16_t ancount;
-    uint16_t nscount;
-    uint16_t arcount;
-};
-
 uint16_t DnsHdrId;
 
 bool     DnsHdrIsReply;
@@ -44,45 +32,41 @@
 void DnsHdrSetup(void* pPacket, int lenPacket)
 {
     DnsHdrPacket = (char*)pPacket;
-    DnsHdrData = DnsHdrPacket + sizeof(struct header);
-    DnsHdrDataLength = lenPacket - sizeof(struct header);
+    DnsHdrData    = DnsHdrPacket + HEADER_LENGTH;
+    DnsHdrDataLength = lenPacket - HEADER_LENGTH;
 }
 
 void DnsHdrRead()
 {
-    struct header* pHeader = (struct header*)DnsHdrPacket;
-
-    DnsHdrId = NetToHost16(pHeader->id);
+    NetInvert16(&DnsHdrId, DnsHdrPacket + 0);
     
-    uint8_t uflags = pHeader->uflags;
+    uint8_t uflags = *(DnsHdrPacket + 2);
     DnsHdrIsReply          = uflags & 0x80;
     DnsHdrIsAuthoritative  = uflags & 0x04;
     DnsHdrIsRecursiveQuery = uflags & 0x01;
     
-    DnsHdrQdcount = NetToHost16(pHeader->qdcount);
-    DnsHdrAncount = NetToHost16(pHeader->ancount);
-    DnsHdrNscount = NetToHost16(pHeader->nscount);
-    DnsHdrArcount = NetToHost16(pHeader->arcount);
-    
+    NetInvert16(&DnsHdrQdcount, DnsHdrPacket +  4);
+    NetInvert16(&DnsHdrAncount, DnsHdrPacket +  6);
+    NetInvert16(&DnsHdrNscount, DnsHdrPacket +  8);
+    NetInvert16(&DnsHdrArcount, DnsHdrPacket + 10);
 }
 void DnsHdrWrite()
 {
-    struct header* pHeader = (struct header*)DnsHdrPacket;
-    
-    pHeader->id       = NetToHost16(DnsHdrId);
+    NetInvert16(DnsHdrPacket + 0, &DnsHdrId);
     
     uint8_t uflags = 0;
     uint8_t lflags = 0;
     if (DnsHdrIsReply)          uflags |= 0x80;
     if (DnsHdrIsAuthoritative)  uflags |= 0x04;
     if (DnsHdrIsRecursiveQuery) uflags |= 0x01;
-    pHeader->uflags   = uflags;
-    pHeader->lflags   = lflags;
+    *(DnsHdrPacket + 2) = uflags;
+    *(DnsHdrPacket + 3) = lflags;
+    
+    NetInvert16(DnsHdrPacket +  4, &DnsHdrQdcount);
+    NetInvert16(DnsHdrPacket +  6, &DnsHdrAncount);
+    NetInvert16(DnsHdrPacket +  8, &DnsHdrNscount);
+    NetInvert16(DnsHdrPacket + 10, &DnsHdrArcount);
 
-    pHeader->qdcount  = NetToHost16(DnsHdrQdcount);
-    pHeader->ancount  = NetToHost16(DnsHdrAncount);
-    pHeader->nscount  = NetToHost16(DnsHdrNscount);
-    pHeader->arcount  = NetToHost16(DnsHdrArcount);
 }
 static uint16_t decodeUint16(char* p)
 {