summaryrefslogtreecommitdiff
path: root/chromium/net/dns/address_sorter_posix.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/dns/address_sorter_posix.h')
-rw-r--r--chromium/net/dns/address_sorter_posix.h94
1 files changed, 94 insertions, 0 deletions
diff --git a/chromium/net/dns/address_sorter_posix.h b/chromium/net/dns/address_sorter_posix.h
new file mode 100644
index 00000000000..1c88ad2f978
--- /dev/null
+++ b/chromium/net/dns/address_sorter_posix.h
@@ -0,0 +1,94 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_DNS_ADDRESS_SORTER_POSIX_H_
+#define NET_DNS_ADDRESS_SORTER_POSIX_H_
+
+#include <map>
+#include <vector>
+
+#include "base/threading/non_thread_safe.h"
+#include "net/base/address_list.h"
+#include "net/base/net_errors.h"
+#include "net/base/net_export.h"
+#include "net/base/net_util.h"
+#include "net/base/network_change_notifier.h"
+#include "net/dns/address_sorter.h"
+
+namespace net {
+
+class ClientSocketFactory;
+
+// This implementation uses explicit policy to perform the sorting. It is not
+// thread-safe and always completes synchronously.
+class NET_EXPORT_PRIVATE AddressSorterPosix
+ : public AddressSorter,
+ public base::NonThreadSafe,
+ public NetworkChangeNotifier::IPAddressObserver {
+ public:
+ // Generic policy entry.
+ struct PolicyEntry {
+ // IPv4 addresses must be mapped to IPv6.
+ unsigned char prefix[kIPv6AddressSize];
+ unsigned prefix_length;
+ unsigned value;
+ };
+
+ typedef std::vector<PolicyEntry> PolicyTable;
+
+ enum AddressScope {
+ SCOPE_UNDEFINED = 0,
+ SCOPE_NODELOCAL = 1,
+ SCOPE_LINKLOCAL = 2,
+ SCOPE_SITELOCAL = 5,
+ SCOPE_ORGLOCAL = 8,
+ SCOPE_GLOBAL = 14,
+ };
+
+ struct SourceAddressInfo {
+ // Values read from policy tables.
+ AddressScope scope;
+ unsigned label;
+
+ // Values from the OS, matter only if more than one source address is used.
+ unsigned prefix_length;
+ bool deprecated; // vs. preferred RFC4862
+ bool home; // vs. care-of RFC6275
+ bool native;
+ };
+
+ typedef std::map<IPAddressNumber, SourceAddressInfo> SourceAddressMap;
+
+ explicit AddressSorterPosix(ClientSocketFactory* socket_factory);
+ virtual ~AddressSorterPosix();
+
+ // AddressSorter:
+ virtual void Sort(const AddressList& list,
+ const CallbackType& callback) const OVERRIDE;
+
+ private:
+ friend class AddressSorterPosixTest;
+
+ // NetworkChangeNotifier::IPAddressObserver:
+ virtual void OnIPAddressChanged() OVERRIDE;
+
+ // Fills |info| with values for |address| from policy tables.
+ void FillPolicy(const IPAddressNumber& address,
+ SourceAddressInfo* info) const;
+
+ // Mutable to allow using default values for source addresses which were not
+ // found in most recent OnIPAddressChanged.
+ mutable SourceAddressMap source_map_;
+
+ ClientSocketFactory* socket_factory_;
+ PolicyTable precedence_table_;
+ PolicyTable label_table_;
+ PolicyTable ipv4_scope_table_;
+
+ DISALLOW_COPY_AND_ASSIGN(AddressSorterPosix);
+};
+
+} // namespace net
+
+#endif // NET_DNS_ADDRESS_SORTER_POSIX_H_