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>.