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/10/16 12:16:33 UTC

[trafficserver] 03/03: Fix packet number decoding

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

maskit pushed a commit to branch quic-05
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit dbec5935992d212781e0f3925484d08857df4046
Author: Masakazu Kitajo <ma...@apache.org>
AuthorDate: Mon Oct 16 17:28:32 2017 +0900

    Fix packet number decoding
    
    It was not decoded correctly when packets were not sequential.
    
    (cherry picked from commit a739464caef585a11ca82d927429371d61187b49)
---
 iocore/net/quic/QUICPacket.cc           | 20 +++++++++++---------
 iocore/net/quic/QUICPacket.h            |  3 ++-
 iocore/net/quic/test/test_QUICPacket.cc | 10 ++++++++++
 3 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/iocore/net/quic/QUICPacket.cc b/iocore/net/quic/QUICPacket.cc
index bf0e1f9..5af7e63 100644
--- a/iocore/net/quic/QUICPacket.cc
+++ b/iocore/net/quic/QUICPacket.cc
@@ -669,21 +669,23 @@ QUICPacket::encode_packet_number(QUICPacketNumber &dst, QUICPacketNumber src, si
 }
 
 bool
-QUICPacket::decode_packet_number(QUICPacketNumber &dst, QUICPacketNumber src, size_t len, QUICPacketNumber base)
+QUICPacket::decode_packet_number(QUICPacketNumber &dst, QUICPacketNumber src, size_t len,
+                                 QUICPacketNumber largest_acked)
 {
   ink_assert(len == 1 || len == 2 || len == 4);
 
-  QUICPacketNumber expected = base + 1;
+  uint64_t maximum_diff       = 1ULL << (len * 8);
+  QUICPacketNumber base       = largest_acked & (~(maximum_diff - 1));
+  QUICPacketNumber candidate1 = base + src;
+  QUICPacketNumber candidate2 = base + src + maximum_diff;
 
-  uint64_t p              = 1ULL << (len * 8);
-  QUICPacketNumber masked = base & (~(p - 1));
-  dst                     = masked + src;
-
-  if (dst >= expected) {
-    return true;
+  if (((candidate1 > largest_acked) ? (candidate1 - largest_acked) : (largest_acked - candidate1)) <
+      ((candidate2 > largest_acked) ? (candidate2 - largest_acked) : (largest_acked - candidate2))) {
+    dst = candidate1;
+  } else {
+    dst = candidate2;
   }
 
-  dst += p;
   return true;
 }
 
diff --git a/iocore/net/quic/QUICPacket.h b/iocore/net/quic/QUICPacket.h
index 94067ae..9ed9632 100644
--- a/iocore/net/quic/QUICPacket.h
+++ b/iocore/net/quic/QUICPacket.h
@@ -156,7 +156,8 @@ public:
   QUICKeyPhase key_phase() const;
   static uint8_t calc_packet_number_len(QUICPacketNumber num, QUICPacketNumber base);
   static bool encode_packet_number(QUICPacketNumber &dst, QUICPacketNumber src, size_t len);
-  static bool decode_packet_number(QUICPacketNumber &dst, QUICPacketNumber src, size_t len, QUICPacketNumber largest_acked_num);
+  static bool decode_packet_number(QUICPacketNumber &dst, QUICPacketNumber src, size_t len,
+                                   QUICPacketNumber largest_acked);
 
   LINK(QUICPacket, link);
 
diff --git a/iocore/net/quic/test/test_QUICPacket.cc b/iocore/net/quic/test/test_QUICPacket.cc
index a987004..679cd3b 100644
--- a/iocore/net/quic/test/test_QUICPacket.cc
+++ b/iocore/net/quic/test/test_QUICPacket.cc
@@ -133,3 +133,13 @@ TEST_CASE("Decoding Packet Number 2", "[quic]")
   QUICPacket::decode_packet_number(dst, src, len, base);
   CHECK(dst == 0x18bf54f1);
 }
+
+TEST_CASE("Decoding Packet Number 3", "[quic]")
+{
+  QUICPacketNumber dst  = 0;
+  QUICPacketNumber src  = 0x5694;
+  size_t len            = 2;
+  QUICPacketNumber base = 0x44D35695;
+  QUICPacket::decode_packet_number(dst, src, len, base);
+  CHECK(dst == 0x44D35694);
+}

-- 
To stop receiving notification emails like this one, please contact
"commits@trafficserver.apache.org" <co...@trafficserver.apache.org>.