Index: net/quic/quic_config.cc |
diff --git a/net/quic/quic_config.cc b/net/quic/quic_config.cc |
index 86a37b32d6d93ec96201cdb0a4d06b21c126f41c..9a5f403d3cc3014ae42d71c273d35b2f5f7691fb 100644 |
--- a/net/quic/quic_config.cc |
+++ b/net/quic/quic_config.cc |
@@ -16,17 +16,57 @@ using std::string; |
namespace net { |
-QuicNegotiableValue::QuicNegotiableValue(QuicTag tag, Presence presence) |
+// Reads the value corresponding to |name_| from |msg| into |out|. If the |
+// |name_| is absent in |msg| and |presence| is set to OPTIONAL |out| is set |
+// to |default_value|. |
+QuicErrorCode ReadUint32(const CryptoHandshakeMessage& msg, |
+ QuicTag tag, |
+ QuicConfigPresence presence, |
+ uint32 default_value, |
+ uint32* out, |
+ string* error_details) { |
+ DCHECK(error_details != NULL); |
+ QuicErrorCode error = msg.GetUint32(tag, out); |
+ switch (error) { |
+ case QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND: |
+ if (presence == PRESENCE_REQUIRED) { |
+ *error_details = "Missing " + QuicUtils::TagToString(tag); |
+ break; |
+ } |
+ error = QUIC_NO_ERROR; |
+ *out = default_value; |
+ break; |
+ case QUIC_NO_ERROR: |
+ break; |
+ default: |
+ *error_details = "Bad " + QuicUtils::TagToString(tag); |
+ break; |
+ } |
+ return error; |
+} |
+ |
+ |
+QuicConfigValue::QuicConfigValue(QuicTag tag, |
+ QuicConfigPresence presence) |
: tag_(tag), |
- presence_(presence), |
+ presence_(presence) { |
+} |
+QuicConfigValue::~QuicConfigValue() {} |
+ |
+QuicNegotiableValue::QuicNegotiableValue(QuicTag tag, |
+ QuicConfigPresence presence) |
+ : QuicConfigValue(tag, presence), |
negotiated_(false) { |
} |
+QuicNegotiableValue::~QuicNegotiableValue() {} |
-QuicNegotiableUint32::QuicNegotiableUint32(QuicTag tag, Presence presence) |
+QuicNegotiableUint32::QuicNegotiableUint32(QuicTag tag, |
+ QuicConfigPresence presence) |
: QuicNegotiableValue(tag, presence), |
max_value_(0), |
default_value_(0) { |
} |
+QuicNegotiableUint32::~QuicNegotiableUint32() {} |
void QuicNegotiableUint32::set(uint32 max, uint32 default_value) { |
DCHECK_LE(default_value, max); |
@@ -50,41 +90,21 @@ void QuicNegotiableUint32::ToHandshakeMessage( |
} |
} |
-QuicErrorCode QuicNegotiableUint32::ReadUint32( |
- const CryptoHandshakeMessage& msg, |
- uint32* out, |
- string* error_details) const { |
- DCHECK(error_details != NULL); |
- QuicErrorCode error = msg.GetUint32(tag_, out); |
- switch (error) { |
- case QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND: |
- if (presence_ == QuicNegotiableValue::PRESENCE_REQUIRED) { |
- *error_details = "Missing " + QuicUtils::TagToString(tag_); |
- break; |
- } |
- error = QUIC_NO_ERROR; |
- *out = default_value_; |
- |
- case QUIC_NO_ERROR: |
- break; |
- default: |
- *error_details = "Bad " + QuicUtils::TagToString(tag_); |
- break; |
- } |
- return error; |
-} |
- |
QuicErrorCode QuicNegotiableUint32::ProcessClientHello( |
const CryptoHandshakeMessage& client_hello, |
string* error_details) { |
DCHECK(!negotiated_); |
DCHECK(error_details != NULL); |
uint32 value; |
- QuicErrorCode error = ReadUint32(client_hello, &value, error_details); |
+ QuicErrorCode error = ReadUint32(client_hello, |
+ tag_, |
+ presence_, |
+ default_value_, |
+ &value, |
+ error_details); |
if (error != QUIC_NO_ERROR) { |
return error; |
} |
- |
negotiated_ = true; |
negotiated_value_ = std::min(value, max_value_); |
@@ -97,7 +117,12 @@ QuicErrorCode QuicNegotiableUint32::ProcessServerHello( |
DCHECK(!negotiated_); |
DCHECK(error_details != NULL); |
uint32 value; |
- QuicErrorCode error = ReadUint32(server_hello, &value, error_details); |
+ QuicErrorCode error = ReadUint32(server_hello, |
+ tag_, |
+ presence_, |
+ max_value_, |
+ &value, |
+ error_details); |
if (error != QUIC_NO_ERROR) { |
return error; |
} |
@@ -113,7 +138,7 @@ QuicErrorCode QuicNegotiableUint32::ProcessServerHello( |
return QUIC_NO_ERROR; |
} |
-QuicNegotiableTag::QuicNegotiableTag(QuicTag tag, Presence presence) |
+QuicNegotiableTag::QuicNegotiableTag(QuicTag tag, QuicConfigPresence presence) |
: QuicNegotiableValue(tag, presence), |
negotiated_tag_(0), |
default_value_(0) { |
@@ -226,16 +251,58 @@ QuicErrorCode QuicNegotiableTag::ProcessServerHello( |
return QUIC_NO_ERROR; |
} |
-QuicConfig::QuicConfig() : |
- congestion_control_(kCGST, QuicNegotiableValue::PRESENCE_REQUIRED), |
- idle_connection_state_lifetime_seconds_( |
- kICSL, QuicNegotiableValue::PRESENCE_REQUIRED), |
- keepalive_timeout_seconds_(kKATO, QuicNegotiableValue::PRESENCE_OPTIONAL), |
- max_streams_per_connection_(kMSPC, QuicNegotiableValue::PRESENCE_REQUIRED), |
- max_time_before_crypto_handshake_(QuicTime::Delta::Zero()), |
- server_initial_congestion_window_( |
- kSWND, QuicNegotiableValue::PRESENCE_OPTIONAL), |
- initial_round_trip_time_us_(kIRTT, QuicNegotiableValue::PRESENCE_OPTIONAL) { |
+QuicFixedUint32::QuicFixedUint32(QuicTag tag, |
+ QuicConfigPresence presence, |
+ uint32 default_value) |
+ : QuicConfigValue(tag, presence), |
+ value_(default_value) { |
+} |
+QuicFixedUint32::~QuicFixedUint32() {} |
+ |
+uint32 QuicFixedUint32::GetUint32() const { |
+ return value_; |
+} |
+ |
+void QuicFixedUint32::ToHandshakeMessage( |
+ CryptoHandshakeMessage* out) const { |
+ out->SetValue(tag_, value_); |
+} |
+ |
+QuicErrorCode QuicFixedUint32::ProcessClientHello( |
+ const CryptoHandshakeMessage& client_hello, |
+ string* error_details) { |
+ DCHECK(error_details != NULL); |
+ QuicErrorCode error = |
+ ReadUint32(client_hello, tag_, presence_, value_, &value_, error_details); |
+ if (error != QUIC_NO_ERROR) { |
+ return error; |
+ } |
+ return QUIC_NO_ERROR; |
+} |
+ |
+QuicErrorCode QuicFixedUint32::ProcessServerHello( |
+ const CryptoHandshakeMessage& server_hello, |
+ string* error_details) { |
+ DCHECK(error_details != NULL); |
+ QuicErrorCode error = |
+ ReadUint32(server_hello, tag_, presence_, value_, &value_, error_details); |
+ if (error != QUIC_NO_ERROR) { |
+ return error; |
+ } |
+ return QUIC_NO_ERROR; |
+} |
+ |
+QuicConfig::QuicConfig() |
+ : congestion_control_(kCGST, PRESENCE_REQUIRED), |
+ idle_connection_state_lifetime_seconds_(kICSL, PRESENCE_REQUIRED), |
+ keepalive_timeout_seconds_(kKATO, PRESENCE_OPTIONAL), |
+ max_streams_per_connection_(kMSPC, PRESENCE_REQUIRED), |
+ max_time_before_crypto_handshake_(QuicTime::Delta::Zero()), |
+ server_initial_congestion_window_(kSWND, PRESENCE_OPTIONAL), |
+ initial_round_trip_time_us_(kIRTT, PRESENCE_OPTIONAL), |
+ // TODO(rjshade): Make this PRESENCE_REQUIRED when retiring |
+ // QUIC_VERSION_17. |
+ peer_initial_flow_control_window_bytes_(kIFCW, PRESENCE_OPTIONAL, 0) { |
// All optional non-zero parameters should be initialized here. |
server_initial_congestion_window_.set(kMaxInitialWindow, |
kDefaultInitialWindow); |
@@ -308,6 +375,14 @@ uint32 QuicConfig::initial_round_trip_time_us() const { |
return initial_round_trip_time_us_.GetUint32(); |
} |
+void QuicConfig::set_peer_initial_flow_control_window_bytes(uint32 window) { |
+ peer_initial_flow_control_window_bytes_.set_value(window); |
+} |
+ |
+uint32 QuicConfig::peer_initial_flow_control_window_bytes() const { |
+ return peer_initial_flow_control_window_bytes_.GetUint32(); |
+} |
+ |
bool QuicConfig::negotiated() { |
// TODO(ianswett): Add the negotiated parameters once and iterate over all |
// of them in negotiated, ToHandshakeMessage, ProcessClientHello, and |
@@ -356,6 +431,7 @@ void QuicConfig::ToHandshakeMessage(CryptoHandshakeMessage* out) const { |
server_initial_congestion_window_.ToHandshakeMessage(out); |
// TODO(ianswett): Don't transmit parameters which are optional and not set. |
initial_round_trip_time_us_.ToHandshakeMessage(out); |
+ peer_initial_flow_control_window_bytes_.ToHandshakeMessage(out); |
} |
QuicErrorCode QuicConfig::ProcessClientHello( |
@@ -387,6 +463,10 @@ QuicErrorCode QuicConfig::ProcessClientHello( |
error = initial_round_trip_time_us_.ProcessClientHello( |
client_hello, error_details); |
} |
+ if (error == QUIC_NO_ERROR) { |
+ error = peer_initial_flow_control_window_bytes_.ProcessClientHello( |
+ client_hello, error_details); |
+ } |
return error; |
} |
@@ -419,6 +499,10 @@ QuicErrorCode QuicConfig::ProcessServerHello( |
error = initial_round_trip_time_us_.ProcessServerHello( |
server_hello, error_details); |
} |
+ if (error == QUIC_NO_ERROR) { |
+ error = peer_initial_flow_control_window_bytes_.ProcessServerHello( |
+ server_hello, error_details); |
+ } |
return error; |
} |