You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by sc...@apache.org on 2019/02/15 05:02:53 UTC

[trafficserver] branch quic-latest updated: QUIC: AckCreator only response to non-ack-only packet

This is an automated email from the ASF dual-hosted git repository.

scw00 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 0b84cf3  QUIC: AckCreator only response to non-ack-only packet
0b84cf3 is described below

commit 0b84cf33d14accb558fa9e9b695d13a0f394868a
Author: scw00 <sc...@apache.org>
AuthorDate: Fri Feb 15 11:29:28 2019 +0800

    QUIC: AckCreator only response to non-ack-only packet
---
 iocore/net/quic/QUICAckFrameCreator.cc           |  2 +-
 iocore/net/quic/test/test_QUICAckFrameCreator.cc | 67 ++++++++++++++++++++++++
 2 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/iocore/net/quic/QUICAckFrameCreator.cc b/iocore/net/quic/QUICAckFrameCreator.cc
index 7214fdc..55b8d6f 100644
--- a/iocore/net/quic/QUICAckFrameCreator.cc
+++ b/iocore/net/quic/QUICAckFrameCreator.cc
@@ -193,7 +193,7 @@ QUICAckFrameManager::QUICAckFrameCreator::push_back(QUICPacketNumber packet_numb
   }
 
   // can not delay handshake packet
-  if (this->_level == QUICEncryptionLevel::INITIAL || this->_level == QUICEncryptionLevel::HANDSHAKE) {
+  if ((this->_level == QUICEncryptionLevel::INITIAL || this->_level == QUICEncryptionLevel::HANDSHAKE) && !ack_only) {
     this->_should_send = true;
   }
 
diff --git a/iocore/net/quic/test/test_QUICAckFrameCreator.cc b/iocore/net/quic/test/test_QUICAckFrameCreator.cc
index 15b1e13..7e0d410 100644
--- a/iocore/net/quic/test/test_QUICAckFrameCreator.cc
+++ b/iocore/net/quic/test/test_QUICAckFrameCreator.cc
@@ -343,3 +343,70 @@ TEST_CASE("QUICAckFrameManager lost_frame", "[quic]")
 
   CHECK(ack_manager.will_generate_frame(level) == false);
 }
+
+TEST_CASE("QUICAckFrameManager ack only packet", "[quic]")
+{
+  SECTION("INITIAL")
+  {
+    QUICAckFrameManager ack_manager;
+    QUICEncryptionLevel level = QUICEncryptionLevel::INITIAL;
+    uint8_t frame_buf[QUICFrame::MAX_INSTANCE_SIZE];
+
+    // Initial state
+    QUICFrame *ack_frame = ack_manager.generate_frame(frame_buf, level, UINT16_MAX, UINT16_MAX);
+    QUICAckFrame *frame  = static_cast<QUICAckFrame *>(ack_frame);
+    CHECK(frame == nullptr);
+
+    ack_manager.update(level, 1, 1, false);
+    ack_manager.update(level, 2, 1, false);
+    ack_manager.update(level, 3, 1, false);
+    ack_manager.update(level, 4, 1, false);
+    ack_manager.update(level, 5, 1, false);
+
+    CHECK(ack_manager.will_generate_frame(level) == true);
+
+    ack_frame = ack_manager.generate_frame(frame_buf, level, UINT16_MAX, UINT16_MAX);
+    frame     = static_cast<QUICAckFrame *>(ack_frame);
+    CHECK(frame != nullptr);
+    CHECK(frame->ack_block_count() == 0);
+    CHECK(frame->largest_acknowledged() == 5);
+    CHECK(frame->ack_block_section()->first_ack_block() == 4);
+    CHECK(frame->ack_block_section()->begin()->gap() == 0);
+
+    ack_manager.update(level, 6, 1, true);
+    ack_manager.update(level, 7, 1, true);
+    CHECK(ack_manager.will_generate_frame(level) == false);
+  }
+
+  SECTION("ONE_RTT")
+  {
+    QUICAckFrameManager ack_manager;
+    QUICEncryptionLevel level = QUICEncryptionLevel::ONE_RTT;
+    uint8_t frame_buf[QUICFrame::MAX_INSTANCE_SIZE];
+
+    // Initial state
+    QUICFrame *ack_frame = ack_manager.generate_frame(frame_buf, level, UINT16_MAX, UINT16_MAX);
+    QUICAckFrame *frame  = static_cast<QUICAckFrame *>(ack_frame);
+    CHECK(frame == nullptr);
+
+    ack_manager.update(level, 1, 1, false);
+    ack_manager.update(level, 2, 1, false);
+    ack_manager.update(level, 3, 1, false);
+    ack_manager.update(level, 4, 1, false);
+    ack_manager.update(level, 5, 1, false);
+
+    CHECK(ack_manager.will_generate_frame(level) == true);
+
+    ack_frame = ack_manager.generate_frame(frame_buf, level, UINT16_MAX, UINT16_MAX);
+    frame     = static_cast<QUICAckFrame *>(ack_frame);
+    CHECK(frame != nullptr);
+    CHECK(frame->ack_block_count() == 0);
+    CHECK(frame->largest_acknowledged() == 5);
+    CHECK(frame->ack_block_section()->first_ack_block() == 4);
+    CHECK(frame->ack_block_section()->begin()->gap() == 0);
+
+    ack_manager.update(level, 6, 1, true);
+    ack_manager.update(level, 7, 1, true);
+    CHECK(ack_manager.will_generate_frame(level) == false);
+  }
+}