]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[4058] Added copyDefaultOptions()
authorFrancis Dupont <fdupont@isc.org>
Tue, 13 Oct 2015 15:14:34 +0000 (17:14 +0200)
committerFrancis Dupont <fdupont@isc.org>
Tue, 13 Oct 2015 15:14:34 +0000 (17:14 +0200)
src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp4/dhcp4_srv.h

index beb61d61cc4abd914acf1ad320a04bd6ec538876..4674984d225c5b1112f494cadd489cf44b1775e9 100644 (file)
@@ -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_");
index 142ee44529975fbb1117212cdaab7443db981ead..1ee46538eca1ba5ff240acdc0ddb1ef0986e281c 100644 (file)
@@ -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.