void IPNDAgent::join(const ibrcommon::vinterface &iface, const ibrcommon::vaddress &addr) throw () { IBRCOMMON_LOGGER_DEBUG_TAG(TAG, 10) << "Join on " << iface.toString() << " (" << addr.toString() << ", family: " << addr.family() << ")" << IBRCOMMON_LOGGER_ENDL; // only join IPv6 and IPv4 addresses if ((addr.family() != AF_INET) && (addr.family() != AF_INET6)) return; // do not join on loopback interfaces if (addr.isLocal()) return; // create a multicast socket and bind to given addr ibrcommon::multicastsocket *msock = new ibrcommon::multicastsocket(addr); // if we are in UP state if (_state) { try { // bring up msock->up(); // listen to multicast addresses for (std::set<ibrcommon::vaddress>::const_iterator it_addr = _destinations.begin(); it_addr != _destinations.end(); ++it_addr) { if (msock->get_family() != it_addr->family()) continue; try { msock->join(*it_addr, iface); } catch (const ibrcommon::socket_raw_error &e) { if (e.error() == EADDRINUSE) { // silent error } else if (e.error() == 92) { // silent error - protocol not available } else { IBRCOMMON_LOGGER_TAG(IPNDAgent::TAG, warning) << "Join to " << (*it_addr).toString() << " failed on " << iface.toString() << "; " << e.what() << IBRCOMMON_LOGGER_ENDL; } } catch (const ibrcommon::socket_exception &e) { IBRCOMMON_LOGGER_DEBUG_TAG(IPNDAgent::TAG, 10) << "Join to " << (*it_addr).toString() << " failed on " << iface.toString() << "; " << e.what() << IBRCOMMON_LOGGER_ENDL; } } } catch (const ibrcommon::socket_exception &ex) { IBRCOMMON_LOGGER_TAG(IPNDAgent::TAG, error) << "Join failed on " << iface.toString() << " (" << addr.toString() << ", family: " << addr.family() << ")" << "; " << ex.what() << IBRCOMMON_LOGGER_ENDL; delete msock; return; } } // add multicast socket to _socket _socket.add(msock, iface); }
void IPNDAgent::join(const ibrcommon::vinterface &iface, const ibrcommon::vaddress &addr) throw () { // only join IPv6 and IPv4 addresses if ((addr.family() != AF_INET) && (addr.family() != AF_INET6)) return; // do not join on loopback interfaces if (addr.isLocal()) return; // create a multicast socket and bind to given addr ibrcommon::multicastsocket *msock = new ibrcommon::multicastsocket(addr); try { // bring up msock->up(); // add multicast socket to _socket _socket.add(msock, iface); } catch (const ibrcommon::socket_exception &ex) { IBRCOMMON_LOGGER_TAG(IPNDAgent::TAG, error) << "Can not send on " << iface.toString() << " (" << addr.toString() << ", family: " << addr.family() << ")" << "; " << ex.what() << IBRCOMMON_LOGGER_ENDL; delete msock; } }