/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 *
 *  BlueZ - Bluetooth protocol stack for Linux
 *
 *  Copyright (C) 2013  Intel Corporation. All rights reserved.
 *
 *
 */

static const char BLUEZ_HAL_SK_PATH[] = "\0bluez_hal_socket";

#define HAL_MINIMUM_EVENT		0x81

#define HAL_SERVICE_ID_CORE		0
#define HAL_SERVICE_ID_BLUETOOTH	1
#define HAL_SERVICE_ID_SOCKET		2
#define HAL_SERVICE_ID_HIDHOST		3
#define HAL_SERVICE_ID_PAN		4
#define HAL_SERVICE_ID_HANDSFREE	5
#define HAL_SERVICE_ID_A2DP		6
#define HAL_SERVICE_ID_HEALTH		7
#define HAL_SERVICE_ID_AVRCP		8
#define HAL_SERVICE_ID_GATT		9
#define HAL_SERVICE_ID_HANDSFREE_CLIENT	10
#define HAL_SERVICE_ID_MAP_CLIENT	11
#define HAL_SERVICE_ID_AVRCP_CTRL	12
#define HAL_SERVICE_ID_A2DP_SINK	13

#define HAL_SERVICE_ID_MAX HAL_SERVICE_ID_A2DP_SINK

/* Core Service */

#define HAL_STATUS_SUCCESS		IPC_STATUS_SUCCESS
#define HAL_STATUS_FAILED		0x01
#define HAL_STATUS_NOT_READY		0x02
#define HAL_STATUS_NOMEM		0x03
#define HAL_STATUS_BUSY			0x04
#define HAL_STATUS_DONE			0x05
#define HAL_STATUS_UNSUPPORTED		0x06
#define HAL_STATUS_INVALID		0x07
#define HAL_STATUS_UNHANDLED		0x08
#define HAL_STATUS_AUTH_FAILURE		0x09
#define HAL_STATUS_REMOTE_DEVICE_DOWN	0x0a

#define HAL_OP_STATUS			IPC_OP_STATUS

#define HAL_MODE_DEFAULT		0x00
#define HAL_MODE_BREDR			0x01
#define HAL_MODE_LE			0x02

#define HAL_OP_REGISTER_MODULE		0x01
struct hal_cmd_register_module {
	uint8_t service_id;
	uint8_t mode;
	int32_t max_clients;
} __attribute__((packed));

#define HAL_OP_UNREGISTER_MODULE	0x02
struct hal_cmd_unregister_module {
	uint8_t service_id;
} __attribute__((packed));

#define HAL_CONFIG_VENDOR		0x00
#define HAL_CONFIG_MODEL		0x01
#define HAL_CONFIG_NAME			0x02
#define HAL_CONFIG_SERIAL_NUMBER	0x03
#define HAL_CONFIG_SYSTEM_ID		0x04
#define HAL_CONFIG_PNP_ID		0x05
#define HAL_CONFIG_FW_REV		0x06
#define HAL_CONFIG_HW_REV		0x07

struct hal_config_prop {
	uint8_t type;
	uint16_t len;
	uint8_t val[0];
} __attribute__((packed));

#define HAL_OP_CONFIGURATION		0x03
struct hal_cmd_configuration {
	uint8_t num;
	struct hal_config_prop props[0];
} __attribute__((packed));

/* Bluetooth Core HAL API */

#define HAL_OP_ENABLE			0x01

#define HAL_OP_DISABLE			0x02

#define HAL_OP_GET_ADAPTER_PROPS	0x03

#define HAL_OP_GET_ADAPTER_PROP		0x04
struct hal_cmd_get_adapter_prop {
	uint8_t type;
} __attribute__((packed));

#define HAL_MAX_NAME_LENGTH		249

#define HAL_PROP_ADAPTER_NAME			0x01
#define HAL_PROP_ADAPTER_ADDR			0x02
#define HAL_PROP_ADAPTER_UUIDS			0x03
#define HAL_PROP_ADAPTER_CLASS			0x04
#define HAL_PROP_ADAPTER_TYPE			0x05
#define HAL_PROP_ADAPTER_SERVICE_REC		0x06
#define HAL_PROP_ADAPTER_SCAN_MODE		0x07
#define HAL_PROP_ADAPTER_BONDED_DEVICES		0x08
#define HAL_PROP_ADAPTER_DISC_TIMEOUT		0x09

#define HAL_PROP_DEVICE_NAME			0x01
#define HAL_PROP_DEVICE_ADDR			0x02
#define HAL_PROP_DEVICE_UUIDS			0x03
#define HAL_PROP_DEVICE_CLASS			0x04
#define HAL_PROP_DEVICE_TYPE			0x05
#define HAL_PROP_DEVICE_SERVICE_REC		0x06
struct hal_prop_device_service_rec {
	uint8_t uuid[16];
	uint16_t channel;
	uint8_t name_len;
	uint8_t name[];
} __attribute__((packed));

#define HAL_PROP_DEVICE_FRIENDLY_NAME		0x0a
#define HAL_PROP_DEVICE_RSSI			0x0b
#define HAL_PROP_DEVICE_VERSION_INFO		0x0c
struct hal_prop_device_info {
	uint8_t version;
	uint16_t sub_version;
	uint16_t manufacturer;
} __attribute__((packed));

#define HAL_PROP_ADAPTER_LOCAL_LE_FEAT		0x0d
#define HAL_PROP_DEVICE_TIMESTAMP		0xFF

#define HAL_ADAPTER_SCAN_MODE_NONE		0x00
#define HAL_ADAPTER_SCAN_MODE_CONN		0x01
#define HAL_ADAPTER_SCAN_MODE_CONN_DISC	0x02

#define HAL_TYPE_BREDR				0x01
#define HAL_TYPE_LE				0x02
#define HAL_TYPE_DUAL				0x03

#define HAL_OP_SET_ADAPTER_PROP		0x05
struct hal_cmd_set_adapter_prop {
	uint8_t  type;
	uint16_t len;
	uint8_t  val[0];
} __attribute__((packed));

