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-08-23
- Revision:
- 33:714a0345e59b
- Parent:
- 15:6ca6778168b1
- Child:
- 35:93c39d260a83
File content as of revision 33:714a0345e59b:
#include "mbed.h" #include "dns.h" #include "net.h" #include "log.h" #include "net.h" #include "eth.h" #include "ip4.h" #include "ip6.h" #include "udp.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) { char text[100]; DnsProtocolToString(protocol, sizeof(text), text); LogTimeF("%s %s\r\n", text, title); if (EthProtocol == IPV6) { Ip6AddressToString(Ip6Src, sizeof(text), text); LogF(" IP: src %s;", text); Ip6AddressToString(Ip6Dst, sizeof(text), text); LogF(" dst %s\r\n", text); } else if (EthProtocol == IPV4) { Ip4AddressToString(Ip4Src, sizeof(text), text); LogF(" IP: src %s;", text); Ip4AddressToString(Ip4Dst, sizeof(text), text); LogF(" dst %s\r\n", text); } else { LogF(" Unknown eth protocol %04hX\r\n", EthProtocol); } LogF(" Port: src %5hu; dst %5hu\r\n", UdpSrcPort, UdpDstPort); LogF(" Ident %hd\r\n", DnsHdrId); if (DnsHdrIsReply) { if (DnsHdrIsAuthoritative) LogF(" Authoritative reply\r\n"); else LogF(" Non authoritative reply\r\n"); } else { if (DnsHdrIsRecursiveQuery) LogF(" Recursive query\r\n"); else LogF(" Non recursive query\r\n"); } LogF(" qd, an, ns, ar %hu, %hu, %hu, %hu\r\n", DnsHdrQdcount, DnsHdrAncount, DnsHdrNscount, DnsHdrArcount); }