Remove IETF QUIC Application Close frame, replace with Connection Close
This CL removes the IETF QUIC Application Close frame and replaces it with the Connection Close frame. QuicConnectionCloseFrame::close_type indicates whether the frame is a Google QUIC Connection Close, IETF QUIC Connection Close/Transport or IETF QUIC Connection Close/Application.
The QuicFramer::...ApplicationCloseFrame... methods are removed.
gfe-relnote: N/A affects only IETF-QUIC/V99 code. Application Close was IETF-QUIC only.
PiperOrigin-RevId: 242881293
Change-Id: I783cbf4e5f27d2e5abe3e8b518006de03c815e1a
diff --git a/quic/core/chlo_extractor.cc b/quic/core/chlo_extractor.cc
index 355ecd7..b2d11e0 100644
--- a/quic/core/chlo_extractor.cc
+++ b/quic/core/chlo_extractor.cc
@@ -52,7 +52,7 @@
bool OnPingFrame(const QuicPingFrame& frame) override;
bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override;
bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override;
- bool OnApplicationCloseFrame(const QuicApplicationCloseFrame& frame) override;
+ bool OnApplicationCloseFrame(const QuicConnectionCloseFrame& frame) override;
bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override;
bool OnRetireConnectionIdFrame(
const QuicRetireConnectionIdFrame& frame) override;
@@ -212,7 +212,7 @@
}
bool ChloFramerVisitor::OnApplicationCloseFrame(
- const QuicApplicationCloseFrame& frame) {
+ const QuicConnectionCloseFrame& frame) {
return true;
}
diff --git a/quic/core/frames/quic_application_close_frame.cc b/quic/core/frames/quic_application_close_frame.cc
deleted file mode 100644
index 2535655..0000000
--- a/quic/core/frames/quic_application_close_frame.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "net/third_party/quiche/src/quic/core/frames/quic_application_close_frame.h"
-
-namespace quic {
-
-QuicApplicationCloseFrame::QuicApplicationCloseFrame()
- : error_code(QUIC_NO_ERROR) {}
-
-std::ostream& operator<<(std::ostream& os,
- const QuicApplicationCloseFrame& frame) {
- os << "{ error_code: " << frame.error_code << ", error_details: '"
- << frame.error_details << "' }\n";
- return os;
-}
-
-} // namespace quic
diff --git a/quic/core/frames/quic_application_close_frame.h b/quic/core/frames/quic_application_close_frame.h
deleted file mode 100644
index 3bb6b87..0000000
--- a/quic/core/frames/quic_application_close_frame.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef QUICHE_QUIC_CORE_FRAMES_QUIC_APPLICATION_CLOSE_FRAME_H_
-#define QUICHE_QUIC_CORE_FRAMES_QUIC_APPLICATION_CLOSE_FRAME_H_
-
-#include <ostream>
-#include <string>
-
-#include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
-#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
-
-namespace quic {
-
-struct QUIC_EXPORT_PRIVATE QuicApplicationCloseFrame {
- QuicApplicationCloseFrame();
-
- friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(
- std::ostream& os,
- const QuicApplicationCloseFrame& frame);
-
- QuicErrorCode error_code;
- std::string error_details;
-};
-
-} // namespace quic
-
-#endif // QUICHE_QUIC_CORE_FRAMES_QUIC_APPLICATION_CLOSE_FRAME_H_
diff --git a/quic/core/frames/quic_connection_close_frame.cc b/quic/core/frames/quic_connection_close_frame.cc
index c4adf56..baffa9d 100644
--- a/quic/core/frames/quic_connection_close_frame.cc
+++ b/quic/core/frames/quic_connection_close_frame.cc
@@ -7,20 +7,23 @@
namespace quic {
QuicConnectionCloseFrame::QuicConnectionCloseFrame()
- : close_type(UNINITIALIZED),
+ // Default close type ensures that existing, pre-V99 code works as expected.
+ : close_type(GOOGLE_QUIC_CONNECTION_CLOSE),
quic_error_code(QUIC_NO_ERROR),
extracted_error_code(QUIC_IETF_GQUIC_ERROR_MISSING),
transport_close_frame_type(0) {}
QuicConnectionCloseFrame::QuicConnectionCloseFrame(QuicErrorCode error_code)
- : close_type(UNINITIALIZED),
+ // Default close type ensures that existing, pre-V99 code works as expected.
+ : close_type(GOOGLE_QUIC_CONNECTION_CLOSE),
quic_error_code(error_code),
extracted_error_code(QUIC_IETF_GQUIC_ERROR_MISSING),
transport_close_frame_type(0) {}
QuicConnectionCloseFrame::QuicConnectionCloseFrame(QuicErrorCode error_code,
std::string error_details)
- : close_type(UNINITIALIZED),
+ // Default close type ensures that existing, pre-V99 code works as expected.
+ : close_type(GOOGLE_QUIC_CONNECTION_CLOSE),
quic_error_code(error_code),
extracted_error_code(QUIC_IETF_GQUIC_ERROR_MISSING),
error_details(std::move(error_details)),
@@ -31,7 +34,8 @@
QuicErrorCode extracted_error_code,
std::string error_details,
uint64_t transport_close_frame_type)
- : close_type(UNINITIALIZED),
+ // Default close type ensures that existing, pre-V99 code works as expected.
+ : close_type(GOOGLE_QUIC_CONNECTION_CLOSE),
transport_error_code(transport_error_code),
extracted_error_code(extracted_error_code),
error_details(std::move(error_details)),
@@ -59,9 +63,6 @@
std::ostream& operator<<(std::ostream& os, const QuicConnectionCloseType type) {
switch (type) {
- case UNINITIALIZED:
- os << "UNINITIALIZED";
- break;
case GOOGLE_QUIC_CONNECTION_CLOSE:
os << "GOOGLE_QUIC_CONNECTION_CLOSE";
break;
diff --git a/quic/core/frames/quic_connection_close_frame.h b/quic/core/frames/quic_connection_close_frame.h
index 4d0cff7..7997fbc 100644
--- a/quic/core/frames/quic_connection_close_frame.h
+++ b/quic/core/frames/quic_connection_close_frame.h
@@ -14,15 +14,11 @@
namespace quic {
-// There are three different forms of CONNECTION_CLOSE. UNINITIALIZED is
-// included explicitly for the QuicConnectionCloseFrame so that when the object
-// is constructed, a valid enumeration, indicating that the type is not known,
-// can be set.
+// There are three different forms of CONNECTION_CLOSE.
typedef enum QuicConnectionCloseType {
- UNINITIALIZED = 0,
- GOOGLE_QUIC_CONNECTION_CLOSE = 1,
- IETF_QUIC_TRANSPORT_CONNECTION_CLOSE = 2,
- IETF_QUIC_APPLICATION_CONNECTION_CLOSE = 3
+ GOOGLE_QUIC_CONNECTION_CLOSE = 0,
+ IETF_QUIC_TRANSPORT_CONNECTION_CLOSE = 1,
+ IETF_QUIC_APPLICATION_CONNECTION_CLOSE = 2
} QuicConnectionCloseType;
QUIC_EXPORT_PRIVATE std::ostream& operator<<(
std::ostream& os,
@@ -42,7 +38,7 @@
const QuicConnectionCloseFrame& c);
// Indicates whether the received CONNECTION_CLOSE frame is a Google QUIC
- // CONNECTION_CLOSE, IETF QUIC CONNECTION_CLOSE
+ // CONNECTION_CLOSE, IETF QUIC CONNECTION_CLOSE.
QuicConnectionCloseType close_type;
// This is the error field in the frame.
@@ -62,9 +58,10 @@
// information as to the source of the error.
QuicErrorCode extracted_error_code;
- // String with additional error details. In some circumstances, we will add a
- // "QuicErrorCode: QUIC_...(123)" string indicating a more specific internal
- // error code.
+ // String with additional error details. "QuicErrorCode: 123" will be appended
+ // to the error details when sending IETF QUIC Connection Close and
+ // Application Close frames and parsed into extracted_error_code upon receipt,
+ // when present.
std::string error_details;
// The frame type present in the IETF transport connection close frame.
diff --git a/quic/core/frames/quic_frame.cc b/quic/core/frames/quic_frame.cc
index fbe54cd..95fee41 100644
--- a/quic/core/frames/quic_frame.cc
+++ b/quic/core/frames/quic_frame.cc
@@ -45,9 +45,6 @@
QuicFrame::QuicFrame(QuicBlockedFrame* frame)
: type(BLOCKED_FRAME), blocked_frame(frame) {}
-QuicFrame::QuicFrame(QuicApplicationCloseFrame* frame)
- : type(APPLICATION_CLOSE_FRAME), application_close_frame(frame) {}
-
QuicFrame::QuicFrame(QuicNewConnectionIdFrame* frame)
: type(NEW_CONNECTION_ID_FRAME), new_connection_id_frame(frame) {}
@@ -116,9 +113,6 @@
case STOP_SENDING_FRAME:
delete frame->stop_sending_frame;
break;
- case APPLICATION_CLOSE_FRAME:
- delete frame->application_close_frame;
- break;
case NEW_CONNECTION_ID_FRAME:
delete frame->new_connection_id_frame;
break;
@@ -307,9 +301,6 @@
os << "type { MTU_DISCOVERY_FRAME } ";
break;
}
- case APPLICATION_CLOSE_FRAME:
- os << "type { APPLICATION_CLOSE } " << *(frame.application_close_frame);
- break;
case NEW_CONNECTION_ID_FRAME:
os << "type { NEW_CONNECTION_ID } " << *(frame.new_connection_id_frame);
break;
diff --git a/quic/core/frames/quic_frame.h b/quic/core/frames/quic_frame.h
index d753862..c452bf4 100644
--- a/quic/core/frames/quic_frame.h
+++ b/quic/core/frames/quic_frame.h
@@ -9,7 +9,6 @@
#include <vector>
#include "net/third_party/quiche/src/quic/core/frames/quic_ack_frame.h"
-#include "net/third_party/quiche/src/quic/core/frames/quic_application_close_frame.h"
#include "net/third_party/quiche/src/quic/core/frames/quic_blocked_frame.h"
#include "net/third_party/quiche/src/quic/core/frames/quic_connection_close_frame.h"
#include "net/third_party/quiche/src/quic/core/frames/quic_crypto_frame.h"
@@ -53,7 +52,6 @@
explicit QuicFrame(QuicGoAwayFrame* frame);
explicit QuicFrame(QuicWindowUpdateFrame* frame);
explicit QuicFrame(QuicBlockedFrame* frame);
- explicit QuicFrame(QuicApplicationCloseFrame* frame);
explicit QuicFrame(QuicNewConnectionIdFrame* frame);
explicit QuicFrame(QuicRetireConnectionIdFrame* frame);
explicit QuicFrame(QuicNewTokenFrame* frame);
@@ -94,7 +92,6 @@
QuicGoAwayFrame* goaway_frame;
QuicWindowUpdateFrame* window_update_frame;
QuicBlockedFrame* blocked_frame;
- QuicApplicationCloseFrame* application_close_frame;
QuicNewConnectionIdFrame* new_connection_id_frame;
QuicRetireConnectionIdFrame* retire_connection_id_frame;
QuicPathResponseFrame* path_response_frame;
diff --git a/quic/core/frames/quic_frames_test.cc b/quic/core/frames/quic_frames_test.cc
index 9c67af4..c432657 100644
--- a/quic/core/frames/quic_frames_test.cc
+++ b/quic/core/frames/quic_frames_test.cc
@@ -137,8 +137,12 @@
frame.error_details = "No recent network activity.";
std::ostringstream stream;
stream << frame;
+ // Note that "extracted_error_code: 122" is QUIC_IETF_GQUIC_ERROR_MISSING,
+ // indicating that, in fact, no extended error code was available from the
+ // underlying frame.
EXPECT_EQ(
- "{ Close type: UNINITIALIZED, error_code: 25, extracted_error_code: 122, "
+ "{ Close type: GOOGLE_QUIC_CONNECTION_CLOSE, error_code: 25, "
+ "extracted_error_code: 122, "
"error_details: 'No recent "
"network activity.', "
"frame_type: 0"
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index d90413a..311651c 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -1253,7 +1253,7 @@
}
bool QuicConnection::OnApplicationCloseFrame(
- const QuicApplicationCloseFrame& frame) {
+ const QuicConnectionCloseFrame& frame) {
// TODO(fkastenholz): Need to figure out what the right thing is to do with
// this when we get one. Most likely, the correct action is to mimic the
// OnConnectionCloseFrame actions, with possibly an indication to the
@@ -3020,6 +3020,9 @@
}
QuicConnectionCloseFrame* frame =
new QuicConnectionCloseFrame(error, details);
+ if (transport_version() == QUIC_VERSION_99) {
+ frame->close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
+ }
packet_generator_.AddControlFrame(QuicFrame(frame));
packet_generator_.FlushAllQueuedFrames();
}
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 7f8b8c8..602361e 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -253,9 +253,9 @@
// Called when a ConnectionCloseFrame has been parsed.
virtual void OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) {}
- // Called when an ApplicationCloseFrame has been parsed.
- virtual void OnApplicationCloseFrame(const QuicApplicationCloseFrame& frame) {
- }
+ // Called when an IETF QUIC CONNECTION_CLOSE/Application Frame has been
+ // parsed.
+ virtual void OnApplicationCloseFrame(const QuicConnectionCloseFrame& frame) {}
// Called when a WindowUpdate has been parsed.
virtual void OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame,
@@ -498,7 +498,7 @@
bool OnPingFrame(const QuicPingFrame& frame) override;
bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override;
bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override;
- bool OnApplicationCloseFrame(const QuicApplicationCloseFrame& frame) override;
+ bool OnApplicationCloseFrame(const QuicConnectionCloseFrame& frame) override;
bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override;
bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override;
bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override;
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 78f31e1..7345246 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -1309,6 +1309,9 @@
}
QuicConnectionCloseFrame qccf(QUIC_PEER_GOING_AWAY);
+ if (peer_framer_.transport_version() == QUIC_VERSION_99) {
+ qccf.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
+ }
QuicFrames frames;
frames.push_back(QuicFrame(&qccf));
@@ -7015,6 +7018,9 @@
header.version_flag = false;
QuicConnectionCloseFrame qccf(QUIC_PEER_GOING_AWAY);
+ if (peer_framer_.transport_version() == QUIC_VERSION_99) {
+ qccf.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
+ }
QuicFrames frames;
frames.push_back(QuicFrame(frame1_));
diff --git a/quic/core/quic_dispatcher.cc b/quic/core/quic_dispatcher.cc
index 8024394..c9f5fbf 100644
--- a/quic/core/quic_dispatcher.cc
+++ b/quic/core/quic_dispatcher.cc
@@ -138,6 +138,11 @@
bool ietf_quic) {
QuicConnectionCloseFrame* frame =
new QuicConnectionCloseFrame(error_code, error_details);
+ // TODO(fkastenholz): The framer version may be incorrect in some cases.
+ if (framer_->transport_version() == QUIC_VERSION_99) {
+ frame->close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
+ }
+
if (!creator_.AddSavedFrame(QuicFrame(frame), NOT_RETRANSMISSION)) {
QUIC_BUG << "Unable to add frame to an empty packet";
delete frame;
@@ -916,7 +921,7 @@
}
bool QuicDispatcher::OnApplicationCloseFrame(
- const QuicApplicationCloseFrame& /*frame*/) {
+ const QuicConnectionCloseFrame& /*frame*/) {
DCHECK(false);
return false;
}
diff --git a/quic/core/quic_dispatcher.h b/quic/core/quic_dispatcher.h
index f00880b..3329405 100644
--- a/quic/core/quic_dispatcher.h
+++ b/quic/core/quic_dispatcher.h
@@ -165,7 +165,7 @@
bool OnPingFrame(const QuicPingFrame& frame) override;
bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override;
bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override;
- bool OnApplicationCloseFrame(const QuicApplicationCloseFrame& frame) override;
+ bool OnApplicationCloseFrame(const QuicConnectionCloseFrame& frame) override;
bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override;
bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override;
bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override;
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc
index c24a23c..f99b60f 100644
--- a/quic/core/quic_framer.cc
+++ b/quic/core/quic_framer.cc
@@ -588,28 +588,30 @@
QuicTransportVersion version,
const QuicConnectionCloseFrame& frame) {
if (version == QUIC_VERSION_99) {
+ // TODO(fkastenholz): For complete support of IETF QUIC CONNECTION_CLOSE,
+ // check if the frame is a Transport close and if the frame's
+ // extracted_error_code is not QUIC_IETF_GQUIC_ERROR_MISSING. If so,
+ // extend the error string to include " QuicErrorCode: #"
+ if (frame.close_type == IETF_QUIC_APPLICATION_CONNECTION_CLOSE) {
+ // Application close variant does not include the transport close frame
+ // type field.
+ return QuicDataWriter::GetVarInt62Len(
+ TruncatedErrorStringSize(frame.error_details)) +
+ kQuicFrameTypeSize + kQuicIetfQuicErrorCodeSize;
+ }
+ QUIC_BUG_IF(frame.close_type != IETF_QUIC_TRANSPORT_CONNECTION_CLOSE)
+ << "IETF QUIC Connection close and QuicConnectionCloseFrame type is "
+ "not IETF ConnectionClose";
return QuicDataWriter::GetVarInt62Len(
TruncatedErrorStringSize(frame.error_details)) +
QuicDataWriter::GetVarInt62Len(frame.transport_close_frame_type) +
kQuicFrameTypeSize + kQuicIetfQuicErrorCodeSize;
}
+ // Not version 99/IETF QUIC, return Google QUIC CONNECTION CLOSE frame size.
return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize;
}
// static
-size_t QuicFramer::GetMinApplicationCloseFrameSize(
- QuicTransportVersion version,
- const QuicApplicationCloseFrame& frame) {
- if (version != QUIC_VERSION_99) {
- QUIC_BUG << "In version " << version
- << " - not 99 - and tried to serialize ApplicationClose.";
- }
- return QuicDataWriter::GetVarInt62Len(
- TruncatedErrorStringSize(frame.error_details)) +
- kQuicFrameTypeSize + kQuicIetfQuicErrorCodeSize;
-}
-
-// static
size_t QuicFramer::GetMinGoAwayFrameSize() {
return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
kQuicMaxStreamIdSize;
@@ -721,11 +723,6 @@
return GetWindowUpdateFrameSize(version, *frame.window_update_frame);
case BLOCKED_FRAME:
return GetBlockedFrameSize(version, *frame.blocked_frame);
- case APPLICATION_CLOSE_FRAME:
- return GetMinApplicationCloseFrameSize(version,
- *frame.application_close_frame) +
- TruncatedErrorStringSize(
- frame.application_close_frame->error_details);
case NEW_CONNECTION_ID_FRAME:
return GetNewConnectionIdFrameSize(*frame.new_connection_id_frame);
case RETIRE_CONNECTION_ID_FRAME:
@@ -1027,10 +1024,6 @@
return 0;
}
break;
- case APPLICATION_CLOSE_FRAME:
- set_detailed_error(
- "Attempt to append APPLICATION_CLOSE frame and not in version 99.");
- return RaiseError(QUIC_INTERNAL_ERROR);
case NEW_CONNECTION_ID_FRAME:
set_detailed_error(
"Attempt to append NEW_CONNECTION_ID frame and not in version 99.");
@@ -1144,9 +1137,10 @@
}
break;
case CONNECTION_CLOSE_FRAME:
- if (!AppendConnectionCloseFrame(*frame.connection_close_frame,
- writer)) {
- QUIC_BUG << "AppendConnectionCloseFrame failed: " << detailed_error();
+ if (!AppendIetfConnectionCloseFrame(*frame.connection_close_frame,
+ writer)) {
+ QUIC_BUG << "AppendIetfConnectionCloseFrame failed: "
+ << detailed_error();
return 0;
}
break;
@@ -1175,14 +1169,6 @@
return 0;
}
break;
- case APPLICATION_CLOSE_FRAME:
- if (!AppendApplicationCloseFrame(*frame.application_close_frame,
- writer)) {
- QUIC_BUG << "AppendApplicationCloseFrame failed: "
- << detailed_error();
- return 0;
- }
- break;
case MAX_STREAM_ID_FRAME:
if (!AppendMaxStreamsFrame(frame.max_stream_id_frame, writer)) {
QUIC_BUG << "AppendMaxStreamsFrame failed" << detailed_error();
@@ -2906,11 +2892,7 @@
case IETF_CONNECTION_CLOSE: {
QuicConnectionCloseFrame frame;
if (!ProcessIetfConnectionCloseFrame(
- reader,
- ((frame_type == IETF_CONNECTION_CLOSE)
- ? IETF_QUIC_TRANSPORT_CONNECTION_CLOSE
- : IETF_QUIC_APPLICATION_CONNECTION_CLOSE),
- &frame)) {
+ reader, IETF_QUIC_TRANSPORT_CONNECTION_CLOSE, &frame)) {
return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
}
if (!visitor_->OnConnectionCloseFrame(frame)) {
@@ -2921,8 +2903,9 @@
break;
}
case IETF_APPLICATION_CLOSE: {
- QuicApplicationCloseFrame frame;
- if (!ProcessApplicationCloseFrame(reader, &frame)) {
+ QuicConnectionCloseFrame frame;
+ if (!ProcessIetfConnectionCloseFrame(
+ reader, IETF_QUIC_APPLICATION_CONNECTION_CLOSE, &frame)) {
return RaiseError(QUIC_INVALID_APPLICATION_CLOSE_DATA);
}
if (!visitor_->OnApplicationCloseFrame(frame)) {
@@ -4238,11 +4221,6 @@
case MTU_DISCOVERY_FRAME:
type_byte = static_cast<uint8_t>(PING_FRAME);
break;
-
- case APPLICATION_CLOSE_FRAME:
- set_detailed_error(
- "Attempt to append APPLICATION_CLOSE frame and not in version 99.");
- return RaiseError(QUIC_INTERNAL_ERROR);
case NEW_CONNECTION_ID_FRAME:
set_detailed_error(
"Attempt to append NEW_CONNECTION_ID frame and not in version 99.");
@@ -4299,7 +4277,17 @@
type_byte = IETF_RST_STREAM;
break;
case CONNECTION_CLOSE_FRAME:
- type_byte = IETF_CONNECTION_CLOSE;
+ switch (frame.connection_close_frame->close_type) {
+ case IETF_QUIC_APPLICATION_CONNECTION_CLOSE:
+ type_byte = IETF_APPLICATION_CLOSE;
+ break;
+ case IETF_QUIC_TRANSPORT_CONNECTION_CLOSE:
+ type_byte = IETF_CONNECTION_CLOSE;
+ break;
+ default:
+ set_detailed_error("Invalid QuicConnectionCloseFrame type.");
+ return RaiseError(QUIC_INTERNAL_ERROR);
+ }
break;
case GOAWAY_FRAME:
set_detailed_error(
@@ -4342,9 +4330,6 @@
// The path MTU discovery frame is encoded as a PING frame on the wire.
type_byte = IETF_PING;
break;
- case APPLICATION_CLOSE_FRAME:
- type_byte = IETF_APPLICATION_CLOSE;
- break;
case NEW_CONNECTION_ID_FRAME:
type_byte = IETF_NEW_CONNECTION_ID;
break;
@@ -5187,16 +5172,31 @@
bool QuicFramer::AppendIetfConnectionCloseFrame(
const QuicConnectionCloseFrame& frame,
QuicDataWriter* writer) {
+ if (frame.close_type != IETF_QUIC_TRANSPORT_CONNECTION_CLOSE &&
+ frame.close_type != IETF_QUIC_APPLICATION_CONNECTION_CLOSE) {
+ QUIC_BUG << "Invalid close_type for writing IETF CONNECTION CLOSE.";
+ set_detailed_error("Invalid close_type for writing IETF CONNECTION CLOSE.");
+ return false;
+ }
+
if (!writer->WriteUInt16(frame.application_error_code)) {
set_detailed_error("Can not write connection close frame error code");
return false;
}
- if (!writer->WriteVarInt62(frame.transport_close_frame_type)) {
- set_detailed_error("Writing frame type failed.");
- return false;
+ if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
+ // Write the frame-type of the frame causing the error only
+ // if it's a CONNECTION_CLOSE/Transport.
+ if (!writer->WriteVarInt62(frame.transport_close_frame_type)) {
+ set_detailed_error("Writing frame type failed.");
+ return false;
+ }
}
+ // TODO(fkastenholz): For full IETF CONNECTION CLOSE support,
+ // if this is a Transport CONNECTION_CLOSE and the extended
+ // error is not QUIC_IETF_GQUIC_ERROR_MISSING then append the extended
+ // "QuicErrorCode: #" string to the phrase.
if (!writer->WriteStringPieceVarInt62(
TruncateErrorString(frame.error_details))) {
set_detailed_error("Can not write connection close phrase");
@@ -5205,22 +5205,6 @@
return true;
}
-bool QuicFramer::AppendApplicationCloseFrame(
- const QuicApplicationCloseFrame& frame,
- QuicDataWriter* writer) {
- if (!writer->WriteUInt16(static_cast<const uint16_t>(frame.error_code))) {
- set_detailed_error("Can not write application close frame error code");
- return false;
- }
-
- if (!writer->WriteStringPieceVarInt62(
- TruncateErrorString(frame.error_details))) {
- set_detailed_error("Can not write application close phrase");
- return false;
- }
- return true;
-}
-
bool QuicFramer::ProcessIetfConnectionCloseFrame(
QuicDataReader* reader,
QuicConnectionCloseType type,
@@ -5233,9 +5217,13 @@
}
frame->transport_error_code = static_cast<QuicIetfTransportErrorCodes>(code);
- if (!reader->ReadVarInt62(&frame->transport_close_frame_type)) {
- set_detailed_error("Unable to read connection close frame type.");
- return false;
+ if (type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
+ // The frame-type of the frame causing the error is present only
+ // if it's a CONNECTION_CLOSE/Transport.
+ if (!reader->ReadVarInt62(&frame->transport_close_frame_type)) {
+ set_detailed_error("Unable to read connection close frame type.");
+ return false;
+ }
}
uint64_t phrase_length;
@@ -5248,31 +5236,9 @@
set_detailed_error("Unable to read connection close error details.");
return false;
}
- frame->error_details = std::string(phrase);
-
- return true;
-}
-
-bool QuicFramer::ProcessApplicationCloseFrame(
- QuicDataReader* reader,
- QuicApplicationCloseFrame* frame) {
- uint16_t code;
- if (!reader->ReadUInt16(&code)) {
- set_detailed_error("Unable to read application close error code.");
- return false;
- }
- frame->error_code = static_cast<QuicErrorCode>(code);
-
- uint64_t phrase_length;
- if (!reader->ReadVarInt62(&phrase_length)) {
- set_detailed_error("Unable to read application close error details.");
- return false;
- }
- QuicStringPiece phrase;
- if (!reader->ReadStringPiece(&phrase, static_cast<size_t>(phrase_length))) {
- set_detailed_error("Unable to read application close error details.");
- return false;
- }
+ // TODO(fkastenholz): when full support is done, add code here
+ // to extract the extended error code from the reason phrase
+ // and set it into frame->extracted_error_code.
frame->error_details = std::string(phrase);
return true;
diff --git a/quic/core/quic_framer.h b/quic/core/quic_framer.h
index 84773b4..fc189b2 100644
--- a/quic/core/quic_framer.h
+++ b/quic/core/quic_framer.h
@@ -158,9 +158,12 @@
virtual bool OnConnectionCloseFrame(
const QuicConnectionCloseFrame& frame) = 0;
- // Called when an IETF ApplicationCloseFrame has been parsed.
+ // Called when an IETF QUIC CONNECTION_CLOSE/Application Frame has been
+ // parsed. TEMPORARILY pass the frame as a QuicConnectionCloseFrame.
+ // TODO(fkastenholz): remove when V99 fully utilizes the IETF
+ // CONNECTION_CLOSE close frame.
virtual bool OnApplicationCloseFrame(
- const QuicApplicationCloseFrame& frame) = 0;
+ const QuicConnectionCloseFrame& frame) = 0;
// Called when a StopSendingFrame has been parsed.
virtual bool OnStopSendingFrame(const QuicStopSendingFrame& frame) = 0;
@@ -304,9 +307,6 @@
static size_t GetMinConnectionCloseFrameSize(
QuicTransportVersion version,
const QuicConnectionCloseFrame& frame);
- static size_t GetMinApplicationCloseFrameSize(
- QuicTransportVersion version,
- const QuicApplicationCloseFrame& frame);
// Size in bytes of all GoAway frame fields without the reason phrase.
static size_t GetMinGoAwayFrameSize();
// Size in bytes of all WindowUpdate frame fields.
@@ -776,8 +776,6 @@
bool ProcessIetfConnectionCloseFrame(QuicDataReader* reader,
QuicConnectionCloseType type,
QuicConnectionCloseFrame* frame);
- bool ProcessApplicationCloseFrame(QuicDataReader* reader,
- QuicApplicationCloseFrame* frame);
bool ProcessPathChallengeFrame(QuicDataReader* reader,
QuicPathChallengeFrame* frame);
bool ProcessPathResponseFrame(QuicDataReader* reader,
@@ -794,8 +792,6 @@
QuicDataWriter* writer);
bool AppendIetfConnectionCloseFrame(const QuicConnectionCloseFrame& frame,
QuicDataWriter* writer);
- bool AppendApplicationCloseFrame(const QuicApplicationCloseFrame& frame,
- QuicDataWriter* writer);
bool AppendPathChallengeFrame(const QuicPathChallengeFrame& frame,
QuicDataWriter* writer);
bool AppendPathResponseFrame(const QuicPathResponseFrame& frame,
diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc
index 927b100..997f1f1 100644
--- a/quic/core/quic_framer_test.cc
+++ b/quic/core/quic_framer_test.cc
@@ -315,9 +315,12 @@
return true;
}
- bool OnApplicationCloseFrame(
- const QuicApplicationCloseFrame& frame) override {
- application_close_frame_ = frame;
+ // TODO(fkastenholz): Remove when IETF QUIC is completely converted to
+ // doing Connection Close.
+ bool OnApplicationCloseFrame(const QuicConnectionCloseFrame& frame) override {
+ // OnApplicationCloseFrame receives a QuicConnectionCloseFrame as part of
+ // migration to IETF QUIC's new model.
+ connection_close_frame_ = frame;
return true;
}
@@ -410,7 +413,6 @@
std::vector<std::unique_ptr<QuicEncryptedPacket>> coalesced_packets_;
QuicRstStreamFrame rst_stream_frame_;
QuicConnectionCloseFrame connection_close_frame_;
- QuicApplicationCloseFrame application_close_frame_;
QuicStopSendingFrame stop_sending_frame_;
QuicGoAwayFrame goaway_frame_;
QuicPathChallengeFrame path_challenge_frame_;
@@ -4421,13 +4423,13 @@
// packet number
{"",
{0x12, 0x34, 0x56, 0x78}},
- // frame type (IETF_APPLICATION_CLOSE frame)
+ // frame type (IETF_CONNECTION_CLOSE/Application frame)
{"",
{0x1d}},
// error code
- {"Unable to read application close error code.",
+ {"Unable to read connection close error code.",
{0x00, 0x11}},
- {"Unable to read application close error details.",
+ {"Unable to read connection close error details.",
{
// error details length
kVarInt62OneByte + 0x0d,
@@ -4452,8 +4454,11 @@
EXPECT_EQ(0u, visitor_.stream_frames_.size());
- EXPECT_EQ(0x11, visitor_.application_close_frame_.error_code);
- EXPECT_EQ("because I can", visitor_.application_close_frame_.error_details);
+ EXPECT_EQ(IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
+ visitor_.connection_close_frame_.close_type);
+ EXPECT_EQ(122u, visitor_.connection_close_frame_.extracted_error_code);
+ EXPECT_EQ(0x11, visitor_.connection_close_frame_.quic_error_code);
+ EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
ASSERT_EQ(0u, visitor_.ack_frames_.size());
@@ -7283,6 +7288,7 @@
close_frame.transport_error_code =
static_cast<QuicIetfTransportErrorCodes>(0x11);
close_frame.transport_close_frame_type = 0x05;
+ close_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
} else {
close_frame.quic_error_code = static_cast<QuicErrorCode>(0x05060708);
}
@@ -7409,6 +7415,7 @@
if (framer_.transport_version() == QUIC_VERSION_99) {
close_frame.transport_error_code = PROTOCOL_VIOLATION; // value is 0x0a
EXPECT_EQ(0u, close_frame.transport_close_frame_type);
+ close_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
} else {
close_frame.quic_error_code = static_cast<QuicErrorCode>(0x05060708);
}
@@ -7646,9 +7653,10 @@
header.version_flag = false;
header.packet_number = kPacketNumber;
- QuicApplicationCloseFrame app_close_frame;
- app_close_frame.error_code = static_cast<QuicErrorCode>(0x11);
+ QuicConnectionCloseFrame app_close_frame;
+ app_close_frame.quic_error_code = static_cast<QuicErrorCode>(0x11);
app_close_frame.error_details = "because I can";
+ app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QuicFrames frames = {QuicFrame(&app_close_frame)};
@@ -7695,9 +7703,10 @@
header.version_flag = false;
header.packet_number = kPacketNumber;
- QuicApplicationCloseFrame app_close_frame;
- app_close_frame.error_code = static_cast<QuicErrorCode>(0x11);
+ QuicConnectionCloseFrame app_close_frame;
+ app_close_frame.quic_error_code = static_cast<QuicErrorCode>(0x11);
app_close_frame.error_details = std::string(2048, 'A');
+ app_close_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
QuicFrames frames = {QuicFrame(&app_close_frame)};
@@ -11623,6 +11632,10 @@
std::string error_detail(2048, 'e');
QuicConnectionCloseFrame connection_close(QUIC_NETWORK_IDLE_TIMEOUT,
error_detail);
+ if (framer_.transport_version() == QUIC_VERSION_99) {
+ connection_close.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
+ }
+
EXPECT_EQ(QuicFramer::GetMinConnectionCloseFrameSize(
framer_.transport_version(), connection_close) +
256,
@@ -11649,11 +11662,6 @@
if (framer_.transport_version() != QUIC_VERSION_99) {
return;
}
- QuicApplicationCloseFrame application_close;
- EXPECT_EQ(QuicFramer::GetMinApplicationCloseFrameSize(
- framer_.transport_version(), application_close),
- QuicFramer::GetRetransmittableControlFrameSize(
- framer_.transport_version(), QuicFrame(&application_close)));
QuicNewConnectionIdFrame new_connection_id(5, TestConnectionId(), 1, 101111);
EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
diff --git a/quic/core/quic_ietf_framer_test.cc b/quic/core/quic_ietf_framer_test.cc
index 9c30e9c..987bce9 100644
--- a/quic/core/quic_ietf_framer_test.cc
+++ b/quic/core/quic_ietf_framer_test.cc
@@ -155,8 +155,9 @@
return true;
}
- bool OnApplicationCloseFrame(
- const QuicApplicationCloseFrame& frame) override {
+ // TODO(fkastenholz): remove when finishing conversion to new IETF QUIC
+ // model.
+ bool OnApplicationCloseFrame(const QuicConnectionCloseFrame& frame) override {
return true;
}
@@ -801,6 +802,7 @@
sent_frame.quic_error_code = static_cast<QuicErrorCode>(0);
sent_frame.error_details = test_string;
sent_frame.transport_close_frame_type = 123;
+ sent_frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
// write the frame to the packet buffer.
EXPECT_TRUE(QuicFramerPeer::AppendIetfConnectionCloseFrame(
&framer_, sent_frame, &writer));
@@ -818,8 +820,11 @@
&framer_, &reader, IETF_QUIC_TRANSPORT_CONNECTION_CLOSE, &sink_frame));
// Now check that received == sent
+ EXPECT_EQ(sent_frame.quic_error_code, sink_frame.quic_error_code);
EXPECT_EQ(sink_frame.quic_error_code, static_cast<QuicErrorCode>(0));
EXPECT_EQ(sink_frame.error_details, test_string);
+ EXPECT_EQ(sink_frame.close_type, sent_frame.close_type);
+ EXPECT_EQ(sent_frame.close_type, IETF_QUIC_TRANSPORT_CONNECTION_CLOSE);
}
TEST_F(QuicIetfFramerTest, ApplicationCloseEmptyString) {
@@ -832,12 +837,13 @@
// empty string,
std::string test_string = "Ich Bin Ein Jelly Donut?";
- QuicApplicationCloseFrame sent_frame;
- sent_frame.error_code = static_cast<QuicErrorCode>(0);
+ QuicConnectionCloseFrame sent_frame;
+ sent_frame.quic_error_code = static_cast<QuicErrorCode>(0);
sent_frame.error_details = test_string;
+ sent_frame.close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
// write the frame to the packet buffer.
- EXPECT_TRUE(QuicFramerPeer::AppendApplicationCloseFrame(&framer_, sent_frame,
- &writer));
+ EXPECT_TRUE(QuicFramerPeer::AppendIetfConnectionCloseFrame(
+ &framer_, sent_frame, &writer));
// better have something in the packet buffer.
EXPECT_NE(0u, writer.length());
@@ -846,14 +852,17 @@
QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);
// a QuicConnectionCloseFrame to hold the results.
- QuicApplicationCloseFrame sink_frame;
+ QuicConnectionCloseFrame sink_frame;
- EXPECT_TRUE(QuicFramerPeer::ProcessApplicationCloseFrame(&framer_, &reader,
- &sink_frame));
+ EXPECT_TRUE(QuicFramerPeer::ProcessIetfConnectionCloseFrame(
+ &framer_, &reader, IETF_QUIC_APPLICATION_CONNECTION_CLOSE, &sink_frame));
// Now check that received == sent
- EXPECT_EQ(sink_frame.error_code, static_cast<QuicErrorCode>(0));
+ EXPECT_EQ(sink_frame.quic_error_code, static_cast<QuicErrorCode>(0));
+ EXPECT_EQ(sent_frame.quic_error_code, sink_frame.quic_error_code);
EXPECT_EQ(sink_frame.error_details, test_string);
+ EXPECT_EQ(sent_frame.close_type, IETF_QUIC_APPLICATION_CONNECTION_CLOSE);
+ EXPECT_EQ(sent_frame.close_type, sink_frame.close_type);
}
// Testing for the IETF ACK framer.
diff --git a/quic/core/quic_packet_creator_test.cc b/quic/core/quic_packet_creator_test.cc
index d463846..b642c9f 100644
--- a/quic/core/quic_packet_creator_test.cc
+++ b/quic/core/quic_packet_creator_test.cc
@@ -562,6 +562,9 @@
TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
QuicConnectionCloseFrame frame(QUIC_NO_ERROR, "error");
+ if (GetParam().version.transport_version == QUIC_VERSION_99) {
+ frame.close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
+ }
QuicFrames frames;
frames.push_back(QuicFrame(&frame));
diff --git a/quic/core/quic_packet_generator_test.cc b/quic/core/quic_packet_generator_test.cc
index 9edddfc..223383a 100644
--- a/quic/core/quic_packet_generator_test.cc
+++ b/quic/core/quic_packet_generator_test.cc
@@ -1349,6 +1349,9 @@
QuicStringPiece error_details(buf, 2000);
QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(
QUIC_PACKET_WRITE_ERROR, std::string(error_details));
+ if (framer_.transport_version() == QUIC_VERSION_99) {
+ frame->close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
+ }
generator_.AddControlFrame(QuicFrame(frame), /*bundle_ack=*/false);
EXPECT_TRUE(generator_.HasQueuedFrames());
EXPECT_TRUE(generator_.HasRetransmittableFrames());
diff --git a/quic/core/quic_trace_visitor.cc b/quic/core/quic_trace_visitor.cc
index 2c13b56..5fdab2d 100644
--- a/quic/core/quic_trace_visitor.cc
+++ b/quic/core/quic_trace_visitor.cc
@@ -76,7 +76,6 @@
break;
// New IETF frames, not used in current gQUIC version.
- case APPLICATION_CLOSE_FRAME:
case NEW_CONNECTION_ID_FRAME:
case RETIRE_CONNECTION_ID_FRAME:
case MAX_STREAM_ID_FRAME:
@@ -154,6 +153,10 @@
quic_trace::CloseInfo* info = frame_record->mutable_close_info();
info->set_error_code(frame.connection_close_frame->quic_error_code);
info->set_reason_phrase(frame.connection_close_frame->error_details);
+ info->set_close_type(static_cast<quic_trace::CloseType>(
+ frame.connection_close_frame->close_type));
+ info->set_transport_close_frame_type(
+ frame.connection_close_frame->transport_close_frame_type);
break;
}
@@ -203,7 +206,6 @@
break;
// New IETF frames, not used in current gQUIC version.
- case APPLICATION_CLOSE_FRAME:
case NEW_CONNECTION_ID_FRAME:
case RETIRE_CONNECTION_ID_FRAME:
case MAX_STREAM_ID_FRAME:
diff --git a/quic/core/quic_types.h b/quic/core/quic_types.h
index aeedbb5..c23d297 100644
--- a/quic/core/quic_types.h
+++ b/quic/core/quic_types.h
@@ -191,7 +191,6 @@
// from Google QUIC frames. These are valid/allowed if and only if IETF-
// QUIC has been negotiated. Values are not important, they are not
// the values that are in the packets (see QuicIetfFrameType, below).
- APPLICATION_CLOSE_FRAME,
NEW_CONNECTION_ID_FRAME,
MAX_STREAM_ID_FRAME,
STREAM_ID_BLOCKED_FRAME,
@@ -249,7 +248,8 @@
IETF_PATH_RESPONSE = 0x1b,
// Both of the following are "Connection Close" frames,
// the first signals transport-layer errors, the second application-layer
- // errors.
+ // errors.The frame formats and protocol procedures are the same, the only
+ // difference is the number space in the frame's error code field.
IETF_CONNECTION_CLOSE = 0x1c,
IETF_APPLICATION_CLOSE = 0x1d,
diff --git a/quic/test_tools/quic_framer_peer.cc b/quic/test_tools/quic_framer_peer.cc
index 9b7da0b..13b3150 100644
--- a/quic/test_tools/quic_framer_peer.cc
+++ b/quic/test_tools/quic_framer_peer.cc
@@ -101,14 +101,6 @@
}
// static
-bool QuicFramerPeer::AppendApplicationCloseFrame(
- QuicFramer* framer,
- const QuicApplicationCloseFrame& frame,
- QuicDataWriter* writer) {
- return framer->AppendApplicationCloseFrame(frame, writer);
-}
-
-// static
bool QuicFramerPeer::ProcessIetfConnectionCloseFrame(
QuicFramer* framer,
QuicDataReader* reader,
@@ -118,14 +110,6 @@
}
// static
-bool QuicFramerPeer::ProcessApplicationCloseFrame(
- QuicFramer* framer,
- QuicDataReader* reader,
- QuicApplicationCloseFrame* frame) {
- return framer->ProcessApplicationCloseFrame(reader, frame);
-}
-
-// static
bool QuicFramerPeer::ProcessPathChallengeFrame(QuicFramer* framer,
QuicDataReader* reader,
QuicPathChallengeFrame* frame) {
diff --git a/quic/test_tools/quic_framer_peer.h b/quic/test_tools/quic_framer_peer.h
index 2db5af0..7b23189 100644
--- a/quic/test_tools/quic_framer_peer.h
+++ b/quic/test_tools/quic_framer_peer.h
@@ -55,17 +55,10 @@
QuicFramer* framer,
const QuicConnectionCloseFrame& frame,
QuicDataWriter* writer);
- static bool AppendApplicationCloseFrame(
- QuicFramer* framer,
- const QuicApplicationCloseFrame& frame,
- QuicDataWriter* writer);
static bool ProcessIetfConnectionCloseFrame(QuicFramer* framer,
QuicDataReader* reader,
QuicConnectionCloseType type,
QuicConnectionCloseFrame* frame);
- static bool ProcessApplicationCloseFrame(QuicFramer* framer,
- QuicDataReader* reader,
- QuicApplicationCloseFrame* frame);
static bool ProcessIetfAckFrame(QuicFramer* framer,
QuicDataReader* reader,
uint64_t frame_type,
diff --git a/quic/test_tools/quic_test_utils.cc b/quic/test_tools/quic_test_utils.cc
index e5988e0..cd54eb8 100644
--- a/quic/test_tools/quic_test_utils.cc
+++ b/quic/test_tools/quic_test_utils.cc
@@ -282,7 +282,7 @@
}
bool NoOpFramerVisitor::OnApplicationCloseFrame(
- const QuicApplicationCloseFrame& frame) {
+ const QuicConnectionCloseFrame& frame) {
return true;
}
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h
index 00c9748..561362a 100644
--- a/quic/test_tools/quic_test_utils.h
+++ b/quic/test_tools/quic_test_utils.h
@@ -270,7 +270,7 @@
MOCK_METHOD1(OnConnectionCloseFrame,
bool(const QuicConnectionCloseFrame& frame));
MOCK_METHOD1(OnApplicationCloseFrame,
- bool(const QuicApplicationCloseFrame& frame));
+ bool(const QuicConnectionCloseFrame& frame));
MOCK_METHOD1(OnNewConnectionIdFrame,
bool(const QuicNewConnectionIdFrame& frame));
MOCK_METHOD1(OnRetireConnectionIdFrame,
@@ -323,7 +323,7 @@
bool OnPingFrame(const QuicPingFrame& frame) override;
bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override;
bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override;
- bool OnApplicationCloseFrame(const QuicApplicationCloseFrame& frame) override;
+ bool OnApplicationCloseFrame(const QuicConnectionCloseFrame& frame) override;
bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override;
bool OnRetireConnectionIdFrame(
const QuicRetireConnectionIdFrame& frame) override;
@@ -1004,7 +1004,7 @@
MOCK_METHOD1(OnConnectionCloseFrame, void(const QuicConnectionCloseFrame&));
- MOCK_METHOD1(OnApplicationCloseFrame, void(const QuicApplicationCloseFrame&));
+ MOCK_METHOD1(OnApplicationCloseFrame, void(const QuicConnectionCloseFrame&));
MOCK_METHOD1(OnStopSendingFrame, void(const QuicStopSendingFrame&));
diff --git a/quic/test_tools/simple_quic_framer.cc b/quic/test_tools/simple_quic_framer.cc
index c02ed15..7b6e753 100644
--- a/quic/test_tools/simple_quic_framer.cc
+++ b/quic/test_tools/simple_quic_framer.cc
@@ -125,8 +125,7 @@
return true;
}
- bool OnApplicationCloseFrame(
- const QuicApplicationCloseFrame& frame) override {
+ bool OnApplicationCloseFrame(const QuicConnectionCloseFrame& frame) override {
application_close_frames_.push_back(frame);
return true;
}
@@ -208,7 +207,7 @@
const std::vector<QuicConnectionCloseFrame>& connection_close_frames() const {
return connection_close_frames_;
}
- const std::vector<QuicApplicationCloseFrame>& application_close_frames()
+ const std::vector<QuicConnectionCloseFrame>& application_close_frames()
const {
return application_close_frames_;
}
@@ -273,7 +272,7 @@
std::vector<QuicStreamIdBlockedFrame> stream_id_blocked_frames_;
std::vector<QuicMaxStreamIdFrame> max_stream_id_frames_;
std::vector<QuicConnectionCloseFrame> connection_close_frames_;
- std::vector<QuicApplicationCloseFrame> application_close_frames_;
+ std::vector<QuicConnectionCloseFrame> application_close_frames_;
std::vector<QuicStopSendingFrame> stop_sending_frames_;
std::vector<QuicPathChallengeFrame> path_challenge_frames_;
std::vector<QuicPathResponseFrame> path_response_frames_;
diff --git a/quic/tools/quic_packet_printer_bin.cc b/quic/tools/quic_packet_printer_bin.cc
index 28bc790..25c7b67 100644
--- a/quic/tools/quic_packet_printer_bin.cc
+++ b/quic/tools/quic_packet_printer_bin.cc
@@ -136,8 +136,10 @@
std::cerr << "OnConnectionCloseFrame: " << frame;
return true;
}
- bool OnApplicationCloseFrame(
- const QuicApplicationCloseFrame& frame) override {
+ bool OnApplicationCloseFrame(const QuicConnectionCloseFrame& frame) override {
+ // The frame printout will indicate whether it's a Google QUIC
+ // CONNECTION_CLOSE, IETF QUIC CONNECTION_CLOSE/Transport, or IETF QUIC
+ // CONNECTION_CLOSE/Application frame.
std::cerr << "OnApplicationCloseFrame: " << frame;
return true;
}