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
The following commit(s) were added to refs/heads/quic-latest by this push: new 9af58ef Add packet number encoder and decoder 9af58ef is described below commit 9af58ef1f308ea6481a2878770c4b9c5b210e50e Author: Masaori Koshiba <masa...@apache.org> AuthorDate: Tue Sep 5 09:27:03 2017 +0900 Add packet number encoder and decoder --- iocore/net/quic/QUICPacket.cc | 54 +++++++++++++++++++++++++++++++++ iocore/net/quic/QUICPacket.h | 4 +++ iocore/net/quic/test/test_QUICPacket.cc | 39 ++++++++++++++++++++++++ 3 files changed, 97 insertions(+) diff --git a/iocore/net/quic/QUICPacket.cc b/iocore/net/quic/QUICPacket.cc index 683fd48..d009249 100644 --- a/iocore/net/quic/QUICPacket.cc +++ b/iocore/net/quic/QUICPacket.cc @@ -594,6 +594,57 @@ QUICPacket::set_protected_payload(ats_unique_buf cipher_txt, size_t cipher_txt_l this->_protected_payload_size = cipher_txt_len; } +uint8_t +QUICPacket::calc_packet_number_len(QUICPacketNumber num, QUICPacketNumber base) +{ + ink_assert(num > base); + + uint64_t d = (num - base) * 2; + uint8_t len = 0; + + if (d > 0xFFFF) { + len = 4; + } else if (d > 0xFF) { + len = 2; + } else { + len = 1; + } + + return len; +} + +bool +QUICPacket::encode_packet_number(QUICPacketNumber &dst, QUICPacketNumber src, size_t len) +{ + ink_assert(len == 1 || len == 2 || len == 4); + + uint64_t mask = (1ULL << (len * 8)) - 1; + dst = src & mask; + return true; +} + +bool +QUICPacket::decode_packet_number(QUICPacketNumber &dst, QUICPacketNumber src, size_t len, QUICPacketNumber base) +{ + ink_assert(len == 1 || len == 2 || len == 4); + + QUICPacketNumber expected = base + 1; + + uint64_t p = 1ULL << (len * 8); + QUICPacketNumber masked = base & (~(p - 1)); + dst = masked + src; + + if (dst >= expected) { + return true; + } + + dst += p; + return true; +} + +// +// QUICPacketFactory +// std::unique_ptr<QUICPacket, QUICPacketDeleterFunc> QUICPacketFactory::create(IOBufferBlock *block) { @@ -687,6 +738,9 @@ QUICPacketFactory::set_crypto_module(QUICCrypto *crypto) this->_crypto = crypto; } +// +// QUICPacketNumberGenerator +// QUICPacketNumber QUICPacketNumberGenerator::next() { diff --git a/iocore/net/quic/QUICPacket.h b/iocore/net/quic/QUICPacket.h index 224f7e6..02ecf66 100644 --- a/iocore/net/quic/QUICPacket.h +++ b/iocore/net/quic/QUICPacket.h @@ -147,6 +147,10 @@ public: void store_header(uint8_t *buf, size_t *len) const; bool has_valid_fnv1a_hash() const; 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); + LINK(QUICPacket, link); private: diff --git a/iocore/net/quic/test/test_QUICPacket.cc b/iocore/net/quic/test/test_QUICPacket.cc index 1dc3b70..82a6632 100644 --- a/iocore/net/quic/test/test_QUICPacket.cc +++ b/iocore/net/quic/test/test_QUICPacket.cc @@ -94,3 +94,42 @@ TEST_CASE("Loading Unknown Packet", "[quic]") CHECK(header->type() == QUICPacketType::UNINITIALIZED); } + +TEST_CASE("Encoded Packet Number Length", "[quic]") +{ + QUICPacketNumber base = 0x6afa2f; + + CHECK(QUICPacket::calc_packet_number_len(0x6b4264, base) == 2); + CHECK(QUICPacket::calc_packet_number_len(0x6bc107, base) == 4); +} + +TEST_CASE("Encoding Packet Number", "[quic]") +{ + QUICPacketNumber dst = 0; + QUICPacketNumber src = 0xaa831f94; + + QUICPacket::encode_packet_number(dst, src, 2); + CHECK(dst == 0x1f94); +} + +TEST_CASE("Decoding Packet Number 1", "[quic]") +{ + QUICPacketNumber dst = 0; + QUICPacketNumber src = 0x1f94; + size_t len = 2; + QUICPacketNumber base = 0xaa82f30e; + + QUICPacket::decode_packet_number(dst, src, len, base); + CHECK(dst == 0xaa831f94); +} + +TEST_CASE("Decoding Packet Number 2", "[quic]") +{ + QUICPacketNumber dst = 0; + QUICPacketNumber src = 0xf1; + size_t len = 1; + QUICPacketNumber base = 0x18bf54f0; + + QUICPacket::decode_packet_number(dst, src, len, base); + CHECK(dst == 0x18bf54f1); +} -- To stop receiving notification emails like this one, please contact ['"commits@trafficserver.apache.org" <commits@trafficserver.apache.org>'].