| Index: net/tools/flip_server/flip_in_mem_edsm_server.cc
|
| ===================================================================
|
| --- net/tools/flip_server/flip_in_mem_edsm_server.cc (revision 69432)
|
| +++ net/tools/flip_server/flip_in_mem_edsm_server.cc (working copy)
|
| @@ -270,9 +270,12 @@
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -const int kMSS = 1460;
|
| -const int kInitialDataSendersThreshold = (2 * kMSS) - SpdyFrame::size();
|
| -const int kNormalSegmentSize = (2 * kMSS) - SpdyFrame::size();
|
| +const int kMSS = 1400; // Linux default
|
| +const int kSSLOverhead = 33;
|
| +const int kSpdyOverhead = SpdyFrame::size();
|
| +const int kInitialDataSendersThreshold = (2 * kMSS) - kSpdyOverhead;
|
| +const int kSSLSegmentSize = (1 * kMSS) - kSSLOverhead;
|
| +const int kSpdySegmentSize = kSSLSegmentSize - kSpdyOverhead;
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| @@ -1555,7 +1558,7 @@
|
| first_ring.splice(first_ring.end(),
|
| first_ring,
|
| first_ring.begin());
|
| - mci.max_segment_size = kNormalSegmentSize;
|
| + mci.max_segment_size = kSpdySegmentSize;
|
| return &mci;
|
| }
|
| return NULL;
|
| @@ -2071,16 +2074,44 @@
|
| // TODO(mbelshe): We can't compress here - before going into the
|
| // priority queue. Compression needs to be done
|
| // with late binding.
|
| - SpdyDataFrame* fdf = spdy_framer_->CreateDataFrame(stream_id, data, len,
|
| - flags);
|
| - DataFrame df;
|
| - df.size = fdf->length() + SpdyFrame::size();
|
| - df.data = fdf->data();
|
| - df.delete_when_done = true;
|
| - EnqueueDataFrame(df);
|
|
|
| - VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending data frame "
|
| - << stream_id << " [" << len << "] shrunk to " << fdf->length();
|
| + if (len == 0) {
|
| + SpdyDataFrame* fdf = spdy_framer_->CreateDataFrame(stream_id, data, len,
|
| + flags);
|
| + DataFrame df;
|
| + df.size = fdf->length() + SpdyFrame::size();
|
| + df.data = fdf->data();
|
| + df.delete_when_done = true;
|
| + EnqueueDataFrame(df);
|
| + return;
|
| + }
|
| +
|
| + // Chop data frames into chunks so that one stream can't monopolize the
|
| + // output channel.
|
| + while(len > 0) {
|
| + int64 size = std::min(len, static_cast<int64>(kSpdySegmentSize));
|
| + SpdyDataFlags chunk_flags = flags;
|
| +
|
| + // If we chunked this block, and the FIN flag was set, there is more
|
| + // data coming. So, remove the flag.
|
| + if ((size < len) && (flags & DATA_FLAG_FIN))
|
| + chunk_flags = static_cast<SpdyDataFlags>(chunk_flags & ~DATA_FLAG_FIN);
|
| +
|
| + SpdyDataFrame* fdf = spdy_framer_->CreateDataFrame(stream_id, data, size,
|
| + chunk_flags);
|
| + DataFrame df;
|
| + df.size = fdf->length() + SpdyFrame::size();
|
| + df.data = fdf->data();
|
| + df.delete_when_done = true;
|
| + EnqueueDataFrame(df);
|
| +
|
| + VLOG(2) << ACCEPTOR_CLIENT_IDENT << "SpdySM: Sending data frame "
|
| + << stream_id << " [" << size << "] shrunk to " << fdf->length()
|
| + << ", flags=" << flags;
|
| +
|
| + data += size;
|
| + len -= size;
|
| + }
|
| }
|
|
|
| void EnqueueDataFrame(const DataFrame& df) {
|
|
|