OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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_ |
OLD | NEW |