Home | History | Annotate | Download | only in quic
      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 #ifndef NET_QUIC_QUIC_FRAMER_H_
      6 #define NET_QUIC_QUIC_FRAMER_H_
      7 
      8 #include <vector>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/logging.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/strings/string_piece.h"
     14 #include "net/base/net_export.h"
     15 #include "net/quic/quic_protocol.h"
     16 
     17 namespace net {
     18 
     19 namespace test {
     20 class QuicFramerPeer;
     21 }  // namespace test
     22 
     23 class QuicDataReader;
     24 class QuicDataWriter;
     25 class QuicDecrypter;
     26 class QuicEncrypter;
     27 class QuicFramer;
     28 
     29 // Number of bytes reserved for the frame type preceding each frame.
     30 const size_t kQuicFrameTypeSize = 1;
     31 // Number of bytes reserved for error code.
     32 const size_t kQuicErrorCodeSize = 4;
     33 // Number of bytes reserved to denote the length of error details field.
     34 const size_t kQuicErrorDetailsLengthSize = 2;
     35 
     36 // Maximum number of bytes reserved for stream id.
     37 const size_t kQuicMaxStreamIdSize = 4;
     38 // Maximum number of bytes reserved for byte offset in stream frame.
     39 const size_t kQuicMaxStreamOffsetSize = 8;
     40 // Number of bytes reserved to store payload length in stream frame.
     41 const size_t kQuicStreamPayloadLengthSize = 2;
     42 
     43 // Size in bytes of the entropy hash sent in ack frames.
     44 const size_t kQuicEntropyHashSize = 1;
     45 // Size in bytes reserved for the delta time of the largest observed
     46 // sequence number in ack frames.
     47 const size_t kQuicDeltaTimeLargestObservedSize = 4;
     48 // Size in bytes reserved for the number of missing packets in ack frames.
     49 const size_t kNumberOfMissingPacketsSize = 1;
     50 
     51 // This class receives callbacks from the framer when packets
     52 // are processed.
     53 class NET_EXPORT_PRIVATE QuicFramerVisitorInterface {
     54  public:
     55   virtual ~QuicFramerVisitorInterface() {}
     56 
     57   // Called if an error is detected in the QUIC protocol.
     58   virtual void OnError(QuicFramer* framer) = 0;
     59 
     60   // Called only when |is_server_| is true and the the framer gets a packet with
     61   // version flag true and the version on the packet doesn't match
     62   // |quic_version_|. The visitor should return true after it updates the
     63   // version of the |framer_| to |received_version| or false to stop processing
     64   // this packet.
     65   virtual bool OnProtocolVersionMismatch(QuicVersion received_version) = 0;
     66 
     67   // Called when a new packet has been received, before it
     68   // has been validated or processed.
     69   virtual void OnPacket() = 0;
     70 
     71   // Called when a public reset packet has been parsed but has not yet
     72   // been validated.
     73   virtual void OnPublicResetPacket(
     74       const QuicPublicResetPacket& packet) = 0;
     75 
     76   // Called only when |is_server_| is false and a version negotiation packet has
     77   // been parsed.
     78   virtual void OnVersionNegotiationPacket(
     79       const QuicVersionNegotiationPacket& packet) = 0;
     80 
     81   // Called when a lost packet has been recovered via FEC,
     82   // before it has been processed.
     83   virtual void OnRevivedPacket() = 0;
     84 
     85   // Called when the complete header of a packet had been parsed.
     86   // If OnPacketHeader returns false, framing for this packet will cease.
     87   virtual bool OnPacketHeader(const QuicPacketHeader& header) = 0;
     88 
     89   // Called when a data packet is parsed that is part of an FEC group.
     90   // |payload| is the non-encrypted FEC protected payload of the packet.
     91   virtual void OnFecProtectedPayload(base::StringPiece payload) = 0;
     92 
     93   // Called when a StreamFrame has been parsed.
     94   virtual bool OnStreamFrame(const QuicStreamFrame& frame) = 0;
     95 
     96   // Called when a AckFrame has been parsed.  If OnAckFrame returns false,
     97   // the framer will stop parsing the current packet.
     98   virtual bool OnAckFrame(const QuicAckFrame& frame) = 0;
     99 
    100   // Called when a CongestionFeedbackFrame has been parsed.
    101   virtual bool OnCongestionFeedbackFrame(
    102       const QuicCongestionFeedbackFrame& frame) = 0;
    103 
    104   // Called when a RstStreamFrame has been parsed.
    105   virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) = 0;
    106 
    107   // Called when a ConnectionCloseFrame has been parsed.
    108   virtual bool OnConnectionCloseFrame(
    109       const QuicConnectionCloseFrame& frame) = 0;
    110 
    111   // Called when a GoAwayFrame has been parsed.
    112   virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) = 0;
    113 
    114   // Called when FEC data has been parsed.
    115   virtual void OnFecData(const QuicFecData& fec) = 0;
    116 
    117   // Called when a packet has been completely processed.
    118   virtual void OnPacketComplete() = 0;
    119 };
    120 
    121 class NET_EXPORT_PRIVATE QuicFecBuilderInterface {
    122  public:
    123   virtual ~QuicFecBuilderInterface() {}
    124 
    125   // Called when a data packet is constructed that is part of an FEC group.
    126   // |payload| is the non-encrypted FEC protected payload of the packet.
    127   virtual void OnBuiltFecProtectedPayload(const QuicPacketHeader& header,
    128                                           base::StringPiece payload) = 0;
    129 };
    130 
    131 // This class calculates the received entropy of the ack packet being
    132 // framed, should it get truncated.
    133 class NET_EXPORT_PRIVATE QuicReceivedEntropyHashCalculatorInterface {
    134  public:
    135   virtual ~QuicReceivedEntropyHashCalculatorInterface() {}
    136 
    137   // When an ack frame gets truncated while being framed the received
    138   // entropy of the ack frame needs to be calculated since the some of the
    139   // missing packets are not added and the largest observed might be lowered.
    140   // This should return the received entropy hash of the packets received up to
    141   // and including |sequence_number|.
    142   virtual QuicPacketEntropyHash EntropyHash(
    143       QuicPacketSequenceNumber sequence_number) const = 0;
    144 };
    145 
    146 // Class for parsing and constructing QUIC packets.  It has a
    147 // QuicFramerVisitorInterface that is called when packets are parsed.
    148 // It also has a QuicFecBuilder that is called when packets are constructed
    149 // in order to generate FEC data for subsequently building FEC packets.
    150 class NET_EXPORT_PRIVATE QuicFramer {
    151  public:
    152   // Constructs a new framer that installs a kNULL QuicEncrypter and
    153   // QuicDecrypter for level ENCRYPTION_NONE.
    154   QuicFramer(QuicVersion quic_version,
    155              QuicTime creation_time,
    156              bool is_server);
    157 
    158   virtual ~QuicFramer();
    159 
    160   // Returns true if |version| is a supported protocol version.
    161   bool IsSupportedVersion(const QuicVersion version) const;
    162 
    163   // Calculates the largest observed packet to advertise in the case an Ack
    164   // Frame was truncated.  last_written in this case is the iterator for the
    165   // last missing packet which fit in the outgoing ack.
    166   static QuicPacketSequenceNumber CalculateLargestObserved(
    167       const SequenceNumberSet& missing_packets,
    168       SequenceNumberSet::const_iterator last_written);
    169 
    170   // Set callbacks to be called from the framer.  A visitor must be set, or
    171   // else the framer will likely crash.  It is acceptable for the visitor
    172   // to do nothing.  If this is called multiple times, only the last visitor
    173   // will be used.
    174   void set_visitor(QuicFramerVisitorInterface* visitor) {
    175     visitor_ = visitor;
    176   }
    177 
    178   // Set a builder to be called from the framer when building FEC protected
    179   // packets.  If this is called multiple times, only the last builder
    180   // will be used.  The builder need not be set.
    181   void set_fec_builder(QuicFecBuilderInterface* builder) {
    182     fec_builder_ = builder;
    183   }
    184 
    185   QuicVersion version() const {
    186     return quic_version_;
    187   }
    188 
    189   void set_version(const QuicVersion version) {
    190     DCHECK(IsSupportedVersion(version));
    191     quic_version_ = version;
    192   }
    193 
    194   // Does not DCHECK for supported version. Used by tests to set unsupported
    195   // version to trigger version negotiation.
    196   void set_version_for_tests(const QuicVersion version) {
    197     quic_version_ = version;
    198   }
    199 
    200   // Set entropy calculator to be called from the framer when it needs the
    201   // entropy of a truncated ack frame. An entropy calculator must be set or else
    202   // the framer will likely crash. If this is called multiple times, only the
    203   // last calculator will be used.
    204   void set_received_entropy_calculator(
    205       QuicReceivedEntropyHashCalculatorInterface* entropy_calculator) {
    206     entropy_calculator_ = entropy_calculator;
    207   }
    208 
    209   QuicErrorCode error() const {
    210     return error_;
    211   }
    212 
    213   // Pass a UDP packet into the framer for parsing.
    214   // Return true if the packet was processed succesfully. |packet| must be a
    215   // single, complete UDP packet (not a frame of a packet).  This packet
    216   // might be null padded past the end of the payload, which will be correctly
    217   // ignored.
    218   bool ProcessPacket(const QuicEncryptedPacket& packet);
    219 
    220   // Pass a data packet that was revived from FEC data into the framer
    221   // for parsing.
    222   // Return true if the packet was processed succesfully. |payload| must be
    223   // the complete DECRYPTED payload of the revived packet.
    224   bool ProcessRevivedPacket(QuicPacketHeader* header,
    225                             base::StringPiece payload);
    226 
    227   // Largest size in bytes of all stream frame fields without the payload.
    228   static size_t GetMinStreamFrameSize(QuicVersion version,
    229                                       QuicStreamId stream_id,
    230                                       QuicStreamOffset offset,
    231                                       bool last_frame_in_packet);
    232   // Size in bytes of all ack frame fields without the missing packets.
    233   static size_t GetMinAckFrameSize();
    234   // Size in bytes of all reset stream frame without the error details.
    235   static size_t GetMinRstStreamFrameSize();
    236   // Size in bytes of all connection close frame fields without the error
    237   // details and the missing packets from the enclosed ack frame.
    238   static size_t GetMinConnectionCloseFrameSize();
    239   // Size in bytes of all GoAway frame fields without the reason phrase.
    240   static size_t GetMinGoAwayFrameSize();
    241   // The maximum number of nacks which can be transmitted in a single ack packet
    242   // without exceeding kMaxPacketSize.
    243   static size_t GetMaxUnackedPackets(QuicPacketHeader header);
    244   // Size in bytes required to serialize the stream id.
    245   static size_t GetStreamIdSize(QuicStreamId stream_id);
    246   // Size in bytes required to serialize the stream offset.
    247   static size_t GetStreamOffsetSize(QuicStreamOffset offset);
    248   // Size in bytes required for a serialized version negotiation packet
    249   static size_t GetVersionNegotiationPacketSize(size_t number_versions);
    250 
    251 
    252   static bool CanTruncate(const QuicFrame& frame, size_t free_bytes);
    253 
    254   // Returns the number of bytes added to the packet for the specified frame,
    255   // and 0 if the frame doesn't fit.  Includes the header size for the first
    256   // frame.
    257   size_t GetSerializedFrameLength(
    258       const QuicFrame& frame, size_t free_bytes, bool first_frame);
    259 
    260   // Returns the associated data from the encrypted packet |encrypted| as a
    261   // stringpiece.
    262   static base::StringPiece GetAssociatedDataFromEncryptedPacket(
    263       const QuicEncryptedPacket& encrypted,
    264       QuicGuidLength guid_length,
    265       bool includes_version,
    266       QuicSequenceNumberLength sequence_number_length);
    267 
    268   // Returns a SerializedPacket whose |packet| member is owned by the caller,
    269   // and is populated with the fields in |header| and |frames|, or is NULL if
    270   // the packet could not be created.
    271   // TODO(ianswett): Used for testing only.
    272   SerializedPacket BuildUnsizedDataPacket(const QuicPacketHeader& header,
    273                                           const QuicFrames& frames);
    274 
    275   // Returns a SerializedPacket whose |packet| member is owned by the caller,
    276   // is created from the first |num_frames| frames, or is NULL if the packet
    277   // could not be created.  The packet must be of size |packet_size|.
    278   SerializedPacket BuildDataPacket(const QuicPacketHeader& header,
    279                                    const QuicFrames& frames,
    280                                    size_t packet_size);
    281 
    282   // Returns a SerializedPacket whose |packet| member is owned by the caller,
    283   // and is populated with the fields in |header| and |fec|, or is NULL if the
    284   // packet could not be created.
    285   SerializedPacket BuildFecPacket(const QuicPacketHeader& header,
    286                                   const QuicFecData& fec);
    287 
    288   // Returns a new public reset packet, owned by the caller.
    289   static QuicEncryptedPacket* BuildPublicResetPacket(
    290       const QuicPublicResetPacket& packet);
    291 
    292   QuicEncryptedPacket* BuildVersionNegotiationPacket(
    293       const QuicPacketPublicHeader& header,
    294       const QuicVersionVector& supported_versions);
    295 
    296   // SetDecrypter sets the primary decrypter, replacing any that already exists,
    297   // and takes ownership. If an alternative decrypter is in place then the
    298   // function DCHECKs. This is intended for cases where one knows that future
    299   // packets will be using the new decrypter and the previous decrypter is not
    300   // obsolete.
    301   void SetDecrypter(QuicDecrypter* decrypter);
    302 
    303   // SetAlternativeDecrypter sets a decrypter that may be used to decrypt
    304   // future packets and takes ownership of it. If |latch_once_used| is true,
    305   // then the first time that the decrypter is successful it will replace the
    306   // primary decrypter. Otherwise both decrypters will remain active and the
    307   // primary decrypter will be the one last used.
    308   void SetAlternativeDecrypter(QuicDecrypter* decrypter,
    309                                bool latch_once_used);
    310 
    311   const QuicDecrypter* decrypter() const;
    312   const QuicDecrypter* alternative_decrypter() const;
    313 
    314   // Changes the encrypter used for level |level| to |encrypter|. The function
    315   // takes ownership of |encrypter|.
    316   void SetEncrypter(EncryptionLevel level, QuicEncrypter* encrypter);
    317   const QuicEncrypter* encrypter(EncryptionLevel level) const;
    318 
    319   // SwapCryptersForTest exchanges the state of the crypters with |other|. To
    320   // be used in tests only.
    321   void SwapCryptersForTest(QuicFramer* other);
    322 
    323   // Returns a new encrypted packet, owned by the caller.
    324   QuicEncryptedPacket* EncryptPacket(EncryptionLevel level,
    325                                      QuicPacketSequenceNumber sequence_number,
    326                                      const QuicPacket& packet);
    327 
    328   // Returns the maximum length of plaintext that can be encrypted
    329   // to ciphertext no larger than |ciphertext_size|.
    330   size_t GetMaxPlaintextSize(size_t ciphertext_size);
    331 
    332   const std::string& detailed_error() { return detailed_error_; }
    333 
    334   // Read the full 8 byte guid from a packet header.
    335   // Return true on success, else false.
    336   static bool ReadGuidFromPacket(const QuicEncryptedPacket& packet,
    337                                  QuicGuid* guid);
    338 
    339  private:
    340   friend class test::QuicFramerPeer;
    341 
    342   QuicPacketEntropyHash GetPacketEntropyHash(
    343       const QuicPacketHeader& header) const;
    344 
    345   bool ProcessDataPacket(const QuicPacketPublicHeader& public_header,
    346                          const QuicEncryptedPacket& packet);
    347 
    348   bool ProcessPublicResetPacket(const QuicPacketPublicHeader& public_header);
    349 
    350   bool ProcessVersionNegotiationPacket(QuicPacketPublicHeader* public_header);
    351 
    352   bool WritePacketHeader(const QuicPacketHeader& header,
    353                          QuicDataWriter* writer);
    354 
    355   bool ProcessPublicHeader(QuicPacketPublicHeader* header);
    356 
    357   bool ProcessPacketHeader(QuicPacketHeader* header,
    358                            const QuicEncryptedPacket& packet);
    359 
    360   bool ProcessPacketSequenceNumber(
    361       QuicSequenceNumberLength sequence_number_length,
    362       QuicPacketSequenceNumber* sequence_number);
    363   bool ProcessFrameData();
    364   bool ProcessStreamFrame(uint8 frame_type, QuicStreamFrame* frame);
    365   bool ProcessAckFrame(QuicAckFrame* frame);
    366   bool ProcessReceivedInfo(ReceivedPacketInfo* received_info);
    367   bool ProcessSentInfo(SentPacketInfo* sent_info);
    368   bool ProcessQuicCongestionFeedbackFrame(
    369       QuicCongestionFeedbackFrame* congestion_feedback);
    370   bool ProcessRstStreamFrame(QuicRstStreamFrame* frame);
    371   bool ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame);
    372   bool ProcessGoAwayFrame(QuicGoAwayFrame* frame);
    373 
    374   bool DecryptPayload(const QuicPacketHeader& header,
    375                       const QuicEncryptedPacket& packet);
    376 
    377   // Returns the full packet sequence number from the truncated
    378   // wire format version and the last seen packet sequence number.
    379   QuicPacketSequenceNumber CalculatePacketSequenceNumberFromWire(
    380       QuicSequenceNumberLength sequence_number_length,
    381       QuicPacketSequenceNumber packet_sequence_number) const;
    382 
    383   // Computes the wire size in bytes of the payload of |frame|.
    384   size_t ComputeFrameLength(const QuicFrame& frame, bool last_frame_in_packet);
    385 
    386   static bool AppendPacketSequenceNumber(
    387       QuicSequenceNumberLength sequence_number_length,
    388       QuicPacketSequenceNumber packet_sequence_number,
    389       QuicDataWriter* writer);
    390 
    391   bool AppendTypeByte(const QuicFrame& frame,
    392                       bool last_frame_in_packet,
    393                       QuicDataWriter* writer);
    394   bool AppendStreamFramePayload(const QuicStreamFrame& frame,
    395                                 bool last_frame_in_packet,
    396                                 QuicDataWriter* builder);
    397   bool AppendAckFramePayload(const QuicAckFrame& frame,
    398                              QuicDataWriter* builder);
    399   bool AppendQuicCongestionFeedbackFramePayload(
    400       const QuicCongestionFeedbackFrame& frame,
    401       QuicDataWriter* builder);
    402   bool AppendRstStreamFramePayload(const QuicRstStreamFrame& frame,
    403                                    QuicDataWriter* builder);
    404   bool AppendConnectionCloseFramePayload(
    405       const QuicConnectionCloseFrame& frame,
    406       QuicDataWriter* builder);
    407   bool AppendGoAwayFramePayload(const QuicGoAwayFrame& frame,
    408                                 QuicDataWriter* writer);
    409   bool RaiseError(QuicErrorCode error);
    410 
    411   void set_error(QuicErrorCode error) {
    412     error_ = error;
    413   }
    414 
    415   void set_detailed_error(const char* error) {
    416     detailed_error_ = error;
    417   }
    418 
    419   std::string detailed_error_;
    420   scoped_ptr<QuicDataReader> reader_;
    421   QuicFramerVisitorInterface* visitor_;
    422   QuicFecBuilderInterface* fec_builder_;
    423   QuicReceivedEntropyHashCalculatorInterface* entropy_calculator_;
    424   QuicErrorCode error_;
    425   // Updated by ProcessPacketHeader when it succeeds.
    426   QuicPacketSequenceNumber last_sequence_number_;
    427   // Updated by WritePacketHeader.
    428   QuicGuid last_serialized_guid_;
    429   // Buffer containing decrypted payload data during parsing.
    430   scoped_ptr<QuicData> decrypted_;
    431   // Version of the protocol being used.
    432   QuicVersion quic_version_;
    433   // Primary decrypter used to decrypt packets during parsing.
    434   scoped_ptr<QuicDecrypter> decrypter_;
    435   // Alternative decrypter that can also be used to decrypt packets.
    436   scoped_ptr<QuicDecrypter> alternative_decrypter_;
    437   // alternative_decrypter_latch_is true if, when |alternative_decrypter_|
    438   // successfully decrypts a packet, we should install it as the only
    439   // decrypter.
    440   bool alternative_decrypter_latch_;
    441   // Encrypters used to encrypt packets via EncryptPacket().
    442   scoped_ptr<QuicEncrypter> encrypter_[NUM_ENCRYPTION_LEVELS];
    443   // Tracks if the framer is being used by the entity that received the
    444   // connection or the entity that initiated it.
    445   bool is_server_;
    446   // The time this frames was created.  Time written to the wire will be
    447   // written as a delta from this value.
    448   QuicTime creation_time_;
    449 
    450   DISALLOW_COPY_AND_ASSIGN(QuicFramer);
    451 };
    452 
    453 }  // namespace net
    454 
    455 #endif  // NET_QUIC_QUIC_FRAMER_H_
    456