// Copyright 2013 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 NET_QUIC_QUIC_CONNECTION_STATS_H_
#define NET_QUIC_QUIC_CONNECTION_STATS_H_

#include <ostream>

#include "base/basictypes.h"
#include "net/base/net_export.h"
#include "net/quic/quic_time.h"

namespace net {
// Structure to hold stats for a QuicConnection.
struct NET_EXPORT_PRIVATE QuicConnectionStats {
  QuicConnectionStats();
  ~QuicConnectionStats();

  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
      std::ostream& os, const QuicConnectionStats& s);

  uint64 bytes_sent;  // Includes retransmissions, fec.
  uint32 packets_sent;
  uint64 stream_bytes_sent;  // non-retransmitted bytes sent in a stream frame.
  uint32 packets_discarded;  // Packets serialized and discarded before sending.

  // These include version negotiation and public reset packets, which do not
  // have sequence numbers or frame data.
  uint64 bytes_received;  // Includes duplicate data for a stream, fec.
  uint32 packets_received;  // Includes packets which were not processable.
  uint32 packets_processed;  // Excludes packets which were not processable.
  uint64 stream_bytes_received;  // Bytes received in a stream frame.

  uint64 bytes_retransmitted;
  uint32 packets_retransmitted;

  uint64 bytes_spuriously_retransmitted;
  uint32 packets_spuriously_retransmitted;
  // Number of packets abandoned as lost by the loss detection algorithm.
  uint32 packets_lost;
  uint32 slowstart_packets_lost;  // Number of packets lost exiting slow start.

  uint32 packets_revived;
  uint32 packets_dropped;  // Duplicate or less than least unacked.
  uint32 crypto_retransmit_count;
  // Count of times the loss detection alarm fired.  At least one packet should
  // be lost when the alarm fires.
  uint32 loss_timeout_count;
  uint32 tlp_count;
  uint32 rto_count;  // Count of times the rto timer fired.

  uint32 min_rtt_us;  // Minimum RTT in microseconds.
  uint32 srtt_us;  // Smoothed RTT in microseconds.
  uint32 max_packet_size;  // In bytes.
  uint64 estimated_bandwidth;  // In bytes per second.
  uint32 congestion_window;  // In bytes

  // Reordering stats for received packets.
  // Number of packets received out of sequence number order.
  uint32 packets_reordered;
  // Maximum reordering observed in sequence space.
  uint32 max_sequence_reordering;
  // Maximum reordering observed in microseconds
  uint32 max_time_reordering_us;

  // The following stats are used only in TcpCubicSender.
  // The number of loss events from TCP's perspective.  Each loss event includes
  // one or more lost packets.
  uint32 tcp_loss_events;
  // Total amount of cwnd increase by TCPCubic in congestion avoidance.
  uint32 cwnd_increase_congestion_avoidance;
  // Total amount of cwnd increase by TCPCubic in cubic mode.
  uint32 cwnd_increase_cubic_mode;

  // Creation time, as reported by the QuicClock.
  QuicTime connection_creation_time;
};

}  // namespace net

#endif  // NET_QUIC_QUIC_CONNECTION_STATS_H_