summaryrefslogtreecommitdiffstats
path: root/net/spdy/spdy_session.cc
diff options
context:
space:
mode:
authoragayev@chromium.org <agayev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-22 02:29:16 +0000
committeragayev@chromium.org <agayev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-22 02:29:16 +0000
commit7349c6b146c267b7f634d518296f631642ef7095 (patch)
treed74e8aeeef9e20e83a44c798ac68bb8b7f3e2a2b /net/spdy/spdy_session.cc
parentebf40a790f097712268847862f8a94ce2f69c772 (diff)
downloadchromium_src-7349c6b146c267b7f634d518296f631642ef7095.zip
chromium_src-7349c6b146c267b7f634d518296f631642ef7095.tar.gz
chromium_src-7349c6b146c267b7f634d518296f631642ef7095.tar.bz2
SPDY flow control: enforce obeying send window size via a command-line switch, initial support for receive window size.
BUG=48100 TEST=net_unittestss --gtest_filter="SpdyProtocolTest.ControlFrameStructs:SpdyNetworkTransactionTest.WindowUpdate:SpdyNetworkTransactionTest.WindowUpdateOverflow" Review URL: http://codereview.chromium.org/3052005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@53297 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/spdy/spdy_session.cc')
-rw-r--r--net/spdy/spdy_session.cc26
1 files changed, 15 insertions, 11 deletions
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index 06ba7d5..a5bebf5 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -133,6 +133,9 @@ class NetLogSpdySettingsParameter : public NetLog::EventParameters {
// static
bool SpdySession::use_ssl_ = true;
+// static
+bool SpdySession::use_flow_control_ = true;
+
SpdySession::SpdySession(const HostPortPair& host_port_pair,
HttpNetworkSession* session,
NetLog* net_log)
@@ -164,7 +167,7 @@ SpdySession::SpdySession(const HostPortPair& host_port_pair,
sent_settings_(false),
received_settings_(false),
in_session_pool_(true),
- initial_window_size_(spdy::kInitialWindowSize),
+ initial_send_window_size_(spdy::kInitialWindowSize),
net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SPDY_SESSION)) {
net_log_.BeginEvent(
NetLog::TYPE_SPDY_SESSION,
@@ -372,7 +375,7 @@ int SpdySession::CreateStreamImpl(
stream->set_priority(priority);
stream->set_path(path);
stream->set_net_log(stream_net_log);
- stream->set_window_size(initial_window_size_);
+ stream->set_send_window_size(initial_send_window_size_);
ActivateStream(stream);
UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdyPriorityCount",
@@ -425,12 +428,6 @@ int SpdySession::WriteStreamData(spdy::SpdyStreamId stream_id,
spdy::SpdyDataFlags flags) {
LOG(INFO) << "Writing Stream Data for stream " << stream_id << " (" << len
<< " bytes)";
- const int kMss = 1430; // This is somewhat arbitrary and not really fixed,
- // but it will always work reasonably with ethernet.
- // Chop the world into 2-packet chunks. This is somewhat arbitrary, but
- // is reasonably small and ensures that we elicit ACKs quickly from TCP
- // (because TCP tries to only ACK every other packet).
- const int kMaxSpdyFrameChunkSize = (2 * kMss) - spdy::SpdyFrame::size();
// Find our stream
DCHECK(IsStreamActive(stream_id));
@@ -444,6 +441,14 @@ int SpdySession::WriteStreamData(spdy::SpdyStreamId stream_id,
flags = spdy::DATA_FLAG_NONE;
}
+ // Obey send window size of the stream if flow control is enabled.
+ if (use_flow_control_) {
+ if (stream->send_window_size() <= 0)
+ return ERR_IO_PENDING;
+ len = std::min(len, stream->send_window_size());
+ stream->DecreaseSendWindowSize(len);
+ }
+
// TODO(mbelshe): reduce memory copies here.
scoped_ptr<spdy::SpdyDataFrame> frame(
spdy_framer_.CreateDataFrame(stream_id, data->data(), len, flags));
@@ -1208,8 +1213,6 @@ void SpdySession::OnSettings(const spdy::SpdySettingsControlFrame& frame) {
settings_storage->Set(host_port_pair_, settings);
}
- // TODO(agayev): Implement initial and per stream window size update.
-
received_settings_ = true;
net_log_.AddEvent(
@@ -1239,7 +1242,8 @@ void SpdySession::OnWindowUpdate(
CHECK_EQ(stream->stream_id(), stream_id);
CHECK(!stream->cancelled());
- stream->UpdateWindowSize(delta_window_size);
+ if (use_flow_control_)
+ stream->IncreaseSendWindowSize(delta_window_size);
}
void SpdySession::SendSettings() {