/*
 * Copyright (c) 2016 Intel Corporation.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief IEEE 802.15.4 Frame API header
 */

#ifndef __IEEE802154_FRAME_H__
#define __IEEE802154_FRAME_H__

#include <kernel.h>
#include <net/net_pkt.h>

#define IEEE802154_MTU				127
#define IEEE802154_MIN_LENGTH			3
/* See Section 5.2.1.4 */
#define IEEE802154_BROADCAST_ADDRESS		0xFFFF
#define IEEE802154_BROADCAST_PAN_ID		0xFFFF
/* ACK packet size is the minimum size, see Section 5.2.2.3 */
#define IEEE802154_ACK_PKT_LENGTH		IEEE802154_MIN_LENGTH
#define IEEE802154_MFR_LENGTH			2

#define IEEE802154_EXT_ADDR_LENGTH		8
#define IEEE802154_SHORT_ADDR_LENGTH		2
#define IEEE802154_SIMPLE_ADDR_LENGTH		1
#define IEEE802154_PAN_ID_LENGTH		2

#define IEEE802154_BEACON_MIN_SIZE		4
#define IEEE802154_BEACON_SF_SIZE		2
#define IEEE802154_BEACON_GTS_SPEC_SIZE		1
#define IEEE802154_BEACON_GTS_IF_MIN_SIZE	IEEE802154_BEACON_GTS_SPEC_SIZE
#define IEEE802154_BEACON_PAS_SPEC_SIZE		1
#define IEEE802154_BEACON_PAS_IF_MIN_SIZE	IEEE802154_BEACON_PAS_SPEC_SIZE
#define IEEE802154_BEACON_GTS_DIR_SIZE		1
#define IEEE802154_BEACON_GTS_SIZE		3
#define IEEE802154_BEACON_GTS_RX		1
#define IEEE802154_BEACON_GTS_TX		0

/* See Section 5.2.1.1.1 */
enum ieee802154_frame_type {
	IEEE802154_FRAME_TYPE_BEACON		= 0x0,
	IEEE802154_FRAME_TYPE_DATA		= 0x1,
	IEEE802154_FRAME_TYPE_ACK		= 0x2,
	IEEE802154_FRAME_TYPE_MAC_COMMAND	= 0x3,
	IEEE802154_FRAME_TYPE_LLDN		= 0x4,
	IEEE802154_FRAME_TYPE_MULTIPURPOSE	= 0x5,
	IEEE802154_FRAME_TYPE_RESERVED		= 0x6,
};

/* See Section 5.2.1.1.6 */
enum ieee802154_addressing_mode {
	IEEE802154_ADDR_MODE_NONE		= 0x0,
	IEEE802154_ADDR_MODE_SIMPLE		= 0x1,
	IEEE802154_ADDR_MODE_SHORT		= 0x2,
	IEEE802154_ADDR_MODE_EXTENDED		= 0x3,
};

/** Versions 2003/2006 do no support simple addressing mode */
#define IEEE802154_ADDR_MODE_RESERVED		IEEE802154_ADDR_MODE_SIMPLE

/* See Section 5.2.1.1.7 */
enum ieee802154_version {
	IEEE802154_VERSION_802154_2003		= 0x0,
	IEEE802154_VERSION_802154_2006		= 0x1,
	IEEE802154_VERSION_802154		= 0x2,
	IEEE802154_VERSION_RESERVED		= 0x3,
};

/*
 * Frame Control Field and sequence number
 * See Section 5.2.1.1
 */
struct ieee802154_fcf_seq {
	struct {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
		u16_t frame_type		:3;
		u16_t security_enabled		:1;
		u16_t frame_pending		:1;
		u16_t ar			:1;
		u16_t pan_id_comp		:1;
		u16_t reserved			:1;
		u16_t seq_num_suppr		:1;
		u16_t ie_list			:1;
		u16_t dst_addr_mode		:2;
		u16_t frame_version		:2;
		u16_t src_addr_mode		:2;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
		u16_t reserved			:1;
		u16_t pan_id_comp		:1;
		u16_t ar			:1;
		u16_t frame_pending		:1;
		u16_t security_enabled		:1;
		u16_t frame_type		:3;
		u16_t src_addr_mode		:2;
		u16_t frame_version		:2;
		u16_t dst_addr_mode		:2;
		u16_t ie_list			:1;
		u16_t seq_num_suppr		:1;
#endif
	} fc __packed;

