// Copyright 2014 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.

// This file defines some basic types used by the P2P-related IPC
// messages.

#ifndef CONTENT_COMMON_P2P_SOCKET_TYPE_H_
#define CONTENT_COMMON_P2P_SOCKET_TYPE_H_

#include <stdint.h>

#include <string>

#include "base/time/time.h"
#include "net/base/ip_endpoint.h"

namespace content {

enum P2PSocketOption {
  P2P_SOCKET_OPT_RCVBUF,  // Receive buffer size.
  P2P_SOCKET_OPT_SNDBUF,  // Send buffer size.
  P2P_SOCKET_OPT_DSCP,    // DSCP code.
  P2P_SOCKET_OPT_MAX
};

// Type of P2P Socket.
enum P2PSocketType {
  P2P_SOCKET_UDP,
  P2P_SOCKET_TCP_SERVER,
  P2P_SOCKET_STUN_TCP_SERVER,
  P2P_SOCKET_TCP_CLIENT,
  P2P_SOCKET_STUN_TCP_CLIENT,
  P2P_SOCKET_SSLTCP_CLIENT,
  P2P_SOCKET_STUN_SSLTCP_CLIENT,
  P2P_SOCKET_TLS_CLIENT,
  P2P_SOCKET_STUN_TLS_CLIENT,
  P2P_SOCKET_TYPE_LAST = P2P_SOCKET_STUN_TLS_CLIENT
};

// Struct which carries both resolved IP address and host string literal.
// Port number will be part of |ip_address|.
struct P2PHostAndIPEndPoint {
  P2PHostAndIPEndPoint() {}
  P2PHostAndIPEndPoint(const std::string& hostname,
                       const net::IPEndPoint& ip_address)
      : hostname(hostname), ip_address(ip_address) {
  }

  std::string hostname;
  net::IPEndPoint ip_address;
};

// Struct which keeps track of metrics during a send operation on P2P sockets.
struct P2PSendPacketMetrics {
  P2PSendPacketMetrics() {}
  P2PSendPacketMetrics(uint64_t packet_id,
                       int32_t rtc_packet_id,
                       base::TimeTicks send_time)
      : packet_id(packet_id),
        rtc_packet_id(rtc_packet_id),
        send_time(send_time) {}

  uint64_t packet_id = 0;
  // rtc_packet_id is a sequential packet counter written in the RTP header and
  // used by RTP receivers to ACK received packets. It is sent back with a
  // corresponding send time to WebRTC in the browser process so that it can be
  // combined with ACKs to compute inter-packet delay variations.
  int32_t rtc_packet_id = -1;
  base::TimeTicks send_time;
};

// Struct that carries a port range.
struct P2PPortRange {
  P2PPortRange() : P2PPortRange(0, 0) {}
  P2PPortRange(uint16_t min_port, uint16_t max_port)
      : min_port(min_port), max_port(max_port) {
    DCHECK_LE(min_port, max_port);
    DCHECK((min_port == 0 && max_port == 0) || min_port > 0);
  }
  uint16_t min_port;
  uint16_t max_port;
};

}  // namespace content

#endif  // CONTENT_COMMON_P2P_SOCKET_TYPE_H_
