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
udp/dns/dnshdr.cpp
- Committer:
- andrewboyson
- Date:
- 2017-05-01
- Revision:
- 13:9cd54f7db57a
- Child:
- 14:e75a59c1123d
File content as of revision 13:9cd54f7db57a:
#include "mbed.h" #include "dns.h" #include "net.h" #include "log.h" #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; bool DnsHdrIsAuthoritative; bool DnsHdrIsRecursiveQuery; uint16_t DnsHdrQdcount; uint16_t DnsHdrAncount; uint16_t DnsHdrNscount; uint16_t DnsHdrArcount; char* DnsHdrPacket; char* DnsHdrData; void DnsHdrSetup(void* pPacket) { DnsHdrPacket = (char*)pPacket; DnsHdrData = DnsHdrPacket + HEADER_LENGTH; } void DnsHdrRead() { struct header* pHeader = (header*)DnsHdrPacket; DnsHdrId = NetToHost16(pHeader->id); uint8_t uflags = pHeader->uflags; 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); } void DnsHdrWrite() { struct header* pHeader = (header*)DnsHdrPacket; pHeader->id = NetToHost16(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; pHeader->qdcount = NetToHost16(DnsHdrQdcount); pHeader->ancount = NetToHost16(DnsHdrAncount); pHeader->nscount = NetToHost16(DnsHdrNscount); pHeader->arcount = NetToHost16(DnsHdrArcount); } void DnsHdrLog(char* title, int protocol) { LogTimeF("DNS %s\r\n", title); char text[10]; DnsProtocolToString(protocol, sizeof(text), text); LogF(" Protocol %s\r\n", text); LogF(" Ident %hd\r\n", DnsHdrId); if (DnsHdrIsReply) LogF(" Is reply\r\n"); else LogF(" Is request\r\n"); if (DnsHdrIsAuthoritative) LogF(" Is authoritative reply\r\n"); else LogF(" Is not authoritative reply\r\n"); if (DnsHdrIsRecursiveQuery) LogF(" Is recursive query\r\n"); else LogF(" Is non recursive query\r\n"); LogF(" qdcount %hu\r\n", DnsHdrQdcount); LogF(" ancount %hu\r\n", DnsHdrAncount); LogF(" nscount %hu\r\n", DnsHdrNscount); LogF(" arcount %hu\r\n", DnsHdrArcount); }