OLD | NEW |
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 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 LOG(DFATAL) << "Received a packet with multipath flag on when multipath is " | 637 LOG(DFATAL) << "Received a packet with multipath flag on when multipath is " |
638 "not enabled."; | 638 "not enabled."; |
639 SendConnectionCloseWithDetails(QUIC_BAD_MULTIPATH_FLAG, | 639 SendConnectionCloseWithDetails(QUIC_BAD_MULTIPATH_FLAG, |
640 "receive a packet with multipath flag on " | 640 "receive a packet with multipath flag on " |
641 "when multipath is not enabled."); | 641 "when multipath is not enabled."); |
642 return false; | 642 return false; |
643 } | 643 } |
644 | 644 |
645 // If this packet has already been seen, or the sender has told us that it | 645 // If this packet has already been seen, or the sender has told us that it |
646 // will not be retransmitted, then stop processing the packet. | 646 // will not be retransmitted, then stop processing the packet. |
647 if (FLAGS_quic_drop_non_awaited_packets && | 647 if (!received_packet_manager_.IsAwaitingPacket(header.packet_number)) { |
648 !received_packet_manager_.IsAwaitingPacket(header.packet_number)) { | |
649 DVLOG(1) << ENDPOINT << "Packet " << header.packet_number | 648 DVLOG(1) << ENDPOINT << "Packet " << header.packet_number |
650 << " no longer being waited for. Discarding."; | 649 << " no longer being waited for. Discarding."; |
651 if (debug_visitor_ != nullptr) { | 650 if (debug_visitor_ != nullptr) { |
652 debug_visitor_->OnDuplicatePacket(header.packet_number); | 651 debug_visitor_->OnDuplicatePacket(header.packet_number); |
653 } | 652 } |
654 ++stats_.packets_dropped; | 653 ++stats_.packets_dropped; |
655 return false; | 654 return false; |
656 } | 655 } |
657 | 656 |
658 return true; | 657 return true; |
(...skipping 746 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1405 } | 1404 } |
1406 | 1405 |
1407 if (!Near(header.packet_number, last_header_.packet_number)) { | 1406 if (!Near(header.packet_number, last_header_.packet_number)) { |
1408 DVLOG(1) << ENDPOINT << "Packet " << header.packet_number | 1407 DVLOG(1) << ENDPOINT << "Packet " << header.packet_number |
1409 << " out of bounds. Discarding"; | 1408 << " out of bounds. Discarding"; |
1410 SendConnectionCloseWithDetails(QUIC_INVALID_PACKET_HEADER, | 1409 SendConnectionCloseWithDetails(QUIC_INVALID_PACKET_HEADER, |
1411 "packet number out of bounds"); | 1410 "packet number out of bounds"); |
1412 return false; | 1411 return false; |
1413 } | 1412 } |
1414 | 1413 |
1415 // If this packet has already been seen, or the sender has told us that it | |
1416 // will not be retransmitted, then stop processing the packet. | |
1417 if (!FLAGS_quic_drop_non_awaited_packets && | |
1418 !received_packet_manager_.IsAwaitingPacket(header.packet_number)) { | |
1419 DVLOG(1) << ENDPOINT << "Packet " << header.packet_number | |
1420 << " no longer being waited for. Discarding."; | |
1421 if (debug_visitor_ != nullptr) { | |
1422 debug_visitor_->OnDuplicatePacket(header.packet_number); | |
1423 } | |
1424 return false; | |
1425 } | |
1426 | |
1427 if (version_negotiation_state_ != NEGOTIATED_VERSION) { | 1414 if (version_negotiation_state_ != NEGOTIATED_VERSION) { |
1428 if (perspective_ == Perspective::IS_SERVER) { | 1415 if (perspective_ == Perspective::IS_SERVER) { |
1429 if (!header.public_header.version_flag) { | 1416 if (!header.public_header.version_flag) { |
1430 // Packets should have the version flag till version negotiation is | 1417 // Packets should have the version flag till version negotiation is |
1431 // done. | 1418 // done. |
1432 string error_details = | 1419 string error_details = |
1433 StringPrintf("%s Packet %" PRIu64 | 1420 StringPrintf("%s Packet %" PRIu64 |
1434 " without version flag before version negotiated.", | 1421 " without version flag before version negotiated.", |
1435 ENDPOINT, header.packet_number); | 1422 ENDPOINT, header.packet_number); |
1436 DLOG(WARNING) << error_details; | 1423 DLOG(WARNING) << error_details; |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2018 } | 2005 } |
2019 | 2006 |
2020 ++stats_.packets_revived; | 2007 ++stats_.packets_revived; |
2021 framer_.ProcessRevivedPacket(&revived_header, | 2008 framer_.ProcessRevivedPacket(&revived_header, |
2022 StringPiece(revived_payload, len)); | 2009 StringPiece(revived_payload, len)); |
2023 } | 2010 } |
2024 | 2011 |
2025 QuicFecGroup* QuicConnection::GetFecGroup() { | 2012 QuicFecGroup* QuicConnection::GetFecGroup() { |
2026 QuicFecGroupNumber fec_group_num = last_header_.fec_group; | 2013 QuicFecGroupNumber fec_group_num = last_header_.fec_group; |
2027 if (fec_group_num == 0 || | 2014 if (fec_group_num == 0 || |
2028 (FLAGS_quic_drop_non_awaited_packets && | 2015 (fec_group_num < |
2029 fec_group_num < | |
2030 received_packet_manager_.peer_least_packet_awaiting_ack() && | 2016 received_packet_manager_.peer_least_packet_awaiting_ack() && |
2031 !ContainsKey(group_map_, fec_group_num))) { | 2017 !ContainsKey(group_map_, fec_group_num))) { |
2032 // If the group number is below peer_least_packet_awaiting_ack and this | 2018 // If the group number is below peer_least_packet_awaiting_ack and this |
2033 // group does not exist, which means this group has missing packets below | 2019 // group does not exist, which means this group has missing packets below |
2034 // |peer_least_packet_awaiting_ack| which we would never receive, so return | 2020 // |peer_least_packet_awaiting_ack| which we would never receive, so return |
2035 // nullptr. | 2021 // nullptr. |
2036 return nullptr; | 2022 return nullptr; |
2037 } | 2023 } |
2038 if (!ContainsKey(group_map_, fec_group_num)) { | 2024 if (!ContainsKey(group_map_, fec_group_num)) { |
2039 if (group_map_.size() >= kMaxFecGroups) { // Too many groups | 2025 if (group_map_.size() >= kMaxFecGroups) { // Too many groups |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2122 // Opportunistically bundle an ack with this outgoing packet. | 2108 // Opportunistically bundle an ack with this outgoing packet. |
2123 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); | 2109 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); |
2124 packet_generator_.AddControlFrame( | 2110 packet_generator_.AddControlFrame( |
2125 QuicFrame(new QuicGoAwayFrame(error, last_good_stream_id, reason))); | 2111 QuicFrame(new QuicGoAwayFrame(error, last_good_stream_id, reason))); |
2126 } | 2112 } |
2127 | 2113 |
2128 void QuicConnection::CloseFecGroupsBefore(QuicPacketNumber packet_number) { | 2114 void QuicConnection::CloseFecGroupsBefore(QuicPacketNumber packet_number) { |
2129 FecGroupMap::iterator it = group_map_.begin(); | 2115 FecGroupMap::iterator it = group_map_.begin(); |
2130 while (it != group_map_.end()) { | 2116 while (it != group_map_.end()) { |
2131 // If the group doesn't protect this packet we can ignore it. | 2117 // If the group doesn't protect this packet we can ignore it. |
2132 if ((!FLAGS_quic_drop_non_awaited_packets && | 2118 if (!it->second->IsWaitingForPacketBefore(packet_number)) { |
2133 last_header_.fec_group == it->first) || | |
2134 !it->second->IsWaitingForPacketBefore(packet_number)) { | |
2135 ++it; | 2119 ++it; |
2136 continue; | 2120 continue; |
2137 } | 2121 } |
2138 QuicFecGroup* fec_group = it->second; | 2122 QuicFecGroup* fec_group = it->second; |
2139 DCHECK(!fec_group->CanRevive()); | 2123 DCHECK(!fec_group->CanRevive()); |
2140 FecGroupMap::iterator next = it; | 2124 FecGroupMap::iterator next = it; |
2141 ++next; | 2125 ++next; |
2142 group_map_.erase(it); | 2126 group_map_.erase(it); |
2143 delete fec_group; | 2127 delete fec_group; |
2144 it = next; | 2128 it = next; |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2511 void QuicConnection::OnPathClosed(QuicPathId path_id) { | 2495 void QuicConnection::OnPathClosed(QuicPathId path_id) { |
2512 // Stop receiving packets on this path. | 2496 // Stop receiving packets on this path. |
2513 framer_.OnPathClosed(path_id); | 2497 framer_.OnPathClosed(path_id); |
2514 } | 2498 } |
2515 | 2499 |
2516 bool QuicConnection::ack_frame_updated() const { | 2500 bool QuicConnection::ack_frame_updated() const { |
2517 return received_packet_manager_.ack_frame_updated(); | 2501 return received_packet_manager_.ack_frame_updated(); |
2518 } | 2502 } |
2519 | 2503 |
2520 } // namespace net | 2504 } // namespace net |
OLD | NEW |