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

Reply via email to