/*
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#define LL_SYNC_STATE_IDLE       0x00
#define LL_SYNC_STATE_ADDR_MATCH 0x01
#define LL_SYNC_STATE_CREATED    0x02

#if defined(CONFIG_BT_CTLR_SYNC_ISO)
struct ll_sync_iso_set;
#endif /* CONFIG_BT_CTLR_SYNC_ISO */

struct ll_sync_set {
	struct ull_hdr ull;
	struct lll_sync lll;

	uint16_t skip;
	uint16_t timeout;
	/* Non-zero when sync is setup. It can be in two sub-stated:
	 * - Waiting for first AUX_SYNC_IND, before sync established was notified to Host.
	 *   If sync establishment is in progress node_rx_sync_estab is not NULL.
	 * - sync is already established, node_rx_sync_estab is NULL.
	 */
	uint16_t volatile timeout_reload;
	uint16_t timeout_expire;

	/* Member to store periodic advertising sync prepare.
	 * Also serves as a flag to inform if sync established was
	 * already generated.
	 */
	void (*lll_sync_prepare)(void *param);

#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_SYNC) || \
	defined(CONFIG_BT_CTLR_SYNC_PERIODIC_ADI_SUPPORT)
	uint8_t peer_id_addr[BDADDR_SIZE];
	uint8_t peer_id_addr_type:1;
#endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_SYNC ||
	* CONFIG_BT_CTLR_SYNC_PERIODIC_ADI_SUPPORT
	*/

	uint8_t rx_enable:1;

#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC_ADI_SUPPORT)
	uint8_t nodups:1;
#endif

#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC_CTE_TYPE_FILTERING) && \
	!defined(CONFIG_BT_CTLR_CTEINLINE_SUPPORT)
	/* Member used to notify event done handler to terminate sync scanning.
	 * Used only when no HW support for parsing PDU for CTEInfo.
	 */
	uint8_t is_term:1;
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC_CTE_TYPE_FILTERING && !CONFIG_BT_CTLR_CTEINLINE_SUPPORT */

	uint8_t is_stop:1; /* sync terminate or cancel requested */
	uint8_t sync_expire:3; /* countdown of 6 before fail to establish */

#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_SYNC)
	uint8_t sid;
#endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_SYNC */

	/* node rx type with memory aligned storage for sync lost reason.
	 * HCI will reference the value using the pdu member of
	 * struct node_rx_pdu.
	 */
	struct {
		struct node_rx_hdr hdr;
		union {
			uint8_t    pdu[0] __aligned(4);
			uint8_t    reason;
		};
	} node_rx_lost;

	/* Not-Null when sync was setup and Controller is waiting for first AUX_SYNC_IND PDU.
	 * It means the sync was not estalished yet.
	 */
	struct node_rx_hdr *node_rx_sync_estab;

#if defined(CONFIG_BT_CTLR_SYNC_ISO)
	struct {
		struct node_rx_hdr *node_rx_estab;

		/* Non-Null when creating sync, reset in ISR context on
		 * synchronisation state and checked in Thread context when
		 * cancelling sync create, hence the volatile keyword.
		 */
		struct ll_sync_iso_set *volatile sync_iso;
	} iso;
#endif /* CONFIG_BT_CTLR_SYNC_ISO */

	uint16_t data_len;
};

struct node_rx_sync {
	uint8_t status;
	uint8_t  phy;
	uint16_t interval;
	uint8_t  sca;
};

#if defined(CONFIG_BT_CTLR_SYNC_ISO)
struct ll_sync_iso_set {
	struct ull_hdr ull;
	struct lll_sync_iso lll;

	/* Periodic Advertising Sync that contained the BIGInfo */
	struct ll_sync_set *sync;

	uint16_t timeout;

	uint16_t volatile timeout_reload; /* Non-zero when sync established */
	uint16_t timeout_expire;

	/* node rx type with memory aligned storage for sync lost reason.
	 * HCI will reference the value using the pdu member of
	 * struct node_rx_pdu.
	 */
	struct {
		struct node_rx_hdr hdr;
		union {
			uint8_t pdu[0] __aligned(4);
			struct {
				uint8_t handle;
				uint8_t reason;
			};
		};
	} node_rx_lost;
};

struct node_rx_sync_iso {
	uint8_t status;
	uint16_t interval;
};
#endif /* CONFIG_BT_CTLR_SYNC_ISO */
