OpenVPN 3 Core Library
Loading...
Searching...
No Matches
resolver_results.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12#pragma once
13
14#include <algorithm>
15
17#include <openvpn/addr/ip.hpp>
18
19namespace openvpn::WS {
20
21// These methods become no-ops unless building with a patched Asio.
22// Define ASIO_RESOLVER_RESULTS_DATA_REQUIRED to force an error if these methods
23// cannot be compiled.
24
25#if defined(HAVE_ASIO_RESOLVER_RESULTS_DATA)
26
27template <typename RESULTS>
28inline void randomize_results(RESULTS &results, RandomAPI &prng)
29{
30 auto *data = results.data();
31 if (!data)
32 return;
33 std::shuffle(data->begin(), data->end(), prng);
34}
35
36template <typename RESULTS>
37inline void filter_by_ip_version(RESULTS &results, const IP::Addr::Version ip_ver)
38{
39 auto *data = results.data();
40 if (!data)
41 return;
42
43 bool v4;
44 switch (ip_ver)
45 {
46 case IP::Addr::V4:
47 v4 = true;
48 break;
49 case IP::Addr::V6:
50 v4 = false;
51 break;
52 default:
53 return;
54 }
55
56 // the "auto" lambda parameter makes this C++14 code
57 data->erase(std::remove_if(data->begin(),
58 data->end(),
59 [v4](auto &e)
60 { return e.endpoint().address().is_v4() != v4; }),
61 data->end());
62}
63
64#elif defined(ASIO_RESOLVER_RESULTS_DATA_REQUIRED)
65#error ASIO_RESOLVER_RESULTS_DATA_REQUIRED is defined but Asio results data are not available
66#else
67
68template <typename RESULTS>
69inline void randomize_results(RESULTS &results, RandomAPI &prng)
70{
71}
72
73template <typename RESULTS>
74inline void filter_by_ip_version(RESULTS &results, const IP::Addr::Version ip_ver)
75{
76}
77
78#endif
79
80} // namespace openvpn::WS
Abstract base class for random number generators.
Definition randapi.hpp:39
Data data(const void *bytes, CFIndex length)
Definition cf.hpp:266
void randomize_results(RESULTS &results, RandomAPI &prng)
void filter_by_ip_version(RESULTS &results, const IP::Addr::Version ip_ver)
Implementation of the base classes for random number generators.