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

Side by Side Diff: net/quic/core/quic_framer.h

Issue 2515613002: deprecate FLAGS_quic_disable_pre_34 (Closed)
Patch Set: Created 4 years, 1 month 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
« no previous file with comments | « net/quic/core/quic_flags_list.h ('k') | net/quic/core/quic_framer.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 #ifndef NET_QUIC_QUIC_FRAMER_H_ 5 #ifndef NET_QUIC_QUIC_FRAMER_H_
6 #define NET_QUIC_QUIC_FRAMER_H_ 6 #define NET_QUIC_QUIC_FRAMER_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 28 matching lines...) Expand all
39 // Number of bytes reserved to denote the length of error details field. 39 // Number of bytes reserved to denote the length of error details field.
40 const size_t kQuicErrorDetailsLengthSize = 2; 40 const size_t kQuicErrorDetailsLengthSize = 2;
41 41
42 // Maximum number of bytes reserved for stream id. 42 // Maximum number of bytes reserved for stream id.
43 const size_t kQuicMaxStreamIdSize = 4; 43 const size_t kQuicMaxStreamIdSize = 4;
44 // Maximum number of bytes reserved for byte offset in stream frame. 44 // Maximum number of bytes reserved for byte offset in stream frame.
45 const size_t kQuicMaxStreamOffsetSize = 8; 45 const size_t kQuicMaxStreamOffsetSize = 8;
46 // Number of bytes reserved to store payload length in stream frame. 46 // Number of bytes reserved to store payload length in stream frame.
47 const size_t kQuicStreamPayloadLengthSize = 2; 47 const size_t kQuicStreamPayloadLengthSize = 2;
48 48
49 // Size in bytes of the entropy hash sent in ack frames.
50 const size_t kQuicEntropyHashSize = 1;
51 // Size in bytes reserved for the delta time of the largest observed 49 // Size in bytes reserved for the delta time of the largest observed
52 // packet number in ack frames. 50 // packet number in ack frames.
53 const size_t kQuicDeltaTimeLargestObservedSize = 2; 51 const size_t kQuicDeltaTimeLargestObservedSize = 2;
54 // Size in bytes reserved for the number of received packets with timestamps. 52 // Size in bytes reserved for the number of received packets with timestamps.
55 const size_t kQuicNumTimestampsSize = 1; 53 const size_t kQuicNumTimestampsSize = 1;
56 // Size in bytes reserved for the number of missing packets in ack frames. 54 // Size in bytes reserved for the number of missing packets in ack frames.
57 const size_t kNumberOfNackRangesSize = 1; 55 const size_t kNumberOfNackRangesSize = 1;
58 // Size in bytes reserved for the number of ack blocks in ack frames. 56 // Size in bytes reserved for the number of ack blocks in ack frames.
59 const size_t kNumberOfAckBlocksSize = 1; 57 const size_t kNumberOfAckBlocksSize = 1;
60 // Maximum number of missing packet ranges that can fit within an ack frame. 58 // Maximum number of missing packet ranges that can fit within an ack frame.
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 // Called when a BlockedFrame has been parsed. 139 // Called when a BlockedFrame has been parsed.
142 virtual bool OnBlockedFrame(const QuicBlockedFrame& frame) = 0; 140 virtual bool OnBlockedFrame(const QuicBlockedFrame& frame) = 0;
143 141
144 // Called when a PathCloseFrame has been parsed. 142 // Called when a PathCloseFrame has been parsed.
145 virtual bool OnPathCloseFrame(const QuicPathCloseFrame& frame) = 0; 143 virtual bool OnPathCloseFrame(const QuicPathCloseFrame& frame) = 0;
146 144
147 // Called when a packet has been completely processed. 145 // Called when a packet has been completely processed.
148 virtual void OnPacketComplete() = 0; 146 virtual void OnPacketComplete() = 0;
149 }; 147 };
150 148
151 // This class calculates the received entropy of the ack packet being
152 // framed, should it get truncated.
153 class NET_EXPORT_PRIVATE QuicReceivedEntropyHashCalculatorInterface {
154 public:
155 virtual ~QuicReceivedEntropyHashCalculatorInterface() {}
156
157 // When an ack frame gets truncated while being framed the received
158 // entropy of the ack frame needs to be calculated since the some of the
159 // missing packets are not added and the largest observed might be lowered.
160 // This should return the received entropy hash of the packets received up to
161 // and including |packet_number|.
162 virtual QuicPacketEntropyHash EntropyHash(
163 QuicPacketNumber packet_number) const = 0;
164 };
165
166 // Class for parsing and constructing QUIC packets. It has a 149 // Class for parsing and constructing QUIC packets. It has a
167 // QuicFramerVisitorInterface that is called when packets are parsed. 150 // QuicFramerVisitorInterface that is called when packets are parsed.
168 class NET_EXPORT_PRIVATE QuicFramer { 151 class NET_EXPORT_PRIVATE QuicFramer {
169 public: 152 public:
170 // Constructs a new framer that installs a kNULL QuicEncrypter and 153 // Constructs a new framer that installs a kNULL QuicEncrypter and
171 // QuicDecrypter for level ENCRYPTION_NONE. |supported_versions| specifies the 154 // QuicDecrypter for level ENCRYPTION_NONE. |supported_versions| specifies the
172 // list of supported QUIC versions. |quic_version_| is set to the maximum 155 // list of supported QUIC versions. |quic_version_| is set to the maximum
173 // version in |supported_versions|. 156 // version in |supported_versions|.
174 QuicFramer(const QuicVersionVector& supported_versions, 157 QuicFramer(const QuicVersionVector& supported_versions,
175 QuicTime creation_time, 158 QuicTime creation_time,
(...skipping 17 matching lines...) Expand all
193 QuicVersion version() const { return quic_version_; } 176 QuicVersion version() const { return quic_version_; }
194 177
195 void set_version(const QuicVersion version); 178 void set_version(const QuicVersion version);
196 179
197 // Does not DCHECK for supported version. Used by tests to set unsupported 180 // Does not DCHECK for supported version. Used by tests to set unsupported
198 // version to trigger version negotiation. 181 // version to trigger version negotiation.
199 void set_version_for_tests(const QuicVersion version) { 182 void set_version_for_tests(const QuicVersion version) {
200 quic_version_ = version; 183 quic_version_ = version;
201 } 184 }
202 185
203 // Set entropy calculator to be called from the framer when it needs the
204 // entropy of a truncated ack frame. An entropy calculator must be set or else
205 // the framer will likely crash. If this is called multiple times, only the
206 // last calculator will be used.
207 void set_received_entropy_calculator(
208 QuicReceivedEntropyHashCalculatorInterface* entropy_calculator) {
209 entropy_calculator_ = entropy_calculator;
210 }
211
212 QuicErrorCode error() const { return error_; } 186 QuicErrorCode error() const { return error_; }
213 187
214 // Pass a UDP packet into the framer for parsing. 188 // Pass a UDP packet into the framer for parsing.
215 // Return true if the packet was processed succesfully. |packet| must be a 189 // Return true if the packet was processed succesfully. |packet| must be a
216 // single, complete UDP packet (not a frame of a packet). This packet 190 // single, complete UDP packet (not a frame of a packet). This packet
217 // might be null padded past the end of the payload, which will be correctly 191 // might be null padded past the end of the payload, which will be correctly
218 // ignored. 192 // ignored.
219 bool ProcessPacket(const QuicEncryptedPacket& packet); 193 bool ProcessPacket(const QuicEncryptedPacket& packet);
220 194
221 // Largest size in bytes of all stream frame fields without the payload. 195 // Largest size in bytes of all stream frame fields without the payload.
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 330
357 void SetSupportedVersions(const QuicVersionVector& versions) { 331 void SetSupportedVersions(const QuicVersionVector& versions) {
358 supported_versions_ = versions; 332 supported_versions_ = versions;
359 quic_version_ = versions[0]; 333 quic_version_ = versions[0];
360 } 334 }
361 335
362 void set_validate_flags(bool value) { validate_flags_ = value; } 336 void set_validate_flags(bool value) { validate_flags_ = value; }
363 337
364 Perspective perspective() const { return perspective_; } 338 Perspective perspective() const { return perspective_; }
365 339
366 static QuicPacketEntropyHash GetPacketEntropyHash(
367 const QuicPacketHeader& header);
368
369 // Called when a PATH_CLOSED frame has been sent/received on |path_id|. 340 // Called when a PATH_CLOSED frame has been sent/received on |path_id|.
370 void OnPathClosed(QuicPathId path_id); 341 void OnPathClosed(QuicPathId path_id);
371 342
372 QuicTag last_version_tag() { return last_version_tag_; } 343 QuicTag last_version_tag() { return last_version_tag_; }
373 344
374 private: 345 private:
375 friend class test::QuicFramerPeer; 346 friend class test::QuicFramerPeer;
376 347
377 typedef std::map<QuicPacketNumber, uint8_t> NackRangeMap; 348 typedef std::map<QuicPacketNumber, uint8_t> NackRangeMap;
378 349
379 struct AckFrameInfo { 350 // TODO(rch): Rename this to remove "New" from the name here, and elsewhere.
380 AckFrameInfo();
381 AckFrameInfo(const AckFrameInfo& other);
382 ~AckFrameInfo();
383
384 // The maximum delta between ranges.
385 QuicPacketNumber max_delta;
386 // Nack ranges starting with start packet numbers and lengths.
387 NackRangeMap nack_ranges;
388 };
389
390 struct AckBlock {
391 AckBlock(uint8_t gap, QuicPacketNumber length);
392 AckBlock(const AckBlock& other);
393 ~AckBlock();
394
395 // Gap to the next ack block.
396 uint8_t gap;
397 // Length of this ack block.
398 QuicPacketNumber length;
399 };
400
401 struct NewAckFrameInfo { 351 struct NewAckFrameInfo {
402 NewAckFrameInfo(); 352 NewAckFrameInfo();
403 NewAckFrameInfo(const NewAckFrameInfo& other); 353 NewAckFrameInfo(const NewAckFrameInfo& other);
404 ~NewAckFrameInfo(); 354 ~NewAckFrameInfo();
405 355
406 // The maximum ack block length. 356 // The maximum ack block length.
407 QuicPacketNumber max_block_length; 357 QuicPacketNumber max_block_length;
408 // Length of first ack block. 358 // Length of first ack block.
409 QuicPacketNumber first_block_length; 359 QuicPacketNumber first_block_length;
410 // Number of ACK blocks needed for the ACK frame. 360 // Number of ACK blocks needed for the ACK frame.
(...skipping 13 matching lines...) Expand all
424 QuicPacketPublicHeader* public_header); 374 QuicPacketPublicHeader* public_header);
425 375
426 bool ProcessPublicHeader(QuicDataReader* reader, 376 bool ProcessPublicHeader(QuicDataReader* reader,
427 QuicPacketPublicHeader* header); 377 QuicPacketPublicHeader* header);
428 378
429 // Processes the unauthenticated portion of the header into |header| from 379 // Processes the unauthenticated portion of the header into |header| from
430 // the current QuicDataReader. Returns true on success, false on failure. 380 // the current QuicDataReader. Returns true on success, false on failure.
431 bool ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, 381 bool ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader,
432 QuicPacketHeader* header); 382 QuicPacketHeader* header);
433 383
434 // Processes the authenticated portion of the header into |header| from
435 // the current QuicDataReader. Returns true on success, false on failure.
436 bool ProcessAuthenticatedHeader(QuicDataReader* reader,
437 QuicPacketHeader* header);
438
439 bool ProcessPathId(QuicDataReader* reader, QuicPathId* path_id); 384 bool ProcessPathId(QuicDataReader* reader, QuicPathId* path_id);
440 bool ProcessPacketSequenceNumber(QuicDataReader* reader, 385 bool ProcessPacketSequenceNumber(QuicDataReader* reader,
441 QuicPacketNumberLength packet_number_length, 386 QuicPacketNumberLength packet_number_length,
442 QuicPacketNumber base_packet_number, 387 QuicPacketNumber base_packet_number,
443 QuicPacketNumber* packet_number); 388 QuicPacketNumber* packet_number);
444 bool ProcessFrameData(QuicDataReader* reader, const QuicPacketHeader& header); 389 bool ProcessFrameData(QuicDataReader* reader, const QuicPacketHeader& header);
445 bool ProcessStreamFrame(QuicDataReader* reader, 390 bool ProcessStreamFrame(QuicDataReader* reader,
446 uint8_t frame_type, 391 uint8_t frame_type,
447 QuicStreamFrame* frame); 392 QuicStreamFrame* frame);
448 bool ProcessAckFrame(QuicDataReader* reader,
449 uint8_t frame_type,
450 QuicAckFrame* frame);
451 bool ProcessNewAckFrame(QuicDataReader* reader, 393 bool ProcessNewAckFrame(QuicDataReader* reader,
452 uint8_t frame_type, 394 uint8_t frame_type,
453 QuicAckFrame* frame); 395 QuicAckFrame* frame);
454 bool ProcessTimestampsInAckFrame(QuicDataReader* reader, QuicAckFrame* frame); 396 bool ProcessTimestampsInAckFrame(QuicDataReader* reader, QuicAckFrame* frame);
455 bool ProcessStopWaitingFrame(QuicDataReader* reader, 397 bool ProcessStopWaitingFrame(QuicDataReader* reader,
456 const QuicPacketHeader& public_header, 398 const QuicPacketHeader& public_header,
457 QuicStopWaitingFrame* stop_waiting); 399 QuicStopWaitingFrame* stop_waiting);
458 bool ProcessRstStreamFrame(QuicDataReader* reader, QuicRstStreamFrame* frame); 400 bool ProcessRstStreamFrame(QuicDataReader* reader, QuicRstStreamFrame* frame);
459 bool ProcessConnectionCloseFrame(QuicDataReader* reader, 401 bool ProcessConnectionCloseFrame(QuicDataReader* reader,
460 QuicConnectionCloseFrame* frame); 402 QuicConnectionCloseFrame* frame);
(...skipping 27 matching lines...) Expand all
488 QuicPacketNumber base_packet_number, 430 QuicPacketNumber base_packet_number,
489 QuicPacketNumber packet_number) const; 431 QuicPacketNumber packet_number) const;
490 432
491 // Returns the QuicTime::Delta corresponding to the time from when the framer 433 // Returns the QuicTime::Delta corresponding to the time from when the framer
492 // was created. 434 // was created.
493 const QuicTime::Delta CalculateTimestampFromWire(uint32_t time_delta_us); 435 const QuicTime::Delta CalculateTimestampFromWire(uint32_t time_delta_us);
494 436
495 // Computes the wire size in bytes of time stamps in |ack|. 437 // Computes the wire size in bytes of time stamps in |ack|.
496 size_t GetAckFrameTimeStampSize(const QuicAckFrame& ack); 438 size_t GetAckFrameTimeStampSize(const QuicAckFrame& ack);
497 439
498 // Computes the wire size in bytes of the |ack| frame, assuming no truncation. 440 // Computes the wire size in bytes of the |ack| frame.
499 size_t GetAckFrameSize(const QuicAckFrame& ack, 441 size_t GetAckFrameSize(const QuicAckFrame& ack,
500 QuicPacketNumberLength packet_number_length); 442 QuicPacketNumberLength packet_number_length);
501 443
502 // Computes the wire size in bytes of the |ack| frame. 444 // Computes the wire size in bytes of the |ack| frame.
503 size_t GetNewAckFrameSize(const QuicAckFrame& ack); 445 size_t GetNewAckFrameSize(const QuicAckFrame& ack);
504 446
505 // Computes the wire size in bytes of the payload of |frame|. 447 // Computes the wire size in bytes of the payload of |frame|.
506 size_t ComputeFrameLength(const QuicFrame& frame, 448 size_t ComputeFrameLength(const QuicFrame& frame,
507 bool last_frame_in_packet, 449 bool last_frame_in_packet,
508 QuicPacketNumberLength packet_number_length); 450 QuicPacketNumberLength packet_number_length);
509 451
510 static bool AppendPacketSequenceNumber( 452 static bool AppendPacketSequenceNumber(
511 QuicPacketNumberLength packet_number_length, 453 QuicPacketNumberLength packet_number_length,
512 QuicPacketNumber packet_number, 454 QuicPacketNumber packet_number,
513 QuicDataWriter* writer); 455 QuicDataWriter* writer);
514 456
515 // Appends a single ACK block to |writer| and returns true if the block was 457 // Appends a single ACK block to |writer| and returns true if the block was
516 // successfully appended. 458 // successfully appended.
517 static bool AppendAckBlock(uint8_t gap, 459 static bool AppendAckBlock(uint8_t gap,
518 QuicPacketNumberLength length_length, 460 QuicPacketNumberLength length_length,
519 QuicPacketNumber length, 461 QuicPacketNumber length,
520 QuicDataWriter* writer); 462 QuicDataWriter* writer);
521 463
522 static uint8_t GetSequenceNumberFlags( 464 static uint8_t GetSequenceNumberFlags(
523 QuicPacketNumberLength packet_number_length); 465 QuicPacketNumberLength packet_number_length);
524 466
525 static AckFrameInfo GetAckFrameInfo(const QuicAckFrame& frame);
526
527 static NewAckFrameInfo GetNewAckFrameInfo(const QuicAckFrame& frame); 467 static NewAckFrameInfo GetNewAckFrameInfo(const QuicAckFrame& frame);
528 468
529 // The Append* methods attempt to write the provided header or frame using the 469 // The Append* methods attempt to write the provided header or frame using the
530 // |writer|, and return true if successful. 470 // |writer|, and return true if successful.
531 471
532 bool AppendAckFrameAndTypeByte(const QuicPacketHeader& header,
533 const QuicAckFrame& frame,
534 QuicDataWriter* builder);
535 bool AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, 472 bool AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame,
536 QuicDataWriter* builder); 473 QuicDataWriter* builder);
537 bool AppendTimestampToAckFrame(const QuicAckFrame& frame, 474 bool AppendTimestampToAckFrame(const QuicAckFrame& frame,
538 QuicDataWriter* builder); 475 QuicDataWriter* builder);
539 bool AppendStopWaitingFrame(const QuicPacketHeader& header, 476 bool AppendStopWaitingFrame(const QuicPacketHeader& header,
540 const QuicStopWaitingFrame& frame, 477 const QuicStopWaitingFrame& frame,
541 QuicDataWriter* builder); 478 QuicDataWriter* builder);
542 bool AppendRstStreamFrame(const QuicRstStreamFrame& frame, 479 bool AppendRstStreamFrame(const QuicRstStreamFrame& frame,
543 QuicDataWriter* builder); 480 QuicDataWriter* builder);
544 bool AppendConnectionCloseFrame(const QuicConnectionCloseFrame& frame, 481 bool AppendConnectionCloseFrame(const QuicConnectionCloseFrame& frame,
545 QuicDataWriter* builder); 482 QuicDataWriter* builder);
546 bool AppendGoAwayFrame(const QuicGoAwayFrame& frame, QuicDataWriter* writer); 483 bool AppendGoAwayFrame(const QuicGoAwayFrame& frame, QuicDataWriter* writer);
547 bool AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame, 484 bool AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame,
548 QuicDataWriter* writer); 485 QuicDataWriter* writer);
549 bool AppendBlockedFrame(const QuicBlockedFrame& frame, 486 bool AppendBlockedFrame(const QuicBlockedFrame& frame,
550 QuicDataWriter* writer); 487 QuicDataWriter* writer);
551 bool AppendPathCloseFrame(const QuicPathCloseFrame& frame, 488 bool AppendPathCloseFrame(const QuicPathCloseFrame& frame,
552 QuicDataWriter* writer); 489 QuicDataWriter* writer);
553 490
554 bool RaiseError(QuicErrorCode error); 491 bool RaiseError(QuicErrorCode error);
555 492
556 void set_error(QuicErrorCode error) { error_ = error; } 493 void set_error(QuicErrorCode error) { error_ = error; }
557 494
558 void set_detailed_error(const char* error) { detailed_error_ = error; } 495 void set_detailed_error(const char* error) { detailed_error_ = error; }
559 496
560 std::string detailed_error_; 497 std::string detailed_error_;
561 QuicFramerVisitorInterface* visitor_; 498 QuicFramerVisitorInterface* visitor_;
562 QuicReceivedEntropyHashCalculatorInterface* entropy_calculator_;
563 QuicErrorCode error_; 499 QuicErrorCode error_;
564 // Set of closed paths. A path is considered as closed if a PATH_CLOSED frame 500 // Set of closed paths. A path is considered as closed if a PATH_CLOSED frame
565 // has been sent/received. 501 // has been sent/received.
566 // TODO(fayang): this set is never cleaned up. A possible improvement is to 502 // TODO(fayang): this set is never cleaned up. A possible improvement is to
567 // use intervals. 503 // use intervals.
568 std::unordered_set<QuicPathId> closed_paths_; 504 std::unordered_set<QuicPathId> closed_paths_;
569 // Updated by ProcessPacketHeader when it succeeds. 505 // Updated by ProcessPacketHeader when it succeeds.
570 QuicPacketNumber last_packet_number_; 506 QuicPacketNumber last_packet_number_;
571 // Map mapping path id to packet number of largest successfully decrypted 507 // Map mapping path id to packet number of largest successfully decrypted
572 // received packet. 508 // received packet.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 QuicTime::Delta last_timestamp_; 549 QuicTime::Delta last_timestamp_;
614 // The diversification nonce from the last received packet. 550 // The diversification nonce from the last received packet.
615 DiversificationNonce last_nonce_; 551 DiversificationNonce last_nonce_;
616 552
617 DISALLOW_COPY_AND_ASSIGN(QuicFramer); 553 DISALLOW_COPY_AND_ASSIGN(QuicFramer);
618 }; 554 };
619 555
620 } // namespace net 556 } // namespace net
621 557
622 #endif // NET_QUIC_QUIC_FRAMER_H_ 558 #endif // NET_QUIC_QUIC_FRAMER_H_
OLDNEW
« no previous file with comments | « net/quic/core/quic_flags_list.h ('k') | net/quic/core/quic_framer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698