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);
}