if (resp_type > 0) {
resp_.reset(new Pkt4(resp_type, getQuery()->getTransid()));
copyDefaultFields();
+ copyDefaultOptionss();
}
}
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_");
/// 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.