From c0b549631ccb11a46cbeb9f5e4270c7c9d770f0a Mon Sep 17 00:00:00 2001 From: Sven Luethi Date: Fri, 7 May 2021 21:51:40 +0200 Subject: [PATCH] wip --- src/core/dns/Record.cpp | 72 ------------- src/core/dns/ResourceRecord.cpp | 72 +++++++++++++ src/core/dns/include/Record.hpp | 81 -------------- src/core/dns/include/ResourceRecord.hpp | 81 ++++++++++++++ src/resolver/Message.cpp | 78 +++++++++----- src/resolver/include/Message.hpp | 135 ++++++++++++++---------- 6 files changed, 284 insertions(+), 235 deletions(-) delete mode 100644 src/core/dns/Record.cpp create mode 100644 src/core/dns/ResourceRecord.cpp delete mode 100644 src/core/dns/include/Record.hpp create mode 100644 src/core/dns/include/ResourceRecord.hpp diff --git a/src/core/dns/Record.cpp b/src/core/dns/Record.cpp deleted file mode 100644 index 5ada779..0000000 --- a/src/core/dns/Record.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include "Record.hpp" - - -namespace Plains { -namespace Core { -namespace DNS { - - -Record::Record(const uint16_t id) : _id(id) { - _os = new ostream(&_sb); - *_os << "NOT IMPLEMENTED"; -} - -Record::~Record() { - delete _os; -} - -ostream& Record::serialze() { - return *_os; -} - -ARecord::ARecord() : Record(1) {} -AAAARecord::AAAARecord() : Record(28) {} -AFSDBRecord::AFSDBRecord() : Record(18) {} -APLRecord::APLRecord() : Record(42) {} -CAARecord::CAARecord() : Record(257) {} -CDNSKEYRecord::CDNSKEYRecord() : Record(60) {} -CDSRecord::CDSRecord() : Record(59) {} -CERTRecord::CERTRecord() : Record(37) {} -CNAMERecord::CNAMERecord() : Record(5) {} -CSYNCRecord::CSYNCRecord() : Record(62) {} -DHCIDRecord::DHCIDRecord() : Record(49) {} -DLVRecord::DLVRecord() : Record(32769) {} -DNAMERecord::DNAMERecord() : Record(39) {} -DNSKEYRecord::DNSKEYRecord() : Record(48) {} -DSRecord::DSRecord() : Record(43) {} -EUI48Record::EUI48Record() : Record(108) {} -EUI64Record::EUI64Record() : Record(109) {} -HINFORecord::HINFORecord() : Record(13) {} -HIPRecord::HIPRecord() : Record(55) {} -IPSECKEYRecord::IPSECKEYRecord() : Record(45) {} -KEYRecord::KEYRecord() : Record(25) {} -KXRecord::KXRecord() : Record(36) {} -LOCRecord::LOCRecord() : Record(29) {} -MXRecord::MXRecord() : Record(15) {} -NAPTRRecord::NAPTRRecord() : Record(35) {} -NSRecord::NSRecord() : Record(2) {} -NSECRecord::NSECRecord() : Record(47) {} -NSEC3Record::NSEC3Record() : Record(50) {} -NSEC3PARAMRecord::NSEC3PARAMRecord() : Record(51) {} -OPENPGPKEYRecord::OPENPGPKEYRecord() : Record(61) {} -PTRRecord::PTRRecord() : Record(12) {} -RRSIGRecord::RRSIGRecord() : Record(46) {} -RPRecord::RPRecord() : Record(17) {} -SIGRecord::SIGRecord() : Record(24) {} -SMIMEARecord::SMIMEARecord() : Record(53) {} -SOARecord::SOARecord() : Record(6) {} -SRVRecord::SRVRecord() : Record(33) {} -SSHFPRecord::SSHFPRecord() : Record(44) {} -TARecord::TARecord() : Record(32768) {} -TKEYRecord::TKEYRecord() : Record(249) {} -TLSARecord::TLSARecord() : Record(52) {} -TSIGRecord::TSIGRecord() : Record(250) {} -TXTRecord::TXTRecord() : Record(16) {} -URIRecord::URIRecord() : Record(256) {} -ZONEMDRecord::ZONEMDRecord() : Record(63) {} -SVCBRecord::SVCBRecord() : Record(64) {} -HTTPSRecord::HTTPSRecord() : Record(65) {} - - - -}}} diff --git a/src/core/dns/ResourceRecord.cpp b/src/core/dns/ResourceRecord.cpp new file mode 100644 index 0000000..0a8b4d0 --- /dev/null +++ b/src/core/dns/ResourceRecord.cpp @@ -0,0 +1,72 @@ +#include "Record.hpp" + + +namespace Plains { +namespace Core { +namespace DNS { + + +ResourceRecord::ResourceRecord(const uint16_t id) : _id(id) { + _os = new ostream(&_sb); + *_os << "NOT IMPLEMENTED"; +} + +ResourceRecord::~ResourceRecord() { + delete _os; +} + +ostream& ResourceRecord::serialze() { + return *_os; +} + +ARecord::ARecord() : ResourceRecord(1) {} +AAAARecord::AAAARecord() : ResourceRecord(28) {} +AFSDBRecord::AFSDBRecord() : ResourceRecord(18) {} +APLRecord::APLRecord() : ResourceRecord(42) {} +CAARecord::CAARecord() : ResourceRecord(257) {} +CDNSKEYRecord::CDNSKEYRecord() : ResourceRecord(60) {} +CDSRecord::CDSRecord() : ResourceRecord(59) {} +CERTRecord::CERTRecord() : ResourceRecord(37) {} +CNAMERecord::CNAMERecord() : ResourceRecord(5) {} +CSYNCRecord::CSYNCRecord() : ResourceRecord(62) {} +DHCIDRecord::DHCIDRecord() : ResourceRecord(49) {} +DLVRecord::DLVRecord() : ResourceRecord(32769) {} +DNAMERecord::DNAMERecord() : ResourceRecord(39) {} +DNSKEYRecord::DNSKEYRecord() : ResourceRecord(48) {} +DSRecord::DSRecord() : ResourceRecord(43) {} +EUI48Record::EUI48Record() : ResourceRecord(108) {} +EUI64Record::EUI64Record() : ResourceRecord(109) {} +HINFORecord::HINFORecord() : ResourceRecord(13) {} +HIPRecord::HIPRecord() : ResourceRecord(55) {} +IPSECKEYRecord::IPSECKEYRecord() : ResourceRecord(45) {} +KEYRecord::KEYRecord() : ResourceRecord(25) {} +KXRecord::KXRecord() : ResourceRecord(36) {} +LOCRecord::LOCRecord() : ResourceRecord(29) {} +MXRecord::MXRecord() : ResourceRecord(15) {} +NAPTRRecord::NAPTRRecord() : ResourceRecord(35) {} +NSRecord::NSRecord() : ResourceRecord(2) {} +NSECRecord::NSECRecord() : ResourceRecord(47) {} +NSEC3Record::NSEC3Record() : ResourceRecord(50) {} +NSEC3PARAMRecord::NSEC3PARAMRecord() : ResourceRecord(51) {} +OPENPGPKEYRecord::OPENPGPKEYRecord() : ResourceRecord(61) {} +PTRRecord::PTRRecord() : ResourceRecord(12) {} +RRSIGRecord::RRSIGRecord() : ResourceRecord(46) {} +RPRecord::RPRecord() : ResourceRecord(17) {} +SIGRecord::SIGRecord() : ResourceRecord(24) {} +SMIMEARecord::SMIMEARecord() : ResourceRecord(53) {} +SOARecord::SOARecord() : ResourceRecord(6) {} +SRVRecord::SRVRecord() : ResourceRecord(33) {} +SSHFPRecord::SSHFPRecord() : ResourceRecord(44) {} +TARecord::TARecord() : ResourceRecord(32768) {} +TKEYRecord::TKEYRecord() : ResourceRecord(249) {} +TLSARecord::TLSARecord() : ResourceRecord(52) {} +TSIGRecord::TSIGRecord() : ResourceRecord(250) {} +TXTRecord::TXTRecord() : ResourceRecord(16) {} +URIRecord::URIRecord() : ResourceRecord(256) {} +ZONEMDRecord::ZONEMDRecord() : ResourceRecord(63) {} +SVCBRecord::SVCBRecord() : ResourceRecord(64) {} +HTTPSRecord::HTTPSRecord() : ResourceRecord(65) {} + + + +}}} diff --git a/src/core/dns/include/Record.hpp b/src/core/dns/include/Record.hpp deleted file mode 100644 index 54b3c31..0000000 --- a/src/core/dns/include/Record.hpp +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef RECORD_HPP -#define RECORD_HPP -#include -#include "Resource.hpp" -#include -#include -#include - -namespace Plains { -namespace Core { -namespace DNS { - -using std::ostream; -using std::stringbuf; - - -// Provides an abstract class for dns records that may be stored in the database -class Record : public Resource -{ - public: - const uint16_t _id; - ostream& serialze(); - Record(const uint16_t id); - ~Record(); - - private: - stringbuf _sb; - ostream* _os; -}; - -class ARecord : public Record { ARecord(); }; -class AAAARecord : public Record { AAAARecord(); }; -class AFSDBRecord : public Record { AFSDBRecord(); }; -class APLRecord : public Record { APLRecord(); }; -class CAARecord : public Record { CAARecord(); }; -class CDNSKEYRecord : public Record { CDNSKEYRecord(); }; -class CDSRecord : public Record { CDSRecord(); }; -class CERTRecord : public Record { CERTRecord(); }; -class CNAMERecord : public Record { CNAMERecord(); }; -class CSYNCRecord : public Record { CSYNCRecord(); }; -class DHCIDRecord : public Record { DHCIDRecord(); }; -class DLVRecord : public Record { DLVRecord(); }; -class DNAMERecord : public Record { DNAMERecord(); }; -class DNSKEYRecord : public Record { DNSKEYRecord(); }; -class DSRecord : public Record { DSRecord(); }; -class EUI48Record : public Record { EUI48Record(); }; -class EUI64Record : public Record { EUI64Record(); }; -class HINFORecord : public Record { HINFORecord(); }; -class HIPRecord : public Record { HIPRecord(); }; -class IPSECKEYRecord : public Record { IPSECKEYRecord(); }; -class KEYRecord : public Record { KEYRecord(); }; -class KXRecord : public Record { KXRecord(); }; -class LOCRecord : public Record { LOCRecord(); }; -class MXRecord : public Record { MXRecord(); }; -class NAPTRRecord : public Record { NAPTRRecord(); }; -class NSRecord : public Record { NSRecord(); }; -class NSECRecord : public Record { NSECRecord(); }; -class NSEC3Record : public Record { NSEC3Record(); }; -class NSEC3PARAMRecord : public Record { NSEC3PARAMRecord(); }; -class OPENPGPKEYRecord : public Record { OPENPGPKEYRecord(); }; -class PTRRecord : public Record { PTRRecord(); }; -class RRSIGRecord : public Record { RRSIGRecord(); }; -class RPRecord : public Record { RPRecord(); }; -class SIGRecord : public Record { SIGRecord(); }; -class SMIMEARecord : public Record { SMIMEARecord(); }; -class SOARecord : public Record { SOARecord(); }; -class SRVRecord : public Record { SRVRecord(); }; -class SSHFPRecord : public Record { SSHFPRecord(); }; -class TARecord : public Record { TARecord(); }; -class TKEYRecord : public Record { TKEYRecord(); }; -class TLSARecord : public Record { TLSARecord(); }; -class TSIGRecord : public Record { TSIGRecord(); }; -class TXTRecord : public Record { TXTRecord(); }; -class URIRecord : public Record { URIRecord(); }; -class ZONEMDRecord : public Record { ZONEMDRecord(); }; -class SVCBRecord : public Record { SVCBRecord(); }; -class HTTPSRecord : public Record { HTTPSRecord(); }; - - -}}} -#endif diff --git a/src/core/dns/include/ResourceRecord.hpp b/src/core/dns/include/ResourceRecord.hpp new file mode 100644 index 0000000..f0e77b9 --- /dev/null +++ b/src/core/dns/include/ResourceRecord.hpp @@ -0,0 +1,81 @@ +#ifndef RESOURCE_RECORD_HPP +#define RESOURCE_RECORD_HPP +#include +#include "Resource.hpp" +#include +#include +#include + +namespace Plains { +namespace Core { +namespace DNS { + +using std::ostream; +using std::stringbuf; + + +// Provides an abstract class for dns records that may be stored in the database +class ResourceRecord : public Resource +{ + public: + const uint16_t _id; + ostream& serialze(); + ResourceRecord(const uint16_t id); + ~ResourceRecord(); + + private: + stringbuf _sb; + ostream* _os; +}; + +class ARecord : public ResourceRecord { ARecord(); }; +class AAAARecord : public ResourceRecord { AAAARecord(); }; +class AFSDBRecord : public ResourceRecord { AFSDBRecord(); }; +class APLRecord : public ResourceRecord { APLRecord(); }; +class CAARecord : public ResourceRecord { CAARecord(); }; +class CDNSKEYRecord : public ResourceRecord { CDNSKEYRecord(); }; +class CDSRecord : public ResourceRecord { CDSRecord(); }; +class CERTRecord : public ResourceRecord { CERTRecord(); }; +class CNAMERecord : public ResourceRecord { CNAMERecord(); }; +class CSYNCRecord : public ResourceRecord { CSYNCRecord(); }; +class DHCIDRecord : public ResourceRecord { DHCIDRecord(); }; +class DLVRecord : public ResourceRecord { DLVRecord(); }; +class DNAMERecord : public ResourceRecord { DNAMERecord(); }; +class DNSKEYRecord : public ResourceRecord { DNSKEYRecord(); }; +class DSRecord : public ResourceRecord { DSRecord(); }; +class EUI48Record : public ResourceRecord { EUI48Record(); }; +class EUI64Record : public ResourceRecord { EUI64Record(); }; +class HINFORecord : public ResourceRecord { HINFORecord(); }; +class HIPRecord : public ResourceRecord { HIPRecord(); }; +class IPSECKEYRecord : public ResourceRecord { IPSECKEYRecord(); }; +class KEYRecord : public ResourceRecord { KEYRecord(); }; +class KXRecord : public ResourceRecord { KXRecord(); }; +class LOCRecord : public ResourceRecord { LOCRecord(); }; +class MXRecord : public ResourceRecord { MXRecord(); }; +class NAPTRRecord : public ResourceRecord { NAPTRRecord(); }; +class NSRecord : public ResourceRecord { NSRecord(); }; +class NSECRecord : public ResourceRecord { NSECRecord(); }; +class NSEC3Record : public ResourceRecord { NSEC3Record(); }; +class NSEC3PARAMRecord : public ResourceRecord { NSEC3PARAMRecord(); }; +class OPENPGPKEYRecord : public ResourceRecord { OPENPGPKEYRecord(); }; +class PTRRecord : public ResourceRecord { PTRRecord(); }; +class RRSIGRecord : public ResourceRecord { RRSIGRecord(); }; +class RPRecord : public ResourceRecord { RPRecord(); }; +class SIGRecord : public ResourceRecord { SIGRecord(); }; +class SMIMEARecord : public ResourceRecord { SMIMEARecord(); }; +class SOARecord : public ResourceRecord { SOARecord(); }; +class SRVRecord : public ResourceRecord { SRVRecord(); }; +class SSHFPRecord : public ResourceRecord { SSHFPRecord(); }; +class TARecord : public ResourceRecord { TARecord(); }; +class TKEYRecord : public ResourceRecord { TKEYRecord(); }; +class TLSARecord : public ResourceRecord { TLSARecord(); }; +class TSIGRecord : public ResourceRecord { TSIGRecord(); }; +class TXTRecord : public ResourceRecord { TXTRecord(); }; +class URIRecord : public ResourceRecord { URIRecord(); }; +class ZONEMDRecord : public ResourceRecord { ZONEMDRecord(); }; +class SVCBRecord : public ResourceRecord { SVCBRecord(); }; +class HTTPSRecord : public ResourceRecord { HTTPSRecord(); }; + + +}}} +#endif diff --git a/src/resolver/Message.cpp b/src/resolver/Message.cpp index 03f7cf5..f281cab 100644 --- a/src/resolver/Message.cpp +++ b/src/resolver/Message.cpp @@ -4,33 +4,61 @@ namespace Plains { namespace Resolver { -unsigned Message::Header::id() const { return ntohs(_id); } -unsigned Message::Header::rCode() const { return ntohs(_rCode); } -unsigned Message::Header::qdCount() const { return ntohs(_qdCount); } -unsigned Message::Header::anCount() const { return ntohs(_anCount); } -unsigned Message::Header::nsCount() const { return ntohs(_nsCount); } -unsigned Message::Header::arCount() const { return ntohs(_arCount); } -unsigned Message::Header::opCode() const { return ntohs(_opCode); } -bool Message::Header::rd() const { return ntohs(_rd); } -bool Message::Header::aa() const { return ntohs(_aa); } -bool Message::Header::tc() const { return ntohs(_tc); } -bool Message::Header::ra() const { return ntohs(_ra); } -bool Message::Header::qr() const { return ntohs(_qr); } -void Message::Header::id (unsigned value) { _id = htons(value); } -void Message::Header::rCode (unsigned value) { _rCode = htons(value); } -void Message::Header::qdCount(unsigned value) { _qdCount = htons(value); } -void Message::Header::anCount(unsigned value) { _anCount = htons(value); } -void Message::Header::nsCount(unsigned value) { _nsCount = htons(value); } -void Message::Header::arCount(unsigned value) { _arCount = htons(value); } -void Message::Header::opCode (unsigned value) { _opCode = htons(value); } -void Message::Header::rd (RD::FLAG flag) { _rd = flag; } -void Message::Header::aa (AA::FLAG flag) { _aa = flag; } -void Message::Header::tc (TC::FLAG flag) { _tc = flag; } -void Message::Header::ra (RA::FLAG flag) { _ra = flag; } -void Message::Header::qr (QR::FLAG flag) { _qr = flag; } -size_t Message::size() { return 12; } +Message::Message() { + _id = 0; + _qr = 0; + _opCode = 0; + _aa = 0; + _tc = 0; + _rd = 0; + _ra = 0; + _rCode = 0; + _qdCount = 0; + _anCount = 0; + _nsCount = 0; + _arCount = 0; +} + +Message::Message(const Buffer& buffer) { decodeMessage(buffer); } + +unsigned Message::id() const { return _id; } +unsigned Message::rCode() const { return _rCode; } +unsigned Message::qdCount() const { return _qdCount; } +unsigned Message::anCount() const { return _anCount; } +unsigned Message::nsCount() const { return _nsCount; } +unsigned Message::arCount() const { return _arCount; } +unsigned Message::opCode() const { return _opCode; } +bool Message::rd() const { return _rd; } +bool Message::aa() const { return _aa; } +bool Message::tc() const { return _tc; } +bool Message::ra() const { return _ra; } +bool Message::qr() const { return _qr; } + +void Message::id (unsigned value) { _id = value; } +void Message::rCode (unsigned value) { _rCode = value; } +void Message::qdCount(unsigned value) { _qdCount = value; } +void Message::anCount(unsigned value) { _anCount = value; } +void Message::nsCount(unsigned value) { _nsCount = value; } +void Message::arCount(unsigned value) { _arCount = value; } +void Message::opCode (unsigned value) { _opCode = value; } +void Message::rd (RD::FLAG flag) { _rd = flag; } +void Message::aa (AA::FLAG flag) { _aa = flag; } +void Message::tc (TC::FLAG flag) { _tc = flag; } +void Message::ra (RA::FLAG flag) { _ra = flag; } +void Message::qr (QR::FLAG flag) { _qr = flag; } + +unique_ptr Message::encodeMessage() const; { + //Encode message +} + +void Message::decode(const Buffer& buffer) { + //Interprete Buffer + //buffer.size + //buffer.data + //ntohs & htons +} diff --git a/src/resolver/include/Message.hpp b/src/resolver/include/Message.hpp index e86107e..0416bb6 100644 --- a/src/resolver/include/Message.hpp +++ b/src/resolver/include/Message.hpp @@ -1,71 +1,80 @@ #ifndef MESSAGE_HPP #define MESSAGE_HPP #include +#include namespace Plains { namespace Resolver { using std::size_t; +using std::unique_ptr; class Message { + /* + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ID | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + |QR| OpCode |AA|TC|RD|RA| Z | RCODE | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | QDCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ANCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | NSCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ARCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + */ + public: + struct RCode { enum FLAG { NO_ERR, FORMAT_ERR, SERVER_FAIL, NAME_ERR, NOT_IMPL, REFUSED, YX_DOM, YX_RR_SET, NX_RR_SET, NOT_AUTH, NOT_ZONE }; }; + struct OpCode { enum FLAG { QUERY, IQUERY, STATUS, reserved, NOTIFY, UPDATE }; }; + struct QR { enum FLAG { QUERY, RESPONSE }; }; + struct AA { enum FLAG { NON_AUTHORATATIVE, AUTHORATATIVE }; }; + struct TC { enum FLAG { NON_TRUNCATED, TRUNCATED }; }; + struct RD { enum FLAG { NOT_DESIRED, DESIRED }; }; + struct RA { enum FLAG { NOT_AVAILABLE, AVAILABLE }; }; + + struct Buffer { + size_t size; + void* data; + }; + Message(); - size_t size(); + Message(const Buffer& buffer); - public: //change to private after debugging - class Header { - public: - /* - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | ID | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - |QR| OpCode |AA|TC|RD|RA| Z | RCODE | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | QDCOUNT | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | ANCOUNT | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | NSCOUNT | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | ARCOUNT | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - */ - struct RCode { enum FLAG { NO_ERR, FORMAT_ERR, SERVER_FAIL, NAME_ERR, NOT_IMPL, REFUSED, YX_DOM, YX_RR_SET, NX_RR_SET, NOT_AUTH, NOT_ZONE }; }; - struct OpCode { enum FLAG { QUERY, IQUERY, STATUS, reserved, NOTIFY, UPDATE }; }; - struct QR { enum FLAG { QUERY, RESPONSE }; }; - struct AA { enum FLAG { NON_AUTHORATATIVE, AUTHORATATIVE }; }; - struct TC { enum FLAG { NON_TRUNCATED, TRUNCATED }; }; - struct RD { enum FLAG { NOT_DESIRED, DESIRED }; }; - struct RA { enum FLAG { NOT_AVAILABLE, AVAILABLE }; }; + unsigned id() const; // Identifyer + unsigned rCode() const; // Response Code + unsigned qdCount() const; // Question Count + unsigned anCount() const; // Answer Record Count + unsigned nsCount() const; // Authority Record Count + unsigned arCount() const; // Additional Record Count + unsigned opCode() const; // Operation Code + bool qr() const; // Query/Respose Flag + bool aa() const; // Authoratative Answer Flag + bool tc() const; // Truncation Flag + bool rd() const; // Recursion Desired Flag + bool ra() const; // Recursion Available Flag + unique_ptr encodeMessage() const; // Creates network byte-orderd message to be sent - unsigned id() const; // Identifyer - unsigned rCode() const; // Response Code - unsigned qdCount() const; // Question Count - unsigned anCount() const; // Answer Record Count - unsigned nsCount() const; // Authority Record Count - unsigned arCount() const; // Additional Record Count - unsigned opCode() const; // Operation Code - bool qr() const; // Query/Respose Flag - bool aa() const; // Authoratative Answer Flag - bool tc() const; // Truncation Flag - bool rd() const; // Recursion Desired Flag - bool ra() const; // Recursion Available Flag - - void id (unsigned value); - void rCode (unsigned value); - void qdCount(unsigned value); - void anCount(unsigned value); - void nsCount(unsigned value); - void arCount(unsigned value); - void opCode (unsigned value); - void qr(QR::FLAG flag); - void aa(AA::FLAG flag); - void tc(TC::FLAG flag); - void rd(RD::FLAG flag); - void ra(RA::FLAG flag); + void id (unsigned value); + void rCode (unsigned value); + void qdCount(unsigned value); + void anCount(unsigned value); + void nsCount(unsigned value); + void arCount(unsigned value); + void opCode (unsigned value); + void qr(QR::FLAG flag); + void aa(AA::FLAG flag); + void tc(TC::FLAG flag); + void rd(RD::FLAG flag); + void ra(RA::FLAG flag); + void decodeMessage(const Buffer& buffer); + private: + struct Header { private: unsigned _id : 16; //Identifier: A 16-bit identification field generated by the device that creates the DNS query. It is copied by the server into the response, so it can be used by that device to match that query to the corresponding reply received from a DNS server. This is used in a manner similar to how the Identifier field is used in many of the ICMP message types. bool _qr : 1; //Query/Response Flag: Differentiates between queries and responses. Set to 0 when the query is generated; changed to 1 when that query is changed to a response by a replying server. @@ -80,13 +89,25 @@ class Message unsigned _anCount : 16; //Answer Record Count: Specifies the number of resource records in the Answer section of the message. unsigned _nsCount : 16; //Authority Record Count: Specifies the number of resource records in the Authority section of the message. (“NS” stands for “name server”, of course. J) unsigned _arCount : 16; //Additional Record Count: Specifies the number of resource records in the Additional section of the message. - } header; + }; - struct Question {} question; - struct Answer {} answer; - struct Authority {} authority; - struct Additional {} additional; + unsigned _id; + bool _qr; + unsigned _opCode; + bool _aa; + bool _tc; + bool _rd; + bool _ra; + unsigned _rCode; + unsigned _qdCount; + unsigned _anCount; + unsigned _nsCount; + unsigned _arCount; + vector _question; + vector _answer; + vector _authority; + vector _additional; };