This is an automated email from the ASF dual-hosted git repository. maskit pushed a commit to branch quic-latest in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/quic-latest by this push: new aa72487 Respond with a closing frame on closing state aa72487 is described below commit aa724876b275ade448747980ae8291dc07d13baa Author: Masakazu Kitajo <mas...@apache.org> AuthorDate: Tue Jan 16 14:33:20 2018 +0900 Respond with a closing frame on closing state --- iocore/net/P_QUICNetVConnection.h | 2 ++ iocore/net/QUICNetVConnection.cc | 29 +++++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/iocore/net/P_QUICNetVConnection.h b/iocore/net/P_QUICNetVConnection.h index d076fd3..e63f34a 100644 --- a/iocore/net/P_QUICNetVConnection.h +++ b/iocore/net/P_QUICNetVConnection.h @@ -279,6 +279,7 @@ private: QUICErrorUPtr _state_connection_established_process_packet(QUICPacketUPtr packet); QUICErrorUPtr _state_common_receive_packet(); QUICErrorUPtr _state_common_send_packet(); + QUICErrorUPtr _state_closing_send_packet(); Ptr<ProxyMutex> _packet_transmitter_mutex; Ptr<ProxyMutex> _frame_transmitter_mutex; @@ -298,6 +299,7 @@ private: void _handle_idle_timeout(); void _update_alt_connection_ids(uint8_t chosen); + QUICPacketUPtr _the_final_packet = QUICPacketFactory::create_null_packet(); QUICStatelessResetToken _reset_token; }; diff --git a/iocore/net/QUICNetVConnection.cc b/iocore/net/QUICNetVConnection.cc index 45d4163..87e9c0e 100644 --- a/iocore/net/QUICNetVConnection.cc +++ b/iocore/net/QUICNetVConnection.cc @@ -492,10 +492,7 @@ QUICNetVConnection::state_connection_closing(int event, Event *data) break; case QUIC_EVENT_PACKET_WRITE_READY: this->_close_packet_write_ready(data); - // FIXME During the closing period, an endpoint that sends a - // closing frame SHOULD respond to any packet that it receives with - // another packet containing a closing frame. - this->_state_common_send_packet(); + this->_state_closing_send_packet(); break; case QUIC_EVENT_CLOSING_TIMEOUT: this->_close_closing_timeout(data); @@ -769,6 +766,18 @@ QUICNetVConnection::_state_common_send_packet() return QUICErrorUPtr(new QUICNoError()); } +QUICErrorUPtr +QUICNetVConnection::_state_closing_send_packet() +{ + // During the closing period, an endpoint that sends a + // closing frame SHOULD respond to any packet that it receives with + // another packet containing a closing frame. To minimize the state + // that an endpoint maintains for a closing connection, endpoints MAY + // send the exact same packet. + this->_packet_handler->send_packet(*this->_the_final_packet, this); + return QUICErrorUPtr(new QUICNoError()); +} + // Store frame data to buffer for packet. When remaining buffer is too small to store frame data or packet type is different from // previous one, build packet and transmit it. After that, allocate new buffer. void @@ -802,6 +811,15 @@ QUICNetVConnection::_store_frame(ats_unique_buf &buf, size_t &len, bool &retrans frame->store(buf.get() + len, &l); len += l; + if (frame->type() == QUICFrameType::CONNECTION_CLOSE || frame->type() == QUICFrameType::APPLICATION_CLOSE) { + this->_transmit_packet(this->_build_packet(std::move(buf), len, retransmittable, previous_packet_type)); + retransmittable = false; + len = 0; + buf = ats_unique_malloc(max_size); + frame->store(buf.get(), &l); + this->_the_final_packet = this->_build_packet(std::move(buf), l, false); + } + return; } @@ -836,6 +854,9 @@ QUICNetVConnection::_packetize_frames() frame = std::move(this->_frame_send_queue.front()); this->_frame_send_queue.pop(); this->_store_frame(buf, len, retransmittable, current_packet_type, std::move(frame)); + if (this->_the_final_packet) { + return; + } } while (this->_stream_frame_send_queue.size() > 0) { -- To stop receiving notification emails like this one, please contact ['"commits@trafficserver.apache.org" <commits@trafficserver.apache.org>'].