From c0cbfd2d23384f97a0f146090544c5c8bad516ed Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Mon, 25 Mar 2019 15:12:34 -0700 Subject: [PATCH] ircd::net: Add util to detect usable ipv6 interface. --- include/ircd/net/addrs.h | 2 ++ ircd/net.cc | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) 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) {