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 2018/04/13 06:58:33 UTC

[trafficserver] 02/03: Add create_uni/bidi_stream to QUICStreamManager

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 643f7420aeedea9602c5f941df0ca443c30721d6
Author: Masaori Koshiba <ma...@apache.org>
AuthorDate: Fri Apr 13 15:40:55 2018 +0900

    Add create_uni/bidi_stream to QUICStreamManager
---
 iocore/net/QUICNetVConnection.cc     |  3 ++-
 iocore/net/quic/QUICStreamManager.cc | 37 ++++++++++++++++++++++++++++++++++--
 iocore/net/quic/QUICStreamManager.h  |  8 +++++++-
 3 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/iocore/net/QUICNetVConnection.cc b/iocore/net/QUICNetVConnection.cc
index 1463056..506223d 100644
--- a/iocore/net/QUICNetVConnection.cc
+++ b/iocore/net/QUICNetVConnection.cc
@@ -204,7 +204,8 @@ QUICNetVConnection::start()
   this->_remote_flow_controller = new QUICRemoteConnectionFlowController(UINT64_MAX);
   this->_local_flow_controller  = new QUICLocalConnectionFlowController(this->_loss_detector, UINT64_MAX);
   this->_path_validator         = new QUICPathValidator();
-  this->_stream_manager         = new QUICStreamManager(this->_loss_detector, this->connection_id(), this->_application_map);
+  this->_stream_manager =
+    new QUICStreamManager(this->_loss_detector, this->connection_id(), this->_application_map, this->netvc_context);
 
   this->_frame_dispatcher->add_handler(this);
   this->_frame_dispatcher->add_handler(this->_stream_manager);
diff --git a/iocore/net/quic/QUICStreamManager.cc b/iocore/net/quic/QUICStreamManager.cc
index a01ffce..f52cf52 100644
--- a/iocore/net/quic/QUICStreamManager.cc
+++ b/iocore/net/quic/QUICStreamManager.cc
@@ -32,9 +32,18 @@ static constexpr char tag[] = "quic_stream_manager";
 ClassAllocator<QUICStreamManager> quicStreamManagerAllocator("quicStreamManagerAllocator");
 ClassAllocator<QUICStream> quicStreamAllocator("quicStreamAllocator");
 
-QUICStreamManager::QUICStreamManager(QUICRTTProvider *rtt_provider, QUICConnectionId cid, QUICApplicationMap *app_map)
-  : _connection_id(cid), _app_map(app_map), _rtt_provider(rtt_provider)
+QUICStreamManager::QUICStreamManager(QUICRTTProvider *rtt_provider, QUICConnectionId cid, QUICApplicationMap *app_map,
+                                     NetVConnectionContext_t context)
+  : _connection_id(cid), _app_map(app_map), _netvc_context(context), _rtt_provider(rtt_provider)
 {
+  if (this->_netvc_context == NET_VCONNECTION_OUT) {
+    // stream 0 is for handshake, smallest client bidi stream id is 4
+    this->_next_stream_id_bidi = static_cast<uint32_t>(QUICStreamType::CLIENT_BIDI) + 4;
+    this->_next_stream_id_uni  = static_cast<uint32_t>(QUICStreamType::CLIENT_UNI);
+  } else {
+    this->_next_stream_id_bidi = static_cast<uint32_t>(QUICStreamType::SERVER_BIDI);
+    this->_next_stream_id_uni  = static_cast<uint32_t>(QUICStreamType::SERVER_UNI);
+  }
 }
 
 std::vector<QUICFrameType>
@@ -103,6 +112,30 @@ QUICStreamManager::create_stream(QUICStreamId stream_id)
 }
 
 QUICErrorUPtr
+QUICStreamManager::create_uni_stream(QUICStreamId &new_stream_id)
+{
+  QUICErrorUPtr error = this->create_stream(this->_next_stream_id_uni);
+  if (error->cls == QUICErrorClass::NONE) {
+    new_stream_id = this->_next_stream_id_uni;
+    this->_next_stream_id_uni += 2;
+  }
+
+  return error;
+}
+
+QUICErrorUPtr
+QUICStreamManager::create_bidi_stream(QUICStreamId &new_stream_id)
+{
+  QUICErrorUPtr error = this->create_stream(this->_next_stream_id_bidi);
+  if (error->cls == QUICErrorClass::NONE) {
+    new_stream_id = this->_next_stream_id_bidi;
+    this->_next_stream_id_bidi += 2;
+  }
+
+  return error;
+}
+
+QUICErrorUPtr
 QUICStreamManager::handle_frame(std::shared_ptr<const QUICFrame> frame)
 {
   QUICErrorUPtr error = QUICErrorUPtr(new QUICNoError());
diff --git a/iocore/net/quic/QUICStreamManager.h b/iocore/net/quic/QUICStreamManager.h
index 9f8851a..3b14b41 100644
--- a/iocore/net/quic/QUICStreamManager.h
+++ b/iocore/net/quic/QUICStreamManager.h
@@ -38,7 +38,8 @@ class QUICStreamManager : public QUICFrameHandler, public QUICFrameGenerator
 {
 public:
   QUICStreamManager(){};
-  QUICStreamManager(QUICRTTProvider *rtt_provider, QUICConnectionId cid, QUICApplicationMap *app_map);
+  QUICStreamManager(QUICRTTProvider *rtt_provider, QUICConnectionId cid, QUICApplicationMap *app_map,
+                    NetVConnectionContext_t context);
 
   void init_flow_control_params(const std::shared_ptr<const QUICTransportParameters> &local_tp,
                                 const std::shared_ptr<const QUICTransportParameters> &remote_tp);
@@ -49,6 +50,8 @@ public:
 
   uint32_t stream_count() const;
   QUICErrorUPtr create_stream(QUICStreamId stream_id);
+  QUICErrorUPtr create_uni_stream(QUICStreamId &new_stream_id);
+  QUICErrorUPtr create_bidi_stream(QUICStreamId &new_stream_id);
 
   void set_default_application(QUICApplication *app);
   void reset_send_offset();
@@ -76,12 +79,15 @@ private:
 
   QUICConnectionId _connection_id                           = 0;
   QUICApplicationMap *_app_map                              = nullptr;
+  NetVConnectionContext_t _netvc_context                    = NET_VCONNECTION_UNSET;
   std::shared_ptr<const QUICTransportParameters> _local_tp  = nullptr;
   std::shared_ptr<const QUICTransportParameters> _remote_tp = nullptr;
   QUICStreamId _local_maximum_stream_id_bidi                = 0;
   QUICStreamId _local_maximum_stream_id_uni                 = 0;
   QUICStreamId _remote_maximum_stream_id_bidi               = 0;
   QUICStreamId _remote_maximum_stream_id_uni                = 0;
+  QUICStreamId _next_stream_id_uni                          = 0;
+  QUICStreamId _next_stream_id_bidi                         = 0;
   uint64_t _total_offset_sent                               = 0;
   QUICRTTProvider *_rtt_provider                            = nullptr;
 };

-- 
To stop receiving notification emails like this one, please contact
masaori@apache.org.