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

Side by Side Diff: net/quic/quic_connection.cc

Issue 340433002: Port QuicServer to Chrome network stack (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments and fix blocked writers using callbacks Created 6 years, 6 months 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 #include "net/quic/quic_connection.h" 5 #include "net/quic/quic_connection.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 #include <sys/types.h> 8 #include <sys/types.h>
9 #include <algorithm> 9 #include <algorithm>
10 #include <iterator> 10 #include <iterator>
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 sequence_number_of_last_sent_packet_(0), 228 sequence_number_of_last_sent_packet_(0),
229 sent_packet_manager_( 229 sent_packet_manager_(
230 is_server, clock_, &stats_, kTCP, 230 is_server, clock_, &stats_, kTCP,
231 FLAGS_quic_use_time_loss_detection ? kTime : kNack), 231 FLAGS_quic_use_time_loss_detection ? kTime : kNack),
232 version_negotiation_state_(START_NEGOTIATION), 232 version_negotiation_state_(START_NEGOTIATION),
233 is_server_(is_server), 233 is_server_(is_server),
234 connected_(true), 234 connected_(true),
235 peer_ip_changed_(false), 235 peer_ip_changed_(false),
236 peer_port_changed_(false), 236 peer_port_changed_(false),
237 self_ip_changed_(false), 237 self_ip_changed_(false),
238 self_port_changed_(false) { 238 self_port_changed_(false),
239 weak_factory_(this) {
239 if (!is_server_) { 240 if (!is_server_) {
240 // Pacing will be enabled if the client negotiates it. 241 // Pacing will be enabled if the client negotiates it.
241 sent_packet_manager_.MaybeEnablePacing(); 242 sent_packet_manager_.MaybeEnablePacing();
242 } 243 }
243 DVLOG(1) << ENDPOINT << "Created connection with connection_id: " 244 DVLOG(1) << ENDPOINT << "Created connection with connection_id: "
244 << connection_id; 245 << connection_id;
245 timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_)); 246 timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_));
246 framer_.set_visitor(this); 247 framer_.set_visitor(this);
247 framer_.set_received_entropy_calculator(&received_packet_manager_); 248 framer_.set_received_entropy_calculator(&received_packet_manager_);
248 stats_.connection_creation_time = clock_->ApproximateNow(); 249 stats_.connection_creation_time = clock_->ApproximateNow();
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 // TODO(alyssar): implement zero server state negotiation. 964 // TODO(alyssar): implement zero server state negotiation.
964 pending_version_negotiation_packet_ = true; 965 pending_version_negotiation_packet_ = true;
965 if (writer_->IsWriteBlocked()) { 966 if (writer_->IsWriteBlocked()) {
966 visitor_->OnWriteBlocked(); 967 visitor_->OnWriteBlocked();
967 return; 968 return;
968 } 969 }
969 scoped_ptr<QuicEncryptedPacket> version_packet( 970 scoped_ptr<QuicEncryptedPacket> version_packet(
970 packet_generator_.SerializeVersionNegotiationPacket( 971 packet_generator_.SerializeVersionNegotiationPacket(
971 framer_.supported_versions())); 972 framer_.supported_versions()));
972 WriteResult result = writer_->WritePacket( 973 WriteResult result = writer_->WritePacket(
973 version_packet->data(), version_packet->length(), 974 version_packet->data(),
974 self_address().address(), peer_address()); 975 version_packet->length(),
976 self_address().address(),
977 peer_address(),
978 base::Callback<void(WriteResult wr)>());
975 979
976 if (result.status == WRITE_STATUS_ERROR) { 980 if (result.status == WRITE_STATUS_ERROR) {
977 // We can't send an error as the socket is presumably borked. 981 // We can't send an error as the socket is presumably borked.
978 CloseConnection(QUIC_PACKET_WRITE_ERROR, false); 982 CloseConnection(QUIC_PACKET_WRITE_ERROR, false);
979 return; 983 return;
980 } 984 }
981 if (result.status == WRITE_STATUS_BLOCKED) { 985 if (result.status == WRITE_STATUS_BLOCKED) {
982 visitor_->OnWriteBlocked(); 986 visitor_->OnWriteBlocked();
983 if (writer_->IsWriteBlockedDataBuffered()) { 987 if (writer_->IsWriteBlockedDataBuffered()) {
984 pending_version_negotiation_packet_ = false; 988 pending_version_negotiation_packet_ = false;
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
1383 1387
1384 DCHECK(encrypted->length() <= kMaxPacketSize || 1388 DCHECK(encrypted->length() <= kMaxPacketSize ||
1385 FLAGS_quic_allow_oversized_packets_for_test) 1389 FLAGS_quic_allow_oversized_packets_for_test)
1386 << "Packet " << sequence_number << " will not be read; too large: " 1390 << "Packet " << sequence_number << " will not be read; too large: "
1387 << packet.packet->length() << " " << encrypted->length() << " " 1391 << packet.packet->length() << " " << encrypted->length() << " "
1388 << " close: " << (packet.type == CONNECTION_CLOSE ? "yes" : "no"); 1392 << " close: " << (packet.type == CONNECTION_CLOSE ? "yes" : "no");
1389 1393
1390 DCHECK(pending_write_.get() == NULL); 1394 DCHECK(pending_write_.get() == NULL);
1391 pending_write_.reset(new QueuedPacket(packet)); 1395 pending_write_.reset(new QueuedPacket(packet));
1392 1396
1393 WriteResult result = writer_->WritePacket(encrypted->data(), 1397 WriteResult result = writer_->WritePacket(
1394 encrypted->length(), 1398 encrypted->data(),
1395 self_address().address(), 1399 encrypted->length(),
1396 peer_address()); 1400 self_address().address(),
1401 peer_address(),
1402 base::Bind(base::IgnoreResult(&QuicConnection::OnPacketSent),
1403 weak_factory_.GetWeakPtr()));
1397 if (result.error_code == ERR_IO_PENDING) { 1404 if (result.error_code == ERR_IO_PENDING) {
1398 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); 1405 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status);
1399 } 1406 }
1400 if (debug_visitor_) { 1407 if (debug_visitor_) {
1401 // Pass the write result to the visitor. 1408 // Pass the write result to the visitor.
1402 debug_visitor_->OnPacketSent(sequence_number, 1409 debug_visitor_->OnPacketSent(sequence_number,
1403 packet.encryption_level, 1410 packet.encryption_level,
1404 packet.transmission_type, 1411 packet.transmission_type,
1405 *encrypted, 1412 *encrypted,
1406 result); 1413 result);
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after
1978 // If we changed the generator's batch state, restore original batch state. 1985 // If we changed the generator's batch state, restore original batch state.
1979 if (!already_in_batch_mode_) { 1986 if (!already_in_batch_mode_) {
1980 DVLOG(1) << "Leaving Batch Mode."; 1987 DVLOG(1) << "Leaving Batch Mode.";
1981 connection_->packet_generator_.FinishBatchOperations(); 1988 connection_->packet_generator_.FinishBatchOperations();
1982 } 1989 }
1983 DCHECK_EQ(already_in_batch_mode_, 1990 DCHECK_EQ(already_in_batch_mode_,
1984 connection_->packet_generator_.InBatchMode()); 1991 connection_->packet_generator_.InBatchMode());
1985 } 1992 }
1986 1993
1987 } // namespace net 1994 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698