Index: net/quic/quic_connection.h |
diff --git a/net/quic/quic_connection.h b/net/quic/quic_connection.h |
index bf157559cd0063e6ff8baad7002166deab70c4d3..25b801470edb1063196cb1381894c1695df19fff 100644 |
--- a/net/quic/quic_connection.h |
+++ b/net/quic/quic_connection.h |
@@ -53,6 +53,7 @@ class QuicFecGroup; |
class QuicRandom; |
namespace test { |
+class PacketSavingConnection; |
class QuicConnectionPeer; |
} // namespace test |
@@ -521,6 +522,24 @@ class NET_EXPORT_PRIVATE QuicConnection |
}; |
protected: |
+ // Packets which have not been written to the wire. |
+ // Owns the QuicPacket* packet. |
+ struct QueuedPacket { |
+ QueuedPacket(SerializedPacket packet, |
+ EncryptionLevel level); |
+ QueuedPacket(SerializedPacket packet, |
+ EncryptionLevel level, |
+ TransmissionType transmission_type, |
+ QuicPacketSequenceNumber original_sequence_number); |
+ |
+ SerializedPacket serialized_packet; |
+ const EncryptionLevel encryption_level; |
+ TransmissionType transmission_type; |
+ // The packet's original sequence number if it is a retransmission. |
+ // Otherwise it must be 0. |
+ QuicPacketSequenceNumber original_sequence_number; |
+ }; |
+ |
// Do any work which logically would be done in OnPacket but can not be |
// safely done until the packet is validated. Returns true if the packet |
// can be handled, false otherwise. |
@@ -528,9 +547,7 @@ class NET_EXPORT_PRIVATE QuicConnection |
// Send a packet to the peer, and takes ownership of the packet if the packet |
// cannot be written immediately. |
- virtual void SendOrQueuePacket(EncryptionLevel level, |
- const SerializedPacket& packet, |
- TransmissionType transmission_type); |
+ virtual void SendOrQueuePacket(QueuedPacket packet); |
QuicConnectionHelperInterface* helper() { return helper_; } |
@@ -549,30 +566,23 @@ class NET_EXPORT_PRIVATE QuicConnection |
private: |
friend class test::QuicConnectionPeer; |
- |
- // Packets which have not been written to the wire. |
- // Owns the QuicPacket* packet. |
- struct QueuedPacket { |
- QueuedPacket(SerializedPacket packet, |
- EncryptionLevel level, |
- TransmissionType transmission_type); |
- |
- SerializedPacket serialized_packet; |
- const EncryptionLevel encryption_level; |
- TransmissionType transmission_type; |
- }; |
+ friend class test::PacketSavingConnection; |
typedef std::list<QueuedPacket> QueuedPacketList; |
typedef std::map<QuicFecGroupNumber, QuicFecGroup*> FecGroupMap; |
// Writes the given packet to socket, encrypted with packet's |
// encryption_level. Returns true on successful write, and false if the writer |
- // was blocked and the write needs to be tried again. Behavior is undefined |
- // if connection is not established or broken. Notifies the SentPacketManager |
- // when the write is successful. |
+ // was blocked and the write needs to be tried again. Notifies the |
+ // SentPacketManager when the write is successful and sets |
+ // retransmittable frames to NULL. |
// Saves the connection close packet for later transmission, even if the |
// writer is write blocked. |
- bool WritePacket(const QueuedPacket& packet); |
+ bool WritePacket(QueuedPacket* packet); |
+ |
+ // Does the main work of WritePacket, but does not delete the packet or |
+ // retransmittable frames upon success. |
+ bool WritePacketInner(QueuedPacket* packet); |
// Make sure an ack we got from our peer is sane. |
bool ValidateAckFrame(const QuicAckFrame& incoming_ack); |