	u8_t sequence;
} __packed;

struct ieee802154_address {
	union {
		u8_t simple_addr;
		u16_t short_addr;
		u8_t ext_addr[0];
	};
} __packed;

struct ieee802154_address_field_comp {
	struct ieee802154_address addr;
} __packed;

struct ieee802154_address_field_plain {
	u16_t pan_id;
	struct ieee802154_address addr;
} __packed;

struct ieee802154_address_field {
	union {
		struct ieee802154_address_field_plain plain;
		struct ieee802154_address_field_comp comp;
	};
} __packed;

/* See Section 7.4.1.1 */
enum ieee802154_security_level {
	IEEE802154_SECURITY_LEVEL_NONE			= 0x0,
	IEEE802154_SECURITY_LEVEL_MIC_32		= 0x1,
	IEEE802154_SECURITY_LEVEL_MIC_64		= 0x2,
	IEEE802154_SECURITY_LEVEL_MIC_128		= 0x3,
	IEEE802154_SECURITY_LEVEL_ENC			= 0x4,
	IEEE802154_SECURITY_LEVEL_ENC_MIC_32		= 0x5,
	IEEE802154_SECURITY_LEVEL_ENC_MIC_64		= 0x6,
	IEEE802154_SECURITY_LEVEL_ENC_MIC_128		= 0x7,
};

/* This will match above *_MIC_<32/64/128> */
#define IEEE8021254_AUTH_TAG_LENGTH_32			4
#define IEEE8021254_AUTH_TAG_LENGTH_64			8
#define IEEE8021254_AUTH_TAG_LENGTH_128			16

/* See Section 7.4.1.2 */
enum ieee802154_key_id_mode {
	IEEE802154_KEY_ID_MODE_IMPLICIT			= 0x0,
	IEEE802154_KEY_ID_MODE_INDEX			= 0x1,
	IEEE802154_KEY_ID_MODE_SRC_4_INDEX		= 0x2,
	IEEE802154_KEY_ID_MODE_SRC_8_INDEX		= 0x3,
};

#define IEEE8021254_KEY_ID_FIELD_INDEX_LENGTH		1
#define IEEE8021254_KEY_ID_FIELD_SRC_4_INDEX_LENGTH	5
#define IEEE8021254_KEY_ID_FIELD_SRC_8_INDEX_LENGTH	9

#define IEEE802154_KEY_MAX_LEN				16

/* See Section 7.4.1 */
struct ieee802154_security_control_field {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
	u8_t security_level	:3;
	u8_t key_id_mode	:2;
	u8_t reserved		:3;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
	u8_t reserved		:3;
	u8_t key_id_mode	:2;
	u8_t security_level	:3;
#endif
} __packed;

#define IEEE802154_SECURITY_CF_LENGTH	1

/* See Section 7.4.3 */
struct ieee802154_key_identifier_field {
	union {
		/* mode_0 being implicit, it holds no info here */
		struct {
			u8_t key_index;
		} mode_1;

		struct {
			u8_t key_src[4];
			u8_t key_index;
		} mode_2;

		struct {
			u8_t key_src[8];
			u8_t key_index;
		} mode_3;
	};
} __packed;

/*
 * Auxiliary Security Header
 * See Section 7.4
 */
struct ieee802154_aux_security_hdr {
	struct ieee802154_security_control_field control;
	u32_t frame_counter;
	struct ieee802154_key_identifier_field kif;
} __packed;

#define IEEE802154_SECURITY_FRAME_COUNTER_LENGTH 4

/** MAC header */
struct ieee802154_mhr {
	struct ieee802154_fcf_seq *fs;
	struct ieee802154_address_field *dst_addr;
	struct ieee802154_address_field *src_addr;
#ifdef CONFIG_NET_L2_IEEE802154_SECURITY
	struct ieee802154_aux_security_hdr *aux_sec;
#endif
};

struct ieee802154_mfr {
	u16_t fcs;
};

struct ieee802154_gts_dir {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
	u8_t mask			: 7;
	u8_t reserved			: 1;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
	u8_t reserved			: 1;
	u8_t mask			: 7;
#endif
} __packed;

struct ieee802154_gts {
	u16_t short_address;
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
	u8_t starting_slot		: 4;
	u8_t length			: 4;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
	u8_t length			: 4;
	u8_t starting_slot		: 4;
#endif
} __packed;

struct ieee802154_gts_spec {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
	/* Descriptor Count */
	u8_t desc_count			: 3;
	u8_t reserved			: 4;
	/* GTS Permit */
	u8_t permit			: 1;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
	/* GTS Permit */
	u8_t permit			: 1;
	u8_t reserved			: 4;
	/* Descriptor Count */
	u8_t desc_count			: 3;
#endif
} __packed;

struct ieee802154_pas_spec {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
	/* Number of Short Addresses Pending */
	u8_t nb_sap			: 3;
	u8_t reserved_1			: 1;
	/* Number of Extended Addresses Pending */
	u8_t nb_eap			: 3;
	u8_t reserved_2			: 1;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
	u8_t reserved_1			: 1;
	/* Number of Extended Addresses Pending */
	u8_t nb_eap			: 3;
	u8_t reserved_2			: 1;
	/* Number of Short Addresses Pending */
	u8_t nb_sap			: 3;
#endif
} __packed;

struct ieee802154_beacon_sf {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
	/* Beacon Order*/
	u16_t bc_order		: 4;
	/* Superframe Order*/
	u16_t sf_order		: 4;
	/* Final CAP Slot */
	u16_t cap_slot		: 4;
	/* Battery Life Extension */
	u16_t ble		: 1;
	u16_t reserved		: 1;
	/* PAN Coordinator */
	u16_t coordinator	: 1;
	/* Association Permit */
	u16_t association	: 1;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
	/* Superframe Order*/
	u16_t sf_order		: 4;
	/* Beacon Order*/
	u16_t bc_order		: 4;
	/* Association Permit */
	u16_t association	: 1;
	/* PAN Coordinator */
	u16_t coordinator	: 1;
	u16_t reserved		: 1;
	/* Battery Life Extension */
	u16_t ble		: 1;
	/* Final CAP Slot */
	u16_t cap_slot		: 4;
#endif
} __packed;

struct ieee802154_beacon {
	struct ieee802154_beacon_sf sf;

	/* GTS Fields - Spec is always there */
	struct ieee802154_gts_spec gts;
} __packed;

/* See Section 5.3.1 */
struct ieee802154_cmd_assoc_req {
	struct {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
		u8_t reserved_1		: 1;
		u8_t dev_type		: 1;
		u8_t power_src		: 1;
		u8_t rx_on		: 1;
		u8_t reserved_2		: 2;
		u8_t sec_capability	: 1;
		u8_t alloc_addr		: 1;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
		u8_t alloc_addr		: 1;
		u8_t sec_capability	: 1;
		u8_t reserved_2		: 2;
		u8_t rx_on		: 1;
		u8_t power_src		: 1;
		u8_t dev_type		: 1;
		u8_t reserved_1		: 1;
#endif
	} ci;
} __packed;

/* See Section 5.3.2 */
enum ieee802154_association_status_field {
	IEEE802154_ASF_SUCCESSFUL		= 0x00,
	IEEE802154_ASF_PAN_AT_CAPACITY		= 0x01,
	IEEE802154_ASF_PAN_ACCESS_DENIED	= 0x02,
	IEEE802154_ASF_RESERVED			= 0x03,
	IEEE802154_ASF_RESERVED_PRIMITIVES	= 0x80,
};

struct ieee802154_cmd_assoc_res {
	u16_t short_addr;
	u8_t status;
} __packed;

/* See Section 5.3.3 */
enum ieee802154_disassociation_reason_field {
	IEEE802154_DRF_RESERVED_1		= 0x00,
	IEEE802154_DRF_COORDINATOR_WISH		= 0x01,
	IEEE802154_DRF_DEVICE_WISH		= 0x02,
	IEEE802154_DRF_RESERVED_2		= 0x03,
	IEEE802154_DRF_RESERVED_PRIMITIVES	= 0x80,
};

struct ieee802154_cmd_disassoc_note {
	u8_t reason;
} __packed;

/* See Section 5.3.8 */
struct ieee802154_cmd_coord_realign {
	u16_t pan_id;
	u16_t coordinator_short_addr;
	u8_t channel;
	u16_t short_addr;
	u8_t channel_page; /* Optional */
} __packed;

