aboutsummaryrefslogtreecommitdiff
path: root/src/common/Asio
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-04-09 21:02:31 +0200
committerShauren <shauren.trinity@gmail.com>2025-04-09 21:02:31 +0200
commit71b681bbf0f5189cd87a6cea66ef51667223f54a (patch)
treef5da2eb9d76010efcf5abd875edd39c812b62bd7 /src/common/Asio
parent6c374c56b2bd06923ae738b19ca6a4257e29d863 (diff)
Core/Network: Move to separate project
Diffstat (limited to 'src/common/Asio')
-rw-r--r--src/common/Asio/AsioHacksFwd.h6
-rw-r--r--src/common/Asio/IpAddress.h36
-rw-r--r--src/common/Asio/IpNetwork.cpp284
-rw-r--r--src/common/Asio/IpNetwork.h39
-rw-r--r--src/common/Asio/Resolver.h69
5 files changed, 5 insertions, 429 deletions
diff --git a/src/common/Asio/AsioHacksFwd.h b/src/common/Asio/AsioHacksFwd.h
index a8f04b16d81..06f5e531c20 100644
--- a/src/common/Asio/AsioHacksFwd.h
+++ b/src/common/Asio/AsioHacksFwd.h
@@ -60,9 +60,13 @@ namespace Trinity
{
class DeadlineTimer;
class IoContext;
- class Resolver;
class Strand;
}
+
+ namespace Net
+ {
+ class Resolver;
+ }
}
#endif // AsioHacksFwd_h__
diff --git a/src/common/Asio/IpAddress.h b/src/common/Asio/IpAddress.h
deleted file mode 100644
index 7d85b0028ac..00000000000
--- a/src/common/Asio/IpAddress.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef IpAddress_h__
-#define IpAddress_h__
-
-#include "Define.h"
-#include <boost/asio/ip/address.hpp>
-
-namespace Trinity
-{
- namespace Net
- {
- using boost::asio::ip::make_address;
- using boost::asio::ip::make_address_v4;
- using boost::asio::ip::make_address_v6;
- using boost::asio::ip::v4_mapped_t::v4_mapped;
- inline uint32 address_to_uint(boost::asio::ip::address_v4 const& address) { return address.to_uint(); }
- }
-}
-
-#endif // IpAddress_h__
diff --git a/src/common/Asio/IpNetwork.cpp b/src/common/Asio/IpNetwork.cpp
deleted file mode 100644
index 85f176d21e4..00000000000
--- a/src/common/Asio/IpNetwork.cpp
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "IpNetwork.h"
-#include "IpAddress.h"
-#include <boost/asio/ip/network_v4.hpp>
-#include <boost/asio/ip/network_v6.hpp>
-#include <algorithm>
-
-namespace
-{
-std::vector<boost::asio::ip::network_v4> LocalV4Networks;
-std::vector<boost::asio::ip::network_v6> LocalV6Networks;
-}
-
-namespace Trinity::Net
-{
-bool IsInLocalNetwork(boost::asio::ip::address const& clientAddress)
-{
- if (clientAddress.is_v4())
- {
- return std::any_of(LocalV4Networks.begin(), LocalV4Networks.end(), [clientAddressV4 = clientAddress.to_v4()](boost::asio::ip::network_v4 const& network)
- {
- return IsInNetwork(network, clientAddressV4);
- });
- }
-
- if (clientAddress.is_v6())
- {
- return std::any_of(LocalV6Networks.begin(), LocalV6Networks.end(), [clientAddressV6 = clientAddress.to_v6()](boost::asio::ip::network_v6 const& network)
- {
- return IsInNetwork(network, clientAddressV6);
- });
- }
-
- return false;
-};
-
-bool IsInNetwork(boost::asio::ip::network_v4 const& network, boost::asio::ip::address_v4 const& clientAddress)
-{
- if (clientAddress == network.address())
- return true;
-
- boost::asio::ip::network_v4 endpointAsNetwork = boost::asio::ip::make_network_v4(clientAddress, 32);
- return endpointAsNetwork.is_subnet_of(network);
-}
-
-bool IsInNetwork(boost::asio::ip::network_v6 const& network, boost::asio::ip::address_v6 const& clientAddress)
-{
- if (clientAddress == network.address())
- return true;
-
- boost::asio::ip::network_v6 endpointAsNetwork = boost::asio::ip::make_network_v6(clientAddress, 128);
- return endpointAsNetwork.is_subnet_of(network);
-}
-
-Optional<std::size_t> SelectAddressForClient(boost::asio::ip::address const& clientAddress, std::span<boost::asio::ip::address const> const& addresses)
-{
- Optional<std::size_t> localIpv6Index;
- Optional<std::size_t> externalIpv6Index;
- Optional<std::size_t> loopbackIpv6Index;
- Optional<std::size_t> localIpv4Index;
- Optional<std::size_t> externalIpv4Index;
- Optional<std::size_t> loopbackIpv4Index;
-
- for (std::size_t i = 0; i < addresses.size(); ++i)
- {
- boost::asio::ip::address const& address = addresses[i];
-
- if (address.is_loopback())
- {
- if (address.is_v6() && !loopbackIpv6Index)
- loopbackIpv6Index = i;
-
- if (address.is_v4() && !loopbackIpv4Index)
- loopbackIpv4Index = i;
- }
- else if (IsInLocalNetwork(address))
- {
- if (address.is_v6() && !localIpv6Index)
- localIpv6Index = i;
-
- if (address.is_v4() && !localIpv4Index)
- localIpv4Index = i;
- }
- else
- {
- if (address.is_v6() && !externalIpv6Index)
- externalIpv6Index = i;
-
- if (address.is_v4() && !externalIpv4Index)
- externalIpv4Index = i;
- }
- }
-
- if (IsInLocalNetwork(clientAddress) || clientAddress.is_loopback())
- {
- // client is in the same network as this process, prefer local addresses
-
- // first, try finding a local ipv6 address
- if (clientAddress.is_v6() && localIpv6Index)
- {
- // we have a usable ipv6 local address
- return localIpv6Index;
- }
-
- // we dont have a local v6, return local v4
- if (localIpv4Index)
- return localIpv4Index;
- }
-
- if (clientAddress.is_loopback())
- {
- // fallback, search for a loopback address in configuration
- if (clientAddress.is_v6() && loopbackIpv6Index)
- return loopbackIpv6Index;
-
- if (loopbackIpv4Index)
- return loopbackIpv4Index;
- }
-
- // client is NOT in the same network as this process
- if (clientAddress.is_v6() && externalIpv6Index)
- return externalIpv6Index;
-
- return externalIpv4Index;
-}
-}
-
-#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS
-
-#include <boost/dll/shared_library.hpp>
-#include <iphlpapi.h>
-
-void Trinity::Net::ScanLocalNetworks()
-{
- LocalV4Networks.clear();
- LocalV6Networks.clear();
-
- boost::system::error_code dllError;
- boost::dll::shared_library iphlp("Iphlpapi.dll", dllError, boost::dll::load_mode::search_system_folders);
- if (dllError || !iphlp.is_loaded())
- return;
-
- auto getAdaptersAddresses = iphlp.get<decltype(GetAdaptersAddresses)>("GetAdaptersAddresses");
- if (!getAdaptersAddresses)
- return;
-
- ULONG queryFlags = GAA_FLAG_SKIP_UNICAST | GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_SKIP_FRIENDLY_NAME;
- ULONG bufferSize = 0;
-
- if (getAdaptersAddresses(AF_UNSPEC, queryFlags, nullptr, nullptr, &bufferSize) != ERROR_BUFFER_OVERFLOW)
- return;
-
- std::unique_ptr<std::byte[]> addressesBuffer = std::make_unique<std::byte[]>(bufferSize);
- if (getAdaptersAddresses(AF_UNSPEC, queryFlags, nullptr, reinterpret_cast<IP_ADAPTER_ADDRESSES*>(addressesBuffer.get()), &bufferSize) != ERROR_SUCCESS)
- return;
-
- for (IP_ADAPTER_ADDRESSES* itr = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(addressesBuffer.get()); itr; itr = itr->Next)
- {
- if (itr->IfType == IF_TYPE_SOFTWARE_LOOPBACK)
- continue;
-
- if (itr->OperStatus != IfOperStatusUp)
- continue;
-
- for (IP_ADAPTER_PREFIX_XP* prefix = itr->FirstPrefix; prefix; prefix = prefix->Next)
- {
- switch (prefix->Address.lpSockaddr->sa_family)
- {
- case AF_INET:
- {
- SOCKADDR_IN* ipv4raw = reinterpret_cast<SOCKADDR_IN*>(prefix->Address.lpSockaddr);
- boost::asio::ip::address_v4::bytes_type addressBytes;
- std::memcpy(addressBytes.data(), &ipv4raw->sin_addr.s_addr, addressBytes.size());
- boost::asio::ip::address_v4 address = make_address_v4(addressBytes);
- if (address.is_unspecified() || address.is_multicast() || address == boost::asio::ip::address_v4::broadcast())
- continue;
-
- LocalV4Networks.push_back(boost::asio::ip::make_network_v4(address, prefix->PrefixLength));
- break;
- }
- case AF_INET6:
- {
- SOCKADDR_IN6* ipv6raw = reinterpret_cast<SOCKADDR_IN6*>(prefix->Address.lpSockaddr);
- boost::asio::ip::address_v6::bytes_type addressBytes;
- std::memcpy(addressBytes.data(), ipv6raw->sin6_addr.s6_addr, addressBytes.size());
- boost::asio::ip::address_v6 address = make_address_v6(addressBytes, ipv6raw->sin6_scope_id);
- if (address.is_unspecified() || address.is_multicast())
- continue;
-
- LocalV6Networks.push_back(boost::asio::ip::make_network_v6(address, prefix->PrefixLength));
- break;
- }
- default:
- break;
- }
- }
- }
-}
-
-#else
-
-#include <numeric>
-#include <ifaddrs.h>
-
-void Trinity::Net::ScanLocalNetworks()
-{
- LocalV4Networks.clear();
- LocalV6Networks.clear();
-
- ifaddrs* addressesLinkedList = nullptr;
- if (getifaddrs(&addressesLinkedList) == -1)
- return;
-
- for (ifaddrs* itr = addressesLinkedList; itr; itr = itr->ifa_next)
- {
- if (!itr->ifa_addr)
- continue;
-
- switch (itr->ifa_addr->sa_family)
- {
- case AF_INET:
- {
- sockaddr_in* ipv4raw = reinterpret_cast<sockaddr_in*>(itr->ifa_addr);
- boost::asio::ip::address_v4::bytes_type addressBytes;
- std::memcpy(addressBytes.data(), &ipv4raw->sin_addr.s_addr, addressBytes.size());
- boost::asio::ip::address_v4 address = make_address_v4(addressBytes);
- if (address.is_unspecified() || address.is_loopback() || address.is_multicast() || address == boost::asio::ip::address_v4::broadcast())
- continue;
-
- if (sockaddr_in* netmask4raw = reinterpret_cast<sockaddr_in*>(itr->ifa_netmask))
- {
- boost::asio::ip::address_v4::bytes_type netmaskBytes;
- std::memcpy(netmaskBytes.data(), &netmask4raw->sin_addr.s_addr, netmaskBytes.size());
- boost::asio::ip::address_v4 netmask = make_address_v4(netmaskBytes);
- LocalV4Networks.push_back(boost::asio::ip::make_network_v4(address, netmask));
- }
- else
- LocalV4Networks.push_back(boost::asio::ip::make_network_v4(address, 32));
- break;
- }
- case AF_INET6:
- {
- sockaddr_in6* ipv6raw = reinterpret_cast<sockaddr_in6*>(itr->ifa_addr);
- boost::asio::ip::address_v6::bytes_type addressBytes;
- std::memcpy(addressBytes.data(), ipv6raw->sin6_addr.s6_addr, addressBytes.size());
- boost::asio::ip::address_v6 address = make_address_v6(addressBytes, ipv6raw->sin6_scope_id);
- if (address.is_unspecified() || address.is_loopback() || address.is_multicast())
- continue;
-
- if (sockaddr_in6* netmask6raw = reinterpret_cast<sockaddr_in6*>(itr->ifa_netmask))
- {
- int32 prefixLength = 0;
- for (uint8 addressByte : netmask6raw->sin6_addr.s6_addr)
- prefixLength += std::countl_one(addressByte);
-
- LocalV6Networks.push_back(boost::asio::ip::make_network_v6(address, prefixLength));
- }
- else
- LocalV6Networks.push_back(boost::asio::ip::make_network_v6(address, 128));
- break;
- }
- }
- }
-
- freeifaddrs(addressesLinkedList);
-}
-
-#endif
diff --git a/src/common/Asio/IpNetwork.h b/src/common/Asio/IpNetwork.h
deleted file mode 100644
index 08db7d49f84..00000000000
--- a/src/common/Asio/IpNetwork.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef IpNetwork_h__
-#define IpNetwork_h__
-
-#include "AsioHacksFwd.h"
-#include "Define.h"
-#include "Optional.h"
-#include <span>
-
-namespace Trinity::Net
-{
-TC_COMMON_API bool IsInLocalNetwork(boost::asio::ip::address const& clientAddress);
-
-TC_COMMON_API bool IsInNetwork(boost::asio::ip::network_v4 const& network, boost::asio::ip::address_v4 const& clientAddress);
-
-TC_COMMON_API bool IsInNetwork(boost::asio::ip::network_v6 const& network, boost::asio::ip::address_v6 const& clientAddress);
-
-TC_COMMON_API Optional<std::size_t> SelectAddressForClient(boost::asio::ip::address const& clientAddress, std::span<boost::asio::ip::address const> const& addresses);
-
-TC_COMMON_API void ScanLocalNetworks();
-}
-
-#endif // IpNetwork_h__
diff --git a/src/common/Asio/Resolver.h b/src/common/Asio/Resolver.h
deleted file mode 100644
index 84dedd21bfa..00000000000
--- a/src/common/Asio/Resolver.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef Resolver_h__
-#define Resolver_h__
-
-#include "IoContext.h"
-#include "Optional.h"
-#include <boost/asio/ip/tcp.hpp>
-#include <algorithm>
-#include <string_view>
-#include <vector>
-
-namespace Trinity
-{
- namespace Asio
- {
- /**
- Hack to make it possible to forward declare resolver (one of its template arguments is a typedef to something super long and using nested classes)
- */
- class Resolver
- {
- public:
- explicit Resolver(IoContext& ioContext) : _impl(ioContext) { }
-
- Optional<boost::asio::ip::tcp::endpoint> Resolve(boost::asio::ip::tcp const& protocol, std::string_view host, std::string_view service)
- {
- boost::system::error_code ec;
- boost::asio::ip::resolver_base::flags flagsResolver = boost::asio::ip::resolver_base::all_matching;
- boost::asio::ip::tcp::resolver::results_type results = _impl.resolve(protocol, host, service, flagsResolver, ec);
- if (results.begin() == results.end() || ec)
- return {};
-
- return results.begin()->endpoint();
- }
-
- std::vector<boost::asio::ip::tcp::endpoint> ResolveAll(std::string_view host, std::string_view service)
- {
- boost::system::error_code ec;
- boost::asio::ip::resolver_base::flags flagsResolver = boost::asio::ip::resolver_base::all_matching;
- boost::asio::ip::tcp::resolver::results_type results = _impl.resolve(host, service, flagsResolver, ec);
- std::vector<boost::asio::ip::tcp::endpoint> result;
- if (!ec)
- std::ranges::transform(results, std::back_inserter(result), [](boost::asio::ip::tcp::resolver::results_type::value_type const& entry) { return entry.endpoint(); });
-
- return result;
- }
-
- private:
- boost::asio::ip::tcp::resolver _impl;
- };
- }
-}
-
-#endif // Resolver_h__