BIND 10 trac2902, updated. 882b1c68c77a1e3e8261fd7a8ff9d654313963b2 [2902] Use default HW address if not specified.

BIND 10 source code commits bind10-changes at lists.isc.org
Tue Apr 30 10:07:32 UTC 2013


The branch, trac2902 has been updated
       via  882b1c68c77a1e3e8261fd7a8ff9d654313963b2 (commit)
      from  4cef89808213a50c9da3aa469d6253ff939f254b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 882b1c68c77a1e3e8261fd7a8ff9d654313963b2
Author: Marcin Siodelski <marcin at isc.org>
Date:   Tue Apr 30 12:07:23 2013 +0200

    [2902] Use default HW address if not specified.

-----------------------------------------------------------------------

Summary of changes:
 src/lib/dhcp/protocol_util.cc                |   58 ++++++++++++++++----------
 src/lib/dhcp/tests/protocol_util_unittest.cc |    8 +---
 2 files changed, 36 insertions(+), 30 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/lib/dhcp/protocol_util.cc b/src/lib/dhcp/protocol_util.cc
index 3bd778c..3c32bcd 100644
--- a/src/lib/dhcp/protocol_util.cc
+++ b/src/lib/dhcp/protocol_util.cc
@@ -112,33 +112,45 @@ decodeIpUdpHeader(InputBuffer& buf, Pkt4Ptr& pkt) {
 
 void
 writeEthernetHeader(const Pkt4Ptr& pkt, OutputBuffer& out_buf) {
+    // Set destination HW address.
     HWAddrPtr remote_addr = pkt->getRemoteHWAddr();
-    HWAddrPtr local_addr = pkt->getLocalHWAddr();
-    if (!remote_addr) {
-        isc_throw(BadValue, "remote HW address must be set to construct"
-                  " an ethernet frame header");
-
-    } else if (!local_addr) {
-        isc_throw(BadValue, "local HW address must be set to construct"
-                  " an ethernet frame header");
-
-    } else if (remote_addr->hwaddr_.size() != HWAddr::ETHERNET_HWADDR_LEN) {
-        isc_throw(BadValue, "invalid size of the remote HW address "
-                  << remote_addr->hwaddr_.size() << " when constructing"
-                  << " an ethernet frame header; expected size is"
-                  << " " << HWAddr::ETHERNET_HWADDR_LEN);
-
-    } else if (local_addr->hwaddr_.size() != HWAddr::ETHERNET_HWADDR_LEN) {
-        isc_throw(BadValue, "invalid size of the local HW address "
-                  << local_addr->hwaddr_.size() << " when constructing"
-                  << " an ethernet frame header; expected size is"
-                  << " " << HWAddr::ETHERNET_HWADDR_LEN);
+    if (remote_addr) {
+        if (remote_addr->hwaddr_.size() == HWAddr::ETHERNET_HWADDR_LEN) {
+            out_buf.writeData(&remote_addr->hwaddr_[0],
+                              HWAddr::ETHERNET_HWADDR_LEN);
+        } else {
+            isc_throw(BadValue, "invalid size of the remote HW address "
+                      << remote_addr->hwaddr_.size() << " when constructing"
+                      << " an ethernet frame header; expected size is"
+                      << " " << HWAddr::ETHERNET_HWADDR_LEN);
+        }
+    } else {
+        // HW address has not been specified. This is possible when receiving
+        // packet through a logical interface (e.g. lo). In such cases, we
+        // don't want to fail but rather provide a default HW address, which
+        // consists of zeros.
+        out_buf.writeData(&std::vector<uint8_t>(HWAddr::ETHERNET_HWADDR_LEN)[0],
+                          HWAddr::ETHERNET_HWADDR_LEN);
+    }
 
+    // Set source HW address.
+    HWAddrPtr local_addr = pkt->getLocalHWAddr();
+    if (local_addr) {
+        if (local_addr->hwaddr_.size() == HWAddr::ETHERNET_HWADDR_LEN) {
+            out_buf.writeData(&local_addr->hwaddr_[0],
+                              HWAddr::ETHERNET_HWADDR_LEN);
+        } else {
+            isc_throw(BadValue, "invalid size of the local HW address "
+                      << local_addr->hwaddr_.size() << " when constructing"
+                      << " an ethernet frame header; expected size is"
+                      << " " << HWAddr::ETHERNET_HWADDR_LEN);
+        }
+    } else {
+        // Provide default HW address.
+        out_buf.writeData(&std::vector<uint8_t>(HWAddr::ETHERNET_HWADDR_LEN)[0],
+                          HWAddr::ETHERNET_HWADDR_LEN);
     }
 
-    // Write destination and source address.
-    out_buf.writeData(&remote_addr->hwaddr_[0], HWAddr::ETHERNET_HWADDR_LEN);
-    out_buf.writeData(&local_addr->hwaddr_[0], HWAddr::ETHERNET_HWADDR_LEN);
     // Type IP.
     out_buf.writeUint16(0x0800);
 }
diff --git a/src/lib/dhcp/tests/protocol_util_unittest.cc b/src/lib/dhcp/tests/protocol_util_unittest.cc
index 6d58d36..bb72be7 100644
--- a/src/lib/dhcp/tests/protocol_util_unittest.cc
+++ b/src/lib/dhcp/tests/protocol_util_unittest.cc
@@ -215,19 +215,13 @@ TEST(ProtocolUtilTest, writeEthernetHeader) {
     OutputBuffer buf(1);
     Pkt4Ptr pkt(new Pkt4(DHCPDISCOVER, 0));
 
-    // HW addresses not set yet. It should fail.
-    EXPECT_THROW(writeEthernetHeader(pkt, buf), BadValue);
-
     HWAddrPtr local_hw_addr(new HWAddr(src_hw_addr, 6, 1));
     ASSERT_NO_THROW(pkt->setLocalHWAddr(local_hw_addr));
 
-    // Remote address still not set. It should fail again.
-    EXPECT_THROW(writeEthernetHeader(pkt, buf), BadValue);
-
     // Set invalid length (7) of the hw address.
     HWAddrPtr remote_hw_addr(new HWAddr(&std::vector<uint8_t>(1, 7)[0], 7, 1));
     ASSERT_NO_THROW(pkt->setRemoteHWAddr(remote_hw_addr));
-    // HW address is too long, so it should fail again.
+    // HW address is too long, so it should fail.
     EXPECT_THROW(writeEthernetHeader(pkt, buf), BadValue);
 
     // Finally, set a valid HW address.



More information about the bind10-changes mailing list