Kea 2.7.6
|
The AbstractMessageRenderer
class is an abstract base class that provides common interfaces for rendering a DNS message into a buffer in wire format.
More...
#include <messagerenderer.h>
Public Types | |
enum | CompressMode { CASE_INSENSITIVE , CASE_SENSITIVE } |
Compression mode constants. More... | |
Public Member Functions | |
Getter Methods | |
const void * | getData () const |
Return a pointer to the head of the data stored in the internal buffer. | |
size_t | getLength () const |
Return the length of data written in the internal buffer. | |
virtual bool | isTruncated () const =0 |
Return whether truncation has occurred while rendering. | |
virtual size_t | getLengthLimit () const =0 |
Return the maximum length of rendered data that can fit in the corresponding DNS message without truncation. | |
virtual CompressMode | getCompressMode () const =0 |
Return the compression mode of the renderer class object. | |
Setter Methods | |
void | setBuffer (isc::util::OutputBuffer *buffer) |
Set or reset a temporary output buffer. | |
virtual void | setTruncated ()=0 |
Mark the renderer to indicate truncation has occurred while rendering. | |
virtual void | setLengthLimit (size_t len)=0 |
Set the maximum length of rendered data that can fit in the corresponding DNS message without truncation. | |
virtual void | setCompressMode (CompressMode mode)=0 |
Set the compression mode of the renderer class object. | |
Methods for writing data into the internal buffer. | |
void | skip (size_t len) |
Insert a specified length of gap at the end of the buffer. | |
void | trim (size_t len) |
Trim the specified length of data from the end of the internal buffer. | |
virtual void | clear () |
Clear the internal buffer and other internal resources. | |
void | writeUint8 (const uint8_t data) |
Write an unsigned 8-bit integer into the internal buffer. | |
void | writeUint16 (uint16_t data) |
Write an unsigned 16-bit integer in host byte order into the internal buffer in network byte order. | |
void | writeUint16At (uint16_t data, size_t pos) |
Write an unsigned 16-bit integer in host byte order at the specified position of the internal buffer in network byte order. | |
void | writeUint32 (uint32_t data) |
Write an unsigned 32-bit integer in host byte order into the internal buffer in network byte order. | |
void | writeData (const void *data, size_t len) |
Copy an arbitrary length of data into the internal buffer of the renderer object. | |
virtual void | writeName (const Name &name, bool compress=true)=0 |
Write a Name object into the internal buffer in wire format, with or without name compression. | |
virtual void | writeName (const LabelSequence &ls, bool compress=true)=0 |
Write a LabelSequence object into the internal buffer in wire format, with or without name compression. | |
Constructors and Destructor | |
AbstractMessageRenderer () | |
The default constructor. | |
const isc::util::OutputBuffer & | getBuffer () const |
Return the output buffer we render into. | |
isc::util::OutputBuffer & | getBuffer () |
virtual | ~AbstractMessageRenderer () |
The destructor. | |
The AbstractMessageRenderer
class is an abstract base class that provides common interfaces for rendering a DNS message into a buffer in wire format.
A specific derived class of AbstractMessageRenderer
(we call it a renderer class hereafter) is simply responsible for name compression at least in the current design. A renderer class object (conceptually) manages the positions of names rendered in some sort of buffer and uses that information to render subsequent names with compression.
A renderer class is mainly intended to be used as a helper for a more comprehensive Message
class internally; normal applications won't have to care about details of this class.
By default any (derived) renderer class object is associated with an internal buffer, and subsequent write operations will be performed on that buffer. The rendering result can be retrieved via the getData()
method.
If an application wants a separate buffer can be (normally temporarily) set for rendering operations via the setBuffer()
method. In that case, it is generally expected that all rendering operations are performed via that object. If the application modifies the buffer in parallel with the renderer, the result will be undefined.
Note to developers: we introduced a separate class for name compression because previous benchmark with BIND9 showed compression affects overall response performance very much. By having a separate class dedicated for this purpose, we'll be able to change the internal implementation of name compression in the future without affecting other part of the API and implementation.
In addition, by introducing a class hierarchy from AbstractMessageRenderer
, we allow an application to use a customized renderer class for specific purposes. For example, a high performance DNS server may want to use an optimized renderer class assuming some specific underlying data representation.
Definition at line 69 of file messagerenderer.h.
Compression mode constants.
The CompressMode
enum type represents the name compression mode for renderer classes. CASE_INSENSITIVE
means compress names in case-insensitive manner; CASE_SENSITIVE
means compress names in case-sensitive manner. By default, a renderer compresses names in case-insensitive manner. Compression mode can be dynamically modified by the setCompressMode()
method. The mode can be changed even in the middle of rendering, although this is not an intended usage. In this case the names already compressed are intact; only names being compressed after the mode change are affected by the change. If a renderer class object is reinitialized by the clear()
method, the compression mode will be reset to the default, which is CASE_INSENSITIVE
One specific case where case-sensitive compression is required is AXFR as described in draft-ietf-dnsext-axfr-clarify. A primary authoritative DNS server implementation using this API would specify CASE_SENSITIVE
before rendering outgoing AXFR messages.
Enumerator | |
---|---|
CASE_INSENSITIVE | Compress names case-insensitive manner (default) |
CASE_SENSITIVE | Compress names case-sensitive manner. |
Definition at line 94 of file messagerenderer.h.
|
protected |
The default constructor.
This is intentionally defined as protected
as this base class should never be instantiated (except as part of a derived class).
Definition at line 362 of file messagerenderer.cc.
|
inlinevirtual |
The destructor.
Definition at line 110 of file messagerenderer.h.
|
virtual |
Clear the internal buffer and other internal resources.
This method can be used to re-initialize and reuse the renderer without constructing a new one.
Reimplemented in isc::dns::MessageRenderer.
Definition at line 388 of file messagerenderer.cc.
References isc::util::OutputBuffer::clear().
Referenced by isc::dns::MessageRenderer::clear(), setBuffer(), and isc::dns::MessageImpl::toWire().
|
inlineprotected |
Definition at line 115 of file messagerenderer.h.
|
inlineprotected |
Return the output buffer we render into.
Definition at line 114 of file messagerenderer.h.
Referenced by isc::dns::MessageRenderer::writeName().
|
pure virtual |
Return the compression mode of the renderer class object.
This method never throws an exception.
Implemented in isc::dns::MessageRenderer.
Referenced by isc::dns::MessageImpl::toWire().
|
inline |
Return a pointer to the head of the data stored in the internal buffer.
This method works exactly same as the same method of the OutputBuffer
class; all notes for OutputBuffer
apply.
Definition at line 140 of file messagerenderer.h.
Referenced by isc::dns::MessageImpl::toWire().
|
inline |
Return the length of data written in the internal buffer.
Definition at line 145 of file messagerenderer.h.
Referenced by isc::dns::MessageRenderer::setCompressMode(), isc::dns::BasicRRsetImpl::toWire(), isc::dns::EDNS::toWire(), isc::dns::MessageImpl::toWire(), isc::dns::Question::toWire(), isc::dns::TSIGRecord::toWire(), and isc::dns::MessageRenderer::writeName().
|
pure virtual |
Return the maximum length of rendered data that can fit in the corresponding DNS message without truncation.
This method never throws an exception.
Implemented in isc::dns::MessageRenderer.
Referenced by isc::dns::AbstractRRset::toWire(), isc::dns::BasicRRset::toWire(), isc::dns::EDNS::toWire(), isc::dns::MessageImpl::toWire(), isc::dns::Question::toWire(), and isc::dns::TSIGRecord::toWire().
|
pure virtual |
Return whether truncation has occurred while rendering.
Once the return value of this method is true
, it doesn't make sense to try rendering more data, although this class itself doesn't reject the attempt.
This method never throws an exception.
false
. Implemented in isc::dns::MessageRenderer.
Referenced by isc::dns::MessageImpl::toWire().
void isc::dns::AbstractMessageRenderer::setBuffer | ( | isc::util::OutputBuffer * | buffer | ) |
Set or reset a temporary output buffer.
This method can be used for an application that manages an output buffer separately from the message renderer and wants to keep reusing the renderer. When the renderer is associated with the default buffer and the given pointer is non null, the given buffer will be (temporarily) used for subsequent message rendering; if the renderer is associated with a temporary buffer and the given pointer is null, the renderer will be reset with the default buffer. In the latter case any additional resources (possibly specific to a derived renderer class) will be cleared, but the temporary buffer is kept as the latest state (which would normally store the rendering result).
This method imposes some restrictions to prevent accidental misuse that could cause disruption such as dereferencing an invalid object. First, a temporary buffer must not be set when the associated buffer is in use, that is, any data are stored in the buffer. Also, the default buffer cannot be "reset"; when null is specified a temporary buffer must have been set beforehand. If these conditions aren't met an isc::InvalidParameter exception will be thrown. This method is exception free otherwise.
isc::InvalidParameter | A restrictions of the method usage isn't met. |
buffer | A pointer to a temporary output buffer or null for reset it. |
Definition at line 367 of file messagerenderer.cc.
References clear(), isc::util::OutputBuffer::getLength(), and isc_throw.
Referenced by isc::d2::DNSClientImpl::doUpdate().
|
pure virtual |
Set the compression mode of the renderer class object.
This method never throws an exception.
mode | A CompressMode value representing the compression mode. |
Implemented in isc::dns::MessageRenderer.
Referenced by isc::dns::MessageImpl::toWire().
|
pure virtual |
Set the maximum length of rendered data that can fit in the corresponding DNS message without truncation.
This method never throws an exception.
len | The maximum length in bytes. |
Implemented in isc::dns::MessageRenderer.
Referenced by isc::dns::MessageImpl::toWire().
|
pure virtual |
Mark the renderer to indicate truncation has occurred while rendering.
This method never throws an exception.
Implemented in isc::dns::MessageRenderer.
Referenced by isc::dns::AbstractRRset::toWire(), isc::dns::BasicRRset::toWire(), isc::dns::Question::toWire(), isc::dns::RRset::toWire(), and isc::dns::TSIGRecord::toWire().
|
inline |
Insert a specified length of gap at the end of the buffer.
The caller should not assume any particular value to be inserted. This method is provided as a shortcut to make a hole in the buffer that is to be filled in later, e.g, by writeUint16At().
len | The length of the gap to be inserted in bytes. |
Definition at line 242 of file messagerenderer.h.
Referenced by isc::dns::BasicRRsetImpl::toWire(), and isc::dns::MessageImpl::toWire().
|
inline |
Trim the specified length of data from the end of the internal buffer.
This method is provided for such cases as DNS message truncation.
The specified length must not exceed the current data size of the buffer; otherwise an exception of class isc::OutOfRange
will be thrown.
len | The length of data that should be trimmed. |
Definition at line 256 of file messagerenderer.h.
Referenced by isc::dns::BasicRRsetImpl::toWire(), and isc::dns::Question::toWire().
|
inline |
Copy an arbitrary length of data into the internal buffer of the renderer object.
No conversion on the copied data is performed.
data | A pointer to the data to be copied into the internal buffer. |
len | The length of the data in bytes. |
Definition at line 310 of file messagerenderer.h.
Referenced by isc::dns::rdata::generic::detail::TXTLikeImpl< Type, typeCode >::toWire(), isc::dns::rdata::generic::Generic::toWire(), and isc::dns::MessageRenderer::writeName().
|
pure virtual |
Write a LabelSequence
object into the internal buffer in wire format, with or without name compression.
This is the same as the other version, which takes Name
instead of LabelSequence
, except for the parameter type. The passed LabelSequence
must be absolute.
ls | A LabelSequence object to be written. |
compress | A boolean indicating whether to enable name compression. |
Implemented in isc::dns::MessageRenderer.
|
pure virtual |
Write a Name
object into the internal buffer in wire format, with or without name compression.
If the optional parameter compress
is true
, this method tries to compress the name
if possible, searching the entire message that has been rendered. Otherwise name compression is omitted. Its default value is true
.
Note: even if compress
is true
, the position of the name
(and possibly its ancestor names) in the message is recorded and may be used for compressing subsequent names.
name | A Name object to be written. |
compress | A boolean indicating whether to enable name compression. |
Implemented in isc::dns::MessageRenderer.
Referenced by isc::dns::Name::toWire(), isc::dns::Question::toWire(), and isc::dns::TSIGRecord::toWire().
|
inline |
Write an unsigned 16-bit integer in host byte order into the internal buffer in network byte order.
data | The 16-bit integer to be written into the buffer. |
Definition at line 277 of file messagerenderer.h.
Referenced by isc::dns::BasicRRsetImpl::toWire(), isc::dns::RRClass::toWire(), isc::dns::RRType::toWire(), and isc::dns::MessageRenderer::writeName().
|
inline |
Write an unsigned 16-bit integer in host byte order at the specified position of the internal buffer in network byte order.
The buffer must have a sufficient room to store the given data at the given position, that is, pos + 2 < getLength()
; otherwise an exception of class isc::OutOfRange
will be thrown. Note also that this method never extends the internal buffer.
data | The 16-bit integer to be written into the internal buffer. |
pos | The beginning position in the buffer to write the data. |
Definition at line 291 of file messagerenderer.h.
Referenced by isc::dns::BasicRRsetImpl::toWire(), and isc::dns::MessageImpl::toWire().
|
inline |
Write an unsigned 32-bit integer in host byte order into the internal buffer in network byte order.
data | The 32-bit integer to be written into the buffer. |
Definition at line 299 of file messagerenderer.h.
Referenced by isc::dns::RRTTL::toWire().
|
inline |
Write an unsigned 8-bit integer into the internal buffer.
data | The 8-bit integer to be written into the internal buffer. |
Definition at line 269 of file messagerenderer.h.