Kaido Kert | 25902c6 | 2024-06-17 17:10:28 -0700 | [diff] [blame^] | 1 | // Copyright 2012 The Chromium Authors |
David Ghandehari | 9e5b587 | 2016-07-28 09:50:04 -0700 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #ifndef NET_DNS_ADDRESS_SORTER_H_ |
| 6 | #define NET_DNS_ADDRESS_SORTER_H_ |
| 7 | |
Andrew Top | 0d1858f | 2019-05-15 22:01:47 -0700 | [diff] [blame] | 8 | #include <memory> |
Kaido Kert | 25902c6 | 2024-06-17 17:10:28 -0700 | [diff] [blame^] | 9 | #include <vector> |
Andrew Top | 0d1858f | 2019-05-15 22:01:47 -0700 | [diff] [blame] | 10 | |
Kaido Kert | 25902c6 | 2024-06-17 17:10:28 -0700 | [diff] [blame^] | 11 | #include "base/functional/callback.h" |
| 12 | #include "net/base/ip_endpoint.h" |
David Ghandehari | 9e5b587 | 2016-07-28 09:50:04 -0700 | [diff] [blame] | 13 | #include "net/base/net_export.h" |
| 14 | |
| 15 | namespace net { |
| 16 | |
| 17 | class AddressList; |
| 18 | |
| 19 | // Sorts AddressList according to RFC3484, by likelihood of successful |
| 20 | // connection. Depending on the platform, the sort could be performed |
| 21 | // asynchronously by the OS, or synchronously by local implementation. |
| 22 | // AddressSorter does not necessarily preserve port numbers on the sorted list. |
| 23 | class NET_EXPORT AddressSorter { |
| 24 | public: |
Andrew Top | 0d1858f | 2019-05-15 22:01:47 -0700 | [diff] [blame] | 25 | using CallbackType = |
Kaido Kert | 25902c6 | 2024-06-17 17:10:28 -0700 | [diff] [blame^] | 26 | base::OnceCallback<void(bool success, std::vector<IPEndPoint> sorted)>; |
David Ghandehari | 9e5b587 | 2016-07-28 09:50:04 -0700 | [diff] [blame] | 27 | |
Kaido Kert | 25902c6 | 2024-06-17 17:10:28 -0700 | [diff] [blame^] | 28 | AddressSorter(const AddressSorter&) = delete; |
| 29 | AddressSorter& operator=(const AddressSorter&) = delete; |
David Ghandehari | 9e5b587 | 2016-07-28 09:50:04 -0700 | [diff] [blame] | 30 | |
Kaido Kert | 25902c6 | 2024-06-17 17:10:28 -0700 | [diff] [blame^] | 31 | virtual ~AddressSorter() = default; |
| 32 | |
| 33 | // Sorts `endpoints`, which must include at least one IPv6 address. |
| 34 | // Calls `callback` upon completion. Could complete synchronously. Could |
David Ghandehari | 9e5b587 | 2016-07-28 09:50:04 -0700 | [diff] [blame] | 35 | // complete after this AddressSorter is destroyed. |
Kaido Kert | 25902c6 | 2024-06-17 17:10:28 -0700 | [diff] [blame^] | 36 | virtual void Sort(const std::vector<IPEndPoint>& endpoints, |
| 37 | CallbackType callback) const = 0; |
David Ghandehari | 9e5b587 | 2016-07-28 09:50:04 -0700 | [diff] [blame] | 38 | |
| 39 | // Creates platform-dependent AddressSorter. |
Andrew Top | 0d1858f | 2019-05-15 22:01:47 -0700 | [diff] [blame] | 40 | static std::unique_ptr<AddressSorter> CreateAddressSorter(); |
David Ghandehari | 9e5b587 | 2016-07-28 09:50:04 -0700 | [diff] [blame] | 41 | |
| 42 | protected: |
Kaido Kert | 25902c6 | 2024-06-17 17:10:28 -0700 | [diff] [blame^] | 43 | AddressSorter() = default; |
David Ghandehari | 9e5b587 | 2016-07-28 09:50:04 -0700 | [diff] [blame] | 44 | }; |
| 45 | |
| 46 | } // namespace net |
| 47 | |
| 48 | #endif // NET_DNS_ADDRESS_SORTER_H_ |