From 72ba32da5f6a946ca7f131a450663cb345dd51cc Mon Sep 17 00:00:00 2001 From: JINMEI Tatuya Date: Sat, 31 Oct 2015 13:29:05 +0900 Subject: [PATCH] [4027] incorporated part of c0044e3 from fd4o6 branch (not cherry-picking it because the commit has other irrelevant changes) --- src/lib/dhcp/pkt4o6.cc | 36 ++++++++++++++++++++++++------------ src/lib/dhcp/pkt4o6.h | 31 ++++++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src/lib/dhcp/pkt4o6.cc b/src/lib/dhcp/pkt4o6.cc index f328e82f7d..7fb087a6e3 100644 --- a/src/lib/dhcp/pkt4o6.cc +++ b/src/lib/dhcp/pkt4o6.cc @@ -13,20 +13,17 @@ // PERFORMANCE OF THIS SOFTWARE. #include -#include -#include -#include -#include + +#include +#include #include #include +#include -#include -#include -#include - -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(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(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 diff --git a/src/lib/dhcp/pkt4o6.h b/src/lib/dhcp/pkt4o6.h index 7e6f1877d2..f90ae4eb61 100644 --- a/src/lib/dhcp/pkt4o6.h +++ b/src/lib/dhcp/pkt4o6.h @@ -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 -- 2.47.2