summaryrefslogtreecommitdiffstats
path: root/net/quic
diff options
context:
space:
mode:
authorrtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-04 22:20:12 +0000
committerrtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-04 22:20:12 +0000
commit69dfd1b5eb1873e1761b5904b42ebbae67b51a65 (patch)
tree8cb9f4ad815f4aeec9b5172842ec275ec37e40db /net/quic
parentb27b193112e0e236b48667ade7493416b21b5edd (diff)
downloadchromium_src-69dfd1b5eb1873e1761b5904b42ebbae67b51a65.zip
chromium_src-69dfd1b5eb1873e1761b5904b42ebbae67b51a65.tar.gz
chromium_src-69dfd1b5eb1873e1761b5904b42ebbae67b51a65.tar.bz2
Revert 204046 "Land Recent QUIC changes."
> Land Recent QUIC changes. > > Merge internal change: 47341065 > > Fix to ensure the version matches before declaring that the public header > flags exceed the max value. b/9190456 > > Merge internal change: 47324563 > > Fixing another backup bug (exposed by the last fix) that if we failed to > write a standalone fin the stream would not be marked as write blocked. > > Merge internal change: 47272116 > > Don't add QuicStreams to ActiveSessionList; Instead call DumpSession on > alive streams via QuicSession. > > Merge internal change: 47226512 > > Making the packet sequence number variable length to minimize bytes on the wire. > > Merge internal change: 47220850 > > Fixing a bug in quic stream where we'd send rst stream packets for > successful streams. The fin bit should be sufficient for both good > request/response pairs and early response pairs. > > Merge internal change: 47086343 > > Don't let FEC packets consume congestion window forever. If a FEC packet > is not acked after a certain time, it is cleared from the congestion > window. This timeout is higher than normal RTO. > > Merge internal change: 47056082 > > Add QuicSession to ActiveSessionList. > > Merge internal change: 47048300 > > Fixing a backup/resumption bug in QUIC. > > It's possible to have a full congestion window worth of packets on the wire. > > If we are in this state and a session tries to SendStreamData, the > QuicPacketGenerator short-circuits without queuing packets because it checks > to see if the connection CanWrite. > > When we get an ack, we check to see if we have locally queued packets, but > never call OnCanWrite on the session to clear any streams which write blocked > without queueing packets. > > Merge internal change: 47000173 > > QUIC: wire up the server-nonce parameters to the server config. > > Merge internal change: 46985067 > > R=rch@chromium.org > > Review URL: https://codereview.chromium.org/16256017 TBR=rtenneti@chromium.org Review URL: https://codereview.chromium.org/16374004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@204062 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/quic')
-rw-r--r--net/quic/congestion_control/quic_congestion_manager.cc1
-rw-r--r--net/quic/crypto/crypto_server_config.cc12
-rw-r--r--net/quic/crypto/crypto_server_config.h15
-rw-r--r--net/quic/quic_connection.cc175
-rw-r--r--net/quic/quic_connection.h61
-rw-r--r--net/quic/quic_connection_test.cc141
-rw-r--r--net/quic/quic_framer.cc214
-rw-r--r--net/quic/quic_framer.h13
-rw-r--r--net/quic/quic_framer_test.cc600
-rw-r--r--net/quic/quic_http_stream_test.cc3
-rw-r--r--net/quic/quic_packet_creator.cc11
-rw-r--r--net/quic/quic_packet_creator.h14
-rw-r--r--net/quic/quic_packet_creator_test.cc2
-rw-r--r--net/quic/quic_protocol.cc56
-rw-r--r--net/quic/quic_protocol.h78
-rw-r--r--net/quic/quic_session.cc23
-rw-r--r--net/quic/quic_session.h11
-rw-r--r--net/quic/quic_stream_factory_test.cc59
-rw-r--r--net/quic/reliable_quic_stream.cc10
-rw-r--r--net/quic/reliable_quic_stream_test.cc64
-rw-r--r--net/quic/test_tools/quic_framer_peer.cc4
-rw-r--r--net/quic/test_tools/quic_framer_peer.h1
-rw-r--r--net/quic/test_tools/quic_session_peer.cc13
-rw-r--r--net/quic/test_tools/quic_session_peer.h6
-rw-r--r--net/quic/test_tools/quic_test_utils.cc6
25 files changed, 405 insertions, 1188 deletions
diff --git a/net/quic/congestion_control/quic_congestion_manager.cc b/net/quic/congestion_control/quic_congestion_manager.cc
index a6bd0a8..d40293c 100644
--- a/net/quic/congestion_control/quic_congestion_manager.cc
+++ b/net/quic/congestion_control/quic_congestion_manager.cc
@@ -62,7 +62,6 @@ void QuicCongestionManager::AbandoningPacket(
QuicPacketSequenceNumber sequence_number) {
PendingPacketsMap::iterator it = pending_packets_.find(sequence_number);
if (it != pending_packets_.end()) {
- // Shouldn't this report loss as well? (decrease cgst window).
send_algorithm_->AbandoningPacket(sequence_number, it->second);
pending_packets_.erase(it);
}
diff --git a/net/quic/crypto/crypto_server_config.cc b/net/quic/crypto/crypto_server_config.cc
index 8f3c980..aa30e67 100644
--- a/net/quic/crypto/crypto_server_config.cc
+++ b/net/quic/crypto/crypto_server_config.cc
@@ -631,18 +631,6 @@ void QuicCryptoServerConfig::set_source_address_token_lifetime_secs(
source_address_token_lifetime_secs_ = lifetime_secs;
}
-void QuicCryptoServerConfig::set_server_nonce_strike_register_max_entries(
- uint32 max_entries) {
- DCHECK(!server_nonce_strike_register_.get());
- server_nonce_strike_register_max_entries_ = max_entries;
-}
-
-void QuicCryptoServerConfig::set_server_nonce_strike_register_window_secs(
- uint32 window_secs) {
- DCHECK(!server_nonce_strike_register_.get());
- server_nonce_strike_register_window_secs_ = window_secs;
-}
-
string QuicCryptoServerConfig::NewSourceAddressToken(
const IPEndPoint& ip,
QuicRandom* rand,
diff --git a/net/quic/crypto/crypto_server_config.h b/net/quic/crypto/crypto_server_config.h
index a37c914..7799fdd 100644
--- a/net/quic/crypto/crypto_server_config.h
+++ b/net/quic/crypto/crypto_server_config.h
@@ -140,21 +140,6 @@ class NET_EXPORT_PRIVATE QuicCryptoServerConfig {
// source-address token will be valid for.
void set_source_address_token_lifetime_secs(uint32 lifetime_secs);
- // set_server_nonce_strike_register_max_entries sets the number of entries in
- // the server-nonce strike-register. This is used to record that server nonce
- // values have been used. If the number of entries is too small then clients
- // which are depending on server nonces may fail to handshake because their
- // nonce has expired in the amount of time it took to go from the server to
- // the client and back.
- void set_server_nonce_strike_register_max_entries(uint32 max_entries);
-
- // set_server_nonce_strike_register_window_secs sets the number of seconds
- // around the current time that the server-nonce strike-register will accept
- // nonces from. Setting a larger value allows for clients to delay follow-up
- // client hellos for longer and still use server nonces as proofs of
- // uniqueness.
- void set_server_nonce_strike_register_window_secs(uint32 window_secs);
-
private:
friend class test::QuicCryptoServerConfigPeer;
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc
index e630473..0698dd3 100644
--- a/net/quic/quic_connection.cc
+++ b/net/quic/quic_connection.cc
@@ -125,7 +125,7 @@ QuicConnection::~QuicConnection() {
it != queued_packets_.end(); ++it) {
delete it->packet;
}
- DLOG(INFO) << ENDPOINT << "write_blocked: " << write_blocked_;
+ LOG(ERROR) << "Quic connection " << write_blocked_;
}
bool QuicConnection::SelectMutualVersion(
@@ -242,7 +242,6 @@ void QuicConnection::OnVersionNegotiationPacket(
if (!SelectMutualVersion(packet.versions)) {
SendConnectionCloseWithDetails(QUIC_INVALID_VERSION,
"no common version found");
- return;
}
version_negotiation_state_ = NEGOTIATED_VERSION;
@@ -362,18 +361,19 @@ bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) {
congestion_manager_.OnIncomingAckFrame(incoming_ack,
time_of_last_received_packet_);
- // Now the we have received an ack, we might be able to send packets which are
- // queued locally, or drain streams which are blocked.
- QuicTime::Delta delay = congestion_manager_.TimeUntilSend(
- time_of_last_received_packet_, NOT_RETRANSMISSION,
- HAS_RETRANSMITTABLE_DATA);
- if (delay.IsZero()) {
- helper_->UnregisterSendAlarmIfRegistered();
- if (!write_blocked_) {
- OnCanWrite();
+ // Now the we have received an ack, we might be able to send queued packets.
+ if (!queued_packets_.empty()) {
+ QuicTime::Delta delay = congestion_manager_.TimeUntilSend(
+ time_of_last_received_packet_, NOT_RETRANSMISSION,
+ HAS_RETRANSMITTABLE_DATA);
+ if (delay.IsZero()) {
+ helper_->UnregisterSendAlarmIfRegistered();
+ if (!write_blocked_) {
+ OnCanWrite();
+ }
+ } else if (!delay.IsInfinite()) {
+ helper_->SetSendAlarm(time_of_last_received_packet_.Add(delay));
}
- } else if (!delay.IsInfinite()) {
- helper_->SetSendAlarm(time_of_last_received_packet_.Add(delay));
}
return connected_;
}
@@ -461,8 +461,24 @@ bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) {
return true;
}
-void QuicConnection::HandleAckForSentPackets(const QuicAckFrame& incoming_ack,
- SequenceNumberSet* acked_packets) {
+void QuicConnection::UpdatePacketInformationReceivedByPeer(
+ const QuicAckFrame& incoming_ack) {
+ SequenceNumberSet acked_packets;
+
+ // ValidateAck should fail if largest_observed ever shrinks.
+ DCHECK_LE(peer_largest_observed_packet_,
+ incoming_ack.received_info.largest_observed);
+ peer_largest_observed_packet_ = incoming_ack.received_info.largest_observed;
+
+ if (incoming_ack.received_info.missing_packets.empty()) {
+ least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1;
+ } else {
+ least_packet_awaited_by_peer_ =
+ *(incoming_ack.received_info.missing_packets.begin());
+ }
+
+ entropy_manager_.ClearSentEntropyBefore(least_packet_awaited_by_peer_ - 1);
+
int retransmitted_packets = 0;
// Go through the packets we have not received an ack for and see if this
// incoming_ack shows they've been seen by the peer.
@@ -476,9 +492,11 @@ void QuicConnection::HandleAckForSentPackets(const QuicAckFrame& incoming_ack,
if (!IsAwaitingPacket(incoming_ack.received_info, sequence_number)) {
// Packet was acked, so remove it from our unacked packet list.
DVLOG(1) << ENDPOINT <<"Got an ack for packet " << sequence_number;
- acked_packets->insert(sequence_number);
+ acked_packets.insert(sequence_number);
delete unacked;
- unacked_packets_.erase(it++);
+ UnackedPacketMap::iterator it_tmp = it;
+ ++it;
+ unacked_packets_.erase(it_tmp);
retransmission_map_.erase(sequence_number);
} else {
// This is a packet which we planned on retransmitting and has not been
@@ -504,48 +522,6 @@ void QuicConnection::HandleAckForSentPackets(const QuicAckFrame& incoming_ack,
}
}
}
-}
-
-void QuicConnection::HandleAckForSentFecPackets(
- const QuicAckFrame& incoming_ack, SequenceNumberSet* acked_packets) {
- UnackedPacketMap::iterator it = unacked_fec_packets_.begin();
- while (it != unacked_fec_packets_.end()) {
- QuicPacketSequenceNumber sequence_number = it->first;
- if (sequence_number > peer_largest_observed_packet_) {
- break;
- }
- if (!IsAwaitingPacket(incoming_ack.received_info, sequence_number)) {
- DVLOG(1) << ENDPOINT << "Got an ack for fec packet: " << sequence_number;
- acked_packets->insert(sequence_number);
- unacked_fec_packets_.erase(it++);
- } else {
- DVLOG(1) << ENDPOINT << "Still missing ack for fec packet: "
- << sequence_number;
- ++it;
- }
- }
-}
-
-void QuicConnection::UpdatePacketInformationReceivedByPeer(
- const QuicAckFrame& incoming_ack) {
- // ValidateAck should fail if largest_observed ever shrinks.
- DCHECK_LE(peer_largest_observed_packet_,
- incoming_ack.received_info.largest_observed);
- peer_largest_observed_packet_ = incoming_ack.received_info.largest_observed;
-
- if (incoming_ack.received_info.missing_packets.empty()) {
- least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1;
- } else {
- least_packet_awaited_by_peer_ =
- *(incoming_ack.received_info.missing_packets.begin());
- }
-
- entropy_manager_.ClearSentEntropyBefore(least_packet_awaited_by_peer_ - 1);
-
- SequenceNumberSet acked_packets;
- HandleAckForSentPackets(incoming_ack, &acked_packets);
- HandleAckForSentFecPackets(incoming_ack, &acked_packets);
-
if (acked_packets.size() > 0) {
visitor_->OnAck(acked_packets);
}
@@ -984,7 +960,7 @@ bool QuicConnection::IsRetransmission(
it->second.number_retransmissions > 0;
}
-void QuicConnection::SetupRetransmission(
+void QuicConnection::MaybeSetupRetransmission(
QuicPacketSequenceNumber sequence_number) {
RetransmissionMap::iterator it = retransmission_map_.find(sequence_number);
if (it == retransmission_map_.end()) {
@@ -997,11 +973,9 @@ void QuicConnection::SetupRetransmission(
congestion_manager_.GetRetransmissionDelay(
unacked_packets_.size(),
retransmission_info.number_retransmissions);
-
- retransmission_timeouts_.push(RetransmissionTime(
- sequence_number,
- clock_->ApproximateNow().Add(retransmission_delay),
- false));
+ retransmission_info.scheduled_time =
+ clock_->ApproximateNow().Add(retransmission_delay);
+ retransmission_timeouts_.push(retransmission_info);
// Do not set the retransmisson alarm if we're already handling the
// retransmission alarm because the retransmission alarm will be reset when
@@ -1013,18 +987,6 @@ void QuicConnection::SetupRetransmission(
// SendStreamData().
}
-void QuicConnection::SetupAbandonFecTimer(
- QuicPacketSequenceNumber sequence_number) {
- DCHECK(ContainsKey(unacked_fec_packets_, sequence_number));
- QuicTime::Delta retransmission_delay =
- QuicTime::Delta::FromMilliseconds(
- congestion_manager_.DefaultRetransmissionTime().ToMilliseconds() * 3);
- retransmission_timeouts_.push(RetransmissionTime(
- sequence_number,
- clock_->ApproximateNow().Add(retransmission_delay),
- true));
-}
-
void QuicConnection::DropPacket(QuicPacketSequenceNumber sequence_number) {
UnackedPacketMap::iterator unacked_it =
unacked_packets_.find(sequence_number);
@@ -1115,11 +1077,7 @@ bool QuicConnection::WritePacket(EncryptionLevel level,
// Set the retransmit alarm only when we have sent the packet to the client
// and not when it goes to the pending queue, otherwise we will end up adding
// an entry to retransmission_timeout_ every time we attempt a write.
- if (retransmittable == HAS_RETRANSMITTABLE_DATA) {
- SetupRetransmission(sequence_number);
- } else if (packet->is_fec_packet()) {
- SetupAbandonFecTimer(sequence_number);
- }
+ MaybeSetupRetransmission(sequence_number);
congestion_manager_.SentPacket(sequence_number, now, packet->length(),
retransmission);
@@ -1153,10 +1111,6 @@ bool QuicConnection::OnSerializedPacket(
retransmission_map_.insert(
make_pair(serialized_packet.sequence_number,
RetransmissionInfo(serialized_packet.sequence_number)));
- } else if (serialized_packet.packet->is_fec_packet()) {
- unacked_fec_packets_.insert(make_pair(
- serialized_packet.sequence_number,
- serialized_packet.retransmittable_frames));
}
return SendOrQueuePacket(encryption_level_,
serialized_packet.sequence_number,
@@ -1226,17 +1180,6 @@ void QuicConnection::SendAck() {
packet_generator_.SetShouldSendAck(send_feedback);
}
-void QuicConnection::MaybeAbandonFecPacket(
- QuicPacketSequenceNumber sequence_number) {
- if (!ContainsKey(unacked_fec_packets_, sequence_number)) {
- DVLOG(2) << ENDPOINT << "no need to abandon fec packet: "
- << sequence_number << "; it's already acked'";
- return;
- }
- congestion_manager_.AbandoningPacket(sequence_number);
- // TODO(satyashekhar): Should this decrease the congestion window?
-}
-
QuicTime QuicConnection::OnRetransmissionTimeout() {
// This guards against registering the alarm later than we should.
//
@@ -1249,24 +1192,19 @@ QuicTime QuicConnection::OnRetransmissionTimeout() {
for (size_t i = 0; i < max_packets_per_retransmission_alarm_ &&
!retransmission_timeouts_.empty(); ++i) {
- RetransmissionTime retransmission_time = retransmission_timeouts_.top();
- DCHECK(retransmission_time.scheduled_time.IsInitialized());
- if (retransmission_time.scheduled_time > clock_->ApproximateNow()) {
+ RetransmissionInfo retransmission_info = retransmission_timeouts_.top();
+ DCHECK(retransmission_info.scheduled_time.IsInitialized());
+ if (retransmission_info.scheduled_time > clock_->ApproximateNow()) {
break;
}
retransmission_timeouts_.pop();
-
- if (retransmission_time.for_fec) {
- MaybeAbandonFecPacket(retransmission_time.sequence_number);
- continue;
- } else if (
- !MaybeRetransmitPacketForRTO(retransmission_time.sequence_number)) {
+ if (!MaybeRetransmitPacketForRTO(retransmission_info.sequence_number)) {
DLOG(INFO) << ENDPOINT << "MaybeRetransmitPacketForRTO failed: "
<< "adding an extra delay for "
- << retransmission_time.sequence_number;
- retransmission_time.scheduled_time = clock_->ApproximateNow().Add(
+ << retransmission_info.sequence_number;
+ retransmission_info.scheduled_time = clock_->ApproximateNow().Add(
congestion_manager_.DefaultRetransmissionTime());
- retransmission_timeouts_.push(retransmission_time);
+ retransmission_timeouts_.push(retransmission_info);
}
}
@@ -1439,21 +1377,21 @@ bool QuicConnection::HasQueuedData() const {
}
void QuicConnection::SetIdleNetworkTimeout(QuicTime::Delta timeout) {
- if (timeout < idle_network_timeout_) {
+ // if (timeout < idle_network_timeout_) {
idle_network_timeout_ = timeout;
CheckForTimeout();
- } else {
- idle_network_timeout_ = timeout;
- }
+ // } else {
+ // idle_network_timeout_ = timeout;
+ // }
}
void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) {
- if (timeout < overall_connection_timeout_) {
+ // if (timeout < overall_connection_timeout_) {
overall_connection_timeout_ = timeout;
CheckForTimeout();
- } else {
- overall_connection_timeout_ = timeout;
- }
+ // } else {
+ // overall_connection_timeout_ = timeout;
+ // }
}
bool QuicConnection::CheckForTimeout() {
@@ -1461,9 +1399,6 @@ bool QuicConnection::CheckForTimeout() {
QuicTime time_of_last_packet = std::max(time_of_last_received_packet_,
time_of_last_sent_packet_);
- // |delta| can be < 0 as |now| is approximate time but |time_of_last_packet|
- // is accurate time. However, this should not change the behavior of
- // timeout handling.
QuicTime::Delta delta = now.Subtract(time_of_last_packet);
DVLOG(1) << ENDPOINT << "last packet "
<< time_of_last_packet.ToDebuggingValue()
diff --git a/net/quic/quic_connection.h b/net/quic/quic_connection.h
index 2aac2409..c37d9ad 100644
--- a/net/quic/quic_connection.h
+++ b/net/quic/quic_connection.h
@@ -431,6 +431,15 @@ class NET_EXPORT_PRIVATE QuicConnection
// Make sure an ack we got from our peer is sane.
bool ValidateAckFrame(const QuicAckFrame& incoming_ack);
+ // These two are called by OnAckFrame to update the appropriate internal
+ // state.
+ //
+ // Updates internal state based on incoming_ack.received_info
+ void UpdatePacketInformationReceivedByPeer(
+ const QuicAckFrame& incoming_ack);
+ // Updates internal state based in incoming_ack.sent_info
+ void UpdatePacketInformationSentByPeer(const QuicAckFrame& incoming_ack);
+
QuicConnectionHelperInterface* helper() { return helper_.get(); }
protected:
@@ -461,32 +470,21 @@ class NET_EXPORT_PRIVATE QuicConnection
struct RetransmissionInfo {
explicit RetransmissionInfo(QuicPacketSequenceNumber sequence_number)
: sequence_number(sequence_number),
+ scheduled_time(QuicTime::Zero()),
number_nacks(0),
number_retransmissions(0) {
}
QuicPacketSequenceNumber sequence_number;
+ QuicTime scheduled_time;
size_t number_nacks;
size_t number_retransmissions;
};
- struct RetransmissionTime {
- RetransmissionTime(QuicPacketSequenceNumber sequence_number,
- const QuicTime& scheduled_time,
- bool for_fec)
- : sequence_number(sequence_number),
- scheduled_time(scheduled_time),
- for_fec(for_fec) { }
-
- QuicPacketSequenceNumber sequence_number;
- QuicTime scheduled_time;
- bool for_fec;
- };
-
- class RetransmissionTimeComparator {
+ class RetransmissionInfoComparator {
public:
- bool operator()(const RetransmissionTime& lhs,
- const RetransmissionTime& rhs) const {
+ bool operator()(const RetransmissionInfo& lhs,
+ const RetransmissionInfo& rhs) const {
DCHECK(lhs.scheduled_time.IsInitialized() &&
rhs.scheduled_time.IsInitialized());
return lhs.scheduled_time > rhs.scheduled_time;
@@ -499,9 +497,9 @@ class NET_EXPORT_PRIVATE QuicConnection
typedef std::map<QuicFecGroupNumber, QuicFecGroup*> FecGroupMap;
typedef base::hash_map<QuicPacketSequenceNumber,
RetransmissionInfo> RetransmissionMap;
- typedef std::priority_queue<RetransmissionTime,
- std::vector<RetransmissionTime>,
- RetransmissionTimeComparator>
+ typedef std::priority_queue<RetransmissionInfo,
+ std::vector<RetransmissionInfo>,
+ RetransmissionInfoComparator>
RetransmissionTimeouts;
// Selects and updates the version of the protocol being used by selecting a
@@ -511,11 +509,9 @@ class NET_EXPORT_PRIVATE QuicConnection
// Sends a version negotiation packet to the peer.
void SendVersionNegotiationPacket();
- void SetupRetransmission(QuicPacketSequenceNumber sequence_number);
+ void MaybeSetupRetransmission(QuicPacketSequenceNumber sequence_number);
bool IsRetransmission(QuicPacketSequenceNumber sequence_number);
- void SetupAbandonFecTimer(QuicPacketSequenceNumber sequence_number);
-
// Drop packet corresponding to |sequence_number| by deleting entries from
// |unacked_packets_| and |retransmission_map_|, if present. We need to drop
// all packets with encryption level NONE after the default level has been set
@@ -530,25 +526,10 @@ class NET_EXPORT_PRIVATE QuicConnection
// revive and process the packet.
void MaybeProcessRevivedPacket();
- void HandleAckForSentPackets(const QuicAckFrame& incoming_ack,
- SequenceNumberSet* acked_packets);
- void HandleAckForSentFecPackets(const QuicAckFrame& incoming_ack,
- SequenceNumberSet* acked_packets);
-
- // These two are called by OnAckFrame.
- //
- // Updates internal state based on incoming_ack.received_info
- void UpdatePacketInformationReceivedByPeer(
- const QuicAckFrame& incoming_ack);
- // Updates internal state based on incoming_ack.sent_info
- void UpdatePacketInformationSentByPeer(const QuicAckFrame& incoming_ack);
-
void UpdateOutgoingAck();
void MaybeSendAckInResponseToPacket();
- void MaybeAbandonFecPacket(QuicPacketSequenceNumber sequence_number);
-
// Get the FEC group associate with the last processed packet or NULL, if the
// group has already been deleted.
QuicFecGroup* GetFecGroup();
@@ -591,12 +572,6 @@ class NET_EXPORT_PRIVATE QuicConnection
// to this map, which contains owning pointers to the contained frames.
UnackedPacketMap unacked_packets_;
- // Pending fec packets that have not been acked yet. These packets need to be
- // cleared out of the cgst_window after a timeout since FEC packets are never
- // retransmitted.
- // Ask: What should be the timeout for these packets?
- UnackedPacketMap unacked_fec_packets_;
-
// Heap of packets that we might need to retransmit, and the time at
// which we should retransmit them. Every time a packet is sent it is added
// to this heap which is O(log(number of pending packets to be retransmitted))
diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc
index 6d982ce..597664d 100644
--- a/net/quic/quic_connection_test.cc
+++ b/net/quic/quic_connection_test.cc
@@ -501,7 +501,6 @@ class QuicConnectionTest : public ::testing::Test {
void ProcessClosePacket(QuicPacketSequenceNumber number,
QuicFecGroupNumber fec_group) {
- EXPECT_CALL(visitor_, OnCanWrite()).Times(1).WillOnce(Return(true));
scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group));
scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
ENCRYPTION_NONE, number, *packet));
@@ -550,8 +549,7 @@ class QuicConnectionTest : public ::testing::Test {
if (((number - min_protected_packet) % 2) == 0) {
for (size_t i = GetStartOfFecProtectedData(
header_.public_header.guid_length,
- header_.public_header.version_flag,
- header_.public_header.sequence_number_length);
+ header_.public_header.version_flag);
i < data_packet->length(); ++i) {
data_packet->mutable_data()[i] ^= data_packet->data()[i];
}
@@ -587,11 +585,7 @@ class QuicConnectionTest : public ::testing::Test {
EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(AnyNumber());
}
- QuicPacketEntropyHash ProcessAckPacket(QuicAckFrame* frame,
- bool expect_writes) {
- if (expect_writes) {
- EXPECT_CALL(visitor_, OnCanWrite()).Times(1).WillOnce(Return(true));
- }
+ QuicPacketEntropyHash ProcessAckPacket(QuicAckFrame* frame) {
return ProcessFramePacket(QuicFrame(frame));
}
@@ -753,7 +747,7 @@ TEST_F(QuicConnectionTest, PacketsOutOfOrderWithAdditionsAndLeastAwaiting) {
// retransmitted, and will remove it from the missing list.
creator_.set_sequence_number(5);
QuicAckFrame frame(0, QuicTime::Zero(), 4);
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
// Force an ack to be sent.
SendAckPacketToPeer();
@@ -782,7 +776,7 @@ TEST_F(QuicConnectionTest, TruncatedAck) {
QuicConnectionPeer::GetSentEntropyHash(&connection_, 192) ^
QuicConnectionPeer::GetSentEntropyHash(&connection_, 191);
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
EXPECT_TRUE(QuicConnectionPeer::GetReceivedTruncatedAck(&connection_));
@@ -791,7 +785,7 @@ TEST_F(QuicConnectionTest, TruncatedAck) {
QuicConnectionPeer::GetSentEntropyHash(&connection_, 192) ^
QuicConnectionPeer::GetSentEntropyHash(&connection_, 190);
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
EXPECT_FALSE(QuicConnectionPeer::GetReceivedTruncatedAck(&connection_));
}
@@ -803,21 +797,21 @@ TEST_F(QuicConnectionTest, LeastUnackedLower) {
// Start out saying the least unacked is 2
creator_.set_sequence_number(5);
QuicAckFrame frame(0, QuicTime::Zero(), 2);
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
// Change it to 1, but lower the sequence number to fake out-of-order packets.
// This should be fine.
creator_.set_sequence_number(1);
QuicAckFrame frame2(0, QuicTime::Zero(), 1);
// The scheduler will not process out of order acks.
- ProcessAckPacket(&frame2, false);
+ ProcessAckPacket(&frame2);
// Now claim it's one, but set the ordering so it was sent "after" the first
// one. This should cause a connection error.
EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false));
EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
creator_.set_sequence_number(7);
- ProcessAckPacket(&frame2, false);
+ ProcessAckPacket(&frame2);
}
TEST_F(QuicConnectionTest, LargestObservedLower) {
@@ -831,12 +825,12 @@ TEST_F(QuicConnectionTest, LargestObservedLower) {
frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
&connection_, 2);
EXPECT_CALL(visitor_, OnAck(_));
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
// Now change it to 1, and it should cause a connection error.
QuicAckFrame frame2(1, QuicTime::Zero(), 0);
EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false));
- ProcessAckPacket(&frame2, false);
+ ProcessAckPacket(&frame2);
}
TEST_F(QuicConnectionTest, LeastUnackedGreaterThanPacketSequenceNumber) {
@@ -845,7 +839,7 @@ TEST_F(QuicConnectionTest, LeastUnackedGreaterThanPacketSequenceNumber) {
// Create an ack with least_unacked is 2 in packet number 1.
creator_.set_sequence_number(0);
QuicAckFrame frame(0, QuicTime::Zero(), 2);
- ProcessAckPacket(&frame, false);
+ ProcessAckPacket(&frame);
}
TEST_F(QuicConnectionTest,
@@ -858,7 +852,7 @@ TEST_F(QuicConnectionTest,
EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
QuicAckFrame frame(0, QuicTime::Zero(), 1);
frame.received_info.missing_packets.insert(3);
- ProcessAckPacket(&frame, false);
+ ProcessAckPacket(&frame);
}
TEST_F(QuicConnectionTest, AckUnsentData) {
@@ -866,7 +860,7 @@ TEST_F(QuicConnectionTest, AckUnsentData) {
EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false));
EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
QuicAckFrame frame(1, QuicTime::Zero(), 0);
- ProcessAckPacket(&frame, false);
+ ProcessAckPacket(&frame);
}
TEST_F(QuicConnectionTest, AckAll) {
@@ -874,7 +868,7 @@ TEST_F(QuicConnectionTest, AckAll) {
creator_.set_sequence_number(1);
QuicAckFrame frame1(0, QuicTime::Zero(), 1);
- ProcessAckPacket(&frame1, true);
+ ProcessAckPacket(&frame1);
}
TEST_F(QuicConnectionTest, DontWaitForPacketsBefore) {
@@ -909,7 +903,7 @@ TEST_F(QuicConnectionTest, BasicSending) {
QuicAckFrame frame(3, QuicTime::Zero(), 0);
frame.received_info.entropy_hash =
QuicConnectionPeer::GetSentEntropyHash(&connection_, 3);
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
SendAckPacketToPeer(); // Packet 6
// As soon as we've acked one, we skip ack packets 2 and 3 and note lack of
@@ -924,7 +918,7 @@ TEST_F(QuicConnectionTest, BasicSending) {
QuicAckFrame frame2(6, QuicTime::Zero(), 0);
frame2.received_info.entropy_hash =
QuicConnectionPeer::GetSentEntropyHash(&connection_, 6);
- ProcessAckPacket(&frame2, true); // Even parity triggers ack packet 7
+ ProcessAckPacket(&frame2); // Even parity triggers ack packet 7
// The least packet awaiting ack should now be 7
EXPECT_EQ(7u, last_ack()->sent_info.least_unacked);
@@ -971,58 +965,6 @@ TEST_F(QuicConnectionTest, FECQueueing) {
EXPECT_EQ(2u, connection_.NumQueuedPackets());
}
-TEST_F(QuicConnectionTest, AbandonFECFromCongestionWindow) {
- connection_.options()->max_packets_per_fec_group = 1;
- // 1 Data and 1 FEC packet.
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(2);
- connection_.SendStreamData(1, "foo", 0, !kFin);
-
- // Larger timeout for FEC bytes to expire.
- const QuicTime::Delta retransmission_time =
- QuicTime::Delta::FromMilliseconds(5000);
- clock_.AdvanceTime(retransmission_time);
-
- // Send only data packet.
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(1);
- // Abandon both FEC and data packet.
- EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(2);
-
- connection_.OnRetransmissionTimeout();
-}
-
-TEST_F(QuicConnectionTest, DontAbandonAckedFEC) {
- connection_.options()->max_packets_per_fec_group = 1;
- const QuicPacketSequenceNumber sequence_number =
- QuicConnectionPeer::GetPacketCreator(&connection_)->sequence_number() + 1;
-
- // 1 Data and 1 FEC packet.
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(2);
- connection_.SendStreamData(1, "foo", 0, !kFin);
-
- QuicAckFrame ack_fec(2, QuicTime::Zero(), 1);
- // Data packet missing.
- ack_fec.received_info.missing_packets.insert(1);
- ack_fec.received_info.entropy_hash =
- QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
- QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
-
- EXPECT_CALL(visitor_, OnAck(_)).Times(1);
- EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(1);
- EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
-
- ProcessAckPacket(&ack_fec, true);
-
- const QuicTime::Delta kDefaultRetransmissionTime =
- QuicTime::Delta::FromMilliseconds(5000);
- clock_.AdvanceTime(kDefaultRetransmissionTime);
-
- // Abandon only data packet, FEC has been acked.
- EXPECT_CALL(*send_algorithm_, AbandoningPacket(sequence_number, _)).Times(1);
- // Send only data packet.
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(1);
- connection_.OnRetransmissionTimeout();
-}
-
TEST_F(QuicConnectionTest, FramePacking) {
// Block the connection.
helper_->SetSendAlarm(
@@ -1127,9 +1069,9 @@ TEST_F(QuicConnectionTest, RetransmitOnNack) {
QuicAckFrame ack_one(1, QuicTime::Zero(), 0);
ack_one.received_info.entropy_hash =
QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
- ProcessAckPacket(&ack_one, true);
- ProcessAckPacket(&ack_one, true);
- ProcessAckPacket(&ack_one, true);
+ ProcessAckPacket(&ack_one);
+ ProcessAckPacket(&ack_one);
+ ProcessAckPacket(&ack_one);
expected_acks.clear();
expected_acks.insert(3);
@@ -1143,14 +1085,14 @@ TEST_F(QuicConnectionTest, RetransmitOnNack) {
QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
- ProcessAckPacket(&nack_two, true);
- ProcessAckPacket(&nack_two, true);
+ ProcessAckPacket(&nack_two);
+ ProcessAckPacket(&nack_two);
// The third nack should trigger a retransimission.
EXPECT_CALL(*send_algorithm_,
SentPacket(_, _, second_packet_size - kQuicVersionSize,
IS_RETRANSMISSION)).Times(1);
- ProcessAckPacket(&nack_two, true);
+ ProcessAckPacket(&nack_two);
}
TEST_F(QuicConnectionTest, RetransmitNackedLargestObserved) {
@@ -1165,15 +1107,15 @@ TEST_F(QuicConnectionTest, RetransmitNackedLargestObserved) {
frame.received_info.missing_packets.insert(largest_observed);
frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
&connection_, largest_observed - 1);
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
// Second udp packet will force an ack frame.
EXPECT_CALL(*send_algorithm_,
SentPacket(_, _, _, NOT_RETRANSMISSION));
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
// Third nack should retransmit the largest observed packet.
EXPECT_CALL(*send_algorithm_, SentPacket(_, _, packet_size - kQuicVersionSize,
IS_RETRANSMISSION));
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
}
TEST_F(QuicConnectionTest, RetransmitNackedPacketsOnTruncatedAck) {
@@ -1194,7 +1136,7 @@ TEST_F(QuicConnectionTest, RetransmitNackedPacketsOnTruncatedAck) {
EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(1);
EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
EXPECT_CALL(visitor_, OnAck(_)).Times(1);
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
EXPECT_TRUE(QuicConnectionPeer::GetReceivedTruncatedAck(&connection_));
QuicConnectionPeer::SetMaxPacketsPerRetransmissionAlarm(&connection_, 200);
@@ -1240,17 +1182,17 @@ TEST_F(QuicConnectionTest, LimitPacketsPerNack) {
EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks)));
// Nack three times.
- ProcessAckPacket(&nack, true);
+ ProcessAckPacket(&nack);
// The second call will trigger an ack.
EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(1);
- ProcessAckPacket(&nack, true);
+ ProcessAckPacket(&nack);
// The third call should trigger retransmitting 10 packets.
EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(10);
- ProcessAckPacket(&nack, true);
+ ProcessAckPacket(&nack);
// The fourth call should trigger retransmitting the 11th packet and an ack.
EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(2);
- ProcessAckPacket(&nack, true);
+ ProcessAckPacket(&nack);
}
// Test sending multiple acks from the connection to the session.
@@ -1286,7 +1228,7 @@ TEST_F(QuicConnectionTest, MultipleAcks) {
expected_acks.insert(5);
EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks)));
- ProcessAckPacket(&frame1, true);
+ ProcessAckPacket(&frame1);
// Now the client implicitly acks 2, and explicitly acks 6
QuicAckFrame frame2(6, QuicTime::Zero(), 0);
@@ -1298,7 +1240,7 @@ TEST_F(QuicConnectionTest, MultipleAcks) {
expected_acks.insert(6);
EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks)));
- ProcessAckPacket(&frame2, true);
+ ProcessAckPacket(&frame2);
}
TEST_F(QuicConnectionTest, DontLatchUnackedPacket) {
@@ -1315,7 +1257,7 @@ TEST_F(QuicConnectionTest, DontLatchUnackedPacket) {
QuicAckFrame frame(1, QuicTime::Zero(), 0);
frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
&connection_, 1);
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
// Verify that our internal state has least-unacked as 3.
EXPECT_EQ(3u, outgoing_ack()->sent_info.least_unacked);
@@ -1535,7 +1477,7 @@ TEST_F(QuicConnectionTest, TestRetransmissionCountCalculation) {
ack.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
&connection_, rto_sequence_number - 1);
for (int i = 0; i < 3; i++) {
- ProcessAckPacket(&ack, true);
+ ProcessAckPacket(&ack);
}
EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission(
&connection_, rto_sequence_number));
@@ -1586,7 +1528,7 @@ TEST_F(QuicConnectionTest, CloseFecGroup) {
// Now send non-fec protected ack packet and close the group
QuicAckFrame frame(0, QuicTime::Zero(), 5);
creator_.set_sequence_number(4);
- ProcessAckPacket(&frame, true);
+ ProcessAckPacket(&frame);
ASSERT_EQ(0u, connection_.NumFecGroups());
}
@@ -1808,7 +1750,8 @@ TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) {
testing::Return(QuicTime::Delta::Zero()));
EXPECT_CALL(*send_algorithm_,
SentPacket(_, _, _, _));
- ProcessAckPacket(&frame, true);
+ EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(Return(true));
+ ProcessAckPacket(&frame);
EXPECT_EQ(0u, connection_.NumQueuedPackets());
// Ensure alarm is not set
@@ -1830,7 +1773,7 @@ TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) {
EXPECT_CALL(*send_algorithm_,
TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce(
testing::Return(QuicTime::Delta::FromMicroseconds(1)));
- ProcessAckPacket(&frame, false);
+ ProcessAckPacket(&frame);
EXPECT_EQ(1u, connection_.NumQueuedPackets());
}
@@ -1921,7 +1864,7 @@ TEST_F(QuicConnectionTest, MissingPacketsBeforeLeastUnacked) {
QuicAckFrame ack(0, QuicTime::Zero(), 4);
// Set the sequence number of the ack packet to be least unacked (4)
creator_.set_sequence_number(3);
- ProcessAckPacket(&ack, true);
+ ProcessAckPacket(&ack);
EXPECT_TRUE(outgoing_ack()->received_info.missing_packets.empty());
}
@@ -1946,7 +1889,7 @@ TEST_F(QuicConnectionTest, UpdateEntropyForReceivedPackets) {
ack.sent_info.entropy_hash = kRandomEntropyHash;
creator_.set_sequence_number(5);
QuicPacketEntropyHash six_packet_entropy_hash = 0;
- if (ProcessAckPacket(&ack, true)) {
+ if (ProcessAckPacket(&ack)) {
six_packet_entropy_hash = 1 << 6;
};
@@ -1965,7 +1908,7 @@ TEST_F(QuicConnectionTest, UpdateEntropyHashUptoCurrentPacket) {
// Current packet is the least unacked packet.
QuicAckFrame ack(0, QuicTime::Zero(), 23);
ack.sent_info.entropy_hash = kRandomEntropyHash;
- QuicPacketEntropyHash ack_entropy_hash = ProcessAckPacket(&ack, true);
+ QuicPacketEntropyHash ack_entropy_hash = ProcessAckPacket(&ack);
EXPECT_EQ((kRandomEntropyHash + ack_entropy_hash),
outgoing_ack()->received_info.entropy_hash);
ProcessDataPacket(25, 1, kEntropyFlag);
@@ -2090,7 +2033,6 @@ TEST_F(QuicConnectionTest, CheckSendStats) {
EXPECT_CALL(visitor_, OnAck(_));
EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(1);
EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
- EXPECT_CALL(visitor_, OnCanWrite()).Times(3).WillRepeatedly(Return(true));
ProcessFramePacket(frame);
ProcessFramePacket(frame);
@@ -2180,7 +2122,6 @@ TEST_F(QuicConnectionTest, DontProcessFramesIfPacketClosedConnection) {
scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
ENCRYPTION_NONE, 1, *packet));
- EXPECT_CALL(visitor_, OnCanWrite()).Times(1).WillOnce(Return(true));
EXPECT_CALL(visitor_, ConnectionClose(QUIC_PEER_GOING_AWAY, true));
EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).Times(0);
diff --git a/net/quic/quic_framer.cc b/net/quic/quic_framer.cc
index 7b30344..4fd1539 100644
--- a/net/quic/quic_framer.cc
+++ b/net/quic/quic_framer.cc
@@ -22,14 +22,8 @@ namespace net {
namespace {
// Mask to select the lowest 48 bits of a sequence number.
-const QuicPacketSequenceNumber k6ByteSequenceNumberMask =
+const QuicPacketSequenceNumber kSequenceNumberMask =
GG_UINT64_C(0x0000FFFFFFFFFFFF);
-const QuicPacketSequenceNumber k4ByteSequenceNumberMask =
- GG_UINT64_C(0x00000000FFFFFFFF);
-const QuicPacketSequenceNumber k2ByteSequenceNumberMask =
- GG_UINT64_C(0x000000000000FFFF);
-const QuicPacketSequenceNumber k1ByteSequenceNumberMask =
- GG_UINT64_C(0x00000000000000FF);
const QuicGuid k1ByteGuidMask = GG_UINT64_C(0x00000000000000FF);
const QuicGuid k4ByteGuidMask = GG_UINT64_C(0x00000000FFFFFFFF);
@@ -89,10 +83,9 @@ size_t QuicFramer::GetMinStreamFrameSize() {
// static
size_t QuicFramer::GetMinAckFrameSize() {
- return kQuicFrameTypeSize + kQuicEntropyHashSize +
- PACKET_6BYTE_SEQUENCE_NUMBER + kQuicEntropyHashSize +
- PACKET_6BYTE_SEQUENCE_NUMBER + kQuicDeltaTimeLargestObservedSize +
- kNumberOfMissingPacketsSize;
+ return kQuicFrameTypeSize + kQuicEntropyHashSize + kSequenceNumberSize +
+ kQuicEntropyHashSize + kSequenceNumberSize +
+ kQuicDeltaTimeLargestObservedSize + kNumberOfMissingPacketsSize;
}
// static
@@ -120,7 +113,7 @@ size_t QuicFramer::GetMinGoAwayFrameSize() {
// 12-byte tags.
size_t QuicFramer::GetMaxUnackedPackets(QuicPacketHeader header) {
return (kMaxPacketSize - GetPacketHeaderSize(header) -
- GetMinAckFrameSize() - 16) / PACKET_6BYTE_SEQUENCE_NUMBER;
+ GetMinAckFrameSize() - 16) / kSequenceNumberSize;
}
bool QuicFramer::IsSupportedVersion(QuicTag version) {
@@ -248,8 +241,7 @@ SerializedPacket QuicFramer::ConstructFrameDataPacket(
DCHECK_LE(len, packet_size);
QuicPacket* packet = QuicPacket::NewDataPacket(
writer.take(), len, true, header.public_header.guid_length,
- header.public_header.version_flag,
- header.public_header.sequence_number_length);
+ header.public_header.version_flag);
if (fec_builder_) {
fec_builder_->OnBuiltFecProtectedPayload(header,
@@ -282,8 +274,7 @@ SerializedPacket QuicFramer::ConstructFecPacket(
header.packet_sequence_number,
QuicPacket::NewFecPacket(writer.take(), len, true,
header.public_header.guid_length,
- header.public_header.version_flag,
- header.public_header.sequence_number_length),
+ header.public_header.version_flag),
GetPacketEntropyHash(header), NULL);
}
@@ -295,8 +286,7 @@ QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket(
QuicDataWriter writer(len);
uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST |
- PACKET_PUBLIC_FLAGS_8BYTE_GUID |
- PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE);
+ PACKET_PUBLIC_FLAGS_8BYTE_GUID);
if (!writer.WriteUInt8(flags)) {
return NULL;
}
@@ -309,8 +299,7 @@ QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket(
return NULL;
}
- if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- packet.rejected_sequence_number,
+ if (!AppendPacketSequenceNumber(packet.rejected_sequence_number,
&writer)) {
return NULL;
}
@@ -326,8 +315,7 @@ QuicEncryptedPacket* QuicFramer::ConstructVersionNegotiationPacket(
QuicDataWriter writer(len);
uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION |
- PACKET_PUBLIC_FLAGS_8BYTE_GUID |
- PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE);
+ PACKET_PUBLIC_FLAGS_8BYTE_GUID);
if (!writer.WriteUInt8(flags)) {
return NULL;
}
@@ -496,21 +484,6 @@ bool QuicFramer::WritePacketHeader(const QuicPacketHeader& header,
if (header.public_header.version_flag) {
public_flags |= PACKET_PUBLIC_FLAGS_VERSION;
}
- switch (header.public_header.sequence_number_length) {
- case PACKET_1BYTE_SEQUENCE_NUMBER:
- public_flags |= PACKET_PUBLIC_FLAGS_1BYTE_SEQUENCE;
- break;
- case PACKET_2BYTE_SEQUENCE_NUMBER:
- public_flags |= PACKET_PUBLIC_FLAGS_2BYTE_SEQUENCE;
- break;
- case PACKET_4BYTE_SEQUENCE_NUMBER:
- public_flags |= PACKET_PUBLIC_FLAGS_4BYTE_SEQUENCE;
- break;
- case PACKET_6BYTE_SEQUENCE_NUMBER:
- public_flags |= PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE;
- break;
- }
-
switch (header.public_header.guid_length) {
case PACKET_0BYTE_GUID:
if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_0BYTE_GUID)) {
@@ -549,8 +522,7 @@ bool QuicFramer::WritePacketHeader(const QuicPacketHeader& header,
writer->WriteUInt32(quic_version_);
}
- if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length,
- header.packet_sequence_number, writer)) {
+ if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) {
return false;
}
@@ -586,47 +558,38 @@ bool QuicFramer::WritePacketHeader(const QuicPacketHeader& header,
}
QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire(
- QuicSequenceNumberLength sequence_number_length,
QuicPacketSequenceNumber packet_sequence_number) const {
// The new sequence number might have wrapped to the next epoch, or
// it might have reverse wrapped to the previous epoch, or it might
// remain in the same epoch. Select the sequence number closest to the
- // next expected sequence number, the previous sequence number plus 1.
-
- // epoch_delta is the delta between epochs the sequence number was serialized
- // with, so the correct value is likely the same epoch as the last sequence
- // number or an adjacent epoch.
- const QuicPacketSequenceNumber epoch_delta =
- GG_UINT64_C(1) << (8 * sequence_number_length);
- QuicPacketSequenceNumber next_sequence_number = last_sequence_number_ + 1;
- QuicPacketSequenceNumber epoch = last_sequence_number_ & ~(epoch_delta - 1);
- QuicPacketSequenceNumber prev_epoch = epoch - epoch_delta;
- QuicPacketSequenceNumber next_epoch = epoch + epoch_delta;
-
- return ClosestTo(next_sequence_number,
+ // previous sequence number.
+ QuicPacketSequenceNumber epoch = last_sequence_number_ & ~kSequenceNumberMask;
+ QuicPacketSequenceNumber prev_epoch = epoch - (GG_UINT64_C(1) << 48);
+ QuicPacketSequenceNumber next_epoch = epoch + (GG_UINT64_C(1) << 48);
+
+ return ClosestTo(last_sequence_number_,
epoch + packet_sequence_number,
- ClosestTo(next_sequence_number,
+ ClosestTo(last_sequence_number_,
prev_epoch + packet_sequence_number,
next_epoch + packet_sequence_number));
}
-bool QuicFramer::ProcessPublicHeader(
- QuicPacketPublicHeader* public_header) {
+bool QuicFramer::ProcessPublicHeader(QuicPacketPublicHeader* public_header) {
uint8 public_flags;
if (!reader_->ReadBytes(&public_flags, 1)) {
set_detailed_error("Unable to read public flags.");
return false;
}
- public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
- public_header->version_flag =
- (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
-
- if (!public_header->version_flag && public_flags > PACKET_PUBLIC_FLAGS_MAX) {
+ if (public_flags > PACKET_PUBLIC_FLAGS_MAX) {
set_detailed_error("Illegal public flags value.");
return false;
}
+ public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
+ public_header->version_flag =
+ (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
+
if (public_header->reset_flag && public_header->version_flag) {
set_detailed_error("Got version flag in reset packet");
return false;
@@ -675,21 +638,6 @@ bool QuicFramer::ProcessPublicHeader(
break;
}
- switch (public_flags & PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE) {
- case PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE:
- public_header->sequence_number_length = PACKET_6BYTE_SEQUENCE_NUMBER;
- break;
- case PACKET_PUBLIC_FLAGS_4BYTE_SEQUENCE:
- public_header->sequence_number_length = PACKET_4BYTE_SEQUENCE_NUMBER;
- break;
- case PACKET_PUBLIC_FLAGS_2BYTE_SEQUENCE:
- public_header->sequence_number_length = PACKET_2BYTE_SEQUENCE_NUMBER;
- break;
- case PACKET_PUBLIC_FLAGS_1BYTE_SEQUENCE:
- public_header->sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
- break;
- }
-
if (public_header->version_flag && is_server_) {
QuicTag version;
if (!reader_->ReadUInt32(&version)) {
@@ -698,10 +646,6 @@ bool QuicFramer::ProcessPublicHeader(
set_detailed_error("Unable to read protocol version.");
return false;
}
- if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) {
- set_detailed_error("Illegal public flags value.");
- return false;
- }
public_header->versions.push_back(version);
}
return true;
@@ -727,8 +671,7 @@ bool QuicFramer::ReadGuidFromPacket(const QuicEncryptedPacket& packet,
bool QuicFramer::ProcessPacketHeader(
QuicPacketHeader* header,
const QuicEncryptedPacket& packet) {
- if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length,
- &header->packet_sequence_number)) {
+ if (!ProcessPacketSequenceNumber(&header->packet_sequence_number)) {
set_detailed_error("Unable to read sequence number.");
return RaiseError(QUIC_INVALID_PACKET_HEADER);
}
@@ -738,7 +681,10 @@ bool QuicFramer::ProcessPacketHeader(
return RaiseError(QUIC_INVALID_PACKET_HEADER);
}
- if (!DecryptPayload(*header, packet)) {
+ if (!DecryptPayload(header->packet_sequence_number,
+ header->public_header.guid_length,
+ header->public_header.version_flag,
+ packet)) {
set_detailed_error("Unable to decrypt payload.");
return RaiseError(QUIC_DECRYPTION_FAILURE);
}
@@ -776,18 +722,14 @@ bool QuicFramer::ProcessPacketHeader(
}
bool QuicFramer::ProcessPacketSequenceNumber(
- QuicSequenceNumberLength sequence_number_length,
QuicPacketSequenceNumber* sequence_number) {
- QuicPacketSequenceNumber wire_sequence_number = 0u;
- if (!reader_->ReadBytes(&wire_sequence_number, sequence_number_length)) {
+ QuicPacketSequenceNumber wire_sequence_number;
+ if (!reader_->ReadUInt48(&wire_sequence_number)) {
return false;
}
- // TODO(ianswett): Explore the usefulness of trying multiple sequence numbers
- // in case the first guess is incorrect.
*sequence_number =
- CalculatePacketSequenceNumberFromWire(sequence_number_length,
- wire_sequence_number);
+ CalculatePacketSequenceNumberFromWire(wire_sequence_number);
return true;
}
@@ -942,8 +884,7 @@ bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) {
return false;
}
- if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- &received_info->largest_observed)) {
+ if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) {
set_detailed_error("Unable to read largest observed.");
return false;
}
@@ -969,8 +910,7 @@ bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) {
for (int i = 0; i < num_missing_packets; ++i) {
QuicPacketSequenceNumber sequence_number;
- if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- &sequence_number)) {
+ if (!ProcessPacketSequenceNumber(&sequence_number)) {
set_detailed_error("Unable to read sequence number in missing packets.");
return false;
}
@@ -986,8 +926,7 @@ bool QuicFramer::ProcessSentInfo(SentPacketInfo* sent_info) {
return false;
}
- if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- &sent_info->least_unacked)) {
+ if (!ProcessPacketSequenceNumber(&sent_info->least_unacked)) {
set_detailed_error("Unable to read least unacked.");
return false;
}
@@ -1023,8 +962,7 @@ bool QuicFramer::ProcessQuicCongestionFeedbackFrame(
if (num_received_packets > 0u) {
uint64 smallest_received;
- if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- &smallest_received)) {
+ if (!ProcessPacketSequenceNumber(&smallest_received)) {
set_detailed_error("Unable to read smallest received.");
return false;
}
@@ -1192,12 +1130,10 @@ bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) {
StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
const QuicEncryptedPacket& encrypted,
QuicGuidLength guid_length,
- bool includes_version,
- QuicSequenceNumberLength sequence_number_length) {
+ bool includes_version) {
return StringPiece(encrypted.data() + kStartOfHashData,
GetStartOfEncryptedData(
- guid_length, includes_version, sequence_number_length)
- - kStartOfHashData);
+ guid_length, includes_version) - kStartOfHashData);
}
void QuicFramer::SetDecrypter(QuicDecrypter* decrypter) {
@@ -1285,7 +1221,9 @@ size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
return min_plaintext_size;
}
-bool QuicFramer::DecryptPayload(const QuicPacketHeader& header,
+bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number,
+ QuicGuidLength guid_length,
+ bool version_flag,
const QuicEncryptedPacket& packet) {
StringPiece encrypted;
if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) {
@@ -1293,21 +1231,13 @@ bool QuicFramer::DecryptPayload(const QuicPacketHeader& header,
}
DCHECK(decrypter_.get() != NULL);
decrypted_.reset(decrypter_->DecryptPacket(
- header.packet_sequence_number,
- GetAssociatedDataFromEncryptedPacket(
- packet,
- header.public_header.guid_length,
- header.public_header.version_flag,
- header.public_header.sequence_number_length),
+ sequence_number,
+ GetAssociatedDataFromEncryptedPacket(packet, guid_length, version_flag),
encrypted));
if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) {
decrypted_.reset(alternative_decrypter_->DecryptPacket(
- header.packet_sequence_number,
- GetAssociatedDataFromEncryptedPacket(
- packet,
- header.public_header.guid_length,
- header.public_header.version_flag,
- header.public_header.sequence_number_length),
+ sequence_number,
+ GetAssociatedDataFromEncryptedPacket(packet, guid_length, version_flag),
encrypted));
if (decrypted_.get() != NULL) {
if (alternative_decrypter_latch_) {
@@ -1335,8 +1265,8 @@ size_t QuicFramer::ComputeFrameLength(const QuicFrame& frame) {
return GetMinStreamFrameSize() + frame.stream_frame->data.size();
case ACK_FRAME: {
const QuicAckFrame& ack = *frame.ack_frame;
- return GetMinAckFrameSize() + PACKET_6BYTE_SEQUENCE_NUMBER *
- ack.received_info.missing_packets.size();
+ return GetMinAckFrameSize() +
+ kSequenceNumberSize * ack.received_info.missing_packets.size();
}
case CONGESTION_FEEDBACK_FRAME: {
size_t len = kQuicFrameTypeSize;
@@ -1351,10 +1281,10 @@ size_t QuicFramer::ComputeFrameLength(const QuicFrame& frame) {
len += 2;
len += 1; // Number received packets.
if (inter_arrival.received_packet_times.size() > 0) {
- len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received.
+ len += kSequenceNumberSize; // Smallest received.
len += 8; // Time.
// 2 bytes per sequence number delta plus 4 bytes per delta time.
- len += PACKET_6BYTE_SEQUENCE_NUMBER *
+ len += kSequenceNumberSize *
(inter_arrival.received_packet_times.size() - 1);
}
break;
@@ -1379,8 +1309,7 @@ size_t QuicFramer::ComputeFrameLength(const QuicFrame& frame) {
const QuicAckFrame& ack = frame.connection_close_frame->ack_frame;
return GetMinConnectionCloseFrameSize() +
frame.connection_close_frame->error_details.size() +
- PACKET_6BYTE_SEQUENCE_NUMBER *
- ack.received_info.missing_packets.size();
+ kSequenceNumberSize * ack.received_info.missing_packets.size();
}
case GOAWAY_FRAME:
return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size();
@@ -1399,35 +1328,13 @@ size_t QuicFramer::ComputeFrameLength(const QuicFrame& frame) {
// static
bool QuicFramer::AppendPacketSequenceNumber(
- QuicSequenceNumberLength sequence_number_length,
QuicPacketSequenceNumber packet_sequence_number,
QuicDataWriter* writer) {
// Ensure the entire sequence number can be written.
- if (writer->capacity() - writer->length() <
- static_cast<size_t>( sequence_number_length)) {
+ if (writer->capacity() - writer->length() < kSequenceNumberSize) {
return false;
}
- switch (sequence_number_length) {
- case PACKET_1BYTE_SEQUENCE_NUMBER:
- return writer->WriteUInt8(
- packet_sequence_number & k1ByteSequenceNumberMask);
- break;
- case PACKET_2BYTE_SEQUENCE_NUMBER:
- return writer->WriteUInt16(
- packet_sequence_number & k2ByteSequenceNumberMask);
- break;
- case PACKET_4BYTE_SEQUENCE_NUMBER:
- return writer->WriteUInt32(
- packet_sequence_number & k4ByteSequenceNumberMask);
- break;
- case PACKET_6BYTE_SEQUENCE_NUMBER:
- return writer->WriteUInt48(
- packet_sequence_number & k6ByteSequenceNumberMask);
- break;
- default:
- NOTREACHED() << "sequence_number_length: " << sequence_number_length;
- return false;
- }
+ return writer->WriteUInt48(packet_sequence_number & kSequenceNumberMask);
}
bool QuicFramer::AppendStreamFramePayload(
@@ -1445,7 +1352,8 @@ bool QuicFramer::AppendStreamFramePayload(
if (!writer->WriteUInt16(frame.data.size())) {
return false;
}
- if (!writer->WriteBytes(frame.data.data(), frame.data.size())) {
+ if (!writer->WriteBytes(frame.data.data(),
+ frame.data.size())) {
return false;
}
return true;
@@ -1478,8 +1386,7 @@ bool QuicFramer::AppendAckFramePayload(
return false;
}
- if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- frame.sent_info.least_unacked, writer)) {
+ if (!AppendPacketSequenceNumber(frame.sent_info.least_unacked, writer)) {
return false;
}
@@ -1489,8 +1396,7 @@ bool QuicFramer::AppendAckFramePayload(
}
size_t largest_observed_offset = writer->length();
- if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- frame.received_info.largest_observed,
+ if (!AppendPacketSequenceNumber(frame.received_info.largest_observed,
writer)) {
return false;
}
@@ -1517,8 +1423,7 @@ bool QuicFramer::AppendAckFramePayload(
frame.received_info.missing_packets.begin();
int num_missing_packets_written = 0;
for (; it != frame.received_info.missing_packets.end(); ++it) {
- if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- *it, writer)) {
+ if (!AppendPacketSequenceNumber(*it, writer)) {
// We are truncating.
QuicPacketSequenceNumber largest_observed =
CalculateLargestObserved(frame.received_info.missing_packets, --it);
@@ -1527,7 +1432,7 @@ bool QuicFramer::AppendAckFramePayload(
entropy_calculator_->ReceivedEntropyHash(largest_observed),
received_entropy_offset);
// Overwrite largest_observed.
- writer->WriteUInt48ToOffset(largest_observed & k6ByteSequenceNumberMask,
+ writer->WriteUInt48ToOffset(largest_observed & kSequenceNumberMask,
largest_observed_offset);
writer->WriteUInt32ToOffset(kInvalidDeltaTime,
delta_time_largest_observed_offset);
@@ -1574,8 +1479,7 @@ bool QuicFramer::AppendQuicCongestionFeedbackFramePayload(
inter_arrival.received_packet_times.begin();
QuicPacketSequenceNumber lowest_sequence = it->first;
- if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- lowest_sequence, writer)) {
+ if (!AppendPacketSequenceNumber(lowest_sequence, writer)) {
return false;
}
diff --git a/net/quic/quic_framer.h b/net/quic/quic_framer.h
index 76410db..8eb1f28 100644
--- a/net/quic/quic_framer.h
+++ b/net/quic/quic_framer.h
@@ -248,8 +248,7 @@ class NET_EXPORT_PRIVATE QuicFramer {
static base::StringPiece GetAssociatedDataFromEncryptedPacket(
const QuicEncryptedPacket& encrypted,
QuicGuidLength guid_length,
- bool includes_version,
- QuicSequenceNumberLength sequence_number_length);
+ bool includes_version);
// Returns a SerializedPacket whose |packet| member is owned by the caller,
// and is populated with the fields in |header| and |frames|, or is NULL if
@@ -343,9 +342,7 @@ class NET_EXPORT_PRIVATE QuicFramer {
bool ProcessPacketHeader(QuicPacketHeader* header,
const QuicEncryptedPacket& packet);
- bool ProcessPacketSequenceNumber(
- QuicSequenceNumberLength sequence_number_length,
- QuicPacketSequenceNumber* sequence_number);
+ bool ProcessPacketSequenceNumber(QuicPacketSequenceNumber* sequence_number);
bool ProcessFrameData();
bool ProcessStreamFrame(QuicStreamFrame* frame);
bool ProcessAckFrame(QuicAckFrame* frame);
@@ -357,20 +354,20 @@ class NET_EXPORT_PRIVATE QuicFramer {
bool ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame);
bool ProcessGoAwayFrame(QuicGoAwayFrame* frame);
- bool DecryptPayload(const QuicPacketHeader& header,
+ bool DecryptPayload(QuicPacketSequenceNumber packet_sequence_number,
+ QuicGuidLength guid_length,
+ bool version_flag,
const QuicEncryptedPacket& packet);
// Returns the full packet sequence number from the truncated
// wire format version and the last seen packet sequence number.
QuicPacketSequenceNumber CalculatePacketSequenceNumberFromWire(
- QuicSequenceNumberLength sequence_number_length,
QuicPacketSequenceNumber packet_sequence_number) const;
// Computes the wire size in bytes of the payload of |frame|.
size_t ComputeFrameLength(const QuicFrame& frame);
static bool AppendPacketSequenceNumber(
- QuicSequenceNumberLength sequence_number_length,
QuicPacketSequenceNumber packet_sequence_number,
QuicDataWriter* writer);
diff --git a/net/quic/quic_framer_test.cc b/net/quic/quic_framer_test.cc
index fbeb05c..9e6df0d 100644
--- a/net/quic/quic_framer_test.cc
+++ b/net/quic/quic_framer_test.cc
@@ -57,19 +57,13 @@ size_t GetSequenceNumberOffset(bool include_version) {
// Index into the private flags offset in the data packet header.
size_t GetPrivateFlagsOffset(QuicGuidLength guid_length, bool include_version) {
return GetSequenceNumberOffset(guid_length, include_version) +
- PACKET_6BYTE_SEQUENCE_NUMBER;
+ kSequenceNumberSize;
}
size_t GetPrivateFlagsOffset(bool include_version) {
return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version);
}
-size_t GetPrivateFlagsOffset(bool include_version,
- QuicSequenceNumberLength sequence_number_length) {
- return GetSequenceNumberOffset(PACKET_8BYTE_GUID, include_version) +
- sequence_number_length;
-}
-
// Index into the fec group offset in the header.
size_t GetFecGroupOffset(QuicGuidLength guid_length, bool include_version) {
return GetPrivateFlagsOffset(guid_length, include_version) +
@@ -81,12 +75,6 @@ size_t GetFecGroupOffset(bool include_version) {
kPrivateFlagsSize;
}
-size_t GetFecGroupOffset(bool include_version,
- QuicSequenceNumberLength sequence_number_length) {
- return GetPrivateFlagsOffset(include_version, sequence_number_length) +
- kPrivateFlagsSize;
-}
-
// Index into the nonce proof of the public reset packet.
// Public resets always have full guids.
const size_t kPublicResetPacketNonceProofOffset =
@@ -183,7 +171,6 @@ class TestQuicVisitor : public ::net::QuicFramerVisitorInterface {
public:
TestQuicVisitor()
: error_count_(0),
- version_mismatch_(0),
packet_count_(0),
frame_count_(0),
fec_count_(0),
@@ -222,8 +209,7 @@ class TestQuicVisitor : public ::net::QuicFramerVisitorInterface {
}
virtual bool OnProtocolVersionMismatch(QuicTag version) OVERRIDE {
- DLOG(INFO) << "QuicFramer Version Mismatch, version: " << version;
- version_mismatch_++;
+ DCHECK(false);
return true;
}
@@ -284,7 +270,6 @@ class TestQuicVisitor : public ::net::QuicFramerVisitorInterface {
// Counters from the visitor_ callbacks.
int error_count_;
- int version_mismatch_;
int packet_count_;
int frame_count_;
int fec_count_;
@@ -351,21 +336,18 @@ class QuicFramerTest : public ::testing::Test {
return false;
}
if (QuicFramer::GetAssociatedDataFromEncryptedPacket(
- encrypted, PACKET_8BYTE_GUID,
- includes_version, PACKET_6BYTE_SEQUENCE_NUMBER) !=
- decrypter_->associated_data_) {
+ encrypted, PACKET_8BYTE_GUID, includes_version) !=
+ decrypter_->associated_data_) {
LOG(ERROR) << "Decrypted incorrect associated data. expected "
<< QuicFramer::GetAssociatedDataFromEncryptedPacket(
- encrypted, PACKET_8BYTE_GUID,
- includes_version, PACKET_6BYTE_SEQUENCE_NUMBER)
+ encrypted, PACKET_8BYTE_GUID, includes_version)
<< " actual: " << decrypter_->associated_data_;
return false;
}
StringPiece ciphertext(encrypted.AsStringPiece().substr(
- GetStartOfEncryptedData(PACKET_8BYTE_GUID, includes_version,
- PACKET_6BYTE_SEQUENCE_NUMBER)));
+ GetStartOfEncryptedData(PACKET_8BYTE_GUID, includes_version)));
if (ciphertext != decrypter_->ciphertext_) {
- LOG(ERROR) << "Decrypted incorrect ciphertext data. expected "
+ LOG(ERROR) << "Decrypted incorrect chipertext data. expected "
<< ciphertext << " actual: "
<< decrypter_->ciphertext_;
return false;
@@ -402,9 +384,9 @@ class QuicFramerTest : public ::testing::Test {
QuicFramerPeer::SetLastSequenceNumber(&framer_, last_sequence_number);
EXPECT_EQ(expected_sequence_number,
QuicFramerPeer::CalculatePacketSequenceNumberFromWire(
- &framer_, PACKET_6BYTE_SEQUENCE_NUMBER, wire_sequence_number))
+ &framer_, wire_sequence_number))
<< "last_sequence_number: " << last_sequence_number
- << " wire_sequence_number: " << wire_sequence_number;
+ << "wire_sequence_number: " << wire_sequence_number;
}
test::TestEncrypter* encrypter_;
@@ -499,11 +481,9 @@ TEST_F(QuicFramerTest, CalculatePacketSequenceNumberFromWireNearNextMax) {
// Cases where the last number was close to the end of the range
for (uint64 i = 0; i < 10; i++) {
- // Subtract 1, because the expected next sequence number is 1 more than the
- // last sequence number.
- QuicPacketSequenceNumber last = max_number - i - 1;
+ QuicPacketSequenceNumber last = max_number - i;
- // Small numbers should not wrap, because they have nowhere to go.
+ // Small numbers should not wrap (because they have nowhere to go.
for (uint64 j = 0; j < 10; j++) {
CheckCalculatePacketSequenceNumber(max_epoch + j, last);
}
@@ -526,7 +506,7 @@ TEST_F(QuicFramerTest, EmptyPacket) {
TEST_F(QuicFramerTest, LargePacket) {
unsigned char packet[kMaxPacketSize + 1] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -538,11 +518,9 @@ TEST_F(QuicFramerTest, LargePacket) {
};
memset(packet + GetPacketHeaderSize(
- PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 0,
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP), 0,
kMaxPacketSize - GetPacketHeaderSize(
- PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + 1);
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP) + 1);
QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
EXPECT_FALSE(framer_.ProcessPacket(encrypted));
@@ -558,7 +536,7 @@ TEST_F(QuicFramerTest, LargePacket) {
TEST_F(QuicFramerTest, PacketHeader) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -587,9 +565,8 @@ TEST_F(QuicFramerTest, PacketHeader) {
// Now test framing boundaries
for (size_t i = 0;
- i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
- ++i) {
+ i < GetPacketHeaderSize(
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP); ++i) {
string expected_error;
if (i < kGuidOffset) {
expected_error = "Unable to read public flags.";
@@ -612,7 +589,7 @@ TEST_F(QuicFramerTest, PacketHeaderWith4ByteGuid) {
unsigned char packet[] = {
// public flags (4 byte guid)
- 0x38,
+ 0x08,
// guid
0x10, 0x32, 0x54, 0x76,
// packet sequence number
@@ -640,9 +617,8 @@ TEST_F(QuicFramerTest, PacketHeaderWith4ByteGuid) {
// Now test framing boundaries
for (size_t i = 0;
- i < GetPacketHeaderSize(PACKET_4BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
- ++i) {
+ i < GetPacketHeaderSize(
+ PACKET_4BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP); ++i) {
string expected_error;
if (i < kGuidOffset) {
expected_error = "Unable to read public flags.";
@@ -667,7 +643,7 @@ TEST_F(QuicFramerTest, PacketHeader1ByteGuid) {
unsigned char packet[] = {
// public flags (1 byte guid)
- 0x34,
+ 0x04,
// guid
0x10,
// packet sequence number
@@ -695,9 +671,8 @@ TEST_F(QuicFramerTest, PacketHeader1ByteGuid) {
// Now test framing boundaries
for (size_t i = 0;
- i < GetPacketHeaderSize(PACKET_1BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
- ++i) {
+ i < GetPacketHeaderSize(
+ PACKET_1BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP); ++i) {
string expected_error;
if (i < kGuidOffset) {
expected_error = "Unable to read public flags.";
@@ -721,7 +696,7 @@ TEST_F(QuicFramerTest, PacketHeaderWith0ByteGuid) {
unsigned char packet[] = {
// public flags (0 byte guid)
- 0x30,
+ 0x00,
// guid
// packet sequence number
0xBC, 0x9A, 0x78, 0x56,
@@ -748,9 +723,8 @@ TEST_F(QuicFramerTest, PacketHeaderWith0ByteGuid) {
// Now test framing boundaries
for (size_t i = 0;
- i < GetPacketHeaderSize(PACKET_0BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
- ++i) {
+ i < GetPacketHeaderSize(
+ PACKET_0BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP); ++i) {
string expected_error;
if (i < kGuidOffset) {
expected_error = "Unable to read public flags.";
@@ -771,12 +745,12 @@ TEST_F(QuicFramerTest, PacketHeaderWith0ByteGuid) {
TEST_F(QuicFramerTest, PacketHeaderWithVersionFlag) {
unsigned char packet[] = {
// public flags (version)
- 0x3D,
+ 0x0D,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
// version tag
- 'Q', '0', '0', '6',
+ 'Q', '0', '0', '5',
// packet sequence number
0xBC, 0x9A, 0x78, 0x56,
0x34, 0x12,
@@ -803,9 +777,8 @@ TEST_F(QuicFramerTest, PacketHeaderWithVersionFlag) {
// Now test framing boundaries
for (size_t i = 0;
- i < GetPacketHeaderSize(PACKET_8BYTE_GUID, kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
- ++i) {
+ i < GetPacketHeaderSize(
+ PACKET_8BYTE_GUID, kIncludeVersion, NOT_IN_FEC_GROUP); ++i) {
string expected_error;
if (i < kGuidOffset) {
expected_error = "Unable to read public flags.";
@@ -824,217 +797,14 @@ TEST_F(QuicFramerTest, PacketHeaderWithVersionFlag) {
}
}
-TEST_F(QuicFramerTest, PacketHeaderWith4ByteSequenceNumber) {
- QuicFramerPeer::SetLastSequenceNumber(&framer_,
- GG_UINT64_C(0x123456789ABA));
-
- unsigned char packet[] = {
- // public flags (8 byte guid and 4 byte sequence number)
- 0x2C,
- // guid
- 0x10, 0x32, 0x54, 0x76,
- 0x98, 0xBA, 0xDC, 0xFE,
- // packet sequence number
- 0xBC, 0x9A, 0x78, 0x56,
- // private flags
- 0x00,
- };
-
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
- EXPECT_FALSE(framer_.ProcessPacket(encrypted));
- EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
- ASSERT_TRUE(visitor_.header_.get());
- EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210),
- visitor_.header_->public_header.guid);
- EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
- EXPECT_FALSE(visitor_.header_->public_header.version_flag);
- EXPECT_FALSE(visitor_.header_->fec_flag);
- EXPECT_FALSE(visitor_.header_->entropy_flag);
- EXPECT_EQ(0, visitor_.header_->entropy_hash);
- EXPECT_EQ(GG_UINT64_C(0x123456789ABC),
- visitor_.header_->packet_sequence_number);
- EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
- EXPECT_EQ(0x00u, visitor_.header_->fec_group);
-
- // Now test framing boundaries
- for (size_t i = 0;
- i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_4BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
- ++i) {
- string expected_error;
- if (i < kGuidOffset) {
- expected_error = "Unable to read public flags.";
- } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) {
- expected_error = "Unable to read GUID.";
- } else if (i < GetPrivateFlagsOffset(!kIncludeVersion,
- PACKET_4BYTE_SEQUENCE_NUMBER)) {
- expected_error = "Unable to read sequence number.";
- } else if (i < GetFecGroupOffset(!kIncludeVersion,
- PACKET_4BYTE_SEQUENCE_NUMBER)) {
- expected_error = "Unable to read private flags.";
- } else {
- expected_error = "Unable to read first fec protected packet offset.";
- }
- CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
- }
-}
-
-TEST_F(QuicFramerTest, PacketHeaderWith2ByteSequenceNumber) {
- QuicFramerPeer::SetLastSequenceNumber(&framer_,
- GG_UINT64_C(0x123456789ABA));
-
- unsigned char packet[] = {
- // public flags (8 byte guid and 2 byte sequence number)
- 0x1C,
- // guid
- 0x10, 0x32, 0x54, 0x76,
- 0x98, 0xBA, 0xDC, 0xFE,
- // packet sequence number
- 0xBC, 0x9A,
- // private flags
- 0x00,
- };
-
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
- EXPECT_FALSE(framer_.ProcessPacket(encrypted));
- EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
- ASSERT_TRUE(visitor_.header_.get());
- EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210),
- visitor_.header_->public_header.guid);
- EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
- EXPECT_FALSE(visitor_.header_->public_header.version_flag);
- EXPECT_FALSE(visitor_.header_->fec_flag);
- EXPECT_FALSE(visitor_.header_->entropy_flag);
- EXPECT_EQ(0, visitor_.header_->entropy_hash);
- EXPECT_EQ(GG_UINT64_C(0x123456789ABC),
- visitor_.header_->packet_sequence_number);
- EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
- EXPECT_EQ(0x00u, visitor_.header_->fec_group);
-
- // Now test framing boundaries
- for (size_t i = 0;
- i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_2BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
- ++i) {
- string expected_error;
- if (i < kGuidOffset) {
- expected_error = "Unable to read public flags.";
- } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) {
- expected_error = "Unable to read GUID.";
- } else if (i < GetPrivateFlagsOffset(!kIncludeVersion,
- PACKET_2BYTE_SEQUENCE_NUMBER)) {
- expected_error = "Unable to read sequence number.";
- } else if (i < GetFecGroupOffset(!kIncludeVersion,
- PACKET_2BYTE_SEQUENCE_NUMBER)) {
- expected_error = "Unable to read private flags.";
- } else {
- expected_error = "Unable to read first fec protected packet offset.";
- }
- CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
- }
-}
-
-TEST_F(QuicFramerTest, PacketHeaderWith1ByteSequenceNumber) {
- QuicFramerPeer::SetLastSequenceNumber(&framer_,
- GG_UINT64_C(0x123456789ABA));
-
- unsigned char packet[] = {
- // public flags (8 byte guid and 1 byte sequence number)
- 0x0C,
- // guid
- 0x10, 0x32, 0x54, 0x76,
- 0x98, 0xBA, 0xDC, 0xFE,
- // packet sequence number
- 0xBC,
- // private flags
- 0x00,
- };
-
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
- EXPECT_FALSE(framer_.ProcessPacket(encrypted));
- EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error());
- ASSERT_TRUE(visitor_.header_.get());
- EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210),
- visitor_.header_->public_header.guid);
- EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
- EXPECT_FALSE(visitor_.header_->public_header.version_flag);
- EXPECT_FALSE(visitor_.header_->fec_flag);
- EXPECT_FALSE(visitor_.header_->entropy_flag);
- EXPECT_EQ(0, visitor_.header_->entropy_hash);
- EXPECT_EQ(GG_UINT64_C(0x123456789ABC),
- visitor_.header_->packet_sequence_number);
- EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
- EXPECT_EQ(0x00u, visitor_.header_->fec_group);
-
- // Now test framing boundaries
- for (size_t i = 0;
- i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
- ++i) {
- string expected_error;
- if (i < kGuidOffset) {
- expected_error = "Unable to read public flags.";
- } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) {
- expected_error = "Unable to read GUID.";
- } else if (i < GetPrivateFlagsOffset(!kIncludeVersion,
- PACKET_1BYTE_SEQUENCE_NUMBER)) {
- expected_error = "Unable to read sequence number.";
- } else if (i < GetFecGroupOffset(!kIncludeVersion,
- PACKET_1BYTE_SEQUENCE_NUMBER)) {
- expected_error = "Unable to read private flags.";
- } else {
- expected_error = "Unable to read first fec protected packet offset.";
- }
- CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
- }
-}
TEST_F(QuicFramerTest, InvalidPublicFlag) {
unsigned char packet[] = {
- // public flags
- 0x40,
- // guid
- 0x10, 0x32, 0x54, 0x76,
- 0x98, 0xBA, 0xDC, 0xFE,
- // packet sequence number
- 0xBC, 0x9A, 0x78, 0x56,
- 0x34, 0x12,
- // private flags
- 0x00,
-
- // frame count
- 0x01,
- // frame type (stream frame)
- 0x01,
- // stream id
- 0x04, 0x03, 0x02, 0x01,
- // fin
- 0x01,
- // offset
- 0x54, 0x76, 0x10, 0x32,
- 0xDC, 0xFE, 0x98, 0xBA,
- // data length
- 0x0c, 0x00,
- // data
- 'h', 'e', 'l', 'l',
- 'o', ' ', 'w', 'o',
- 'r', 'l', 'd', '!',
- };
- CheckProcessingFails(packet,
- arraysize(packet),
- "Illegal public flags value.",
- QUIC_INVALID_PACKET_HEADER);
-};
-
-TEST_F(QuicFramerTest, InvalidPublicFlagWithMatchingVersions) {
- unsigned char packet[] = {
- // public flags (8 byte guid and version flag and an unknown flag)
- 0x4D,
+ // public flags (8 byte guid)
+ 0x10,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
- // version tag
- 'Q', '0', '0', '6',
// packet sequence number
0xBC, 0x9A, 0x78, 0x56,
0x34, 0x12,
@@ -1065,36 +835,10 @@ TEST_F(QuicFramerTest, InvalidPublicFlagWithMatchingVersions) {
QUIC_INVALID_PACKET_HEADER);
};
-TEST_F(QuicFramerTest, LargePublicFlagWithMismatchedVersions) {
- unsigned char packet[] = {
- // public flags (8 byte guid, version flag and an unknown flag)
- 0x7D,
- // guid
- 0x10, 0x32, 0x54, 0x76,
- 0x98, 0xBA, 0xDC, 0xFE,
- // version tag
- 'Q', '0', '0', '0',
- // packet sequence number
- 0xBC, 0x9A, 0x78, 0x56,
- 0x34, 0x12,
- // private flags
- 0x00,
-
- // frame type (padding frame)
- 0x00,
- };
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
- EXPECT_TRUE(framer_.ProcessPacket(encrypted));
- EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
- ASSERT_TRUE(visitor_.header_.get());
- EXPECT_EQ(0, visitor_.frame_count_);
- EXPECT_EQ(1, visitor_.version_mismatch_);
-};
-
TEST_F(QuicFramerTest, InvalidPrivateFlag) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1131,7 +875,7 @@ TEST_F(QuicFramerTest, InvalidPrivateFlag) {
TEST_F(QuicFramerTest, PaddingFrame) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1166,15 +910,15 @@ TEST_F(QuicFramerTest, PaddingFrame) {
// A packet with no frames is not acceptable.
CheckProcessingFails(
packet,
- GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
+ GetPacketHeaderSize(
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP),
"Unable to read frame type.", QUIC_INVALID_FRAME_DATA);
}
TEST_F(QuicFramerTest, StreamFrame) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1235,8 +979,8 @@ TEST_F(QuicFramerTest, StreamFrame) {
}
CheckProcessingFails(
packet,
- i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
+ i + GetPacketHeaderSize(
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP),
expected_error, QUIC_INVALID_FRAME_DATA);
}
}
@@ -1244,12 +988,12 @@ TEST_F(QuicFramerTest, StreamFrame) {
TEST_F(QuicFramerTest, StreamFrameWithVersion) {
unsigned char packet[] = {
// public flags (version, 8 byte guid)
- 0x3D,
+ 0x0D,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
// version tag
- 'Q', '0', '0', '6',
+ 'Q', '0', '0', '5',
// packet sequence number
0xBC, 0x9A, 0x78, 0x56,
0x34, 0x12,
@@ -1308,9 +1052,8 @@ TEST_F(QuicFramerTest, StreamFrameWithVersion) {
expected_error = "Unable to read frame data.";
}
CheckProcessingFails(
- packet,
- i + GetPacketHeaderSize(PACKET_8BYTE_GUID, kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
+ packet, i + GetPacketHeaderSize(PACKET_8BYTE_GUID, kIncludeVersion,
+ NOT_IN_FEC_GROUP),
expected_error, QUIC_INVALID_FRAME_DATA);
}
}
@@ -1320,7 +1063,7 @@ TEST_F(QuicFramerTest, RejectPacket) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1419,7 +1162,7 @@ TEST_F(QuicFramerTest, RevivedStreamFrame) {
TEST_F(QuicFramerTest, StreamFrameInFecGroup) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1457,10 +1200,11 @@ TEST_F(QuicFramerTest, StreamFrameInFecGroup) {
EXPECT_EQ(IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
EXPECT_EQ(GG_UINT64_C(0x341256789ABA),
visitor_.header_->fec_group);
- const size_t fec_offset = GetStartOfFecProtectedData(
- PACKET_8BYTE_GUID, !kIncludeVersion, PACKET_6BYTE_SEQUENCE_NUMBER);
EXPECT_EQ(
- string(AsChars(packet) + fec_offset, arraysize(packet) - fec_offset),
+ string(AsChars(packet) + GetStartOfFecProtectedData(PACKET_8BYTE_GUID,
+ !kIncludeVersion),
+ arraysize(packet) - GetStartOfFecProtectedData(PACKET_8BYTE_GUID,
+ !kIncludeVersion)),
visitor_.fec_protected_payload_);
ASSERT_EQ(1u, visitor_.stream_frames_.size());
@@ -1475,7 +1219,7 @@ TEST_F(QuicFramerTest, StreamFrameInFecGroup) {
TEST_F(QuicFramerTest, AckFrame) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1528,17 +1272,17 @@ TEST_F(QuicFramerTest, AckFrame) {
const size_t kSentEntropyOffset = kQuicFrameTypeSize;
const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize;
const size_t kReceivedEntropyOffset = kLeastUnackedOffset +
- PACKET_6BYTE_SEQUENCE_NUMBER;
+ kSequenceNumberSize;
const size_t kLargestObservedOffset = kReceivedEntropyOffset +
kQuicEntropyHashSize;
const size_t kMissingDeltaTimeOffset = kLargestObservedOffset +
- PACKET_6BYTE_SEQUENCE_NUMBER;
+ kSequenceNumberSize;
const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset +
kQuicDeltaTimeLargestObservedSize;
const size_t kMissingPacketsOffset = kNumMissingPacketOffset +
kNumberOfMissingPacketsSize;
// Now test framing boundaries
- const size_t missing_packets_size = 1 * PACKET_6BYTE_SEQUENCE_NUMBER;
+ const size_t missing_packets_size = 1 * kSequenceNumberSize;
for (size_t i = 0;
i < QuicFramer::GetMinAckFrameSize() + missing_packets_size; ++i) {
string expected_error;
@@ -1561,8 +1305,8 @@ TEST_F(QuicFramerTest, AckFrame) {
}
CheckProcessingFails(
packet,
- i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
+ i + GetPacketHeaderSize(
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP),
expected_error, QUIC_INVALID_FRAME_DATA);
}
}
@@ -1570,7 +1314,7 @@ TEST_F(QuicFramerTest, AckFrame) {
TEST_F(QuicFramerTest, CongestionFeedbackFrameTCP) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1620,8 +1364,8 @@ TEST_F(QuicFramerTest, CongestionFeedbackFrameTCP) {
}
CheckProcessingFails(
packet,
- i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
+ i + GetPacketHeaderSize(
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP),
expected_error, QUIC_INVALID_FRAME_DATA);
}
}
@@ -1629,7 +1373,7 @@ TEST_F(QuicFramerTest, CongestionFeedbackFrameTCP) {
TEST_F(QuicFramerTest, CongestionFeedbackFrameInterArrival) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1718,8 +1462,8 @@ TEST_F(QuicFramerTest, CongestionFeedbackFrameInterArrival) {
}
CheckProcessingFails(
packet,
- i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
+ i + GetPacketHeaderSize(
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP),
expected_error, QUIC_INVALID_FRAME_DATA);
}
}
@@ -1727,7 +1471,7 @@ TEST_F(QuicFramerTest, CongestionFeedbackFrameInterArrival) {
TEST_F(QuicFramerTest, CongestionFeedbackFrameFixRate) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1772,8 +1516,8 @@ TEST_F(QuicFramerTest, CongestionFeedbackFrameFixRate) {
}
CheckProcessingFails(
packet,
- i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
+ i + GetPacketHeaderSize(
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP),
expected_error, QUIC_INVALID_FRAME_DATA);
}
}
@@ -1782,7 +1526,7 @@ TEST_F(QuicFramerTest, CongestionFeedbackFrameFixRate) {
TEST_F(QuicFramerTest, CongestionFeedbackFrameInvalidFeedback) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1807,7 +1551,7 @@ TEST_F(QuicFramerTest, CongestionFeedbackFrameInvalidFeedback) {
TEST_F(QuicFramerTest, RstStreamFrame) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1857,8 +1601,8 @@ TEST_F(QuicFramerTest, RstStreamFrame) {
}
CheckProcessingFails(
packet,
- i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
+ i + GetPacketHeaderSize(
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP),
expected_error, QUIC_INVALID_RST_STREAM_DATA);
}
}
@@ -1866,7 +1610,7 @@ TEST_F(QuicFramerTest, RstStreamFrame) {
TEST_F(QuicFramerTest, ConnectionCloseFrame) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -1944,8 +1688,8 @@ TEST_F(QuicFramerTest, ConnectionCloseFrame) {
}
CheckProcessingFails(
packet,
- i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
+ i + GetPacketHeaderSize(
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP),
expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA);
}
}
@@ -1953,7 +1697,7 @@ TEST_F(QuicFramerTest, ConnectionCloseFrame) {
TEST_F(QuicFramerTest, GoAwayFrame) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2005,8 +1749,8 @@ TEST_F(QuicFramerTest, GoAwayFrame) {
}
CheckProcessingFails(
packet,
- i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
+ i + GetPacketHeaderSize(
+ PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP),
expected_error, QUIC_INVALID_GOAWAY_DATA);
}
}
@@ -2014,7 +1758,7 @@ TEST_F(QuicFramerTest, GoAwayFrame) {
TEST_F(QuicFramerTest, PublicResetPacket) {
unsigned char packet[] = {
// public flags (public reset, 8 byte guid)
- 0x3E,
+ 0x0E,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2066,12 +1810,12 @@ TEST_F(QuicFramerTest, PublicResetPacket) {
TEST_F(QuicFramerTest, VersionNegotiationPacket) {
unsigned char packet[] = {
// public flags (version, 8 byte guid)
- 0x3D,
+ 0x0D,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
// version tag
- 'Q', '0', '0', '6',
+ 'Q', '0', '0', '5',
'Q', '2', '.', '0',
};
@@ -2103,7 +1847,7 @@ TEST_F(QuicFramerTest, VersionNegotiationPacket) {
TEST_F(QuicFramerTest, FecPacket) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2154,7 +1898,7 @@ TEST_F(QuicFramerTest, ConstructPaddingFramePacket) {
unsigned char packet[kMaxPacketSize] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2168,144 +1912,8 @@ TEST_F(QuicFramerTest, ConstructPaddingFramePacket) {
0x00,
};
- uint64 header_size =
- GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
- memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
-
- scoped_ptr<QuicPacket> data(
- framer_.ConstructFrameDataPacket(header, frames).packet);
- ASSERT_TRUE(data != NULL);
-
- test::CompareCharArraysWithHexError("constructed packet",
- data->data(), data->length(),
- AsChars(packet), arraysize(packet));
-}
-
-TEST_F(QuicFramerTest, Construct4ByteSequenceNumberPaddingFramePacket) {
- QuicPacketHeader header;
- header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210);
- header.public_header.reset_flag = false;
- header.public_header.version_flag = false;
- header.fec_flag = false;
- header.entropy_flag = false;
- header.public_header.sequence_number_length = PACKET_4BYTE_SEQUENCE_NUMBER;
- header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
- header.fec_group = 0;
-
- QuicPaddingFrame padding_frame;
-
- QuicFrames frames;
- frames.push_back(QuicFrame(&padding_frame));
-
- unsigned char packet[kMaxPacketSize] = {
- // public flags (8 byte guid and 4 byte sequence number)
- 0x2C,
- // guid
- 0x10, 0x32, 0x54, 0x76,
- 0x98, 0xBA, 0xDC, 0xFE,
- // packet sequence number
- 0xBC, 0x9A, 0x78, 0x56,
- // private flags
- 0x00,
-
- // frame type (padding frame)
- 0x00,
- };
-
- uint64 header_size =
- GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_4BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
- memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
-
- scoped_ptr<QuicPacket> data(
- framer_.ConstructFrameDataPacket(header, frames).packet);
- ASSERT_TRUE(data != NULL);
-
- test::CompareCharArraysWithHexError("constructed packet",
- data->data(), data->length(),
- AsChars(packet), arraysize(packet));
-}
-
-TEST_F(QuicFramerTest, Construct2ByteSequenceNumberPaddingFramePacket) {
- QuicPacketHeader header;
- header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210);
- header.public_header.reset_flag = false;
- header.public_header.version_flag = false;
- header.fec_flag = false;
- header.entropy_flag = false;
- header.public_header.sequence_number_length = PACKET_2BYTE_SEQUENCE_NUMBER;
- header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
- header.fec_group = 0;
-
- QuicPaddingFrame padding_frame;
-
- QuicFrames frames;
- frames.push_back(QuicFrame(&padding_frame));
-
- unsigned char packet[kMaxPacketSize] = {
- // public flags (8 byte guid and 2 byte sequence number)
- 0x1C,
- // guid
- 0x10, 0x32, 0x54, 0x76,
- 0x98, 0xBA, 0xDC, 0xFE,
- // packet sequence number
- 0xBC, 0x9A,
- // private flags
- 0x00,
-
- // frame type (padding frame)
- 0x00,
- };
-
- uint64 header_size =
- GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_2BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
- memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
-
- scoped_ptr<QuicPacket> data(
- framer_.ConstructFrameDataPacket(header, frames).packet);
- ASSERT_TRUE(data != NULL);
-
- test::CompareCharArraysWithHexError("constructed packet",
- data->data(), data->length(),
- AsChars(packet), arraysize(packet));
-}
-
-TEST_F(QuicFramerTest, Construct1ByteSequenceNumberPaddingFramePacket) {
- QuicPacketHeader header;
- header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210);
- header.public_header.reset_flag = false;
- header.public_header.version_flag = false;
- header.fec_flag = false;
- header.entropy_flag = false;
- header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
- header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
- header.fec_group = 0;
-
- QuicPaddingFrame padding_frame;
-
- QuicFrames frames;
- frames.push_back(QuicFrame(&padding_frame));
-
- unsigned char packet[kMaxPacketSize] = {
- // public flags (8 byte guid and 1 byte sequence number)
- 0x0C,
- // guid
- 0x10, 0x32, 0x54, 0x76,
- 0x98, 0xBA, 0xDC, 0xFE,
- // packet sequence number
- 0xBC,
- // private flags
- 0x00,
-
- // frame type (padding frame)
- 0x00,
- };
-
- uint64 header_size =
- GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
+ uint64 header_size = GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
+ NOT_IN_FEC_GROUP);
memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
scoped_ptr<QuicPacket> data(
@@ -2338,7 +1946,7 @@ TEST_F(QuicFramerTest, ConstructStreamFramePacket) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2395,12 +2003,12 @@ TEST_F(QuicFramerTest, ConstructStreamFramePacketWithVersionFlag) {
unsigned char packet[] = {
// public flags (version, 8 byte guid)
- 0x3D,
+ 0x0D,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
// version tag
- 'Q', '0', '0', '6',
+ 'Q', '0', '0', '5',
// packet sequence number
0xBC, 0x9A, 0x78, 0x56,
0x34, 0x12,
@@ -2442,12 +2050,12 @@ TEST_F(QuicFramerTest, ConstructVersionNegotiationPacket) {
unsigned char packet[] = {
// public flags (version, 8 byte guid)
- 0x3D,
+ 0x0D,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
// version tag
- 'Q', '0', '0', '6',
+ 'Q', '0', '0', '5',
'Q', '2', '.', '0',
};
@@ -2487,7 +2095,7 @@ TEST_F(QuicFramerTest, ConstructAckFramePacket) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2547,7 +2155,7 @@ TEST_F(QuicFramerTest, ConstructCongestionFeedbackFramePacketTCP) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2606,7 +2214,7 @@ TEST_F(QuicFramerTest, ConstructCongestionFeedbackFramePacketInterArrival) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2669,7 +2277,7 @@ TEST_F(QuicFramerTest, ConstructCongestionFeedbackFramePacketFixRate) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2735,7 +2343,7 @@ TEST_F(QuicFramerTest, ConstructRstFramePacket) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2798,7 +2406,7 @@ TEST_F(QuicFramerTest, ConstructCloseFramePacket) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2869,7 +2477,7 @@ TEST_F(QuicFramerTest, ConstructGoAwayPacket) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2913,7 +2521,7 @@ TEST_F(QuicFramerTest, ConstructPublicResetPacket) {
unsigned char packet[] = {
// public flags (public reset, 8 byte GUID)
- 0x3E,
+ 0x0E,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2951,7 +2559,7 @@ TEST_F(QuicFramerTest, ConstructFecPacket) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -2983,7 +2591,7 @@ TEST_F(QuicFramerTest, EncryptPacket) {
QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC);
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -3004,8 +2612,7 @@ TEST_F(QuicFramerTest, EncryptPacket) {
scoped_ptr<QuicPacket> raw(
QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false,
- PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER));
+ PACKET_8BYTE_GUID, !kIncludeVersion));
scoped_ptr<QuicEncryptedPacket> encrypted(
framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw));
@@ -3017,7 +2624,7 @@ TEST_F(QuicFramerTest, EncryptPacketWithVersionFlag) {
QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC);
unsigned char packet[] = {
// public flags (version, 8 byte guid)
- 0x3D,
+ 0x0D,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -3040,8 +2647,7 @@ TEST_F(QuicFramerTest, EncryptPacketWithVersionFlag) {
scoped_ptr<QuicPacket> raw(
QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false,
- PACKET_8BYTE_GUID, kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER));
+ PACKET_8BYTE_GUID, kIncludeVersion));
scoped_ptr<QuicEncryptedPacket> encrypted(
framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw));
@@ -3210,7 +2816,7 @@ TEST_F(QuicFramerTest, CleanTruncation) {
TEST_F(QuicFramerTest, EntropyFlagTest) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -3249,7 +2855,7 @@ TEST_F(QuicFramerTest, EntropyFlagTest) {
TEST_F(QuicFramerTest, FecEntropyTest) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -3290,7 +2896,7 @@ TEST_F(QuicFramerTest, FecEntropyTest) {
TEST_F(QuicFramerTest, StopPacketProcessing) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
@@ -3351,7 +2957,7 @@ TEST_F(QuicFramerTest, StopPacketProcessing) {
TEST_F(QuicFramerTest, ConnectionCloseWithInvalidAck) {
unsigned char packet[] = {
// public flags (8 byte guid)
- 0x3C,
+ 0x0C,
// guid
0x10, 0x32, 0x54, 0x76,
0x98, 0xBA, 0xDC, 0xFE,
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc
index eb6dbe8..b29a0e4 100644
--- a/net/quic/quic_http_stream_test.cc
+++ b/net/quic/quic_http_stream_test.cc
@@ -528,7 +528,8 @@ TEST_F(QuicHttpStreamTest, SendChunkedPostRequest) {
TEST_F(QuicHttpStreamTest, DestroyedEarly) {
SetRequestString("GET", "/");
AddWrite(SYNCHRONOUS, ConstructDataPacket(1, true, kFin, 0, request_data_));
- AddWrite(SYNCHRONOUS, ConstructAckPacket(2, 2, 1));
+ AddWrite(SYNCHRONOUS, ConstructRstPacket(2, 3));
+ AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1));
use_closing_stream_ = true;
Initialize();
diff --git a/net/quic/quic_packet_creator.cc b/net/quic/quic_packet_creator.cc
index d1c3ca1..c8d132f 100644
--- a/net/quic/quic_packet_creator.cc
+++ b/net/quic/quic_packet_creator.cc
@@ -30,7 +30,6 @@ QuicPacketCreator::QuicPacketCreator(QuicGuid guid,
send_version_in_packet_(!is_server),
packet_size_(GetPacketHeaderSize(options_.send_guid_length,
send_version_in_packet_,
- options_.send_sequence_number_length,
NOT_IN_FEC_GROUP)) {
framer_->set_fec_builder(this);
}
@@ -59,7 +58,6 @@ void QuicPacketCreator::MaybeStartFEC() {
fec_group_.reset(new QuicFecGroup());
packet_size_ = GetPacketHeaderSize(options_.send_guid_length,
send_version_in_packet_,
- options_.send_sequence_number_length,
IN_FEC_GROUP);
DCHECK_LE(packet_size_, options_.max_packet_length);
}
@@ -86,10 +84,8 @@ size_t QuicPacketCreator::StreamFramePacketOverhead(
int num_frames,
QuicGuidLength guid_length,
bool include_version,
- QuicSequenceNumberLength sequence_number_length,
InFecGroup is_in_fec_group) {
- return GetPacketHeaderSize(guid_length, include_version,
- sequence_number_length, is_in_fec_group) +
+ return GetPacketHeaderSize(guid_length, include_version, is_in_fec_group) +
QuicFramer::GetMinStreamFrameSize() * num_frames;
}
@@ -100,8 +96,7 @@ size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id,
QuicFrame* frame) {
DCHECK_GT(options_.max_packet_length,
StreamFramePacketOverhead(
- 1, PACKET_8BYTE_GUID, kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, IN_FEC_GROUP));
+ 1, PACKET_8BYTE_GUID, kIncludeVersion, IN_FEC_GROUP));
DCHECK(HasRoomForStreamFrame());
const size_t free_bytes = BytesFree();
@@ -165,7 +160,6 @@ SerializedPacket QuicPacketCreator::SerializePacket() {
queued_frames_.clear();
packet_size_ = GetPacketHeaderSize(options_.send_guid_length,
send_version_in_packet_,
- options_.send_sequence_number_length,
fec_group_.get() != NULL ?
IN_FEC_GROUP : NOT_IN_FEC_GROUP);
serialized.retransmittable_frames = queued_retransmittable_frames_.release();
@@ -187,7 +181,6 @@ SerializedPacket QuicPacketCreator::SerializeFec() {
// Reset packet_size_, since the next packet may not have an FEC group.
packet_size_ = GetPacketHeaderSize(options_.send_guid_length,
send_version_in_packet_,
- options_.send_sequence_number_length,
NOT_IN_FEC_GROUP);
DCHECK(serialized.packet);
DCHECK_GE(options_.max_packet_length, serialized.packet->length());
diff --git a/net/quic/quic_packet_creator.h b/net/quic/quic_packet_creator.h
index 86a5c0e..cb58625 100644
--- a/net/quic/quic_packet_creator.h
+++ b/net/quic/quic_packet_creator.h
@@ -33,8 +33,7 @@ class NET_EXPORT_PRIVATE QuicPacketCreator : public QuicFecBuilderInterface {
: max_packet_length(kMaxPacketSize),
random_reorder(false),
max_packets_per_fec_group(0),
- send_guid_length(PACKET_8BYTE_GUID),
- send_sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) {
+ send_guid_length(PACKET_8BYTE_GUID) {
}
size_t max_packet_length;
@@ -43,7 +42,6 @@ class NET_EXPORT_PRIVATE QuicPacketCreator : public QuicFecBuilderInterface {
size_t max_packets_per_fec_group;
// Length of guid to send over the wire.
QuicGuidLength send_guid_length;
- QuicSequenceNumberLength send_sequence_number_length;
};
// QuicRandom* required for packet entropy.
@@ -70,12 +68,10 @@ class NET_EXPORT_PRIVATE QuicPacketCreator : public QuicFecBuilderInterface {
void StopSendingVersion();
// The overhead the framing will add for a packet with num_frames frames.
- static size_t StreamFramePacketOverhead(
- int num_frames,
- QuicGuidLength guid_length,
- bool include_version,
- QuicSequenceNumberLength sequence_number_length,
- InFecGroup is_in_fec_group);
+ static size_t StreamFramePacketOverhead(int num_frames,
+ QuicGuidLength guid_length,
+ bool include_version,
+ InFecGroup is_in_fec_group);
bool HasRoomForStreamFrame() const;
diff --git a/net/quic/quic_packet_creator_test.cc b/net/quic/quic_packet_creator_test.cc
index f972182..8e055b6 100644
--- a/net/quic/quic_packet_creator_test.cc
+++ b/net/quic/quic_packet_creator_test.cc
@@ -246,7 +246,6 @@ TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) {
GetPacketHeaderSize(
creator_.options()->send_guid_length,
QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
- PACKET_6BYTE_SEQUENCE_NUMBER,
NOT_IN_FEC_GROUP),
creator_.BytesFree());
@@ -290,7 +289,6 @@ TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) {
GetPacketHeaderSize(
creator_.options()->send_guid_length,
QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
- PACKET_6BYTE_SEQUENCE_NUMBER,
NOT_IN_FEC_GROUP),
creator_.BytesFree());
}
diff --git a/net/quic/quic_protocol.cc b/net/quic/quic_protocol.cc
index 051a640..2293076 100644
--- a/net/quic/quic_protocol.cc
+++ b/net/quic/quic_protocol.cc
@@ -16,39 +16,31 @@ namespace net {
size_t GetPacketHeaderSize(QuicPacketHeader header) {
return GetPacketHeaderSize(header.public_header.guid_length,
header.public_header.version_flag,
- header.public_header.sequence_number_length,
header.is_in_fec_group);
}
size_t GetPacketHeaderSize(QuicGuidLength guid_length,
bool include_version,
- QuicSequenceNumberLength sequence_number_length,
InFecGroup is_in_fec_group) {
return kPublicFlagsSize + guid_length +
- (include_version ? kQuicVersionSize : 0) + sequence_number_length +
+ (include_version ? kQuicVersionSize : 0) + kSequenceNumberSize +
kPrivateFlagsSize + (is_in_fec_group == IN_FEC_GROUP ? kFecGroupSize : 0);
}
size_t GetPublicResetPacketSize() {
return kPublicFlagsSize + PACKET_8BYTE_GUID + kPublicResetNonceSize +
- PACKET_6BYTE_SEQUENCE_NUMBER;
+ kSequenceNumberSize;
}
-size_t GetStartOfFecProtectedData(
- QuicGuidLength guid_length,
- bool include_version,
- QuicSequenceNumberLength sequence_number_length) {
- return GetPacketHeaderSize(
- guid_length, include_version, sequence_number_length, IN_FEC_GROUP);
+size_t GetStartOfFecProtectedData(QuicGuidLength guid_length,
+ bool include_version) {
+ return GetPacketHeaderSize(guid_length, include_version, IN_FEC_GROUP);
}
-size_t GetStartOfEncryptedData(
- QuicGuidLength guid_length,
- bool include_version,
- QuicSequenceNumberLength sequence_number_length) {
+size_t GetStartOfEncryptedData(QuicGuidLength guid_length,
+ bool include_version) {
// Don't include the fec size, since encryption starts before private flags.
- return GetPacketHeaderSize(
- guid_length, include_version, sequence_number_length, NOT_IN_FEC_GROUP) -
+ return GetPacketHeaderSize(guid_length, include_version, NOT_IN_FEC_GROUP) -
kPrivateFlagsSize;
}
@@ -63,8 +55,7 @@ QuicPacketPublicHeader::QuicPacketPublicHeader()
: guid(0),
guid_length(PACKET_8BYTE_GUID),
reset_flag(false),
- version_flag(false),
- sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) {
+ version_flag(false) {
}
QuicPacketPublicHeader::QuicPacketPublicHeader(
@@ -73,7 +64,6 @@ QuicPacketPublicHeader::QuicPacketPublicHeader(
guid_length(other.guid_length),
reset_flag(other.reset_flag),
version_flag(other.version_flag),
- sequence_number_length(other.sequence_number_length),
versions(other.versions) {
}
@@ -261,6 +251,16 @@ QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code,
QuicFecData::QuicFecData() {}
+bool QuicFecData::operator==(const QuicFecData& other) const {
+ if (fec_group != other.fec_group) {
+ return false;
+ }
+ if (redundancy != other.redundancy) {
+ return false;
+ }
+ return true;
+}
+
QuicData::~QuicData() {
if (owns_buffer_) {
delete [] const_cast<char*>(buffer_);
@@ -268,29 +268,25 @@ QuicData::~QuicData() {
}
StringPiece QuicPacket::FecProtectedData() const {
- const size_t start_of_fec = GetStartOfFecProtectedData(
- guid_length_, includes_version_, sequence_number_length_);
+ const size_t start_of_fec = GetStartOfFecProtectedData(guid_length_,
+ includes_version_);
return StringPiece(data() + start_of_fec, length() - start_of_fec);
}
StringPiece QuicPacket::AssociatedData() const {
- return StringPiece(
- data() + kStartOfHashData,
- GetStartOfEncryptedData(
- guid_length_, includes_version_, sequence_number_length_) -
- kStartOfHashData);
+ return StringPiece(data() + kStartOfHashData,
+ GetStartOfEncryptedData(guid_length_, includes_version_) -
+ kStartOfHashData);
}
StringPiece QuicPacket::BeforePlaintext() const {
return StringPiece(data(), GetStartOfEncryptedData(guid_length_,
- includes_version_,
- sequence_number_length_));
+ includes_version_));
}
StringPiece QuicPacket::Plaintext() const {
const size_t start_of_encrypted_data =
- GetStartOfEncryptedData(
- guid_length_, includes_version_, sequence_number_length_);
+ GetStartOfEncryptedData(guid_length_, includes_version_);
return StringPiece(data() + start_of_encrypted_data,
length() - start_of_encrypted_data);
}
diff --git a/net/quic/quic_protocol.h b/net/quic/quic_protocol.h
index 608c526..4cde996 100644
--- a/net/quic/quic_protocol.h
+++ b/net/quic/quic_protocol.h
@@ -53,6 +53,8 @@ const size_t kDefaultMaxStreamsPerConnection = 100;
const size_t kPublicFlagsSize = 1;
// Number of bytes reserved for version number in the packet header.
const size_t kQuicVersionSize = 4;
+// Number of bytes reserved for sequence number in the packet header.
+const size_t kSequenceNumberSize = 6;
// Number of bytes reserved for private flags in the packet header.
const size_t kPrivateFlagsSize = 1;
// Number of bytes reserved for FEC group in the packet header.
@@ -117,13 +119,6 @@ enum InFecGroup {
IN_FEC_GROUP,
};
-enum QuicSequenceNumberLength {
- PACKET_1BYTE_SEQUENCE_NUMBER = 1,
- PACKET_2BYTE_SEQUENCE_NUMBER = 2,
- PACKET_4BYTE_SEQUENCE_NUMBER = 4,
- PACKET_6BYTE_SEQUENCE_NUMBER = 6
-};
-
enum QuicPacketPublicFlags {
PACKET_PUBLIC_FLAGS_NONE = 0,
PACKET_PUBLIC_FLAGS_VERSION = 1 << 0, // Packet header contains version info.
@@ -133,12 +128,7 @@ enum QuicPacketPublicFlags {
PACKET_PUBLIC_FLAGS_1BYTE_GUID = 1 << 2,
PACKET_PUBLIC_FLAGS_4BYTE_GUID = 1 << 3,
PACKET_PUBLIC_FLAGS_8BYTE_GUID = 1 << 3 | 1 << 2,
- // Packet sequence number length in bytes.
- PACKET_PUBLIC_FLAGS_1BYTE_SEQUENCE = 0,
- PACKET_PUBLIC_FLAGS_2BYTE_SEQUENCE = 1 << 4,
- PACKET_PUBLIC_FLAGS_4BYTE_SEQUENCE = 1 << 5,
- PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE = 1 << 5 | 1 << 4,
- PACKET_PUBLIC_FLAGS_MAX = (1 << 6) - 1 // All bits set.
+ PACKET_PUBLIC_FLAGS_MAX = (1 << 4) - 1 // All bits set.
};
enum QuicPacketPrivateFlags {
@@ -152,25 +142,19 @@ enum QuicPacketPrivateFlags {
// Size in bytes of the data or fec packet header.
NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(QuicPacketHeader header);
-NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(
- QuicGuidLength guid_length,
- bool include_version,
- QuicSequenceNumberLength sequence_number_length,
- InFecGroup is_in_fec_group);
+NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(QuicGuidLength guid_length,
+ bool include_version,
+ InFecGroup is_in_fec_group);
// Size in bytes of the public reset packet.
NET_EXPORT_PRIVATE size_t GetPublicResetPacketSize();
// Index of the first byte in a QUIC packet of FEC protected data.
-NET_EXPORT_PRIVATE size_t GetStartOfFecProtectedData(
- QuicGuidLength guid_length,
- bool include_version,
- QuicSequenceNumberLength sequence_number_length);
+NET_EXPORT_PRIVATE size_t GetStartOfFecProtectedData(QuicGuidLength guid_length,
+ bool include_version);
// Index of the first byte in a QUIC packet of encrypted data.
-NET_EXPORT_PRIVATE size_t GetStartOfEncryptedData(
- QuicGuidLength guid_length,
- bool include_version,
- QuicSequenceNumberLength sequence_number_length);
+NET_EXPORT_PRIVATE size_t GetStartOfEncryptedData(QuicGuidLength guid_length,
+ bool include_version);
enum QuicRstStreamErrorCode {
QUIC_STREAM_NO_ERROR = 0,
@@ -311,7 +295,7 @@ const QuicTag kUnsupportedVersion = -1;
// Each time the wire format changes, this need needs to be incremented.
// At some point, we will actually freeze the wire format and make an official
// version number, but this works for now.
-const QuicTag kQuicVersion1 = TAG('Q', '0', '0', '6');
+const QuicTag kQuicVersion1 = TAG('Q', '0', '0', '5');
#undef TAG
// MakeQuicTag returns a value given the four bytes. For example:
@@ -330,7 +314,6 @@ struct NET_EXPORT_PRIVATE QuicPacketPublicHeader {
QuicGuidLength guid_length;
bool reset_flag;
bool version_flag;
- QuicSequenceNumberLength sequence_number_length;
QuicTagVector versions;
};
@@ -594,6 +577,8 @@ typedef std::vector<QuicFrame> QuicFrames;
struct NET_EXPORT_PRIVATE QuicFecData {
QuicFecData();
+ bool operator==(const QuicFecData& other) const;
+
// The FEC group number is also the sequence number of the first
// FEC protected packet. The last protected packet's sequence number will
// be one less than the sequence number of the FEC packet.
@@ -636,26 +621,22 @@ class NET_EXPORT_PRIVATE QuicData {
class NET_EXPORT_PRIVATE QuicPacket : public QuicData {
public:
- static QuicPacket* NewDataPacket(
- char* buffer,
- size_t length,
- bool owns_buffer,
- QuicGuidLength guid_length,
- bool includes_version,
- QuicSequenceNumberLength sequence_number_length) {
- return new QuicPacket(buffer, length, owns_buffer, guid_length,
- includes_version, sequence_number_length, false);
+ static QuicPacket* NewDataPacket(char* buffer,
+ size_t length,
+ bool owns_buffer,
+ QuicGuidLength guid_length,
+ bool includes_version) {
+ return new QuicPacket(
+ buffer, length, owns_buffer, guid_length, includes_version, false);
}
- static QuicPacket* NewFecPacket(
- char* buffer,
- size_t length,
- bool owns_buffer,
- QuicGuidLength guid_length,
- bool includes_version,
- QuicSequenceNumberLength sequence_number_length) {
- return new QuicPacket(buffer, length, owns_buffer, guid_length,
- includes_version, sequence_number_length, true);
+ static QuicPacket* NewFecPacket(char* buffer,
+ size_t length,
+ bool owns_buffer,
+ QuicGuidLength guid_length,
+ bool includes_version) {
+ return new QuicPacket(
+ buffer, length, owns_buffer, guid_length, includes_version, true);
}
base::StringPiece FecProtectedData() const;
@@ -675,20 +656,17 @@ class NET_EXPORT_PRIVATE QuicPacket : public QuicData {
bool owns_buffer,
QuicGuidLength guid_length,
bool includes_version,
- QuicSequenceNumberLength sequence_number_length,
bool is_fec_packet)
: QuicData(buffer, length, owns_buffer),
buffer_(buffer),
is_fec_packet_(is_fec_packet),
guid_length_(guid_length),
- includes_version_(includes_version),
- sequence_number_length_(sequence_number_length) {}
+ includes_version_(includes_version) {}
char* buffer_;
const bool is_fec_packet_;
const QuicGuidLength guid_length_;
const bool includes_version_;
- const QuicSequenceNumberLength sequence_number_length_;
DISALLOW_COPY_AND_ASSIGN(QuicPacket);
};
diff --git a/net/quic/quic_session.cc b/net/quic/quic_session.cc
index 3df8b0a..2ed5b07 100644
--- a/net/quic/quic_session.cc
+++ b/net/quic/quic_session.cc
@@ -14,8 +14,6 @@ using std::vector;
namespace net {
-#define ENDPOINT (is_server_ ? "Server: " : " Client: ")
-
// We want to make sure we delete any closed streams in a safe manner.
// To avoid deleting a stream in mid-operation, we have a simple shim between
// us and the stream, so we can delete any streams when we return from
@@ -76,7 +74,6 @@ QuicSession::QuicSession(QuicConnection* connection,
next_stream_id_(is_server ? 2 : 3),
is_server_(is_server),
largest_peer_created_stream_id_(0),
- error_(QUIC_NO_ERROR),
goaway_received_(false),
goaway_sent_(false) {
set_max_open_streams(config_.max_streams_per_connection());
@@ -98,7 +95,7 @@ bool QuicSession::OnPacket(const IPEndPoint& self_address,
const QuicPacketHeader& header,
const vector<QuicStreamFrame>& frames) {
if (header.public_header.guid != connection()->guid()) {
- DLOG(INFO) << ENDPOINT << "Got packet header for invalid GUID: "
+ DLOG(INFO) << "Got packet header for invalid GUID: "
<< header.public_header.guid;
return false;
}
@@ -152,17 +149,13 @@ void QuicSession::OnGoAway(const QuicGoAwayFrame& frame) {
}
void QuicSession::ConnectionClose(QuicErrorCode error, bool from_peer) {
- if (error_ == QUIC_NO_ERROR) {
- error_ = error;
- }
-
while (stream_map_.size() != 0) {
ReliableStreamMap::iterator it = stream_map_.begin();
QuicStreamId id = it->first;
it->second->ConnectionClose(error, from_peer);
// The stream should call CloseStream as part of ConnectionClose.
if (stream_map_.find(id) != stream_map_.end()) {
- LOG(DFATAL) << ENDPOINT << "Stream failed to close under ConnectionClose";
+ LOG(DFATAL) << "Stream failed to close under ConnectionClose";
CloseStream(id);
}
}
@@ -208,11 +201,11 @@ void QuicSession::SendGoAway(QuicErrorCode error_code, const string& reason) {
}
void QuicSession::CloseStream(QuicStreamId stream_id) {
- DLOG(INFO) << ENDPOINT << "Closing stream " << stream_id;
+ DLOG(INFO) << "Closing stream " << stream_id;
ReliableStreamMap::iterator it = stream_map_.find(stream_id);
if (it == stream_map_.end()) {
- DLOG(INFO) << ENDPOINT << "Stream is already closed: " << stream_id;
+ DLOG(INFO) << "Stream is already closed: " << stream_id;
return;
}
ReliableQuicStream* stream = it->second;
@@ -244,7 +237,7 @@ void QuicSession::OnCryptoHandshakeEvent(CryptoHandshakeEvent event) {
break;
case HANDSHAKE_CONFIRMED:
- LOG_IF(DFATAL, !config_.negotiated()) << ENDPOINT
+ LOG_IF(DFATAL, !config_.negotiated())
<< "Handshake confirmed without parameter negotiation.";
connection_->SetIdleNetworkTimeout(
config_.idle_connection_state_lifetime());
@@ -253,7 +246,7 @@ void QuicSession::OnCryptoHandshakeEvent(CryptoHandshakeEvent event) {
break;
default:
- LOG(ERROR) << ENDPOINT << "Got unknown handshake event: " << event;
+ LOG(ERROR) << "Got unknown handshake event: " << event;
}
}
@@ -262,8 +255,8 @@ QuicConfig* QuicSession::config() {
}
void QuicSession::ActivateStream(ReliableQuicStream* stream) {
- DLOG(INFO) << ENDPOINT << "num_streams: " << stream_map_.size()
- << ". activating " << stream->id();
+ DLOG(INFO) << "num_streams: " << stream_map_.size()
+ << ". activating " << stream->id();
DCHECK(stream_map_.count(stream->id()) == 0);
stream_map_[stream->id()] = stream;
}
diff --git a/net/quic/quic_session.h b/net/quic/quic_session.h
index 5f85dd6..e5793d7 100644
--- a/net/quic/quic_session.h
+++ b/net/quic/quic_session.h
@@ -114,7 +114,6 @@ class NET_EXPORT_PRIVATE QuicSession : public QuicConnectionVisitorInterface {
bool IsClosedStream(QuicStreamId id);
QuicConnection* connection() { return connection_.get(); }
- const QuicConnection* connection() const { return connection_.get(); }
size_t num_active_requests() const { return stream_map_.size(); }
const IPEndPoint& peer_address() const {
return connection_->peer_address();
@@ -145,8 +144,6 @@ class NET_EXPORT_PRIVATE QuicSession : public QuicConnectionVisitorInterface {
QuicSpdyDecompressor* decompressor() { return &decompressor_; }
QuicSpdyCompressor* compressor() { return &compressor_; }
- QuicErrorCode error() const { return error_; }
-
protected:
// Creates a new stream, owned by the caller, to handle a peer-initiated
// stream. Returns NULL and does error handling if the stream can not be
@@ -177,11 +174,6 @@ class NET_EXPORT_PRIVATE QuicSession : public QuicConnectionVisitorInterface {
base::hash_map<QuicStreamId, ReliableQuicStream*>* streams() {
return &stream_map_;
}
-
- const base::hash_map<QuicStreamId, ReliableQuicStream*>* streams() const {
- return &stream_map_;
- }
-
std::vector<ReliableQuicStream*>* closed_streams() {
return &closed_streams_;
}
@@ -236,9 +228,6 @@ class NET_EXPORT_PRIVATE QuicSession : public QuicConnectionVisitorInterface {
QuicStreamId largest_peer_created_stream_id_;
- // The latched error with which the connection was closed.
- QuicErrorCode error_;
-
// Whether a GoAway has been received.
bool goaway_received_;
// Whether a GoAway has been sent.
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index 781d971..608fdcf 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -129,12 +129,21 @@ TEST_F(QuicStreamFactoryTest, CreateIfSessionExists) {
}
TEST_F(QuicStreamFactoryTest, Create) {
+ scoped_ptr<QuicEncryptedPacket> rst3(ConstructRstPacket(1, 3));
+ scoped_ptr<QuicEncryptedPacket> rst5(ConstructRstPacket(2, 5));
+ scoped_ptr<QuicEncryptedPacket> rst7(ConstructRstPacket(3, 7));
+ MockWrite writes[] = {
+ MockWrite(SYNCHRONOUS, rst3->data(), rst3->length(), 0),
+ MockWrite(SYNCHRONOUS, rst5->data(), rst5->length(), 1),
+ MockWrite(SYNCHRONOUS, rst7->data(), rst7->length(), 2),
+ };
MockRead reads[] = {
- MockRead(ASYNC, OK, 0) // EOF
+ MockRead(ASYNC, OK, 3) // EOF
};
- DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
+ DeterministicSocketData socket_data(reads, arraysize(reads),
+ writes, arraysize(writes));
socket_factory_.AddSocketDataProvider(&socket_data);
- socket_data.StopAfter(1);
+ socket_data.StopAfter(3);
QuicStreamRequest request(&factory_);
EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, net_log_,
@@ -154,6 +163,8 @@ TEST_F(QuicStreamFactoryTest, Create) {
stream = request2.ReleaseStream(); // Will reset stream 5.
stream.reset(); // Will reset stream 7.
+ socket_data.RunFor(1);
+
EXPECT_TRUE(socket_data.at_read_eof());
EXPECT_TRUE(socket_data.at_write_eof());
}
@@ -175,10 +186,16 @@ TEST_F(QuicStreamFactoryTest, CreateError) {
}
TEST_F(QuicStreamFactoryTest, CancelCreate) {
+ scoped_ptr<QuicEncryptedPacket> rst3(ConstructRstPacket(1, 3));
+
+ MockWrite writes[] = {
+ MockWrite(SYNCHRONOUS, rst3->data(), rst3->length(), 0),
+ };
MockRead reads[] = {
- MockRead(ASYNC, OK, 0) // EOF
+ MockRead(ASYNC, OK, 1) // EOF
};
- DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
+ DeterministicSocketData socket_data(reads, arraysize(reads),
+ writes, arraysize(writes));
socket_factory_.AddSocketDataProvider(&socket_data);
{
QuicStreamRequest request(&factory_);
@@ -186,7 +203,7 @@ TEST_F(QuicStreamFactoryTest, CancelCreate) {
callback_.callback()));
}
- socket_data.StopAfter(1);
+ socket_data.StopAfter(2);
base::RunLoop run_loop;
run_loop.RunUntilIdle();
@@ -195,22 +212,30 @@ TEST_F(QuicStreamFactoryTest, CancelCreate) {
EXPECT_TRUE(stream.get());
stream.reset();
+ socket_data.RunFor(1);
+
EXPECT_TRUE(socket_data.at_read_eof());
EXPECT_TRUE(socket_data.at_write_eof());
}
TEST_F(QuicStreamFactoryTest, CloseAllSessions) {
+ scoped_ptr<QuicEncryptedPacket> rst3(ConstructRstPacket(1, 3));
MockRead reads[] = {
MockRead(ASYNC, 0, 0) // EOF
};
- DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
+ DeterministicSocketData socket_data(reads, arraysize(reads),
+ NULL, 0);
socket_factory_.AddSocketDataProvider(&socket_data);
socket_data.StopAfter(1);
+ MockWrite writes2[] = {
+ MockWrite(SYNCHRONOUS, rst3->data(), rst3->length(), 0),
+ };
MockRead reads2[] = {
- MockRead(ASYNC, 0, 0) // EOF
+ MockRead(ASYNC, 0, 1) // EOF
};
- DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
+ DeterministicSocketData socket_data2(reads2, arraysize(reads2),
+ writes2, arraysize(writes2));
socket_factory_.AddSocketDataProvider(&socket_data2);
socket_data2.StopAfter(1);
@@ -237,6 +262,8 @@ TEST_F(QuicStreamFactoryTest, CloseAllSessions) {
stream = request2.ReleaseStream();
stream.reset(); // Will reset stream 3.
+ socket_data2.RunFor(1);
+
EXPECT_TRUE(socket_data.at_read_eof());
EXPECT_TRUE(socket_data.at_write_eof());
EXPECT_TRUE(socket_data2.at_read_eof());
@@ -244,17 +271,23 @@ TEST_F(QuicStreamFactoryTest, CloseAllSessions) {
}
TEST_F(QuicStreamFactoryTest, OnIPAddressChanged) {
+ scoped_ptr<QuicEncryptedPacket> rst3(ConstructRstPacket(1, 3));
MockRead reads[] = {
MockRead(ASYNC, 0, 0) // EOF
};
- DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
+ DeterministicSocketData socket_data(reads, arraysize(reads),
+ NULL, 0);
socket_factory_.AddSocketDataProvider(&socket_data);
socket_data.StopAfter(1);
+ MockWrite writes2[] = {
+ MockWrite(SYNCHRONOUS, rst3->data(), rst3->length(), 0),
+ };
MockRead reads2[] = {
- MockRead(ASYNC, 0, 0) // EOF
+ MockRead(ASYNC, 0, 1) // EOF
};
- DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
+ DeterministicSocketData socket_data2(reads2, arraysize(reads2),
+ writes2, arraysize(writes2));
socket_factory_.AddSocketDataProvider(&socket_data2);
socket_data2.StopAfter(1);
@@ -281,6 +314,8 @@ TEST_F(QuicStreamFactoryTest, OnIPAddressChanged) {
stream = request2.ReleaseStream();
stream.reset(); // Will reset stream 3.
+ socket_data2.RunFor(1);
+
EXPECT_TRUE(socket_data.at_read_eof());
EXPECT_TRUE(socket_data.at_write_eof());
EXPECT_TRUE(socket_data2.at_read_eof());
diff --git a/net/quic/reliable_quic_stream.cc b/net/quic/reliable_quic_stream.cc
index 144c908..0ed990e 100644
--- a/net/quic/reliable_quic_stream.cc
+++ b/net/quic/reliable_quic_stream.cc
@@ -95,12 +95,7 @@ void ReliableQuicStream::TerminateFromPeer(bool half_close) {
void ReliableQuicStream::Close(QuicRstStreamErrorCode error) {
stream_error_ = error;
- if (error != QUIC_STREAM_NO_ERROR) {
- // Sending a RstStream results in calling CloseStream.
- session()->SendRstStream(id(), error);
- } else {
- session_->CloseStream(id());
- }
+ session()->SendRstStream(id(), error);
}
int ReliableQuicStream::Readv(const struct iovec* iov, size_t iov_len) {
@@ -160,7 +155,6 @@ QuicSpdyCompressor* ReliableQuicStream::compressor() {
}
QuicConsumedData ReliableQuicStream::WriteData(StringPiece data, bool fin) {
- DCHECK(data.size() > 0 || fin);
return WriteOrBuffer(data, fin);
}
@@ -218,8 +212,6 @@ QuicConsumedData ReliableQuicStream::WriteDataInternal(
if (fin && consumed_data.fin_consumed) {
fin_sent_ = true;
CloseWriteSide();
- } else if (fin && !consumed_data.fin_consumed) {
- session_->MarkWriteBlocked(id());
}
} else {
session_->MarkWriteBlocked(id());
diff --git a/net/quic/reliable_quic_stream_test.cc b/net/quic/reliable_quic_stream_test.cc
index 2350c7c..54f97e8 100644
--- a/net/quic/reliable_quic_stream_test.cc
+++ b/net/quic/reliable_quic_stream_test.cc
@@ -9,7 +9,6 @@
#include "net/quic/quic_spdy_decompressor.h"
#include "net/quic/quic_utils.h"
#include "net/quic/spdy_utils.h"
-#include "net/quic/test_tools/quic_session_peer.h"
#include "net/quic/test_tools/quic_test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
@@ -79,8 +78,6 @@ class ReliableQuicStreamTest : public ::testing::TestWithParam<bool> {
stream_should_process_data));
compressor_.reset(new QuicSpdyCompressor());
decompressor_.reset(new QuicSpdyDecompressor);
- write_blocked_list_ =
- QuicSessionPeer::GetWriteblockedStreams(session_.get());
}
protected:
@@ -91,7 +88,6 @@ class ReliableQuicStreamTest : public ::testing::TestWithParam<bool> {
scoped_ptr<QuicSpdyCompressor> compressor_;
scoped_ptr<QuicSpdyDecompressor> decompressor_;
SpdyHeaderBlock headers_;
- BlockedList<QuicStreamId>* write_blocked_list_;
};
TEST_F(ReliableQuicStreamTest, WriteAllData) {
@@ -99,82 +95,26 @@ TEST_F(ReliableQuicStreamTest, WriteAllData) {
connection_->options()->max_packet_length =
1 + QuicPacketCreator::StreamFramePacketOverhead(
- 1, PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
+ 1, PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP);
// TODO(rch): figure out how to get StrEq working here.
//EXPECT_CALL(*session_, WriteData(kStreamId, StrEq(kData1), _, _)).WillOnce(
EXPECT_CALL(*session_, WriteData(kStreamId, _, _, _)).WillOnce(
Return(QuicConsumedData(kDataLen, true)));
EXPECT_EQ(kDataLen, stream_->WriteData(kData1, false).bytes_consumed);
- EXPECT_TRUE(write_blocked_list_->IsEmpty());
-}
-
-#if GTEST_HAS_DEATH_TEST && !defined(NDEBUG)
-TEST_F(ReliableQuicStreamTest, NoBlockingIfNoDataOrFin) {
- Initialize(kShouldProcessData);
-
- // Write no data and no fin. If we consume nothing we should not be write
- // blocked.
- EXPECT_DEBUG_DEATH({
- EXPECT_CALL(*session_, WriteData(kStreamId, _, _, _)).WillOnce(
- Return(QuicConsumedData(0, false)));
- stream_->WriteData(StringPiece(), false);
- EXPECT_TRUE(write_blocked_list_->IsEmpty());
- }, "");
-}
-#endif // GTEST_HAS_DEATH_TEST && !defined(NDEBUG)
-
-TEST_F(ReliableQuicStreamTest, BlockIfOnlySomeDataConsumed) {
- Initialize(kShouldProcessData);
-
- // Write some data and no fin. If we consume some but not all of the data,
- // we should be write blocked a not all the data was consumed.
- EXPECT_CALL(*session_, WriteData(kStreamId, _, _, _)).WillOnce(
- Return(QuicConsumedData(1, false)));
- stream_->WriteData(StringPiece(kData1, 2), false);
- ASSERT_EQ(1, write_blocked_list_->NumObjects());
-}
-
-
-TEST_F(ReliableQuicStreamTest, BlockIfFinNotConsumedWithData) {
- Initialize(kShouldProcessData);
-
- // Write some data and no fin. If we consume all the data but not the fin,
- // we should be write blocked because the fin was not consumed.
- // (This should never actually happen as the fin should be sent out with the
- // last data)
- EXPECT_CALL(*session_, WriteData(kStreamId, _, _, _)).WillOnce(
- Return(QuicConsumedData(2, false)));
- stream_->WriteData(StringPiece(kData1, 2), true);
- ASSERT_EQ(1, write_blocked_list_->NumObjects());
-}
-
-TEST_F(ReliableQuicStreamTest, BlockIfSoloFinNotConsumed) {
- Initialize(kShouldProcessData);
-
- // Write no data and a fin. If we consume nothing we should be write blocked,
- // as the fin was not consumed.
- EXPECT_CALL(*session_, WriteData(kStreamId, _, _, _)).WillOnce(
- Return(QuicConsumedData(0, false)));
- stream_->WriteData(StringPiece(), true);
- ASSERT_EQ(1, write_blocked_list_->NumObjects());
}
TEST_F(ReliableQuicStreamTest, WriteData) {
Initialize(kShouldProcessData);
- EXPECT_TRUE(write_blocked_list_->IsEmpty());
connection_->options()->max_packet_length =
1 + QuicPacketCreator::StreamFramePacketOverhead(
- 1, PACKET_8BYTE_GUID, !kIncludeVersion,
- PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
+ 1, PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP);
// TODO(rch): figure out how to get StrEq working here.
//EXPECT_CALL(*session_, WriteData(_, StrEq(kData1), _, _)).WillOnce(
EXPECT_CALL(*session_, WriteData(_, _, _, _)).WillOnce(
Return(QuicConsumedData(kDataLen - 1, false)));
// The return will be kDataLen, because the last byte gets buffered.
EXPECT_EQ(kDataLen, stream_->WriteData(kData1, false).bytes_consumed);
- EXPECT_FALSE(write_blocked_list_->IsEmpty());
// Queue a bytes_consumed write.
EXPECT_EQ(kDataLen, stream_->WriteData(kData2, false).bytes_consumed);
diff --git a/net/quic/test_tools/quic_framer_peer.cc b/net/quic/test_tools/quic_framer_peer.cc
index f31299c..49315f0 100644
--- a/net/quic/test_tools/quic_framer_peer.cc
+++ b/net/quic/test_tools/quic_framer_peer.cc
@@ -13,10 +13,8 @@ namespace test {
// static
QuicPacketSequenceNumber QuicFramerPeer::CalculatePacketSequenceNumberFromWire(
QuicFramer* framer,
- QuicSequenceNumberLength sequence_number_length,
QuicPacketSequenceNumber packet_sequence_number) {
- return framer->CalculatePacketSequenceNumberFromWire(sequence_number_length,
- packet_sequence_number);
+ return framer->CalculatePacketSequenceNumberFromWire(packet_sequence_number);
}
// static
diff --git a/net/quic/test_tools/quic_framer_peer.h b/net/quic/test_tools/quic_framer_peer.h
index 7a2da5c..6d4a1e1 100644
--- a/net/quic/test_tools/quic_framer_peer.h
+++ b/net/quic/test_tools/quic_framer_peer.h
@@ -17,7 +17,6 @@ class QuicFramerPeer {
public:
static QuicPacketSequenceNumber CalculatePacketSequenceNumberFromWire(
QuicFramer* framer,
- QuicSequenceNumberLength sequence_number_length,
QuicPacketSequenceNumber packet_sequence_number);
static void SetLastSerializedGuid(QuicFramer* framer, QuicGuid guid);
static void SetLastSequenceNumber(
diff --git a/net/quic/test_tools/quic_session_peer.cc b/net/quic/test_tools/quic_session_peer.cc
index 66caa15..0a81ca9 100644
--- a/net/quic/test_tools/quic_session_peer.cc
+++ b/net/quic/test_tools/quic_session_peer.cc
@@ -5,7 +5,6 @@
#include "net/quic/test_tools/quic_session_peer.h"
#include "net/quic/quic_session.h"
-#include "net/quic/reliable_quic_stream.h"
namespace net {
namespace test {
@@ -21,17 +20,5 @@ void QuicSessionPeer::SetMaxOpenStreams(QuicSession* session,
session->max_open_streams_ = max_streams;
}
-// static
-ReliableQuicStream* QuicSessionPeer::CreateIncomingReliableStream(
- QuicSession* session, QuicStreamId id) {
- return session->CreateIncomingReliableStream(id);
-}
-
-// static
-BlockedList<QuicStreamId>* QuicSessionPeer::GetWriteblockedStreams(
- QuicSession* session) {
- return &session->write_blocked_streams_;
-}
-
} // namespace test
} // namespace net
diff --git a/net/quic/test_tools/quic_session_peer.h b/net/quic/test_tools/quic_session_peer.h
index 6f9a8f3..9aff659 100644
--- a/net/quic/test_tools/quic_session_peer.h
+++ b/net/quic/test_tools/quic_session_peer.h
@@ -5,13 +5,11 @@
#ifndef NET_QUIC_TEST_TOOLS_QUIC_SESSION_PEER_H_
#define NET_QUIC_TEST_TOOLS_QUIC_SESSION_PEER_H_
-#include "net/quic/blocked_list.h"
#include "net/quic/quic_protocol.h"
namespace net {
class QuicSession;
-class ReliableQuicStream;
namespace test {
@@ -19,10 +17,6 @@ class QuicSessionPeer {
public:
static void SetNextStreamId(QuicSession* session, QuicStreamId id);
static void SetMaxOpenStreams(QuicSession* session, uint32 max_streams);
- static ReliableQuicStream* CreateIncomingReliableStream(QuicSession* session,
- QuicStreamId id);
- static BlockedList<QuicStreamId>* GetWriteblockedStreams(
- QuicSession* session);
private:
DISALLOW_COPY_AND_ASSIGN(QuicSessionPeer);
diff --git a/net/quic/test_tools/quic_test_utils.cc b/net/quic/test_tools/quic_test_utils.cc
index a8c67f7..0d649d3 100644
--- a/net/quic/test_tools/quic_test_utils.cc
+++ b/net/quic/test_tools/quic_test_utils.cc
@@ -386,13 +386,11 @@ size_t GetPacketLengthForOneStream(
// TODO(wtc): the hardcoded use of NullEncrypter here seems wrong.
size_t packet_length = NullEncrypter().GetCiphertextSize(payload) +
QuicPacketCreator::StreamFramePacketOverhead(
- 1, PACKET_8BYTE_GUID, include_version,
- PACKET_6BYTE_SEQUENCE_NUMBER, is_in_fec_group);
+ 1, PACKET_8BYTE_GUID, include_version, is_in_fec_group);
size_t ack_length = NullEncrypter().GetCiphertextSize(
QuicFramer::GetMinAckFrameSize()) +
- GetPacketHeaderSize(PACKET_8BYTE_GUID, include_version,
- PACKET_6BYTE_SEQUENCE_NUMBER, is_in_fec_group);
+ GetPacketHeaderSize(PACKET_8BYTE_GUID, include_version, is_in_fec_group);
// Make sure that if we change the size of the packet length for one stream
// or the ack frame; that all our test are configured correctly.
DCHECK_GE(packet_length, ack_length);