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