Kea 2.7.5
|
Represents DHCPv4 Client FQDN Option (code 81). More...
#include <option4_client_fqdn.h>
Classes | |
class | Rcode |
Represents the value of one of the RCODE1 or RCODE2 fields. More... | |
A set of constants used to identify and set bits in the flags field | |
enum | DomainNameType : int { PARTIAL , FULL } |
Type of the domain-name: partial or full. More... | |
static const uint8_t | FLAG_S = 0x01 |
Bit S. | |
static const uint8_t | FLAG_O = 0x02 |
Bit O. | |
static const uint8_t | FLAG_E = 0x04 |
Bit E. | |
static const uint8_t | FLAG_N = 0x08 |
Bit N. | |
static const uint8_t | FLAG_MASK = 0xF |
Mask which zeroes MBZ flag bits. | |
static const uint16_t | FIXED_FIELDS_LEN = 3 |
The size in bytes of the fixed fields within DHCPv4 Client Fqdn Option. | |
Option4ClientFqdn (const uint8_t flags, const Rcode &rcode, const std::string &domain_name, const DomainNameType domain_name_type=FULL) | |
Constructor, creates option instance using flags and domain name. | |
Option4ClientFqdn (const uint8_t flags, const Rcode &rcode) | |
Constructor, creates option instance with empty domain name. | |
Option4ClientFqdn (OptionBufferConstIter first, OptionBufferConstIter last) | |
Constructor, creates an option instance from part of the buffer. | |
Option4ClientFqdn (const Option4ClientFqdn &source) | |
Copy constructor. | |
virtual OptionPtr | clone () const |
Copies this option and returns a pointer to the copy. | |
virtual | ~Option4ClientFqdn () |
Destructor. | |
Option4ClientFqdn & | operator= (const Option4ClientFqdn &source) |
Assignment operator. | |
bool | getFlag (const uint8_t flag) const |
Checks if the specified flag of the DHCPv4 Client FQDN Option is set. | |
void | setFlag (const uint8_t flag, const bool set) |
Modifies the value of the specified DHCPv4 Client Fqdn Option flag. | |
void | resetFlags () |
Sets the flag field value to 0. | |
std::pair< Rcode, Rcode > | getRcode () const |
Returns Rcode objects representing value of RCODE1 and RCODE2. | |
void | setRcode (const Rcode &rcode) |
Set Rcode value. | |
std::string | getDomainName () const |
Returns the domain-name in the text format. | |
void | packDomainName (isc::util::OutputBuffer &buf) const |
Writes domain-name in the wire format into a buffer. | |
void | setDomainName (const std::string &domain_name, const DomainNameType domain_name_type) |
Set new domain-name. | |
void | resetDomainName () |
Set empty domain-name. | |
DomainNameType | getDomainNameType () const |
Returns enumerator value which indicates whether domain-name is partial or full. | |
virtual void | pack (isc::util::OutputBuffer &buf, bool check=true) const |
Writes option in the wire format into a buffer. | |
virtual void | unpack (OptionBufferConstIter first, OptionBufferConstIter last) |
Parses option from the received buffer. | |
virtual std::string | toText (int indent=0) const |
Returns string representation of the option. | |
virtual uint16_t | len () const |
Returns length of the complete option (data length + DHCPv4 option header). | |
Well known Rcode declarations for DHCPv4 Client FQDN Option | |
static const Rcode & | RCODE_SERVER () |
Rcode being set by the server. | |
static const Rcode & | RCODE_CLIENT () |
Rcode being set by the client. | |
Additional Inherited Members | |
Public Types inherited from isc::dhcp::Option | |
typedef OptionPtr | Factory(Option::Universe u, uint16_t type, const OptionBuffer &buf) |
a factory function prototype | |
enum | Universe { V4 , V6 } |
defines option universe DHCPv4 or DHCPv6 More... | |
Public Member Functions inherited from isc::dhcp::Option | |
Option (const Option &source) | |
Copy constructor. | |
Option (Universe u, uint16_t type) | |
ctor, used for options constructed, usually during transmission | |
Option (Universe u, uint16_t type, const OptionBuffer &data) | |
Constructor, used for received options. | |
Option (Universe u, uint16_t type, OptionBufferConstIter first, OptionBufferConstIter last) | |
Constructor, used for received options. | |
virtual | ~Option () |
just to force that every option has virtual dtor | |
void | addOption (OptionPtr opt) |
Adds a sub-option. | |
bool | delOption (uint16_t type) |
Attempts to delete first suboption of requested type. | |
virtual bool | equals (const Option &other) const |
Checks if two options are equal. | |
bool | equals (const OptionPtr &other) const |
Checks if options are equal. | |
virtual const OptionBuffer & | getData () const |
Returns pointer to actual data. | |
std::string | getEncapsulatedSpace () const |
Returns the name of the option space encapsulated by this option. | |
virtual uint16_t | getHeaderLen () const |
Returns length of header (2 for v4, 4 for v6) | |
OptionCollection & | getMutableOptions () |
Returns all encapsulated options. | |
OptionPtr | getOption (uint16_t type) const |
Returns shared_ptr to suboption of specific type. | |
const OptionCollection & | getOptions () const |
Returns all encapsulated options. | |
void | getOptionsCopy (OptionCollection &options_copy) const |
Performs deep copy of suboptions. | |
uint16_t | getType () const |
Returns option type (0-255 for DHCPv4, 0-65535 for DHCPv6) | |
uint16_t | getUint16 () const |
Returns content of first word. | |
uint32_t | getUint32 () const |
Returns content of first double word. | |
uint8_t | getUint8 () const |
Returns content of first byte. | |
Universe | getUniverse () const |
returns option universe (V4 or V6) | |
Option & | operator= (const Option &rhs) |
Assignment operator. | |
template<typename InputIterator > | |
void | setData (InputIterator first, InputIterator last) |
Sets content of this option from buffer. | |
void | setEncapsulatedSpace (const std::string &encapsulated_space) |
Sets the name of the option space encapsulated by this option. | |
void | setUint16 (uint16_t value) |
Sets content of this option to a single uint16 value. | |
void | setUint32 (uint32_t value) |
Sets content of this option to a single uint32 value. | |
void | setUint8 (uint8_t value) |
Sets content of this option to a single uint8 value. | |
virtual std::vector< uint8_t > | toBinary (const bool include_header=false) const |
Returns binary representation of the option. | |
virtual std::string | toHexString (const bool include_header=false) const |
Returns string containing hexadecimal representation of option. | |
virtual std::string | toString () const |
Returns string representation of the value. | |
virtual bool | valid () const |
returns if option is valid (e.g. | |
Static Public Member Functions inherited from isc::dhcp::Option | |
static OptionPtr | create (Universe u, uint16_t type) |
Factory function creating an instance of the Option . | |
static OptionPtr | create (Universe u, uint16_t type, const OptionBuffer &data) |
Factory function creating an instance of the Option . | |
static OptionPtr | factory (Option::Universe u, uint16_t type) |
Factory function to create instance of option. | |
static OptionPtr | factory (Option::Universe u, uint16_t type, const OptionBuffer &buf) |
Factory function to create instance of option. | |
Static Public Attributes inherited from isc::dhcp::Option | |
static bool | lenient_parsing_ |
Governs whether options should be parsed less strictly. | |
static const size_t | OPTION4_HDR_LEN = 2 |
length of the usual DHCPv4 option header (there are exceptions) | |
static const size_t | OPTION6_HDR_LEN = 4 |
length of any DHCPv6 option header | |
Protected Member Functions inherited from isc::dhcp::Option | |
void | check () const |
A protected method used for option correctness. | |
template<typename OptionType > | |
OptionPtr | cloneInternal () const |
Copies this option and returns a pointer to the copy. | |
std::string | headerToText (const int indent=0, const std::string &type_name="") const |
Returns option header in the textual format. | |
void | packHeader (isc::util::OutputBuffer &buf, bool check=true) const |
Store option's header in a buffer. | |
void | packOptions (isc::util::OutputBuffer &buf, bool check=true) const |
Store sub options in a buffer. | |
std::string | suboptionsToText (const int indent=0) const |
Returns collection of suboptions in the textual format. | |
void | unpackOptions (const OptionBuffer &buf) |
Builds a collection of sub options from the buffer. | |
Protected Attributes inherited from isc::dhcp::Option | |
OptionBuffer | data_ |
contains content of this data | |
std::string | encapsulated_space_ |
Name of the option space being encapsulated by this option. | |
OptionCollection | options_ |
collection for storing suboptions | |
uint16_t | type_ |
option type (0-255 for DHCPv4, 0-65535 for DHCPv6) | |
Universe | universe_ |
option universe (V4 or V6) | |
Represents DHCPv4 Client FQDN Option (code 81).
This option has been defined in the RFC 4702 and it has a following structure:
The flags field has the following structure:
where:
This class exposes a set of functions to modify flags and check their correctness.
Domain names being carried by DHCPv4 Client Fqdn Option can be fully qualified or partial. Partial domain names are encoded similar to the fully qualified domain names, except that they lack terminating zero at the end of their wire representation (or lack of dot at the end, in case of ASCII encoding). It is also accepted to create an instance of this option which has empty domain-name. Clients use empty domain-names to indicate that server should generate complete fully qualified domain-name.
Since domain names are case insensitive (see RFC 4343), this class converts them to lower case format regardless if they are received over the wire or created from strings.
RFC 4702 mandates that the DHCP client sets RCODE1 and RCODE2 to 0 and that server sets them to 255. This class allows to set the value for these fields and both fields are always set to the same value. There is no way to set them separately (e.g. set different value for RCODE1 and RCODE2). However, there are no use cases which would require it.
Design choice: This class uses pimpl idiom to separate the interface from implementation specifics. Implementations may use different approaches to handle domain names (mostly validation of the domain-names). The existing isc::dns::Name
class is a natural (and the simplest) choice to handle domain-names. Use of this class however, implies that libdhcp must be linked with libdns. At some point these libraries may need to be separated, i.e. to support compilation and use of standalone DHCP server. This will require that the part of implementation which deals with domain-names is modified to not use classes from libdns. These changes will be transparent for this interface.
Definition at line 110 of file option4_client_fqdn.h.
enum isc::dhcp::Option4ClientFqdn::DomainNameType : int |
Type of the domain-name: partial or full.
Enumerator | |
---|---|
PARTIAL | |
FULL |
Definition at line 148 of file option4_client_fqdn.h.
|
explicit |
Constructor, creates option instance using flags and domain name.
This constructor is used to create an instance of the option which will be included in outgoing messages.
Note that the RCODE values are encapsulated by the Rcode object (not a simple uint8_t value). This helps to prevent a caller from confusing the flags value with rcode value (both are uint8_t values). For example: if caller swaps the two, it will be detected in the compilation time. Also, this API encourages the caller to use two predefined functions: RCODE_SERVER
and RCODE_CLIENT
to set the value of RCODE. These functions generate objects which represent the only valid values to be be passed to the constructor (255 and 0 respectively). Other values should not be used. However, it is still possible that the other entity (client or server) sends the option with invalid value. Although, the RCODE values are ignored, there should be a way to represent such invalid RCODE value. The Rcode class is capable of representing it.
flags | a combination of flags to be stored in flags field. |
rcode | Rcode object representing a value for RCODE1 and RCODE2 fields of the option. Both fields are assigned the same value encapsulated by the parameter. |
domain_name | a name to be stored in the domain-name field. |
domain_name_type | indicates if the domain name is partial or full. |
InvalidOption4FqdnFlags | if value of the flags field is wrong. |
InvalidOption4FqdnDomainName | if the domain-name is invalid. |
Definition at line 339 of file option4_client_fqdn.cc.
isc::dhcp::Option4ClientFqdn::Option4ClientFqdn | ( | const uint8_t | flags, |
const Rcode & | rcode ) |
Constructor, creates option instance with empty domain name.
This constructor creates an instance of the option with empty domain-name. This domain-name is marked partial.
flags | a combination of flags to be stored in flags field. |
rcode | Rcode object representing a value for RCODE1 and RCODE2 fields. Both fields are assigned the same value encapsulated by this parameter. |
InvalidOption4FqdnFlags | if value of the flags field is invalid. |
Definition at line 334 of file option4_client_fqdn.cc.
|
explicit |
Constructor, creates an option instance from part of the buffer.
This constructor is mainly used to parse options in the received messages. Function parameters specify buffer bounds from which the option should be created. The size of the buffer chunk, specified by the constructor's parameters should be equal or larger than the size of the option. Otherwise, constructor will throw an exception.
first | the lower bound of the buffer to create option from. |
last | the upper bound of the buffer to create option from. |
InvalidOption4FqdnFlags | if value of the flags field is invalid. |
InvalidOption4FqdnDomainName | if the domain-name carried by the option is invalid. |
OutOfRange | if the option is truncated. |
Definition at line 348 of file option4_client_fqdn.cc.
isc::dhcp::Option4ClientFqdn::Option4ClientFqdn | ( | const Option4ClientFqdn & | source | ) |
Copy constructor.
Definition at line 358 of file option4_client_fqdn.cc.
|
virtual |
Destructor.
Definition at line 354 of file option4_client_fqdn.cc.
|
virtual |
Copies this option and returns a pointer to the copy.
Reimplemented from isc::dhcp::Option.
Definition at line 364 of file option4_client_fqdn.cc.
std::string isc::dhcp::Option4ClientFqdn::getDomainName | ( | ) | const |
Returns the domain-name in the text format.
If domain-name is partial, it lacks the dot at the end (e.g. myhost). If domain-name is fully qualified, it has the dot at the end (e.g. myhost.example.com.).
Definition at line 436 of file option4_client_fqdn.cc.
References isc::dhcp::Option4ClientFqdnImpl::domain_name_, isc::dhcp::Option4ClientFqdnImpl::domain_name_type_, and PARTIAL.
Referenced by len(), packDomainName(), and toText().
Option4ClientFqdn::DomainNameType isc::dhcp::Option4ClientFqdn::getDomainNameType | ( | ) | const |
Returns enumerator value which indicates whether domain-name is partial or full.
Definition at line 486 of file option4_client_fqdn.cc.
References isc::dhcp::Option4ClientFqdnImpl::domain_name_type_.
Referenced by toText().
bool isc::dhcp::Option4ClientFqdn::getFlag | ( | const uint8_t | flag | ) | const |
Checks if the specified flag of the DHCPv4 Client FQDN Option is set.
flag | A value specifying a bit within flags field to be checked. It must be one of the following FLAG_S , FLAG_E , FLAG_O , FLAG_N . |
InvalidOption4ClientFlags | if specified flag which value is to be returned is invalid (is not one of the FLAG_S, FLAG_N, FLAG_O). |
is invalid and results in the exception.
Definition at line 381 of file option4_client_fqdn.cc.
References FLAG_E, FLAG_N, FLAG_O, FLAG_S, isc::dhcp::Option4ClientFqdnImpl::flags_, and isc_throw.
Referenced by len(), packDomainName(), and toText().
std::pair< Option4ClientFqdn::Rcode, Option4ClientFqdn::Rcode > isc::dhcp::Option4ClientFqdn::getRcode | ( | ) | const |
Returns Rcode
objects representing value of RCODE1 and RCODE2.
Definition at line 420 of file option4_client_fqdn.cc.
References isc::dhcp::Option4ClientFqdnImpl::rcode1_, and isc::dhcp::Option4ClientFqdnImpl::rcode2_.
|
virtual |
Returns length of the complete option (data length + DHCPv4 option header).
Reimplemented from isc::dhcp::Option.
Definition at line 532 of file option4_client_fqdn.cc.
References isc::dhcp::Option4ClientFqdnImpl::domain_name_, isc::dhcp::Option4ClientFqdnImpl::domain_name_type_, FIXED_FIELDS_LEN, FLAG_E, FULL, getDomainName(), getFlag(), and isc::dhcp::Option::getHeaderLen().
Option4ClientFqdn & isc::dhcp::Option4ClientFqdn::operator= | ( | const Option4ClientFqdn & | source | ) |
Assignment operator.
Definition at line 372 of file option4_client_fqdn.cc.
References isc::dhcp::Option::operator=().
|
virtual |
Writes option in the wire format into a buffer.
[out] | buf | output buffer where option data will be stored. |
check | if set to false, allows options larger than 255 for v4 |
Reimplemented from isc::dhcp::Option.
Definition at line 491 of file option4_client_fqdn.cc.
References isc::dhcp::Option::check(), isc::dhcp::Option4ClientFqdnImpl::flags_, isc::dhcp::Option4ClientFqdn::Rcode::getCode(), packDomainName(), isc::dhcp::Option::packHeader(), isc::dhcp::Option4ClientFqdnImpl::rcode1_, and isc::dhcp::Option4ClientFqdnImpl::rcode2_.
void isc::dhcp::Option4ClientFqdn::packDomainName | ( | isc::util::OutputBuffer & | buf | ) | const |
Writes domain-name in the wire format into a buffer.
The data being written are appended at the end of the buffer.
[out] | buf | buffer where domain-name will be written. |
Definition at line 447 of file option4_client_fqdn.cc.
References isc::dhcp::Option4ClientFqdnImpl::domain_name_, isc::dhcp::Option4ClientFqdnImpl::domain_name_type_, FLAG_E, getDomainName(), getFlag(), and PARTIAL.
Referenced by pack().
|
inlinestatic |
Rcode being set by the client.
Definition at line 359 of file option4_client_fqdn.h.
|
inlinestatic |
Rcode being set by the server.
Definition at line 353 of file option4_client_fqdn.h.
void isc::dhcp::Option4ClientFqdn::resetDomainName | ( | ) |
Set empty domain-name.
This function is equivalent to Option6ClientFqdn::setDomainName
with empty partial domain-name. It is exception safe.
Definition at line 481 of file option4_client_fqdn.cc.
References PARTIAL, and setDomainName().
void isc::dhcp::Option4ClientFqdn::resetFlags | ( | ) |
Sets the flag field value to 0.
Definition at line 431 of file option4_client_fqdn.cc.
References isc::dhcp::Option4ClientFqdnImpl::flags_.
void isc::dhcp::Option4ClientFqdn::setDomainName | ( | const std::string & | domain_name, |
const DomainNameType | domain_name_type ) |
Set new domain-name.
domain_name | domain name field value in the text format. |
domain_name_type | type of the domain name: partial or fully qualified. |
InvalidOption4FqdnDomainName | if the specified domain-name is invalid. |
Definition at line 475 of file option4_client_fqdn.cc.
References isc::dhcp::Option4ClientFqdnImpl::setDomainName().
Referenced by resetDomainName().
void isc::dhcp::Option4ClientFqdn::setFlag | ( | const uint8_t | flag, |
const bool | set ) |
Modifies the value of the specified DHCPv4 Client Fqdn Option flag.
flag | A value specifying a bit within flags field to be set. It must be one of the following FLAG_S , FLAG_E , FLAG_O , FLAG_N . |
set | a boolean value which indicates whether flag should be set (true), or cleared (false). |
InvalidOption4ClientFlags | if specified flag which value is to be set is invalid (is not one of the FLAG_S, FLAG_N, FLAG_O). |
Definition at line 393 of file option4_client_fqdn.cc.
References isc::dhcp::Option4ClientFqdnImpl::checkFlags(), FLAG_MASK, isc::dhcp::Option4ClientFqdnImpl::flags_, and isc_throw.
void isc::dhcp::Option4ClientFqdn::setRcode | ( | const Rcode & | rcode | ) |
Set Rcode value.
rcode | An Rcode object representing value of RCODE1 and RCODE2. Both fields are assigned the same value. |
Definition at line 425 of file option4_client_fqdn.cc.
References isc::dhcp::Option4ClientFqdnImpl::rcode1_, and isc::dhcp::Option4ClientFqdnImpl::rcode2_.
|
virtual |
Returns string representation of the option.
The string returned by the method comprises the bit value of each option flag and the domain-name.
indent | number of spaces before printed text. |
Reimplemented from isc::dhcp::Option.
Definition at line 515 of file option4_client_fqdn.cc.
References FLAG_E, FLAG_N, FLAG_O, FLAG_S, getDomainName(), getDomainNameType(), getFlag(), PARTIAL, and isc::dhcp::Option::type_.
|
virtual |
Parses option from the received buffer.
Method creates an instance of the DHCPv4 Client FQDN Option from the wire format. Parameters specify the bounds of the buffer to read option data from. The size of the buffer limited by the specified parameters should be equal or larger than size of the option (including its header). Otherwise exception will be thrown.
first | lower bound of the buffer to parse option from. |
last | upper bound of the buffer to parse option from. |
Reimplemented from isc::dhcp::Option.
Definition at line 504 of file option4_client_fqdn.cc.
References isc::dhcp::Option4ClientFqdnImpl::checkFlags(), isc::dhcp::Option4ClientFqdnImpl::flags_, isc::dhcp::Option4ClientFqdnImpl::parseWireData(), and isc::dhcp::Option::setData().
|
static |
The size in bytes of the fixed fields within DHCPv4 Client Fqdn Option.
The fixed fields are:
Definition at line 160 of file option4_client_fqdn.h.
Referenced by len(), and isc::dhcp::Option4ClientFqdnImpl::parseWireData().
|
static |
Bit E.
Definition at line 118 of file option4_client_fqdn.h.
Referenced by getFlag(), len(), packDomainName(), isc::dhcp::Option4ClientFqdnImpl::parseWireData(), and toText().
|
static |
Mask which zeroes MBZ flag bits.
Definition at line 123 of file option4_client_fqdn.h.
Referenced by isc::dhcp::Option4ClientFqdnImpl::checkFlags(), and setFlag().
|
static |
Bit N.
Definition at line 119 of file option4_client_fqdn.h.
Referenced by isc::dhcp::Option4ClientFqdnImpl::checkFlags(), getFlag(), isc::dhcp::Dhcpv4Srv::processClientName(), and toText().
|
static |
|
static |
Bit S.
Definition at line 116 of file option4_client_fqdn.h.
Referenced by isc::dhcp::Option4ClientFqdnImpl::checkFlags(), getFlag(), isc::dhcp::Dhcpv4Srv::processClientName(), and toText().