From 07282ec39f5457b4fc8eb338f1c8bcec5692a627 Mon Sep 17 00:00:00 2001 From: orignal Date: Sun, 24 Jan 2021 19:42:44 -0500 Subject: [PATCH] get local yggdrasil ipv6 address --- libi2pd/util.cpp | 30 ++++++++++++++++++++++++++++++ libi2pd/util.h | 1 + 2 files changed, 31 insertions(+) diff --git a/libi2pd/util.cpp b/libi2pd/util.cpp index 794a3f14..bb3f60d1 100644 --- a/libi2pd/util.cpp +++ b/libi2pd/util.cpp @@ -416,6 +416,36 @@ namespace net #endif } + boost::asio::ip::address_v6 GetYggdrasilAddress () + { +#ifdef _WIN32 + // TODO: implement + return boost::asio::ip::address_v6 (); +#else + ifaddrs * addrs = nullptr; + auto err = getifaddrs(&addrs); + if (!err) + { + ifaddrs * cur = addrs; + while(cur) + { + if (cur->ifa_addr && cur->ifa_addr->sa_family == AF_INET6) + { + sockaddr_in6* sa = (sockaddr_in6*)cur->ifa_addr; + if (sa->sin6_addr.s6_addr[0] == 0x02 || sa->sin6_addr.s6_addr[0] == 0x03) + { + boost::asio::ip::address_v6::bytes_type bytes; + memcpy (bytes.data (), &sa->sin6_addr, 16); + return boost::asio::ip::address_v6 (bytes); + } + } + cur = cur->ifa_next; + } + } + return boost::asio::ip::address_v6 (); +#endif + } + bool IsInReservedRange (const boost::asio::ip::address& host) { // https://en.wikipedia.org/wiki/Reserved_IP_addresses if(host.is_v4()) diff --git a/libi2pd/util.h b/libi2pd/util.h index e6de09ed..7a45dc9b 100644 --- a/libi2pd/util.h +++ b/libi2pd/util.h @@ -188,6 +188,7 @@ namespace util { int GetMTU (const boost::asio::ip::address& localAddress); const boost::asio::ip::address GetInterfaceAddress (const std::string & ifname, bool ipv6=false); + boost::asio::ip::address_v6 GetYggdrasilAddress (); bool IsInReservedRange (const boost::asio::ip::address& host); } }