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
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;
}
/// @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
} 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 {