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/dns/dnshdr.c
- Revision:
- 136:8a65abb0dc63
- Parent:
- 128:79052cb4a41c
- Child:
- 172:9bc3c7b2cca1
--- 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) {