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

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

Issue 497553004: Landing Recent QUIC Changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase with TOT Created 6 years, 4 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
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 // Pacing will be enabled if the client negotiates it. 244 // Pacing will be enabled if the client negotiates it.
245 sent_packet_manager_.MaybeEnablePacing(); 245 sent_packet_manager_.MaybeEnablePacing();
246 } 246 }
247 #endif 247 #endif
248 DVLOG(1) << ENDPOINT << "Created connection with connection_id: " 248 DVLOG(1) << ENDPOINT << "Created connection with connection_id: "
249 << connection_id; 249 << connection_id;
250 timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_)); 250 timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_));
251 framer_.set_visitor(this); 251 framer_.set_visitor(this);
252 framer_.set_received_entropy_calculator(&received_packet_manager_); 252 framer_.set_received_entropy_calculator(&received_packet_manager_);
253 stats_.connection_creation_time = clock_->ApproximateNow(); 253 stats_.connection_creation_time = clock_->ApproximateNow();
254 sent_packet_manager_.set_network_change_visitor(&packet_generator_); 254 sent_packet_manager_.set_network_change_visitor(this);
255 } 255 }
256 256
257 QuicConnection::~QuicConnection() { 257 QuicConnection::~QuicConnection() {
258 if (owns_writer_) { 258 if (owns_writer_) {
259 delete writer_; 259 delete writer_;
260 } 260 }
261 STLDeleteElements(&undecryptable_packets_); 261 STLDeleteElements(&undecryptable_packets_);
262 STLDeleteValues(&group_map_); 262 STLDeleteValues(&group_map_);
263 for (QueuedPacketList::iterator it = queued_packets_.begin(); 263 for (QueuedPacketList::iterator it = queued_packets_.begin();
264 it != queued_packets_.end(); ++it) { 264 it != queued_packets_.end(); ++it) {
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 SendConnectionClose(QUIC_INVALID_ACK_DATA); 551 SendConnectionClose(QUIC_INVALID_ACK_DATA);
552 return false; 552 return false;
553 } 553 }
554 554
555 last_ack_frames_.push_back(incoming_ack); 555 last_ack_frames_.push_back(incoming_ack);
556 return connected_; 556 return connected_;
557 } 557 }
558 558
559 void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) { 559 void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) {
560 largest_seen_packet_with_ack_ = last_header_.packet_sequence_number; 560 largest_seen_packet_with_ack_ = last_header_.packet_sequence_number;
561 received_packet_manager_.UpdatePacketInformationReceivedByPeer(incoming_ack);
562
563 sent_entropy_manager_.ClearEntropyBefore(
564 received_packet_manager_.least_packet_awaited_by_peer() - 1);
565
566 sent_packet_manager_.OnIncomingAck(incoming_ack, 561 sent_packet_manager_.OnIncomingAck(incoming_ack,
567 time_of_last_received_packet_); 562 time_of_last_received_packet_);
563 sent_entropy_manager_.ClearEntropyBefore(
564 sent_packet_manager_.least_packet_awaited_by_peer() - 1);
568 if (sent_packet_manager_.HasPendingRetransmissions()) { 565 if (sent_packet_manager_.HasPendingRetransmissions()) {
569 WriteIfNotBlocked(); 566 WriteIfNotBlocked();
570 } 567 }
571 568
572 // Always reset the retransmission alarm when an ack comes in, since we now 569 // Always reset the retransmission alarm when an ack comes in, since we now
573 // have a better estimate of the current rtt than when it was set. 570 // have a better estimate of the current rtt than when it was set.
574 QuicTime retransmission_time = 571 QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime();
575 sent_packet_manager_.GetRetransmissionTime();
576 retransmission_alarm_->Update(retransmission_time, 572 retransmission_alarm_->Update(retransmission_time,
577 QuicTime::Delta::FromMilliseconds(1)); 573 QuicTime::Delta::FromMilliseconds(1));
578 } 574 }
579 575
580 void QuicConnection::ProcessStopWaitingFrame( 576 void QuicConnection::ProcessStopWaitingFrame(
581 const QuicStopWaitingFrame& stop_waiting) { 577 const QuicStopWaitingFrame& stop_waiting) {
582 largest_seen_packet_with_stop_waiting_ = last_header_.packet_sequence_number; 578 largest_seen_packet_with_stop_waiting_ = last_header_.packet_sequence_number;
583 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting); 579 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting);
584 // Possibly close any FecGroups which are now irrelevant. 580 // Possibly close any FecGroups which are now irrelevant.
585 CloseFecGroupsBefore(stop_waiting.least_unacked + 1); 581 CloseFecGroupsBefore(stop_waiting.least_unacked + 1);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 623
628 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { 624 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) {
629 if (incoming_ack.largest_observed > packet_generator_.sequence_number()) { 625 if (incoming_ack.largest_observed > packet_generator_.sequence_number()) {
630 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" 626 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:"
631 << incoming_ack.largest_observed << " vs " 627 << incoming_ack.largest_observed << " vs "
632 << packet_generator_.sequence_number(); 628 << packet_generator_.sequence_number();
633 // We got an error for data we have not sent. Error out. 629 // We got an error for data we have not sent. Error out.
634 return false; 630 return false;
635 } 631 }
636 632
637 if (incoming_ack.largest_observed < 633 if (incoming_ack.largest_observed < sent_packet_manager_.largest_observed()) {
638 received_packet_manager_.peer_largest_observed_packet()) {
639 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:" 634 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:"
640 << incoming_ack.largest_observed << " vs " 635 << incoming_ack.largest_observed << " vs "
641 << received_packet_manager_.peer_largest_observed_packet(); 636 << sent_packet_manager_.largest_observed();
642 // A new ack has a diminished largest_observed value. Error out. 637 // A new ack has a diminished largest_observed value. Error out.
643 // If this was an old packet, we wouldn't even have checked. 638 // If this was an old packet, we wouldn't even have checked.
644 return false; 639 return false;
645 } 640 }
646 641
647 if (!incoming_ack.missing_packets.empty() && 642 if (!incoming_ack.missing_packets.empty() &&
648 *incoming_ack.missing_packets.rbegin() > incoming_ack.largest_observed) { 643 *incoming_ack.missing_packets.rbegin() > incoming_ack.largest_observed) {
649 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " 644 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: "
650 << *incoming_ack.missing_packets.rbegin() 645 << *incoming_ack.missing_packets.rbegin()
651 << " which is greater than largest observed: " 646 << " which is greater than largest observed: "
652 << incoming_ack.largest_observed; 647 << incoming_ack.largest_observed;
653 return false; 648 return false;
654 } 649 }
655 650
656 if (!incoming_ack.missing_packets.empty() && 651 if (!incoming_ack.missing_packets.empty() &&
657 *incoming_ack.missing_packets.begin() < 652 *incoming_ack.missing_packets.begin() <
658 received_packet_manager_.least_packet_awaited_by_peer()) { 653 sent_packet_manager_.least_packet_awaited_by_peer()) {
659 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " 654 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: "
660 << *incoming_ack.missing_packets.begin() 655 << *incoming_ack.missing_packets.begin()
661 << " which is smaller than least_packet_awaited_by_peer_: " 656 << " which is smaller than least_packet_awaited_by_peer_: "
662 << received_packet_manager_.least_packet_awaited_by_peer(); 657 << sent_packet_manager_.least_packet_awaited_by_peer();
663 return false; 658 return false;
664 } 659 }
665 660
666 if (!sent_entropy_manager_.IsValidEntropy( 661 if (!sent_entropy_manager_.IsValidEntropy(
667 incoming_ack.largest_observed, 662 incoming_ack.largest_observed,
668 incoming_ack.missing_packets, 663 incoming_ack.missing_packets,
669 incoming_ack.entropy_hash)) { 664 incoming_ack.entropy_hash)) {
670 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; 665 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy.";
671 return false; 666 return false;
672 } 667 }
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after
1365 // This assures we won't try to write *forced* packets when blocked. 1360 // This assures we won't try to write *forced* packets when blocked.
1366 // Return true to stop processing. 1361 // Return true to stop processing.
1367 if (writer_->IsWriteBlocked()) { 1362 if (writer_->IsWriteBlocked()) {
1368 visitor_->OnWriteBlocked(); 1363 visitor_->OnWriteBlocked();
1369 return true; 1364 return true;
1370 } 1365 }
1371 } else { 1366 } else {
1372 encrypted_deleter.reset(encrypted); 1367 encrypted_deleter.reset(encrypted);
1373 } 1368 }
1374 1369
1375 LOG_IF(DFATAL, encrypted->length() > 1370 if (!FLAGS_quic_allow_oversized_packets_for_test) {
1376 packet_generator_.max_packet_length()) 1371 DCHECK_LE(encrypted->length(), kMaxPacketSize);
1377 << "Writing an encrypted packet larger than max_packet_length:" 1372 }
1378 << packet_generator_.max_packet_length() << " encrypted length: " 1373 DCHECK_LE(encrypted->length(), packet_generator_.max_packet_length());
1379 << encrypted->length();
1380 DVLOG(1) << ENDPOINT << "Sending packet " << sequence_number 1374 DVLOG(1) << ENDPOINT << "Sending packet " << sequence_number
1381 << " : " << (packet.packet->is_fec_packet() ? "FEC " : 1375 << " : " << (packet.packet->is_fec_packet() ? "FEC " :
1382 (packet.retransmittable == HAS_RETRANSMITTABLE_DATA 1376 (packet.retransmittable == HAS_RETRANSMITTABLE_DATA
1383 ? "data bearing " : " ack only ")) 1377 ? "data bearing " : " ack only "))
1384 << ", encryption level: " 1378 << ", encryption level: "
1385 << QuicUtils::EncryptionLevelToString(packet.encryption_level) 1379 << QuicUtils::EncryptionLevelToString(packet.encryption_level)
1386 << ", length:" << packet.packet->length() << ", encrypted length:" 1380 << ", length:" << packet.packet->length() << ", encrypted length:"
1387 << encrypted->length(); 1381 << encrypted->length();
1388 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl 1382 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl
1389 << QuicUtils::StringToHexASCIIDump(packet.packet->AsStringPiece()); 1383 << QuicUtils::StringToHexASCIIDump(packet.packet->AsStringPiece());
1390 1384
1391 DCHECK(encrypted->length() <= kMaxPacketSize ||
1392 FLAGS_quic_allow_oversized_packets_for_test)
1393 << "Packet " << sequence_number << " will not be read; too large: "
1394 << packet.packet->length() << " " << encrypted->length() << " "
1395 << " close: " << (packet.type == CONNECTION_CLOSE ? "yes" : "no");
1396
1397 DCHECK(pending_write_.get() == NULL);
1398 pending_write_.reset(new QueuedPacket(packet));
1399
1400 WriteResult result = writer_->WritePacket(encrypted->data(), 1385 WriteResult result = writer_->WritePacket(encrypted->data(),
1401 encrypted->length(), 1386 encrypted->length(),
1402 self_address().address(), 1387 self_address().address(),
1403 peer_address()); 1388 peer_address());
1404 if (result.error_code == ERR_IO_PENDING) { 1389 if (result.error_code == ERR_IO_PENDING) {
1405 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); 1390 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status);
1406 } 1391 }
1407 if (debug_visitor_.get() != NULL) { 1392 if (debug_visitor_.get() != NULL) {
1408 // Pass the write result to the visitor. 1393 // Pass the write result to the visitor.
1409 debug_visitor_->OnPacketSent(sequence_number, 1394 debug_visitor_->OnPacketSent(sequence_number,
1410 packet.encryption_level, 1395 packet.encryption_level,
1411 packet.transmission_type, 1396 packet.transmission_type,
1412 *encrypted, 1397 *encrypted,
1413 result); 1398 result);
1414 } 1399 }
1400
1415 if (result.status == WRITE_STATUS_BLOCKED) { 1401 if (result.status == WRITE_STATUS_BLOCKED) {
1416 visitor_->OnWriteBlocked(); 1402 visitor_->OnWriteBlocked();
1417 // If the socket buffers the the data, then the packet should not 1403 // If the socket buffers the the data, then the packet should not
1418 // be queued and sent again, which would result in an unnecessary 1404 // be queued and sent again, which would result in an unnecessary
1419 // duplicate packet being sent. The helper must call OnPacketSent 1405 // duplicate packet being sent. The helper must call OnCanWrite
1420 // when the packet is actually sent. 1406 // when the write completes, and OnWriteError if an error occurs.
1421 if (writer_->IsWriteBlockedDataBuffered()) { 1407 if (!writer_->IsWriteBlockedDataBuffered()) {
1422 return true; 1408 return false;
1423 } 1409 }
1424 pending_write_.reset(); 1410 }
1411 QuicTime now = clock_->Now();
1412 if (packet.transmission_type == NOT_RETRANSMISSION) {
1413 time_of_last_sent_new_packet_ = now;
1414 }
1415 SetPingAlarm();
1416 DVLOG(1) << ENDPOINT << "time of last sent packet: "
1417 << now.ToDebuggingValue();
1418
1419 // TODO(ianswett): Change the sequence number length and other packet creator
1420 // options by a more explicit API than setting a struct value directly,
1421 // perhaps via the NetworkChangeVisitor.
1422 packet_generator_.UpdateSequenceNumberLength(
1423 sent_packet_manager_.least_packet_awaited_by_peer(),
1424 sent_packet_manager_.GetCongestionWindow());
1425
1426 bool reset_retransmission_alarm =
1427 sent_packet_manager_.OnPacketSent(sequence_number,
1428 now,
1429 encrypted->length(),
1430 packet.transmission_type,
1431 packet.retransmittable);
1432
1433 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) {
1434 retransmission_alarm_->Update(sent_packet_manager_.GetRetransmissionTime(),
1435 QuicTime::Delta::FromMilliseconds(1));
1436 }
1437
1438 stats_.bytes_sent += result.bytes_written;
1439 ++stats_.packets_sent;
1440 if (packet.transmission_type != NOT_RETRANSMISSION) {
1441 stats_.bytes_retransmitted += result.bytes_written;
1442 ++stats_.packets_retransmitted;
1443 }
1444
1445 if (result.status == WRITE_STATUS_ERROR) {
1446 OnWriteError(result.error_code);
1425 return false; 1447 return false;
1426 } 1448 }
1427 1449
1428 if (OnPacketSent(result)) { 1450 return true;
1429 return true;
1430 }
1431 return false;
1432 } 1451 }
1433 1452
1434 bool QuicConnection::ShouldDiscardPacket( 1453 bool QuicConnection::ShouldDiscardPacket(
1435 EncryptionLevel level, 1454 EncryptionLevel level,
1436 QuicPacketSequenceNumber sequence_number, 1455 QuicPacketSequenceNumber sequence_number,
1437 HasRetransmittableData retransmittable) { 1456 HasRetransmittableData retransmittable) {
1438 if (!connected_) { 1457 if (!connected_) {
1439 DVLOG(1) << ENDPOINT 1458 DVLOG(1) << ENDPOINT
1440 << "Not sending packet as connection is disconnected."; 1459 << "Not sending packet as connection is disconnected.";
1441 return true; 1460 return true;
(...skipping 23 matching lines...) Expand all
1465 if (retransmittable == HAS_RETRANSMITTABLE_DATA && 1484 if (retransmittable == HAS_RETRANSMITTABLE_DATA &&
1466 !sent_packet_manager_.HasRetransmittableFrames(sequence_number)) { 1485 !sent_packet_manager_.HasRetransmittableFrames(sequence_number)) {
1467 DVLOG(1) << ENDPOINT << "Dropping unacked packet: " << sequence_number 1486 DVLOG(1) << ENDPOINT << "Dropping unacked packet: " << sequence_number
1468 << " A previous transmission was acked while write blocked."; 1487 << " A previous transmission was acked while write blocked.";
1469 return true; 1488 return true;
1470 } 1489 }
1471 1490
1472 return false; 1491 return false;
1473 } 1492 }
1474 1493
1475 bool QuicConnection::OnPacketSent(WriteResult result) { 1494 void QuicConnection::OnWriteError(int error_code) {
1476 DCHECK_NE(WRITE_STATUS_BLOCKED, result.status); 1495 DVLOG(1) << ENDPOINT << "Write failed with error: " << error_code
1477 if (pending_write_.get() == NULL) { 1496 << " (" << ErrorToString(error_code) << ")";
1478 LOG(DFATAL) << "OnPacketSent called without a pending write."; 1497 // We can't send an error as the socket is presumably borked.
1479 return false; 1498 CloseConnection(QUIC_PACKET_WRITE_ERROR, false);
1480 }
1481
1482 QuicPacketSequenceNumber sequence_number = pending_write_->sequence_number;
1483 TransmissionType transmission_type = pending_write_->transmission_type;
1484 HasRetransmittableData retransmittable = pending_write_->retransmittable;
1485 size_t length = pending_write_->length;
1486 pending_write_.reset();
1487
1488 if (result.status == WRITE_STATUS_ERROR) {
1489 DVLOG(1) << ENDPOINT << "Write failed with error: " << result.error_code
1490 << " (" << ErrorToString(result.error_code) << ")";
1491 // We can't send an error as the socket is presumably borked.
1492 CloseConnection(QUIC_PACKET_WRITE_ERROR, false);
1493 return false;
1494 }
1495
1496 QuicTime now = clock_->Now();
1497 if (transmission_type == NOT_RETRANSMISSION) {
1498 time_of_last_sent_new_packet_ = now;
1499 }
1500 SetPingAlarm();
1501 DVLOG(1) << ENDPOINT << "time of last sent packet: "
1502 << now.ToDebuggingValue();
1503
1504 // TODO(ianswett): Change the sequence number length and other packet creator
1505 // options by a more explicit API than setting a struct value directly.
1506 packet_generator_.UpdateSequenceNumberLength(
1507 received_packet_manager_.least_packet_awaited_by_peer(),
1508 sent_packet_manager_.GetCongestionWindow());
1509
1510 bool reset_retransmission_alarm =
1511 sent_packet_manager_.OnPacketSent(sequence_number, now, length,
1512 transmission_type, retransmittable);
1513
1514 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) {
1515 QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime();
1516 retransmission_alarm_->Update(retransmission_time,
1517 QuicTime::Delta::FromMilliseconds(1));
1518 }
1519
1520 stats_.bytes_sent += result.bytes_written;
1521 ++stats_.packets_sent;
1522
1523 if (transmission_type != NOT_RETRANSMISSION) {
1524 stats_.bytes_retransmitted += result.bytes_written;
1525 ++stats_.packets_retransmitted;
1526 }
1527
1528 return true;
1529 } 1499 }
1530 1500
1531 bool QuicConnection::OnSerializedPacket( 1501 bool QuicConnection::OnSerializedPacket(
1532 const SerializedPacket& serialized_packet) { 1502 const SerializedPacket& serialized_packet) {
1533 if (serialized_packet.retransmittable_frames) { 1503 if (serialized_packet.retransmittable_frames) {
1534 serialized_packet.retransmittable_frames-> 1504 serialized_packet.retransmittable_frames->
1535 set_encryption_level(encryption_level_); 1505 set_encryption_level(encryption_level_);
1536 } 1506 }
1537 sent_packet_manager_.OnSerializedPacket(serialized_packet); 1507 sent_packet_manager_.OnSerializedPacket(serialized_packet);
1538 // The TransmissionType is NOT_RETRANSMISSION because all retransmissions 1508 // The TransmissionType is NOT_RETRANSMISSION because all retransmissions
1539 // serialize packets and invoke SendOrQueuePacket directly. 1509 // serialize packets and invoke SendOrQueuePacket directly.
1540 return SendOrQueuePacket(encryption_level_, 1510 return SendOrQueuePacket(encryption_level_,
1541 serialized_packet, 1511 serialized_packet,
1542 NOT_RETRANSMISSION); 1512 NOT_RETRANSMISSION);
1543 } 1513 }
1544 1514
1515 void QuicConnection::OnCongestionWindowChange(QuicByteCount congestion_window) {
1516 packet_generator_.OnCongestionWindowChange(congestion_window);
1517 visitor_->OnCongestionWindowChange(clock_->ApproximateNow());
1518 }
1519
1545 void QuicConnection::OnHandshakeComplete() { 1520 void QuicConnection::OnHandshakeComplete() {
1546 sent_packet_manager_.SetHandshakeConfirmed(); 1521 sent_packet_manager_.SetHandshakeConfirmed();
1547 } 1522 }
1548 1523
1549 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level, 1524 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level,
1550 const SerializedPacket& packet, 1525 const SerializedPacket& packet,
1551 TransmissionType transmission_type) { 1526 TransmissionType transmission_type) {
1552 if (packet.packet == NULL) { 1527 if (packet.packet == NULL) {
1553 LOG(DFATAL) << "NULL packet passed in to SendOrQueuePacket"; 1528 LOG(DFATAL) << "NULL packet passed in to SendOrQueuePacket";
1554 return true; 1529 return true;
1555 } 1530 }
1556 1531
1557 sent_entropy_manager_.RecordPacketEntropyHash(packet.sequence_number, 1532 sent_entropy_manager_.RecordPacketEntropyHash(packet.sequence_number,
1558 packet.entropy_hash); 1533 packet.entropy_hash);
1559 QueuedPacket queued_packet(packet, level, transmission_type); 1534 QueuedPacket queued_packet(packet, level, transmission_type);
1560 // If there are already queued packets, put this at the end, 1535 // If there are already queued packets, put this at the end,
1561 // unless it's ConnectionClose, in which case it is written immediately. 1536 // unless it's ConnectionClose, in which case it is written immediately.
1562 if ((queued_packet.type == CONNECTION_CLOSE || queued_packets_.empty()) && 1537 if ((queued_packet.type == CONNECTION_CLOSE || queued_packets_.empty()) &&
1563 WritePacket(queued_packet)) { 1538 WritePacket(queued_packet)) {
1564 delete packet.packet; 1539 delete packet.packet;
1565 return true; 1540 return true;
1566 } 1541 }
1567 queued_packet.type = QUEUED; 1542 queued_packet.type = QUEUED;
1568 queued_packets_.push_back(queued_packet); 1543 queued_packets_.push_back(queued_packet);
1569 return false; 1544 return false;
1570 } 1545 }
1571 1546
1572 void QuicConnection::UpdateStopWaiting(QuicStopWaitingFrame* stop_waiting) { 1547 void QuicConnection::UpdateStopWaiting(QuicStopWaitingFrame* stop_waiting) {
1573 stop_waiting->least_unacked = GetLeastUnacked(); 1548 stop_waiting->least_unacked = GetLeastUnacked();
1574 stop_waiting->entropy_hash = sent_entropy_manager_.EntropyHash( 1549 stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy(
1575 stop_waiting->least_unacked - 1); 1550 stop_waiting->least_unacked - 1);
1576 } 1551 }
1577 1552
1578 void QuicConnection::SendPing() { 1553 void QuicConnection::SendPing() {
1579 if (retransmission_alarm_->IsSet()) { 1554 if (retransmission_alarm_->IsSet()) {
1580 return; 1555 return;
1581 } 1556 }
1582 if (version() == QUIC_VERSION_16) { 1557 if (version() == QUIC_VERSION_16) {
1583 // TODO(rch): remove this when we remove version 15 and 16. 1558 // TODO(rch): remove this when we remove version 15 and 16.
1584 // This is a horrible hideous hack which we should not support. 1559 // This is a horrible hideous hack which we should not support.
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1810 return; 1785 return;
1811 } 1786 }
1812 connected_ = false; 1787 connected_ = false;
1813 if (debug_visitor_.get() != NULL) { 1788 if (debug_visitor_.get() != NULL) {
1814 debug_visitor_->OnConnectionClosed(error, from_peer); 1789 debug_visitor_->OnConnectionClosed(error, from_peer);
1815 } 1790 }
1816 visitor_->OnConnectionClosed(error, from_peer); 1791 visitor_->OnConnectionClosed(error, from_peer);
1817 // Cancel the alarms so they don't trigger any action now that the 1792 // Cancel the alarms so they don't trigger any action now that the
1818 // connection is closed. 1793 // connection is closed.
1819 ack_alarm_->Cancel(); 1794 ack_alarm_->Cancel();
1795 ping_alarm_->Cancel();
1820 resume_writes_alarm_->Cancel(); 1796 resume_writes_alarm_->Cancel();
1821 retransmission_alarm_->Cancel(); 1797 retransmission_alarm_->Cancel();
1822 send_alarm_->Cancel(); 1798 send_alarm_->Cancel();
1823 timeout_alarm_->Cancel(); 1799 timeout_alarm_->Cancel();
1824 } 1800 }
1825 1801
1826 void QuicConnection::SendGoAway(QuicErrorCode error, 1802 void QuicConnection::SendGoAway(QuicErrorCode error,
1827 QuicStreamId last_good_stream_id, 1803 QuicStreamId last_good_stream_id,
1828 const string& reason) { 1804 const string& reason) {
1829 DVLOG(1) << ENDPOINT << "Going away with error " 1805 DVLOG(1) << ENDPOINT << "Going away with error "
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
2009 // 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.
2010 if (!already_in_batch_mode_) { 1986 if (!already_in_batch_mode_) {
2011 DVLOG(1) << "Leaving Batch Mode."; 1987 DVLOG(1) << "Leaving Batch Mode.";
2012 connection_->packet_generator_.FinishBatchOperations(); 1988 connection_->packet_generator_.FinishBatchOperations();
2013 } 1989 }
2014 DCHECK_EQ(already_in_batch_mode_, 1990 DCHECK_EQ(already_in_batch_mode_,
2015 connection_->packet_generator_.InBatchMode()); 1991 connection_->packet_generator_.InBatchMode());
2016 } 1992 }
2017 1993
2018 } // namespace net 1994 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698