/* (C)2016 Quantenna Communications Inc. */

/* Common structures for netdebug - userspace/kernelspace interface */
#ifndef __PKTLOGGER_NL_COMMON_H__
#define __PKTLOGGER_NL_COMMON_H__


#define PKTLOGGER_MSG_MAGIC 0x79FFA904

/* Magic, version, type, length then variable value. */
struct pktlogger_nl_hdr_t
{
	uint32_t magic;
	uint32_t mver;
	uint32_t mtype;
	uint32_t mlen;
	uint32_t mseq;
	uint8_t  msg[0];
};

enum pktlogger_nl_msg
{
	PKTLOGGER_NETLINK_MTYPE_QUERY        = 1,
	PKTLOGGER_NETLINK_MTYPE_CONFIG       = 2,
	PKTLOGGER_NETLINK_MTYPE_CONFIG_ONE   = 3,
	PKTLOGGER_NETLINK_MTYPE_PTYPE_CONFIG = 4
};

struct pktlogger_nl_query_t
{
	struct pktlogger_nl_hdr_t hdr;
	uint32_t query_num;
	uint32_t arg1;
	uint32_t arg2;
	uint8_t data[0];
};

struct pktlogger_nl_pktlog_config_t
{
	uint16_t type;
	uint16_t flags;
	char     name[16];
	uint32_t rate;
	uint32_t history;
	uint16_t struct_bsize;
	uint16_t struct_vsize;
};

struct pktlogger_nl_radio_config_t
{
	uint32_t destip;	/* Network endian destination IP address for pktlogger data.       */
	uint32_t srcip;
	uint8_t  destmac[6];	/* Destination MAC address.                                        */
	uint8_t  srcmac[6];	/* Source MAC address.                                             */
	uint16_t destport;	/* UDP dest port for this radio.                                   */
	uint16_t srcport;	/* UDP src port for this radio.                                    */
	uint32_t pktlog_ver_cnt;/*  0x000000FF: Number of entries in the pktlog_configs array,
				0x00FFFF00: reserved
				0xFF000000: Version of pktlog_types.                               */
	char     radioname[16];	/* Radio name (eg, wifi0, wifi1, wifi2).
				Filled out on query, ignored on configuration.                     */
	struct   pktlogger_nl_pktlog_config_t pktlog_configs[16];	/* Per-pktlogger config.
									Pointer to the first element. */
};

struct pktlogger_nl_config_t
{
	uint32_t rev;
	uint32_t rcontrol;
	struct pktlogger_nl_radio_config_t per_radio[3];
};

struct pktlogger_nl_config_one_t
{
	uint32_t radio_index;
	struct pktlogger_nl_pktlog_config_t config;
};

struct pktlogger_nl_config_set_t
{
	struct pktlogger_nl_hdr_t hdr;
	struct pktlogger_nl_config_t config;
};

struct pktlogger_nl_config_oneset_t
{
	struct pktlogger_nl_hdr_t hdr;
	struct pktlogger_nl_config_one_t config;
};

enum pktlogger_nl_query
{
	PKTLOGGER_QUERY_STRUCT       = 0,
	PKTLOGGER_QUERY_CONFIG       = 1,
	PKTLOGGER_QUERY_CONFIG_ONE   = 2,
	PKTLOGGER_QUERY_PTYPE_CONFIG = 3
};

/* pktlogger header - for all incoming data frames */
struct pktlogger_nl_pktlogger_hdr
{
	struct udphdr hdr;
	uint8_t type;
	uint8_t opmode;
	/**
	 * The source address (the bridge MAC address).
	 */
	unsigned char src[6];
	u_int32_t version;
	u_int32_t builddate;
	/**
	 * Identifying string to easily see in packet dumps that this is a packetlogger packet.
	 */
	char buildstring[32];
	u_int8_t flags;

	/**
	 * Epoch timestamp.
	 */
	u_int32_t timestamp;
	/**
	 * TSF timestamp low bytes.
	 */
	u_int32_t tsf_lo;
	/**
	 * TSF timestamp high bytes.
	 */
	u_int32_t tsf_hi;

	u_int32_t platform;
	u_int32_t stats_len;
	char padding[3];     /* Word align data start */
} __attribute__((__packed__));

#endif
