| 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 // Accumulates frames for the next packet until more frames no longer fit or | 5 // Accumulates frames for the next packet until more frames no longer fit or |
| 6 // it's time to create a packet from them. Also provides packet creation of | 6 // it's time to create a packet from them. If multipath enabled, only creates |
| 7 // FEC packets based on previously created packets. If multipath enabled, only | 7 // packets on one path at the same time. Currently, next packet number is |
| 8 // creates packets on one path at the same time. Currently, next packet number | 8 // tracked per-path. |
| 9 // is tracked per-path. | |
| 10 | 9 |
| 11 #ifndef NET_QUIC_QUIC_PACKET_CREATOR_H_ | 10 #ifndef NET_QUIC_QUIC_PACKET_CREATOR_H_ |
| 12 #define NET_QUIC_QUIC_PACKET_CREATOR_H_ | 11 #define NET_QUIC_QUIC_PACKET_CREATOR_H_ |
| 13 | 12 |
| 14 #include <stddef.h> | 13 #include <stddef.h> |
| 15 | 14 |
| 16 #include <string> | 15 #include <string> |
| 17 #include <unordered_map> | 16 #include <unordered_map> |
| 18 #include <utility> | 17 #include <utility> |
| 19 #include <vector> | 18 #include <vector> |
| 20 | 19 |
| 21 #include "base/macros.h" | 20 #include "base/macros.h" |
| 22 #include "base/memory/scoped_ptr.h" | 21 #include "base/memory/scoped_ptr.h" |
| 23 #include "base/strings/string_piece.h" | 22 #include "base/strings/string_piece.h" |
| 24 #include "net/quic/quic_fec_group.h" | |
| 25 #include "net/quic/quic_framer.h" | 23 #include "net/quic/quic_framer.h" |
| 26 #include "net/quic/quic_protocol.h" | 24 #include "net/quic/quic_protocol.h" |
| 27 | 25 |
| 28 using base::hash_map; | 26 using base::hash_map; |
| 29 | 27 |
| 30 namespace net { | 28 namespace net { |
| 31 namespace test { | 29 namespace test { |
| 32 class QuicPacketCreatorPeer; | 30 class QuicPacketCreatorPeer; |
| 33 } | 31 } |
| 34 | 32 |
| 35 class QuicRandom; | 33 class QuicRandom; |
| 36 class QuicRandomBoolSource; | 34 class QuicRandomBoolSource; |
| 37 | 35 |
| 38 class NET_EXPORT_PRIVATE QuicPacketCreator { | 36 class NET_EXPORT_PRIVATE QuicPacketCreator { |
| 39 public: | 37 public: |
| 40 // A delegate interface for further processing serialized packet. | 38 // A delegate interface for further processing serialized packet. |
| 41 class NET_EXPORT_PRIVATE DelegateInterface { | 39 class NET_EXPORT_PRIVATE DelegateInterface { |
| 42 public: | 40 public: |
| 43 virtual ~DelegateInterface() {} | 41 virtual ~DelegateInterface() {} |
| 44 // Called when a packet is serialized. Delegate does not take the ownership | 42 // Called when a packet is serialized. Delegate does not take the ownership |
| 45 // of |serialized_packet|, but may take ownership of |packet.packet| | 43 // of |serialized_packet|, but may take ownership of |packet.packet| |
| 46 // and |packet.retransmittable_frames|. If it does so, they must be set | 44 // and |packet.retransmittable_frames|. If it does so, they must be set |
| 47 // to nullptr. | 45 // to nullptr. |
| 48 virtual void OnSerializedPacket(SerializedPacket* serialized_packet) = 0; | 46 virtual void OnSerializedPacket(SerializedPacket* serialized_packet) = 0; |
| 49 | 47 |
| 50 // Called when an unrecoverable error is encountered. | 48 // Called when an unrecoverable error is encountered. |
| 51 virtual void OnUnrecoverableError(QuicErrorCode error, | 49 virtual void OnUnrecoverableError(QuicErrorCode error, |
| 52 ConnectionCloseSource source) = 0; | 50 ConnectionCloseSource source) = 0; |
| 53 | |
| 54 // Called when current FEC group is reset (closed). | |
| 55 virtual void OnResetFecGroup() = 0; | |
| 56 }; | 51 }; |
| 57 | 52 |
| 58 // Interface which gets callbacks from the QuicPacketCreator at interesting | 53 // Interface which gets callbacks from the QuicPacketCreator at interesting |
| 59 // points. Implementations must not mutate the state of the creator | 54 // points. Implementations must not mutate the state of the creator |
| 60 // as a result of these callbacks. | 55 // as a result of these callbacks. |
| 61 class NET_EXPORT_PRIVATE DebugDelegate { | 56 class NET_EXPORT_PRIVATE DebugDelegate { |
| 62 public: | 57 public: |
| 63 virtual ~DebugDelegate() {} | 58 virtual ~DebugDelegate() {} |
| 64 | 59 |
| 65 // Called when a frame has been added to the current packet. | 60 // Called when a frame has been added to the current packet. |
| 66 virtual void OnFrameAddedToPacket(const QuicFrame& frame) {} | 61 virtual void OnFrameAddedToPacket(const QuicFrame& frame) {} |
| 67 }; | 62 }; |
| 68 | 63 |
| 69 // QuicRandom* required for packet entropy. | 64 // QuicRandom* required for packet entropy. |
| 70 QuicPacketCreator(QuicConnectionId connection_id, | 65 QuicPacketCreator(QuicConnectionId connection_id, |
| 71 QuicFramer* framer, | 66 QuicFramer* framer, |
| 72 QuicRandom* random_generator, | 67 QuicRandom* random_generator, |
| 73 QuicBufferAllocator* buffer_allocator, | 68 QuicBufferAllocator* buffer_allocator, |
| 74 DelegateInterface* delegate); | 69 DelegateInterface* delegate); |
| 75 | 70 |
| 76 ~QuicPacketCreator(); | 71 ~QuicPacketCreator(); |
| 77 | 72 |
| 78 // Checks if it's time to send an FEC packet. |force_close| forces this to | |
| 79 // return true if an FEC group is open. | |
| 80 bool ShouldSendFec(bool force_close) const; | |
| 81 | |
| 82 // If ShouldSendFec returns true, serializes currently constructed FEC packet | |
| 83 // and calls the delegate on the packet. Resets current FEC group if FEC | |
| 84 // protection policy is FEC_ALARM_TRIGGER but |is_fec_timeout| is false. | |
| 85 // Also tries to turn off FEC protection if should_fec_protect_next_packet is | |
| 86 // false. | |
| 87 void MaybeSendFecPacketAndCloseGroup(bool force_send_fec, | |
| 88 bool is_fec_timeout); | |
| 89 | |
| 90 // Returns true if an FEC packet is under construction. | |
| 91 bool IsFecGroupOpen() const; | |
| 92 | |
| 93 // Called after sending |packet_number| to determine whether an FEC alarm | |
| 94 // should be set for sending out an FEC packet. Returns a positive and finite | |
| 95 // timeout if an FEC alarm should be set, and infinite if no alarm should be | |
| 96 // set. | |
| 97 QuicTime::Delta GetFecTimeout(QuicPacketNumber packet_number); | |
| 98 | |
| 99 // Makes the framer not serialize the protocol version in sent packets. | 73 // Makes the framer not serialize the protocol version in sent packets. |
| 100 void StopSendingVersion(); | 74 void StopSendingVersion(); |
| 101 | 75 |
| 102 // Update the packet number length to use in future packets as soon as it | 76 // Update the packet number length to use in future packets as soon as it |
| 103 // can be safely changed. | 77 // can be safely changed. |
| 104 // TODO(fayang): Directly set packet number length instead of compute it in | 78 // TODO(fayang): Directly set packet number length instead of compute it in |
| 105 // creator. | 79 // creator. |
| 106 void UpdatePacketNumberLength(QuicPacketNumber least_packet_awaited_by_peer, | 80 void UpdatePacketNumberLength(QuicPacketNumber least_packet_awaited_by_peer, |
| 107 QuicPacketCount max_packets_in_flight); | 81 QuicPacketCount max_packets_in_flight); |
| 108 | 82 |
| 109 // The overhead the framing will add for a packet with one frame. | 83 // The overhead the framing will add for a packet with one frame. |
| 110 static size_t StreamFramePacketOverhead( | 84 static size_t StreamFramePacketOverhead( |
| 111 QuicConnectionIdLength connection_id_length, | 85 QuicConnectionIdLength connection_id_length, |
| 112 bool include_version, | 86 bool include_version, |
| 113 bool include_path_id, | 87 bool include_path_id, |
| 114 QuicPacketNumberLength packet_number_length, | 88 QuicPacketNumberLength packet_number_length, |
| 115 QuicStreamOffset offset, | 89 QuicStreamOffset offset, |
| 116 InFecGroup is_in_fec_group); | 90 InFecGroup is_in_fec_group); |
| 117 | 91 |
| 118 // Returns false and flushes all pending frames if current open packet is | 92 // Returns false and flushes all pending frames if current open packet is |
| 119 // full. | 93 // full. |
| 120 // If current packet is not full, converts a raw payload into a stream frame | 94 // If current packet is not full, converts a raw payload into a stream frame |
| 121 // that fits into the open packet and adds it to the packet. | 95 // that fits into the open packet and adds it to the packet. |
| 122 // The payload begins at |iov_offset| into the |iov|. | 96 // The payload begins at |iov_offset| into the |iov|. |
| 123 // Also tries to start FEC protection depends on |fec_protection|. | |
| 124 bool ConsumeData(QuicStreamId id, | 97 bool ConsumeData(QuicStreamId id, |
| 125 QuicIOVector iov, | 98 QuicIOVector iov, |
| 126 size_t iov_offset, | 99 size_t iov_offset, |
| 127 QuicStreamOffset offset, | 100 QuicStreamOffset offset, |
| 128 bool fin, | 101 bool fin, |
| 129 bool needs_padding, | 102 bool needs_padding, |
| 130 QuicFrame* frame, | 103 QuicFrame* frame); |
| 131 FecProtection fec_protection); | |
| 132 | 104 |
| 133 // Returns true if current open packet can accommodate more stream frames of | 105 // Returns true if current open packet can accommodate more stream frames of |
| 134 // stream |id| at |offset|, false otherwise. | 106 // stream |id| at |offset|, false otherwise. |
| 135 bool HasRoomForStreamFrame(QuicStreamId id, QuicStreamOffset offset); | 107 bool HasRoomForStreamFrame(QuicStreamId id, QuicStreamOffset offset); |
| 136 | 108 |
| 137 // Re-serializes frames with the original packet's packet number length. | 109 // Re-serializes frames with the original packet's packet number length. |
| 138 // Used for retransmitting packets to ensure they aren't too long. | 110 // Used for retransmitting packets to ensure they aren't too long. |
| 139 // Caller must ensure that any open FEC group is closed before calling this | |
| 140 // method. | |
| 141 void ReserializeAllFrames(const PendingRetransmission& retransmission, | 111 void ReserializeAllFrames(const PendingRetransmission& retransmission, |
| 142 char* buffer, | 112 char* buffer, |
| 143 size_t buffer_len); | 113 size_t buffer_len); |
| 144 | 114 |
| 145 // Serializes all added frames into a single packet and invokes the delegate_ | 115 // Serializes all added frames into a single packet and invokes the delegate_ |
| 146 // to further process the SerializedPacket. | 116 // to further process the SerializedPacket. |
| 147 void Flush(); | 117 void Flush(); |
| 148 | 118 |
| 149 // Returns true if there are frames pending to be serialized. | 119 // Returns true if there are frames pending to be serialized. |
| 150 bool HasPendingFrames() const; | 120 bool HasPendingFrames() const; |
| 151 | 121 |
| 152 // Returns true if there are retransmittable frames pending to be serialized. | 122 // Returns true if there are retransmittable frames pending to be serialized. |
| 153 bool HasPendingRetransmittableFrames() const; | 123 bool HasPendingRetransmittableFrames() const; |
| 154 | 124 |
| 155 // Returns the number of bytes which are available to be used by additional | 125 // Returns the number of bytes which are available to be used by additional |
| 156 // frames in the packet. Since stream frames are slightly smaller when they | 126 // frames in the packet. Since stream frames are slightly smaller when they |
| 157 // are the last frame in a packet, this method will return a different | 127 // are the last frame in a packet, this method will return a different |
| 158 // value than max_packet_size - PacketSize(), in this case. | 128 // value than max_packet_size - PacketSize(), in this case. |
| 159 size_t BytesFree(); | 129 size_t BytesFree(); |
| 160 | 130 |
| 161 // Returns the number of bytes that the packet will expand by if a new frame | 131 // Returns the number of bytes that the packet will expand by if a new frame |
| 162 // is added to the packet. If the last frame was a stream frame, it will | 132 // is added to the packet. If the last frame was a stream frame, it will |
| 163 // expand slightly when a new frame is added, and this method returns the | 133 // expand slightly when a new frame is added, and this method returns the |
| 164 // amount of expected expansion. If the packet is in an FEC group, no | 134 // amount of expected expansion. |
| 165 // expansion happens and this method always returns zero. | |
| 166 size_t ExpansionOnNewFrame() const; | 135 size_t ExpansionOnNewFrame() const; |
| 167 | 136 |
| 168 // Returns the number of bytes in the current packet, including the header, | 137 // Returns the number of bytes in the current packet, including the header, |
| 169 // if serialized with the current frames. Adding a frame to the packet | 138 // if serialized with the current frames. Adding a frame to the packet |
| 170 // may change the serialized length of existing frames, as per the comment | 139 // may change the serialized length of existing frames, as per the comment |
| 171 // in BytesFree. | 140 // in BytesFree. |
| 172 size_t PacketSize(); | 141 size_t PacketSize(); |
| 173 | 142 |
| 174 // Tries to add |frame| to the packet creator's list of frames to be | 143 // Tries to add |frame| to the packet creator's list of frames to be |
| 175 // serialized. If the frame does not fit into the current packet, flushes the | 144 // serialized. If the frame does not fit into the current packet, flushes the |
| (...skipping 11 matching lines...) Expand all Loading... |
| 187 // Creates a version negotiation packet which supports |supported_versions|. | 156 // Creates a version negotiation packet which supports |supported_versions|. |
| 188 // Caller owns the created packet. Also, sets the entropy hash of the | 157 // Caller owns the created packet. Also, sets the entropy hash of the |
| 189 // serialized packet to a random bool and returns that value as a member of | 158 // serialized packet to a random bool and returns that value as a member of |
| 190 // SerializedPacket. | 159 // SerializedPacket. |
| 191 QuicEncryptedPacket* SerializeVersionNegotiationPacket( | 160 QuicEncryptedPacket* SerializeVersionNegotiationPacket( |
| 192 const QuicVersionVector& supported_versions); | 161 const QuicVersionVector& supported_versions); |
| 193 | 162 |
| 194 // Returns a dummy packet that is valid but contains no useful information. | 163 // Returns a dummy packet that is valid but contains no useful information. |
| 195 static SerializedPacket NoPacket(); | 164 static SerializedPacket NoPacket(); |
| 196 | 165 |
| 197 // Called when the congestion window has changed. | |
| 198 void OnCongestionWindowChange(QuicPacketCount max_packets_in_flight); | |
| 199 | |
| 200 // Called when the RTT may have changed. | |
| 201 void OnRttChange(QuicTime::Delta rtt); | |
| 202 | |
| 203 // Sets the encryption level that will be applied to new packets. | 166 // Sets the encryption level that will be applied to new packets. |
| 204 void set_encryption_level(EncryptionLevel level) { | 167 void set_encryption_level(EncryptionLevel level) { |
| 205 packet_.encryption_level = level; | 168 packet_.encryption_level = level; |
| 206 } | 169 } |
| 207 | 170 |
| 208 // packet number of the last created packet, or 0 if no packets have been | 171 // packet number of the last created packet, or 0 if no packets have been |
| 209 // created. | 172 // created. |
| 210 QuicPacketNumber packet_number() const { return packet_.packet_number; } | 173 QuicPacketNumber packet_number() const { return packet_.packet_number; } |
| 211 | 174 |
| 212 QuicConnectionIdLength connection_id_length() const { | 175 QuicConnectionIdLength connection_id_length() const { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 229 | 192 |
| 230 // Indicates whether the packet creator is in a state where it can change | 193 // Indicates whether the packet creator is in a state where it can change |
| 231 // current maximum packet length. | 194 // current maximum packet length. |
| 232 bool CanSetMaxPacketLength() const; | 195 bool CanSetMaxPacketLength() const; |
| 233 | 196 |
| 234 // Sets the maximum packet length. | 197 // Sets the maximum packet length. |
| 235 void SetMaxPacketLength(QuicByteCount length); | 198 void SetMaxPacketLength(QuicByteCount length); |
| 236 | 199 |
| 237 // Sets the path on which subsequent packets will be created. It is the | 200 // Sets the path on which subsequent packets will be created. It is the |
| 238 // caller's responsibility to guarantee no packet is under construction before | 201 // caller's responsibility to guarantee no packet is under construction before |
| 239 // calling this function. If |path_id| is different from current_path_, the | 202 // calling this function. If |path_id| is different from current_path_, |
| 240 // FEC packet (if exists) will be sent and next_packet_number_length_ is | 203 // next_packet_number_length_ is recalculated. |
| 241 // recalculated. | |
| 242 void SetCurrentPath(QuicPathId path_id, | 204 void SetCurrentPath(QuicPathId path_id, |
| 243 QuicPacketNumber least_packet_awaited_by_peer, | 205 QuicPacketNumber least_packet_awaited_by_peer, |
| 244 QuicPacketCount max_packets_in_flight); | 206 QuicPacketCount max_packets_in_flight); |
| 245 | 207 |
| 246 // Returns current max number of packets covered by an FEC group. | |
| 247 size_t max_packets_per_fec_group() const { | |
| 248 return max_packets_per_fec_group_; | |
| 249 } | |
| 250 | |
| 251 // Sets creator's max number of packets covered by an FEC group. | |
| 252 // Note: While there are no constraints on |max_packets_per_fec_group|, | |
| 253 // this setter enforces a min value of kLowestMaxPacketsPerFecGroup. | |
| 254 // To turn off FEC protection, use StopFecProtectingPackets(). | |
| 255 void set_max_packets_per_fec_group(size_t max_packets_per_fec_group); | |
| 256 | |
| 257 FecSendPolicy fec_send_policy() { return fec_send_policy_; } | |
| 258 | |
| 259 void set_fec_send_policy(FecSendPolicy fec_send_policy) { | |
| 260 fec_send_policy_ = fec_send_policy; | |
| 261 } | |
| 262 | |
| 263 void set_rtt_multiplier_for_fec_timeout( | |
| 264 float rtt_multiplier_for_fec_timeout) { | |
| 265 rtt_multiplier_for_fec_timeout_ = rtt_multiplier_for_fec_timeout; | |
| 266 } | |
| 267 | |
| 268 void set_debug_delegate(DebugDelegate* debug_delegate) { | 208 void set_debug_delegate(DebugDelegate* debug_delegate) { |
| 269 debug_delegate_ = debug_delegate; | 209 debug_delegate_ = debug_delegate; |
| 270 } | 210 } |
| 271 | 211 |
| 272 private: | 212 private: |
| 273 friend class test::QuicPacketCreatorPeer; | 213 friend class test::QuicPacketCreatorPeer; |
| 274 | 214 |
| 275 static bool ShouldRetransmit(const QuicFrame& frame); | 215 static bool ShouldRetransmit(const QuicFrame& frame); |
| 276 | 216 |
| 277 // Converts a raw payload to a frame which fits into the current open | 217 // Converts a raw payload to a frame which fits into the current open |
| (...skipping 10 matching lines...) Expand all Loading... |
| 288 QuicFrame* frame); | 228 QuicFrame* frame); |
| 289 | 229 |
| 290 // Copies |length| bytes from iov starting at offset |iov_offset| into buffer. | 230 // Copies |length| bytes from iov starting at offset |iov_offset| into buffer. |
| 291 // |iov| must be at least iov_offset+length total length and buffer must be | 231 // |iov| must be at least iov_offset+length total length and buffer must be |
| 292 // at least |length| long. | 232 // at least |length| long. |
| 293 static void CopyToBuffer(QuicIOVector iov, | 233 static void CopyToBuffer(QuicIOVector iov, |
| 294 size_t iov_offset, | 234 size_t iov_offset, |
| 295 size_t length, | 235 size_t length, |
| 296 char* buffer); | 236 char* buffer); |
| 297 | 237 |
| 298 // Updates lengths and also starts an FEC group if FEC protection is on and | 238 // Updates packet number length on packet boundary. |
| 299 // there is not already an FEC group open. | 239 void MaybeUpdatePacketNumberLength(); |
| 300 InFecGroup MaybeUpdateLengthsAndStartFec(); | |
| 301 | 240 |
| 302 // Called when a data packet is constructed that is part of an FEC group. | 241 void FillPacketHeader(QuicPacketHeader* header); |
| 303 // |payload| is the non-encrypted FEC protected payload of the packet. | |
| 304 void OnBuiltFecProtectedPayload(const QuicPacketHeader& header, | |
| 305 base::StringPiece payload); | |
| 306 | |
| 307 void FillPacketHeader(QuicFecGroupNumber fec_group, | |
| 308 bool fec_flag, | |
| 309 QuicPacketHeader* header); | |
| 310 | 242 |
| 311 // Adds a |frame| if there is space and returns false and flushes all pending | 243 // Adds a |frame| if there is space and returns false and flushes all pending |
| 312 // frames if there isn't room. If |save_retransmittable_frames| is true, | 244 // frames if there isn't room. If |save_retransmittable_frames| is true, |
| 313 // saves the |frame| in the next SerializedPacket. | 245 // saves the |frame| in the next SerializedPacket. |
| 314 bool AddFrame(const QuicFrame& frame, bool save_retransmittable_frames); | 246 bool AddFrame(const QuicFrame& frame, bool save_retransmittable_frames); |
| 315 | 247 |
| 316 // Adds a padding frame to the current packet only if the current packet | 248 // Adds a padding frame to the current packet only if the current packet |
| 317 // contains a handshake message, and there is sufficient room to fit a | 249 // contains a handshake message, and there is sufficient room to fit a |
| 318 // padding frame. | 250 // padding frame. |
| 319 void MaybeAddPadding(); | 251 void MaybeAddPadding(); |
| 320 | 252 |
| 321 // Serializes all frames which have been added and adds any which should be | 253 // Serializes all frames which have been added and adds any which should be |
| 322 // retransmitted to packet_.retransmittable_frames. All frames must fit into | 254 // retransmitted to packet_.retransmittable_frames. All frames must fit into |
| 323 // a single packet. Sets the entropy hash of the serialized packet to a | 255 // a single packet. Sets the entropy hash of the serialized packet to a |
| 324 // random bool. | 256 // random bool. |
| 325 // Fails if |buffer_len| isn't long enough for the encrypted packet. | 257 // Fails if |buffer_len| isn't long enough for the encrypted packet. |
| 326 void SerializePacket(char* encrypted_buffer, size_t buffer_len); | 258 void SerializePacket(char* encrypted_buffer, size_t buffer_len); |
| 327 | 259 |
| 328 // Called after a new SerialiedPacket is created to call the delegate's | 260 // Called after a new SerialiedPacket is created to call the delegate's |
| 329 // OnSerializedPacket, reset state, and potentially flush FEC groups. | 261 // OnSerializedPacket and reset state. |
| 330 void OnSerializedPacket(); | 262 void OnSerializedPacket(); |
| 331 | 263 |
| 332 // Clears all fields of packet_ that should be cleared between serializations. | 264 // Clears all fields of packet_ that should be cleared between serializations. |
| 333 void ClearPacket(); | 265 void ClearPacket(); |
| 334 | 266 |
| 335 // Turn on FEC protection for subsequent packets. If no FEC group is currently | |
| 336 // open, this method flushes current open packet and then turns FEC on. | |
| 337 void MaybeStartFecProtection(); | |
| 338 | |
| 339 // Turn on FEC protection for subsequently created packets. FEC should be | |
| 340 // enabled first (max_packets_per_fec_group should be non-zero) for FEC | |
| 341 // protection to start. | |
| 342 void StartFecProtectingPackets(); | |
| 343 | |
| 344 // Turn off FEC protection for subsequently created packets. If the creator | |
| 345 // has any open FEC group, call will fail. It is the caller's responsibility | |
| 346 // to flush out FEC packets in generation, and to verify with ShouldSendFec() | |
| 347 // that there is no open FEC group. | |
| 348 void StopFecProtectingPackets(); | |
| 349 | |
| 350 // Resets (closes) the FEC group. This method should only be called on a | |
| 351 // packet boundary. | |
| 352 void ResetFecGroup(); | |
| 353 | |
| 354 // Packetize FEC data. Sets the entropy hash of the serialized packet to a | |
| 355 // random bool. | |
| 356 // Fails if |buffer_len| isn't long enough for the encrypted packet. | |
| 357 void SerializeFec(char* buffer, size_t buffer_len); | |
| 358 | |
| 359 // Does not own these delegates or the framer. | 267 // Does not own these delegates or the framer. |
| 360 DelegateInterface* delegate_; | 268 DelegateInterface* delegate_; |
| 361 DebugDelegate* debug_delegate_; | 269 DebugDelegate* debug_delegate_; |
| 362 QuicFramer* framer_; | 270 QuicFramer* framer_; |
| 363 | 271 |
| 364 scoped_ptr<QuicRandomBoolSource> random_bool_source_; | 272 scoped_ptr<QuicRandomBoolSource> random_bool_source_; |
| 365 QuicBufferAllocator* const buffer_allocator_; | 273 QuicBufferAllocator* const buffer_allocator_; |
| 366 | 274 |
| 367 // Controls whether version should be included while serializing the packet. | 275 // Controls whether version should be included while serializing the packet. |
| 368 bool send_version_in_packet_; | 276 bool send_version_in_packet_; |
| 369 // Controls whether path id should be included while serializing the packet. | 277 // Controls whether path id should be included while serializing the packet. |
| 370 bool send_path_id_in_packet_; | 278 bool send_path_id_in_packet_; |
| 371 // Staging variable to hold next packet number length. When sequence | 279 // Staging variable to hold next packet number length. When sequence |
| 372 // number length is to be changed, this variable holds the new length until | 280 // number length is to be changed, this variable holds the new length until |
| 373 // a packet or FEC group boundary, when the creator's packet_number_length_ | 281 // a packet boundary, when the creator's packet_number_length_ can be changed |
| 374 // can be changed to this new value. | 282 // to this new value. |
| 375 QuicPacketNumberLength next_packet_number_length_; | 283 QuicPacketNumberLength next_packet_number_length_; |
| 376 // Maximum length including headers and encryption (UDP payload length.) | 284 // Maximum length including headers and encryption (UDP payload length.) |
| 377 QuicByteCount max_packet_length_; | 285 QuicByteCount max_packet_length_; |
| 378 size_t max_plaintext_size_; | 286 size_t max_plaintext_size_; |
| 379 // Length of connection_id to send over the wire. | 287 // Length of connection_id to send over the wire. |
| 380 QuicConnectionIdLength connection_id_length_; | 288 QuicConnectionIdLength connection_id_length_; |
| 381 | 289 |
| 382 // Frames to be added to the next SerializedPacket | 290 // Frames to be added to the next SerializedPacket |
| 383 QuicFrames queued_frames_; | 291 QuicFrames queued_frames_; |
| 384 | 292 |
| 385 // packet_size should never be read directly, use PacketSize() instead. | 293 // packet_size should never be read directly, use PacketSize() instead. |
| 386 // TODO(ianswett): Move packet_size_ into SerializedPacket once | 294 // TODO(ianswett): Move packet_size_ into SerializedPacket once |
| 387 // QuicEncryptedPacket has been flattened into SerializedPacket. | 295 // QuicEncryptedPacket has been flattened into SerializedPacket. |
| 388 size_t packet_size_; | 296 size_t packet_size_; |
| 389 QuicConnectionId connection_id_; | 297 QuicConnectionId connection_id_; |
| 390 | 298 |
| 391 // Packet used to invoke OnSerializedPacket. | 299 // Packet used to invoke OnSerializedPacket. |
| 392 SerializedPacket packet_; | 300 SerializedPacket packet_; |
| 393 | 301 |
| 394 // Map mapping path_id to last sent packet number on the path. | 302 // Map mapping path_id to last sent packet number on the path. |
| 395 std::unordered_map<QuicPathId, QuicPacketNumber> multipath_packet_number_; | 303 std::unordered_map<QuicPathId, QuicPacketNumber> multipath_packet_number_; |
| 396 | 304 |
| 397 // FEC related fields. | |
| 398 // True when creator is requested to turn on FEC protection. False otherwise. | |
| 399 // There is a time difference between should_fec_protect_next_packet_ is | |
| 400 // true/false and FEC is actually turned on/off (e.g., The creator may have an | |
| 401 // open FEC group even if this variable is false). | |
| 402 bool should_fec_protect_next_packet_; | |
| 403 // If true, any created packets will be FEC protected. | |
| 404 // TODO(fayang): Combine should_fec_protect_next_packet and fec_protect_ to | |
| 405 // one variable. | |
| 406 bool fec_protect_; | |
| 407 scoped_ptr<QuicFecGroup> fec_group_; | |
| 408 // 0 indicates FEC is disabled. | |
| 409 size_t max_packets_per_fec_group_; | |
| 410 // FEC policy that specifies when to send FEC packet. | |
| 411 FecSendPolicy fec_send_policy_; | |
| 412 // Timeout used for FEC alarm. Can be set to zero initially or if the SRTT has | |
| 413 // not yet been set. | |
| 414 QuicTime::Delta fec_timeout_; | |
| 415 // The multiplication factor for FEC timeout based on RTT. | |
| 416 // TODO(rtenneti): Delete this code after the 0.25 RTT FEC experiment. | |
| 417 float rtt_multiplier_for_fec_timeout_; | |
| 418 | |
| 419 DISALLOW_COPY_AND_ASSIGN(QuicPacketCreator); | 305 DISALLOW_COPY_AND_ASSIGN(QuicPacketCreator); |
| 420 }; | 306 }; |
| 421 | 307 |
| 422 } // namespace net | 308 } // namespace net |
| 423 | 309 |
| 424 #endif // NET_QUIC_QUIC_PACKET_CREATOR_H_ | 310 #endif // NET_QUIC_QUIC_PACKET_CREATOR_H_ |
| OLD | NEW |