blob: b5119498c74b3410e6ce4dec367564abd55a3fc8 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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
3// found in the LICENSE file.
4
QUICHE team5be974e2020-12-29 18:35:24 -05005#include "quic/test_tools/quic_connection_peer.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -05006
vasilvv5f225b02020-10-08 11:49:09 -04007#include "absl/strings/string_view.h"
QUICHE team5be974e2020-12-29 18:35:24 -05008#include "quic/core/congestion_control/send_algorithm_interface.h"
9#include "quic/core/quic_packet_writer.h"
10#include "quic/core/quic_received_packet_manager.h"
11#include "quic/platform/api/quic_flags.h"
danzh9cb85b72020-12-30 07:17:09 -080012#include "quic/platform/api/quic_socket_address.h"
haoyuewange3c51d92021-03-08 07:35:03 -080013#include "quic/test_tools/quic_connection_id_manager_peer.h"
QUICHE team5be974e2020-12-29 18:35:24 -050014#include "quic/test_tools/quic_framer_peer.h"
15#include "quic/test_tools/quic_sent_packet_manager_peer.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050016
17namespace quic {
18namespace test {
19
20// static
QUICHE teama6ef0a62019-03-07 20:34:33 -050021void QuicConnectionPeer::SetSendAlgorithm(
22 QuicConnection* connection,
23 SendAlgorithmInterface* send_algorithm) {
24 GetSentPacketManager(connection)->SetSendAlgorithm(send_algorithm);
25}
26
27// static
28void QuicConnectionPeer::SetLossAlgorithm(
29 QuicConnection* connection,
30 LossDetectionInterface* loss_algorithm) {
31 GetSentPacketManager(connection)->loss_algorithm_ = loss_algorithm;
32}
33
34// static
QUICHE teama6ef0a62019-03-07 20:34:33 -050035void QuicConnectionPeer::PopulateStopWaitingFrame(
36 QuicConnection* connection,
37 QuicStopWaitingFrame* stop_waiting) {
38 connection->PopulateStopWaitingFrame(stop_waiting);
39}
40
41// static
QUICHE teama6ef0a62019-03-07 20:34:33 -050042QuicPacketCreator* QuicConnectionPeer::GetPacketCreator(
43 QuicConnection* connection) {
fayang4245c212019-11-05 13:33:46 -080044 return &connection->packet_creator_;
QUICHE teama6ef0a62019-03-07 20:34:33 -050045}
46
47// static
48QuicSentPacketManager* QuicConnectionPeer::GetSentPacketManager(
49 QuicConnection* connection) {
50 return &connection->sent_packet_manager_;
51}
52
53// static
54QuicTime::Delta QuicConnectionPeer::GetNetworkTimeout(
55 QuicConnection* connection) {
fayang3a58dc42020-06-29 11:27:14 -070056 return connection->idle_network_detector_.idle_network_timeout_;
QUICHE teama6ef0a62019-03-07 20:34:33 -050057}
58
59// static
60void QuicConnectionPeer::SetPerspective(QuicConnection* connection,
61 Perspective perspective) {
62 connection->perspective_ = perspective;
63 QuicFramerPeer::SetPerspective(&connection->framer_, perspective);
64}
65
66// static
67void QuicConnectionPeer::SetSelfAddress(QuicConnection* connection,
68 const QuicSocketAddress& self_address) {
danzh37b722e2021-02-17 11:09:08 -080069 connection->default_path_.self_address = self_address;
QUICHE teama6ef0a62019-03-07 20:34:33 -050070}
71
72// static
73void QuicConnectionPeer::SetPeerAddress(QuicConnection* connection,
74 const QuicSocketAddress& peer_address) {
wub6e9174e2021-02-17 14:28:29 -080075 connection->UpdatePeerAddress(peer_address);
QUICHE teama6ef0a62019-03-07 20:34:33 -050076}
77
78// static
79void QuicConnectionPeer::SetDirectPeerAddress(
80 QuicConnection* connection,
81 const QuicSocketAddress& direct_peer_address) {
82 connection->direct_peer_address_ = direct_peer_address;
83}
84
85// static
86void QuicConnectionPeer::SetEffectivePeerAddress(
87 QuicConnection* connection,
88 const QuicSocketAddress& effective_peer_address) {
danzh37b722e2021-02-17 11:09:08 -080089 connection->default_path_.peer_address = effective_peer_address;
QUICHE teama6ef0a62019-03-07 20:34:33 -050090}
91
92// static
QUICHE teama6ef0a62019-03-07 20:34:33 -050093void QuicConnectionPeer::SwapCrypters(QuicConnection* connection,
94 QuicFramer* framer) {
95 QuicFramerPeer::SwapCrypters(framer, &connection->framer_);
96}
97
98// static
vasilvv5f225b02020-10-08 11:49:09 -040099void QuicConnectionPeer::SetCurrentPacket(QuicConnection* connection,
100 absl::string_view current_packet) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500101 connection->current_packet_data_ = current_packet.data();
102 connection->last_size_ = current_packet.size();
103}
104
105// static
106QuicConnectionHelperInterface* QuicConnectionPeer::GetHelper(
107 QuicConnection* connection) {
108 return connection->helper_;
109}
110
111// static
112QuicAlarmFactory* QuicConnectionPeer::GetAlarmFactory(
113 QuicConnection* connection) {
114 return connection->alarm_factory_;
115}
116
117// static
118QuicFramer* QuicConnectionPeer::GetFramer(QuicConnection* connection) {
119 return &connection->framer_;
120}
121
122// static
123QuicAlarm* QuicConnectionPeer::GetAckAlarm(QuicConnection* connection) {
124 return connection->ack_alarm_.get();
125}
126
127// static
128QuicAlarm* QuicConnectionPeer::GetPingAlarm(QuicConnection* connection) {
129 return connection->ping_alarm_.get();
130}
131
132// static
133QuicAlarm* QuicConnectionPeer::GetRetransmissionAlarm(
134 QuicConnection* connection) {
135 return connection->retransmission_alarm_.get();
136}
137
138// static
139QuicAlarm* QuicConnectionPeer::GetSendAlarm(QuicConnection* connection) {
140 return connection->send_alarm_.get();
141}
142
143// static
QUICHE teama6ef0a62019-03-07 20:34:33 -0500144QuicAlarm* QuicConnectionPeer::GetMtuDiscoveryAlarm(
145 QuicConnection* connection) {
146 return connection->mtu_discovery_alarm_.get();
147}
148
149// static
QUICHE teama6ef0a62019-03-07 20:34:33 -0500150QuicAlarm* QuicConnectionPeer::GetProcessUndecryptablePacketsAlarm(
151 QuicConnection* connection) {
152 return connection->process_undecryptable_packets_alarm_.get();
153}
154
155// static
mattm072a7e32020-10-09 16:16:56 -0700156QuicAlarm* QuicConnectionPeer::GetDiscardPreviousOneRttKeysAlarm(
157 QuicConnection* connection) {
158 return connection->discard_previous_one_rtt_keys_alarm_.get();
159}
160
161// static
mattmad5eb5d2020-12-03 16:12:15 -0800162QuicAlarm* QuicConnectionPeer::GetDiscardZeroRttDecryptionKeysAlarm(
163 QuicConnection* connection) {
164 return connection->discard_zero_rtt_decryption_keys_alarm_.get();
165}
166
167// static
haoyuewange3c51d92021-03-08 07:35:03 -0800168QuicAlarm* QuicConnectionPeer::GetRetirePeerIssuedConnectionIdAlarm(
169 QuicConnection* connection) {
170 if (connection->peer_issued_cid_manager_ == nullptr) {
171 return nullptr;
172 }
173 return QuicConnectionIdManagerPeer::GetRetirePeerIssuedConnectionIdAlarm(
174 connection->peer_issued_cid_manager_.get());
175}
176// static
177QuicAlarm* QuicConnectionPeer::GetRetireSelfIssuedConnectionIdAlarm(
178 QuicConnection* connection) {
179 if (connection->self_issued_cid_manager_ == nullptr) {
180 return nullptr;
181 }
182 return QuicConnectionIdManagerPeer::GetRetireSelfIssuedConnectionIdAlarm(
183 connection->self_issued_cid_manager_.get());
184}
185
186// static
QUICHE teama6ef0a62019-03-07 20:34:33 -0500187QuicPacketWriter* QuicConnectionPeer::GetWriter(QuicConnection* connection) {
188 return connection->writer_;
189}
190
191// static
192void QuicConnectionPeer::SetWriter(QuicConnection* connection,
193 QuicPacketWriter* writer,
194 bool owns_writer) {
195 if (connection->owns_writer_) {
196 delete connection->writer_;
197 }
198 connection->writer_ = writer;
199 connection->owns_writer_ = owns_writer;
200}
201
202// static
203void QuicConnectionPeer::TearDownLocalConnectionState(
204 QuicConnection* connection) {
205 connection->connected_ = false;
206}
207
208// static
209QuicEncryptedPacket* QuicConnectionPeer::GetConnectionClosePacket(
210 QuicConnection* connection) {
211 if (connection->termination_packets_ == nullptr ||
212 connection->termination_packets_->empty()) {
213 return nullptr;
214 }
215 return (*connection->termination_packets_)[0].get();
216}
217
218// static
219QuicPacketHeader* QuicConnectionPeer::GetLastHeader(
220 QuicConnection* connection) {
221 return &connection->last_header_;
222}
223
224// static
225QuicConnectionStats* QuicConnectionPeer::GetStats(QuicConnection* connection) {
226 return &connection->stats_;
227}
228
229// static
230QuicPacketCount QuicConnectionPeer::GetPacketsBetweenMtuProbes(
231 QuicConnection* connection) {
wub173916e2019-11-27 14:36:24 -0800232 return connection->mtu_discoverer_.packets_between_probes();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500233}
234
235// static
wubf76cf2a2019-10-11 18:49:07 -0700236void QuicConnectionPeer::ReInitializeMtuDiscoverer(
237 QuicConnection* connection,
238 QuicPacketCount packets_between_probes_base,
239 QuicPacketNumber next_probe_at) {
240 connection->mtu_discoverer_ =
241 QuicConnectionMtuDiscoverer(packets_between_probes_base, next_probe_at);
242}
243
244// static
QUICHE teama6ef0a62019-03-07 20:34:33 -0500245void QuicConnectionPeer::SetAckDecimationDelay(QuicConnection* connection,
246 float ack_decimation_delay) {
fayang5f464302019-06-20 12:57:33 -0700247 for (auto& received_packet_manager :
248 connection->uber_received_packet_manager_.received_packet_managers_) {
249 received_packet_manager.ack_decimation_delay_ = ack_decimation_delay;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500250 }
251}
252
253// static
254bool QuicConnectionPeer::HasRetransmittableFrames(QuicConnection* connection,
255 uint64_t packet_number) {
256 return QuicSentPacketManagerPeer::HasRetransmittableFrames(
257 GetSentPacketManager(connection), packet_number);
258}
259
260// static
261bool QuicConnectionPeer::GetNoStopWaitingFrames(QuicConnection* connection) {
262 return connection->no_stop_waiting_frames_;
263}
264
265// static
266void QuicConnectionPeer::SetNoStopWaitingFrames(QuicConnection* connection,
267 bool no_stop_waiting_frames) {
268 connection->no_stop_waiting_frames_ = no_stop_waiting_frames;
269}
270
271// static
272void QuicConnectionPeer::SetMaxTrackedPackets(
273 QuicConnection* connection,
274 QuicPacketCount max_tracked_packets) {
275 connection->max_tracked_packets_ = max_tracked_packets;
276}
277
278// static
QUICHE teama6ef0a62019-03-07 20:34:33 -0500279void QuicConnectionPeer::SetNegotiatedVersion(QuicConnection* connection) {
fayang8aba1ff2019-06-21 12:00:54 -0700280 connection->version_negotiated_ = true;
wub256b2d62019-11-25 08:46:55 -0800281 if (connection->perspective() == Perspective::IS_SERVER &&
282 !QuicFramerPeer::infer_packet_header_type_from_version(
283 &connection->framer_)) {
284 connection->framer_.InferPacketHeaderTypeFromVersion();
285 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500286}
287
288// static
289void QuicConnectionPeer::SetMaxConsecutiveNumPacketsWithNoRetransmittableFrames(
290 QuicConnection* connection,
291 size_t new_value) {
292 connection->max_consecutive_num_packets_with_no_retransmittable_frames_ =
293 new_value;
294}
295
296// static
QUICHE teama6ef0a62019-03-07 20:34:33 -0500297bool QuicConnectionPeer::SupportsReleaseTime(QuicConnection* connection) {
298 return connection->supports_release_time_;
299}
300
301// static
302QuicConnection::PacketContent QuicConnectionPeer::GetCurrentPacketContent(
303 QuicConnection* connection) {
304 return connection->current_packet_content_;
305}
306
QUICHE team8c1daa22019-03-13 08:33:41 -0700307// static
308void QuicConnectionPeer::SetLastHeaderFormat(QuicConnection* connection,
309 PacketHeaderFormat format) {
310 connection->last_header_.form = format;
311}
312
fayang5f135052019-08-22 17:59:40 -0700313// static
314void QuicConnectionPeer::AddBytesReceived(QuicConnection* connection,
315 size_t length) {
316 if (connection->EnforceAntiAmplificationLimit()) {
danzh37b722e2021-02-17 11:09:08 -0800317 connection->default_path_.bytes_received_before_address_validation +=
318 length;
fayang5f135052019-08-22 17:59:40 -0700319 }
320}
321
322// static
323void QuicConnectionPeer::SetAddressValidated(QuicConnection* connection) {
danzh37b722e2021-02-17 11:09:08 -0800324 connection->default_path_.validated = true;
fayang5f135052019-08-22 17:59:40 -0700325}
326
dschinazidce90b02019-10-14 18:19:54 -0700327// static
mattm55006b02021-01-14 15:09:54 -0800328void QuicConnectionPeer::SendConnectionClosePacket(
329 QuicConnection* connection,
330 QuicIetfTransportErrorCodes ietf_error,
331 QuicErrorCode error,
332 const std::string& details) {
333 connection->SendConnectionClosePacket(error, ietf_error, details);
dschinazidce90b02019-10-14 18:19:54 -0700334}
335
rchd672c6d2019-11-27 15:30:54 -0800336// static
337size_t QuicConnectionPeer::GetNumEncryptionLevels(QuicConnection* connection) {
338 size_t count = 0;
339 for (EncryptionLevel level :
340 {ENCRYPTION_INITIAL, ENCRYPTION_HANDSHAKE, ENCRYPTION_ZERO_RTT,
341 ENCRYPTION_FORWARD_SECURE}) {
342 if (connection->framer_.HasEncrypterOfEncryptionLevel(level)) {
343 ++count;
344 }
345 }
346 return count;
347}
348
fayangb59c6f12020-03-23 15:06:14 -0700349// static
350QuicNetworkBlackholeDetector& QuicConnectionPeer::GetBlackholeDetector(
351 QuicConnection* connection) {
352 return connection->blackhole_detector_;
353}
354
355// static
356QuicAlarm* QuicConnectionPeer::GetBlackholeDetectorAlarm(
357 QuicConnection* connection) {
358 return connection->blackhole_detector_.alarm_.get();
359}
360
361// static
362QuicTime QuicConnectionPeer::GetPathDegradingDeadline(
363 QuicConnection* connection) {
364 return connection->blackhole_detector_.path_degrading_deadline_;
365}
366
367// static
368QuicTime QuicConnectionPeer::GetBlackholeDetectionDeadline(
369 QuicConnection* connection) {
370 return connection->blackhole_detector_.blackhole_deadline_;
371}
372
fayangb9c88442020-03-26 07:03:57 -0700373// static
wub8add68a2020-07-27 12:07:38 -0700374QuicTime QuicConnectionPeer::GetPathMtuReductionDetectionDeadline(
375 QuicConnection* connection) {
376 return connection->blackhole_detector_.path_mtu_reduction_deadline_;
377}
378
379// static
fayang001c8282020-07-29 12:39:29 -0700380QuicTime QuicConnectionPeer::GetIdleNetworkDeadline(
381 QuicConnection* connection) {
382 return connection->idle_network_detector_.GetIdleNetworkDeadline();
383}
384
385// static
fayangb9c88442020-03-26 07:03:57 -0700386QuicAlarm* QuicConnectionPeer::GetIdleNetworkDetectorAlarm(
387 QuicConnection* connection) {
388 return connection->idle_network_detector_.alarm_.get();
389}
390
dschinazi39e5e552020-05-06 13:55:24 -0700391// static
fayang001c8282020-07-29 12:39:29 -0700392QuicIdleNetworkDetector& QuicConnectionPeer::GetIdleNetworkDetector(
393 QuicConnection* connection) {
394 return connection->idle_network_detector_;
395}
396
397// static
dschinazi39e5e552020-05-06 13:55:24 -0700398void QuicConnectionPeer::SetServerConnectionId(
399 QuicConnection* connection,
400 const QuicConnectionId& server_connection_id) {
haoyuewang16ef03b2021-06-30 07:59:53 -0700401 connection->default_path_.server_connection_id = server_connection_id;
dschinazi39e5e552020-05-06 13:55:24 -0700402 connection->InstallInitialCrypters(server_connection_id);
403}
404
fayang750b54f2020-06-18 06:26:54 -0700405// static
406size_t QuicConnectionPeer::NumUndecryptablePackets(QuicConnection* connection) {
407 return connection->undecryptable_packets_.size();
408}
409
danzh8a27a1a2020-09-02 10:26:28 -0700410// static
danzh9cb85b72020-12-30 07:17:09 -0800411size_t QuicConnectionPeer::NumPendingPathChallengesToResponse(
danzh8a27a1a2020-09-02 10:26:28 -0700412 QuicConnection* connection) {
danzh9cb85b72020-12-30 07:17:09 -0800413 return connection->pending_path_challenge_payloads_.size();
danzh8a27a1a2020-09-02 10:26:28 -0700414}
415
renjietang052df7c2020-10-13 14:46:09 -0700416void QuicConnectionPeer::SetConnectionClose(QuicConnection* connection) {
417 connection->connected_ = false;
418}
419
fayang29ce0bd2020-10-29 08:28:44 -0700420// static
421void QuicConnectionPeer::SendPing(QuicConnection* connection) {
422 connection->SendPingAtLevel(connection->encryption_level());
423}
424
danzhe6211dc2020-11-19 09:19:00 -0800425// static
426void QuicConnectionPeer::SetLastPacketDestinationAddress(
427 QuicConnection* connection,
428 const QuicSocketAddress& address) {
fayangaee86fb2021-06-02 12:06:08 -0700429 connection->last_received_packet_info_.destination_address = address;
danzhe6211dc2020-11-19 09:19:00 -0800430}
431
432// static
433QuicPathValidator* QuicConnectionPeer::path_validator(
434 QuicConnection* connection) {
435 return &connection->path_validator_;
436}
437
danzh9cb85b72020-12-30 07:17:09 -0800438// static
danzha4b519c2021-02-05 12:10:55 -0800439QuicByteCount QuicConnectionPeer::BytesSentOnAlternativePath(
danzh9cb85b72020-12-30 07:17:09 -0800440 QuicConnection* connection) {
danzha4b519c2021-02-05 12:10:55 -0800441 return connection->alternative_path_.bytes_sent_before_address_validation;
danzh9cb85b72020-12-30 07:17:09 -0800442}
443
444// static
danzha4b519c2021-02-05 12:10:55 -0800445QuicByteCount QuicConnectionPeer::BytesReceivedOnAlternativePath(
danzh9cb85b72020-12-30 07:17:09 -0800446 QuicConnection* connection) {
danzha4b519c2021-02-05 12:10:55 -0800447 return connection->alternative_path_.bytes_received_before_address_validation;
danzh9cb85b72020-12-30 07:17:09 -0800448}
449
danzh3b630702021-01-12 14:15:23 -0800450// static
haoyuewang5c49d3e2021-04-08 07:33:33 -0700451QuicConnectionId QuicConnectionPeer::GetClientConnectionIdOnAlternativePath(
452 const QuicConnection* connection) {
453 return connection->alternative_path_.client_connection_id;
454}
455
456// static
457QuicConnectionId QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
458 const QuicConnection* connection) {
459 return connection->alternative_path_.server_connection_id;
460}
461
462// static
danzha25ed9d2021-02-19 12:40:26 -0800463bool QuicConnectionPeer::IsAlternativePathValidated(
464 QuicConnection* connection) {
465 return connection->alternative_path_.validated;
466}
467
468// static
danzha4b519c2021-02-05 12:10:55 -0800469bool QuicConnectionPeer::IsAlternativePath(
danzh3b630702021-01-12 14:15:23 -0800470 QuicConnection* connection,
471 const QuicSocketAddress& self_address,
472 const QuicSocketAddress& peer_address) {
danzha4b519c2021-02-05 12:10:55 -0800473 return connection->IsAlternativePath(self_address, peer_address);
danzh3b630702021-01-12 14:15:23 -0800474}
475
danzha25ed9d2021-02-19 12:40:26 -0800476// static
477QuicByteCount QuicConnectionPeer::BytesReceivedBeforeAddressValidation(
478 QuicConnection* connection) {
479 return connection->default_path_.bytes_received_before_address_validation;
480}
481
haoyuewange3c51d92021-03-08 07:35:03 -0800482// static
haoyuewange3c51d92021-03-08 07:35:03 -0800483void QuicConnectionPeer::ResetPeerIssuedConnectionIdManager(
484 QuicConnection* connection) {
485 connection->peer_issued_cid_manager_ = nullptr;
486}
haoyuewangb9142bc2021-04-13 06:28:22 -0700487
488// static
489QuicConnection::PathState* QuicConnectionPeer::GetDefaultPath(
490 QuicConnection* connection) {
491 return &connection->default_path_;
492}
493
494// static
495QuicConnection::PathState* QuicConnectionPeer::GetAlternativePath(
496 QuicConnection* connection) {
497 return &connection->alternative_path_;
498}
499
haoyuewangdc60baf2021-04-19 14:03:14 -0700500// static
501void QuicConnectionPeer::RetirePeerIssuedConnectionIdsNoLongerOnPath(
502 QuicConnection* connection) {
503 connection->RetirePeerIssuedConnectionIdsNoLongerOnPath();
504}
505
haoyuewangb25dd212021-05-05 07:33:07 -0700506// static
507bool QuicConnectionPeer::HasUnusedPeerIssuedConnectionId(
508 const QuicConnection* connection) {
509 return connection->peer_issued_cid_manager_->HasUnusedConnectionId();
510}
511
512// static
513bool QuicConnectionPeer::HasSelfIssuedConnectionIdToConsume(
514 const QuicConnection* connection) {
515 return connection->self_issued_cid_manager_->HasConnectionIdToConsume();
516}
517
haoyuewang095051f2021-07-16 12:11:35 -0700518// static
519QuicSelfIssuedConnectionIdManager*
520QuicConnectionPeer::GetSelfIssuedConnectionIdManager(
521 QuicConnection* connection) {
522 return connection->self_issued_cid_manager_.get();
523}
524
haoyuewang7711cc82021-09-07 12:26:00 -0700525// static
526std::unique_ptr<QuicSelfIssuedConnectionIdManager>
527QuicConnectionPeer::MakeSelfIssuedConnectionIdManager(
528 QuicConnection* connection) {
529 return connection->MakeSelfIssuedConnectionIdManager();
530}
531
haoyuewang063d88c2021-10-21 15:06:26 -0700532// static
533void QuicConnectionPeer::SetLastDecryptedLevel(QuicConnection* connection,
534 EncryptionLevel level) {
535 connection->last_decrypted_packet_level_ = level;
536}
537
QUICHE teama6ef0a62019-03-07 20:34:33 -0500538} // namespace test
539} // namespace quic