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 <[email protected]>
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
['"[email protected]" <[email protected]>'].