OLD | NEW |
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2016 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 #ifndef NET_QUIC_QUIC_BUFFERED_PACKET_STORE_H_ | 5 #ifndef NET_QUIC_QUIC_BUFFERED_PACKET_STORE_H_ |
6 #define NET_QUIC_QUIC_BUFFERED_PACKET_STORE_H_ | 6 #define NET_QUIC_QUIC_BUFFERED_PACKET_STORE_H_ |
7 | 7 |
8 #include "net/base/ip_address.h" | 8 #include "net/base/ip_address.h" |
9 #include "net/base/linked_hash_map.h" | 9 #include "net/base/linked_hash_map.h" |
10 #include "net/quic/core/quic_alarm.h" | 10 #include "net/quic/core/quic_alarm.h" |
11 #include "net/quic/core/quic_alarm_factory.h" | 11 #include "net/quic/core/quic_alarm_factory.h" |
12 #include "net/quic/core/quic_clock.h" | 12 #include "net/quic/core/quic_clock.h" |
13 #include "net/quic/core/quic_protocol.h" | 13 #include "net/quic/core/quic_protocol.h" |
14 #include "net/quic/core/quic_time.h" | 14 #include "net/quic/core/quic_time.h" |
15 | 15 |
16 namespace net { | 16 namespace net { |
17 | 17 |
18 namespace test { | 18 namespace test { |
19 class QuicBufferedPacketStorePeer; | 19 class QuicBufferedPacketStorePeer; |
20 } // namespace test | 20 } // namespace test |
21 | 21 |
22 // This class buffers undeliverable packets for each connection until either | 22 // This class buffers packets for each connection until either |
23 // 1) They are requested to be delivered via DeliverPacket(), or | 23 // 1) They are requested to be delivered via |
| 24 // DeliverPacket()/DeliverPacketsForNextConnection(), or |
24 // 2) They expire after exceeding their lifetime in the store. | 25 // 2) They expire after exceeding their lifetime in the store. |
| 26 // |
| 27 // It can only buffer packets on certain number of connections. It has two pools |
| 28 // of connections: connections with CHLO buffered and those without CHLO. The |
| 29 // latter has its own upper limit along with the max number of connections this |
| 30 // store can hold. The former pool can grow till this store is full. |
25 class NET_EXPORT_PRIVATE QuicBufferedPacketStore { | 31 class NET_EXPORT_PRIVATE QuicBufferedPacketStore { |
26 public: | 32 public: |
27 enum EnqueuePacketResult { | 33 enum EnqueuePacketResult { |
28 SUCCESS = 0, | 34 SUCCESS = 0, |
29 TOO_MANY_PACKETS, // Too many packets stored up for a certain connection. | 35 TOO_MANY_PACKETS, // Too many packets stored up for a certain connection. |
30 TOO_MANY_CONNECTIONS // Too many connections stored up in the store. | 36 TOO_MANY_CONNECTIONS // Too many connections stored up in the store. |
31 }; | 37 }; |
32 | 38 |
33 // A packets with client/server address. | 39 // A packets with client/server address. |
34 struct NET_EXPORT_PRIVATE BufferedPacket { | 40 struct NET_EXPORT_PRIVATE BufferedPacket { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 QuicBufferedPacketStore(const QuicBufferedPacketStore&) = delete; | 84 QuicBufferedPacketStore(const QuicBufferedPacketStore&) = delete; |
79 | 85 |
80 ~QuicBufferedPacketStore(); | 86 ~QuicBufferedPacketStore(); |
81 | 87 |
82 QuicBufferedPacketStore& operator=(const QuicBufferedPacketStore&) = delete; | 88 QuicBufferedPacketStore& operator=(const QuicBufferedPacketStore&) = delete; |
83 | 89 |
84 // Adds a copy of packet into packet queue for given connection. | 90 // Adds a copy of packet into packet queue for given connection. |
85 EnqueuePacketResult EnqueuePacket(QuicConnectionId connection_id, | 91 EnqueuePacketResult EnqueuePacket(QuicConnectionId connection_id, |
86 const QuicReceivedPacket& packet, | 92 const QuicReceivedPacket& packet, |
87 IPEndPoint server_address, | 93 IPEndPoint server_address, |
88 IPEndPoint client_address); | 94 IPEndPoint client_address, |
| 95 bool is_chlo); |
89 | 96 |
90 // Returns true if there are any packets buffered for |connection_id|. | 97 // Returns true if there are any packets buffered for |connection_id|. |
91 bool HasBufferedPackets(QuicConnectionId connection_id) const; | 98 bool HasBufferedPackets(QuicConnectionId connection_id) const; |
92 | 99 |
93 // Returns the list of buffered packets for |connection_id| and removes them | 100 // Returns the list of buffered packets for |connection_id| and removes them |
94 // from the store. Returns an empty list if no early arrived packets for this | 101 // from the store. Returns an empty list if no early arrived packets for this |
95 // connection are present. | 102 // connection are present. |
96 std::list<BufferedPacket> DeliverPackets(QuicConnectionId connection_id); | 103 std::list<BufferedPacket> DeliverPackets(QuicConnectionId connection_id); |
97 | 104 |
98 // Examines how long packets have been buffered in the store for each | 105 // Examines how long packets have been buffered in the store for each |
99 // connection. If they stay too long, removes them for new coming packets and | 106 // connection. If they stay too long, removes them for new coming packets and |
100 // calls |visitor_|'s OnPotentialConnectionExpire(). | 107 // calls |visitor_|'s OnPotentialConnectionExpire(). |
101 // Resets the alarm at the end. | 108 // Resets the alarm at the end. |
102 void OnExpirationTimeout(); | 109 void OnExpirationTimeout(); |
103 | 110 |
| 111 // Delivers buffered packets for next connection with CHLO to open. |
| 112 // Return connection id for next connection in |connection_id| |
| 113 // and all buffered packets including CHLO. |
| 114 // The returned std::list should at least has one packet(CHLO) if |
| 115 // store does have any connection to open. If no connection in the store has |
| 116 // received CHLO yet, empty std::list will be returned. |
| 117 std::list<BufferedPacket> DeliverPacketsForNextConnection( |
| 118 QuicConnectionId* connection_id); |
| 119 |
| 120 // Is given connection already buffered in the store? |
| 121 bool HasChloForConnection(QuicConnectionId connection_id); |
| 122 |
| 123 // Is there any CHLO buffered in the store? |
| 124 bool HasChlosBuffered() const; |
| 125 |
104 private: | 126 private: |
105 friend class test::QuicBufferedPacketStorePeer; | 127 friend class test::QuicBufferedPacketStorePeer; |
106 | 128 |
107 // Set expiration alarm if it hasn't been set. | 129 // Set expiration alarm if it hasn't been set. |
108 void MaybeSetExpirationAlarm(); | 130 void MaybeSetExpirationAlarm(); |
109 | 131 |
110 // Return true if number of connections in the store reaches maximum. | 132 // Return true if add an extra packet will go beyond allowed max connection |
111 bool IsFull(); | 133 // limit. The limit for non-CHLO packet and CHLO packet is different. |
| 134 bool ShouldBufferPacket(bool is_chlo); |
112 | 135 |
113 // A map to store packet queues with creation time for each connection. | 136 // A map to store packet queues with creation time for each connection. |
114 BufferedPacketMap undecryptable_packets_; | 137 BufferedPacketMap undecryptable_packets_; |
115 | 138 |
116 // The max time the packets of a connection can be buffer in the store. | 139 // The max time the packets of a connection can be buffer in the store. |
117 QuicTime::Delta connection_life_span_; | 140 QuicTime::Delta connection_life_span_; |
118 | 141 |
119 VisitorInterface* visitor_; // Unowned. | 142 VisitorInterface* visitor_; // Unowned. |
120 | 143 |
121 const QuicClock* clock_; // Unowned. | 144 const QuicClock* clock_; // Unowned. |
122 | 145 |
123 // This alarm fires every |connection_life_span_| to clean up | 146 // This alarm fires every |connection_life_span_| to clean up |
124 // packets staying in the store for too long. | 147 // packets staying in the store for too long. |
125 std::unique_ptr<QuicAlarm> expiration_alarm_; | 148 std::unique_ptr<QuicAlarm> expiration_alarm_; |
| 149 |
| 150 // Keeps track of connection with CHLO buffered up already and the order they |
| 151 // arrive. |
| 152 linked_hash_map<QuicConnectionId, bool> connections_with_chlo_; |
126 }; | 153 }; |
127 | 154 |
128 } // namespace net | 155 } // namespace net |
129 | 156 |
130 #endif // NET_QUIC_QUIC_BUFFERED_PACKET_STORE_H_ | 157 #endif // NET_QUIC_QUIC_BUFFERED_PACKET_STORE_H_ |
OLD | NEW |