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 <mas...@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" <commits@trafficserver.apache.org>.