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-05
- Revision:
- 14:e75a59c1123d
- Parent:
- 13:9cd54f7db57a
- Child:
- 15:6ca6778168b1
File content as of revision 14:e75a59c1123d:
#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]; LogTimeF("DNS %s\r\n", title); if (EthProtocol == IPV6) { Ip6AddressToString(Ip6Src, sizeof(text), text); LogF(" Src IP %s\r\n", text); Ip6AddressToString(Ip6Dst, sizeof(text), text); LogF(" Dst IP %s\r\n", text); } else if (EthProtocol == IPV4) { Ip4AddressToString(Ip4Src, sizeof(text), text); LogF(" Src port %s\r\n", text); Ip4AddressToString(Ip4Dst, sizeof(text), text); LogF(" Dst port %s\r\n", text); } else { LogF(" Unknown eth protocol %04hX\r\n", EthProtocol); } LogF(" Source %hu\r\n", UdpSrcPort); LogF(" Dest %hu\r\n", UdpDstPort); 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(" qd, an, ns, ar %hu, %hu, %hu, %hu\r\n", DnsHdrQdcount, DnsHdrAncount, DnsHdrNscount, DnsHdrArcount); }