Commit ea2ab47b authored by wtc@chromium.org's avatar wtc@chromium.org

Removing QUIC's VERSION_6, now that QUIC no longer needs to support the

older STREAM frames.

Merge internal CL: 50558774

Add the QuicVersionMin() function.

Change some unit tests to use QuicVersionMin().

Merge internal CL: 50630692

R=rch@chromium.org
BUG=none
TEST=net_unittests

Review URL: https://chromiumcodereview.appspot.com/22311013

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@217137 0039d316-1c4b-4281-b951-d872f2087c98
parent e921690b
...@@ -28,12 +28,12 @@ class NET_EXPORT_PRIVATE ProofSource { ...@@ -28,12 +28,12 @@ class NET_EXPORT_PRIVATE ProofSource {
// //
// The signature uses SHA-256 as the hash function when the key is ECDSA. // The signature uses SHA-256 as the hash function when the key is ECDSA.
// //
// If |ecdsa_ok| is true, the signature may use an ECDSA key. Otherwise, the
// signature must use an RSA key.
//
// |version| is the QUIC version for the connection. TODO(wtc): Remove once // |version| is the QUIC version for the connection. TODO(wtc): Remove once
// QUIC_VERSION_7 and before are removed. // QUIC_VERSION_7 and before are removed.
// //
// If |ecdsa_ok| is true, the signature may use an ECDSA key. Otherwise, the
// signature must use an RSA key.
//
// |out_certs| is a pointer to a pointer, not a pointer to an array. // |out_certs| is a pointer to a pointer, not a pointer to an array.
// //
// The number of certificate chains is expected to be small and fixed thus // The number of certificate chains is expected to be small and fixed thus
......
...@@ -2373,26 +2373,28 @@ TEST_F(QuicConnectionTest, DontProcessFramesIfPacketClosedConnection) { ...@@ -2373,26 +2373,28 @@ TEST_F(QuicConnectionTest, DontProcessFramesIfPacketClosedConnection) {
connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
} }
// The QUIC_VERSION_X versions are deliberately set, rather than using all
// values in kSupportedQuicVersions.
TEST_F(QuicConnectionTest, SelectMutualVersion) { TEST_F(QuicConnectionTest, SelectMutualVersion) {
// Set the connection to speak QUIC_VERSION_6. // Set the connection to speak the lowest quic version.
connection_.set_version(QUIC_VERSION_6); connection_.set_version(QuicVersionMin());
EXPECT_EQ(connection_.version(), QUIC_VERSION_6); EXPECT_EQ(QuicVersionMin(), connection_.version());
// Pass in available versions which includes a higher mutually supported // Pass in available versions which includes a higher mutually supported
// version. The higher mutually supported version should be selected. // version. The higher mutually supported version should be selected.
QuicVersionVector available_versions; QuicVersionVector supported_versions;
available_versions.push_back(QUIC_VERSION_6); for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
available_versions.push_back(QUIC_VERSION_7); supported_versions.push_back(kSupportedQuicVersions[i]);
EXPECT_TRUE(connection_.SelectMutualVersion(available_versions)); }
EXPECT_EQ(connection_.version(), QUIC_VERSION_7); EXPECT_TRUE(connection_.SelectMutualVersion(supported_versions));
EXPECT_EQ(QuicVersionMax(), connection_.version());
// Expect that the lower version is selected.
QuicVersionVector lower_version; // Expect that the lowest version is selected.
lower_version.push_back(QUIC_VERSION_6); // Ensure the lowest supported version is less than the max, unless they're
EXPECT_TRUE(connection_.SelectMutualVersion(lower_version)); // the same.
EXPECT_EQ(connection_.version(), QUIC_VERSION_6); EXPECT_LE(QuicVersionMin(), QuicVersionMax());
QuicVersionVector lowest_version_vector;
lowest_version_vector.push_back(QuicVersionMin());
EXPECT_TRUE(connection_.SelectMutualVersion(lowest_version_vector));
EXPECT_EQ(QuicVersionMin(), connection_.version());
// Shouldn't be able to find a mutually supported version. // Shouldn't be able to find a mutually supported version.
QuicVersionVector unsupported_version; QuicVersionVector unsupported_version;
......
...@@ -103,11 +103,6 @@ size_t QuicFramer::GetMinStreamFrameSize(QuicVersion version, ...@@ -103,11 +103,6 @@ size_t QuicFramer::GetMinStreamFrameSize(QuicVersion version,
QuicStreamId stream_id, QuicStreamId stream_id,
QuicStreamOffset offset, QuicStreamOffset offset,
bool last_frame_in_packet) { bool last_frame_in_packet) {
if (version == QUIC_VERSION_6) {
return kQuicFrameTypeSize + kQuicMaxStreamIdSize +
kQuicStreamFinSize + kQuicMaxStreamOffsetSize +
kQuicStreamPayloadLengthSize;
}
return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + return kQuicFrameTypeSize + GetStreamIdSize(stream_id) +
GetStreamOffsetSize(offset) + GetStreamOffsetSize(offset) +
(last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize); (last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize);
...@@ -283,15 +278,9 @@ SerializedPacket QuicFramer::BuildDataPacket( ...@@ -283,15 +278,9 @@ SerializedPacket QuicFramer::BuildDataPacket(
writer.WritePadding(); writer.WritePadding();
break; break;
case STREAM_FRAME: case STREAM_FRAME:
if (quic_version_ == QUIC_VERSION_6) { if (!AppendStreamFramePayload(
if (!AppendV6StreamFramePayload(*frame.stream_frame, &writer)) { *frame.stream_frame, last_frame_in_packet, &writer)) {
return kNoPacket; return kNoPacket;
}
} else {
if (!AppendStreamFramePayload(
*frame.stream_frame, last_frame_in_packet, &writer)) {
return kNoPacket;
}
} }
break; break;
case ACK_FRAME: case ACK_FRAME:
...@@ -898,97 +887,55 @@ bool QuicFramer::ProcessFrameData() { ...@@ -898,97 +887,55 @@ bool QuicFramer::ProcessFrameData() {
return RaiseError(QUIC_INVALID_FRAME_DATA); return RaiseError(QUIC_INVALID_FRAME_DATA);
} }
if (quic_version_ >= QUIC_VERSION_7) { if ((frame_type & kQuicFrameType0BitMask) == 0) {
if ((frame_type & kQuicFrameType0BitMask) == 0) { QuicStreamFrame frame;
QuicStreamFrame frame; if (!ProcessStreamFrame(frame_type, &frame)) {
if (!ProcessStreamFrame(frame_type, &frame)) { return RaiseError(QUIC_INVALID_FRAME_DATA);
return RaiseError(QUIC_INVALID_FRAME_DATA);
}
if (!visitor_->OnStreamFrame(frame)) {
DLOG(INFO) << "Visitor asked to stop further processing.";
// Returning true since there was no parsing error.
return true;
}
continue;
} }
if (!visitor_->OnStreamFrame(frame)) {
frame_type >>= 1; DLOG(INFO) << "Visitor asked to stop further processing.";
if ((frame_type & kQuicFrameType0BitMask) == 0) { // Returning true since there was no parsing error.
QuicAckFrame frame; return true;
if (!ProcessAckFrame(&frame)) {
return RaiseError(QUIC_INVALID_FRAME_DATA);
}
if (!visitor_->OnAckFrame(frame)) {
DLOG(INFO) << "Visitor asked to stop further processing.";
// Returning true since there was no parsing error.
return true;
}
continue;
} }
continue;
}
frame_type >>= 1; frame_type >>= 1;
if ((frame_type & kQuicFrameType0BitMask) == 0) { if ((frame_type & kQuicFrameType0BitMask) == 0) {
QuicCongestionFeedbackFrame frame; QuicAckFrame frame;
if (!ProcessQuicCongestionFeedbackFrame(&frame)) { if (!ProcessAckFrame(&frame)) {
return RaiseError(QUIC_INVALID_FRAME_DATA); return RaiseError(QUIC_INVALID_FRAME_DATA);
} }
if (!visitor_->OnCongestionFeedbackFrame(frame)) { if (!visitor_->OnAckFrame(frame)) {
DLOG(INFO) << "Visitor asked to stop further processing."; DLOG(INFO) << "Visitor asked to stop further processing.";
// Returning true since there was no parsing error. // Returning true since there was no parsing error.
return true; return true;
}
continue;
} }
continue;
}
frame_type >>= 1; frame_type >>= 1;
if ((frame_type & kQuicFrameType0BitMask) == 0) {
QuicCongestionFeedbackFrame frame;
if (!ProcessQuicCongestionFeedbackFrame(&frame)) {
return RaiseError(QUIC_INVALID_FRAME_DATA);
}
if (!visitor_->OnCongestionFeedbackFrame(frame)) {
DLOG(INFO) << "Visitor asked to stop further processing.";
// Returning true since there was no parsing error.
return true;
}
continue;
} }
frame_type >>= 1;
switch (frame_type) { switch (frame_type) {
// STREAM_FRAME, ACK_FRAME, and CONGESTION_FEEDBACK_FRAME are handled
// above.
case PADDING_FRAME: case PADDING_FRAME:
// We're done with the packet // We're done with the packet
return true; return true;
// STREAM_FRAME, ACK_FRAME, and CONGESTION_FEEDBACK handled above for
// QUIC_VERSION_7 and later.
case STREAM_FRAME: {
QuicStreamFrame frame;
if (!ProcessV6StreamFrame(&frame)) {
return RaiseError(QUIC_INVALID_FRAME_DATA);
}
if (!visitor_->OnStreamFrame(frame)) {
DLOG(INFO) << "Visitor asked to stop further processing.";
// Returning true since there was no parsing error.
return true;
}
continue;
}
case ACK_FRAME: {
QuicAckFrame frame;
if (!ProcessAckFrame(&frame)) {
return RaiseError(QUIC_INVALID_FRAME_DATA);
}
if (!visitor_->OnAckFrame(frame)) {
DLOG(INFO) << "Visitor asked to stop further processing.";
// Returning true since there was no parsing error.
// TODO(ianswett): Consider continuing to process frames, since there
// was not a parsing error.
return true;
}
continue;
}
case CONGESTION_FEEDBACK_FRAME: {
QuicCongestionFeedbackFrame frame;
if (!ProcessQuicCongestionFeedbackFrame(&frame)) {
return RaiseError(QUIC_INVALID_FRAME_DATA);
}
if (!visitor_->OnCongestionFeedbackFrame(frame)) {
DLOG(INFO) << "Visitor asked to stop further processing.";
// Returning true since there was no parsing error.
return true;
}
continue;
}
case RST_STREAM_FRAME: { case RST_STREAM_FRAME: {
QuicRstStreamFrame frame; QuicRstStreamFrame frame;
...@@ -1093,36 +1040,6 @@ bool QuicFramer::ProcessStreamFrame(uint8 frame_type, ...@@ -1093,36 +1040,6 @@ bool QuicFramer::ProcessStreamFrame(uint8 frame_type,
return true; return true;
} }
bool QuicFramer::ProcessV6StreamFrame(QuicStreamFrame* frame) {
if (!reader_->ReadUInt32(&frame->stream_id)) {
set_detailed_error("Unable to read stream_id.");
return false;
}
uint8 fin;
if (!reader_->ReadBytes(&fin, 1)) {
set_detailed_error("Unable to read fin.");
return false;
}
if (fin > 1) {
set_detailed_error("Invalid fin value.");
return false;
}
frame->fin = (fin == 1);
if (!reader_->ReadUInt64(&frame->offset)) {
set_detailed_error("Unable to read offset.");
return false;
}
if (!reader_->ReadStringPiece16(&frame->data)) {
set_detailed_error("Unable to read frame data.");
return false;
}
return true;
}
bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) { bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) {
if (!ProcessSentInfo(&frame->sent_info)) { if (!ProcessSentInfo(&frame->sent_info)) {
return false; return false;
...@@ -1602,10 +1519,6 @@ size_t QuicFramer::ComputeFrameLength(const QuicFrame& frame, ...@@ -1602,10 +1519,6 @@ size_t QuicFramer::ComputeFrameLength(const QuicFrame& frame,
bool QuicFramer::AppendTypeByte(const QuicFrame& frame, bool QuicFramer::AppendTypeByte(const QuicFrame& frame,
bool last_frame_in_packet, bool last_frame_in_packet,
QuicDataWriter* writer) { QuicDataWriter* writer) {
if (quic_version_ == QUIC_VERSION_6) {
return writer->WriteUInt8(frame.type);
}
uint8 type_byte = 0; uint8 type_byte = 0;
switch (frame.type) { switch (frame.type) {
case STREAM_FRAME: { case STREAM_FRAME: {
...@@ -1706,27 +1619,6 @@ bool QuicFramer::AppendStreamFramePayload( ...@@ -1706,27 +1619,6 @@ bool QuicFramer::AppendStreamFramePayload(
return true; return true;
} }
bool QuicFramer::AppendV6StreamFramePayload(
const QuicStreamFrame& frame,
QuicDataWriter* writer) {
if (!writer->WriteUInt32(frame.stream_id)) {
return false;
}
if (!writer->WriteUInt8(frame.fin)) {
return false;
}
if (!writer->WriteUInt64(frame.offset)) {
return false;
}
if (!writer->WriteUInt16(frame.data.size())) {
return false;
}
if (!writer->WriteBytes(frame.data.data(), frame.data.size())) {
return false;
}
return true;
}
QuicPacketSequenceNumber QuicFramer::CalculateLargestObserved( QuicPacketSequenceNumber QuicFramer::CalculateLargestObserved(
const SequenceNumberSet& missing_packets, const SequenceNumberSet& missing_packets,
SequenceNumberSet::const_iterator largest_written) { SequenceNumberSet::const_iterator largest_written) {
......
...@@ -35,9 +35,6 @@ const size_t kQuicErrorDetailsLengthSize = 2; ...@@ -35,9 +35,6 @@ const size_t kQuicErrorDetailsLengthSize = 2;
// Maximum number of bytes reserved for stream id. // Maximum number of bytes reserved for stream id.
const size_t kQuicMaxStreamIdSize = 4; const size_t kQuicMaxStreamIdSize = 4;
// Number of bytes reserved for fin flag in stream frame.
// TODO(ianswett): Remove once QUIC_VERSION_6 and before are removed.
const size_t kQuicStreamFinSize = 1;
// Maximum number of bytes reserved for byte offset in stream frame. // Maximum number of bytes reserved for byte offset in stream frame.
const size_t kQuicMaxStreamOffsetSize = 8; const size_t kQuicMaxStreamOffsetSize = 8;
// Number of bytes reserved to store payload length in stream frame. // Number of bytes reserved to store payload length in stream frame.
...@@ -365,7 +362,6 @@ class NET_EXPORT_PRIVATE QuicFramer { ...@@ -365,7 +362,6 @@ class NET_EXPORT_PRIVATE QuicFramer {
QuicPacketSequenceNumber* sequence_number); QuicPacketSequenceNumber* sequence_number);
bool ProcessFrameData(); bool ProcessFrameData();
bool ProcessStreamFrame(uint8 frame_type, QuicStreamFrame* frame); bool ProcessStreamFrame(uint8 frame_type, QuicStreamFrame* frame);
bool ProcessV6StreamFrame(QuicStreamFrame* frame);
bool ProcessAckFrame(QuicAckFrame* frame); bool ProcessAckFrame(QuicAckFrame* frame);
bool ProcessReceivedInfo(ReceivedPacketInfo* received_info); bool ProcessReceivedInfo(ReceivedPacketInfo* received_info);
bool ProcessSentInfo(SentPacketInfo* sent_info); bool ProcessSentInfo(SentPacketInfo* sent_info);
...@@ -398,8 +394,6 @@ class NET_EXPORT_PRIVATE QuicFramer { ...@@ -398,8 +394,6 @@ class NET_EXPORT_PRIVATE QuicFramer {
bool AppendStreamFramePayload(const QuicStreamFrame& frame, bool AppendStreamFramePayload(const QuicStreamFrame& frame,
bool last_frame_in_packet, bool last_frame_in_packet,
QuicDataWriter* builder); QuicDataWriter* builder);
bool AppendV6StreamFramePayload(const QuicStreamFrame& frame,
QuicDataWriter* builder);
bool AppendAckFramePayload(const QuicAckFrame& frame, bool AppendAckFramePayload(const QuicAckFrame& frame,
QuicDataWriter* builder); QuicDataWriter* builder);
bool AppendQuicCongestionFeedbackFramePayload( bool AppendQuicCongestionFeedbackFramePayload(
......
This diff is collapsed.
...@@ -123,10 +123,12 @@ uint32 MakeQuicTag(char a, char b, char c, char d) { ...@@ -123,10 +123,12 @@ uint32 MakeQuicTag(char a, char b, char c, char d) {
QuicVersion QuicVersionMax() { return kSupportedQuicVersions[0]; } QuicVersion QuicVersionMax() { return kSupportedQuicVersions[0]; }
QuicVersion QuicVersionMin() {
return kSupportedQuicVersions[arraysize(kSupportedQuicVersions) - 1];
}
QuicTag QuicVersionToQuicTag(const QuicVersion version) { QuicTag QuicVersionToQuicTag(const QuicVersion version) {
switch (version) { switch (version) {
case QUIC_VERSION_6:
return MakeQuicTag('Q', '0', '0', '6');
case QUIC_VERSION_7: case QUIC_VERSION_7:
return MakeQuicTag('Q', '0', '0', '7'); return MakeQuicTag('Q', '0', '0', '7');
case QUIC_VERSION_8: case QUIC_VERSION_8:
...@@ -140,13 +142,10 @@ QuicTag QuicVersionToQuicTag(const QuicVersion version) { ...@@ -140,13 +142,10 @@ QuicTag QuicVersionToQuicTag(const QuicVersion version) {
} }
QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) { QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) {
const QuicTag quic_tag_v6 = MakeQuicTag('Q', '0', '0', '6');
const QuicTag quic_tag_v7 = MakeQuicTag('Q', '0', '0', '7'); const QuicTag quic_tag_v7 = MakeQuicTag('Q', '0', '0', '7');
const QuicTag quic_tag_v8 = MakeQuicTag('Q', '0', '0', '8'); const QuicTag quic_tag_v8 = MakeQuicTag('Q', '0', '0', '8');
if (version_tag == quic_tag_v6) { if (version_tag == quic_tag_v7) {
return QUIC_VERSION_6;
} else if (version_tag == quic_tag_v7) {
return QUIC_VERSION_7; return QUIC_VERSION_7;
} else if (version_tag == quic_tag_v8) { } else if (version_tag == quic_tag_v8) {
return QUIC_VERSION_8; return QUIC_VERSION_8;
...@@ -164,7 +163,6 @@ return #x ...@@ -164,7 +163,6 @@ return #x
string QuicVersionToString(const QuicVersion version) { string QuicVersionToString(const QuicVersion version) {
switch (version) { switch (version) {
RETURN_STRING_LITERAL(QUIC_VERSION_6);
RETURN_STRING_LITERAL(QUIC_VERSION_7); RETURN_STRING_LITERAL(QUIC_VERSION_7);
RETURN_STRING_LITERAL(QUIC_VERSION_8); RETURN_STRING_LITERAL(QUIC_VERSION_8);
default: default:
......
...@@ -187,7 +187,6 @@ enum QuicVersion { ...@@ -187,7 +187,6 @@ enum QuicVersion {
// Special case to indicate unknown/unsupported QUIC version. // Special case to indicate unknown/unsupported QUIC version.
QUIC_VERSION_UNSUPPORTED = 0, QUIC_VERSION_UNSUPPORTED = 0,
QUIC_VERSION_6 = 6,
QUIC_VERSION_7 = 7, QUIC_VERSION_7 = 7,
QUIC_VERSION_8 = 8, // Current version. QUIC_VERSION_8 = 8, // Current version.
}; };
...@@ -197,13 +196,16 @@ enum QuicVersion { ...@@ -197,13 +196,16 @@ enum QuicVersion {
// element, with subsequent elements in descending order (versions can be // element, with subsequent elements in descending order (versions can be
// skipped as necessary). // skipped as necessary).
static const QuicVersion kSupportedQuicVersions[] = static const QuicVersion kSupportedQuicVersions[] =
{QUIC_VERSION_8, QUIC_VERSION_7, QUIC_VERSION_6}; {QUIC_VERSION_8, QUIC_VERSION_7};
typedef std::vector<QuicVersion> QuicVersionVector; typedef std::vector<QuicVersion> QuicVersionVector;
// Upper limit on versions we support. // Upper limit on versions we support.
NET_EXPORT_PRIVATE QuicVersion QuicVersionMax(); NET_EXPORT_PRIVATE QuicVersion QuicVersionMax();
// Lower limit on versions we support.
NET_EXPORT_PRIVATE QuicVersion QuicVersionMin();
// QuicTag is written to and read from the wire, but we prefer to use // QuicTag is written to and read from the wire, but we prefer to use
// the more readable QuicVersion at other levels. // the more readable QuicVersion at other levels.
// Helper function which translates from a QuicVersion to a QuicTag. Returns 0 // Helper function which translates from a QuicVersion to a QuicTag. Returns 0
......
...@@ -423,10 +423,10 @@ size_t GetPacketLengthForOneStream(QuicVersion version, ...@@ -423,10 +423,10 @@ size_t GetPacketLengthForOneStream(QuicVersion version,
PACKET_6BYTE_SEQUENCE_NUMBER, is_in_fec_group); PACKET_6BYTE_SEQUENCE_NUMBER, is_in_fec_group);
} }
// Size in bytes of the stream frame fields for an arbitrary StreamID and
// offset and the last frame in a packet.
size_t GetMinStreamFrameSize(QuicVersion version) { size_t GetMinStreamFrameSize(QuicVersion version) {
return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize + return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize;
(version == QUIC_VERSION_6 ?
(kQuicStreamFinSize + kQuicStreamPayloadLengthSize) : 0);
} }
QuicPacketEntropyHash TestEntropyCalculator::EntropyHash( QuicPacketEntropyHash TestEntropyCalculator::EntropyHash(
......
...@@ -212,10 +212,10 @@ class EndToEndTest : public ::testing::TestWithParam<QuicVersion> { ...@@ -212,10 +212,10 @@ class EndToEndTest : public ::testing::TestWithParam<QuicVersion> {
QuicVersion version_; QuicVersion version_;
}; };
// Run all end to end tests with QUIC version 6 and 7. // Run all end to end tests with all supported versions.
INSTANTIATE_TEST_CASE_P(EndToEndTests, INSTANTIATE_TEST_CASE_P(EndToEndTests,
EndToEndTest, EndToEndTest,
::testing::Values(QUIC_VERSION_6, QUIC_VERSION_7)); ::testing::ValuesIn(kSupportedQuicVersions));
TEST_P(EndToEndTest, SimpleRequestResponse) { TEST_P(EndToEndTest, SimpleRequestResponse) {
// TODO(rtenneti): Delete this when NSS is supported. // TODO(rtenneti): Delete this when NSS is supported.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment