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-09-22
Revision:
35:93c39d260a83
Parent:
33:714a0345e59b
Child:
37:793b39683406

File content as of revision 35:93c39d260a83:

#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)
    {
        Log("  IP: src "); Ip6LogHeaderSrc(); Log(" dst "); Ip6LogHeaderDst(); Log("\r\n");
    }
    else if (EthProtocol == IPV4)
    {
        Log("  IP: src "); Ip4LogHeaderSrc(); Log(" dst "); Ip4LogHeaderDst(); Log("\r\n");
    }
    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);
}