]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[3357] Add ORO into DHCP4o6 ancillary data 3/head
authorgnocuil <gnocuil@gmail.com>
Tue, 14 Oct 2014 18:02:09 +0000 (02:02 +0800)
committergnocuil <gnocuil@gmail.com>
Tue, 14 Oct 2014 18:02:09 +0000 (02:02 +0800)
src/lib/dhcp/pkt4o6.cc
src/lib/dhcp/pkt4o6.h

index 6257e5082b31810e1fbeaf90cb021fb4a6ea35b6..42e58b3805d4af5cad252a3ead7a10f9db228a47 100644 (file)
@@ -41,6 +41,12 @@ Pkt4o6Ptr Pkt4o6::fromPkt6(const Pkt6Ptr& pkt6) {
         pkt4o6->setPkt6LocalAddr(pkt6->getLocalAddr());\r
         pkt4o6->setPkt6Index(pkt6->getIndex());\r
         pkt4o6->setPkt6Iface(pkt6->getIface());\r
+\r
+        OptionPtr oro = pkt6->getOption(D6O_ORO);\r
+        if (oro) {\r
+            const OptionBuffer& d = oro->getData();\r
+            pkt4o6->setORO(std::string((char*)d.data(), d.size()));\r
+        }\r
     } else {\r
         isc_throw(Pkt4o6ConstructError,\r
                  "The DHCPv6 message doesn't contain a DHCPv4 Message Option");\r
@@ -56,7 +62,13 @@ Pkt6Ptr Pkt4o6::toPkt6() {
     pkt6->setIndex(getPkt6Index());\r
     pkt6->setIface(getPkt6Iface());\r
     \r
-//    appendRequestedOptions(query, reply);//TODO: should we remove this?\r
+    std::string oro = getORO();\r
+    \r
+    OptionPtr option_oro(new Option(Option::V6, D6O_ORO,\r
+                                    OptionBuffer((uint8_t*)oro.c_str(),\r
+                                        (uint8_t*)oro.c_str() + oro.size())));\r
+    pkt6->addOption(option_oro);\r
+    \r
         \r
     OptionPtr option(new Option(Option::V6,\r
                                 OPTION_DHCPV4_MSG,\r
@@ -79,12 +91,14 @@ void Pkt4o6::pack() {
 \r
     pt.put("RemoteAddr", getPkt6RemoteAddr().toText());\r
     pt.put("LocalAddr", getPkt6LocalAddr().toText());\r
-//    pt.put("RemotePort", pkt6_->getRemotePort());\r
-//    pt.put("LocalPort", pkt6_->getLocalPort());\r
+//    pt.put("RemotePort", getPkt6RemotePort());\r
+//    pt.put("LocalPort", getPkt6LocalPort());\r
     pt.put("Index", getPkt6Index());\r
     pt.put("Iface", getPkt6Iface());\r
-    \r
     pt.put("Flags", getFlags());\r
+//    if (getORO().size() > 0)\r
+//        pt.put("ORO", getORO());\r
+    \r
     std::stringstream sout;\r
     write_json(sout, pt);\r
 \r
@@ -108,6 +122,10 @@ void Pkt4o6::unpack() {
         setPkt6Iface(pt.get<std::string>("Iface"));\r
         setFlags(pt.get<uint32_t>("Flags"));\r
         setIface(getPkt6Iface());//Use Pkt6's Iface to find a subnet\r
+        \r
+        try {\r
+            setORO(pt.get<std::string>("ORO"));\r
+        } catch (const std::exception& ex) {}\r
     } catch (const std::exception& ex) {\r
         //TODO: logging\r
     }\r
index 86e369ea885fd678b5d0b74801be1c4d6cba4195..6ef2b5b1cec7c448c7bdb6c0b39d98d5ab335328 100644 (file)
@@ -163,6 +163,18 @@ public:
     /// @return interface name\r
     void setPkt6Iface(const std::string& iface ) { pkt6_iface_ = iface; };\r
    \r
+    /// @brief Returns a string of DHCPv6 ORO\r
+    ///\r
+    /// @return a string of DHCPv6 ORO\r
+    std::string&\r
+    getORO() { return (oro_data_); }\r
+    \r
+    /// @brief Set buffer of DHCPv6 ORO\r
+    ///\r
+    /// @param oro_data a string of DHCPv6 ORO data\r
+    void\r
+    setORO(const std::string& oro_data) { oro_data_ = oro_data; }\r
+        \r
 protected:\r
 \r
     /// @brief DHCP4o6 flags field, the same as transaction-id in DHCPv6\r
@@ -185,6 +197,9 @@ protected:
     \r
     /// @brief a json-format string containing ancillary data used by DHCP4o6\r
     std::string buffer_ancillary_;\r
+    \r
+    /// @brief a string containing DHCPv6 ORO data\r
+    std::string oro_data_;\r
 };// pkt4o6 class\r
 \r
 } // isc::dhcp namespace\r