diff --git a/include/ircd/net/addrs.h b/include/ircd/net/addrs.h index a5066f43a..6913a43fe 100644 --- a/include/ircd/net/addrs.h +++ b/include/ircd/net/addrs.h @@ -24,6 +24,8 @@ namespace ircd::net::addrs bool for_each(const raw_closure &); bool for_each(const closure &); + + bool has_usable_ipv6_interface(); } struct ircd::net::addrs::addr diff --git a/ircd/net.cc b/ircd/net.cc index 94b50ecbd..133645f96 100644 --- a/ircd/net.cc +++ b/ircd/net.cc @@ -690,6 +690,28 @@ ircd::net::open(socket &socket, // net/addrs.h // +bool +ircd::net::addrs::has_usable_ipv6_interface() +{ + return !for_each([](const addr &a) + { + if(a.family != AF_INET6) + return true; + + if(a.scope_id != 0) // global scope + return true; + + if(~a.flags & IFF_UP) // not up + return true; + + if(a.flags & IFF_LOOPBACK) // not usable + return true; + + // return false to break + return false; + }); +} + bool ircd::net::addrs::for_each(const closure &closure) {