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 // The entity that handles framing writes for a Quic client or server. | 5 // The entity that handles framing writes for a Quic client or server. |
6 // Each QuicSession will have a connection associated with it. | 6 // Each QuicSession will have a connection associated with it. |
7 // | 7 // |
8 // On the server side, the Dispatcher handles the raw reads, and hands off | 8 // On the server side, the Dispatcher handles the raw reads, and hands off |
9 // packets via ProcessUdpPacket for framing and processing. | 9 // packets via ProcessUdpPacket for framing and processing. |
10 // | 10 // |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 | 129 |
130 class NET_EXPORT_PRIVATE QuicConnection : public QuicFramerVisitorInterface { | 130 class NET_EXPORT_PRIVATE QuicConnection : public QuicFramerVisitorInterface { |
131 public: | 131 public: |
132 // Constructs a new QuicConnection for the specified |guid| and |address|. | 132 // Constructs a new QuicConnection for the specified |guid| and |address|. |
133 // |helper| will be owned by this connection. | 133 // |helper| will be owned by this connection. |
134 QuicConnection(QuicGuid guid, | 134 QuicConnection(QuicGuid guid, |
135 IPEndPoint address, | 135 IPEndPoint address, |
136 QuicConnectionHelperInterface* helper); | 136 QuicConnectionHelperInterface* helper); |
137 virtual ~QuicConnection(); | 137 virtual ~QuicConnection(); |
138 | 138 |
| 139 static void DeleteEnclosedFrame(QuicFrame* frame); |
139 | 140 |
140 // Send the data payload to the peer. | 141 // Send the data payload to the peer. |
141 // Returns a pair with the number of bytes consumed from data, and a boolean | 142 // Returns a pair with the number of bytes consumed from data, and a boolean |
142 // indicating if the fin bit was consumed. This does not indicate the data | 143 // indicating if the fin bit was consumed. This does not indicate the data |
143 // has been sent on the wire: it may have been turned into a packet and queued | 144 // has been sent on the wire: it may have been turned into a packet and queued |
144 // if the socket was unexpectedly blocked. | 145 // if the socket was unexpectedly blocked. |
145 QuicConsumedData SendStreamData(QuicStreamId id, | 146 QuicConsumedData SendStreamData(QuicStreamId id, |
146 base::StringPiece data, | 147 base::StringPiece data, |
147 QuicStreamOffset offset, | 148 QuicStreamOffset offset, |
148 bool fin, | 149 bool fin, |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 bool ShouldSimulateLostPacket(); | 227 bool ShouldSimulateLostPacket(); |
227 | 228 |
228 // Sets up a packet with an QuicAckFrame and sends it out. | 229 // Sets up a packet with an QuicAckFrame and sends it out. |
229 void SendAck(); | 230 void SendAck(); |
230 | 231 |
231 protected: | 232 protected: |
232 // Send a packet to the peer. If should_resend is true, this packet contains | 233 // Send a packet to the peer. If should_resend is true, this packet contains |
233 // data, and contents will be resent with a new sequence number if we don't | 234 // data, and contents will be resent with a new sequence number if we don't |
234 // get an ack. If force is true, then the packet will be sent immediately and | 235 // get an ack. If force is true, then the packet will be sent immediately and |
235 // the send scheduler will not be consulted. If is_retransmit is true, this | 236 // the send scheduler will not be consulted. If is_retransmit is true, this |
236 // packet is being retransmitted with a new sequence number. | 237 // packet is being retransmitted with a new sequence number. Always takes |
| 238 // ownership of packet. |
237 // TODO(wtc): none of the callers check the return value. | 239 // TODO(wtc): none of the callers check the return value. |
238 virtual bool SendPacket(QuicPacketSequenceNumber number, | 240 virtual bool SendPacket(QuicPacketSequenceNumber number, |
239 QuicPacket* packet, | 241 QuicPacket* packet, |
240 bool should_resend, | 242 bool should_resend, |
241 bool force, | 243 bool force, |
242 bool is_retransmit); | 244 bool is_retransmit); |
243 | 245 |
244 // Make sure an ack we got from our peer is sane. | 246 // Make sure an ack we got from our peer is sane. |
245 bool ValidateAckFrame(const QuicAckFrame& incoming_ack); | 247 bool ValidateAckFrame(const QuicAckFrame& incoming_ack); |
246 | 248 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 retransmit(retransmit) { | 280 retransmit(retransmit) { |
279 } | 281 } |
280 | 282 |
281 QuicPacketSequenceNumber sequence_number; | 283 QuicPacketSequenceNumber sequence_number; |
282 QuicPacket* packet; | 284 QuicPacket* packet; |
283 bool resend; | 285 bool resend; |
284 bool retransmit; | 286 bool retransmit; |
285 }; | 287 }; |
286 | 288 |
287 struct UnackedPacket { | 289 struct UnackedPacket { |
288 explicit UnackedPacket(QuicPacket* packet) | 290 explicit UnackedPacket(QuicFrames unacked_frames); |
289 : packet(packet), | 291 UnackedPacket(QuicFrames unacked_frames, std::string data); |
290 number_nacks(0) { | 292 ~UnackedPacket(); |
291 } | 293 |
292 QuicPacket* packet; | 294 QuicFrames frames; |
293 uint8 number_nacks; | 295 uint8 number_nacks; |
| 296 // Data referenced by the StringPiece of a QuicStreamFrame. |
| 297 std::string data; |
294 }; | 298 }; |
295 | 299 |
296 typedef std::list<QueuedPacket> QueuedPacketList; | 300 typedef std::list<QueuedPacket> QueuedPacketList; |
297 typedef base::hash_map<QuicPacketSequenceNumber, | 301 typedef base::hash_map<QuicPacketSequenceNumber, |
298 UnackedPacket> UnackedPacketMap; | 302 UnackedPacket*> UnackedPacketMap; |
299 typedef std::map<QuicFecGroupNumber, QuicFecGroup*> FecGroupMap; | 303 typedef std::map<QuicFecGroupNumber, QuicFecGroup*> FecGroupMap; |
300 | 304 |
301 // The amount of time we wait before resending a packet. | 305 // The amount of time we wait before resending a packet. |
302 static const QuicTime::Delta DefaultResendTime() { | 306 static const QuicTime::Delta DefaultResendTime() { |
303 return QuicTime::Delta::FromMilliseconds(500); | 307 return QuicTime::Delta::FromMilliseconds(500); |
304 } | 308 } |
305 | 309 |
| 310 static void DeleteUnackedPacket(UnackedPacket* unacked); |
| 311 static bool ShouldResend(const QuicFrame& frame); |
| 312 |
306 // Checks if a packet can be written now, and sets the timer if necessary. | 313 // Checks if a packet can be written now, and sets the timer if necessary. |
307 bool CanWrite(bool is_retransmit); | 314 bool CanWrite(bool is_retransmit); |
308 | 315 |
309 // Writes as much queued data as possible. The connection must not be | 316 // Writes as much queued data as possible. The connection must not be |
310 // blocked when this is called. | 317 // blocked when this is called. |
311 bool WriteData(); | 318 bool WriteData(); |
312 | 319 |
313 // If a packet can be revived from the current FEC group, then | 320 // If a packet can be revived from the current FEC group, then |
314 // revive and process the packet. | 321 // revive and process the packet. |
315 void MaybeProcessRevivedPacket(); | 322 void MaybeProcessRevivedPacket(); |
(...skipping 27 matching lines...) Expand all Loading... |
343 bool should_send_congestion_feedback_; | 350 bool should_send_congestion_feedback_; |
344 QuicAckFrame outgoing_ack_; | 351 QuicAckFrame outgoing_ack_; |
345 QuicCongestionFeedbackFrame outgoing_congestion_feedback_; | 352 QuicCongestionFeedbackFrame outgoing_congestion_feedback_; |
346 | 353 |
347 // Track some client state so we can do less bookkeeping | 354 // Track some client state so we can do less bookkeeping |
348 QuicPacketSequenceNumber largest_seen_packet_with_ack_; | 355 QuicPacketSequenceNumber largest_seen_packet_with_ack_; |
349 QuicPacketSequenceNumber peer_largest_observed_packet_; | 356 QuicPacketSequenceNumber peer_largest_observed_packet_; |
350 QuicPacketSequenceNumber peer_least_packet_awaiting_ack_; | 357 QuicPacketSequenceNumber peer_least_packet_awaiting_ack_; |
351 | 358 |
352 // When new packets are created which may be resent, they are added | 359 // When new packets are created which may be resent, they are added |
353 // to this map, which contains owning pointers. | 360 // to this map, which contains owning pointers to the contained frames. |
354 UnackedPacketMap unacked_packets_; | 361 UnackedPacketMap unacked_packets_; |
355 | 362 |
356 // When packets could not be sent because the socket was not writable, | 363 // When packets could not be sent because the socket was not writable, |
357 // they are added to this list. For packets that are not resendable, this | 364 // they are added to this list. All corresponding frames are in |
358 // list contains owning pointers, since they are not added to | 365 // unacked_packets_ if they are to be resent. |
359 // unacked_packets_. | |
360 QueuedPacketList queued_packets_; | 366 QueuedPacketList queued_packets_; |
361 | 367 |
| 368 // Pending control frames, besides the ack and congestion control frames. |
| 369 QuicFrames queued_control_frames_; |
| 370 |
362 // True when the socket becomes unwritable. | 371 // True when the socket becomes unwritable. |
363 bool write_blocked_; | 372 bool write_blocked_; |
364 | 373 |
365 FecGroupMap group_map_; | 374 FecGroupMap group_map_; |
366 QuicPacketHeader revived_header_; | 375 QuicPacketHeader revived_header_; |
367 scoped_array<char> revived_payload_; | 376 scoped_array<char> revived_payload_; |
368 | 377 |
369 QuicConnectionVisitorInterface* visitor_; | 378 QuicConnectionVisitorInterface* visitor_; |
370 QuicPacketCreator packet_creator_; | 379 QuicPacketCreator packet_creator_; |
371 | 380 |
(...skipping 16 matching lines...) Expand all Loading... |
388 bool received_truncated_ack_; | 397 bool received_truncated_ack_; |
389 | 398 |
390 bool send_ack_in_response_to_packet_; | 399 bool send_ack_in_response_to_packet_; |
391 | 400 |
392 DISALLOW_COPY_AND_ASSIGN(QuicConnection); | 401 DISALLOW_COPY_AND_ASSIGN(QuicConnection); |
393 }; | 402 }; |
394 | 403 |
395 } // namespace net | 404 } // namespace net |
396 | 405 |
397 #endif // NET_QUIC_QUIC_CONNECTION_H_ | 406 #endif // NET_QUIC_QUIC_CONNECTION_H_ |
OLD | NEW |