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