/* See Section 5.3.9 */
struct ieee802154_gts_request {
	struct {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
		u8_t length		: 4;
		u8_t direction		: 1;
		u8_t type		: 1;
		u8_t reserved		: 2;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
		u8_t reserved		: 2;
		u8_t type		: 1;
		u8_t direction		: 1;
		u8_t length		: 4;
#endif
	} gts;
} __packed;

/* See Section 5.3 */
enum ieee802154_cfi {
	IEEE802154_CFI_UNKNOWN				= 0x00,
	IEEE802154_CFI_ASSOCIATION_REQUEST		= 0x01,
	IEEE802154_CFI_ASSOCIATION_RESPONSE		= 0x02,
	IEEE802154_CFI_DISASSOCIATION_NOTIFICATION	= 0x03,
	IEEE802154_CFI_DATA_REQUEST			= 0x04,
	IEEE802154_CFI_PAN_ID_CONLICT_NOTIFICATION	= 0x05,
	IEEE802154_CFI_ORPHAN_NOTIFICATION		= 0x06,
	IEEE802154_CFI_BEACON_REQUEST			= 0x07,
	IEEE802154_CFI_COORDINATOR_REALIGNEMENT		= 0x08,
	IEEE802154_CFI_GTS_REQUEST			= 0x09,
	IEEE802154_CFI_RESERVED				= 0x0a,
};

struct ieee802154_command {
	u8_t cfi;
	union {
		struct ieee802154_cmd_assoc_req assoc_req;
		struct ieee802154_cmd_assoc_res assoc_res;
		struct ieee802154_cmd_disassoc_note disassoc_note;
		struct ieee802154_cmd_coord_realign coord_realign;
		struct ieee802154_gts_request gts_request;
		/* Data request, PAN ID conflict, Orphan notification
		 * or Beacon request do not provide more than the CIF.
		 */
	};
} __packed;

/** Frame */
struct ieee802154_mpdu {
	struct ieee802154_mhr mhr;
	union {
		void *payload;
		struct ieee802154_beacon *beacon;
		struct ieee802154_command *command;
	};
	struct ieee802154_mfr *mfr;
} __packed;

/** Frame build parameters */
struct ieee802154_frame_params {
	struct {
		union {
			u8_t *ext_addr;
			u16_t short_addr;
		};

		u16_t len;
		u16_t pan_id;
	} dst;

	u16_t short_addr;
	u16_t pan_id;
} __packed;

#ifdef CONFIG_NET_L2_IEEE802154_SECURITY
struct ieee802154_aux_security_hdr *
ieee802154_validate_aux_security_hdr(u8_t *buf, u8_t **p_buf);
#endif

bool ieee802154_validate_frame(u8_t *buf, u8_t length,
			       struct ieee802154_mpdu *mpdu);

u16_t ieee802154_compute_header_size(struct net_if *iface,
					struct in6_addr *dst);

bool ieee802154_create_data_frame(struct ieee802154_context *ctx,
				  struct net_linkaddr *dst,
				  struct net_buf *frag,
				  u8_t reserved_len);

struct net_pkt *
ieee802154_create_mac_cmd_frame(struct ieee802154_context *ctx,
				enum ieee802154_cfi type,
				struct ieee802154_frame_params *params);

static inline
struct ieee802154_command *ieee802154_get_mac_command(struct net_pkt *pkt)
{
	return (struct ieee802154_command *)net_pkt_ip_data(pkt);
}

#ifdef CONFIG_NET_L2_IEEE802154_ACK_REPLY
bool ieee802154_create_ack_frame(struct net_if *iface,
				 struct net_pkt *pkt, u8_t seq);
#endif

static inline bool ieee802154_ack_required(struct net_pkt *pkt)
{
	struct ieee802154_fcf_seq *fs =
		(struct ieee802154_fcf_seq *)net_pkt_ll(pkt);

	return fs->fc.ar;
}

#ifdef CONFIG_NET_L2_IEEE802154_SECURITY
bool ieee802154_decipher_data_frame(struct net_if *iface, struct net_pkt *pkt,
				    struct ieee802154_mpdu *mpdu);
#else
#define ieee802154_decipher_data_frame(...) true
#endif /* CONFIG_NET_L2_IEEE802154_SECURITY */

#endif /* __IEEE802154_FRAME_H__ */
