You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by ma...@apache.org on 2017/08/18 05:49:58 UTC
[trafficserver] 05/05: Fix max data size of STREAM frame
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 <ma...@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" <co...@trafficserver.apache.org>.