26const IOAddress DEFAULT_ADDRESS(
"0.0.0.0");
33 :
Pkt(transid, DEFAULT_ADDRESS, DEFAULT_ADDRESS, DHCP4_SERVER_PORT,
35 op_(DHCPTypeToBootpType(msg_type)),
40 ciaddr_(DEFAULT_ADDRESS),
41 yiaddr_(DEFAULT_ADDRESS),
42 siaddr_(DEFAULT_ADDRESS),
43 giaddr_(DEFAULT_ADDRESS)
52 :
Pkt(data, len, DEFAULT_ADDRESS, DEFAULT_ADDRESS, DHCP4_SERVER_PORT,
59 ciaddr_(DEFAULT_ADDRESS),
60 yiaddr_(DEFAULT_ADDRESS),
61 siaddr_(DEFAULT_ADDRESS),
62 giaddr_(DEFAULT_ADDRESS)
79 for (OptionCollection::const_iterator it =
options_.begin();
82 length += (*it).second->len();
99 size_t hw_len =
hwaddr_->hwaddr_.size();
128 vector<uint8_t> zeros(hw_len, 0);
159 << buffer_in.
getLength() <<
" received, at least "
180 hw_addr.resize(hlen);
197 if (magic != DHCP_OPTIONS_COOKIE) {
202 vector<uint8_t> opts_buffer;
239 boost::shared_ptr<OptionInt<uint8_t> > type_opt =
240 boost::dynamic_pointer_cast<OptionInt<uint8_t> >(
generic);
242 return (type_opt->getValue());
246 return (generic->getUint8());
264 boost::shared_ptr<OptionInt<uint8_t> > type_opt =
265 boost::dynamic_pointer_cast<OptionInt<uint8_t> >(opt);
267 type_opt->setValue(dhcp_type);
269 opt->setUint8(dhcp_type);
281 static const char* DHCPDISCOVER_NAME =
"DHCPDISCOVER";
282 static const char* DHCPOFFER_NAME =
"DHCPOFFER";
283 static const char* DHCPREQUEST_NAME =
"DHCPREQUEST";
284 static const char* DHCPDECLINE_NAME =
"DHCPDECLINE";
285 static const char* DHCPACK_NAME =
"DHCPACK";
286 static const char* DHCPNAK_NAME =
"DHCPNAK";
287 static const char* DHCPRELEASE_NAME =
"DHCPRELEASE";
288 static const char* DHCPINFORM_NAME =
"DHCPINFORM";
289 static const char* DHCPLEASEQUERY_NAME =
"DHCPLEASEQUERY";
290 static const char* DHCPLEASEUNASSIGNED_NAME =
"DHCPLEASEUNASSIGNED";
291 static const char* DHCPLEASEUNKNOWN_NAME =
"DHCPLEASEUNKNOWN";
292 static const char* DHCPLEASEACTIVE_NAME =
"DHCPLEASEACTIVE";
293 static const char* DHCPBULKLEASEQUERY_NAME =
"DHCPBULKLEASEQUERY";
294 static const char* DHCPLEASEQUERYDONE_NAME =
"DHCPLEASEQUERYDONE";
295 static const char* DHCPLEASEQUERYSTATUS_NAME =
"DHCPLEASEQUERYSTATUS";
296 static const char* DHCPTLS_NAME =
"DHCPTLS";
297 static const char* UNKNOWN_NAME =
"UNKNOWN";
301 return (DHCPDISCOVER_NAME);
304 return (DHCPOFFER_NAME);
307 return (DHCPREQUEST_NAME);
310 return (DHCPDECLINE_NAME);
313 return (DHCPACK_NAME);
316 return (DHCPNAK_NAME);
319 return (DHCPRELEASE_NAME);
322 return (DHCPINFORM_NAME);
325 return (DHCPLEASEQUERY_NAME);
328 return (DHCPLEASEUNASSIGNED_NAME);
331 return (DHCPLEASEUNKNOWN_NAME);
334 return (DHCPLEASEACTIVE_NAME);
337 return (DHCPBULKLEASEQUERY_NAME);
340 return (DHCPLEASEQUERYDONE_NAME);
343 return (DHCPLEASEQUERYSTATUS_NAME);
346 return (DHCPTLS_NAME);
351 return (UNKNOWN_NAME);
375 suffix =
" (malformed client-id)";
379 std::ostringstream label;
386 label <<
" (malformed hw address)";
390 return (label.str());
395 const uint32_t transid) {
401 label <<
", tid=0x" << hex << transid << dec;
409 label <<
"[" << (hwaddr ? hwaddr->toText() :
"no hwaddr info")
410 <<
"], cid=[" << (client_id ? client_id->toText() :
"no info")
426 output <<
getName(msg_type) <<
" (" <<
static_cast<int>(msg_type) <<
")";
429 output <<
"(missing)";
432 output <<
", transid=0x" << hex <<
transid_ << dec;
435 output <<
"," << std::endl <<
"options:";
436 for (isc::dhcp::OptionCollection::const_iterator opt =
options_.begin();
439 output << std::endl << opt->second->toText(2);
441 output <<
"(unknown)" << std::endl;
446 output <<
", message contains no options";
449 return (output.str());
454 const std::vector<uint8_t>& mac_addr) {
455 setHWAddrMember(htype, hlen, mac_addr,
hwaddr_);
468Pkt4::setHWAddrMember(
const uint8_t htype,
const uint8_t hlen,
469 const std::vector<uint8_t>& mac_addr,
477 }
else if (mac_addr.empty() && (hlen > 0) ) {
484 hw_addr.reset(
new HWAddr(mac_addr, htype));
489 const std::vector<uint8_t>& mac_addr) {
508 }
else if (sname == NULL) {
524 <<
") too long, Max " <<
MAX_FILE_LEN <<
" supported.");
526 }
else if (file == NULL) {
562 <<
static_cast<int>(dhcpType) );
588 <<
" 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)
Stores DHCPv4 options in a buffer.
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.
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.