• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "net/quic/quic_protocol.h"
6 
7 #include "base/stl_util.h"
8 #include "net/quic/quic_utils.h"
9 
10 using base::StringPiece;
11 using std::map;
12 using std::numeric_limits;
13 using std::ostream;
14 using std::string;
15 
16 namespace net {
17 
GetPacketHeaderSize(QuicPacketHeader header)18 size_t GetPacketHeaderSize(QuicPacketHeader header) {
19   return GetPacketHeaderSize(header.public_header.guid_length,
20                              header.public_header.version_flag,
21                              header.public_header.sequence_number_length,
22                              header.is_in_fec_group);
23 }
24 
GetPacketHeaderSize(QuicGuidLength guid_length,bool include_version,QuicSequenceNumberLength sequence_number_length,InFecGroup is_in_fec_group)25 size_t GetPacketHeaderSize(QuicGuidLength guid_length,
26                            bool include_version,
27                            QuicSequenceNumberLength sequence_number_length,
28                            InFecGroup is_in_fec_group) {
29   return kPublicFlagsSize + guid_length +
30       (include_version ? kQuicVersionSize : 0) + sequence_number_length +
31       kPrivateFlagsSize + (is_in_fec_group == IN_FEC_GROUP ? kFecGroupSize : 0);
32 }
33 
GetPublicResetPacketSize()34 size_t GetPublicResetPacketSize() {
35   return kPublicFlagsSize + PACKET_8BYTE_GUID + kPublicResetNonceSize +
36       PACKET_6BYTE_SEQUENCE_NUMBER;
37 }
38 
GetStartOfFecProtectedData(QuicGuidLength guid_length,bool include_version,QuicSequenceNumberLength sequence_number_length)39 size_t GetStartOfFecProtectedData(
40     QuicGuidLength guid_length,
41     bool include_version,
42     QuicSequenceNumberLength sequence_number_length) {
43   return GetPacketHeaderSize(
44       guid_length, include_version, sequence_number_length, IN_FEC_GROUP);
45 }
46 
GetStartOfEncryptedData(QuicGuidLength guid_length,bool include_version,QuicSequenceNumberLength sequence_number_length)47 size_t GetStartOfEncryptedData(
48     QuicGuidLength guid_length,
49     bool include_version,
50     QuicSequenceNumberLength sequence_number_length) {
51   // Don't include the fec size, since encryption starts before private flags.
52   return GetPacketHeaderSize(
53       guid_length, include_version, sequence_number_length, NOT_IN_FEC_GROUP) -
54       kPrivateFlagsSize;
55 }
56 
QuicPacketPublicHeader()57 QuicPacketPublicHeader::QuicPacketPublicHeader()
58     : guid(0),
59       guid_length(PACKET_8BYTE_GUID),
60       reset_flag(false),
61       version_flag(false),
62       sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) {
63 }
64 
QuicPacketPublicHeader(const QuicPacketPublicHeader & other)65 QuicPacketPublicHeader::QuicPacketPublicHeader(
66     const QuicPacketPublicHeader& other)
67     : guid(other.guid),
68       guid_length(other.guid_length),
69       reset_flag(other.reset_flag),
70       version_flag(other.version_flag),
71       sequence_number_length(other.sequence_number_length),
72       versions(other.versions) {
73 }
74 
~QuicPacketPublicHeader()75 QuicPacketPublicHeader::~QuicPacketPublicHeader() {}
76 
QuicPacketHeader()77 QuicPacketHeader::QuicPacketHeader()
78     : fec_flag(false),
79       entropy_flag(false),
80       entropy_hash(0),
81       packet_sequence_number(0),
82       is_in_fec_group(NOT_IN_FEC_GROUP),
83       fec_group(0) {
84 }
85 
QuicPacketHeader(const QuicPacketPublicHeader & header)86 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header)
87     : public_header(header),
88       fec_flag(false),
89       entropy_flag(false),
90       entropy_hash(0),
91       packet_sequence_number(0),
92       is_in_fec_group(NOT_IN_FEC_GROUP),
93       fec_group(0) {
94 }
95 
QuicStreamFrame()96 QuicStreamFrame::QuicStreamFrame() {}
97 
QuicStreamFrame(const QuicStreamFrame & frame)98 QuicStreamFrame::QuicStreamFrame(const QuicStreamFrame& frame)
99     : stream_id(frame.stream_id),
100       fin(frame.fin),
101       offset(frame.offset),
102       data(frame.data),
103       notifier(frame.notifier) {
104 }
105 
QuicStreamFrame(QuicStreamId stream_id,bool fin,QuicStreamOffset offset,IOVector data)106 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id,
107                                  bool fin,
108                                  QuicStreamOffset offset,
109                                  IOVector data)
110     : stream_id(stream_id),
111       fin(fin),
112       offset(offset),
113       data(data),
114       notifier(NULL) {
115 }
116 
GetDataAsString() const117 string* QuicStreamFrame::GetDataAsString() const {
118   string* data_string = new string();
119   data_string->reserve(data.TotalBufferSize());
120   for (size_t i = 0; i < data.Size(); ++i) {
121     data_string->append(static_cast<char*>(data.iovec()[i].iov_base),
122                         data.iovec()[i].iov_len);
123   }
124   DCHECK_EQ(data_string->size(), data.TotalBufferSize());
125   return data_string;
126 }
127 
MakeQuicTag(char a,char b,char c,char d)128 uint32 MakeQuicTag(char a, char b, char c, char d) {
129   return static_cast<uint32>(a) |
130          static_cast<uint32>(b) << 8 |
131          static_cast<uint32>(c) << 16 |
132          static_cast<uint32>(d) << 24;
133 }
134 
QuicSupportedVersions()135 QuicVersionVector QuicSupportedVersions() {
136   QuicVersionVector supported_versions;
137   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
138     supported_versions.push_back(kSupportedQuicVersions[i]);
139   }
140   return supported_versions;
141 }
142 
QuicVersionToQuicTag(const QuicVersion version)143 QuicTag QuicVersionToQuicTag(const QuicVersion version) {
144   switch (version) {
145     case QUIC_VERSION_12:
146       return MakeQuicTag('Q', '0', '1', '2');
147     default:
148       // This shold be an ERROR because we should never attempt to convert an
149       // invalid QuicVersion to be written to the wire.
150       LOG(ERROR) << "Unsupported QuicVersion: " << version;
151       return 0;
152   }
153 }
154 
QuicTagToQuicVersion(const QuicTag version_tag)155 QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) {
156   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
157     if (version_tag == QuicVersionToQuicTag(kSupportedQuicVersions[i])) {
158       return kSupportedQuicVersions[i];
159     }
160   }
161   // Reading from the client so this should not be considered an ERROR.
162   DVLOG(1) << "Unsupported QuicTag version: "
163              << QuicUtils::TagToString(version_tag);
164   return QUIC_VERSION_UNSUPPORTED;
165 }
166 
167 #define RETURN_STRING_LITERAL(x) \
168 case x: \
169 return #x
170 
QuicVersionToString(const QuicVersion version)171 string QuicVersionToString(const QuicVersion version) {
172   switch (version) {
173     RETURN_STRING_LITERAL(QUIC_VERSION_12);
174     default:
175       return "QUIC_VERSION_UNSUPPORTED";
176   }
177 }
178 
QuicVersionVectorToString(const QuicVersionVector & versions)179 string QuicVersionVectorToString(const QuicVersionVector& versions) {
180   string result = "";
181   for (size_t i = 0; i < versions.size(); ++i) {
182     if (i != 0) {
183       result.append(",");
184     }
185     result.append(QuicVersionToString(versions[i]));
186   }
187   return result;
188 }
189 
operator <<(ostream & os,const QuicPacketHeader & header)190 ostream& operator<<(ostream& os, const QuicPacketHeader& header) {
191   os << "{ guid: " << header.public_header.guid
192      << ", guid_length:" << header.public_header.guid_length
193      << ", sequence_number_length:"
194      << header.public_header.sequence_number_length
195      << ", reset_flag: " << header.public_header.reset_flag
196      << ", version_flag: " << header.public_header.version_flag;
197   if (header.public_header.version_flag) {
198     os << " version: ";
199     for (size_t i = 0; i < header.public_header.versions.size(); ++i) {
200       os << header.public_header.versions[0] << " ";
201     }
202   }
203   os << ", fec_flag: " << header.fec_flag
204      << ", entropy_flag: " << header.entropy_flag
205      << ", entropy hash: " << static_cast<int>(header.entropy_hash)
206      << ", sequence_number: " << header.packet_sequence_number
207      << ", is_in_fec_group:" << header.is_in_fec_group
208      << ", fec_group: " << header.fec_group<< "}\n";
209   return os;
210 }
211 
ReceivedPacketInfo()212 ReceivedPacketInfo::ReceivedPacketInfo()
213     : largest_observed(0),
214       delta_time_largest_observed(QuicTime::Delta::Infinite()),
215       is_truncated(false) {
216 }
217 
~ReceivedPacketInfo()218 ReceivedPacketInfo::~ReceivedPacketInfo() {}
219 
IsAwaitingPacket(const ReceivedPacketInfo & received_info,QuicPacketSequenceNumber sequence_number)220 bool IsAwaitingPacket(const ReceivedPacketInfo& received_info,
221                       QuicPacketSequenceNumber sequence_number) {
222   return sequence_number > received_info.largest_observed ||
223       ContainsKey(received_info.missing_packets, sequence_number);
224 }
225 
InsertMissingPacketsBetween(ReceivedPacketInfo * received_info,QuicPacketSequenceNumber lower,QuicPacketSequenceNumber higher)226 void InsertMissingPacketsBetween(ReceivedPacketInfo* received_info,
227                                  QuicPacketSequenceNumber lower,
228                                  QuicPacketSequenceNumber higher) {
229   for (QuicPacketSequenceNumber i = lower; i < higher; ++i) {
230     received_info->missing_packets.insert(i);
231   }
232 }
233 
SentPacketInfo()234 SentPacketInfo::SentPacketInfo() {}
235 
~SentPacketInfo()236 SentPacketInfo::~SentPacketInfo() {}
237 
238 // Testing convenience method.
QuicAckFrame(QuicPacketSequenceNumber largest_observed,QuicTime largest_observed_receive_time,QuicPacketSequenceNumber least_unacked)239 QuicAckFrame::QuicAckFrame(QuicPacketSequenceNumber largest_observed,
240                            QuicTime largest_observed_receive_time,
241                            QuicPacketSequenceNumber least_unacked) {
242   received_info.largest_observed = largest_observed;
243   received_info.entropy_hash = 0;
244   sent_info.least_unacked = least_unacked;
245   sent_info.entropy_hash = 0;
246 }
247 
operator <<(ostream & os,const SentPacketInfo & sent_info)248 ostream& operator<<(ostream& os, const SentPacketInfo& sent_info) {
249   os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash)
250      << " least_unacked: " << sent_info.least_unacked;
251   return os;
252 }
253 
operator <<(ostream & os,const ReceivedPacketInfo & received_info)254 ostream& operator<<(ostream& os, const ReceivedPacketInfo& received_info) {
255   os << "entropy_hash: " << static_cast<int>(received_info.entropy_hash)
256      << " largest_observed: " << received_info.largest_observed
257      << " missing_packets: [ ";
258   for (SequenceNumberSet::const_iterator it =
259            received_info.missing_packets.begin();
260        it != received_info.missing_packets.end(); ++it) {
261     os << *it << " ";
262   }
263   os << " ] ";
264   return os;
265 }
266 
QuicCongestionFeedbackFrame()267 QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() {
268 }
269 
~QuicCongestionFeedbackFrame()270 QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() {
271 }
272 
operator <<(ostream & os,const QuicCongestionFeedbackFrame & congestion_frame)273 ostream& operator<<(ostream& os,
274                     const QuicCongestionFeedbackFrame& congestion_frame) {
275   os << "type: " << congestion_frame.type;
276   switch (congestion_frame.type) {
277     case kInterArrival: {
278       const CongestionFeedbackMessageInterArrival& inter_arrival =
279           congestion_frame.inter_arrival;
280       os << " accumulated_number_of_lost_packets: "
281          << inter_arrival.accumulated_number_of_lost_packets;
282       os << " received packets: [ ";
283       for (TimeMap::const_iterator it =
284                inter_arrival.received_packet_times.begin();
285            it != inter_arrival.received_packet_times.end(); ++it) {
286         os << it->first << "@" << it->second.ToDebuggingValue() << " ";
287       }
288       os << "]";
289       break;
290     }
291     case kFixRate: {
292       os << " bitrate_in_bytes_per_second: "
293          << congestion_frame.fix_rate.bitrate.ToBytesPerSecond();
294       break;
295     }
296     case kTCP: {
297       const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp;
298       os << " accumulated_number_of_lost_packets: "
299          << congestion_frame.tcp.accumulated_number_of_lost_packets;
300       os << " receive_window: " << tcp.receive_window;
301       break;
302     }
303   }
304   return os;
305 }
306 
operator <<(ostream & os,const QuicAckFrame & ack_frame)307 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) {
308   os << "sent info { " << ack_frame.sent_info << " } "
309      << "received info { " << ack_frame.received_info << " }\n";
310   return os;
311 }
312 
CongestionFeedbackMessageFixRate()313 CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate()
314     : bitrate(QuicBandwidth::Zero()) {
315 }
316 
317 CongestionFeedbackMessageInterArrival::
CongestionFeedbackMessageInterArrival()318 CongestionFeedbackMessageInterArrival() {}
319 
320 CongestionFeedbackMessageInterArrival::
~CongestionFeedbackMessageInterArrival()321 ~CongestionFeedbackMessageInterArrival() {}
322 
QuicGoAwayFrame(QuicErrorCode error_code,QuicStreamId last_good_stream_id,const string & reason)323 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code,
324                                  QuicStreamId last_good_stream_id,
325                                  const string& reason)
326     : error_code(error_code),
327       last_good_stream_id(last_good_stream_id),
328       reason_phrase(reason) {
329   DCHECK_LE(error_code, numeric_limits<uint8>::max());
330 }
331 
QuicFecData()332 QuicFecData::QuicFecData() {}
333 
~QuicData()334 QuicData::~QuicData() {
335   if (owns_buffer_) {
336     delete [] const_cast<char*>(buffer_);
337   }
338 }
339 
FecProtectedData() const340 StringPiece QuicPacket::FecProtectedData() const {
341   const size_t start_of_fec = GetStartOfFecProtectedData(
342       guid_length_, includes_version_, sequence_number_length_);
343   return StringPiece(data() + start_of_fec, length() - start_of_fec);
344 }
345 
AssociatedData() const346 StringPiece QuicPacket::AssociatedData() const {
347   return StringPiece(
348       data() + kStartOfHashData,
349       GetStartOfEncryptedData(
350           guid_length_, includes_version_, sequence_number_length_) -
351       kStartOfHashData);
352 }
353 
BeforePlaintext() const354 StringPiece QuicPacket::BeforePlaintext() const {
355   return StringPiece(data(), GetStartOfEncryptedData(guid_length_,
356                                                      includes_version_,
357                                                      sequence_number_length_));
358 }
359 
Plaintext() const360 StringPiece QuicPacket::Plaintext() const {
361   const size_t start_of_encrypted_data =
362       GetStartOfEncryptedData(
363           guid_length_, includes_version_, sequence_number_length_);
364   return StringPiece(data() + start_of_encrypted_data,
365                      length() - start_of_encrypted_data);
366 }
367 
RetransmittableFrames()368 RetransmittableFrames::RetransmittableFrames()
369     : encryption_level_(NUM_ENCRYPTION_LEVELS) {
370 }
371 
~RetransmittableFrames()372 RetransmittableFrames::~RetransmittableFrames() {
373   for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) {
374     switch (it->type) {
375       case PADDING_FRAME:
376         delete it->padding_frame;
377         break;
378       case STREAM_FRAME:
379         delete it->stream_frame;
380         break;
381       case ACK_FRAME:
382         delete it->ack_frame;
383         break;
384       case CONGESTION_FEEDBACK_FRAME:
385         delete it->congestion_feedback_frame;
386         break;
387       case RST_STREAM_FRAME:
388         delete it->rst_stream_frame;
389         break;
390       case CONNECTION_CLOSE_FRAME:
391         delete it->connection_close_frame;
392         break;
393       case GOAWAY_FRAME:
394         delete it->goaway_frame;
395         break;
396       case NUM_FRAME_TYPES:
397         DCHECK(false) << "Cannot delete type: " << it->type;
398     }
399   }
400   STLDeleteElements(&stream_data_);
401 }
402 
AddStreamFrame(QuicStreamFrame * stream_frame)403 const QuicFrame& RetransmittableFrames::AddStreamFrame(
404     QuicStreamFrame* stream_frame) {
405   // Make an owned copy of the stream frame's data.
406   stream_data_.push_back(stream_frame->GetDataAsString());
407   // Ensure the stream frame's IOVector points to the owned copy of the data.
408   stream_frame->data.Clear();
409   stream_frame->data.Append(const_cast<char*>(stream_data_.back()->data()),
410                             stream_data_.back()->size());
411   frames_.push_back(QuicFrame(stream_frame));
412   return frames_.back();
413 }
414 
AddNonStreamFrame(const QuicFrame & frame)415 const QuicFrame& RetransmittableFrames::AddNonStreamFrame(
416     const QuicFrame& frame) {
417   DCHECK_NE(frame.type, STREAM_FRAME);
418   frames_.push_back(frame);
419   return frames_.back();
420 }
421 
set_encryption_level(EncryptionLevel level)422 void RetransmittableFrames::set_encryption_level(EncryptionLevel level) {
423   encryption_level_ = level;
424 }
425 
SerializedPacket(QuicPacketSequenceNumber sequence_number,QuicSequenceNumberLength sequence_number_length,QuicPacket * packet,QuicPacketEntropyHash entropy_hash,RetransmittableFrames * retransmittable_frames)426 SerializedPacket::SerializedPacket(
427     QuicPacketSequenceNumber sequence_number,
428     QuicSequenceNumberLength sequence_number_length,
429     QuicPacket* packet,
430     QuicPacketEntropyHash entropy_hash,
431     RetransmittableFrames* retransmittable_frames)
432     : sequence_number(sequence_number),
433       sequence_number_length(sequence_number_length),
434       packet(packet),
435       entropy_hash(entropy_hash),
436       retransmittable_frames(retransmittable_frames) {
437 }
438 
~SerializedPacket()439 SerializedPacket::~SerializedPacket() {}
440 
Clone() const441 QuicEncryptedPacket* QuicEncryptedPacket::Clone() const {
442   char* buffer = new char[this->length()];
443   memcpy(buffer, this->data(), this->length());
444   return new QuicEncryptedPacket(buffer, this->length(), true);
445 }
446 
operator <<(ostream & os,const QuicEncryptedPacket & s)447 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) {
448   os << s.length() << "-byte data";
449   return os;
450 }
451 
operator <<(ostream & os,const QuicConsumedData & s)452 ostream& operator<<(ostream& os, const QuicConsumedData& s) {
453   os << "bytes_consumed: " << s.bytes_consumed
454      << " fin_consumed: " << s.fin_consumed;
455   return os;
456 }
457 
458 }  // namespace net
459