// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef QUICHE_QUIC_CORE_QUIC_CONNECTION_ID_H_
#define QUICHE_QUIC_CORE_QUIC_CONNECTION_ID_H_

#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_string.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_uint128.h"

namespace quic {

enum QuicConnectionIdLength {
  PACKET_0BYTE_CONNECTION_ID = 0,
  PACKET_8BYTE_CONNECTION_ID = 8,
};

// Connection IDs can be 0-18 bytes per IETF specifications.
const uint8_t kQuicMaxConnectionIdLength = 18;

// kQuicDefaultConnectionIdLength is the only supported length for QUIC
// versions < v99, and is the default picked for all versions.
const uint8_t kQuicDefaultConnectionIdLength = 8;

class QUIC_EXPORT_PRIVATE QuicConnectionId {
 public:
  // Creates a connection ID of length zero, unless the restart flag
  // quic_connection_ids_network_byte_order is false in which case
  // it returns an 8-byte all-zeroes connection ID.
  QuicConnectionId();

  // Creates a connection ID from network order bytes.
  QuicConnectionId(const char* data, uint8_t length);

  // Creator from host byte order uint64_t.
  explicit QuicConnectionId(uint64_t connection_id64);

  ~QuicConnectionId();

  // Returns the length of the connection ID, in bytes.
  uint8_t length() const;

  // Sets the length of the connection ID, in bytes.
  void set_length(uint8_t length);

  // Returns a pointer to the connection ID bytes, in network byte order.
  const char* data() const;

  // Returns a mutable pointer to the connection ID bytes,
  // in network byte order.
  char* mutable_data();

  // Returns whether the connection ID has length zero, unless the restart flag
  // quic_connection_ids_network_byte_order is false in which case
  // it checks if it is all zeroes.
  bool IsEmpty() const;

  // Converts to host byte order uint64_t.
  uint64_t ToUInt64() const;

  // Hash() is required to use connection IDs as keys in hash tables.
  size_t Hash() const;

  // Generates an ASCII string that represents
  // the contents of the connection ID, or "0" if it is empty.
  QuicString ToString() const;

  // operator<< allows easily logging connection IDs.
  friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(
      std::ostream& os,
      const QuicConnectionId& v);

  bool operator==(const QuicConnectionId& v) const;
  bool operator!=(const QuicConnectionId& v) const;
  // operator< is required to use connection IDs as keys in hash tables.
  bool operator<(const QuicConnectionId& v) const;

 private:
  // The connection ID is currently represented in host byte order in |id64_|.
  // In the future, it will be saved in the first |length_| bytes of |data_|.
  char data_[kQuicMaxConnectionIdLength];
  uint8_t length_;
  uint64_t id64_;  // host byte order
};

// Creates a connection ID of length zero, unless the restart flag
// quic_connection_ids_network_byte_order is false in which case
// it returns an 8-byte all-zeroes connection ID.
QUIC_EXPORT_PRIVATE QuicConnectionId EmptyQuicConnectionId();

// Converts connection ID from host-byte-order uint64_t to QuicConnectionId.
// This is currently the identity function.
QUIC_EXPORT_PRIVATE QuicConnectionId
QuicConnectionIdFromUInt64(uint64_t connection_id64);

// Converts connection ID from QuicConnectionId to host-byte-order uint64_t.
// This is currently the identity function.
QUIC_EXPORT_PRIVATE uint64_t
QuicConnectionIdToUInt64(QuicConnectionId connection_id);

// QuicConnectionIdHash can be passed as hash argument to hash tables.
class QuicConnectionIdHash {
 public:
  size_t operator()(QuicConnectionId const& connection_id) const noexcept {
    return connection_id.Hash();
  }
};

// Governs how connection IDs are represented in memory.
// Checks gfe_restart_flag_quic_connection_ids_network_byte_order.
QUIC_EXPORT_PRIVATE bool QuicConnectionIdUseNetworkByteOrder();

enum class Perspective : uint8_t;
// Governs how connection IDs are created.
// Checks gfe_restart_flag_quic_variable_length_connection_ids_(client|server).
QUIC_EXPORT_PRIVATE bool QuicConnectionIdSupportsVariableLength(
    Perspective perspective);

}  // namespace quic

#endif  // QUICHE_QUIC_CORE_QUIC_CONNECTION_ID_H_
