From: Marcin Siodelski Date: Wed, 17 Dec 2014 18:08:32 +0000 (+0100) Subject: [3539] Interface Manager do selects addresses to bind sockets to. X-Git-Tag: trac3504_base~23^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=46471f4d43a47b44691112b59d29c668102e732d;p=thirdparty%2Fkea.git [3539] Interface Manager do selects addresses to bind sockets to. --- diff --git a/src/lib/dhcp/iface_mgr.cc b/src/lib/dhcp/iface_mgr.cc index 421d7523e5..0e27a82681 100644 --- a/src/lib/dhcp/iface_mgr.cc +++ b/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(addr, OptionalValueState(false))); + addrs_.push_back(OptionalValue(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; } diff --git a/src/lib/dhcp/iface_mgr.h b/src/lib/dhcp/iface_mgr.h index 15a6b83e4f..a5dde8d9d7 100644 --- a/src/lib/dhcp/iface_mgr.h +++ b/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 diff --git a/src/lib/dhcpsrv/cfg_iface.cc b/src/lib/dhcpsrv/cfg_iface.cc index ebb771da83..4c28d2ca30 100644 --- a/src/lib/dhcpsrv/cfg_iface.cc +++ b/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 {