]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[4027] incorporated part of c0044e3 from fd4o6 branch
authorJINMEI Tatuya <jinmei@wide.ad.jp>
Sat, 31 Oct 2015 04:29:05 +0000 (13:29 +0900)
committerJINMEI Tatuya <jinmei@wide.ad.jp>
Sat, 31 Oct 2015 04:29:05 +0000 (13:29 +0900)
(not cherry-picking it because the commit has other irrelevant changes)

src/lib/dhcp/pkt4o6.cc
src/lib/dhcp/pkt4o6.h

index f328e82f7da105966eea640e581334484accb0f9..7fb087a6e31bebb630e98cc7354e62cf1adaa26c 100644 (file)
 // PERFORMANCE OF THIS SOFTWARE.
 
 #include <config.h>
-#include <asiolink/io_address.h>
-#include <dhcp/dhcp4.h>
-#include <dhcp/libdhcp++.h>
-#include <dhcp/option_int.h>
+
+#include <dhcp/dhcp6.h>
+#include <dhcp/option.h>
 #include <dhcp/pkt4o6.h>
 #include <exceptions/exceptions.h>
+#include <util/buffer.h>
 
-#include <algorithm>
-#include <iostream>
-#include <sstream>
-
-using namespace std;
-using namespace isc::dhcp;
 using namespace isc::asiolink;
+using namespace isc::dhcp;
+using namespace isc::util;
+using namespace std;
 
 namespace {
 
@@ -37,14 +34,29 @@ const IOAddress DEFAULT_ADDRESS("0.0.0.0");
 namespace isc {
 namespace dhcp {
 
-Pkt4o6::Pkt4o6(const uint8_t* data, size_t len, const Pkt6Ptr& pkt6)
-    :Pkt4(data, len), pkt6_(pkt6)
+Pkt4o6::Pkt4o6(const OptionBuffer& pkt4, const Pkt6Ptr& pkt6)
+    :Pkt4(&pkt4[0], pkt4.size()), pkt6_(pkt6)
 {
+    static_cast<void>(pkt6->delOption(D6O_DHCPV4_MSG));
     setIface(pkt6->getIface());
     setIndex(pkt6->getIndex());
     setRemoteAddr(pkt6->getRemoteAddr());
 }
 
+Pkt4o6::Pkt4o6(const Pkt4Ptr& pkt4, const Pkt6Ptr& pkt6)
+    :Pkt4(*pkt4), pkt6_(pkt6) {
+}
+
+void Pkt4o6::pack() {
+    Pkt4::pack();
+    OutputBuffer& buf = getBuffer();
+    const uint8_t* ptr = static_cast<const uint8_t*>(buf.getData());
+    OptionBuffer msg(ptr, ptr + buf.getLength());
+    OptionPtr dhcp4_msg(new Option(Option::V6, D6O_DHCPV4_MSG, msg));
+    pkt6_->addOption(dhcp4_msg);
+    pkt6_->pack();
+}
+
 } // end of namespace isc::dhcp
 
 } // end of namespace isc
index 7e6f1877d2066f23b0791c5803c8790d6ef2b4ef..f90ae4eb61e3ed252c251a075b4922e941377f25 100644 (file)
@@ -34,13 +34,34 @@ public:
 
     /// @brief Constructor, used in message reception.
     ///
-    /// @param data pointer to received data
-    /// @param len size of buffer to be allocated for this packet
-    /// @param pkt6 encapsulating DHCPv6 message.
-    Pkt4o6(const uint8_t* data, size_t len, const Pkt6Ptr& pkt6);
+    /// @param pkt4 DHCPv4 message
+    /// @param pkt6 encapsulating unpacked DHCPv6 message
+    /// the DHCPv4 message option will be removed
+    Pkt4o6(const OptionBuffer& pkt4, const Pkt6Ptr& pkt6);
+
+    /// @brief Constructor, used in replying to a message
+    ///
+    /// @param pkt4 DHCPv4 message
+    /// @param pkt6 DHCPv6 message
+    Pkt4o6(const Pkt4Ptr& pkt4, const Pkt6Ptr& pkt6);
 
     /// @brief Returns encapsulating DHCPv6 message
-    const Pkt6Ptr& getPkt6() { return (pkt6_); }
+    const Pkt6Ptr& getPkt6() const { return (pkt6_); }
+
+    /// @brief Prepares on-wire format of DHCPv4-over-DHCPv6 packet.
+    ///
+    /// Calls pack() on both DHCPv4 and DHCPv6 parts
+    /// Inserts the DHCPv4-message option
+    /// @ref pkt4::pack and @ref pkt6::pack
+    virtual void pack();
+
+    /// @brief Checks if a DHCPv4 message has beeb transported over DHCPv6
+    ///
+    /// @return Boolean value which indicates whether the message is
+    /// transported over DHCPv6 (true) or native DHCPv4 (false)
+    virtual bool isDhcp4o6() const {
+        return (true);
+    }
 
 protected:
     /// Encapsulating DHCPv6 message