26const IOAddress DEFAULT_ADDRESS(
"0.0.0.0");
33 :
Pkt(transid, DEFAULT_ADDRESS, DEFAULT_ADDRESS, DHCP4_SERVER_PORT, DHCP4_CLIENT_PORT),
34 op_(DHCPTypeToBootpType(msg_type)), hwaddr_(new
HWAddr()), hops_(0), secs_(0), flags_(0),
35 ciaddr_(DEFAULT_ADDRESS), yiaddr_(DEFAULT_ADDRESS), siaddr_(DEFAULT_ADDRESS),
36 giaddr_(DEFAULT_ADDRESS) {
44 :
Pkt(data, len, DEFAULT_ADDRESS, DEFAULT_ADDRESS, DHCP4_SERVER_PORT, DHCP4_CLIENT_PORT),
46 ciaddr_(DEFAULT_ADDRESS), yiaddr_(DEFAULT_ADDRESS), siaddr_(DEFAULT_ADDRESS),
47 giaddr_(DEFAULT_ADDRESS) {
64 length += it.second->len();
82 size_t hw_len =
hwaddr_->hwaddr_.size();
111 vector<uint8_t> zeros(hw_len, 0);
154 << buffer_in.
getLength() <<
" received, at least "
175 hw_addr.resize(hlen);
192 if (magic != DHCP_OPTIONS_COOKIE) {
197 vector<uint8_t> opts_buffer;
242 boost::shared_ptr<OptionInt<uint8_t> > type_opt =
243 boost::dynamic_pointer_cast<OptionInt<uint8_t> >(
generic);
245 return (type_opt->getValue());
249 return (generic->getUint8());
267 boost::shared_ptr<OptionInt<uint8_t> > type_opt =
268 boost::dynamic_pointer_cast<OptionInt<uint8_t> >(opt);
270 type_opt->setValue(dhcp_type);
272 opt->setUint8(dhcp_type);
284 static const char* DHCPDISCOVER_NAME =
"DHCPDISCOVER";
285 static const char* DHCPOFFER_NAME =
"DHCPOFFER";
286 static const char* DHCPREQUEST_NAME =
"DHCPREQUEST";
287 static const char* DHCPDECLINE_NAME =
"DHCPDECLINE";
288 static const char* DHCPACK_NAME =
"DHCPACK";
289 static const char* DHCPNAK_NAME =
"DHCPNAK";
290 static const char* DHCPRELEASE_NAME =
"DHCPRELEASE";
291 static const char* DHCPINFORM_NAME =
"DHCPINFORM";
292 static const char* DHCPLEASEQUERY_NAME =
"DHCPLEASEQUERY";
293 static const char* DHCPLEASEUNASSIGNED_NAME =
"DHCPLEASEUNASSIGNED";
294 static const char* DHCPLEASEUNKNOWN_NAME =
"DHCPLEASEUNKNOWN";
295 static const char* DHCPLEASEACTIVE_NAME =
"DHCPLEASEACTIVE";
296 static const char* DHCPBULKLEASEQUERY_NAME =
"DHCPBULKLEASEQUERY";
297 static const char* DHCPLEASEQUERYDONE_NAME =
"DHCPLEASEQUERYDONE";
298 static const char* DHCPLEASEQUERYSTATUS_NAME =
"DHCPLEASEQUERYSTATUS";
299 static const char* DHCPTLS_NAME =
"DHCPTLS";
300 static const char* UNKNOWN_NAME =
"UNKNOWN";
304 return (DHCPDISCOVER_NAME);
307 return (DHCPOFFER_NAME);
310 return (DHCPREQUEST_NAME);
313 return (DHCPDECLINE_NAME);
316 return (DHCPACK_NAME);
319 return (DHCPNAK_NAME);
322 return (DHCPRELEASE_NAME);
325 return (DHCPINFORM_NAME);
328 return (DHCPLEASEQUERY_NAME);
331 return (DHCPLEASEUNASSIGNED_NAME);
334 return (DHCPLEASEUNKNOWN_NAME);
337 return (DHCPLEASEACTIVE_NAME);
340 return (DHCPBULKLEASEQUERY_NAME);
343 return (DHCPLEASEQUERYDONE_NAME);
346 return (DHCPLEASEQUERYSTATUS_NAME);
349 return (DHCPTLS_NAME);
354 return (UNKNOWN_NAME);
378 suffix =
" (malformed client-id)";
382 std::ostringstream label;
389 label <<
" (malformed hw address)";
393 return (label.str());
398 const uint32_t transid) {
404 label <<
", tid=0x" << hex << transid << dec;
412 label <<
"[" << (hwaddr ? hwaddr->toText() :
"no hwaddr info")
413 <<
"], cid=[" << (client_id ? client_id->toText() :
"no info")
429 output <<
getName(msg_type) <<
" (" <<
static_cast<int>(msg_type) <<
")";
432 output <<
"(missing)";
435 output <<
", transid=0x" << hex <<
transid_ << dec;
438 output <<
"," << std::endl <<
"options:";
441 output << std::endl << opt.second->toText(2);
443 output <<
"(unknown)" << std::endl;
448 output <<
", message contains no options";
451 return (output.str());
456 const std::vector<uint8_t>& mac_addr) {
457 setHWAddrMember(htype, hlen, mac_addr,
hwaddr_);
470Pkt4::setHWAddrMember(
const uint8_t htype,
const uint8_t hlen,
471 const std::vector<uint8_t>& mac_addr,
479 }
else if (mac_addr.empty() && (hlen > 0) ) {
486 hw_addr.reset(
new HWAddr(mac_addr, htype));
491 const std::vector<uint8_t>& mac_addr) {
510 }
else if (sname == NULL) {
526 <<
") too long, Max " <<
MAX_FILE_LEN <<
" supported.");
528 }
else if (file == NULL) {
564 <<
static_cast<int>(dhcpType) );
590 <<
" already present in this message.");
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
A generic exception that is thrown if a function is called in a prohibited way.
A generic exception that is thrown if a parameter given to a method or function is considered invalid...
A generic exception that is thrown if a parameter given to a method would refer to or modify out-of-r...
A generic exception that is thrown when an unexpected error condition occurs.
The IOAddress class represents an IP addresses (version agnostic)
bool isV4Zero() const
Convenience function to check if it is an IPv4 zero address.
uint32_t toUint32() const
Converts IPv4 address to uint32_t.
bool isV4Bcast() const
Convenience function to check if it is an IPv4 broadcast address.
Holds Client identifier or client IPv4 address.
static size_t unpackOptions4(const OptionBuffer &buf, const std::string &option_space, isc::dhcp::OptionCollection &options, std::list< uint16_t > &deferred, bool flexible_pad_end=false)
Parses provided buffer as DHCPv4 options and creates Option objects.
static void packOptions4(isc::util::OutputBuffer &buf, const isc::dhcp::OptionCollection &options, bool top=false, bool check=true)
Stores DHCPv4 options in a buffer.
static bool splitOptions4(isc::dhcp::OptionCollection &options, ScopedOptionsCopyContainer &scopedOptions, uint32_t used=0)
Split long options in multiple options with the same option code (RFC3396).
static bool fuseOptions4(isc::dhcp::OptionCollection &options)
Fuse multiple options with the same option code in long options (RFC3396).
Forward declaration to OptionInt.
virtual void addOption(const OptionPtr &opt)
Add an option.
std::string toText() const
Returns text representation of the packet.
virtual void unpack()
Parses on-wire form of DHCPv4 packet.
std::list< uint16_t > deferred_options_
HWAddrPtr hwaddr_
link-layer address and hardware information represents 3 fields: htype (hardware type,...
const char * getName() const
Returns name of the DHCP message.
HWAddrPtr local_hwaddr_
local HW address (dst if receiving packet, src if sending packet)
static const size_t MAX_CHADDR_LEN
length of the CHADDR field in DHCPv4 message
void setLocalHWAddr(const uint8_t htype, const uint8_t hlen, const std::vector< uint8_t > &mac_addr)
Sets local HW address.
uint8_t DHCPTypeToBootpType(uint8_t dhcpType)
converts DHCP message type to BOOTP op type
std::string getLabel() const
Returns text representation of the primary packet identifiers.
virtual void pack()
Prepares on-wire format of DHCPv4 packet.
isc::asiolink::IOAddress giaddr_
giaddr field (32 bits): Gateway IP address
uint8_t file_[MAX_FILE_LEN]
file field (128 bytes)
uint8_t op_
message operation code
uint8_t hops_
Number of relay agents traversed.
void setSname(const uint8_t *sname, size_t sname_len)
Sets sname field.
Pkt4(uint8_t msg_type, uint32_t transid)
Constructor, used in replying to a message.
uint8_t getHlen() const
Returns hlen field.
static const size_t DHCPV4_PKT_HDR_LEN
specifies DHCPv4 packet header length (fixed part)
bool isRelayed() const
Checks if a DHCPv4 message has been relayed.
void setFile(const uint8_t *file, size_t file_len)
Sets file field.
static const size_t MAX_SNAME_LEN
length of the SNAME field in DHCPv4 message
static std::string makeLabel(const HWAddrPtr &hwaddr, const ClientIdPtr &client_id, const uint32_t transid)
Returns text representation of the given packet identifiers.
uint8_t getType() const
Returns DHCP message type (e.g.
void setType(uint8_t type)
Sets DHCP message type (e.g.
isc::asiolink::IOAddress siaddr_
siaddr field (32 bits): next server IP address in boot process(e.g.TFTP)
size_t len()
Returns the size of the required buffer to build the packet.
uint16_t secs_
elapsed (number of seconds since beginning of transmission)
isc::asiolink::IOAddress ciaddr_
ciaddr field (32 bits): Client's IP address
isc::asiolink::IOAddress yiaddr_
yiaddr field (32 bits): Client's IP address ("your"), set by server
uint8_t sname_[MAX_SNAME_LEN]
sname field (64 bytes)
void setHWAddr(uint8_t htype, uint8_t hlen, const std::vector< uint8_t > &mac_addr)
Sets hardware address.
uint8_t getHtype() const
Returns htype field.
static const size_t MAX_FILE_LEN
length of the FILE field in DHCPv4 message
Base class for classes representing DHCP messages.
isc::asiolink::IOAddress remote_addr_
Remote IP address.
uint16_t local_port_
local TDP or UDP port
uint32_t transid_
Transaction-id (32 bits for v4, 24 bits for v6)
isc::asiolink::IOAddress local_addr_
Local IP (v4 or v6) address.
OptionBuffer data_
Unparsed data (in received packets).
uint16_t remote_port_
remote TCP or UDP port
isc::dhcp::OptionCollection options_
Collection of options present in this message.
isc::util::OutputBuffer buffer_out_
Output buffer (used during message transmission)
OptionPtr getNonCopiedOption(const uint16_t type) const
Returns the first option of specified type without copying.
virtual void addOption(const OptionPtr &opt)
Adds an option to this packet.
RAII object enabling duplication of the stored options and restoring the original options on destruct...
void writeUint8(uint8_t data)
Write an unsigned 8-bit integer into the buffer.
void writeUint16(uint16_t data)
Write an unsigned 16-bit integer in host byte order into the buffer in network byte order.
void writeData(const void *data, size_t len)
Copy an arbitrary length of data into the buffer.
void writeUint32(uint32_t data)
Write an unsigned 32-bit integer in host byte order into the buffer in network byte order.
void clear()
Clear buffer content.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
@ DHO_DHCP_CLIENT_IDENTIFIER
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
boost::shared_ptr< ClientId > ClientIdPtr
Shared pointer to a Client ID.
@ DHCP_NOTYPE
Message Type option missing.
@ HTYPE_UNDEFINED
not specified or undefined
boost::shared_ptr< Option > OptionPtr
Defines the logger used by the top-level component of kea-lfc.
#define DHCP4_OPTION_SPACE
global std option spaces
Hardware type that represents information from DHCPv4 packet.
ScopedOptionsCopyContainer scoped_options_
The container.