This is an automated email from the ASF dual-hosted git repository. masaori pushed a commit to branch quic-latest in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit 6ea3b7d6c2bd0dc32c88f90e841c6d7092ff12b7 Author: Masaori Koshiba <masa...@apache.org> AuthorDate: Fri Aug 18 14:40:32 2017 +0900 Fix max data size of STREAM frame --- iocore/net/P_QUICNetVConnection.h | 1 + iocore/net/QUICNetVConnection.cc | 16 +++++++++++++--- iocore/net/quic/Mock.h | 14 +++++++++++++- iocore/net/quic/QUICFrameTransmitter.h | 1 + iocore/net/quic/QUICStream.cc | 10 ++++------ iocore/net/quic/QUICStream.h | 6 ++++-- iocore/net/quic/QUICStreamManager.cc | 2 +- iocore/net/quic/test/test_QUICStream.cc | 6 +++--- 8 files changed, 40 insertions(+), 16 deletions(-) diff --git a/iocore/net/P_QUICNetVConnection.h b/iocore/net/P_QUICNetVConnection.h index 1a143b9..8f51030 100644 --- a/iocore/net/P_QUICNetVConnection.h +++ b/iocore/net/P_QUICNetVConnection.h @@ -165,6 +165,7 @@ public: QUICCrypto *get_crypto() override; uint32_t maximum_quic_packet_size() override; uint32_t minimum_quic_packet_size() override; + uint32_t maximum_stream_frame_data_size() override; uint32_t pmtu() override; void close(QUICError error) override; diff --git a/iocore/net/QUICNetVConnection.cc b/iocore/net/QUICNetVConnection.cc index 421555a..b09e930 100644 --- a/iocore/net/QUICNetVConnection.cc +++ b/iocore/net/QUICNetVConnection.cc @@ -44,8 +44,9 @@ #define DebugQUICCon(fmt, ...) \ Debug("quic_net", "[%" PRIx64 "] " fmt, static_cast<uint64_t>(this->_quic_connection_id), ##__VA_ARGS__) -const static uint32_t MINIMUM_MTU = 1280; -const static uint32_t MAX_PACKET_OVERHEAD = 25; // Max long header len(17) + FNV-1a hash len(8) +const static uint32_t MINIMUM_MTU = 1280; +const static uint32_t MAX_PACKET_OVERHEAD = 25; // Max long header len(17) + FNV-1a hash len(8) +const static uint32_t MAX_STREAM_FRAME_OVERHEAD = 15; ClassAllocator<QUICNetVConnection> quicNetVCAllocator("quicNetVCAllocator"); @@ -159,6 +160,12 @@ QUICNetVConnection::maximum_quic_packet_size() } } +uint32_t +QUICNetVConnection::maximum_stream_frame_data_size() +{ + return this->maximum_quic_packet_size() - MAX_STREAM_FRAME_OVERHEAD - MAX_PACKET_OVERHEAD; +} + void QUICNetVConnection::transmit_packet(std::unique_ptr<const QUICPacket> packet) { @@ -287,7 +294,8 @@ QUICNetVConnection::state_handshake(int event, Event *data) if (error.cls != QUICErrorClass::NONE) { // TODO: Send error if needed - DebugQUICCon("QUICError: cls=%u, code=0x%x", static_cast<unsigned int>(error.cls), static_cast<unsigned int>(error.code)); + DebugQUICCon("QUICError: %s (%u), %s (0x%x)", QUICDebugNames::error_class(error.cls), static_cast<unsigned int>(error.cls), + QUICDebugNames::error_code(error.code), static_cast<unsigned int>(error.code)); } if (this->_handshake_handler && this->_handshake_handler->is_completed()) { @@ -446,6 +454,8 @@ QUICError QUICNetVConnection::_state_handshake_process_initial_client_packet(std::unique_ptr<const QUICPacket> packet) { if (packet->size() < this->minimum_quic_packet_size()) { + DebugQUICCon("%" PRId32 ", %" PRId32, packet->size(), this->minimum_quic_packet_size()); + return QUICError(QUICErrorClass::QUIC_TRANSPORT, QUICErrorCode::QUIC_INTERNAL_ERROR); } diff --git a/iocore/net/quic/Mock.h b/iocore/net/quic/Mock.h index 6aab611..561feeb 100644 --- a/iocore/net/quic/Mock.h +++ b/iocore/net/quic/Mock.h @@ -88,6 +88,12 @@ public: } uint32_t + maximum_stream_frame_data_size() override + { + return 1160; + } + + uint32_t pmtu() override { return 1280; @@ -142,8 +148,14 @@ public: class MockQUICFrameTransmitter : public QUICFrameTransmitter { void - transmit_frame(std::unique_ptr<QUICFrame, QUICFrameDeleterFunc> frame) + transmit_frame(std::unique_ptr<QUICFrame, QUICFrameDeleterFunc> frame) override + { + } + + uint32_t + maximum_stream_frame_data_size() override { + return 1160; } }; diff --git a/iocore/net/quic/QUICFrameTransmitter.h b/iocore/net/quic/QUICFrameTransmitter.h index 8612daf..ce3c267 100644 --- a/iocore/net/quic/QUICFrameTransmitter.h +++ b/iocore/net/quic/QUICFrameTransmitter.h @@ -34,4 +34,5 @@ public: * This sends QUIC_PACKET_WRITE_READY event. */ virtual void transmit_frame(std::unique_ptr<QUICFrame, QUICFrameDeleterFunc> frame) = 0; + virtual uint32_t maximum_stream_frame_data_size() = 0; }; diff --git a/iocore/net/quic/QUICStream.cc b/iocore/net/quic/QUICStream.cc index f80ed0f..db25063 100644 --- a/iocore/net/quic/QUICStream.cc +++ b/iocore/net/quic/QUICStream.cc @@ -30,11 +30,11 @@ const static char *tag = "quic_stream"; void -QUICStream::init(QUICStreamManager *manager, QUICStreamId id) +QUICStream::init(QUICStreamManager *manager, QUICConnection *qc, QUICStreamId id) { this->_streamManager = manager; - - this->_id = id; + this->_qc = qc; + this->_id = id; this->mutex = new_ProxyMutex(); } @@ -286,9 +286,7 @@ QUICStream::_send() IOBufferReader *reader = this->_write_vio.get_reader(); int64_t bytes_avail = reader->read_avail(); int64_t total_len = 0; - // TODO: refer maximum_quic_packet_size - // uint32_t max_size = this->client_vc->maximum_quic_packet_size() - MAX_STREAM_FRAME_HEADER_LEN(15) - MAX_PACKET_OVERHEAD(25); - uint32_t max_size = 1212; + uint32_t max_size = this->_qc->maximum_stream_frame_data_size(); while (total_len < bytes_avail) { int64_t data_len = reader->block_read_avail(); diff --git a/iocore/net/quic/QUICStream.h b/iocore/net/quic/QUICStream.h index 7cae47f..aef9dca 100644 --- a/iocore/net/quic/QUICStream.h +++ b/iocore/net/quic/QUICStream.h @@ -31,6 +31,7 @@ #include "QUICFrame.h" #include "QUICStreamState.h" +class QUICConnection; class QUICStreamState; class QUICStreamManager; @@ -44,7 +45,7 @@ public: QUICStream() : VConnection(nullptr) {} ~QUICStream() {} - void init(QUICStreamManager *manager, uint32_t id); + void init(QUICStreamManager *manager, QUICConnection *qc, uint32_t id); void start(); int main_event_handler(int event, void *data); @@ -94,5 +95,6 @@ private: // TODO: Consider to replace with ts/RbTree.h or other data structure std::map<QUICOffset, std::shared_ptr<const QUICStreamFrame>> _request_stream_frame_buffer; - QUICStreamManager *_streamManager; + QUICStreamManager *_streamManager = nullptr; + QUICConnection *_qc = nullptr; }; diff --git a/iocore/net/quic/QUICStreamManager.cc b/iocore/net/quic/QUICStreamManager.cc index e9f058d..fe6be6e 100644 --- a/iocore/net/quic/QUICStreamManager.cc +++ b/iocore/net/quic/QUICStreamManager.cc @@ -104,7 +104,7 @@ QUICStreamManager::_find_or_create_stream(QUICStreamId stream_id) if (!stream) { // TODO Free the stream somewhere stream = THREAD_ALLOC_INIT(quicStreamAllocator, this_ethread()); - stream->init(this, stream_id); + stream->init(this, this->_qc, stream_id); stream->start(); this->stream_list.push(stream); diff --git a/iocore/net/quic/test/test_QUICStream.cc b/iocore/net/quic/test/test_QUICStream.cc index e31ddb9..d60867a 100644 --- a/iocore/net/quic/test/test_QUICStream.cc +++ b/iocore/net/quic/test/test_QUICStream.cc @@ -47,7 +47,7 @@ TEST_CASE("QUICStream_assembling_byte_stream_1", "[quic]") IOBufferReader *reader = read_buffer->alloc_reader(); std::unique_ptr<QUICStream> stream(new QUICStream()); - stream->init(nullptr, stream_id); + stream->init(nullptr, nullptr, stream_id); stream->do_io_read(nullptr, 0, read_buffer); stream->recv(frame_1); @@ -73,7 +73,7 @@ TEST_CASE("QUICStream_assembling_byte_stream_2", "[quic]") IOBufferReader *reader = read_buffer->alloc_reader(); std::unique_ptr<QUICStream> stream(new QUICStream()); - stream->init(nullptr, stream_id); + stream->init(nullptr, nullptr, stream_id); stream->do_io_read(nullptr, 0, read_buffer); stream->recv(frame_8); @@ -99,7 +99,7 @@ TEST_CASE("QUICStream_assembling_byte_stream_3", "[quic]") IOBufferReader *reader = read_buffer->alloc_reader(); std::unique_ptr<QUICStream> stream(new QUICStream()); - stream->init(nullptr, stream_id); + stream->init(nullptr, nullptr, stream_id); stream->do_io_read(nullptr, 0, read_buffer); stream->recv(frame_8); -- To stop receiving notification emails like this one, please contact "commits@trafficserver.apache.org" <commits@trafficserver.apache.org>.