1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef NET_QUIC_CRYPTO_SOURCE_ADDRESS_TOKEN_H_
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define NET_QUIC_CRYPTO_SOURCE_ADDRESS_TOKEN_H_
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <string>
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/basictypes.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/strings/string_piece.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "net/base/net_export.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace net {
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// TODO(rtenneti): sync with server more rationally.
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// CachedNetworkParameters contains data that can be used to choose appropriate
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// connection parameters (initial RTT, initial CWND, etc.) in new connections.
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass NET_EXPORT_PRIVATE CachedNetworkParameters {
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Describes the state of the connection during which the supplied network
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // parameters were calculated.
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enum PreviousConnectionState {
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    SLOW_START = 0,
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    CONGESTION_AVOIDANCE = 1,
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  };
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  CachedNetworkParameters();
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ~CachedNetworkParameters();
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string serving_region() const {
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return serving_region_;
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_serving_region(base::StringPiece serving_region) {
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    serving_region_ = serving_region.as_string();
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int32 bandwidth_estimate_bytes_per_second() const {
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return bandwidth_estimate_bytes_per_second_;
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_bandwidth_estimate_bytes_per_second(
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      int32 bandwidth_estimate_bytes_per_second) {
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bandwidth_estimate_bytes_per_second_ = bandwidth_estimate_bytes_per_second;
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int32 max_bandwidth_estimate_bytes_per_second() const {
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return max_bandwidth_estimate_bytes_per_second_;
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_max_bandwidth_estimate_bytes_per_second(
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      int32 max_bandwidth_estimate_bytes_per_second) {
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    max_bandwidth_estimate_bytes_per_second_ =
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        max_bandwidth_estimate_bytes_per_second;
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int64 max_bandwidth_timestamp_seconds() const {
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return max_bandwidth_timestamp_seconds_;
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_max_bandwidth_timestamp_seconds(
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      int64 max_bandwidth_timestamp_seconds) {
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    max_bandwidth_timestamp_seconds_ = max_bandwidth_timestamp_seconds;
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int32 min_rtt_ms() const {
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return min_rtt_ms_;
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_min_rtt_ms(int32 min_rtt_ms) {
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    min_rtt_ms_ = min_rtt_ms;
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int32 previous_connection_state() const {
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return previous_connection_state_;
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_previous_connection_state(int32 previous_connection_state) {
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    previous_connection_state_ = previous_connection_state;
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // serving_region_ is used to decide whether or not the bandwidth estimate and
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // min RTT are reasonable and if they should be used.
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // For example a group of geographically close servers may share the same
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // serving_region_ string if they are expected to have similar network
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // performance.
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string serving_region_;
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The server can supply a bandwidth estimate (in bytes/s) which it may re-use
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // on receipt of a source-address token with this field set.
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int32 bandwidth_estimate_bytes_per_second_;
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The maximum bandwidth seen by the client, not necessarily the latest.
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int32 max_bandwidth_estimate_bytes_per_second_;
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Timestamp (seconds since UNIX epoch) that indicates when the max bandwidth
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // was seen by the server.
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int64 max_bandwidth_timestamp_seconds_;
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The min RTT seen on a previous connection can be used by the server to
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // inform initial connection parameters for new connections.
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int32 min_rtt_ms_;
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Encodes the PreviousConnectionState enum.
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int32 previous_connection_state_;
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// TODO(rtenneti): sync with server more rationally.
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A SourceAddressToken is serialised, encrypted and sent to clients so that
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// they can prove ownership of an IP address.
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass NET_EXPORT_PRIVATE SourceAddressToken {
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SourceAddressToken();
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ~SourceAddressToken();
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string SerializeAsString() const;
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool ParseFromArray(const char* plaintext, size_t plaintext_length);
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string ip() const {
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return ip_;
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_ip(base::StringPiece ip) {
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ip_ = ip.as_string();
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int64 timestamp() const {
119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return timestamp_;
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_timestamp(int64 timestamp) {
122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    timestamp_ = timestamp;
123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const CachedNetworkParameters& cached_network_parameters() const {
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return cached_network_parameters_;
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_cached_network_parameters(
129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const CachedNetworkParameters& cached_network_parameters) {
130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    cached_network_parameters_ = cached_network_parameters;
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // ip_ contains either 4 (IPv4) or 16 (IPv6) bytes of IP address in network
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // byte order.
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string ip_;
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // timestamp_ contains a UNIX timestamp value of the time when the token was
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // created.
139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int64 timestamp_;
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The server can provide estimated network parameters to be used for
142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // initial parameter selection in future connections.
143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  CachedNetworkParameters cached_network_parameters_;
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(SourceAddressToken);
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace net
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // NET_QUIC_CRYPTO_SOURCE_ADDRESS_TOKEN_H_
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch