From 7a3a060c18b4deaebd54acbd07b615df99c608f6 Mon Sep 17 00:00:00 2001 From: gnocuil Date: Wed, 15 Oct 2014 02:02:09 +0800 Subject: [PATCH] [3357] Add ORO into DHCP4o6 ancillary data --- src/lib/dhcp/pkt4o6.cc | 26 ++++++++++++++++++++++---- src/lib/dhcp/pkt4o6.h | 15 +++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/lib/dhcp/pkt4o6.cc b/src/lib/dhcp/pkt4o6.cc index 6257e5082b..42e58b3805 100644 --- a/src/lib/dhcp/pkt4o6.cc +++ b/src/lib/dhcp/pkt4o6.cc @@ -41,6 +41,12 @@ Pkt4o6Ptr Pkt4o6::fromPkt6(const Pkt6Ptr& pkt6) { pkt4o6->setPkt6LocalAddr(pkt6->getLocalAddr()); pkt4o6->setPkt6Index(pkt6->getIndex()); pkt4o6->setPkt6Iface(pkt6->getIface()); + + OptionPtr oro = pkt6->getOption(D6O_ORO); + if (oro) { + const OptionBuffer& d = oro->getData(); + pkt4o6->setORO(std::string((char*)d.data(), d.size())); + } } else { isc_throw(Pkt4o6ConstructError, "The DHCPv6 message doesn't contain a DHCPv4 Message Option"); @@ -56,7 +62,13 @@ Pkt6Ptr Pkt4o6::toPkt6() { pkt6->setIndex(getPkt6Index()); pkt6->setIface(getPkt6Iface()); -// appendRequestedOptions(query, reply);//TODO: should we remove this? + std::string oro = getORO(); + + OptionPtr option_oro(new Option(Option::V6, D6O_ORO, + OptionBuffer((uint8_t*)oro.c_str(), + (uint8_t*)oro.c_str() + oro.size()))); + pkt6->addOption(option_oro); + OptionPtr option(new Option(Option::V6, OPTION_DHCPV4_MSG, @@ -79,12 +91,14 @@ void Pkt4o6::pack() { pt.put("RemoteAddr", getPkt6RemoteAddr().toText()); pt.put("LocalAddr", getPkt6LocalAddr().toText()); -// pt.put("RemotePort", pkt6_->getRemotePort()); -// pt.put("LocalPort", pkt6_->getLocalPort()); +// pt.put("RemotePort", getPkt6RemotePort()); +// pt.put("LocalPort", getPkt6LocalPort()); pt.put("Index", getPkt6Index()); pt.put("Iface", getPkt6Iface()); - pt.put("Flags", getFlags()); +// if (getORO().size() > 0) +// pt.put("ORO", getORO()); + std::stringstream sout; write_json(sout, pt); @@ -108,6 +122,10 @@ void Pkt4o6::unpack() { setPkt6Iface(pt.get("Iface")); setFlags(pt.get("Flags")); setIface(getPkt6Iface());//Use Pkt6's Iface to find a subnet + + try { + setORO(pt.get("ORO")); + } catch (const std::exception& ex) {} } catch (const std::exception& ex) { //TODO: logging } diff --git a/src/lib/dhcp/pkt4o6.h b/src/lib/dhcp/pkt4o6.h index 86e369ea88..6ef2b5b1ce 100644 --- a/src/lib/dhcp/pkt4o6.h +++ b/src/lib/dhcp/pkt4o6.h @@ -163,6 +163,18 @@ public: /// @return interface name void setPkt6Iface(const std::string& iface ) { pkt6_iface_ = iface; }; + /// @brief Returns a string of DHCPv6 ORO + /// + /// @return a string of DHCPv6 ORO + std::string& + getORO() { return (oro_data_); } + + /// @brief Set buffer of DHCPv6 ORO + /// + /// @param oro_data a string of DHCPv6 ORO data + void + setORO(const std::string& oro_data) { oro_data_ = oro_data; } + protected: /// @brief DHCP4o6 flags field, the same as transaction-id in DHCPv6 @@ -185,6 +197,9 @@ protected: /// @brief a json-format string containing ancillary data used by DHCP4o6 std::string buffer_ancillary_; + + /// @brief a string containing DHCPv6 ORO data + std::string oro_data_; };// pkt4o6 class } // isc::dhcp namespace -- 2.47.2