#define HAL_OP_GET_REMOTE_DEVICE_PROPS	0x06
struct hal_cmd_get_remote_device_props {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_GET_REMOTE_DEVICE_PROP	0x07
struct hal_cmd_get_remote_device_prop {
	uint8_t bdaddr[6];
	uint8_t type;
} __attribute__((packed));

#define HAL_OP_SET_REMOTE_DEVICE_PROP	0x08
struct hal_cmd_set_remote_device_prop {
	uint8_t  bdaddr[6];
	uint8_t  type;
	uint16_t len;
	uint8_t  val[0];
} __attribute__((packed));

#define HAL_OP_GET_REMOTE_SERVICE_REC	0x09
struct hal_cmd_get_remote_service_rec {
	uint8_t bdaddr[6];
	uint8_t uuid[16];
} __attribute__((packed));

#define HAL_OP_GET_REMOTE_SERVICES	0x0a
struct hal_cmd_get_remote_services {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_START_DISCOVERY		0x0b

#define HAL_OP_CANCEL_DISCOVERY		0x0c

#define BT_TRANSPORT_UNKNOWN		0x00
#define BT_TRANSPORT_BR_EDR		0x01
#define BT_TRANSPORT_LE			0x02

#define HAL_OP_CREATE_BOND		0x0d
struct hal_cmd_create_bond {
	uint8_t bdaddr[6];
	uint8_t transport;
} __attribute__((packed));

#define HAL_OP_REMOVE_BOND		0x0e
struct hal_cmd_remove_bond {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_CANCEL_BOND		0x0f
struct hal_cmd_cancel_bond {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_PIN_REPLY		0x10
struct hal_cmd_pin_reply {
	uint8_t bdaddr[6];
	uint8_t accept;
	uint8_t pin_len;
	uint8_t pin_code[16];
} __attribute__((packed));

#define HAL_SSP_VARIANT_CONFIRM		0x00
#define HAL_SSP_VARIANT_ENTRY		0x01
#define HAL_SSP_VARIANT_CONSENT		0x02
#define HAL_SSP_VARIANT_NOTIF		0x03

#define HAL_OP_SSP_REPLY		0x11
struct hal_cmd_ssp_reply {
	uint8_t  bdaddr[6];
	uint8_t  ssp_variant;
	uint8_t  accept;
	uint32_t passkey;
} __attribute__((packed));

#define HAL_OP_DUT_MODE_CONF		0x12
struct hal_cmd_dut_mode_conf {
	uint8_t enable;
} __attribute__((packed));

#define HAL_OP_DUT_MODE_SEND		0x13
struct hal_cmd_dut_mode_send {
	uint16_t opcode;
	uint8_t  len;
	uint8_t  data[0];
} __attribute__((packed));

#define HAL_OP_LE_TEST_MODE		0x14
struct hal_cmd_le_test_mode {
	uint16_t opcode;
	uint8_t  len;
	uint8_t  data[0];
} __attribute__((packed));

#define HAL_OP_GET_CONNECTION_STATE	0x15
struct hal_cmd_get_connection_state {
	uint8_t  bdaddr[6];
} __attribute__((packed));

struct hal_rsp_get_connection_state {
	int32_t connection_state;
} __attribute__((packed));

#define HAL_OP_READ_ENERGY_INFO		0x16

/* Bluetooth Socket HAL api */

#define HAL_MODE_SOCKET_DEFAULT		HAL_MODE_DEFAULT
#define HAL_MODE_SOCKET_DYNAMIC_MAP	0x01

#define HAL_SOCK_RFCOMM		0x01
#define HAL_SOCK_SCO		0x02
#define HAL_SOCK_L2CAP		0x03

#define HAL_SOCK_FLAG_ENCRYPT	0x01
#define HAL_SOCK_FLAG_AUTH	0x02

#define HAL_OP_SOCKET_LISTEN		0x01
struct hal_cmd_socket_listen {
	uint8_t type;
	uint8_t name[256];
	uint8_t uuid[16];
	int32_t channel;
	uint8_t flags;
} __attribute__((packed));

#define HAL_OP_SOCKET_CONNECT		0x02
struct hal_cmd_socket_connect {
	uint8_t bdaddr[6];
	uint8_t type;
	uint8_t uuid[16];
	int32_t channel;
	uint8_t flags;
} __attribute__((packed));

/* Bluetooth HID Host HAL API */

#define HAL_OP_HIDHOST_CONNECT		0x01
struct hal_cmd_hidhost_connect {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HIDHOST_DISCONNECT		0x02
struct hal_cmd_hidhost_disconnect {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HIDHOST_VIRTUAL_UNPLUG		0x03
struct hal_cmd_hidhost_virtual_unplug {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HIDHOST_SET_INFO		0x04
struct hal_cmd_hidhost_set_info {
	uint8_t  bdaddr[6];
	uint8_t  attr;
	uint8_t  subclass;
	uint8_t  app_id;
	uint16_t vendor;
	uint16_t product;
	uint16_t country;
	uint16_t descr_len;
	uint8_t  descr[0];
} __attribute__((packed));

#define HAL_HIDHOST_REPORT_PROTOCOL		0x00
#define HAL_HIDHOST_BOOT_PROTOCOL		0x01
#define HAL_HIDHOST_UNSUPPORTED_PROTOCOL	0xff

#define HAL_OP_HIDHOST_GET_PROTOCOL	0x05
struct hal_cmd_hidhost_get_protocol {
	uint8_t bdaddr[6];
	uint8_t mode;
} __attribute__((packed));

#define HAL_OP_HIDHOST_SET_PROTOCOL	0x06
struct hal_cmd_hidhost_set_protocol {
	uint8_t bdaddr[6];
	uint8_t mode;
} __attribute__((packed));

#define HAL_HIDHOST_INPUT_REPORT		0x01
#define HAL_HIDHOST_OUTPUT_REPORT		0x02
#define HAL_HIDHOST_FEATURE_REPORT		0x03

#define HAL_OP_HIDHOST_GET_REPORT		0x07
struct hal_cmd_hidhost_get_report {
	uint8_t  bdaddr[6];
	uint8_t  type;
	uint8_t  id;
	uint16_t buf_size;
} __attribute__((packed));

#define HAL_OP_HIDHOST_SET_REPORT		0x08
struct hal_cmd_hidhost_set_report {
	uint8_t  bdaddr[6];
	uint8_t  type;
	uint16_t len;
	uint8_t  data[0];
} __attribute__((packed));

#define HAL_OP_HIDHOST_SEND_DATA		0x09
struct hal_cmd_hidhost_send_data {
	uint8_t  bdaddr[6];
	uint16_t len;
	uint8_t  data[0];
} __attribute__((packed));

/* a2dp source and sink HAL API */

#define HAL_OP_A2DP_CONNECT	0x01
struct hal_cmd_a2dp_connect {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_A2DP_DISCONNECT	0x02
struct hal_cmd_a2dp_disconnect {
	uint8_t bdaddr[6];
} __attribute__((packed));

/* PAN HAL API */

/* PAN Roles */
#define HAL_PAN_ROLE_NONE	0x00
#define HAL_PAN_ROLE_NAP	0x01
#define HAL_PAN_ROLE_PANU	0x02

/* PAN Control states */
#define HAL_PAN_CTRL_ENABLED	0x00
#define HAL_PAN_CTRL_DISABLED	0x01

/* PAN Connection states */
#define HAL_PAN_STATE_CONNECTED		0x00
#define HAL_PAN_STATE_CONNECTING	0x01
#define HAL_PAN_STATE_DISCONNECTED	0x02
#define HAL_PAN_STATE_DISCONNECTING	0x03

/* PAN status values */
#define HAL_PAN_STATUS_FAIL		0x01
#define HAL_PAN_STATUS_NOT_READY	0x02
#define HAL_PAN_STATUS_NO_MEMORY	0x03
#define HAL_PAN_STATUS_BUSY		0x04
#define HAL_PAN_STATUS_DONE		0x05
#define HAL_PAN_STATUS_UNSUPORTED	0x06
#define HAL_PAN_STATUS_INVAL		0x07
#define HAL_PAN_STATUS_UNHANDLED	0x08
#define HAL_PAN_STATUS_AUTH_FAILED	0x09
#define HAL_PAN_STATUS_DEVICE_DOWN	0x0A

#define HAL_OP_PAN_ENABLE	0x01
struct hal_cmd_pan_enable {
	uint8_t local_role;
} __attribute__((packed));

#define HAL_OP_PAN_GET_ROLE	0x02
struct hal_rsp_pan_get_role {
	uint8_t local_role;
} __attribute__((packed));

#define HAL_OP_PAN_CONNECT	0x03
struct hal_cmd_pan_connect {
	uint8_t bdaddr[6];
	uint8_t local_role;
	uint8_t remote_role;
} __attribute__((packed));

#define HAL_OP_PAN_DISCONNECT	0x04
struct hal_cmd_pan_disconnect {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_HEALTH_MDEP_ROLE_SOURCE	0x00
#define HAL_HEALTH_MDEP_ROLE_SINK	0x01

#define HAL_HEALTH_CHANNEL_TYPE_RELIABLE	0x00
#define HAL_HEALTH_CHANNEL_TYPE_STREAMING	0x01
#define HAL_HEALTH_CHANNEL_TYPE_ANY		0x02

#define HAL_OP_HEALTH_REG_APP		0x01
struct hal_cmd_health_reg_app {
	uint8_t  num_of_mdep;
	uint16_t app_name_off;
	uint16_t provider_name_off;
	uint16_t service_name_off;
	uint16_t service_descr_off;
	uint16_t len;
	uint8_t  data[0];
} __attribute__((packed));

struct hal_rsp_health_reg_app {
	uint16_t app_id;
} __attribute__((packed));

#define HAL_OP_HEALTH_MDEP		0x02
struct hal_cmd_health_mdep {
	uint16_t app_id;
	uint8_t  role;
	uint16_t data_type;
	uint8_t  channel_type;
	uint16_t descr_len;
	uint8_t  descr[0];
} __attribute__((packed));

#define HAL_OP_HEALTH_UNREG_APP		0x03
struct hal_cmd_health_unreg_app {
	uint16_t app_id;
} __attribute__((packed));

#define HAL_OP_HEALTH_CONNECT_CHANNEL	0x04
struct hal_cmd_health_connect_channel {
	uint16_t app_id;
	uint8_t  bdaddr[6];
	uint8_t  mdep_index;
} __attribute__((packed));

struct hal_rsp_health_connect_channel {
	uint16_t  channel_id;
} __attribute__((packed));

#define HAL_OP_HEALTH_DESTROY_CHANNEL	0x05
struct hal_cmd_health_destroy_channel {
	uint16_t channel_id;
} __attribute__((packed));

/* Handsfree HAL API */

#define HAL_MODE_HANDSFREE_HSP_ONLY		HAL_MODE_DEFAULT
#define HAL_MODE_HANDSFREE_HFP			0x01
#define HAL_MODE_HANDSFREE_HFP_WBS		0x02

#define HAL_OP_HANDSFREE_CONNECT		0x01
struct hal_cmd_handsfree_connect {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HANDSFREE_DISCONNECT		0x02
struct hal_cmd_handsfree_disconnect {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HANDSFREE_CONNECT_AUDIO		0x03
struct hal_cmd_handsfree_connect_audio {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HANDSFREE_DISCONNECT_AUDIO	0x04
struct hal_cmd_handsfree_disconnect_audio {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HANDSFREE_START_VR		0x05
struct hal_cmd_handsfree_start_vr {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HANDSFREE_STOP_VR		0x06
struct hal_cmd_handsfree_stop_vr {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_HANDSFREE_VOLUME_TYPE_SPEAKER	0x00
#define HAL_HANDSFREE_VOLUME_TYPE_MIC		0x01

#define HAL_OP_HANDSFREE_VOLUME_CONTROL		0x07
struct hal_cmd_handsfree_volume_control {
	uint8_t type;
	uint8_t volume;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_HANDSFREE_NETWORK_STATE_NOT_AVAILABLE	0x00
#define HAL_HANDSFREE_NETWORK_STATE_AVAILABLE		0x01

#define HAL_HANDSFREE_SERVICE_TYPE_HOME		0x00
#define HAL_HANDSFREE_SERVICE_TYPE_ROAMING	0x01

#define HAL_OP_HANDSFREE_DEVICE_STATUS_NOTIF	0x08
struct hal_cmd_handsfree_device_status_notif {
	uint8_t state;
	uint8_t type;
	uint8_t signal;
	uint8_t battery;
} __attribute__((packed));

#define HAL_OP_HANDSFREE_COPS_RESPONSE		0x09
struct hal_cmd_handsfree_cops_response {
	uint16_t len;
	uint8_t bdaddr[6];
	uint8_t buf[0];
} __attribute__((packed));

#define HAL_HANDSFREE_CALL_STATE_ACTIVE		0x00
#define HAL_HANDSFREE_CALL_STATE_HELD		0x01
#define HAL_HANDSFREE_CALL_STATE_DIALING	0x02
#define HAL_HANDSFREE_CALL_STATE_ALERTING	0x03
#define HAL_HANDSFREE_CALL_STATE_INCOMING	0x04
#define HAL_HANDSFREE_CALL_STATE_WAITING	0x05
#define HAL_HANDSFREE_CALL_STATE_IDLE		0x06

#define HAL_OP_HANDSFREE_CIND_RESPONSE		0x0A
struct hal_cmd_handsfree_cind_response {
	uint8_t svc;
	uint8_t num_active;
	uint8_t num_held;
	uint8_t state;
	uint8_t signal;
	uint8_t roam;
	uint8_t batt_chg;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HANDSFREE_FORMATTED_AT_RESPONSE	0x0B
struct hal_cmd_handsfree_formatted_at_response {
	uint16_t len;
	uint8_t bdaddr[6];
	uint8_t buf[0];
} __attribute__((packed));

#define HAL_HANDSFREE_AT_RESPONSE_ERROR		0x00
#define HAL_HANDSFREE_AT_RESPONSE_OK		0x01

#define HAL_OP_HANDSFREE_AT_RESPONSE		0x0C
struct hal_cmd_handsfree_at_response {
	uint8_t response;
	uint8_t error;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_HANDSFREE_CALL_DIRECTION_OUTGOING	0x00
#define HAL_HANDSFREE_CALL_DIRECTION_INCOMING	0x01

#define HAL_HANDSFREE_CALL_TYPE_VOICE		0x00
#define HAL_HANDSFREE_CALL_TYPE_DATA		0x01
#define HAL_HANDSFREE_CALL_TYPE_FAX		0x02

#define HAL_HANDSFREE_CALL_MPTY_TYPE_SINGLE	0x00
#define HAL_HANDSFREE_CALL_MPTY_TYPE_MULTI	0x01

#define HAL_HANDSFREE_CALL_ADDRTYPE_UNKNOWN	0x81
#define HAL_HANDSFREE_CALL_ADDRTYPE_INTERNATIONAL	0x91

#define HAL_OP_HANDSFREE_CLCC_RESPONSE		0x0D
struct hal_cmd_handsfree_clcc_response {
	uint8_t index;
	uint8_t dir;
	uint8_t state;
	uint8_t mode;
	uint8_t mpty;
	uint8_t type;
	uint8_t bdaddr[6];
	uint16_t number_len;
	uint8_t number[0];
} __attribute__((packed));

#define HAL_OP_HANDSFREE_PHONE_STATE_CHANGE	0x0E
struct hal_cmd_handsfree_phone_state_change {
	uint8_t num_active;
	uint8_t num_held;
	uint8_t state;
	uint8_t type;
	uint16_t number_len;
	uint8_t number[0];
} __attribute__((packed));

#define HAL_HANDSFREE_WBS_NONE			0x00
#define HAL_HANDSFREE_WBS_NO			0x01
#define HAL_HANDSFREE_WBS_YES			0x02

#define HAL_OP_HANDSFREE_CONFIGURE_WBS		0x0F
struct hal_cmd_handsfree_configure_wbs {
	uint8_t bdaddr[6];
	uint8_t config;
} __attribute__((packed));

/* AVRCP TARGET HAL API */

#define HAL_AVRCP_PLAY_STATUS_STOPPED	0x00
#define HAL_AVRCP_PLAY_STATUS_PLAYING	0x01
#define HAL_AVRCP_PLAY_STATUS_PAUSED	0x02
#define HAL_AVRCP_PLAY_STATUS_FWD_SEEK	0x03
#define HAL_AVRCP_PLAY_STATUS_REV_SEEK	0x04
#define HAL_AVRCP_PLAY_STATUS_ERROR	0xff

#define HAL_OP_AVRCP_GET_PLAY_STATUS	0x01
struct hal_cmd_avrcp_get_play_status {
	uint8_t status;
	uint32_t duration;
	uint32_t position;
} __attribute__((packed));

#define HAL_AVRCP_PLAYER_ATTR_EQUALIZER	0x01
#define HAL_AVRCP_PLAYER_ATTR_REPEAT	0x02
#define HAL_AVRCP_PLAYER_ATTR_SHUFFLE	0x03
#define HAL_AVRCP_PLAYER_ATTR_SCAN	0x04

#define HAL_OP_AVRCP_LIST_PLAYER_ATTRS	0x02
struct hal_cmd_avrcp_list_player_attrs {
	uint8_t number;
	uint8_t attrs[0];
} __attribute__((packed));

#define HAL_OP_AVRCP_LIST_PLAYER_VALUES	0x03
struct hal_cmd_avrcp_list_player_values {
	uint8_t number;
	uint8_t values[0];
} __attribute__((packed));

struct hal_avrcp_player_attr_value {
	uint8_t attr;
	uint8_t value;
} __attribute__((packed));

#define HAL_OP_AVRCP_GET_PLAYER_ATTRS	0x04
struct hal_cmd_avrcp_get_player_attrs {
	uint8_t number;
	struct hal_avrcp_player_attr_value attrs[0];
} __attribute__((packed));

struct hal_avrcp_player_setting_text {
	uint8_t id;
	uint8_t len;
	uint8_t text[0];
} __attribute__((packed));

#define HAL_OP_AVRCP_GET_PLAYER_ATTRS_TEXT	0x05
struct hal_cmd_avrcp_get_player_attrs_text {
	uint8_t number;
	struct hal_avrcp_player_setting_text attrs[0];
} __attribute__((packed));

#define HAL_OP_AVRCP_GET_PLAYER_VALUES_TEXT	0x06
struct hal_cmd_avrcp_get_player_values_text {
	uint8_t number;
	struct hal_avrcp_player_setting_text values[0];
} __attribute__((packed));

#define HAL_AVRCP_MEDIA_ATTR_TITLE		0x01
#define HAL_AVRCP_MEDIA_ATTR_ARTIST		0x02
#define HAL_AVRCP_MEDIA_ATTR_ALBUM		0x03
#define HAL_AVRCP_MEDIA_ATTR_TRACK_NUM		0x04
#define HAL_AVRCP_MEDIA_ATTR_NUM_TRACKS		0x05
#define HAL_AVRCP_MEDIA_ATTR_GENRE		0x06
#define HAL_AVRCP_MEDIA_ATTR_DURATION		0x07

#define HAL_OP_AVRCP_GET_ELEMENT_ATTRS_TEXT	0x07
struct hal_cmd_avrcp_get_element_attrs_text {
	uint8_t number;
	struct hal_avrcp_player_setting_text values[0];
} __attribute__((packed));

#define HAL_OP_AVRCP_SET_PLAYER_ATTRS_VALUE	0x08
struct hal_cmd_avrcp_set_player_attrs_value {
	uint8_t status;
} __attribute__((packed));

#define HAL_AVRCP_EVENT_STATUS_CHANGED		0x01
#define HAL_AVRCP_EVENT_TRACK_CHANGED		0x02
#define HAL_AVRCP_EVENT_TRACK_REACHED_END	0x03
#define HAL_AVRCP_EVENT_TRACK_REACHED_START	0x04
#define HAL_AVRCP_EVENT_POSITION_CHANGED	0x05
#define HAL_AVRCP_EVENT_SETTING_CHANGED		0x08

#define HAL_AVRCP_EVENT_TYPE_INTERIM		0x00
#define HAL_AVRCP_EVENT_TYPE_CHANGED		0x01

#define HAL_OP_AVRCP_REGISTER_NOTIFICATION	0x09
struct hal_cmd_avrcp_register_notification {
	uint8_t event;
	uint8_t type;
	uint8_t len;
	uint8_t data[0];
} __attribute__((packed));

#define HAL_OP_AVRCP_SET_VOLUME			0x0a
struct hal_cmd_avrcp_set_volume {
	uint8_t value;
} __attribute__((packed));

/* AVRCP CTRL HAL API */

#define HAL_OP_AVRCP_CTRL_SEND_PASSTHROUGH	0x01
struct hal_cmd_avrcp_ctrl_send_passthrough {
	uint8_t bdaddr[6];
	uint8_t key_code;
	uint8_t key_state;
} __attribute__((packed));

/* GATT HAL API */

#define HAL_OP_GATT_CLIENT_REGISTER		0x01
struct hal_cmd_gatt_client_register {
	uint8_t uuid[16];
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_UNREGISTER		0x02
struct hal_cmd_gatt_client_unregister {
	int32_t client_if;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_SCAN			0x03
struct hal_cmd_gatt_client_scan {
	int32_t client_if;
	uint8_t start;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_CONNECT		0x04
struct hal_cmd_gatt_client_connect {
	int32_t client_if;
	uint8_t bdaddr[6];
	uint8_t is_direct;
	int32_t transport;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_DISCONNECT		0x05
struct hal_cmd_gatt_client_disconnect {
	int32_t client_if;
	uint8_t bdaddr[6];
	int32_t conn_id;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_LISTEN		0x06
struct hal_cmd_gatt_client_listen {
	int32_t client_if;
	uint8_t start;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_REFRESH		0x07
struct hal_cmd_gatt_client_refresh {
	int32_t client_if;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_SEARCH_SERVICE	0x08
struct hal_cmd_gatt_client_search_service {
	int32_t conn_id;
	uint8_t filtered;
	uint8_t filter_uuid[0];
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_GET_INCLUDED_SERVICE	0x09
struct hal_gatt_srvc_id {
	uint8_t uuid[16];
	uint8_t inst_id;
	uint8_t is_primary;
} __attribute__((packed));

struct hal_cmd_gatt_client_get_included_service {
	int32_t conn_id;
	struct hal_gatt_srvc_id srvc_id;
	uint8_t continuation;
	struct hal_gatt_srvc_id incl_srvc_id[0];
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_GET_CHARACTERISTIC	0x0a
struct hal_gatt_gatt_id {
	uint8_t uuid[16];
	uint8_t inst_id;
} __attribute__((packed));

struct hal_cmd_gatt_client_get_characteristic {
	int32_t conn_id;
	struct hal_gatt_srvc_id srvc_id;
	uint8_t continuation;
	struct hal_gatt_gatt_id char_id[0];
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_GET_DESCRIPTOR	0x0b
struct hal_cmd_gatt_client_get_descriptor {
	int32_t conn_id;
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
	uint8_t continuation;
	struct hal_gatt_gatt_id descr_id[0];
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_READ_CHARACTERISTIC	0x0c
struct hal_cmd_gatt_client_read_characteristic {
	int32_t conn_id;
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
	int32_t auth_req;
} __attribute__((packed));

#define GATT_WRITE_TYPE_NO_RESPONSE	0x01
#define GATT_WRITE_TYPE_DEFAULT		0x02
#define GATT_WRITE_TYPE_PREPARE		0x03
#define GATT_WRITE_TYPE_SIGNED		0x04

#define HAL_OP_GATT_CLIENT_WRITE_CHARACTERISTIC	0x0d
struct hal_cmd_gatt_client_write_characteristic {
	int32_t conn_id;
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
	int32_t write_type;
	int32_t len;
	int32_t auth_req;
	uint8_t value[0];
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_READ_DESCRIPTOR	0x0e
struct hal_cmd_gatt_client_read_descriptor {
	int32_t conn_id;
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
	struct hal_gatt_gatt_id descr_id;
	int32_t auth_req;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_WRITE_DESCRIPTOR	0x0f
struct hal_cmd_gatt_client_write_descriptor {
	int32_t conn_id;
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
	struct hal_gatt_gatt_id descr_id;
	int32_t write_type;
	int32_t len;
	int32_t auth_req;
	uint8_t value[0];
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_EXECUTE_WRITE	0x10
struct hal_cmd_gatt_client_execute_write {
	int32_t conn_id;
	int32_t execute;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_REGISTER_FOR_NOTIFICATION	0x11
struct hal_cmd_gatt_client_register_for_notification {
	int32_t client_if;
	uint8_t bdaddr[6];
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_DEREGISTER_FOR_NOTIFICATION	0x12
struct hal_cmd_gatt_client_deregister_for_notification {
	int32_t client_if;
	uint8_t bdaddr[6];
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_READ_REMOTE_RSSI	0x13
struct hal_cmd_gatt_client_read_remote_rssi {
	int32_t client_if;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_GET_DEVICE_TYPE	0x14
struct hal_cmd_gatt_client_get_device_type {
	uint8_t bdaddr[6];
} __attribute__((packed));

struct hal_rsp_gatt_client_get_device_type {
	uint8_t type;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_SET_ADV_DATA		0x015
struct hal_cmd_gatt_client_set_adv_data {
	int32_t  server_if;
	uint8_t  set_scan_rsp;
	uint8_t  include_name;
	uint8_t  include_txpower;
	int32_t  min_interval;
	int32_t  max_interval;
	int32_t  appearance;
	uint16_t manufacturer_len;
	uint16_t service_data_len;
	uint16_t service_uuid_len;
	uint8_t  data[0];
} __attribute__((packed));

#define GATT_CLIENT_TEST_CMD_ENABLE		0x01
#define GATT_CLIENT_TEST_CMD_CONNECT		0x02
#define GATT_CLIENT_TEST_CMD_DISCONNECT		0x03
#define GATT_CLIENT_TEST_CMD_DISCOVER		0x04
#define GATT_CLIENT_TEST_CMD_READ		0xe0
#define GATT_CLIENT_TEST_CMD_WRITE		0xe1
#define GATT_CLIENT_TEST_CMD_INCREASE_SECURITY	0xe2
#define GATT_CLIENT_TEST_CMD_PAIRING_CONFIG	0xf0

#define HAL_OP_GATT_CLIENT_TEST_COMMAND		0x16
struct hal_cmd_gatt_client_test_command {
	int32_t command;
	uint8_t  bda1[6];
	uint8_t  uuid1[16];
	uint16_t u1;
	uint16_t u2;
	uint16_t u3;
	uint16_t u4;
	uint16_t u5;
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_REGISTER		0x17
struct hal_cmd_gatt_server_register {
	uint8_t uuid[16];
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_UNREGISTER		0x18
struct hal_cmd_gatt_server_unregister {
	int32_t server_if;
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_CONNECT		0x19
struct hal_cmd_gatt_server_connect {
	int32_t server_if;
	uint8_t bdaddr[6];
	uint8_t is_direct;
	int32_t transport;
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_DISCONNECT		0x1a
struct hal_cmd_gatt_server_disconnect {
	int32_t server_if;
	uint8_t bdaddr[6];
	int32_t conn_id;
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_ADD_SERVICE		0x1b
struct hal_cmd_gatt_server_add_service {
	int32_t server_if;
	struct hal_gatt_srvc_id srvc_id;
	int32_t num_handles;
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_ADD_INC_SERVICE	0x1c
struct hal_cmd_gatt_server_add_inc_service {
	int32_t server_if;
	int32_t service_handle;
	int32_t included_handle;
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_ADD_CHARACTERISTIC	0x1d
struct hal_cmd_gatt_server_add_characteristic {
	int32_t server_if;
	int32_t service_handle;
	uint8_t uuid[16];
	int32_t properties;
	int32_t permissions;
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_ADD_DESCRIPTOR	0x1e
struct hal_cmd_gatt_server_add_descriptor {
	int32_t server_if;
	int32_t service_handle;
	uint8_t uuid[16];
	int32_t permissions;
} __attribute__((packed));

#define GATT_SERVER_TRANSPORT_LE_BIT		0x01
#define GATT_SERVER_TRANSPORT_BREDR_BIT		0x02

#define HAL_OP_GATT_SERVER_START_SERVICE	0x1f
struct hal_cmd_gatt_server_start_service {
	int32_t server_if;
	int32_t service_handle;
	int32_t transport;
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_STOP_SERVICE		0x20
struct hal_cmd_gatt_server_stop_service {
	int32_t server_if;
	int32_t service_handle;
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_DELETE_SERVICE	0x21
struct hal_cmd_gatt_server_delete_service {
	int32_t server_if;
	int32_t service_handle;
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_SEND_INDICATION	0x22
struct hal_cmd_gatt_server_send_indication {
	int32_t server_if;
	int32_t attribute_handle;
	int32_t conn_id;
	int32_t len;
	int32_t confirm;
	uint8_t value[0];
} __attribute__((packed));

#define HAL_OP_GATT_SERVER_SEND_RESPONSE	0x23
struct hal_cmd_gatt_server_send_response {
	int32_t conn_id;
	int32_t trans_id;
	uint16_t handle;
	uint16_t offset;
	uint8_t auth_req;
	int32_t status;
	uint16_t len;
	uint8_t data[0];
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_SCAN_FILTER_SETUP	0x024
struct hal_cmd_gatt_client_scan_filter_setup {
	int32_t client_if;
	int32_t action;
	int32_t filter_index;
	int32_t features;
	int32_t list_type;
	int32_t filter_type;
	int32_t rssi_hi;
	int32_t rssi_lo;
	int32_t delivery_mode;
	int32_t found_timeout;
	int32_t lost_timeout;
	int32_t found_timeout_cnt;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_SCAN_FILTER_ADD_REMOVE	0x025
struct hal_cmd_gatt_client_scan_filter_add_remove {
	int32_t client_if;
	int32_t action;
	int32_t filter_type;
	int32_t filter_index;
	int32_t company_id;
	int32_t company_id_mask;
	uint8_t uuid[16];
	uint8_t uuid_mask[16];
	uint8_t address[6];
	uint8_t address_type;
	int32_t data_len;
	int32_t mask_len;
	uint8_t data_mask[0]; /* common buffer for data and mask */
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_SCAN_FILTER_CLEAR		0x26
struct hal_cmd_gatt_client_scan_filter_clear {
	int32_t client_if;
	int32_t index;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_SCAN_FILTER_ENABLE		0x27
struct hal_cmd_gatt_client_scan_filter_enable {
	int32_t client_if;
	uint8_t enable;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_CONFIGURE_MTU		0x28
struct hal_cmd_gatt_client_configure_mtu {
	int32_t conn_id;
	int32_t mtu;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_CONN_PARAM_UPDATE		0x29
struct hal_cmd_gatt_client_conn_param_update {
	uint8_t address[6];
	int32_t min_interval;
	int32_t max_interval;
	int32_t latency;
	int32_t timeout;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_SET_SCAN_PARAM		0x2a
struct hal_cmd_gatt_client_set_scan_param {
	int32_t interval;
	int32_t window;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_SETUP_MULTI_ADV		0x2b
struct hal_cmd_gatt_client_setup_multi_adv {
	int32_t client_if;
	int32_t min_interval;
	int32_t max_interval;
	int32_t type;
	int32_t channel_map;
	int32_t tx_power;
	int32_t timeout;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_UPDATE_MULTI_ADV		0x2c
struct hal_cmd_gatt_client_update_multi_adv {
	int32_t client_if;
	int32_t min_interval;
	int32_t max_interval;
	int32_t type;
	int32_t channel_map;
	int32_t tx_power;
	int32_t timeout;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_SETUP_MULTI_ADV_INST		0x2d
struct hal_cmd_gatt_client_setup_multi_adv_inst {
	int32_t client_if;
	uint8_t set_scan_rsp;
	uint8_t include_name;
	uint8_t include_tx_power;
	int32_t appearance;
	int32_t manufacturer_data_len;
	int32_t service_data_len;
	int32_t service_uuid_len;
	uint8_t data_service_uuid[0];
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_DISABLE_MULTI_ADV_INST	0x2e
struct hal_cmd_gatt_client_disable_multi_adv_inst {
	int32_t client_if;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_CONFIGURE_BATCHSCAN		0x2f
struct hal_cmd_gatt_client_configure_batchscan {
	int32_t client_if;
	int32_t full_max;
	int32_t trunc_max;
	int32_t notify_threshold;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_ENABLE_BATCHSCAN		0x30
struct hal_cmd_gatt_client_enable_batchscan {
	int32_t client_if;
	int32_t mode;
	int32_t interval;
	int32_t window;
	int32_t address_type;
	int32_t discard_rule;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_DISABLE_BATCHSCAN		0x31
struct hal_cmd_gatt_client_disable_batchscan {
	int32_t client_if;
} __attribute__((packed));

#define HAL_OP_GATT_CLIENT_READ_BATCHSCAN_REPORTS	0x32
struct hal_cmd_gatt_client_read_batchscan_reports {
	int32_t client_if;
	int32_t scan_mode;
} __attribute__((packed));

/* Handsfree client HAL API */

#define HAL_OP_HF_CLIENT_CONNECT		0x01
struct hal_cmd_hf_client_connect {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HF_CLIENT_DISCONNECT		0x02
struct hal_cmd_hf_client_disconnect {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HF_CLIENT_CONNECT_AUDIO		0x03
struct hal_cmd_hf_client_connect_audio {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HF_CLIENT_DISCONNECT_AUDIO	0x04
struct hal_cmd_hf_client_disconnect_audio {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_OP_HF_CLIENT_START_VR		0x05
#define HAL_OP_HF_CLIENT_STOP_VR		0x06

#define HF_CLIENT_VOLUME_TYPE_SPEAKER	0x00
#define HF_CLIENT_VOLUME_TYPE_MIC	0x01

#define HAL_OP_HF_CLIENT_VOLUME_CONTROL		0x07
struct hal_cmd_hf_client_volume_control {
	uint8_t type;
	uint8_t volume;
} __attribute__((packed));

#define HAL_OP_HF_CLIENT_DIAL			0x08
struct hal_cmd_hf_client_dial {
	uint16_t number_len;
	uint8_t number[0];
} __attribute__((packed));

#define HAL_OP_HF_CLIENT_DIAL_MEMORY		0x09
struct hal_cmd_hf_client_dial_memory {
	int32_t location;
} __attribute__((packed));

#define HAL_HF_CLIENT_ACTION_CHLD_0		0x00
#define HAL_HF_CLIENT_ACTION_CHLD_1		0x01
#define HAL_HF_CLIENT_ACTION_CHLD_2		0x02
#define HAL_HF_CLIENT_ACTION_CHLD_3		0x03
#define HAL_HF_CLIENT_ACTION_CHLD_4		0x04
#define HAL_HF_CLIENT_ACTION_CHLD_1x		0x05
#define HAL_HF_CLIENT_ACTION_CHLD_2x		0x06
#define HAL_HF_CLIENT_ACTION_ATA		0x07
#define HAL_HF_CLIENT_ACTION_CHUP		0x08
#define HAL_HF_CLIENT_ACTION_BRTH_0		0x09
#define HAL_HF_CLIENT_ACTION_BRTH_1		0x0a
#define HAL_HF_CLIENT_ACTION_BRTH_2		0x0b

#define HAL_OP_HF_CLIENT_CALL_ACTION		0x0a
struct hal_cmd_hf_client_call_action {
	uint8_t action;
	int32_t index;
} __attribute__((packed));

#define HAL_OP_HF_CLIENT_QUERY_CURRENT_CALLS	0x0b
#define HAL_OP_HF_CLIENT_QUERY_OPERATOR_NAME	0x0c
#define HAL_OP_HF_CLIENT_RETRIEVE_SUBSCR_INFO	0x0d

#define HAL_OP_HF_CLIENT_SEND_DTMF		0x0e
struct hal_cmd_hf_client_send_dtmf {
	uint8_t tone;
} __attribute__((packed));

#define HAL_OP_HF_CLIENT_GET_LAST_VOICE_TAG_NUM	0x0f

/* MAP CLIENT HAL API */

#define HAL_OP_MAP_CLIENT_GET_INSTANCES	0x01
struct hal_cmd_map_client_get_instances {
	uint8_t bdaddr[6];
} __attribute__((packed));

/* Notifications and confirmations */

#define HAL_POWER_OFF			0x00
#define HAL_POWER_ON			0x01

#define HAL_EV_ADAPTER_STATE_CHANGED	0x81
struct hal_ev_adapter_state_changed {
	uint8_t state;
} __attribute__((packed));

#define HAL_EV_ADAPTER_PROPS_CHANGED	0x82
struct hal_property {
	uint8_t  type;
	uint16_t len;
	uint8_t  val[0];
} __attribute__((packed));
struct hal_ev_adapter_props_changed {
	uint8_t              status;
	uint8_t              num_props;
	struct  hal_property props[0];
} __attribute__((packed));

#define HAL_EV_REMOTE_DEVICE_PROPS	0x83
struct hal_ev_remote_device_props {
	uint8_t             status;
	uint8_t             bdaddr[6];
	uint8_t             num_props;
	struct hal_property props[0];
} __attribute__((packed));

#define HAL_EV_DEVICE_FOUND		0x84
struct hal_ev_device_found {
	uint8_t             num_props;
	struct hal_property props[0];
} __attribute__((packed));

#define HAL_DISCOVERY_STATE_STOPPED	0x00
#define HAL_DISCOVERY_STATE_STARTED	0x01

#define HAL_EV_DISCOVERY_STATE_CHANGED	0x85
struct hal_ev_discovery_state_changed {
	uint8_t state;
} __attribute__((packed));

#define HAL_EV_PIN_REQUEST		0x86
struct hal_ev_pin_request {
	uint8_t  bdaddr[6];
	uint8_t  name[249];
	uint32_t class_of_dev;
} __attribute__((packed));

#define HAL_EV_SSP_REQUEST		0x87
struct hal_ev_ssp_request {
	uint8_t  bdaddr[6];
	uint8_t  name[249];
	uint32_t class_of_dev;
	uint8_t  pairing_variant;
	uint32_t passkey;
} __attribute__((packed));

#define HAL_BOND_STATE_NONE 0
#define HAL_BOND_STATE_BONDING 1
#define HAL_BOND_STATE_BONDED 2

#define HAL_EV_BOND_STATE_CHANGED	0x88
struct hal_ev_bond_state_changed {
	uint8_t status;
	uint8_t bdaddr[6];
	uint8_t state;
} __attribute__((packed));

#define HAL_ACL_STATE_CONNECTED		0x00
#define HAL_ACL_STATE_DISCONNECTED	0x01

#define HAL_EV_ACL_STATE_CHANGED	0x89
struct hal_ev_acl_state_changed {
	uint8_t status;
	uint8_t bdaddr[6];
	uint8_t state;
} __attribute__((packed));

#define HAL_EV_DUT_MODE_RECEIVE		0x8a
struct hal_ev_dut_mode_receive {
	uint16_t opcode;
	uint8_t  len;
	uint8_t  data[0];
} __attribute__((packed));

#define HAL_EV_LE_TEST_MODE		0x8b
struct hal_ev_le_test_mode {
	uint8_t  status;
	uint16_t num_packets;
} __attribute__((packed));

#define HAL_EV_ENERGY_INFO		0x8c
struct hal_ev_energy_info {
	uint8_t status;
	uint8_t ctrl_state;
	uint64_t tx_time;
	uint64_t rx_time;
	uint64_t idle_time;
	uint64_t energy_used;
} __attribute__((packed));

#define HAL_HIDHOST_STATE_CONNECTED		0x00
#define HAL_HIDHOST_STATE_CONNECTING	0x01
#define HAL_HIDHOST_STATE_DISCONNECTED	0x02
#define HAL_HIDHOST_STATE_DISCONNECTING	0x03
#define HAL_HIDHOST_STATE_NO_HID		0x07
#define HAL_HIDHOST_STATE_FAILED		0x08
#define HAL_HIDHOST_STATE_UNKNOWN		0x09

#define HAL_EV_HIDHOST_CONN_STATE		0x81
struct hal_ev_hidhost_conn_state {
	uint8_t bdaddr[6];
	uint8_t state;
} __attribute__((packed));

#define HAL_HIDHOST_STATUS_OK			0x00

#define HAL_HIDHOST_HS_NOT_READY		0x01
#define HAL_HIDHOST_HS_INVALID_RAPORT_ID	0x02
#define HAL_HIDHOST_HS_TRANS_NOT_SUPPORTED	0x03
#define HAL_HIDHOST_HS_INVALID_PARAM		0x04
#define HAL_HIDHOST_HS_ERROR			0x05

#define HAL_HIDHOST_GENERAL_ERROR		0x06
#define HAL_HIDHOST_SDP_ERROR			0x07
#define HAL_HIDHOST_PROTOCOL_ERROR		0x08
#define HAL_HIDHOST_DB_ERROR			0x09
#define HAL_HIDHOST_TOD_UNSUPPORTED_ERROR	0x0a
#define HAL_HIDHOST_NO_RESOURCES_ERROR		0x0b
#define HAL_HIDHOST_AUTH_FAILED_ERROR		0x0c
#define HAL_HIDHOST_HDL_ERROR			0x0d

#define HAL_EV_HIDHOST_INFO			0x82
struct hal_ev_hidhost_info {
	uint8_t  bdaddr[6];
	uint8_t  attr;
	uint8_t  subclass;
	uint8_t  app_id;
	uint16_t vendor;
	uint16_t product;
	uint16_t version;
	uint8_t  country;
	uint16_t descr_len;
	uint8_t  descr[884];
} __attribute__((packed));

#define HAL_EV_HIDHOST_PROTO_MODE		0x83
struct hal_ev_hidhost_proto_mode {
	uint8_t bdaddr[6];
	uint8_t status;
	uint8_t mode;
} __attribute__((packed));

#define HAL_EV_HIDHOST_IDLE_TIME		0x84
struct hal_ev_hidhost_idle_time {
	uint8_t bdaddr[6];
	uint8_t status;
	uint32_t idle_rate;
} __attribute__((packed));

#define HAL_EV_HIDHOST_GET_REPORT		0x85
struct hal_ev_hidhost_get_report {
	uint8_t  bdaddr[6];
	uint8_t  status;
	uint16_t len;
	uint8_t  data[0];
} __attribute__((packed));

#define HAL_EV_HIDHOST_VIRTUAL_UNPLUG		0x86
struct hal_ev_hidhost_virtual_unplug {
	uint8_t  bdaddr[6];
	uint8_t  status;
} __attribute__((packed));

#define HAL_EV_HIDHOST_HANDSHAKE		0x87
struct hal_ev_hidhost_handshake {
	uint8_t  bdaddr[6];
	uint8_t  status;
} __attribute__((packed));

#define HAL_EV_PAN_CTRL_STATE			0x81
struct hal_ev_pan_ctrl_state {
	uint8_t  state;
	uint8_t  status;
	uint8_t  local_role;
	uint8_t  name[17];
} __attribute__((packed));

#define HAL_EV_PAN_CONN_STATE			0x82
struct hal_ev_pan_conn_state {
	uint8_t  state;
	uint8_t  status;
	uint8_t  bdaddr[6];
	uint8_t  local_role;
	uint8_t  remote_role;
} __attribute__((packed));

#define HAL_HEALTH_APP_REG_SUCCESS		0x00
#define HAL_HEALTH_APP_REG_FAILED		0x01
#define HAL_HEALTH_APP_DEREG_SUCCESS		0x02
#define HAL_HEALTH_APP_DEREG_FAILED		0x03

#define HAL_HEALTH_CHANNEL_CONNECTING		0x00
#define HAL_HEALTH_CHANNEL_CONNECTED		0x01
#define HAL_HEALTH_CHANNEL_DISCONNECTING	0x02
#define HAL_HEALTH_CHANNEL_DISCONNECTED		0x03
#define HAL_HEALTH_CHANNEL_DESTROYED		0x04

#define HAL_EV_HEALTH_APP_REG_STATE		0x81
struct hal_ev_health_app_reg_state {
	uint16_t id;
	uint8_t  state;
} __attribute__((packed));

#define HAL_EV_HEALTH_CHANNEL_STATE		0x82
struct hal_ev_health_channel_state {
	uint16_t app_id;
	uint8_t  bdaddr[6];
	uint8_t  mdep_index;
	uint16_t channel_id;
	uint8_t  channel_state;
} __attribute__((packed));

#define HAL_A2DP_STATE_DISCONNECTED		0x00
#define HAL_A2DP_STATE_CONNECTING		0x01
#define HAL_A2DP_STATE_CONNECTED		0x02
#define HAL_A2DP_STATE_DISCONNECTING		0x03

#define HAL_EV_A2DP_CONN_STATE			0x81
struct hal_ev_a2dp_conn_state {
	uint8_t state;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_AUDIO_SUSPEND			0x00
#define HAL_AUDIO_STOPPED			0x01
#define HAL_AUDIO_STARTED			0x02

#define HAL_EV_A2DP_AUDIO_STATE			0x82
struct hal_ev_a2dp_audio_state {
	uint8_t state;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_A2DP_AUDIO_CONFIG		0x83
struct hal_ev_a2dp_audio_config {
	uint8_t  bdaddr[6];
	uint32_t sample_rate;
	uint8_t  channel_count;
} __attribute__((packed));

#define HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED	0x00
#define HAL_EV_HANDSFREE_CONN_STATE_CONNECTING		0x01
#define HAL_EV_HANDSFREE_CONN_STATE_CONNECTED		0x02
#define HAL_EV_HANDSFREE_CONN_STATE_SLC_CONNECTED	0x03
#define HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTING	0x04

#define HAL_EV_HANDSFREE_CONN_STATE		0x81
struct hal_ev_handsfree_conn_state {
	uint8_t state;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED	0x00
#define HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTING		0x01
#define HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED		0x02
#define HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTING	0x03

#define HAL_EV_HANDSFREE_AUDIO_STATE		0x82
struct hal_ev_handsfree_audio_state {
	uint8_t state;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_HANDSFREE_VR_STOPPED	0x00
#define HAL_HANDSFREE_VR_STARTED	0x01

#define HAL_EV_HANDSFREE_VR		0x83
struct hal_ev_handsfree_vr_state {
	uint8_t state;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_ANSWER		0x84
struct hal_ev_handsfree_answer {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_HANGUP		0x85
struct hal_ev_handsfree_hangup {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_VOLUME		0x86
struct hal_ev_handsfree_volume {
	uint8_t type;
	uint8_t volume;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_DIAL		0x87
struct hal_ev_handsfree_dial {
	uint8_t bdaddr[6];
	uint16_t number_len;
	uint8_t number[0];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_DTMF		0x88
struct hal_ev_handsfree_dtmf {
	uint8_t tone;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_HANDSFREE_NREC_STOP		0x00
#define HAL_HANDSFREE_NREC_START	0x01

#define HAL_EV_HANDSFREE_NREC		0x89
struct hal_ev_handsfree_nrec {
	uint8_t nrec;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_HANDSFREE_CHLD_TYPE_RELEASEHELD			0x00
#define HAL_HANDSFREE_CHLD_TYPE_RELEASEACTIVE_ACCEPTHELD	0x01
#define HAL_HANDSFREE_CHLD_TYPE_HOLDACTIVE_ACCEPTHELD		0x02
#define HAL_HANDSFREE_CHLD_TYPE_ADDHELDTOCONF			0x03

#define HAL_EV_HANDSFREE_CHLD		0x8A
struct hal_ev_handsfree_chld {
	uint8_t chld;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_CNUM		0x8B
struct hal_ev_handsfree_cnum {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_CIND		0x8C
struct hal_ev_handsfree_cind {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_COPS		0x8D
struct hal_ev_handsfree_cops {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_CLCC		0x8E
struct hal_ev_handsfree_clcc {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_UNKNOWN_AT	0x8F
struct hal_ev_handsfree_unknown_at {
	uint8_t bdaddr[6];
	uint16_t len;
	uint8_t buf[0];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_HSP_KEY_PRESS	0x90
struct hal_ev_handsfree_hsp_key_press {
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_HANDSFREE_WBS		0x91
struct hal_ev_handsfree_wbs {
	uint8_t wbs;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_AVRCP_FEATURE_NONE			0x00
#define HAL_AVRCP_FEATURE_METADATA		0x01
#define HAL_AVRCP_FEATURE_ABSOLUTE_VOLUME	0x02
#define HAL_AVRCP_FEATURE_BROWSE		0x04

#define HAL_EV_AVRCP_REMOTE_FEATURES		0x81
struct hal_ev_avrcp_remote_features {
	uint8_t bdaddr[6];
	uint8_t features;
} __attribute__((packed));

#define HAL_EV_AVRCP_GET_PLAY_STATUS		0x82
#define HAL_EV_AVRCP_LIST_PLAYER_ATTRS		0x83

#define HAL_EV_AVRCP_LIST_PLAYER_VALUES		0x84
struct hal_ev_avrcp_list_player_values {
	uint8_t attr;
} __attribute__((packed));

#define HAL_EV_AVRCP_GET_PLAYER_VALUES		0x85
struct hal_ev_avrcp_get_player_values {
	uint8_t number;
	uint8_t attrs[0];
} __attribute__((packed));

#define HAL_EV_AVRCP_GET_PLAYER_ATTRS_TEXT	0x86
struct hal_ev_avrcp_get_player_attrs_text {
	uint8_t number;
	uint8_t attrs[0];
} __attribute__((packed));

#define HAL_EV_AVRCP_GET_PLAYER_VALUES_TEXT	0x87
struct hal_ev_avrcp_get_player_values_text {
	uint8_t attr;
	uint8_t number;
	uint8_t values[0];
} __attribute__((packed));

#define HAL_EV_AVRCP_SET_PLAYER_VALUES		0x88
struct hal_ev_avrcp_set_player_values {
	uint8_t number;
	struct hal_avrcp_player_attr_value attrs[0];
} __attribute__((packed));

#define HAL_EV_AVRCP_GET_ELEMENT_ATTRS		0x89
struct hal_ev_avrcp_get_element_attrs {
	uint8_t number;
	uint8_t attrs[0];
} __attribute__((packed));

#define HAL_EV_AVRCP_REGISTER_NOTIFICATION	0x8a
struct hal_ev_avrcp_register_notification {
	uint8_t event;
	uint32_t param;
} __attribute__((packed));

#define HAL_EV_AVRCP_VOLUME_CHANGED		0x8b
struct hal_ev_avrcp_volume_changed {
	uint8_t volume;
	uint8_t type;
} __attribute__((packed));

#define HAL_EV_AVRCP_PASSTHROUGH_CMD		0x8c
struct hal_ev_avrcp_passthrough_cmd {
	uint8_t id;
	uint8_t state;
} __attribute__((packed));

#define HAL_EV_AVRCP_CTRL_CONN_STATE		0x81
struct hal_ev_avrcp_ctrl_conn_state {
	uint8_t state;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_AVRCP_CTRL_PASSTHROUGH_RSP	0x82
struct hal_ev_avrcp_ctrl_passthrough_rsp {
	uint8_t id;
	uint8_t key_state;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_REGISTER_CLIENT	0x81
struct hal_ev_gatt_client_register_client {
	int32_t status;
	int32_t client_if;
	uint8_t app_uuid[16];
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_SCAN_RESULT	0x82
struct hal_ev_gatt_client_scan_result {
	uint8_t  bda[6];
	int32_t  rssi;
	uint16_t len;
	uint8_t  adv_data[0];
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_CONNECT	0x83
struct hal_ev_gatt_client_connect {
	int32_t conn_id;
	int32_t status;
	int32_t client_if;
	uint8_t bda[6];
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_DISCONNECT	0x84
struct hal_ev_gatt_client_disconnect {
	int32_t conn_id;
	int32_t status;
	int32_t client_if;
	uint8_t bda[6];
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_SEARCH_COMPLETE	0x85
struct hal_ev_gatt_client_search_complete {
	int32_t conn_id;
	int32_t status;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_SEARCH_RESULT	0x86
struct hal_ev_gatt_client_search_result {
	int32_t conn_id;
	struct hal_gatt_srvc_id srvc_id;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_GET_CHARACTERISTIC	0x87
struct hal_ev_gatt_client_get_characteristic {
	int32_t conn_id;
	int32_t status;
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
	int32_t char_prop;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_GET_DESCRIPTOR	0x88
struct hal_ev_gatt_client_get_descriptor {
	int32_t conn_id;
	int32_t status;
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
	struct hal_gatt_gatt_id descr_id;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_GET_INC_SERVICE	0X89
struct hal_ev_gatt_client_get_inc_service {
	int32_t conn_id;
	int32_t status;
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_srvc_id incl_srvc_id;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_REGISTER_FOR_NOTIF	0x8a
struct hal_ev_gatt_client_reg_for_notif {
	int32_t conn_id;
	int32_t registered;
	int32_t status;
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_NOTIFY		0x8b
struct hal_ev_gatt_client_notify {
	int32_t conn_id;
	uint8_t bda[6];
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
	uint8_t  is_notify;
	uint16_t len;
	uint8_t  value[0];
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_READ_CHARACTERISTIC	0x8c
struct hal_gatt_read_params {
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
	struct hal_gatt_gatt_id descr_id;
	uint8_t  status;
	uint16_t value_type;
	uint16_t len;
	uint8_t  value[0];
} __attribute__((packed));

struct hal_ev_gatt_client_read_characteristic {
	int32_t conn_id;
	int32_t status;
	struct hal_gatt_read_params data;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_WRITE_CHARACTERISTIC	0x8d
struct hal_gatt_write_params {
	struct hal_gatt_srvc_id srvc_id;
	struct hal_gatt_gatt_id char_id;
	struct hal_gatt_gatt_id descr_id;
	uint8_t status;
} __attribute__((packed));

struct hal_ev_gatt_client_write_characteristic {
	int32_t conn_id;
	int32_t status;
	struct hal_gatt_write_params data;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_READ_DESCRIPTOR	0x8e
struct hal_ev_gatt_client_read_descriptor {
	int32_t conn_id;
	int32_t status;
	struct hal_gatt_read_params data;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_WRITE_DESCRIPTOR	0x8f
struct hal_ev_gatt_client_write_descriptor {
	int32_t conn_id;
	int32_t status;
	struct hal_gatt_write_params data;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_EXEC_WRITE		0x90
struct hal_ev_gatt_client_exec_write {
	int32_t conn_id;
	int32_t status;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_READ_REMOTE_RSSI	0x91
struct hal_ev_gatt_client_read_remote_rssi {
	int32_t client_if;
	uint8_t address[6];
	int32_t rssi;
	int32_t status;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_LISTEN		0x92
struct hal_ev_gatt_client_listen {
	int32_t status;
	int32_t server_if;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_REGISTER		0x93
struct hal_ev_gatt_server_register {
	int32_t status;
	int32_t server_if;
	uint8_t uuid[16];
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_CONNECTION		0x94
struct hal_ev_gatt_server_connection {
	int32_t conn_id;
	int32_t server_if;
	int32_t connected;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_SERVICE_ADDED	0x95
struct hal_ev_gatt_server_service_added {
	int32_t status;
	int32_t server_if;
	struct hal_gatt_srvc_id srvc_id;
	int32_t srvc_handle;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_INC_SRVC_ADDED	0x96
struct hal_ev_gatt_server_inc_srvc_added {
	int32_t status;
	int32_t server_if;
	int32_t srvc_handle;
	int32_t incl_srvc_handle;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_CHAR_ADDED		0x97
struct hal_ev_gatt_server_characteristic_added {
	int32_t status;
	int32_t server_if;
	uint8_t uuid[16];
	int32_t srvc_handle;
	int32_t char_handle;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_DESCRIPTOR_ADDED	0x98
struct hal_ev_gatt_server_descriptor_added {
	int32_t status;
	int32_t server_if;
	uint8_t uuid[16];
	int32_t srvc_handle;
	int32_t descr_handle;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_SERVICE_STARTED	0x99
struct hal_ev_gatt_server_service_started {
	int32_t status;
	int32_t server_if;
	int32_t srvc_handle;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_SERVICE_STOPPED	0x9a
struct hal_ev_gatt_server_service_stopped {
	int32_t status;
	int32_t server_if;
	int32_t srvc_handle;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_SERVICE_DELETED	0x9b
struct hal_ev_gatt_server_service_deleted {
	int32_t status;
	int32_t server_if;
	int32_t srvc_handle;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_REQUEST_READ		0x9c
struct hal_ev_gatt_server_request_read {
	int32_t conn_id;
	int32_t trans_id;
	uint8_t bdaddr[6];
	int32_t attr_handle;
	int32_t offset;
	uint8_t is_long;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_REQUEST_WRITE	0x9d
struct hal_ev_gatt_server_request_write {
	int32_t conn_id;
	int32_t trans_id;
	uint8_t bdaddr[6];
	int32_t attr_handle;
	int32_t offset;
	int32_t length;
	uint8_t need_rsp;
	uint8_t is_prep;
	uint8_t value[0];
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_REQUEST_EXEC_WRITE	0x9e
struct hal_ev_gatt_server_request_exec_write {
	int32_t conn_id;
	int32_t trans_id;
	uint8_t bdaddr[6];
	int32_t exec_write;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_RSP_CONFIRMATION	0x9f
struct hal_ev_gatt_server_rsp_confirmation {
	int32_t status;
	int32_t handle;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_CONFIGURE_MTU	0xa0
struct hal_ev_gatt_client_configure_mtu {
	int32_t conn_id;
	int32_t status;
	int32_t mtu;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_FILTER_CONFIG	0xa1
struct hal_ev_gatt_client_filter_config {
	int32_t action;
	int32_t client_if;
	int32_t status;
	int32_t type;
	int32_t space;
}  __attribute__((packed));

#define HAL_EV_GATT_CLIENT_FILTER_PARAMS	0xa2
struct hal_ev_gatt_client_filter_params {
	int32_t action;
	int32_t client_if;
	int32_t status;
	int32_t space;
}  __attribute__((packed));

#define HAL_EV_GATT_CLIENT_FILTER_STATUS	0xa3
struct hal_ev_gatt_client_filter_status {
	int32_t enable;
	int32_t client_if;
	int32_t status;
}  __attribute__((packed));

#define HAL_EV_GATT_CLIENT_MULTI_ADV_ENABLE	0xa4
struct hal_ev_gatt_client_multi_adv_enable {
	int32_t client_if;
	int32_t status;
} __attribute__((packed));


#define HAL_EV_GATT_CLIENT_MULTI_ADV_UPDATE	0xa5
struct hal_ev_gatt_client_multi_adv_update {
	int32_t client_if;
	int32_t status;
} __attribute__((packed));


#define HAL_EV_GATT_CLIENT_MULTI_ADV_DATA	0xa6
struct hal_ev_gatt_client_multi_adv_data {
	int32_t client_if;
	int32_t status;
} __attribute__((packed));


#define HAL_EV_GATT_CLIENT_MULTI_ADV_DISABLE	0xa7
struct hal_ev_gatt_client_multi_adv_disable {
	int32_t client_if;
	int32_t status;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_CONGESTION		0xa8
struct hal_ev_gatt_client_congestion {
	int32_t conn_id;
	uint8_t congested;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_CONFIG_BATCHSCAN	0xa9
struct hal_ev_gatt_client_config_batchscan {
	int32_t client_if;
	int32_t status;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_ENABLE_BATCHSCAN	0xaa
struct hal_ev_gatt_client_enable_batchscan {
	int32_t action;
	int32_t client_if;
	int32_t status;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_BATCHSCAN_REPORTS	0xab
struct hal_ev_gatt_client_batchscan_reports {
	int32_t client_if;
	int32_t status;
	int32_t format;
	int32_t num;
	int32_t data_len;
	uint8_t data[0];
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_BATCHSCAN_THRESHOLD	0xac
struct hal_ev_gatt_client_batchscan_threshold {
	int32_t client_if;
} __attribute__((packed));

#define HAL_EV_GATT_CLIENT_TRACK_ADV		0xad
struct hal_ev_gatt_client_track_adv {
	int32_t client_if;
	int32_t filetr_index;
	int32_t address_type;
	uint8_t address[6];
	int32_t state;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_INDICATION_SENT	0xae
struct hal_ev_gatt_server_indication_sent {
	int32_t conn_id;
	int32_t status;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_CONGESTION		0xaf
struct hal_ev_gatt_server_congestion {
	int32_t conn_id;
	uint8_t congested;
} __attribute__((packed));

#define HAL_EV_GATT_SERVER_MTU_CHANGED		0xb0
struct hal_ev_gatt_server_mtu_changed {
	int32_t conn_id;
	int32_t mtu;
} __attribute__((packed));

#define HAL_GATT_PERMISSION_READ			0x0001
#define HAL_GATT_PERMISSION_READ_ENCRYPTED		0x0002
#define HAL_GATT_PERMISSION_READ_ENCRYPTED_MITM		0x0004
#define HAL_GATT_PERMISSION_WRITE			0x0010
#define HAL_GATT_PERMISSION_WRITE_ENCRYPTED		0x0020
#define HAL_GATT_PERMISSION_WRITE_ENCRYPTED_MITM	0x0040
#define HAL_GATT_PERMISSION_WRITE_SIGNED		0x0080
#define HAL_GATT_PERMISSION_WRITE_SIGNED_MITM		0x0100

#define HAL_GATT_AUTHENTICATION_NONE		0
#define HAL_GATT_AUTHENTICATION_NO_MITM		1
#define HAL_GATT_AUTHENTICATION_MITM		2

#define HAL_HF_CLIENT_CONN_STATE_DISCONNECTED		0x00
#define HAL_HF_CLIENT_CONN_STATE_CONNECTING		0x01
#define HAL_HF_CLIENT_CONN_STATE_CONNECTED		0x02
#define HAL_HF_CLIENT_CONN_STATE_SLC_CONNECTED		0x03
#define HAL_HF_CLIENT_CONN_STATE_DISCONNECTING		0x04

#define HAL_HF_CLIENT_PEER_FEAT_3WAY		0x00000001
#define HAL_HF_CLIENT_PEER_FEAT_ECNR		0x00000002
#define HAL_HF_CLIENT_PEER_FEAT_VREC		0x00000004
#define HAL_HF_CLIENT_PEER_FEAT_INBAND		0x00000008
#define HAL_HF_CLIENT_PEER_FEAT_VTAG		0x00000010
#define HAL_HF_CLIENT_PEER_FEAT_REJECT		0x00000020
#define HAL_HF_CLIENT_PEER_FEAT_ECS		0x00000040
#define HAL_HF_CLIENT_PEER_FEAT_ECC		0x00000080
#define HAL_HF_CLIENT_PEER_FEAT_EXTERR		0x00000100
#define HAL_HF_CLIENT_PEER_FEAT_CODEC		0x00000200

#define HAL_HF_CLIENT_CHLD_FEAT_REL		0x00000001
#define HAL_HF_CLIENT_CHLD_FEAT_REL_ACC		0x00000002
#define HAL_HF_CLIENT_CHLD_FEAT_REL_X		0x00000004
#define HAL_HF_CLIENT_CHLD_FEAT_HOLD_ACC	0x00000008
#define HAL_HF_CLIENT_CHLD_FEAT_PRIV_X		0x00000010
#define HAL_HF_CLIENT_CHLD_FEAT_MERGE		0x00000020
#define HAL_HF_CLIENT_CHLD_FEAT_MERGE_DETACH	0x00000040

#define HAL_EV_HF_CLIENT_CONN_STATE			0x81
struct hal_ev_hf_client_conn_state {
	uint8_t state;
	uint32_t peer_feat;
	uint32_t chld_feat;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_HF_CLIENT_AUDIO_STATE_DISCONNECTED		0x00
#define HAL_HF_CLIENT_AUDIO_STATE_CONNECTING		0x01
#define HAL_HF_CLIENT_AUDIO_STATE_CONNECTED		0x02
#define HAL_HF_CLIENT_AUDIO_STATE_CONNECTED_MSBC	0x03

#define HAL_EV_HF_CLIENT_AUDIO_STATE			0x82
struct hal_ev_hf_client_audio_state {
	uint8_t state;
	uint8_t bdaddr[6];
} __attribute__((packed));

#define HAL_HF_CLIENT_VR_STOPPED	0x00
#define HAL_HF_CLIENT_VR_STARTED	0x01

#define HAL_EV_HF_CLIENT_VR_STATE			0x83
struct hal_ev_hf_client_vr_state {
	uint8_t state;
} __attribute__((packed));

#define HAL_HF_CLIENT_NET_NOT_AVAILABLE		0x00
#define HAL_HF_CLIENT_NET_AVAILABLE		0x01

#define HAL_EV_HF_CLIENT_NET_STATE			0x84
struct hal_ev_hf_client_net_state {
	uint8_t state;
} __attribute__((packed));

#define HAL_HF_CLIENT_NET_ROAMING_TYPE_HOME		0x00
#define HAL_HF_CLIENT_NET_ROAMING_TYPE_ROAMING		0x01

#define HAL_EV_HF_CLIENT_NET_ROAMING_TYPE		0x85
struct hal_ev_hf_client_net_roaming_type {
	uint8_t state;
} __attribute__((packed));

#define HAL_EV_HF_CLIENT_NET_SIGNAL_STRENGTH		0x86
struct hal_ev_hf_client_net_signal_strength {
	uint8_t signal_strength;
} __attribute__((packed));

#define HAL_EV_HF_CLIENT_BATTERY_LEVEL			0x87
struct hal_ev_hf_client_battery_level {
	uint8_t battery_level;
} __attribute__((packed));

#define HAL_EV_HF_CLIENT_OPERATOR_NAME			0x88
struct hal_ev_hf_client_operator_name {
	uint16_t name_len;
	uint8_t name[0];
} __attribute__((packed));

#define HAL_HF_CLIENT_CALL_IND_NO_CALL_IN_PROGERSS	0x00
#define HAL_HF_CLIENT_CALL_IND_CALL_IN_PROGERSS		0x01

#define HAL_EV_HF_CLIENT_CALL_INDICATOR			0x89
struct hal_ev_hf_client_call_indicator {
	uint8_t call;
} __attribute__((packed));

#define HAL_HF_CLIENT_CALL_SETUP_NONE			0x00
#define HAL_HF_CLIENT_CALL_SETUP_INCOMING		0x01
#define HAL_HF_CLIENT_CALL_SETUP_OUTGOING		0x02
#define HAL_HF_CLIENT_CALL_SETUP_ALERTING		0x03

#define HAL_EV_HF_CLIENT_CALL_SETUP_INDICATOR		0x8a
struct hal_ev_hf_client_call_setup_indicator {
	uint8_t call_setup;
} __attribute__((packed));

#define HAL_HF_CLIENT_CALL_HELD_IND_NONE		0x00
#define HAL_HF_CLIENT_CALL_HELD_IND_HOLD_AND_ACTIVE	0x01
#define HAL_HF_CLIENT_CALL_SETUP_IND_HOLD		0x02

#define HAL_EV_HF_CLIENT_CALL_HELD_INDICATOR		0x8b
struct hal_ev_hf_client_call_held_indicator {
	uint8_t call_held;
} __attribute__((packed));

#define HAL_HF_CLIENT_RESP_AND_HOLD_STATUS_HELD		0x00
#define HAL_HF_CLIENT_RESP_AND_HOLD_STATUS_ACCEPT	0x01
#define HAL_HF_CLIENT_RESP_AND_HOLD_STATUS_REJECT	0x02

#define HAL_EV_HF_CLIENT_RESPONSE_AND_HOLD_STATUS	0x8c
struct hal_ev_hf_client_response_and_hold_status {
	uint8_t status;
} __attribute__((packed));

#define HAL_EV_HF_CLIENT_CALLING_LINE_IDENT		0x8d
struct hal_ev_hf_client_calling_line_ident {
	uint16_t number_len;
	uint8_t number[0];
} __attribute__((packed));

#define HAL_EV_HF_CLIENT_CALL_WAITING			0x8e
struct hal_ev_hf_client_call_waiting {
	uint16_t number_len;
	uint8_t number[0];
} __attribute__((packed));

#define HAL_HF_CLIENT_DIRECTION_OUTGOING	0x00
#define HAL_HF_CLIENT_DIRECTION_INCOMING	0x01

#define HAL_HF_CLIENT_CALL_STATE_ACTIVE			0x00
#define HAL_HF_CLIENT_CALL_STATE_HELD			0x01
#define HAL_HF_CLIENT_CALL_STATE_DIALING		0x02
#define HAL_HF_CLIENT_CALL_STATE_ALERTING		0x03
#define HAL_HF_CLIENT_CALL_STATE_INCOMING		0x04
#define HAL_HF_CLIENT_CALL_STATE_WAITING		0x05
#define HAL_HF_CLIENT_CALL_STATE_HELD_BY_RESP_AND_HOLD	0x06

#define HAL_EV_HF_CLIENT_CURRENT_CALL			0x8f
struct hal_ev_hf_client_current_call {
	uint8_t index;
	uint8_t direction;
	uint8_t call_state;
	uint8_t multiparty;
	uint16_t number_len;
	uint8_t number[0];
} __attribute__((packed));

#define HAL_EV_CLIENT_VOLUME_CHANGED			0x90
struct hal_ev_hf_client_volume_changed {
	uint8_t type;
	uint8_t volume;
} __attribute__((packed));

#define HAL_HF_CLIENT_CMD_COMP_OK			0x00
#define HAL_HF_CLIENT_CMD_COMP_ERR			0x01
#define HAL_HF_CLIENT_CMD_COMP_ERR_NO_CARRIER		0x02
#define HAL_HF_CLIENT_CMD_COMP_ERR_BUSY			0x03
#define HAL_HF_CLIENT_CMD_COMP_ERR_NO_ANSWER		0x04
#define HAL_HF_CLIENT_CMD_COMP_ERR_DELAYED		0x05
#define HAL_HF_CLIENT_CMD_COMP_ERR_BACKLISTED		0x06
#define HAL_HF_CLIENT_CMD_COMP_ERR_CME			0x07

#define HAL_EV_CLIENT_COMMAND_COMPLETE			0x91
struct hal_ev_hf_client_command_complete {
	uint8_t type;
	uint8_t cme;
} __attribute__((packed));

#define HAL_HF_CLIENT_SUBSCR_TYPE_UNKNOWN	0x00
#define HAL_HF_CLIENT_SUBSCR_TYPE_VOICE		0x01
#define HAL_HF_CLIENT_SUBSCR_TYPE_FAX		0x02

#define HAL_EV_CLIENT_SUBSCRIBER_SERVICE_INFO		0x92
struct hal_ev_hf_client_subscriber_service_info {
	uint8_t type;
	uint16_t name_len;
	uint8_t name[0];
} __attribute__((packed));

#define HAL_HF_CLIENT_INBAND_RINGTONE_NOT_PROVIDED	0x00
#define HAL_HF_CLIENT_INBAND_RINGTONE_PROVIDED		0x01

#define HAL_EV_CLIENT_INBAND_SETTINGS			0x93
struct hal_ev_hf_client_inband_settings {
	uint8_t state;
} __attribute__((packed));

#define HAL_EV_CLIENT_LAST_VOICE_CALL_TAG_NUM		0x94
struct hal_ev_hf_client_last_void_call_tag_num {
	uint16_t number_len;
	uint8_t number[0];
} __attribute__((packed));

#define HAL_EV_CLIENT_RING_INDICATION			0x95

#define HAL_EV_MAP_CLIENT_REMOTE_MAS_INSTANCES	0x81
struct hal_map_client_mas_instance {
	int32_t id;
	int32_t scn;
	int32_t msg_types;
	int32_t name_len;
	uint8_t name[0];
} __attribute__((packed));

struct hal_ev_map_client_remote_mas_instances {
	int8_t status;
	uint8_t bdaddr[6];
	int32_t num_instances;
	struct hal_map_client_mas_instance instances[0];
} __attribute__((packed));
