Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(593)

Side by Side Diff: net/quic/quic_protocol.cc

Issue 12334063: Land recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: more EXPECT_FALSE Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_protocol.h ('k') | net/quic/quic_protocol_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_protocol.h" 5 #include "net/quic/quic_protocol.h"
6 #include "base/stl_util.h" 6 #include "base/stl_util.h"
7 7
8 using base::StringPiece; 8 using base::StringPiece;
9 using std::map; 9 using std::map;
10 using std::numeric_limits; 10 using std::numeric_limits;
11 using std::ostream; 11 using std::ostream;
12 using std::string;
12 13
13 namespace net { 14 namespace net {
14 15
15 QuicStreamFrame::QuicStreamFrame() {} 16 QuicStreamFrame::QuicStreamFrame() {}
16 17
17 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, 18 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id,
18 bool fin, 19 bool fin,
19 QuicStreamOffset offset, 20 QuicStreamOffset offset,
20 StringPiece data) 21 StringPiece data)
21 : stream_id(stream_id), 22 : stream_id(stream_id),
22 fin(fin), 23 fin(fin),
23 offset(offset), 24 offset(offset),
24 data(data) { 25 data(data) {
25 } 26 }
26 27
28 ostream& operator<<(ostream& os, const QuicPacketHeader& header) {
29 os << "{ guid: " << header.public_header.guid
30 << ", reset_flag: " << header.public_header.reset_flag
31 << ", version_flag: " << header.public_header.version_flag
32 << ", fec_flag: " << header.fec_flag
33 << ", entropy_flag: " << header.entropy_flag
34 << ", entropy hash: " << static_cast<int>(header.entropy_hash)
35 << ", sequence_number: " << header.packet_sequence_number
36 << ", fec_group: " << header.fec_group<< "}\n";
37 return os;
38 }
39
27 // TODO(ianswett): Initializing largest_observed to 0 should not be necessary. 40 // TODO(ianswett): Initializing largest_observed to 0 should not be necessary.
28 ReceivedPacketInfo::ReceivedPacketInfo() : largest_observed(0) {} 41 ReceivedPacketInfo::ReceivedPacketInfo()
42 : largest_observed(0) {
43 }
29 44
30 ReceivedPacketInfo::~ReceivedPacketInfo() {} 45 ReceivedPacketInfo::~ReceivedPacketInfo() {}
31 46
32 void ReceivedPacketInfo::RecordReceived( 47 bool IsAwaitingPacket(const ReceivedPacketInfo& received_info,
33 QuicPacketSequenceNumber sequence_number) { 48 QuicPacketSequenceNumber sequence_number) {
34 DCHECK(IsAwaitingPacket(sequence_number)); 49 return sequence_number > received_info.largest_observed ||
35 if (largest_observed < sequence_number) { 50 ContainsKey(received_info.missing_packets, sequence_number);
36 DCHECK_LT(sequence_number - largest_observed, 51 }
37 numeric_limits<uint16>::max()); 52
38 // We've got a new high sequence number. Note any new intermediate missing 53 void InsertMissingPacketsBetween(ReceivedPacketInfo* received_info,
39 // packets, and update the last_ack data. 54 QuicPacketSequenceNumber lower,
40 for (QuicPacketSequenceNumber i = largest_observed + 1; 55 QuicPacketSequenceNumber higher) {
41 i < sequence_number; ++i) { 56 for (QuicPacketSequenceNumber i = lower; i < higher; ++i) {
42 DVLOG(1) << "missing " << i; 57 received_info->missing_packets.insert(i);
43 missing_packets.insert(i);
44 }
45 largest_observed = sequence_number;
46 } else {
47 // We've gotten one of the out of order packets - remove it from our
48 // "missing packets" list.
49 DVLOG(1) << "Removing " << sequence_number << " from missing list";
50 missing_packets.erase(sequence_number);
51 } 58 }
52 } 59 }
53 60
54 bool ReceivedPacketInfo::IsAwaitingPacket(
55 QuicPacketSequenceNumber sequence_number) const {
56 return sequence_number > largest_observed ||
57 ContainsKey(missing_packets, sequence_number);
58 }
59
60 void ReceivedPacketInfo::ClearMissingBefore(
61 QuicPacketSequenceNumber least_unacked) {
62 missing_packets.erase(missing_packets.begin(),
63 missing_packets.lower_bound(least_unacked));
64 }
65
66 SentPacketInfo::SentPacketInfo() {} 61 SentPacketInfo::SentPacketInfo() {}
67 62
68 SentPacketInfo::~SentPacketInfo() {} 63 SentPacketInfo::~SentPacketInfo() {}
69 64
70 // Testing convenience method. 65 // Testing convenience method.
71 QuicAckFrame::QuicAckFrame(QuicPacketSequenceNumber largest_observed, 66 QuicAckFrame::QuicAckFrame(QuicPacketSequenceNumber largest_observed,
72 QuicPacketSequenceNumber least_unacked) { 67 QuicPacketSequenceNumber least_unacked) {
73 for (QuicPacketSequenceNumber seq_num = 1;
74 seq_num <= largest_observed; ++seq_num) {
75 received_info.RecordReceived(seq_num);
76 }
77 received_info.largest_observed = largest_observed; 68 received_info.largest_observed = largest_observed;
69 received_info.entropy_hash = 0;
78 sent_info.least_unacked = least_unacked; 70 sent_info.least_unacked = least_unacked;
71 sent_info.entropy_hash = 0;
79 } 72 }
80 73
81 ostream& operator<<(ostream& os, const SentPacketInfo& sent_info) { 74 ostream& operator<<(ostream& os, const SentPacketInfo& sent_info) {
82 os << "least_unacked: " << sent_info.least_unacked; 75 os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash);
76 os << " least_unacked: " << sent_info.least_unacked;
83 return os; 77 return os;
84 } 78 }
85 79
86 ostream& operator<<(ostream& os, const ReceivedPacketInfo& received_info) { 80 ostream& operator<<(ostream& os, const ReceivedPacketInfo& received_info) {
87 os << "largest_observed: " 81 os << "entropy_hash: " << static_cast<int>(received_info.entropy_hash)
88 << received_info.largest_observed 82 << " largest_observed: " << received_info.largest_observed
89 << " missing_packets: [ "; 83 << " missing_packets: [ ";
90 for (SequenceSet::const_iterator it = received_info.missing_packets.begin(); 84 for (SequenceNumberSet::const_iterator it =
85 received_info.missing_packets.begin();
91 it != received_info.missing_packets.end(); ++it) { 86 it != received_info.missing_packets.end(); ++it) {
92 os << *it << " "; 87 os << *it << " ";
93 } 88 }
94 os << " ] "; 89 os << " ] ";
95 return os; 90 return os;
96 } 91 }
97 92
98 QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() { 93 QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() {
99 } 94 }
100 95
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate() 139 CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate()
145 : bitrate(QuicBandwidth::Zero()) { 140 : bitrate(QuicBandwidth::Zero()) {
146 } 141 }
147 142
148 CongestionFeedbackMessageInterArrival:: 143 CongestionFeedbackMessageInterArrival::
149 CongestionFeedbackMessageInterArrival() {} 144 CongestionFeedbackMessageInterArrival() {}
150 145
151 CongestionFeedbackMessageInterArrival:: 146 CongestionFeedbackMessageInterArrival::
152 ~CongestionFeedbackMessageInterArrival() {} 147 ~CongestionFeedbackMessageInterArrival() {}
153 148
149 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code,
150 QuicStreamId last_good_stream_id,
151 const string& reason)
152 : error_code(error_code),
153 last_good_stream_id(last_good_stream_id),
154 reason_phrase(reason) {
155 DCHECK_LE(error_code, numeric_limits<uint8>::max());
156 }
157
154 QuicFecData::QuicFecData() {} 158 QuicFecData::QuicFecData() {}
155 159
156 bool QuicFecData::operator==(const QuicFecData& other) const { 160 bool QuicFecData::operator==(const QuicFecData& other) const {
157 if (fec_group != other.fec_group) { 161 if (fec_group != other.fec_group) {
158 return false; 162 return false;
159 } 163 }
160 if (redundancy != other.redundancy) { 164 if (redundancy != other.redundancy) {
161 return false; 165 return false;
162 } 166 }
163 return true; 167 return true;
164 } 168 }
165 169
166 QuicData::~QuicData() { 170 QuicData::~QuicData() {
167 if (owns_buffer_) { 171 if (owns_buffer_) {
168 delete [] const_cast<char*>(buffer_); 172 delete [] const_cast<char*>(buffer_);
169 } 173 }
170 } 174 }
171 175
176 RetransmittableFrames::RetransmittableFrames() {}
177
178 RetransmittableFrames::~RetransmittableFrames() {
179 for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) {
180 switch (it->type) {
181 case PADDING_FRAME:
182 delete it->padding_frame;
183 break;
184 case STREAM_FRAME:
185 delete it->stream_frame;
186 break;
187 case ACK_FRAME:
188 delete it->ack_frame;
189 break;
190 case CONGESTION_FEEDBACK_FRAME:
191 delete it->congestion_feedback_frame;
192 break;
193 case RST_STREAM_FRAME:
194 delete it->rst_stream_frame;
195 break;
196 case CONNECTION_CLOSE_FRAME:
197 delete it->connection_close_frame;
198 break;
199 case GOAWAY_FRAME:
200 delete it->goaway_frame;
201 break;
202 case NUM_FRAME_TYPES:
203 DCHECK(false) << "Cannot delete type: " << it->type;
204 }
205 }
206 STLDeleteElements(&stream_data_);
207 }
208
209 const QuicFrame& RetransmittableFrames::AddStreamFrame(
210 QuicStreamFrame* stream_frame) {
211 // Make an owned copy of the StringPiece.
212 string* stream_data = new string(stream_frame->data.data(),
213 stream_frame->data.size());
214 // Ensure the frame's StringPiece points to the owned copy of the data.
215 stream_frame->data = StringPiece(*stream_data);
216 stream_data_.push_back(stream_data);
217 frames_.push_back(QuicFrame(stream_frame));
218 return frames_.back();
219 }
220
221 const QuicFrame& RetransmittableFrames::AddNonStreamFrame(
222 const QuicFrame& frame) {
223 DCHECK_NE(frame.type, STREAM_FRAME);
224 frames_.push_back(frame);
225 return frames_.back();
226 }
227
172 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) { 228 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) {
173 os << s.length() << "-byte data"; 229 os << s.length() << "-byte data";
174 return os; 230 return os;
175 } 231 }
176 232
177 ostream& operator<<(ostream& os, const QuicConsumedData& s) { 233 ostream& operator<<(ostream& os, const QuicConsumedData& s) {
178 os << "bytes_consumed: " << s.bytes_consumed 234 os << "bytes_consumed: " << s.bytes_consumed
179 << " fin_consumed: " << s.fin_consumed; 235 << " fin_consumed: " << s.fin_consumed;
180 return os; 236 return os;
181 } 237 }
182 238
183 } // namespace net 239 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_protocol.h ('k') | net/quic/quic_protocol_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698