22#include <boost/lexical_cast.hpp>
28using boost::lexical_cast;
46const unsigned int VERSION_SHIFT = 16;
47const unsigned int EXTRCODE_SHIFT = 24;
48const uint32_t VERSION_MASK = 0x00ff0000;
49const uint32_t EXTFLAG_DO = 0x00008000;
54 udp_size_(
Message::DEFAULT_MAX_UDPSIZE),
55 dnssec_aware_(false) {
58 "failed to construct EDNS: unsupported version: " <<
59 static_cast<unsigned int>(version_));
65 version_((ttl.getValue() & VERSION_MASK) >> VERSION_SHIFT) {
68 "EDNS is being created with incompatible RR type: "
74 static_cast<unsigned int>(version_));
82 dnssec_aware_ = ((ttl.getValue() & EXTFLAG_DO) != 0);
83 udp_size_ = rrclass.getCode();
88 string ret =
"; EDNS: version: ";
90 ret += lexical_cast<string>(
static_cast<int>(
getVersion()));
95 ret +=
"; udp: " + lexical_cast<string>(
getUDPSize()) +
"\n";
103template <
typename Output>
105toWireCommon(Output& output,
const uint8_t
version,
106 const uint16_t udp_size,
const bool dnssec_aware,
107 const uint8_t extended_rcode) {
109 uint32_t extrcode_flags = extended_rcode << EXTRCODE_SHIFT;
110 extrcode_flags |= (
version << VERSION_SHIFT) & VERSION_MASK;
112 extrcode_flags |= EXTFLAG_DO;
121 edns_rrset->toWire(output);
129 const uint8_t extended_rcode)
const {
133 if (renderer.getLength() + 11 > renderer.getLengthLimit()) {
137 return (toWireCommon(renderer, version_, udp_size_, dnssec_aware_,
143 const uint8_t extended_rcode)
const {
144 return (toWireCommon(buffer, version_, udp_size_, dnssec_aware_,
152 uint8_t& extended_rcode) {
154 EDNS* edns =
new EDNS(name, rrclass, rrtype, ttl, rdata);
157 extended_rcode = ttl.getValue() >> EXTRCODE_SHIFT;
int version()
returns Kea hooks version.
A generic exception that is thrown if a parameter given to a method or function is considered invalid...
The AbstractMessageRenderer class is an abstract base class that provides common interfaces for rende...
The EDNS class represents the EDNS OPT RR defined in RFC2671.
EDNS(const uint8_t version=SUPPORTED_VERSION)
Constructor with the EDNS version.
std::string toText() const
Convert the EDNS to a string.
bool getDNSSECAwareness() const
Returns whether the message sender is DNSSEC aware.
uint8_t getVersion() const
Returns the version of EDNS.
uint32_t toWire(AbstractMessageRenderer &renderer, const uint8_t extended_rcode) const
Render the EDNS in the wire format.
uint16_t getUDPSize() const
Returns the maximum payload size of UDP messages for the sender of the message containing this EDNS.
static const uint8_t SUPPORTED_VERSION
The highest EDNS version this implementation supports.
The Message class encapsulates a standard DNS message.
The Name class encapsulates DNS names.
static const Name & ROOT_NAME()
Root name (i.e. ".").
The RRClass class encapsulates DNS resource record classes.
The RRTTL class encapsulates TTLs used in DNS resource records.
The RRType class encapsulates DNS resource record types.
static const RRType & OPT()
The RRset class is a concrete derived class of BasicRRset which contains a pointer to an additional R...
The Rdata class is an abstract base class that provides a set of common interfaces to manipulate conc...
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
boost::shared_ptr< const Rdata > ConstRdataPtr
boost::shared_ptr< AbstractRRset > RRsetPtr
A pointer-like type pointing to an RRset object.
ostream & operator<<(std::ostream &os, const EDNS &edns)
Insert the EDNS as a string into stream.
EDNS * createEDNSFromRR(const Name &name, const RRClass &rrclass, const RRType &rrtype, const RRTTL &ttl, const Rdata &rdata, uint8_t &extended_rcode)
Create a new EDNS object from a set of RR parameters, also providing the extended RCODE value.
Defines the logger used by the top-level component of kea-lfc.