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

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

Issue 2516033003: Landing Recent QUIC changes until Mon Nov 14 04:43:50 2016 +0000 (Closed)
Patch Set: Remove unused UpdatePacketGapSentHistogram() function. 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
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 // 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. If multipath enabled, only creates 6 // it's time to create a packet from them. If multipath enabled, only creates
7 // packets on one path at the same time. Currently, next packet number is 7 // packets on one path at the same time. Currently, next packet number is
8 // tracked per-path. 8 // tracked per-path.
9 9
10 #ifndef NET_QUIC_QUIC_PACKET_CREATOR_H_ 10 #ifndef NET_QUIC_QUIC_PACKET_CREATOR_H_
11 #define NET_QUIC_QUIC_PACKET_CREATOR_H_ 11 #define NET_QUIC_QUIC_PACKET_CREATOR_H_
12 12
13 #include <stddef.h> 13 #include <stddef.h>
14 14
15 #include <memory> 15 #include <memory>
16 #include <string> 16 #include <string>
17 #include <unordered_map> 17 #include <unordered_map>
18 #include <utility> 18 #include <utility>
19 #include <vector> 19 #include <vector>
20 20
21 #include "base/macros.h" 21 #include "base/macros.h"
22 #include "base/strings/string_piece.h" 22 #include "base/strings/string_piece.h"
23 #include "net/base/net_export.h" 23 #include "net/base/net_export.h"
24 #include "net/quic/core/quic_framer.h" 24 #include "net/quic/core/quic_framer.h"
25 #include "net/quic/core/quic_iovector.h"
25 #include "net/quic/core/quic_protocol.h" 26 #include "net/quic/core/quic_protocol.h"
26 27
27 namespace net { 28 namespace net {
28 namespace test { 29 namespace test {
29 class QuicPacketCreatorPeer; 30 class QuicPacketCreatorPeer;
30 } 31 }
31 32
32 class QuicRandom;
33
34 class NET_EXPORT_PRIVATE QuicPacketCreator { 33 class NET_EXPORT_PRIVATE QuicPacketCreator {
35 public: 34 public:
36 // A delegate interface for further processing serialized packet. 35 // A delegate interface for further processing serialized packet.
37 class NET_EXPORT_PRIVATE DelegateInterface 36 class NET_EXPORT_PRIVATE DelegateInterface
38 : public QuicConnectionCloseDelegateInterface { 37 : public QuicConnectionCloseDelegateInterface {
39 public: 38 public:
40 ~DelegateInterface() override {} 39 ~DelegateInterface() override {}
41 // Called when a packet is serialized. Delegate does not take the ownership 40 // Called when a packet is serialized. Delegate does not take the ownership
42 // of |serialized_packet|, but takes ownership of any frames it removes 41 // of |serialized_packet|, but takes ownership of any frames it removes
43 // from |packet.retransmittable_frames|. 42 // from |packet.retransmittable_frames|.
44 virtual void OnSerializedPacket(SerializedPacket* serialized_packet) = 0; 43 virtual void OnSerializedPacket(SerializedPacket* serialized_packet) = 0;
45 }; 44 };
46 45
47 // Interface which gets callbacks from the QuicPacketCreator at interesting 46 // Interface which gets callbacks from the QuicPacketCreator at interesting
48 // points. Implementations must not mutate the state of the creator 47 // points. Implementations must not mutate the state of the creator
49 // as a result of these callbacks. 48 // as a result of these callbacks.
50 class NET_EXPORT_PRIVATE DebugDelegate { 49 class NET_EXPORT_PRIVATE DebugDelegate {
51 public: 50 public:
52 virtual ~DebugDelegate() {} 51 virtual ~DebugDelegate() {}
53 52
54 // Called when a frame has been added to the current packet. 53 // Called when a frame has been added to the current packet.
55 virtual void OnFrameAddedToPacket(const QuicFrame& frame) {} 54 virtual void OnFrameAddedToPacket(const QuicFrame& frame) {}
56 }; 55 };
57 56
58 // QuicRandom* required for packet entropy.
59 QuicPacketCreator(QuicConnectionId connection_id, 57 QuicPacketCreator(QuicConnectionId connection_id,
60 QuicFramer* framer, 58 QuicFramer* framer,
61 QuicRandom* random_generator,
62 QuicBufferAllocator* buffer_allocator, 59 QuicBufferAllocator* buffer_allocator,
63 DelegateInterface* delegate); 60 DelegateInterface* delegate);
64 61
65 ~QuicPacketCreator(); 62 ~QuicPacketCreator();
66 63
67 // Makes the framer not serialize the protocol version in sent packets. 64 // Makes the framer not serialize the protocol version in sent packets.
68 void StopSendingVersion(); 65 void StopSendingVersion();
69 66
70 // SetDiversificationNonce sets the nonce that will be sent in each public 67 // SetDiversificationNonce sets the nonce that will be sent in each public
71 // header of packets encrypted at the initial encryption level. Should only 68 // header of packets encrypted at the initial encryption level. Should only
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 156
160 // Identical to AddSavedFrame, but allows the frame to be padded. 157 // Identical to AddSavedFrame, but allows the frame to be padded.
161 bool AddPaddedSavedFrame(const QuicFrame& frame); 158 bool AddPaddedSavedFrame(const QuicFrame& frame);
162 159
163 // Adds |listener| to the next serialized packet and notifies the 160 // Adds |listener| to the next serialized packet and notifies the
164 // std::listener with |length| as the number of acked bytes. 161 // std::listener with |length| as the number of acked bytes.
165 void AddAckListener(QuicAckListenerInterface* listener, 162 void AddAckListener(QuicAckListenerInterface* listener,
166 QuicPacketLength length); 163 QuicPacketLength length);
167 164
168 // Creates a version negotiation packet which supports |supported_versions|. 165 // Creates a version negotiation packet which supports |supported_versions|.
169 // Also, sets the entropy hash of the serialized packet to a random bool and
170 // returns that value as a member of SerializedPacket.
171 std::unique_ptr<QuicEncryptedPacket> SerializeVersionNegotiationPacket( 166 std::unique_ptr<QuicEncryptedPacket> SerializeVersionNegotiationPacket(
172 const QuicVersionVector& supported_versions); 167 const QuicVersionVector& supported_versions);
173 168
174 // Returns a dummy packet that is valid but contains no useful information. 169 // Returns a dummy packet that is valid but contains no useful information.
175 static SerializedPacket NoPacket(); 170 static SerializedPacket NoPacket();
176 171
177 // Sets the encryption level that will be applied to new packets. 172 // Sets the encryption level that will be applied to new packets.
178 void set_encryption_level(EncryptionLevel level) { 173 void set_encryption_level(EncryptionLevel level) {
179 packet_.encryption_level = level; 174 packet_.encryption_level = level;
180 } 175 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 QuicPacketNumber least_packet_awaited_by_peer, 211 QuicPacketNumber least_packet_awaited_by_peer,
217 QuicPacketCount max_packets_in_flight); 212 QuicPacketCount max_packets_in_flight);
218 213
219 void set_debug_delegate(DebugDelegate* debug_delegate) { 214 void set_debug_delegate(DebugDelegate* debug_delegate) {
220 debug_delegate_ = debug_delegate; 215 debug_delegate_ = debug_delegate;
221 } 216 }
222 217
223 private: 218 private:
224 friend class test::QuicPacketCreatorPeer; 219 friend class test::QuicPacketCreatorPeer;
225 220
226 // A QuicRandom wrapper that gets a bucket of entropy and distributes it
227 // bit-by-bit. Replenishes the bucket as needed. Not thread-safe. Expose this
228 // class if single bit randomness is needed elsewhere.
229 class QuicRandomBoolSource {
230 public:
231 // random: Source of entropy. Not owned.
232 explicit QuicRandomBoolSource(QuicRandom* random);
233
234 ~QuicRandomBoolSource();
235
236 // Returns the next random bit from the bucket.
237 bool RandBool();
238
239 private:
240 // Source of entropy.
241 QuicRandom* random_;
242 // Stored random bits.
243 uint64_t bit_bucket_;
244 // The next available bit has "1" in the mask. Zero means empty bucket.
245 uint64_t bit_mask_;
246
247 DISALLOW_COPY_AND_ASSIGN(QuicRandomBoolSource);
248 };
249
250 static bool ShouldRetransmit(const QuicFrame& frame); 221 static bool ShouldRetransmit(const QuicFrame& frame);
251 222
252 // Converts a raw payload to a frame which fits into the current open 223 // Converts a raw payload to a frame which fits into the current open
253 // packet. The payload begins at |iov_offset| into the |iov|. 224 // packet. The payload begins at |iov_offset| into the |iov|.
254 // If data is empty and fin is true, the expected behavior is to consume the 225 // If data is empty and fin is true, the expected behavior is to consume the
255 // fin but return 0. If any data is consumed, it will be copied into a 226 // fin but return 0. If any data is consumed, it will be copied into a
256 // new buffer that |frame| will point to and own. 227 // new buffer that |frame| will point to and own.
257 void CreateStreamFrame(QuicStreamId id, 228 void CreateStreamFrame(QuicStreamId id,
258 QuicIOVector iov, 229 QuicIOVector iov,
259 size_t iov_offset, 230 size_t iov_offset,
(...skipping 16 matching lines...) Expand all
276 // saves the |frame| in the next SerializedPacket. 247 // saves the |frame| in the next SerializedPacket.
277 bool AddFrame(const QuicFrame& frame, bool save_retransmittable_frames); 248 bool AddFrame(const QuicFrame& frame, bool save_retransmittable_frames);
278 249
279 // Adds a padding frame to the current packet only if the current packet 250 // Adds a padding frame to the current packet only if the current packet
280 // contains a handshake message, and there is sufficient room to fit a 251 // contains a handshake message, and there is sufficient room to fit a
281 // padding frame. 252 // padding frame.
282 void MaybeAddPadding(); 253 void MaybeAddPadding();
283 254
284 // Serializes all frames which have been added and adds any which should be 255 // Serializes all frames which have been added and adds any which should be
285 // retransmitted to packet_.retransmittable_frames. All frames must fit into 256 // retransmitted to packet_.retransmittable_frames. All frames must fit into
286 // a single packet. Sets the entropy hash of the serialized packet to a 257 // a single packet.
287 // random bool.
288 // Fails if |buffer_len| isn't long enough for the encrypted packet. 258 // Fails if |buffer_len| isn't long enough for the encrypted packet.
289 void SerializePacket(char* encrypted_buffer, size_t buffer_len); 259 void SerializePacket(char* encrypted_buffer, size_t buffer_len);
290 260
291 // Called after a new SerialiedPacket is created to call the delegate's 261 // Called after a new SerialiedPacket is created to call the delegate's
292 // OnSerializedPacket and reset state. 262 // OnSerializedPacket and reset state.
293 void OnSerializedPacket(); 263 void OnSerializedPacket();
294 264
295 // Clears all fields of packet_ that should be cleared between serializations. 265 // Clears all fields of packet_ that should be cleared between serializations.
296 void ClearPacket(); 266 void ClearPacket();
297 267
298 // Returns true if a diversification nonce should be included in the current 268 // Returns true if a diversification nonce should be included in the current
299 // packet's public header. 269 // packet's public header.
300 bool IncludeNonceInPublicHeader(); 270 bool IncludeNonceInPublicHeader();
301 271
302 // Does not own these delegates or the framer. 272 // Does not own these delegates or the framer.
303 DelegateInterface* delegate_; 273 DelegateInterface* delegate_;
304 DebugDelegate* debug_delegate_; 274 DebugDelegate* debug_delegate_;
305 QuicFramer* framer_; 275 QuicFramer* framer_;
306 276
307 QuicRandomBoolSource random_bool_source_;
308 QuicBufferAllocator* const buffer_allocator_; 277 QuicBufferAllocator* const buffer_allocator_;
309 278
310 // Controls whether version should be included while serializing the packet. 279 // Controls whether version should be included while serializing the packet.
311 bool send_version_in_packet_; 280 bool send_version_in_packet_;
312 // Controls whether path id should be included while serializing the packet. 281 // Controls whether path id should be included while serializing the packet.
313 bool send_path_id_in_packet_; 282 bool send_path_id_in_packet_;
314 // Staging variable to hold next packet number length. When sequence 283 // Staging variable to hold next packet number length. When sequence
315 // number length is to be changed, this variable holds the new length until 284 // number length is to be changed, this variable holds the new length until
316 // a packet boundary, when the creator's packet_number_length_ can be changed 285 // a packet boundary, when the creator's packet_number_length_ can be changed
317 // to this new value. 286 // to this new value.
(...skipping 22 matching lines...) Expand all
340 309
341 // Map mapping path_id to last sent packet number on the path. 310 // Map mapping path_id to last sent packet number on the path.
342 std::unordered_map<QuicPathId, QuicPacketNumber> multipath_packet_number_; 311 std::unordered_map<QuicPathId, QuicPacketNumber> multipath_packet_number_;
343 312
344 DISALLOW_COPY_AND_ASSIGN(QuicPacketCreator); 313 DISALLOW_COPY_AND_ASSIGN(QuicPacketCreator);
345 }; 314 };
346 315
347 } // namespace net 316 } // namespace net
348 317
349 #endif // NET_QUIC_QUIC_PACKET_CREATOR_H_ 318 #endif // NET_QUIC_QUIC_PACKET_CREATOR_H_
OLDNEW
« no previous file with comments | « net/quic/core/quic_multipath_sent_packet_manager_test.cc ('k') | net/quic/core/quic_packet_creator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698