diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index beb61d61cc..4674984d22 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -164,6 +164,7 @@ Dhcpv4Exchange::initResponse() { if (resp_type > 0) { resp_.reset(new Pkt4(resp_type, getQuery()->getTransid())); copyDefaultFields(); + copyDefaultOptionss(); } } @@ -208,12 +209,28 @@ Dhcpv4Exchange::copyDefaultFields() { if (dst_hw_addr) { resp_->setRemoteHWAddr(dst_hw_addr); } +} +void +Dhcpv4Exchange::copyDefaultOptions() { // If this packet is relayed, we want to copy Relay Agent Info option OptionPtr rai = query_->getOption(DHO_DHCP_AGENT_OPTIONS); if (rai) { resp_->addOption(rai); } + + // RFC 3011 states about the Subnet Selection Option + + // "Servers configured to support this option MUST return an + // identical copy of the option to any client that sends it, + // regardless of whether or not the client requests the option in + // a parameter request list. Clients using this option MUST + // discard DHCPOFFER or DHCPACK packets that do not contain this + // option." + OptionPtr subnet_sel = query_->getOption(DHO_SUBNET_SELECTION); + if (subnet_sel) { + resp_->addOption(subnet_sel); + } } const std::string Dhcpv4Srv::VENDOR_CLASS_PREFIX("VENDOR_CLASS_"); diff --git a/src/bin/dhcp4/dhcp4_srv.h b/src/bin/dhcp4/dhcp4_srv.h index 142ee44529..1ee46538ec 100644 --- a/src/bin/dhcp4/dhcp4_srv.h +++ b/src/bin/dhcp4/dhcp4_srv.h @@ -130,6 +130,17 @@ private: /// not NULL. void copyDefaultFields(); + /// @brief Copies default options from client's to server's message + /// + /// Some options are copied from client's message into server's response, + /// e.g. Relay Agent Info option, Subnet Selection option etc. + /// + /// @warning This message is called internally by @c initResponse and + /// thus it doesn't check if the resp_ value has been initialized. The + /// calling method is responsible for making sure that @c resp_ is + /// not NULL. + void copyDefaultOptions(); + /// @brief Pointer to the allocation engine used by the server. AllocEnginePtr alloc_engine_; /// @brief Pointer to the DHCPv4 message sent by the client.