Browse Source

[3539] Interface Manager do selects addresses to bind sockets to.

Marcin Siodelski 10 years ago
parent
commit
46471f4d43
3 changed files with 23 additions and 5 deletions
  1. 3 3
      src/lib/dhcp/iface_mgr.cc
  2. 9 1
      src/lib/dhcp/iface_mgr.h
  3. 11 1
      src/lib/dhcpsrv/cfg_iface.cc

+ 3 - 3
src/lib/dhcp/iface_mgr.cc

@@ -257,7 +257,7 @@ Iface::hasAddress(const isc::asiolink::IOAddress& address) const {
 
 void
 Iface::addAddress(const isc::asiolink::IOAddress& addr) {
-    addrs_.push_back(OptionalValue<IOAddress>(addr, OptionalValueState(false)));
+    addrs_.push_back(OptionalValue<IOAddress>(addr, OptionalValueState(true)));
 }
 
 void
@@ -514,8 +514,8 @@ IfaceMgr::openSockets4(const uint16_t port, const bool use_bcast,
              addr != addrs.end();
              ++addr) {
 
-            // Skip all but V4 addresses.
-            if (!addr->get().isV4()) {
+            // Skip non-IPv4 addresses and thos that weren't selected..
+            if (!addr->get().isV4() || !addr->isSpecified()) {
                 continue;
             }
 

+ 9 - 1
src/lib/dhcp/iface_mgr.h

@@ -258,7 +258,15 @@ public:
     /// @return hardware type
     uint16_t getHWType() const { return hardware_type_; }
 
-    /// @brief Returns all interfaces available on an interface.
+    /// @brief Returns all addresses available on an interface.
+    ///
+    /// The returned addresses are encapsulated in the @c util::OptionalValue
+    /// class to be able to selectively flag some of the addresses as active
+    /// (when optional value is specified) or inactive (when optional value
+    /// is specified). If the address is marked as active, the
+    /// @c IfaceMgr::openSockets4 method will open socket and bind to this
+    /// address. Otherwise, it will not bind any socket to this address.
+    /// This is useful when an interface has multiple IPv4 addresses assigned.
     ///
     /// Care should be taken to not use this collection after Iface object
     /// ceases to exist. That is easy in most cases as Iface objects are

+ 11 - 1
src/lib/dhcpsrv/cfg_iface.cc

@@ -70,9 +70,19 @@ CfgIface::openSockets(const uint16_t family, const uint16_t port,
 
             } else if (family == AF_INET) {
                 iface->inactive4_ = false;
-                ExplicitAddressMap::const_iterator addr = address_map_.find(iface->getName());
+                ExplicitAddressMap::const_iterator addr =
+                    address_map_.find(iface->getName());
+                // If user has specified an address to listen on, let's activate
+                // only this address.
                 if (addr != address_map_.end()) {
                     iface->setActive(addr->second, true);
+
+                // Otherwise, activate first one.
+                } else {
+                    IOAddress address("0.0.0.0");
+                    if (iface->getAddress4(address)) {
+                        iface->setActive(address, true);
+                    }
                 }
 
             } else {