#ifndef _RTPE_COMMON_STATS_H_
#define _RTPE_COMMON_STATS_H_


#ifdef __KERNEL__
typedef atomic64_t atomic64;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0)
static_assert(sizeof(atomic64_t) == sizeof(int64_t), "atomic64_t != int64_t");
static_assert(sizeof(atomic_t) == sizeof(int), "atomic_t != int");
// else: hope for the best
#endif
#else
typedef int atomic_t;
#endif


struct interface_counter_stats_dir {
#define F(n) atomic64 n;
#include "interface_counter_stats_fields_dir.inc"
#undef F
};
struct interface_counter_stats {
#define F(n) atomic64 n;
#include "interface_counter_stats_fields.inc"
#undef F
};
struct interface_sampled_stats_fields {
#define F(n) atomic64 n;
#include "interface_sampled_stats_fields.inc"
#undef F
};
struct interface_sampled_stats {
	struct interface_sampled_stats_fields sums;
	struct interface_sampled_stats_fields sums_squared;
	struct interface_sampled_stats_fields counts;
};
struct interface_sampled_stats_avg {
	struct interface_sampled_stats_fields avg;
	struct interface_sampled_stats_fields stddev;
};
struct interface_stats_block {
	struct interface_counter_stats_dir	in,
						out;
	struct interface_counter_stats		s;
	struct interface_sampled_stats		sampled;
};

struct stream_stats {
	atomic64			packets;
	atomic64			bytes;
	atomic64			errors;
	atomic64			last_packet_us;
	atomic_t			tos;
};

struct rtp_stats {
	unsigned int		payload_type;
	uint32_t		clock_rate;
	atomic64		packets;
	atomic64		bytes;
	atomic64		kernel_packets;
	atomic64		kernel_bytes;
};
struct ssrc_stats {
	atomic64		packets;
	atomic64		bytes;
	atomic_t		timestamp;
	atomic_t		ext_seq;
	atomic_t		rtcp_seq;
	uint32_t		lost_bits; // sliding bitfield, [0] = ext_seq
	atomic_t		total_lost;
	atomic_t		transit;
	atomic_t		jitter;
	atomic64		last_packet_us;
	atomic_t		last_pt;
};

#endif
