]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[3539] Interface Manager do selects addresses to bind sockets to.
authorMarcin Siodelski <marcin@isc.org>
Wed, 17 Dec 2014 18:08:32 +0000 (19:08 +0100)
committerMarcin Siodelski <marcin@isc.org>
Wed, 17 Dec 2014 18:08:32 +0000 (19:08 +0100)
src/lib/dhcp/iface_mgr.cc
src/lib/dhcp/iface_mgr.h
src/lib/dhcpsrv/cfg_iface.cc

index 421d7523e52d2bab39621f9474bbe14c5d3b18b5..0e27a8268192a3e5c5c55d7f7db483e2f9a29a44 100644 (file)
@@ -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;
             }
 
index 15a6b83e4f7c91cb0f01ba7e6c79275f1dc2a308..a5dde8d9d7b8c9bda42b4c3ce03a31ab8b1f9e65 100644 (file)
@@ -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
index ebb771da83b3ddccb32701f1d3316fd2e4f4b803..4c28d2ca305a0b434b63bb4b8ec76184c2d71e52 100644 (file)
@@ -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 {