Browse Source

[2902] Do not use the broadcast address as source in server's response.

Marcin Siodelski 12 years ago
parent
commit
1ca6a3ac00
2 changed files with 20 additions and 1 deletions
  1. 14 0
      src/lib/dhcp/pkt_filter_lpf.cc
  2. 6 1
      src/lib/dhcp/tests/pkt_filter_lpf_unittest.cc

+ 14 - 0
src/lib/dhcp/pkt_filter_lpf.cc

@@ -110,6 +110,20 @@ PktFilterLPF::send(const Iface& iface, uint16_t sockfd, const Pkt4Ptr& pkt) {
     }
     writeEthernetHeader(iface.getMac(), &dest_addr[0], buf);
 
+    // It is likely that the local address in pkt object is set to
+    // broadcast address. This is the case if server received the
+    // client's packet on broadcast address. Therefore, we need to
+    // correct it here and assign the actual source address.
+    if (pkt->getLocalAddr().toText() == "255.255.255.255") {
+        const Iface::SocketCollection& sockets = iface.getSockets();
+        for (Iface::SocketCollection::const_iterator it = sockets.begin();
+             it != sockets.end(); ++it) {
+            if (sockfd == it->sockfd_) {
+                pkt->setLocalAddr(it->addr_);
+            }
+        }
+    }
+
     // IP and UDP header
     writeIpUdpHeader(pkt, buf);
 

+ 6 - 1
src/lib/dhcp/tests/pkt_filter_lpf_unittest.cc

@@ -139,7 +139,12 @@ TEST_F(PktFilterLPFTest, DISABLED_send) {
     ASSERT_TRUE(pkt);
 
     // Set required fields.
-    pkt->setLocalAddr(IOAddress("127.0.0.1"));
+    // By setting the local address to broadcast we simulate the
+    // typical scenario when client's request was send to broadcast
+    // address and server by default used it as a source address
+    // in its response. The send() function should be able to detect
+    // it and correct the source address.
+    pkt->setLocalAddr(IOAddress("255.255.255.255"));
     pkt->setRemotePort(PORT);
     pkt->setLocalPort(PORT + 1);
     pkt->setIndex(ifindex_);