diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/Makefile.am | 14 | ||||
| -rw-r--r-- | include/bluetooth.h | 149 | ||||
| -rw-r--r-- | include/bnep.h | 153 | ||||
| -rw-r--r-- | include/cmtp.h | 69 | ||||
| -rw-r--r-- | include/hci.h | 1842 | ||||
| -rw-r--r-- | include/hci_lib.h | 213 | ||||
| -rw-r--r-- | include/hidp.h | 85 | ||||
| -rw-r--r-- | include/l2cap.h | 204 | ||||
| -rw-r--r-- | include/rfcomm.h | 102 | ||||
| -rw-r--r-- | include/sco.h | 62 | ||||
| -rw-r--r-- | include/sdp.h | 503 | ||||
| -rw-r--r-- | include/sdp_lib.h | 619 | 
12 files changed, 4015 insertions, 0 deletions
| diff --git a/include/Makefile.am b/include/Makefile.am new file mode 100644 index 00000000..992e987b --- /dev/null +++ b/include/Makefile.am @@ -0,0 +1,14 @@ + +includedir = @includedir@/bluetooth + +include_HEADERS = \ +	bluetooth.h hci.h hci_lib.h sco.h l2cap.h \ +	sdp.h sdp_lib.h rfcomm.h bnep.h cmtp.h hidp.h + +MAINTAINERCLEANFILES = Makefile.in + +all-local: +	@if [ ! -e bluetooth ] ; then $(LN_S) $(top_srcdir)/include bluetooth ; fi + +clean-local: +	@rm -f bluetooth diff --git a/include/bluetooth.h b/include/bluetooth.h new file mode 100644 index 00000000..d886cb80 --- /dev/null +++ b/include/bluetooth.h @@ -0,0 +1,149 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2000-2001  Qualcomm Incorporated + *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com> + *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifndef __BLUETOOTH_H +#define __BLUETOOTH_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <endian.h> +#include <byteswap.h> + +#ifndef AF_BLUETOOTH +#define AF_BLUETOOTH	31 +#define PF_BLUETOOTH	AF_BLUETOOTH +#endif + +#ifndef SOL_BLUETOOTH +#define SOL_BLUETOOTH	274 +#endif + +#define BTPROTO_L2CAP	0 +#define BTPROTO_HCI	1 +#define BTPROTO_SCO	2 +#define BTPROTO_RFCOMM	3 +#define BTPROTO_BNEP	4 +#define BTPROTO_CMTP	5 +#define BTPROTO_HIDP	6 +#define BTPROTO_AVDTP	7 + +#define SOL_HCI		0 +#define SOL_L2CAP	6 +#define SOL_SCO		17 +#define SOL_RFCOMM	18 + +/* Connection and socket states */ +enum { +	BT_CONNECTED = 1, /* Equal to TCP_ESTABLISHED to make net code happy */ +	BT_OPEN, +	BT_BOUND, +	BT_LISTEN, +	BT_CONNECT, +	BT_CONNECT2, +	BT_CONFIG, +	BT_DISCONN, +	BT_CLOSED +}; + +/* Byte order conversions */ +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define htobs(d)  (d) +#define htobl(d)  (d) +#define btohs(d)  (d) +#define btohl(d)  (d) +#elif __BYTE_ORDER == __BIG_ENDIAN +#define htobs(d)  bswap_16(d) +#define htobl(d)  bswap_32(d) +#define btohs(d)  bswap_16(d) +#define btohl(d)  bswap_32(d) +#else +#error "Unknown byte order" +#endif + +/* Bluetooth unaligned access */ +#define bt_get_unaligned(ptr)			\ +({						\ +	struct __attribute__((packed)) {	\ +		typeof(*(ptr)) __v;		\ +	} *__p = (void *) (ptr);		\ +	__p->__v;				\ +}) + +#define bt_put_unaligned(val, ptr)		\ +do {						\ +	struct __attribute__((packed)) {	\ +		typeof(*(ptr)) __v;		\ +	} *__p = (void *) (ptr);		\ +	__p->__v = (val);			\ +} while(0) + +/* BD Address */ +typedef struct { +	uint8_t b[6]; +} __attribute__((packed)) bdaddr_t; + +#define BDADDR_ANY   (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}}) +#define BDADDR_ALL   (&(bdaddr_t) {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}) +#define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}}) + +/* Copy, swap, convert BD Address */ +static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2) +{ +	return memcmp(ba1, ba2, sizeof(bdaddr_t)); +} +static inline void bacpy(bdaddr_t *dst, const bdaddr_t *src) +{ +	memcpy(dst, src, sizeof(bdaddr_t)); +} + +void baswap(bdaddr_t *dst, const bdaddr_t *src); +bdaddr_t *strtoba(const char *str); +char *batostr(const bdaddr_t *ba); +int ba2str(const bdaddr_t *ba, char *str); +int str2ba(const char *str, bdaddr_t *ba); +int ba2oui(const bdaddr_t *ba, char *oui); +int bachk(const char *str); + +int baprintf(const char *format, ...); +int bafprintf(FILE *stream, const char *format, ...); +int basprintf(char *str, const char *format, ...); +int basnprintf(char *str, size_t size, const char *format, ...); + +void *bt_malloc(size_t size); +void bt_free(void *ptr); + +int bt_error(uint16_t code); +char *bt_compidtostr(int id); + +#ifdef __cplusplus +} +#endif + +#endif /* __BLUETOOTH_H */ diff --git a/include/bnep.h b/include/bnep.h new file mode 100644 index 00000000..92c66c14 --- /dev/null +++ b/include/bnep.h @@ -0,0 +1,153 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com> + *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifndef __BNEP_H +#define __BNEP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <bluetooth/bluetooth.h> + +#ifndef ETH_ALEN +#define ETH_ALEN	6		/* from <net/ethernet.h> */ +#endif + +/* BNEP UUIDs */ +#define BNEP_BASE_UUID 0x0000000000001000800000805F9B34FB +#define BNEP_UUID16    0x02 +#define BNEP_UUID32    0x04 +#define BNEP_UUID128   0x16 + +#define BNEP_SVC_PANU  0x1115 +#define BNEP_SVC_NAP   0x1116 +#define BNEP_SVC_GN    0x1117 + +/* BNEP packet types */ +#define BNEP_GENERAL               0x00 +#define BNEP_CONTROL               0x01 +#define BNEP_COMPRESSED            0x02 +#define BNEP_COMPRESSED_SRC_ONLY   0x03 +#define BNEP_COMPRESSED_DST_ONLY   0x04 + +/* BNEP control types */ +#define BNEP_CMD_NOT_UNDERSTOOD    0x00 +#define BNEP_SETUP_CONN_REQ        0x01 +#define BNEP_SETUP_CONN_RSP        0x02 +#define BNEP_FILTER_NET_TYPE_SET   0x03 +#define BNEP_FILTER_NET_TYPE_RSP   0x04 +#define BNEP_FILTER_MULT_ADDR_SET  0x05 +#define BNEP_FILTER_MULT_ADDR_RSP  0x06 + +/* BNEP response messages */ +#define BNEP_SUCCESS               0x00 + +#define BNEP_CONN_INVALID_DST      0x01 +#define BNEP_CONN_INVALID_SRC      0x02 +#define BNEP_CONN_INVALID_SVC      0x03 +#define BNEP_CONN_NOT_ALLOWED      0x04 + +#define BNEP_FILTER_UNSUPPORTED_REQ    0x01 +#define BNEP_FILTER_INVALID_RANGE      0x02 +#define BNEP_FILTER_INVALID_MCADDR     0x02 +#define BNEP_FILTER_LIMIT_REACHED      0x03 +#define BNEP_FILTER_DENIED_SECURITY    0x04 + +/* L2CAP settings */ +#define BNEP_MTU         1691 +#define BNEP_FLUSH_TO    0xffff +#define BNEP_CONNECT_TO  15 +#define BNEP_FILTER_TO   15 + +#ifndef BNEP_PSM +#define BNEP_PSM	 0x0f +#endif + +/* BNEP headers */ +#define BNEP_TYPE_MASK	 0x7f +#define BNEP_EXT_HEADER	 0x80 + +struct bnep_setup_conn_req { +	uint8_t  type; +	uint8_t  ctrl; +	uint8_t  uuid_size; +	uint8_t  service[0]; +} __attribute__((packed)); + +struct bnep_set_filter_req { +	uint8_t  type; +	uint8_t  ctrl; +	uint16_t len; +	uint8_t  list[0]; +} __attribute__((packed)); + +struct bnep_control_rsp { +	uint8_t  type; +	uint8_t  ctrl; +	uint16_t resp; +} __attribute__((packed)); + +struct bnep_ext_hdr { +	uint8_t  type; +	uint8_t  len; +	uint8_t  data[0]; +} __attribute__((packed)); + +/* BNEP ioctl defines */ +#define BNEPCONNADD	_IOW('B', 200, int) +#define BNEPCONNDEL	_IOW('B', 201, int) +#define BNEPGETCONNLIST	_IOR('B', 210, int) +#define BNEPGETCONNINFO	_IOR('B', 211, int) + +struct bnep_connadd_req { +	int      sock;		/* Connected socket */ +	uint32_t flags; +	uint16_t role; +	char     device[16];	/* Name of the Ethernet device */ +}; + +struct bnep_conndel_req { +	uint32_t flags; +	uint8_t  dst[ETH_ALEN]; +}; + +struct bnep_conninfo { +	uint32_t flags; +	uint16_t role; +	uint16_t state; +	uint8_t  dst[ETH_ALEN]; +	char     device[16]; +}; + +struct bnep_connlist_req { +	uint32_t cnum; +	struct bnep_conninfo *ci; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __BNEP_H */ diff --git a/include/cmtp.h b/include/cmtp.h new file mode 100644 index 00000000..16add1d2 --- /dev/null +++ b/include/cmtp.h @@ -0,0 +1,69 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifndef __CMTP_H +#define __CMTP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* CMTP defaults */ +#define CMTP_MINIMUM_MTU 152 +#define CMTP_DEFAULT_MTU 672 + +/* CMTP ioctl defines */ +#define CMTPCONNADD	_IOW('C', 200, int) +#define CMTPCONNDEL	_IOW('C', 201, int) +#define CMTPGETCONNLIST	_IOR('C', 210, int) +#define CMTPGETCONNINFO	_IOR('C', 211, int) + +#define CMTP_LOOPBACK	0 + +struct cmtp_connadd_req { +	int sock;	/* Connected socket */ +	uint32_t flags; +}; + +struct cmtp_conndel_req { +	bdaddr_t bdaddr; +	uint32_t flags; +}; + +struct cmtp_conninfo { +	bdaddr_t bdaddr; +	uint32_t flags; +	uint16_t state; +	int      num; +}; + +struct cmtp_connlist_req { +	uint32_t cnum; +	struct cmtp_conninfo *ci; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __CMTP_H */ diff --git a/include/hci.h b/include/hci.h new file mode 100644 index 00000000..499f1bdd --- /dev/null +++ b/include/hci.h @@ -0,0 +1,1842 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2000-2001  Qualcomm Incorporated + *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com> + *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifndef __HCI_H +#define __HCI_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/socket.h> + +#define HCI_MAX_DEV	16 + +#define HCI_MAX_ACL_SIZE	1024 +#define HCI_MAX_SCO_SIZE	255 +#define HCI_MAX_EVENT_SIZE	260 +#define HCI_MAX_FRAME_SIZE	(HCI_MAX_ACL_SIZE + 4) + +/* HCI dev events */ +#define HCI_DEV_REG	1 +#define HCI_DEV_UNREG	2 +#define HCI_DEV_UP	3 +#define HCI_DEV_DOWN	4 +#define HCI_DEV_SUSPEND	5 +#define HCI_DEV_RESUME	6 + +/* HCI device types */ +#define HCI_VIRTUAL	0 +#define HCI_USB		1 +#define HCI_PCCARD	2 +#define HCI_UART	3 +#define HCI_RS232	4 +#define HCI_PCI		5 +#define HCI_SDIO	6 + +/* HCI device flags */ +enum { +	HCI_UP, +	HCI_INIT, +	HCI_RUNNING, + +	HCI_PSCAN, +	HCI_ISCAN, +	HCI_AUTH, +	HCI_ENCRYPT, +	HCI_INQUIRY, + +	HCI_RAW, + +	HCI_SECMGR +}; + +/* HCI ioctl defines */ +#define HCIDEVUP	_IOW('H', 201, int) +#define HCIDEVDOWN	_IOW('H', 202, int) +#define HCIDEVRESET	_IOW('H', 203, int) +#define HCIDEVRESTAT	_IOW('H', 204, int) + +#define HCIGETDEVLIST	_IOR('H', 210, int) +#define HCIGETDEVINFO	_IOR('H', 211, int) +#define HCIGETCONNLIST	_IOR('H', 212, int) +#define HCIGETCONNINFO	_IOR('H', 213, int) +#define HCIGETAUTHINFO	_IOR('H', 215, int) + +#define HCISETRAW	_IOW('H', 220, int) +#define HCISETSCAN	_IOW('H', 221, int) +#define HCISETAUTH	_IOW('H', 222, int) +#define HCISETENCRYPT	_IOW('H', 223, int) +#define HCISETPTYPE	_IOW('H', 224, int) +#define HCISETLINKPOL	_IOW('H', 225, int) +#define HCISETLINKMODE	_IOW('H', 226, int) +#define HCISETACLMTU	_IOW('H', 227, int) +#define HCISETSCOMTU	_IOW('H', 228, int) + +#define HCISETSECMGR	_IOW('H', 230, int) + +#define HCIINQUIRY	_IOR('H', 240, int) + +#ifndef __NO_HCI_DEFS + +/* HCI Packet types */ +#define HCI_COMMAND_PKT		0x01 +#define HCI_ACLDATA_PKT		0x02 +#define HCI_SCODATA_PKT		0x03 +#define HCI_EVENT_PKT		0x04 +#define HCI_VENDOR_PKT		0xff + +/* HCI Packet types */ +#define HCI_2DH1	0x0002 +#define HCI_3DH1	0x0004 +#define HCI_DM1		0x0008 +#define HCI_DH1		0x0010 +#define HCI_2DH3	0x0100 +#define HCI_3DH3	0x0200 +#define HCI_DM3		0x0400 +#define HCI_DH3		0x0800 +#define HCI_2DH5	0x1000 +#define HCI_3DH5	0x2000 +#define HCI_DM5		0x4000 +#define HCI_DH5		0x8000 + +#define HCI_HV1		0x0020 +#define HCI_HV2		0x0040 +#define HCI_HV3		0x0080 + +#define HCI_EV3		0x0008 +#define HCI_EV4		0x0010 +#define HCI_EV5		0x0020 +#define HCI_2EV3	0x0040 +#define HCI_3EV3	0x0080 +#define HCI_2EV5	0x0100 +#define HCI_3EV5	0x0200 + +#define SCO_PTYPE_MASK	(HCI_HV1 | HCI_HV2 | HCI_HV3) +#define ACL_PTYPE_MASK	(HCI_DM1 | HCI_DH1 | HCI_DM3 | HCI_DH3 | HCI_DM5 | HCI_DH5) + +/* HCI Error codes */ +#define HCI_UNKNOWN_COMMAND			0x01 +#define HCI_NO_CONNECTION			0x02 +#define HCI_HARDWARE_FAILURE			0x03 +#define HCI_PAGE_TIMEOUT			0x04 +#define HCI_AUTHENTICATION_FAILURE		0x05 +#define HCI_PIN_OR_KEY_MISSING			0x06 +#define HCI_MEMORY_FULL				0x07 +#define HCI_CONNECTION_TIMEOUT			0x08 +#define HCI_MAX_NUMBER_OF_CONNECTIONS		0x09 +#define HCI_MAX_NUMBER_OF_SCO_CONNECTIONS	0x0a +#define HCI_ACL_CONNECTION_EXISTS		0x0b +#define HCI_COMMAND_DISALLOWED			0x0c +#define HCI_REJECTED_LIMITED_RESOURCES		0x0d +#define HCI_REJECTED_SECURITY			0x0e +#define HCI_REJECTED_PERSONAL			0x0f +#define HCI_HOST_TIMEOUT			0x10 +#define HCI_UNSUPPORTED_FEATURE			0x11 +#define HCI_INVALID_PARAMETERS			0x12 +#define HCI_OE_USER_ENDED_CONNECTION		0x13 +#define HCI_OE_LOW_RESOURCES			0x14 +#define HCI_OE_POWER_OFF			0x15 +#define HCI_CONNECTION_TERMINATED		0x16 +#define HCI_REPEATED_ATTEMPTS			0x17 +#define HCI_PAIRING_NOT_ALLOWED			0x18 +#define HCI_UNKNOWN_LMP_PDU			0x19 +#define HCI_UNSUPPORTED_REMOTE_FEATURE		0x1a +#define HCI_SCO_OFFSET_REJECTED			0x1b +#define HCI_SCO_INTERVAL_REJECTED		0x1c +#define HCI_AIR_MODE_REJECTED			0x1d +#define HCI_INVALID_LMP_PARAMETERS		0x1e +#define HCI_UNSPECIFIED_ERROR			0x1f +#define HCI_UNSUPPORTED_LMP_PARAMETER_VALUE	0x20 +#define HCI_ROLE_CHANGE_NOT_ALLOWED		0x21 +#define HCI_LMP_RESPONSE_TIMEOUT		0x22 +#define HCI_LMP_ERROR_TRANSACTION_COLLISION	0x23 +#define HCI_LMP_PDU_NOT_ALLOWED			0x24 +#define HCI_ENCRYPTION_MODE_NOT_ACCEPTED	0x25 +#define HCI_UNIT_LINK_KEY_USED			0x26 +#define HCI_QOS_NOT_SUPPORTED			0x27 +#define HCI_INSTANT_PASSED			0x28 +#define HCI_PAIRING_NOT_SUPPORTED		0x29 +#define HCI_TRANSACTION_COLLISION		0x2a +#define HCI_QOS_UNACCEPTABLE_PARAMETER		0x2c +#define HCI_QOS_REJECTED			0x2d +#define HCI_CLASSIFICATION_NOT_SUPPORTED	0x2e +#define HCI_INSUFFICIENT_SECURITY		0x2f +#define HCI_PARAMETER_OUT_OF_RANGE		0x30 +#define HCI_ROLE_SWITCH_PENDING			0x32 +#define HCI_SLOT_VIOLATION			0x34 +#define HCI_ROLE_SWITCH_FAILED			0x35 +#define HCI_EIR_TOO_LARGE			0x36 +#define HCI_SIMPLE_PAIRING_NOT_SUPPORTED	0x37 +#define HCI_HOST_BUSY_PAIRING			0x38 + +/* ACL flags */ +#define ACL_CONT		0x01 +#define ACL_START		0x02 +#define ACL_ACTIVE_BCAST	0x04 +#define ACL_PICO_BCAST		0x08 + +/* Baseband links */ +#define SCO_LINK	0x00 +#define ACL_LINK	0x01 +#define ESCO_LINK	0x02 + +/* LMP features */ +#define LMP_3SLOT	0x01 +#define LMP_5SLOT	0x02 +#define LMP_ENCRYPT	0x04 +#define LMP_SOFFSET	0x08 +#define LMP_TACCURACY	0x10 +#define LMP_RSWITCH	0x20 +#define LMP_HOLD	0x40 +#define LMP_SNIFF	0x80 + +#define LMP_PARK	0x01 +#define LMP_RSSI	0x02 +#define LMP_QUALITY	0x04 +#define LMP_SCO		0x08 +#define LMP_HV2		0x10 +#define LMP_HV3		0x20 +#define LMP_ULAW	0x40 +#define LMP_ALAW	0x80 + +#define LMP_CVSD	0x01 +#define LMP_PSCHEME	0x02 +#define LMP_PCONTROL	0x04 +#define LMP_TRSP_SCO	0x08 +#define LMP_BCAST_ENC	0x80 + +#define LMP_EDR_ACL_2M	0x02 +#define LMP_EDR_ACL_3M	0x04 +#define LMP_ENH_ISCAN	0x08 +#define LMP_ILACE_ISCAN	0x10 +#define LMP_ILACE_PSCAN	0x20 +#define LMP_RSSI_INQ	0x40 +#define LMP_ESCO	0x80 + +#define LMP_EV4		0x01 +#define LMP_EV5		0x02 +#define LMP_AFH_CAP_SLV	0x08 +#define LMP_AFH_CLS_SLV	0x10 +#define LMP_EDR_3SLOT	0x80 + +#define LMP_EDR_5SLOT	0x01 +#define LMP_SNIFF_SUBR	0x02 +#define LMP_PAUSE_ENC	0x04 +#define LMP_AFH_CAP_MST	0x08 +#define LMP_AFH_CLS_MST	0x10 +#define LMP_EDR_ESCO_2M	0x20 +#define LMP_EDR_ESCO_3M	0x40 +#define LMP_EDR_3S_ESCO	0x80 + +#define LMP_EXT_INQ	0x01 +#define LMP_SIMPLE_PAIR	0x08 +#define LMP_ENCAPS_PDU	0x10 +#define LMP_ERR_DAT_REP	0x20 +#define LMP_NFLUSH_PKTS	0x40 + +#define LMP_LSTO	0x01 +#define LMP_INQ_TX_PWR	0x02 +#define LMP_EXT_FEAT	0x80 + +/* Link policies */ +#define HCI_LP_RSWITCH	0x0001 +#define HCI_LP_HOLD	0x0002 +#define HCI_LP_SNIFF	0x0004 +#define HCI_LP_PARK	0x0008 + +/* Link mode */ +#define HCI_LM_ACCEPT	0x8000 +#define HCI_LM_MASTER	0x0001 +#define HCI_LM_AUTH	0x0002 +#define HCI_LM_ENCRYPT	0x0004 +#define HCI_LM_TRUSTED	0x0008 +#define HCI_LM_RELIABLE	0x0010 +#define HCI_LM_SECURE	0x0020 + +/* -----  HCI Commands ----- */ + +/* Link Control */ +#define OGF_LINK_CTL		0x01 + +#define OCF_INQUIRY			0x0001 +typedef struct { +	uint8_t		lap[3]; +	uint8_t		length;		/* 1.28s units */ +	uint8_t		num_rsp; +} __attribute__ ((packed)) inquiry_cp; +#define INQUIRY_CP_SIZE 5 + +typedef struct { +	uint8_t		status; +	bdaddr_t	bdaddr; +} __attribute__ ((packed)) status_bdaddr_rp; +#define STATUS_BDADDR_RP_SIZE 7 + +#define OCF_INQUIRY_CANCEL		0x0002 + +#define OCF_PERIODIC_INQUIRY		0x0003 +typedef struct { +	uint16_t	max_period;	/* 1.28s units */ +	uint16_t	min_period;	/* 1.28s units */ +	uint8_t		lap[3]; +	uint8_t		length;		/* 1.28s units */ +	uint8_t		num_rsp; +} __attribute__ ((packed)) periodic_inquiry_cp; +#define PERIODIC_INQUIRY_CP_SIZE 9 + +#define OCF_EXIT_PERIODIC_INQUIRY	0x0004 + +#define OCF_CREATE_CONN			0x0005 +typedef struct { +	bdaddr_t	bdaddr; +	uint16_t	pkt_type; +	uint8_t		pscan_rep_mode; +	uint8_t		pscan_mode; +	uint16_t	clock_offset; +	uint8_t		role_switch; +} __attribute__ ((packed)) create_conn_cp; +#define CREATE_CONN_CP_SIZE 13 + +#define OCF_DISCONNECT			0x0006 +typedef struct { +	uint16_t	handle; +	uint8_t		reason; +} __attribute__ ((packed)) disconnect_cp; +#define DISCONNECT_CP_SIZE 3 + +#define OCF_ADD_SCO			0x0007 +typedef struct { +	uint16_t	handle; +	uint16_t	pkt_type; +} __attribute__ ((packed)) add_sco_cp; +#define ADD_SCO_CP_SIZE 4 + +#define OCF_CREATE_CONN_CANCEL		0x0008 +typedef struct { +	bdaddr_t	bdaddr; +} __attribute__ ((packed)) create_conn_cancel_cp; +#define CREATE_CONN_CANCEL_CP_SIZE 6 + +#define OCF_ACCEPT_CONN_REQ		0x0009 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		role; +} __attribute__ ((packed)) accept_conn_req_cp; +#define ACCEPT_CONN_REQ_CP_SIZE	7 + +#define OCF_REJECT_CONN_REQ		0x000A +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		reason; +} __attribute__ ((packed)) reject_conn_req_cp; +#define REJECT_CONN_REQ_CP_SIZE	7 + +#define OCF_LINK_KEY_REPLY		0x000B +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		link_key[16]; +} __attribute__ ((packed)) link_key_reply_cp; +#define LINK_KEY_REPLY_CP_SIZE 22 + +#define OCF_LINK_KEY_NEG_REPLY		0x000C + +#define OCF_PIN_CODE_REPLY		0x000D +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		pin_len; +	uint8_t		pin_code[16]; +} __attribute__ ((packed)) pin_code_reply_cp; +#define PIN_CODE_REPLY_CP_SIZE 23 + +#define OCF_PIN_CODE_NEG_REPLY		0x000E + +#define OCF_SET_CONN_PTYPE		0x000F +typedef struct { +	uint16_t	 handle; +	uint16_t	 pkt_type; +} __attribute__ ((packed)) set_conn_ptype_cp; +#define SET_CONN_PTYPE_CP_SIZE 4 + +#define OCF_AUTH_REQUESTED		0x0011 +typedef struct { +	uint16_t	 handle; +} __attribute__ ((packed)) auth_requested_cp; +#define AUTH_REQUESTED_CP_SIZE 2 + +#define OCF_SET_CONN_ENCRYPT		0x0013 +typedef struct { +	uint16_t	handle; +	uint8_t		encrypt; +} __attribute__ ((packed)) set_conn_encrypt_cp; +#define SET_CONN_ENCRYPT_CP_SIZE 3 + +#define OCF_CHANGE_CONN_LINK_KEY	0x0015 +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) change_conn_link_key_cp; +#define CHANGE_CONN_LINK_KEY_CP_SIZE 2 + +#define OCF_MASTER_LINK_KEY		0x0017 +typedef struct { +	uint8_t		key_flag; +} __attribute__ ((packed)) master_link_key_cp; +#define MASTER_LINK_KEY_CP_SIZE 1 + +#define OCF_REMOTE_NAME_REQ		0x0019 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		pscan_rep_mode; +	uint8_t		pscan_mode; +	uint16_t	clock_offset; +} __attribute__ ((packed)) remote_name_req_cp; +#define REMOTE_NAME_REQ_CP_SIZE 10 + +#define OCF_REMOTE_NAME_REQ_CANCEL	0x001A +typedef struct { +	bdaddr_t	bdaddr; +} __attribute__ ((packed)) remote_name_req_cancel_cp; +#define REMOTE_NAME_REQ_CANCEL_CP_SIZE 6 + +#define OCF_READ_REMOTE_FEATURES	0x001B +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) read_remote_features_cp; +#define READ_REMOTE_FEATURES_CP_SIZE 2 + +#define OCF_READ_REMOTE_EXT_FEATURES	0x001C +typedef struct { +	uint16_t	handle; +	uint8_t		page_num; +} __attribute__ ((packed)) read_remote_ext_features_cp; +#define READ_REMOTE_EXT_FEATURES_CP_SIZE 3 + +#define OCF_READ_REMOTE_VERSION		0x001D +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) read_remote_version_cp; +#define READ_REMOTE_VERSION_CP_SIZE 2 + +#define OCF_READ_CLOCK_OFFSET		0x001F +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) read_clock_offset_cp; +#define READ_CLOCK_OFFSET_CP_SIZE 2 + +#define OCF_READ_LMP_HANDLE		0x0020 + +#define OCF_SETUP_SYNC_CONN		0x0028 +typedef struct { +	uint16_t	handle; +	uint32_t	tx_bandwith; +	uint32_t	rx_bandwith; +	uint16_t	max_latency; +	uint16_t	voice_setting; +	uint8_t		retrans_effort; +	uint16_t	pkt_type; +} __attribute__ ((packed)) setup_sync_conn_cp; +#define SETUP_SYNC_CONN_CP_SIZE 17 + +#define OCF_ACCEPT_SYNC_CONN_REQ	0x0029 +typedef struct { +	bdaddr_t	bdaddr; +	uint32_t	tx_bandwith; +	uint32_t	rx_bandwith; +	uint16_t	max_latency; +	uint16_t	voice_setting; +	uint8_t		retrans_effort; +	uint16_t	pkt_type; +} __attribute__ ((packed)) accept_sync_conn_req_cp; +#define ACCEPT_SYNC_CONN_REQ_CP_SIZE 21 + +#define OCF_REJECT_SYNC_CONN_REQ	0x002A +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		reason; +} __attribute__ ((packed)) reject_sync_conn_req_cp; +#define REJECT_SYNC_CONN_REQ_CP_SIZE 7 + +#define OCF_IO_CAPABILITY_REPLY		0x002B +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		capability; +	uint8_t		oob_data; +	uint8_t		authentication; +} __attribute__ ((packed)) io_capability_reply_cp; +#define IO_CAPABILITY_REPLY_CP_SIZE 9 + +#define OCF_USER_CONFIRM_REPLY		0x002C +typedef struct { +	bdaddr_t	bdaddr; +} __attribute__ ((packed)) user_confirm_reply_cp; +#define USER_CONFIRM_REPLY_CP_SIZE 6 + +#define OCF_USER_CONFIRM_NEG_REPLY	0x002D + +#define OCF_USER_PASSKEY_REPLY		0x002E +typedef struct { +	bdaddr_t	bdaddr; +	uint32_t	passkey; +} __attribute__ ((packed)) user_passkey_reply_cp; +#define USER_PASSKEY_REPLY_CP_SIZE 10 + +#define OCF_USER_PASSKEY_NEG_REPLY	0x002F + +#define OCF_REMOTE_OOB_DATA_REPLY	0x0030 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		hash[16]; +	uint8_t		randomizer[16]; +} __attribute__ ((packed)) remote_oob_data_reply_cp; +#define REMOTE_OOB_DATA_REPLY_CP_SIZE 38 + +#define OCF_REMOTE_OOB_DATA_NEG_REPLY	0x0033 + +#define OCF_IO_CAPABILITY_NEG_REPLY	0x0034 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		reason; +} __attribute__ ((packed)) io_capability_neg_reply_cp; +#define IO_CAPABILITY_NEG_REPLY_CP_SIZE 7 + +/* Link Policy */ +#define OGF_LINK_POLICY		0x02 + +#define OCF_HOLD_MODE			0x0001 +typedef struct { +	uint16_t	handle; +	uint16_t	max_interval; +	uint16_t	min_interval; +} __attribute__ ((packed)) hold_mode_cp; +#define HOLD_MODE_CP_SIZE 6 + +#define OCF_SNIFF_MODE			0x0003 +typedef struct { +	uint16_t	handle; +	uint16_t	max_interval; +	uint16_t	min_interval; +	uint16_t	attempt; +	uint16_t	timeout; +} __attribute__ ((packed)) sniff_mode_cp; +#define SNIFF_MODE_CP_SIZE 10 + +#define OCF_EXIT_SNIFF_MODE		0x0004 +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) exit_sniff_mode_cp; +#define EXIT_SNIFF_MODE_CP_SIZE 2 + +#define OCF_PARK_MODE			0x0005 +typedef struct { +	uint16_t	handle; +	uint16_t	max_interval; +	uint16_t	min_interval; +} __attribute__ ((packed)) park_mode_cp; +#define PARK_MODE_CP_SIZE 6 + +#define OCF_EXIT_PARK_MODE		0x0006 +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) exit_park_mode_cp; +#define EXIT_PARK_MODE_CP_SIZE 2 + +#define OCF_QOS_SETUP			0x0007 +typedef struct { +	uint8_t		service_type;		/* 1 = best effort */ +	uint32_t	token_rate;		/* Byte per seconds */ +	uint32_t	peak_bandwidth;		/* Byte per seconds */ +	uint32_t	latency;		/* Microseconds */ +	uint32_t	delay_variation;	/* Microseconds */ +} __attribute__ ((packed)) hci_qos; +#define HCI_QOS_CP_SIZE 17 +typedef struct { +	uint16_t 	handle; +	uint8_t 	flags;			/* Reserved */ +	hci_qos 	qos; +} __attribute__ ((packed)) qos_setup_cp; +#define QOS_SETUP_CP_SIZE (3 + HCI_QOS_CP_SIZE) + +#define OCF_ROLE_DISCOVERY		0x0009 +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) role_discovery_cp; +#define ROLE_DISCOVERY_CP_SIZE 2 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		role; +} __attribute__ ((packed)) role_discovery_rp; +#define ROLE_DISCOVERY_RP_SIZE 4 + +#define OCF_SWITCH_ROLE			0x000B +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		role; +} __attribute__ ((packed)) switch_role_cp; +#define SWITCH_ROLE_CP_SIZE 7 + +#define OCF_READ_LINK_POLICY		0x000C +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) read_link_policy_cp; +#define READ_LINK_POLICY_CP_SIZE 2 +typedef struct { +	uint8_t 	status; +	uint16_t	handle; +	uint16_t	policy; +} __attribute__ ((packed)) read_link_policy_rp; +#define READ_LINK_POLICY_RP_SIZE 5 + +#define OCF_WRITE_LINK_POLICY		0x000D +typedef struct { +	uint16_t	handle; +	uint16_t	policy; +} __attribute__ ((packed)) write_link_policy_cp; +#define WRITE_LINK_POLICY_CP_SIZE 4 +typedef struct { +	uint8_t 	status; +	uint16_t	handle; +} __attribute__ ((packed)) write_link_policy_rp; +#define WRITE_LINK_POLICY_RP_SIZE 3 + +#define OCF_READ_DEFAULT_LINK_POLICY	0x000E + +#define OCF_WRITE_DEFAULT_LINK_POLICY	0x000F + +#define OCF_FLOW_SPECIFICATION		0x0010 + +#define OCF_SNIFF_SUBRATING		0x0011 +typedef struct { +	uint16_t	handle; +	uint16_t	max_latency; +	uint16_t	min_remote_timeout; +	uint16_t	min_local_timeout; +} __attribute__ ((packed)) sniff_subrating_cp; +#define SNIFF_SUBRATING_CP_SIZE 8 + +/* Host Controller and Baseband */ +#define OGF_HOST_CTL		0x03 + +#define OCF_SET_EVENT_MASK		0x0001 +typedef struct { +	uint8_t		mask[8]; +} __attribute__ ((packed)) set_event_mask_cp; +#define SET_EVENT_MASK_CP_SIZE 8 + +#define OCF_RESET			0x0003 + +#define OCF_SET_EVENT_FLT		0x0005 +typedef struct { +	uint8_t		flt_type; +	uint8_t		cond_type; +	uint8_t		condition[0]; +} __attribute__ ((packed)) set_event_flt_cp; +#define SET_EVENT_FLT_CP_SIZE 2 + +/* Filter types */ +#define FLT_CLEAR_ALL			0x00 +#define FLT_INQ_RESULT			0x01 +#define FLT_CONN_SETUP			0x02 +/* INQ_RESULT Condition types */ +#define INQ_RESULT_RETURN_ALL		0x00 +#define INQ_RESULT_RETURN_CLASS		0x01 +#define INQ_RESULT_RETURN_BDADDR	0x02 +/* CONN_SETUP Condition types */ +#define CONN_SETUP_ALLOW_ALL		0x00 +#define CONN_SETUP_ALLOW_CLASS		0x01 +#define CONN_SETUP_ALLOW_BDADDR		0x02 +/* CONN_SETUP Conditions */ +#define CONN_SETUP_AUTO_OFF		0x01 +#define CONN_SETUP_AUTO_ON		0x02 + +#define OCF_FLUSH			0x0008 + +#define OCF_READ_PIN_TYPE		0x0009 +typedef struct { +	uint8_t		status; +	uint8_t		pin_type; +} __attribute__ ((packed)) read_pin_type_rp; +#define READ_PIN_TYPE_RP_SIZE 2 + +#define OCF_WRITE_PIN_TYPE		0x000A +typedef struct { +	uint8_t		pin_type; +} __attribute__ ((packed)) write_pin_type_cp; +#define WRITE_PIN_TYPE_CP_SIZE 1 + +#define OCF_CREATE_NEW_UNIT_KEY		0x000B + +#define OCF_READ_STORED_LINK_KEY	0x000D +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		read_all; +} __attribute__ ((packed)) read_stored_link_key_cp; +#define READ_STORED_LINK_KEY_CP_SIZE 7 +typedef struct { +	uint8_t		status; +	uint16_t	max_keys; +	uint16_t	num_keys; +} __attribute__ ((packed)) read_stored_link_key_rp; +#define READ_STORED_LINK_KEY_RP_SIZE 5 + +#define OCF_WRITE_STORED_LINK_KEY	0x0011 +typedef struct { +	uint8_t		num_keys; +	/* variable length part */ +} __attribute__ ((packed)) write_stored_link_key_cp; +#define WRITE_STORED_LINK_KEY_CP_SIZE 1 +typedef struct { +	uint8_t		status; +	uint8_t		num_keys; +} __attribute__ ((packed)) write_stored_link_key_rp; +#define READ_WRITE_LINK_KEY_RP_SIZE 2 + +#define OCF_DELETE_STORED_LINK_KEY	0x0012 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		delete_all; +} __attribute__ ((packed)) delete_stored_link_key_cp; +#define DELETE_STORED_LINK_KEY_CP_SIZE 7 +typedef struct { +	uint8_t		status; +	uint16_t	num_keys; +} __attribute__ ((packed)) delete_stored_link_key_rp; +#define DELETE_STORED_LINK_KEY_RP_SIZE 3 + +#define OCF_CHANGE_LOCAL_NAME		0x0013 +typedef struct { +	uint8_t		name[248]; +} __attribute__ ((packed)) change_local_name_cp; +#define CHANGE_LOCAL_NAME_CP_SIZE 248  + +#define OCF_READ_LOCAL_NAME		0x0014 +typedef struct { +	uint8_t		status; +	uint8_t		name[248]; +} __attribute__ ((packed)) read_local_name_rp; +#define READ_LOCAL_NAME_RP_SIZE 249  + +#define OCF_READ_CONN_ACCEPT_TIMEOUT	0x0015 +typedef struct { +	uint8_t		status; +	uint16_t	timeout; +} __attribute__ ((packed)) read_conn_accept_timeout_rp; +#define READ_CONN_ACCEPT_TIMEOUT_RP_SIZE 3 + +#define OCF_WRITE_CONN_ACCEPT_TIMEOUT	0x0016 +typedef struct { +	uint16_t	timeout; +} __attribute__ ((packed)) write_conn_accept_timeout_cp; +#define WRITE_CONN_ACCEPT_TIMEOUT_CP_SIZE 2 + +#define OCF_READ_PAGE_TIMEOUT		0x0017 +typedef struct { +	uint8_t		status; +	uint16_t	timeout; +} __attribute__ ((packed)) read_page_timeout_rp; +#define READ_PAGE_TIMEOUT_RP_SIZE 3 + +#define OCF_WRITE_PAGE_TIMEOUT		0x0018 +typedef struct { +	uint16_t	timeout; +} __attribute__ ((packed)) write_page_timeout_cp; +#define WRITE_PAGE_TIMEOUT_CP_SIZE 2 + +#define OCF_READ_SCAN_ENABLE		0x0019 +typedef struct { +	uint8_t		status; +	uint8_t		enable; +} __attribute__ ((packed)) read_scan_enable_rp; +#define READ_SCAN_ENABLE_RP_SIZE 2 + +#define OCF_WRITE_SCAN_ENABLE		0x001A +	#define SCAN_DISABLED		0x00 +	#define SCAN_INQUIRY		0x01 +	#define SCAN_PAGE		0x02 + +#define OCF_READ_PAGE_ACTIVITY		0x001B +typedef struct { +	uint8_t		status; +	uint16_t	interval; +	uint16_t	window; +} __attribute__ ((packed)) read_page_activity_rp; +#define READ_PAGE_ACTIVITY_RP_SIZE 5 + +#define OCF_WRITE_PAGE_ACTIVITY		0x001C +typedef struct { +	uint16_t	interval; +	uint16_t	window; +} __attribute__ ((packed)) write_page_activity_cp; +#define WRITE_PAGE_ACTIVITY_CP_SIZE 4 + +#define OCF_READ_INQ_ACTIVITY		0x001D +typedef struct { +	uint8_t		status; +	uint16_t	interval; +	uint16_t	window; +} __attribute__ ((packed)) read_inq_activity_rp; +#define READ_INQ_ACTIVITY_RP_SIZE 5 + +#define OCF_WRITE_INQ_ACTIVITY		0x001E +typedef struct { +	uint16_t	interval; +	uint16_t	window; +} __attribute__ ((packed)) write_inq_activity_cp; +#define WRITE_INQ_ACTIVITY_CP_SIZE 4 + +#define OCF_READ_AUTH_ENABLE		0x001F + +#define OCF_WRITE_AUTH_ENABLE		0x0020 +	#define AUTH_DISABLED		0x00 +	#define AUTH_ENABLED		0x01 + +#define OCF_READ_ENCRYPT_MODE		0x0021 + +#define OCF_WRITE_ENCRYPT_MODE		0x0022 +	#define ENCRYPT_DISABLED	0x00 +	#define ENCRYPT_P2P		0x01 +	#define ENCRYPT_BOTH		0x02 + +#define OCF_READ_CLASS_OF_DEV		0x0023 +typedef struct { +	uint8_t		status; +	uint8_t		dev_class[3]; +} __attribute__ ((packed)) read_class_of_dev_rp; +#define READ_CLASS_OF_DEV_RP_SIZE 4  + +#define OCF_WRITE_CLASS_OF_DEV		0x0024 +typedef struct { +	uint8_t		dev_class[3]; +} __attribute__ ((packed)) write_class_of_dev_cp; +#define WRITE_CLASS_OF_DEV_CP_SIZE 3 + +#define OCF_READ_VOICE_SETTING		0x0025 +typedef struct { +	uint8_t		status; +	uint16_t	voice_setting; +} __attribute__ ((packed)) read_voice_setting_rp; +#define READ_VOICE_SETTING_RP_SIZE 3 + +#define OCF_WRITE_VOICE_SETTING		0x0026 +typedef struct { +	uint16_t	voice_setting; +} __attribute__ ((packed)) write_voice_setting_cp; +#define WRITE_VOICE_SETTING_CP_SIZE 2 + +#define OCF_READ_AUTOMATIC_FLUSH_TIMEOUT	0x0027 + +#define OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT	0x0028 + +#define OCF_READ_NUM_BROADCAST_RETRANS	0x0029 + +#define OCF_WRITE_NUM_BROADCAST_RETRANS	0x002A + +#define OCF_READ_HOLD_MODE_ACTIVITY	0x002B + +#define OCF_WRITE_HOLD_MODE_ACTIVITY	0x002C + +#define OCF_READ_TRANSMIT_POWER_LEVEL	0x002D +typedef struct { +	uint16_t	handle; +	uint8_t		type; +} __attribute__ ((packed)) read_transmit_power_level_cp; +#define READ_TRANSMIT_POWER_LEVEL_CP_SIZE 3 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	int8_t		level; +} __attribute__ ((packed)) read_transmit_power_level_rp; +#define READ_TRANSMIT_POWER_LEVEL_RP_SIZE 4 + +#define OCF_READ_SYNC_FLOW_ENABLE	0x002E + +#define OCF_WRITE_SYNC_FLOW_ENABLE	0x002F + +#define OCF_SET_CONTROLLER_TO_HOST_FC	0x0031 + +#define OCF_HOST_BUFFER_SIZE		0x0033 +typedef struct { +	uint16_t	acl_mtu; +	uint8_t		sco_mtu; +	uint16_t	acl_max_pkt; +	uint16_t	sco_max_pkt; +} __attribute__ ((packed)) host_buffer_size_cp; +#define HOST_BUFFER_SIZE_CP_SIZE 7 + +#define OCF_HOST_NUM_COMP_PKTS		0x0035 +typedef struct { +	uint8_t		num_hndl; +	/* variable length part */ +} __attribute__ ((packed)) host_num_comp_pkts_cp; +#define HOST_NUM_COMP_PKTS_CP_SIZE 1 + +#define OCF_READ_LINK_SUPERVISION_TIMEOUT	0x0036 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint16_t	timeout; +} __attribute__ ((packed)) read_link_supervision_timeout_rp; +#define READ_LINK_SUPERVISION_TIMEOUT_RP_SIZE 5 + +#define OCF_WRITE_LINK_SUPERVISION_TIMEOUT	0x0037 +typedef struct { +	uint16_t	handle; +	uint16_t	timeout; +} __attribute__ ((packed)) write_link_supervision_timeout_cp; +#define WRITE_LINK_SUPERVISION_TIMEOUT_CP_SIZE 4 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +} __attribute__ ((packed)) write_link_supervision_timeout_rp; +#define WRITE_LINK_SUPERVISION_TIMEOUT_RP_SIZE 3 + +#define OCF_READ_NUM_SUPPORTED_IAC	0x0038 + +#define MAX_IAC_LAP 0x40 +#define OCF_READ_CURRENT_IAC_LAP	0x0039 +typedef struct { +	uint8_t		status; +	uint8_t		num_current_iac; +	uint8_t		lap[MAX_IAC_LAP][3]; +} __attribute__ ((packed)) read_current_iac_lap_rp; +#define READ_CURRENT_IAC_LAP_RP_SIZE 2+3*MAX_IAC_LAP + +#define OCF_WRITE_CURRENT_IAC_LAP	0x003A +typedef struct { +	uint8_t		num_current_iac; +	uint8_t		lap[MAX_IAC_LAP][3]; +} __attribute__ ((packed)) write_current_iac_lap_cp; +#define WRITE_CURRENT_IAC_LAP_CP_SIZE 1+3*MAX_IAC_LAP + +#define OCF_READ_PAGE_SCAN_PERIOD_MODE	0x003B + +#define OCF_WRITE_PAGE_SCAN_PERIOD_MODE	0x003C + +#define OCF_READ_PAGE_SCAN_MODE		0x003D + +#define OCF_WRITE_PAGE_SCAN_MODE	0x003E + +#define OCF_SET_AFH_CLASSIFICATION	0x003F +typedef struct { +	uint8_t		map[10]; +} __attribute__ ((packed)) set_afh_classification_cp; +#define SET_AFH_CLASSIFICATION_CP_SIZE 10 +typedef struct { +	uint8_t		status; +} __attribute__ ((packed)) set_afh_classification_rp; +#define SET_AFH_CLASSIFICATION_RP_SIZE 1 + +#define OCF_READ_INQUIRY_SCAN_TYPE	0x0042 +typedef struct { +	uint8_t		status; +	uint8_t		type; +} __attribute__ ((packed)) read_inquiry_scan_type_rp; +#define READ_INQUIRY_SCAN_TYPE_RP_SIZE 2 + +#define OCF_WRITE_INQUIRY_SCAN_TYPE	0x0043 +typedef struct { +	uint8_t		type; +} __attribute__ ((packed)) write_inquiry_scan_type_cp; +#define WRITE_INQUIRY_SCAN_TYPE_CP_SIZE 1 +typedef struct { +	uint8_t		status; +} __attribute__ ((packed)) write_inquiry_scan_type_rp; +#define WRITE_INQUIRY_SCAN_TYPE_RP_SIZE 1 + +#define OCF_READ_INQUIRY_MODE		0x0044 +typedef struct { +	uint8_t		status; +	uint8_t		mode; +} __attribute__ ((packed)) read_inquiry_mode_rp; +#define READ_INQUIRY_MODE_RP_SIZE 2 + +#define OCF_WRITE_INQUIRY_MODE		0x0045 +typedef struct { +	uint8_t		mode; +} __attribute__ ((packed)) write_inquiry_mode_cp; +#define WRITE_INQUIRY_MODE_CP_SIZE 1 +typedef struct { +	uint8_t		status; +} __attribute__ ((packed)) write_inquiry_mode_rp; +#define WRITE_INQUIRY_MODE_RP_SIZE 1 + +#define OCF_READ_PAGE_SCAN_TYPE		0x0046 + +#define OCF_WRITE_PAGE_SCAN_TYPE	0x0047 + +#define OCF_READ_AFH_MODE		0x0048 +typedef struct { +	uint8_t		status; +	uint8_t		mode; +} __attribute__ ((packed)) read_afh_mode_rp; +#define READ_AFH_MODE_RP_SIZE 2 + +#define OCF_WRITE_AFH_MODE		0x0049 +typedef struct { +	uint8_t		mode; +} __attribute__ ((packed)) write_afh_mode_cp; +#define WRITE_AFH_MODE_CP_SIZE 1 +typedef struct { +	uint8_t		status; +} __attribute__ ((packed)) write_afh_mode_rp; +#define WRITE_AFH_MODE_RP_SIZE 1 + +#define OCF_READ_EXT_INQUIRY_RESPONSE	0x0051 +typedef struct { +	uint8_t		status; +	uint8_t		fec; +	uint8_t		data[240]; +} __attribute__ ((packed)) read_ext_inquiry_response_rp; +#define READ_EXT_INQUIRY_RESPONSE_RP_SIZE 242 + +#define OCF_WRITE_EXT_INQUIRY_RESPONSE	0x0052 +typedef struct { +	uint8_t		fec; +	uint8_t		data[240]; +} __attribute__ ((packed)) write_ext_inquiry_response_cp; +#define WRITE_EXT_INQUIRY_RESPONSE_CP_SIZE 241 +typedef struct { +	uint8_t		status; +} __attribute__ ((packed)) write_ext_inquiry_response_rp; +#define WRITE_EXT_INQUIRY_RESPONSE_RP_SIZE 1 + +#define OCF_REFRESH_ENCRYPTION_KEY	0x0053 +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) refresh_encryption_key_cp; +#define REFRESH_ENCRYPTION_KEY_CP_SIZE 2 +typedef struct { +	uint8_t		status; +} __attribute__ ((packed)) refresh_encryption_key_rp; +#define REFRESH_ENCRYPTION_KEY_RP_SIZE 1 + +#define OCF_READ_SIMPLE_PAIRING_MODE	0x0055 +typedef struct { +	uint8_t		status; +	uint8_t		mode; +} __attribute__ ((packed)) read_simple_pairing_mode_rp; +#define READ_SIMPLE_PAIRING_MODE_RP_SIZE 2 + +#define OCF_WRITE_SIMPLE_PAIRING_MODE	0x0056 +typedef struct { +	uint8_t		mode; +} __attribute__ ((packed)) write_simple_pairing_mode_cp; +#define WRITE_SIMPLE_PAIRING_MODE_CP_SIZE 1 +typedef struct { +	uint8_t		status; +} __attribute__ ((packed)) write_simple_pairing_mode_rp; +#define WRITE_SIMPLE_PAIRING_MODE_RP_SIZE 1 + +#define OCF_READ_LOCAL_OOB_DATA		0x0057 +typedef struct { +	uint8_t		status; +	uint8_t		hash[16]; +	uint8_t		randomizer[16]; +} __attribute__ ((packed)) read_local_oob_data_rp; +#define READ_LOCAL_OOB_DATA_RP_SIZE 33 + +#define OCF_READ_INQUIRY_TRANSMIT_POWER_LEVEL	0x0058 +typedef struct { +	uint8_t		status; +	int8_t		level; +} __attribute__ ((packed)) read_inquiry_transmit_power_level_rp; +#define READ_INQUIRY_TRANSMIT_POWER_LEVEL_RP_SIZE 2 + +#define OCF_WRITE_INQUIRY_TRANSMIT_POWER_LEVEL	0x0059 +typedef struct { +	int8_t		level; +} __attribute__ ((packed)) write_inquiry_transmit_power_level_cp; +#define WRITE_INQUIRY_TRANSMIT_POWER_LEVEL_CP_SIZE 1 +typedef struct { +	uint8_t		status; +} __attribute__ ((packed)) write_inquiry_transmit_power_level_rp; +#define WRITE_INQUIRY_TRANSMIT_POWER_LEVEL_RP_SIZE 1 + +#define OCF_READ_DEFAULT_ERROR_DATA_REPORTING	0x005A +typedef struct { +	uint8_t		status; +	uint8_t		reporting; +} __attribute__ ((packed)) read_default_error_data_reporting_rp; +#define READ_DEFAULT_ERROR_DATA_REPORTING_RP_SIZE 2 + +#define OCF_WRITE_DEFAULT_ERROR_DATA_REPORTING	0x005B +typedef struct { +	uint8_t		reporting; +} __attribute__ ((packed)) write_default_error_data_reporting_cp; +#define WRITE_DEFAULT_ERROR_DATA_REPORTING_CP_SIZE 1 +typedef struct { +	uint8_t		status; +} __attribute__ ((packed)) write_default_error_data_reporting_rp; +#define WRITE_DEFAULT_ERROR_DATA_REPORTING_RP_SIZE 1 + +#define OCF_ENHANCED_FLUSH		0x005F +typedef struct { +	uint16_t	handle; +	uint8_t		type; +} __attribute__ ((packed)) enhanced_flush_cp; +#define ENHANCED_FLUSH_CP_SIZE 3 + +#define OCF_SEND_KEYPRESS_NOTIFY	0x0060 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		type; +} __attribute__ ((packed)) send_keypress_notify_cp; +#define SEND_KEYPRESS_NOTIFY_CP_SIZE 7 +typedef struct { +	uint8_t		status; +} __attribute__ ((packed)) send_keypress_notify_rp; +#define SEND_KEYPRESS_NOTIFY_RP_SIZE 1 + +/* Informational Parameters */ +#define OGF_INFO_PARAM		0x04 + +#define OCF_READ_LOCAL_VERSION		0x0001 +typedef struct { +	uint8_t		status; +	uint8_t		hci_ver; +	uint16_t	hci_rev; +	uint8_t		lmp_ver; +	uint16_t	manufacturer; +	uint16_t	lmp_subver; +} __attribute__ ((packed)) read_local_version_rp; +#define READ_LOCAL_VERSION_RP_SIZE 9 + +#define OCF_READ_LOCAL_COMMANDS		0x0002 +typedef struct { +	uint8_t		status; +	uint8_t		commands[64]; +} __attribute__ ((packed)) read_local_commands_rp; +#define READ_LOCAL_COMMANDS_RP_SIZE 65 + +#define OCF_READ_LOCAL_FEATURES		0x0003 +typedef struct { +	uint8_t		status; +	uint8_t		features[8]; +} __attribute__ ((packed)) read_local_features_rp; +#define READ_LOCAL_FEATURES_RP_SIZE 9 + +#define OCF_READ_LOCAL_EXT_FEATURES	0x0004 +typedef struct { +	uint8_t		page_num; +} __attribute__ ((packed)) read_local_ext_features_cp; +#define READ_LOCAL_EXT_FEATURES_CP_SIZE 1 +typedef struct { +	uint8_t		status; +	uint8_t		page_num; +	uint8_t		max_page_num; +	uint8_t		features[8]; +} __attribute__ ((packed)) read_local_ext_features_rp; +#define READ_LOCAL_EXT_FEATURES_RP_SIZE 11 + +#define OCF_READ_BUFFER_SIZE		0x0005 +typedef struct { +	uint8_t		status; +	uint16_t	acl_mtu; +	uint8_t		sco_mtu; +	uint16_t	acl_max_pkt; +	uint16_t	sco_max_pkt; +} __attribute__ ((packed)) read_buffer_size_rp; +#define READ_BUFFER_SIZE_RP_SIZE 8 + +#define OCF_READ_COUNTRY_CODE		0x0007 + +#define OCF_READ_BD_ADDR		0x0009 +typedef struct { +	uint8_t		status; +	bdaddr_t	bdaddr; +} __attribute__ ((packed)) read_bd_addr_rp; +#define READ_BD_ADDR_RP_SIZE 7 + +/* Status params */ +#define OGF_STATUS_PARAM	0x05 + +#define OCF_READ_FAILED_CONTACT_COUNTER		0x0001 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		counter; +} __attribute__ ((packed)) read_failed_contact_counter_rp; +#define READ_FAILED_CONTACT_COUNTER_RP_SIZE 4 + +#define OCF_RESET_FAILED_CONTACT_COUNTER	0x0002 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +} __attribute__ ((packed)) reset_failed_contact_counter_rp; +#define RESET_FAILED_CONTACT_COUNTER_RP_SIZE 4 + +#define OCF_READ_LINK_QUALITY		0x0003 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		link_quality; +} __attribute__ ((packed)) read_link_quality_rp; +#define READ_LINK_QUALITY_RP_SIZE 4 + +#define OCF_READ_RSSI			0x0005 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	int8_t		rssi; +} __attribute__ ((packed)) read_rssi_rp; +#define READ_RSSI_RP_SIZE 4 + +#define OCF_READ_AFH_MAP		0x0006 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		mode; +	uint8_t		map[10]; +} __attribute__ ((packed)) read_afh_map_rp; +#define READ_AFH_MAP_RP_SIZE 14 + +#define OCF_READ_CLOCK			0x0007 +typedef struct { +	uint16_t	handle; +	uint8_t		which_clock; +} __attribute__ ((packed)) read_clock_cp; +#define READ_CLOCK_CP_SIZE 3 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint32_t	clock; +	uint16_t	accuracy; +} __attribute__ ((packed)) read_clock_rp; +#define READ_CLOCK_RP_SIZE 9 + +/* Testing commands */ +#define OGF_TESTING_CMD		0x3e + +#define OCF_READ_LOOPBACK_MODE			0x0001 + +#define OCF_WRITE_LOOPBACK_MODE			0x0002 + +#define OCF_ENABLE_DEVICE_UNDER_TEST_MODE	0x0003 + +#define OCF_WRITE_SIMPLE_PAIRING_DEBUG_MODE	0x0004 +typedef struct { +	uint8_t		mode; +} __attribute__ ((packed)) write_simple_pairing_debug_mode_cp; +#define WRITE_SIMPLE_PAIRING_DEBUG_MODE_CP_SIZE 1 +typedef struct { +	uint8_t		status; +} __attribute__ ((packed)) write_simple_pairing_debug_mode_rp; +#define WRITE_SIMPLE_PAIRING_DEBUG_MODE_RP_SIZE 1 + +/* Vendor specific commands */ +#define OGF_VENDOR_CMD		0x3f + +/* ---- HCI Events ---- */ + +#define EVT_INQUIRY_COMPLETE		0x01 + +#define EVT_INQUIRY_RESULT		0x02 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		pscan_rep_mode; +	uint8_t		pscan_period_mode; +	uint8_t		pscan_mode; +	uint8_t		dev_class[3]; +	uint16_t	clock_offset; +} __attribute__ ((packed)) inquiry_info; +#define INQUIRY_INFO_SIZE 14 + +#define EVT_CONN_COMPLETE		0x03 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	bdaddr_t	bdaddr; +	uint8_t		link_type; +	uint8_t		encr_mode; +} __attribute__ ((packed)) evt_conn_complete; +#define EVT_CONN_COMPLETE_SIZE 13 + +#define EVT_CONN_REQUEST		0x04 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		dev_class[3]; +	uint8_t		link_type; +} __attribute__ ((packed)) evt_conn_request; +#define EVT_CONN_REQUEST_SIZE 10 + +#define EVT_DISCONN_COMPLETE		0x05 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		reason; +} __attribute__ ((packed)) evt_disconn_complete; +#define EVT_DISCONN_COMPLETE_SIZE 4 + +#define EVT_AUTH_COMPLETE		0x06 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +} __attribute__ ((packed)) evt_auth_complete; +#define EVT_AUTH_COMPLETE_SIZE 3 + +#define EVT_REMOTE_NAME_REQ_COMPLETE	0x07 +typedef struct { +	uint8_t		status; +	bdaddr_t	bdaddr; +	uint8_t		name[248]; +} __attribute__ ((packed)) evt_remote_name_req_complete; +#define EVT_REMOTE_NAME_REQ_COMPLETE_SIZE 255 + +#define EVT_ENCRYPT_CHANGE		0x08 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		encrypt; +} __attribute__ ((packed)) evt_encrypt_change; +#define EVT_ENCRYPT_CHANGE_SIZE 5 + +#define EVT_CHANGE_CONN_LINK_KEY_COMPLETE	0x09 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +}  __attribute__ ((packed)) evt_change_conn_link_key_complete; +#define EVT_CHANGE_CONN_LINK_KEY_COMPLETE_SIZE 3 + +#define EVT_MASTER_LINK_KEY_COMPLETE		0x0A +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		key_flag; +} __attribute__ ((packed)) evt_master_link_key_complete; +#define EVT_MASTER_LINK_KEY_COMPLETE_SIZE 4 + +#define EVT_READ_REMOTE_FEATURES_COMPLETE	0x0B +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		features[8]; +} __attribute__ ((packed)) evt_read_remote_features_complete; +#define EVT_READ_REMOTE_FEATURES_COMPLETE_SIZE 11 + +#define EVT_READ_REMOTE_VERSION_COMPLETE	0x0C +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		lmp_ver; +	uint16_t	manufacturer; +	uint16_t	lmp_subver; +} __attribute__ ((packed)) evt_read_remote_version_complete; +#define EVT_READ_REMOTE_VERSION_COMPLETE_SIZE 8 + +#define EVT_QOS_SETUP_COMPLETE		0x0D +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		flags;			/* Reserved */ +	hci_qos		qos; +} __attribute__ ((packed)) evt_qos_setup_complete; +#define EVT_QOS_SETUP_COMPLETE_SIZE (4 + HCI_QOS_CP_SIZE) + +#define EVT_CMD_COMPLETE 		0x0E +typedef struct { +	uint8_t		ncmd; +	uint16_t	opcode; +} __attribute__ ((packed)) evt_cmd_complete; +#define EVT_CMD_COMPLETE_SIZE 3 + +#define EVT_CMD_STATUS 			0x0F +typedef struct { +	uint8_t		status; +	uint8_t		ncmd; +	uint16_t	opcode; +} __attribute__ ((packed)) evt_cmd_status; +#define EVT_CMD_STATUS_SIZE 4 + +#define EVT_HARDWARE_ERROR		0x10 +typedef struct { +	uint8_t		code; +} __attribute__ ((packed)) evt_hardware_error; +#define EVT_HARDWARE_ERROR_SIZE 1 + +#define EVT_FLUSH_OCCURRED		0x11 +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) evt_flush_occured; +#define EVT_FLUSH_OCCURRED_SIZE 2 + +#define EVT_ROLE_CHANGE			0x12 +typedef struct { +	uint8_t		status; +	bdaddr_t	bdaddr; +	uint8_t		role; +} __attribute__ ((packed)) evt_role_change; +#define EVT_ROLE_CHANGE_SIZE 8 + +#define EVT_NUM_COMP_PKTS		0x13 +typedef struct { +	uint8_t		num_hndl; +	/* variable length part */ +} __attribute__ ((packed)) evt_num_comp_pkts; +#define EVT_NUM_COMP_PKTS_SIZE 1 + +#define EVT_MODE_CHANGE			0x14 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		mode; +	uint16_t	interval; +} __attribute__ ((packed)) evt_mode_change; +#define EVT_MODE_CHANGE_SIZE 6 + +#define EVT_RETURN_LINK_KEYS		0x15 +typedef struct { +	uint8_t		num_keys; +	/* variable length part */ +} __attribute__ ((packed)) evt_return_link_keys; +#define EVT_RETURN_LINK_KEYS_SIZE 1 + +#define EVT_PIN_CODE_REQ		0x16 +typedef struct { +	bdaddr_t	bdaddr; +} __attribute__ ((packed)) evt_pin_code_req; +#define EVT_PIN_CODE_REQ_SIZE 6 + +#define EVT_LINK_KEY_REQ		0x17 +typedef struct { +	bdaddr_t	bdaddr; +} __attribute__ ((packed)) evt_link_key_req; +#define EVT_LINK_KEY_REQ_SIZE 6 + +#define EVT_LINK_KEY_NOTIFY		0x18 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		link_key[16]; +	uint8_t		key_type; +} __attribute__ ((packed)) evt_link_key_notify; +#define EVT_LINK_KEY_NOTIFY_SIZE 23 + +#define EVT_LOOPBACK_COMMAND		0x19 + +#define EVT_DATA_BUFFER_OVERFLOW	0x1A +typedef struct { +	uint8_t		link_type; +} __attribute__ ((packed)) evt_data_buffer_overflow; +#define EVT_DATA_BUFFER_OVERFLOW_SIZE 1 + +#define EVT_MAX_SLOTS_CHANGE		0x1B +typedef struct { +	uint16_t	handle; +	uint8_t		max_slots; +} __attribute__ ((packed)) evt_max_slots_change; +#define EVT_MAX_SLOTS_CHANGE_SIZE 3 + +#define EVT_READ_CLOCK_OFFSET_COMPLETE	0x1C +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint16_t	clock_offset; +} __attribute__ ((packed)) evt_read_clock_offset_complete; +#define EVT_READ_CLOCK_OFFSET_COMPLETE_SIZE 5 + +#define EVT_CONN_PTYPE_CHANGED		0x1D +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint16_t	ptype; +} __attribute__ ((packed)) evt_conn_ptype_changed; +#define EVT_CONN_PTYPE_CHANGED_SIZE 5 + +#define EVT_QOS_VIOLATION		0x1E +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) evt_qos_violation; +#define EVT_QOS_VIOLATION_SIZE 2 + +#define EVT_PSCAN_REP_MODE_CHANGE	0x20 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		pscan_rep_mode; +} __attribute__ ((packed)) evt_pscan_rep_mode_change; +#define EVT_PSCAN_REP_MODE_CHANGE_SIZE 7 + +#define EVT_FLOW_SPEC_COMPLETE		0x21 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		flags; +	uint8_t		direction; +	hci_qos		qos; +} __attribute__ ((packed)) evt_flow_spec_complete; +#define EVT_FLOW_SPEC_COMPLETE_SIZE (5 + HCI_QOS_CP_SIZE) + +#define EVT_INQUIRY_RESULT_WITH_RSSI	0x22 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		pscan_rep_mode; +	uint8_t		pscan_period_mode; +	uint8_t		dev_class[3]; +	uint16_t	clock_offset; +	int8_t		rssi; +} __attribute__ ((packed)) inquiry_info_with_rssi; +#define INQUIRY_INFO_WITH_RSSI_SIZE 14 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		pscan_rep_mode; +	uint8_t		pscan_period_mode; +	uint8_t		pscan_mode; +	uint8_t		dev_class[3]; +	uint16_t	clock_offset; +	int8_t		rssi; +} __attribute__ ((packed)) inquiry_info_with_rssi_and_pscan_mode; +#define INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE 15 + +#define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE	0x23 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		page_num; +	uint8_t		max_page_num; +	uint8_t		features[8]; +} __attribute__ ((packed)) evt_read_remote_ext_features_complete; +#define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE_SIZE 13 + +#define EVT_SYNC_CONN_COMPLETE		0x2C +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	bdaddr_t	bdaddr; +	uint8_t		link_type; +	uint8_t		trans_interval; +	uint8_t		retrans_window; +	uint16_t	rx_pkt_len; +	uint16_t	tx_pkt_len; +	uint8_t		air_mode; +} __attribute__ ((packed)) evt_sync_conn_complete; +#define EVT_SYNC_CONN_COMPLETE_SIZE 17 + +#define EVT_SYNC_CONN_CHANGED		0x2D +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint8_t		trans_interval; +	uint8_t		retrans_window; +	uint16_t	rx_pkt_len; +	uint16_t	tx_pkt_len; +} __attribute__ ((packed)) evt_sync_conn_changed; +#define EVT_SYNC_CONN_CHANGED_SIZE 9 + +#define EVT_SNIFF_SUBRATING		0x2E +typedef struct { +	uint8_t		status; +	uint16_t	handle; +	uint16_t	max_tx_latency; +	uint16_t	max_rx_latency; +	uint16_t	min_remote_timeout; +	uint16_t	min_local_timeout; +} __attribute__ ((packed)) evt_sniff_subrating; +#define EVT_SNIFF_SUBRATING_SIZE 11 + +#define EVT_EXTENDED_INQUIRY_RESULT	0x2F +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		pscan_rep_mode; +	uint8_t		pscan_period_mode; +	uint8_t		dev_class[3]; +	uint16_t	clock_offset; +	int8_t		rssi; +	uint8_t		data[240]; +} __attribute__ ((packed)) extended_inquiry_info; +#define EXTENDED_INQUIRY_INFO_SIZE 254 + +#define EVT_ENCRYPTION_KEY_REFRESH_COMPLETE	0x30 +typedef struct { +	uint8_t		status; +	uint16_t	handle; +} __attribute__ ((packed)) evt_encryption_key_refresh_complete; +#define EVT_ENCRYPTION_KEY_REFRESH_COMPLETE_SIZE 3 + +#define EVT_IO_CAPABILITY_REQUEST	0x31 +typedef struct { +	bdaddr_t	bdaddr; +} __attribute__ ((packed)) evt_io_capability_request; +#define EVT_IO_CAPABILITY_REQUEST_SIZE 6 + +#define EVT_IO_CAPABILITY_RESPONSE	0x32 +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		capability; +	uint8_t		oob_data; +	uint8_t		authentication; +} __attribute__ ((packed)) evt_io_capability_response; +#define EVT_IO_CAPABILITY_RESPONSE_SIZE 9 + +#define EVT_USER_CONFIRM_REQUEST	0x33 +typedef struct { +	bdaddr_t	bdaddr; +	uint32_t	passkey; +} __attribute__ ((packed)) evt_user_confirm_request; +#define EVT_USER_CONFIRM_REQUEST_SIZE 10 + +#define EVT_USER_PASSKEY_REQUEST	0x34 +typedef struct { +	bdaddr_t	bdaddr; +} __attribute__ ((packed)) evt_user_passkey_request; +#define EVT_USER_PASSKEY_REQUEST_SIZE 6 + +#define EVT_REMOTE_OOB_DATA_REQUEST	0x35 +typedef struct { +	bdaddr_t	bdaddr; +} __attribute__ ((packed)) evt_remote_oob_data_request; +#define EVT_REMOTE_OOB_DATA_REQUEST_SIZE 6 + +#define EVT_SIMPLE_PAIRING_COMPLETE	0x36 +typedef struct { +	uint8_t		status; +	bdaddr_t	bdaddr; +} __attribute__ ((packed)) evt_simple_pairing_complete; +#define EVT_SIMPLE_PAIRING_COMPLETE_SIZE 7 + +#define EVT_LINK_SUPERVISION_TIMEOUT_CHANGED	0x38 +typedef struct { +	uint16_t	handle; +	uint16_t	timeout; +} __attribute__ ((packed)) evt_link_supervision_timeout_changed; +#define EVT_LINK_SUPERVISION_TIMEOUT_CHANGED_SIZE 4 + +#define EVT_ENHANCED_FLUSH_COMPLETE	0x39 +typedef struct { +	uint16_t	handle; +} __attribute__ ((packed)) evt_enhanced_flush_complete; +#define EVT_ENHANCED_FLUSH_COMPLETE_SIZE 2 + +#define EVT_USER_PASSKEY_NOTIFY		0x3B +typedef struct { +	bdaddr_t	bdaddr; +	uint32_t	passkey; +} __attribute__ ((packed)) evt_user_passkey_notify; +#define EVT_USER_PASSKEY_NOTIFY_SIZE 10 + +#define EVT_KEYPRESS_NOTIFY		0x3C +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		type; +} __attribute__ ((packed)) evt_keypress_notify; +#define EVT_KEYPRESS_NOTIFY_SIZE 7 + +#define EVT_REMOTE_HOST_FEATURES_NOTIFY	0x3D +typedef struct { +	bdaddr_t	bdaddr; +	uint8_t		features[8]; +} __attribute__ ((packed)) evt_remote_host_features_notify; +#define EVT_REMOTE_HOST_FEATURES_NOTIFY_SIZE 14 + +#define EVT_TESTING			0xFE + +#define EVT_VENDOR			0xFF + +/* Internal events generated by BlueZ stack */ +#define EVT_STACK_INTERNAL		0xFD +typedef struct { +	uint16_t	type; +	uint8_t		data[0]; +} __attribute__ ((packed)) evt_stack_internal; +#define EVT_STACK_INTERNAL_SIZE 2 + +#define EVT_SI_DEVICE	0x01 +typedef struct { +	uint16_t	event; +	uint16_t	dev_id; +} __attribute__ ((packed)) evt_si_device; +#define EVT_SI_DEVICE_SIZE 4 + +#define EVT_SI_SECURITY	0x02 +typedef struct { +	uint16_t	event; +	uint16_t	proto; +	uint16_t	subproto; +	uint8_t		incoming; +} __attribute__ ((packed)) evt_si_security; + +/* --------  HCI Packet structures  -------- */ +#define HCI_TYPE_LEN	1 + +typedef struct { +	uint16_t	opcode;		/* OCF & OGF */ +	uint8_t		plen; +} __attribute__ ((packed))	hci_command_hdr; +#define HCI_COMMAND_HDR_SIZE 	3 + +typedef struct { +	uint8_t		evt; +	uint8_t		plen; +} __attribute__ ((packed))	hci_event_hdr; +#define HCI_EVENT_HDR_SIZE 	2 + +typedef struct { +	uint16_t	handle;		/* Handle & Flags(PB, BC) */ +	uint16_t	dlen; +} __attribute__ ((packed))	hci_acl_hdr; +#define HCI_ACL_HDR_SIZE 	4 + +typedef struct { +	uint16_t	handle; +	uint8_t		dlen; +} __attribute__ ((packed))	hci_sco_hdr; +#define HCI_SCO_HDR_SIZE 	3 + +typedef struct { +	uint16_t	device; +	uint16_t	type; +	uint16_t	plen; +} __attribute__ ((packed))	hci_msg_hdr; +#define HCI_MSG_HDR_SIZE	6 + +/* Command opcode pack/unpack */ +#define cmd_opcode_pack(ogf, ocf)	(uint16_t)((ocf & 0x03ff)|(ogf << 10)) +#define cmd_opcode_ogf(op)		(op >> 10) +#define cmd_opcode_ocf(op)		(op & 0x03ff) + +/* ACL handle and flags pack/unpack */ +#define acl_handle_pack(h, f)	(uint16_t)((h & 0x0fff)|(f << 12)) +#define acl_handle(h)		(h & 0x0fff) +#define acl_flags(h)		(h >> 12) + +#endif /* _NO_HCI_DEFS */ + +/* HCI Socket options */ +#define HCI_DATA_DIR	1 +#define HCI_FILTER	2 +#define HCI_TIME_STAMP	3 + +/* HCI CMSG flags */ +#define HCI_CMSG_DIR	0x0001 +#define HCI_CMSG_TSTAMP	0x0002 + +struct sockaddr_hci { +	sa_family_t	hci_family; +	unsigned short	hci_dev; +}; +#define HCI_DEV_NONE	0xffff + +struct hci_filter { +	uint32_t type_mask; +	uint32_t event_mask[2]; +	uint16_t opcode; +}; + +#define HCI_FLT_TYPE_BITS	31 +#define HCI_FLT_EVENT_BITS	63 +#define HCI_FLT_OGF_BITS	63 +#define HCI_FLT_OCF_BITS	127 + +/* Ioctl requests structures */ +struct hci_dev_stats { +	uint32_t err_rx; +	uint32_t err_tx; +	uint32_t cmd_tx; +	uint32_t evt_rx; +	uint32_t acl_tx; +	uint32_t acl_rx; +	uint32_t sco_tx; +	uint32_t sco_rx; +	uint32_t byte_rx; +	uint32_t byte_tx; +}; + +struct hci_dev_info { +	uint16_t dev_id; +	char     name[8]; + +	bdaddr_t bdaddr; + +	uint32_t flags; +	uint8_t  type; + +	uint8_t  features[8]; + +	uint32_t pkt_type; +	uint32_t link_policy; +	uint32_t link_mode; + +	uint16_t acl_mtu; +	uint16_t acl_pkts; +	uint16_t sco_mtu; +	uint16_t sco_pkts; + +	struct   hci_dev_stats stat; +}; + +struct hci_conn_info { +	uint16_t handle; +	bdaddr_t bdaddr; +	uint8_t  type; +	uint8_t	 out; +	uint16_t state; +	uint32_t link_mode; +}; + +struct hci_dev_req { +	uint16_t dev_id; +	uint32_t dev_opt; +}; + +struct hci_dev_list_req { +	uint16_t dev_num; +	struct hci_dev_req dev_req[0];	/* hci_dev_req structures */ +}; + +struct hci_conn_list_req { +	uint16_t dev_id; +	uint16_t conn_num; +	struct hci_conn_info conn_info[0]; +}; + +struct hci_conn_info_req { +	bdaddr_t bdaddr; +	uint8_t  type; +	struct hci_conn_info conn_info[0]; +}; + +struct hci_auth_info_req { +	bdaddr_t bdaddr; +	uint8_t  type; +}; + +struct hci_inquiry_req { +	uint16_t dev_id; +	uint16_t flags; +	uint8_t  lap[3]; +	uint8_t  length; +	uint8_t  num_rsp; +}; +#define IREQ_CACHE_FLUSH 0x0001 + +struct hci_remotename_req { +	uint16_t dev_id; +	uint16_t flags; +	bdaddr_t bdaddr; +	uint8_t  name[248]; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __HCI_H */ diff --git a/include/hci_lib.h b/include/hci_lib.h new file mode 100644 index 00000000..ccd155a5 --- /dev/null +++ b/include/hci_lib.h @@ -0,0 +1,213 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2000-2001  Qualcomm Incorporated + *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com> + *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifndef __HCI_LIB_H +#define __HCI_LIB_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct hci_request { +	uint16_t ogf; +	uint16_t ocf; +	int      event; +	void     *cparam; +	int      clen; +	void     *rparam; +	int      rlen; +}; + +struct hci_version { +	uint16_t manufacturer; +	uint8_t  hci_ver; +	uint16_t hci_rev; +	uint8_t  lmp_ver; +	uint16_t lmp_subver; +}; + +int hci_open_dev(int dev_id); +int hci_close_dev(int dd); +int hci_send_cmd(int dd, uint16_t ogf, uint16_t ocf, uint8_t plen, void *param); +int hci_send_req(int dd, struct hci_request *req, int timeout); + +int hci_create_connection(int dd, const bdaddr_t *bdaddr, uint16_t ptype, uint16_t clkoffset, uint8_t rswitch, uint16_t *handle, int to); +int hci_disconnect(int dd, uint16_t handle, uint8_t reason, int to); + +int hci_inquiry(int dev_id, int len, int num_rsp, const uint8_t *lap, inquiry_info **ii, long flags); +int hci_devinfo(int dev_id, struct hci_dev_info *di); +int hci_devba(int dev_id, bdaddr_t *bdaddr); +int hci_devid(const char *str); + +int hci_read_local_name(int dd, int len, char *name, int to); +int hci_write_local_name(int dd, const char *name, int to); +int hci_read_remote_name(int dd, const bdaddr_t *bdaddr, int len, char *name, int to); +int hci_read_remote_name_with_clock_offset(int dd, const bdaddr_t *bdaddr, uint8_t pscan_rep_mode, uint16_t clkoffset, int len, char *name, int to); +int hci_read_remote_name_cancel(int dd, const bdaddr_t *bdaddr, int to); +int hci_read_remote_version(int dd, uint16_t handle, struct hci_version *ver, int to); +int hci_read_remote_features(int dd, uint16_t handle, uint8_t *features, int to); +int hci_read_remote_ext_features(int dd, uint16_t handle, uint8_t page, uint8_t *max_page, uint8_t *features, int to); +int hci_read_clock_offset(int dd, uint16_t handle, uint16_t *clkoffset, int to); +int hci_read_local_version(int dd, struct hci_version *ver, int to); +int hci_read_local_commands(int dd, uint8_t *commands, int to); +int hci_read_local_features(int dd, uint8_t *features, int to); +int hci_read_local_ext_features(int dd, uint8_t page, uint8_t *max_page, uint8_t *features, int to); +int hci_read_bd_addr(int dd, bdaddr_t *bdaddr, int to); +int hci_read_class_of_dev(int dd, uint8_t *cls, int to); +int hci_write_class_of_dev(int dd, uint32_t cls, int to); +int hci_read_voice_setting(int dd, uint16_t *vs, int to); +int hci_write_voice_setting(int dd, uint16_t vs, int to); +int hci_read_current_iac_lap(int dd, uint8_t *num_iac, uint8_t *lap, int to); +int hci_write_current_iac_lap(int dd, uint8_t num_iac, uint8_t *lap, int to); +int hci_read_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t all, int to); +int hci_write_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t *key, int to); +int hci_delete_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t all, int to); +int hci_authenticate_link(int dd, uint16_t handle, int to); +int hci_encrypt_link(int dd, uint16_t handle, uint8_t encrypt, int to); +int hci_change_link_key(int dd, uint16_t handle, int to); +int hci_switch_role(int dd, bdaddr_t *bdaddr, uint8_t role, int to); +int hci_park_mode(int dd, uint16_t handle, uint16_t max_interval, uint16_t min_interval, int to); +int hci_exit_park_mode(int dd, uint16_t handle, int to); +int hci_read_inquiry_scan_type(int dd, uint8_t *type, int to); +int hci_write_inquiry_scan_type(int dd, uint8_t type, int to); +int hci_read_inquiry_mode(int dd, uint8_t *mode, int to); +int hci_write_inquiry_mode(int dd, uint8_t mode, int to); +int hci_read_afh_mode(int dd, uint8_t *mode, int to); +int hci_write_afh_mode(int dd, uint8_t mode, int to); +int hci_read_ext_inquiry_response(int dd, uint8_t *fec, uint8_t *data, int to); +int hci_write_ext_inquiry_response(int dd, uint8_t fec, uint8_t *data, int to); +int hci_read_simple_pairing_mode(int dd, uint8_t *mode, int to); +int hci_write_simple_pairing_mode(int dd, uint8_t mode, int to); +int hci_read_local_oob_data(int dd, uint8_t *hash, uint8_t *randomizer, int to); +int hci_read_inquiry_transmit_power_level(int dd, int8_t *level, int to); +int hci_write_inquiry_transmit_power_level(int dd, int8_t level, int to); +int hci_read_transmit_power_level(int dd, uint16_t handle, uint8_t type, int8_t *level, int to); +int hci_read_link_policy(int dd, uint16_t handle, uint16_t *policy, int to); +int hci_write_link_policy(int dd, uint16_t handle, uint16_t policy, int to); +int hci_read_link_supervision_timeout(int dd, uint16_t handle, uint16_t *timeout, int to); +int hci_write_link_supervision_timeout(int dd, uint16_t handle, uint16_t timeout, int to); +int hci_set_afh_classification(int dd, uint8_t *map, int to); +int hci_read_link_quality(int dd, uint16_t handle, uint8_t *link_quality, int to); +int hci_read_rssi(int dd, uint16_t handle, int8_t *rssi, int to); +int hci_read_afh_map(int dd, uint16_t handle, uint8_t *mode, uint8_t *map, int to); +int hci_read_clock(int dd, uint16_t handle, uint8_t which, uint32_t *clock, uint16_t *accuracy, int to); + +int hci_local_name(int dd, int len, char *name, int to); +int hci_remote_name(int dd, const bdaddr_t *bdaddr, int len, char *name, int to); + +int hci_for_each_dev(int flag, int(*func)(int dd, int dev_id, long arg), long arg); +int hci_get_route(bdaddr_t *bdaddr); + +char *hci_dtypetostr(int type); +char *hci_dflagstostr(uint32_t flags); +char *hci_ptypetostr(unsigned int ptype); +int hci_strtoptype(char *str, unsigned int *val); +char *hci_scoptypetostr(unsigned int ptype); +int hci_strtoscoptype(char *str, unsigned int *val); +char *hci_lptostr(unsigned int ptype); +int hci_strtolp(char *str, unsigned int *val); +char *hci_lmtostr(unsigned int ptype); +int hci_strtolm(char *str, unsigned int *val); + +char *hci_cmdtostr(unsigned int cmd); +char *hci_commandstostr(uint8_t *commands, char *pref, int width); + +char *hci_vertostr(unsigned int ver); +int hci_strtover(char *str, unsigned int *ver); +char *lmp_vertostr(unsigned int ver); +int lmp_strtover(char *str, unsigned int *ver); + +char *lmp_featurestostr(uint8_t *features, char *pref, int width); + +static inline void hci_set_bit(int nr, void *addr) +{ +	*((uint32_t *) addr + (nr >> 5)) |= (1 << (nr & 31)); +} + +static inline void hci_clear_bit(int nr, void *addr) +{ +	*((uint32_t *) addr + (nr >> 5)) &= ~(1 << (nr & 31)); +} + +static inline int hci_test_bit(int nr, void *addr) +{ +	return *((uint32_t *) addr + (nr >> 5)) & (1 << (nr & 31)); +} + +/* HCI filter tools */ +static inline void hci_filter_clear(struct hci_filter *f) +{ +	memset(f, 0, sizeof(*f)); +} +static inline void hci_filter_set_ptype(int t, struct hci_filter *f) +{ +	hci_set_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask); +} +static inline void hci_filter_clear_ptype(int t, struct hci_filter *f) +{ +	hci_clear_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask); +} +static inline int hci_filter_test_ptype(int t, struct hci_filter *f) +{ +	return hci_test_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask); +} +static inline void hci_filter_all_ptypes(struct hci_filter *f) +{ +	memset((void *) &f->type_mask, 0xff, sizeof(f->type_mask)); +} +static inline void hci_filter_set_event(int e, struct hci_filter *f) +{ +	hci_set_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask); +} +static inline void hci_filter_clear_event(int e, struct hci_filter *f) +{ +	hci_clear_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask); +} +static inline int hci_filter_test_event(int e, struct hci_filter *f) +{ +	return hci_test_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask); +} +static inline void hci_filter_all_events(struct hci_filter *f) +{ +	memset((void *) f->event_mask, 0xff, sizeof(f->event_mask)); +} +static inline void hci_filter_set_opcode(int opcode, struct hci_filter *f) +{ +	f->opcode = opcode; +} +static inline void hci_filter_clear_opcode(struct hci_filter *f) +{ +	f->opcode = 0; +} +static inline int hci_filter_test_opcode(int opcode, struct hci_filter *f) +{ +	return (f->opcode == opcode); +} + +#ifdef __cplusplus +} +#endif + +#endif /* __HCI_LIB_H */ diff --git a/include/hidp.h b/include/hidp.h new file mode 100644 index 00000000..74da6897 --- /dev/null +++ b/include/hidp.h @@ -0,0 +1,85 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2003-2008  Marcel Holtmann <marcel@holtmann.org> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifndef __HIDP_H +#define __HIDP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* HIDP defaults */ +#define HIDP_MINIMUM_MTU 48 +#define HIDP_DEFAULT_MTU 48 + +/* HIDP ioctl defines */ +#define HIDPCONNADD	_IOW('H', 200, int) +#define HIDPCONNDEL	_IOW('H', 201, int) +#define HIDPGETCONNLIST	_IOR('H', 210, int) +#define HIDPGETCONNINFO	_IOR('H', 211, int) + +#define HIDP_VIRTUAL_CABLE_UNPLUG	0 +#define HIDP_BOOT_PROTOCOL_MODE		1 +#define HIDP_BLUETOOTH_VENDOR_ID	9 + +struct hidp_connadd_req { +	int ctrl_sock;		/* Connected control socket */ +	int intr_sock;		/* Connected interrupt socket */ +	uint16_t parser;	/* Parser version */ +	uint16_t rd_size;	/* Report descriptor size */ +	uint8_t *rd_data;	/* Report descriptor data */ +	uint8_t  country; +	uint8_t  subclass; +	uint16_t vendor; +	uint16_t product; +	uint16_t version; +	uint32_t flags; +	uint32_t idle_to; +	char name[128];		/* Device name */ +}; + +struct hidp_conndel_req { +	bdaddr_t bdaddr; +	uint32_t flags; +}; + +struct hidp_conninfo { +	bdaddr_t bdaddr; +	uint32_t flags; +	uint16_t state; +	uint16_t vendor; +	uint16_t product; +	uint16_t version; +	char name[128]; +}; + +struct hidp_connlist_req { +	uint32_t cnum; +	struct hidp_conninfo *ci; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __HIDP_H */ diff --git a/include/l2cap.h b/include/l2cap.h new file mode 100644 index 00000000..d54e74d2 --- /dev/null +++ b/include/l2cap.h @@ -0,0 +1,204 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2000-2001  Qualcomm Incorporated + *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com> + *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifndef __L2CAP_H +#define __L2CAP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/socket.h> + +/* L2CAP defaults */ +#define L2CAP_DEFAULT_MTU	672 +#define L2CAP_DEFAULT_FLUSH_TO	0xFFFF + +#define L2CAP_CONN_TIMEOUT	(HZ * 40) + +/* L2CAP socket address */ +struct sockaddr_l2 { +	sa_family_t	l2_family; +	unsigned short	l2_psm; +	bdaddr_t	l2_bdaddr; +}; + +/* L2CAP socket options */ +#define L2CAP_OPTIONS	0x01 +struct l2cap_options { +	uint16_t	omtu; +	uint16_t	imtu; +	uint16_t	flush_to; +	uint8_t		mode; +}; + +#define L2CAP_CONNINFO	0x02 +struct l2cap_conninfo { +	uint16_t	hci_handle; +	uint8_t		dev_class[3]; +}; + +#define L2CAP_LM	0x03 +#define L2CAP_LM_MASTER		0x0001 +#define L2CAP_LM_AUTH		0x0002 +#define L2CAP_LM_ENCRYPT	0x0004 +#define L2CAP_LM_TRUSTED	0x0008 +#define L2CAP_LM_RELIABLE	0x0010 +#define L2CAP_LM_SECURE		0x0020 + +/* L2CAP command codes */ +#define L2CAP_COMMAND_REJ	0x01 +#define L2CAP_CONN_REQ		0x02 +#define L2CAP_CONN_RSP		0x03 +#define L2CAP_CONF_REQ		0x04 +#define L2CAP_CONF_RSP		0x05 +#define L2CAP_DISCONN_REQ	0x06 +#define L2CAP_DISCONN_RSP	0x07 +#define L2CAP_ECHO_REQ		0x08 +#define L2CAP_ECHO_RSP		0x09 +#define L2CAP_INFO_REQ		0x0a +#define L2CAP_INFO_RSP		0x0b + +/* L2CAP structures */ +typedef struct { +	uint16_t	len; +	uint16_t	cid; +} __attribute__ ((packed)) l2cap_hdr; +#define L2CAP_HDR_SIZE 4 + +typedef struct { +	uint8_t		code; +	uint8_t		ident; +	uint16_t	len; +} __attribute__ ((packed)) l2cap_cmd_hdr; +#define L2CAP_CMD_HDR_SIZE 4 + +typedef struct { +	uint16_t	reason; +} __attribute__ ((packed)) l2cap_cmd_rej; +#define L2CAP_CMD_REJ_SIZE 2 + +typedef struct { +	uint16_t	psm; +	uint16_t	scid; +} __attribute__ ((packed)) l2cap_conn_req; +#define L2CAP_CONN_REQ_SIZE 4 + +typedef struct { +	uint16_t	dcid; +	uint16_t	scid; +	uint16_t	result; +	uint16_t	status; +} __attribute__ ((packed)) l2cap_conn_rsp; +#define L2CAP_CONN_RSP_SIZE 8 + +/* connect result */ +#define L2CAP_CR_SUCCESS	0x0000 +#define L2CAP_CR_PEND		0x0001 +#define L2CAP_CR_BAD_PSM	0x0002 +#define L2CAP_CR_SEC_BLOCK	0x0003 +#define L2CAP_CR_NO_MEM		0x0004 + +/* connect status */ +#define L2CAP_CS_NO_INFO	0x0000 +#define L2CAP_CS_AUTHEN_PEND	0x0001 +#define L2CAP_CS_AUTHOR_PEND	0x0002 + +typedef struct { +	uint16_t	dcid; +	uint16_t	flags; +	uint8_t		data[0]; +} __attribute__ ((packed)) l2cap_conf_req; +#define L2CAP_CONF_REQ_SIZE 4 + +typedef struct { +	uint16_t	scid; +	uint16_t	flags; +	uint16_t	result; +	uint8_t		data[0]; +} __attribute__ ((packed)) l2cap_conf_rsp; +#define L2CAP_CONF_RSP_SIZE 6 + +#define L2CAP_CONF_SUCCESS	0x0000 +#define L2CAP_CONF_UNACCEPT	0x0001 +#define L2CAP_CONF_REJECT	0x0002 +#define L2CAP_CONF_UNKNOWN	0x0003 + +typedef struct { +	uint8_t		type; +	uint8_t		len; +	uint8_t		val[0]; +} __attribute__ ((packed)) l2cap_conf_opt; +#define L2CAP_CONF_OPT_SIZE 2 + +#define L2CAP_CONF_MTU		0x01 +#define L2CAP_CONF_FLUSH_TO	0x02 +#define L2CAP_CONF_QOS		0x03 +#define L2CAP_CONF_RFC		0x04 +#define L2CAP_CONF_RFC_MODE	0x04 + +#define L2CAP_CONF_MAX_SIZE	22 + +#define L2CAP_MODE_BASIC	0x00 +#define L2CAP_MODE_RETRANS	0x01 +#define L2CAP_MODE_FLOWCTL	0x02 + +typedef struct { +	uint16_t	dcid; +	uint16_t	scid; +} __attribute__ ((packed)) l2cap_disconn_req; +#define L2CAP_DISCONN_REQ_SIZE 4 + +typedef struct { +	uint16_t	dcid; +	uint16_t	scid; +} __attribute__ ((packed)) l2cap_disconn_rsp; +#define L2CAP_DISCONN_RSP_SIZE 4 + +typedef struct { +	uint16_t	type; +} __attribute__ ((packed)) l2cap_info_req; +#define L2CAP_INFO_REQ_SIZE 2 + +typedef struct { +	uint16_t	type; +	uint16_t	result; +	uint8_t		data[0]; +} __attribute__ ((packed)) l2cap_info_rsp; +#define L2CAP_INFO_RSP_SIZE 4 + +/* info type */ +#define L2CAP_IT_CL_MTU		0x0001 +#define L2CAP_IT_FEAT_MASK	0x0002 + +/* info result */ +#define L2CAP_IR_SUCCESS	0x0000 +#define L2CAP_IR_NOTSUPP	0x0001 + +#ifdef __cplusplus +} +#endif + +#endif /* __L2CAP_H */ diff --git a/include/rfcomm.h b/include/rfcomm.h new file mode 100644 index 00000000..5c4751ea --- /dev/null +++ b/include/rfcomm.h @@ -0,0 +1,102 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com> + *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifndef __RFCOMM_H +#define __RFCOMM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/socket.h> + +/* RFCOMM defaults */ +#define RFCOMM_DEFAULT_MTU	127 + +#define RFCOMM_PSM 3 + +#define RFCOMM_CONN_TIMEOUT	(HZ * 30) +#define RFCOMM_DISC_TIMEOUT	(HZ * 20) + +/* RFCOMM socket address */ +struct sockaddr_rc { +	sa_family_t	rc_family; +	bdaddr_t	rc_bdaddr; +	uint8_t		rc_channel; +}; + +/* RFCOMM socket options */ +#define RFCOMM_CONNINFO	0x02 +struct rfcomm_conninfo { +	uint16_t	hci_handle; +	uint8_t		dev_class[3]; +}; + +#define RFCOMM_LM	0x03 +#define RFCOMM_LM_MASTER	0x0001 +#define RFCOMM_LM_AUTH		0x0002 +#define RFCOMM_LM_ENCRYPT	0x0004 +#define RFCOMM_LM_TRUSTED	0x0008 +#define RFCOMM_LM_RELIABLE	0x0010 +#define RFCOMM_LM_SECURE	0x0020 + +/* RFCOMM TTY support */ +#define RFCOMM_MAX_DEV	256 + +#define RFCOMMCREATEDEV		_IOW('R', 200, int) +#define RFCOMMRELEASEDEV	_IOW('R', 201, int) +#define RFCOMMGETDEVLIST	_IOR('R', 210, int) +#define RFCOMMGETDEVINFO	_IOR('R', 211, int) + +struct rfcomm_dev_req { +	int16_t		dev_id; +	uint32_t	flags; +	bdaddr_t	src; +	bdaddr_t	dst; +	uint8_t	channel; +}; +#define RFCOMM_REUSE_DLC	0 +#define RFCOMM_RELEASE_ONHUP	1 +#define RFCOMM_HANGUP_NOW	2 +#define RFCOMM_TTY_ATTACHED	3 + +struct rfcomm_dev_info { +	int16_t		id; +	uint32_t	flags; +	uint16_t	state; +	bdaddr_t	src; +	bdaddr_t	dst; +	uint8_t		channel; +}; + +struct rfcomm_dev_list_req { +	uint16_t	dev_num; +	struct rfcomm_dev_info dev_info[0]; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __RFCOMM_H */ diff --git a/include/sco.h b/include/sco.h new file mode 100644 index 00000000..bce7098f --- /dev/null +++ b/include/sco.h @@ -0,0 +1,62 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com> + *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifndef __SCO_H +#define __SCO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* SCO defaults */ +#define SCO_DEFAULT_MTU		500 +#define SCO_DEFAULT_FLUSH_TO	0xFFFF + +#define SCO_CONN_TIMEOUT	(HZ * 40) +#define SCO_DISCONN_TIMEOUT	(HZ * 2) +#define SCO_CONN_IDLE_TIMEOUT	(HZ * 60) + +/* SCO socket address */ +struct sockaddr_sco { +	sa_family_t	sco_family; +	bdaddr_t	sco_bdaddr; +}; + +/* set/get sockopt defines */ +#define SCO_OPTIONS	0x01 +struct sco_options { +	uint16_t	mtu; +}; + +#define SCO_CONNINFO	0x02 +struct sco_conninfo { +	uint16_t	hci_handle; +	uint8_t		dev_class[3]; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __SCO_H */ diff --git a/include/sdp.h b/include/sdp.h new file mode 100644 index 00000000..dd5b0e24 --- /dev/null +++ b/include/sdp.h @@ -0,0 +1,503 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2001-2002  Nokia Corporation + *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com> + *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org> + *  Copyright (C) 2002-2003  Stephen Crane <steve.crane@rococosoft.com> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifndef __SDP_H +#define __SDP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> + +#define SDP_UNIX_PATH "/var/run/sdp" +#define SDP_RESPONSE_TIMEOUT	20 +#define SDP_REQ_BUFFER_SIZE	2048 +#define SDP_RSP_BUFFER_SIZE	65535 +#define SDP_PDU_CHUNK_SIZE	1024 + +/* + * All definitions are based on Bluetooth Assigned Numbers + * of the Bluetooth Specification + */ +#define SDP_PSM 		0x0001 + +/* + * Protocol UUIDs + */ +#define SDP_UUID	0x0001 +#define UDP_UUID	0x0002 +#define RFCOMM_UUID	0x0003 +#define TCP_UUID	0x0004 +#define TCS_BIN_UUID	0x0005 +#define TCS_AT_UUID	0x0006 +#define OBEX_UUID	0x0008 +#define IP_UUID		0x0009 +#define FTP_UUID	0x000a +#define HTTP_UUID	0x000c +#define WSP_UUID	0x000e +#define BNEP_UUID	0x000f +#define UPNP_UUID	0x0010 +#define HIDP_UUID	0x0011 +#define HCRP_CTRL_UUID	0x0012 +#define HCRP_DATA_UUID	0x0014 +#define HCRP_NOTE_UUID	0x0016 +#define AVCTP_UUID	0x0017 +#define AVDTP_UUID	0x0019 +#define CMTP_UUID	0x001b +#define UDI_UUID	0x001d +#define MCAP_CTRL_UUID	0x001e +#define MCAP_DATA_UUID	0x001f +#define L2CAP_UUID	0x0100 + +/* + * Service class identifiers of standard services and service groups + */ +#define SDP_SERVER_SVCLASS_ID		0x1000 +#define BROWSE_GRP_DESC_SVCLASS_ID	0x1001 +#define PUBLIC_BROWSE_GROUP		0x1002 +#define SERIAL_PORT_SVCLASS_ID		0x1101 +#define LAN_ACCESS_SVCLASS_ID		0x1102 +#define DIALUP_NET_SVCLASS_ID		0x1103 +#define IRMC_SYNC_SVCLASS_ID		0x1104 +#define OBEX_OBJPUSH_SVCLASS_ID		0x1105 +#define OBEX_FILETRANS_SVCLASS_ID	0x1106 +#define IRMC_SYNC_CMD_SVCLASS_ID	0x1107 +#define HEADSET_SVCLASS_ID		0x1108 +#define CORDLESS_TELEPHONY_SVCLASS_ID	0x1109 +#define AUDIO_SOURCE_SVCLASS_ID		0x110a +#define AUDIO_SINK_SVCLASS_ID		0x110b +#define AV_REMOTE_TARGET_SVCLASS_ID	0x110c +#define ADVANCED_AUDIO_SVCLASS_ID	0x110d +#define AV_REMOTE_SVCLASS_ID		0x110e +#define VIDEO_CONF_SVCLASS_ID		0x110f +#define INTERCOM_SVCLASS_ID		0x1110 +#define FAX_SVCLASS_ID			0x1111 +#define HEADSET_AGW_SVCLASS_ID		0x1112 +#define WAP_SVCLASS_ID			0x1113 +#define WAP_CLIENT_SVCLASS_ID		0x1114 +#define PANU_SVCLASS_ID			0x1115 +#define NAP_SVCLASS_ID			0x1116 +#define GN_SVCLASS_ID			0x1117 +#define DIRECT_PRINTING_SVCLASS_ID	0x1118 +#define REFERENCE_PRINTING_SVCLASS_ID	0x1119 +#define IMAGING_SVCLASS_ID		0x111a +#define IMAGING_RESPONDER_SVCLASS_ID	0x111b +#define IMAGING_ARCHIVE_SVCLASS_ID	0x111c +#define IMAGING_REFOBJS_SVCLASS_ID	0x111d +#define HANDSFREE_SVCLASS_ID		0x111e +#define HANDSFREE_AGW_SVCLASS_ID	0x111f +#define DIRECT_PRT_REFOBJS_SVCLASS_ID	0x1120 +#define REFLECTED_UI_SVCLASS_ID		0x1121 +#define BASIC_PRINTING_SVCLASS_ID	0x1122 +#define PRINTING_STATUS_SVCLASS_ID	0x1123 +#define HID_SVCLASS_ID			0x1124 +#define HCR_SVCLASS_ID			0x1125 +#define HCR_PRINT_SVCLASS_ID		0x1126 +#define HCR_SCAN_SVCLASS_ID		0x1127 +#define CIP_SVCLASS_ID			0x1128 +#define VIDEO_CONF_GW_SVCLASS_ID	0x1129 +#define UDI_MT_SVCLASS_ID		0x112a +#define UDI_TA_SVCLASS_ID		0x112b +#define AV_SVCLASS_ID			0x112c +#define SAP_SVCLASS_ID			0x112d +#define PBAP_PCE_SVCLASS_ID		0x112e +#define PBAP_PSE_SVCLASS_ID		0x112f +#define PBAP_SVCLASS_ID			0x1130 +#define PNP_INFO_SVCLASS_ID		0x1200 +#define GENERIC_NETWORKING_SVCLASS_ID	0x1201 +#define GENERIC_FILETRANS_SVCLASS_ID	0x1202 +#define GENERIC_AUDIO_SVCLASS_ID	0x1203 +#define GENERIC_TELEPHONY_SVCLASS_ID	0x1204 +#define UPNP_SVCLASS_ID			0x1205 +#define UPNP_IP_SVCLASS_ID		0x1206 +#define UPNP_PAN_SVCLASS_ID		0x1300 +#define UPNP_LAP_SVCLASS_ID		0x1301 +#define UPNP_L2CAP_SVCLASS_ID		0x1302 +#define VIDEO_SOURCE_SVCLASS_ID		0x1303 +#define VIDEO_SINK_SVCLASS_ID		0x1304 +#define VIDEO_DISTRIBUTION_SVCLASS_ID	0x1305 +#define MDP_SVCLASS_ID			0x1400 +#define MDP_SOURCE_SVCLASS_ID		0x1401 +#define MDP_SINK_SVCLASS_ID		0x1402 +#define APPLE_AGENT_SVCLASS_ID		0x2112 + +/* + * Standard profile descriptor identifiers; note these + * may be identical to some of the service classes defined above + */ +#define SDP_SERVER_PROFILE_ID		SDP_SERVER_SVCLASS_ID +#define BROWSE_GRP_DESC_PROFILE_ID	BROWSE_GRP_DESC_SVCLASS_ID +#define SERIAL_PORT_PROFILE_ID		SERIAL_PORT_SVCLASS_ID +#define LAN_ACCESS_PROFILE_ID		LAN_ACCESS_SVCLASS_ID +#define DIALUP_NET_PROFILE_ID		DIALUP_NET_SVCLASS_ID +#define IRMC_SYNC_PROFILE_ID		IRMC_SYNC_SVCLASS_ID +#define OBEX_OBJPUSH_PROFILE_ID		OBEX_OBJPUSH_SVCLASS_ID +#define OBEX_FILETRANS_PROFILE_ID	OBEX_FILETRANS_SVCLASS_ID +#define IRMC_SYNC_CMD_PROFILE_ID	IRMC_SYNC_CMD_SVCLASS_ID +#define HEADSET_PROFILE_ID		HEADSET_SVCLASS_ID +#define CORDLESS_TELEPHONY_PROFILE_ID	CORDLESS_TELEPHONY_SVCLASS_ID +#define AUDIO_SOURCE_PROFILE_ID		AUDIO_SOURCE_SVCLASS_ID +#define AUDIO_SINK_PROFILE_ID		AUDIO_SINK_SVCLASS_ID +#define AV_REMOTE_TARGET_PROFILE_ID	AV_REMOTE_TARGET_SVCLASS_ID +#define ADVANCED_AUDIO_PROFILE_ID	ADVANCED_AUDIO_SVCLASS_ID +#define AV_REMOTE_PROFILE_ID		AV_REMOTE_SVCLASS_ID +#define VIDEO_CONF_PROFILE_ID		VIDEO_CONF_SVCLASS_ID +#define INTERCOM_PROFILE_ID		INTERCOM_SVCLASS_ID +#define FAX_PROFILE_ID			FAX_SVCLASS_ID +#define HEADSET_AGW_PROFILE_ID		HEADSET_AGW_SVCLASS_ID +#define WAP_PROFILE_ID			WAP_SVCLASS_ID +#define WAP_CLIENT_PROFILE_ID		WAP_CLIENT_SVCLASS_ID +#define PANU_PROFILE_ID			PANU_SVCLASS_ID +#define NAP_PROFILE_ID			NAP_SVCLASS_ID +#define GN_PROFILE_ID			GN_SVCLASS_ID +#define DIRECT_PRINTING_PROFILE_ID	DIRECT_PRINTING_SVCLASS_ID +#define REFERENCE_PRINTING_PROFILE_ID	REFERENCE_PRINTING_SVCLASS_ID +#define IMAGING_PROFILE_ID		IMAGING_SVCLASS_ID +#define IMAGING_RESPONDER_PROFILE_ID	IMAGING_RESPONDER_SVCLASS_ID +#define IMAGING_ARCHIVE_PROFILE_ID	IMAGING_ARCHIVE_SVCLASS_ID +#define IMAGING_REFOBJS_PROFILE_ID	IMAGING_REFOBJS_SVCLASS_ID +#define HANDSFREE_PROFILE_ID		HANDSFREE_SVCLASS_ID +#define HANDSFREE_AGW_PROFILE_ID	HANDSFREE_AGW_SVCLASS_ID +#define DIRECT_PRT_REFOBJS_PROFILE_ID	DIRECT_PRT_REFOBJS_SVCLASS_ID +#define REFLECTED_UI_PROFILE_ID		REFLECTED_UI_SVCLASS_ID +#define BASIC_PRINTING_PROFILE_ID	BASIC_PRINTING_SVCLASS_ID +#define PRINTING_STATUS_PROFILE_ID	PRINTING_STATUS_SVCLASS_ID +#define HID_PROFILE_ID			HID_SVCLASS_ID +#define HCR_PROFILE_ID			HCR_SCAN_SVCLASS_ID +#define HCR_PRINT_PROFILE_ID		HCR_PRINT_SVCLASS_ID +#define HCR_SCAN_PROFILE_ID		HCR_SCAN_SVCLASS_ID +#define CIP_PROFILE_ID			CIP_SVCLASS_ID +#define VIDEO_CONF_GW_PROFILE_ID	VIDEO_CONF_GW_SVCLASS_ID +#define UDI_MT_PROFILE_ID		UDI_MT_SVCLASS_ID +#define UDI_TA_PROFILE_ID		UDI_TA_SVCLASS_ID +#define AV_PROFILE_ID			AV_SVCLASS_ID +#define SAP_PROFILE_ID			SAP_SVCLASS_ID +#define PBAP_PCE_PROFILE_ID		PBAP_PCE_SVCLASS_ID +#define PBAP_PSE_PROFILE_ID		PBAP_PSE_SVCLASS_ID +#define PBAP_PROFILE_ID			PBAP_SVCLASS_ID +#define PNP_INFO_PROFILE_ID		PNP_INFO_SVCLASS_ID +#define GENERIC_NETWORKING_PROFILE_ID	GENERIC_NETWORKING_SVCLASS_ID +#define GENERIC_FILETRANS_PROFILE_ID	GENERIC_FILETRANS_SVCLASS_ID +#define GENERIC_AUDIO_PROFILE_ID	GENERIC_AUDIO_SVCLASS_ID +#define GENERIC_TELEPHONY_PROFILE_ID	GENERIC_TELEPHONY_SVCLASS_ID +#define UPNP_PROFILE_ID			UPNP_SVCLASS_ID +#define UPNP_IP_PROFILE_ID		UPNP_IP_SVCLASS_ID +#define UPNP_PAN_PROFILE_ID		UPNP_PAN_SVCLASS_ID +#define UPNP_LAP_PROFILE_ID		UPNP_LAP_SVCLASS_ID +#define UPNP_L2CAP_PROFILE_ID		UPNP_L2CAP_SVCLASS_ID +#define VIDEO_SOURCE_PROFILE_ID		VIDEO_SOURCE_SVCLASS_ID +#define VIDEO_SINK_PROFILE_ID		VIDEO_SINK_SVCLASS_ID +#define VIDEO_DISTRIBUTION_PROFILE_ID	VIDEO_DISTRIBUTION_SVCLASS_ID +#define MDP_PROFILE_ID			MDP_SVCLASS_ID +#define MDP_SOURCE_PROFILE_ID		MDP_SROUCE_SVCLASS_ID +#define MDP_SINK_PROFILE_ID		MDP_SINK_SVCLASS_ID +#define APPLE_AGENT_PROFILE_ID		APPLE_AGENT_SVCLASS_ID + +/* + * Attribute identifier codes + */ +#define SDP_SERVER_RECORD_HANDLE		0x0000 + +/* + * Possible values for attribute-id are listed below. + * See SDP Spec, section "Service Attribute Definitions" for more details. + */ +#define SDP_ATTR_RECORD_HANDLE			0x0000 +#define SDP_ATTR_SVCLASS_ID_LIST		0x0001 +#define SDP_ATTR_RECORD_STATE			0x0002 +#define SDP_ATTR_SERVICE_ID			0x0003 +#define SDP_ATTR_PROTO_DESC_LIST		0x0004 +#define SDP_ATTR_BROWSE_GRP_LIST		0x0005 +#define SDP_ATTR_LANG_BASE_ATTR_ID_LIST		0x0006 +#define SDP_ATTR_SVCINFO_TTL			0x0007 +#define SDP_ATTR_SERVICE_AVAILABILITY		0x0008 +#define SDP_ATTR_PFILE_DESC_LIST		0x0009 +#define SDP_ATTR_DOC_URL			0x000a +#define SDP_ATTR_CLNT_EXEC_URL			0x000b +#define SDP_ATTR_ICON_URL			0x000c +#define SDP_ATTR_ADD_PROTO_DESC_LIST		0x000d + +#define SDP_ATTR_GROUP_ID			0x0200 +#define SDP_ATTR_IP_SUBNET			0x0200 +#define SDP_ATTR_VERSION_NUM_LIST		0x0200 +#define SDP_ATTR_SVCDB_STATE			0x0201 + +#define SDP_ATTR_SERVICE_VERSION		0x0300 +#define SDP_ATTR_EXTERNAL_NETWORK		0x0301 +#define SDP_ATTR_SUPPORTED_DATA_STORES_LIST	0x0301 +#define SDP_ATTR_FAX_CLASS1_SUPPORT		0x0302 +#define SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL	0x0302 +#define SDP_ATTR_FAX_CLASS20_SUPPORT		0x0303 +#define SDP_ATTR_SUPPORTED_FORMATS_LIST		0x0303 +#define SDP_ATTR_FAX_CLASS2_SUPPORT		0x0304 +#define SDP_ATTR_AUDIO_FEEDBACK_SUPPORT		0x0305 +#define SDP_ATTR_NETWORK_ADDRESS		0x0306 +#define SDP_ATTR_WAP_GATEWAY			0x0307 +#define SDP_ATTR_HOMEPAGE_URL			0x0308 +#define SDP_ATTR_WAP_STACK_TYPE			0x0309 +#define SDP_ATTR_SECURITY_DESC			0x030a +#define SDP_ATTR_NET_ACCESS_TYPE		0x030b +#define SDP_ATTR_MAX_NET_ACCESSRATE		0x030c +#define SDP_ATTR_IP4_SUBNET			0x030d +#define SDP_ATTR_IP6_SUBNET			0x030e +#define SDP_ATTR_SUPPORTED_CAPABILITIES		0x0310 +#define SDP_ATTR_SUPPORTED_FEATURES		0x0311 +#define SDP_ATTR_SUPPORTED_FUNCTIONS		0x0312 +#define SDP_ATTR_TOTAL_IMAGING_DATA_CAPACITY	0x0313 +#define SDP_ATTR_SUPPORTED_REPOSITORIES		0x0314 + +#define SDP_ATTR_SPECIFICATION_ID		0x0200 +#define SDP_ATTR_VENDOR_ID			0x0201 +#define SDP_ATTR_PRODUCT_ID			0x0202 +#define SDP_ATTR_VERSION			0x0203 +#define SDP_ATTR_PRIMARY_RECORD			0x0204 +#define SDP_ATTR_VENDOR_ID_SOURCE		0x0205 + +#define SDP_ATTR_HID_DEVICE_RELEASE_NUMBER	0x0200 +#define SDP_ATTR_HID_PARSER_VERSION		0x0201 +#define SDP_ATTR_HID_DEVICE_SUBCLASS		0x0202 +#define SDP_ATTR_HID_COUNTRY_CODE		0x0203 +#define SDP_ATTR_HID_VIRTUAL_CABLE		0x0204 +#define SDP_ATTR_HID_RECONNECT_INITIATE		0x0205 +#define SDP_ATTR_HID_DESCRIPTOR_LIST		0x0206 +#define SDP_ATTR_HID_LANG_ID_BASE_LIST		0x0207 +#define SDP_ATTR_HID_SDP_DISABLE		0x0208 +#define SDP_ATTR_HID_BATTERY_POWER		0x0209 +#define SDP_ATTR_HID_REMOTE_WAKEUP		0x020a +#define SDP_ATTR_HID_PROFILE_VERSION		0x020b +#define SDP_ATTR_HID_SUPERVISION_TIMEOUT	0x020c +#define SDP_ATTR_HID_NORMALLY_CONNECTABLE	0x020d +#define SDP_ATTR_HID_BOOT_DEVICE		0x020e + +/* + * These identifiers are based on the SDP spec stating that  + * "base attribute id of the primary (universal) language must be 0x0100" + * + * Other languages should have their own offset; e.g.: + * #define XXXLangBase yyyy + * #define AttrServiceName_XXX	0x0000+XXXLangBase + */ +#define SDP_PRIMARY_LANG_BASE 		0x0100 + +#define SDP_ATTR_SVCNAME_PRIMARY	0x0000 + SDP_PRIMARY_LANG_BASE +#define SDP_ATTR_SVCDESC_PRIMARY	0x0001 + SDP_PRIMARY_LANG_BASE +#define SDP_ATTR_PROVNAME_PRIMARY	0x0002 + SDP_PRIMARY_LANG_BASE + +/* + * The Data representation in SDP PDUs (pps 339, 340 of BT SDP Spec) + * These are the exact data type+size descriptor values + * that go into the PDU buffer. + * + * The datatype (leading 5bits) + size descriptor (last 3 bits) + * is 8 bits. The size descriptor is critical to extract the + * right number of bytes for the data value from the PDU. + * + * For most basic types, the datatype+size descriptor is + * straightforward. However for constructed types and strings, + * the size of the data is in the next "n" bytes following the + * 8 bits (datatype+size) descriptor. Exactly what the "n" is + * specified in the 3 bits of the data size descriptor. + * + * TextString and URLString can be of size 2^{8, 16, 32} bytes + * DataSequence and DataSequenceAlternates can be of size 2^{8, 16, 32} + * The size are computed post-facto in the API and are not known apriori + */ +#define SDP_DATA_NIL 		0x00 +#define SDP_UINT8  		0x08 +#define SDP_UINT16		0x09 +#define SDP_UINT32		0x0A +#define SDP_UINT64		0x0B +#define SDP_UINT128		0x0C +#define SDP_INT8		0x10 +#define SDP_INT16		0x11 +#define SDP_INT32		0x12 +#define SDP_INT64		0x13 +#define SDP_INT128		0x14 +#define SDP_UUID_UNSPEC		0x18 +#define SDP_UUID16		0x19 +#define SDP_UUID32		0x1A +#define SDP_UUID128		0x1C +#define SDP_TEXT_STR_UNSPEC	0x20 +#define SDP_TEXT_STR8		0x25 +#define SDP_TEXT_STR16		0x26 +#define SDP_TEXT_STR32		0x27 +#define SDP_BOOL		0x28 +#define SDP_SEQ_UNSPEC		0x30 +#define SDP_SEQ8		0x35 +#define SDP_SEQ16		0x36 +#define SDP_SEQ32		0x37 +#define SDP_ALT_UNSPEC		0x38 +#define SDP_ALT8		0x3D +#define SDP_ALT16		0x3E +#define SDP_ALT32		0x3F +#define SDP_URL_STR_UNSPEC	0x40 +#define SDP_URL_STR8		0x45 +#define SDP_URL_STR16		0x46 +#define SDP_URL_STR32		0x47 + +/* + * The PDU identifiers of SDP packets between client and server + */ +#define SDP_ERROR_RSP		0x01 +#define SDP_SVC_SEARCH_REQ	0x02 +#define SDP_SVC_SEARCH_RSP	0x03 +#define SDP_SVC_ATTR_REQ	0x04 +#define SDP_SVC_ATTR_RSP	0x05 +#define SDP_SVC_SEARCH_ATTR_REQ	0x06 +#define SDP_SVC_SEARCH_ATTR_RSP	0x07 + +/* + * Some additions to support service registration. + * These are outside the scope of the Bluetooth specification + */ +#define SDP_SVC_REGISTER_REQ	0x75 +#define SDP_SVC_REGISTER_RSP	0x76 +#define SDP_SVC_UPDATE_REQ	0x77 +#define SDP_SVC_UPDATE_RSP	0x78 +#define SDP_SVC_REMOVE_REQ	0x79 +#define SDP_SVC_REMOVE_RSP	0x80 + +/* + * SDP Error codes + */ +#define SDP_INVALID_VERSION		0x0001 +#define SDP_INVALID_RECORD_HANDLE	0x0002 +#define SDP_INVALID_SYNTAX		0x0003 +#define SDP_INVALID_PDU_SIZE		0x0004 +#define SDP_INVALID_CSTATE		0x0005 + +/* + * SDP PDU + */ +typedef struct { +	uint8_t  pdu_id; +	uint16_t tid; +	uint16_t plen; +} __attribute__ ((packed)) sdp_pdu_hdr_t; + +/* + * Common definitions for attributes in the SDP. + * Should the type of any of these change, you need only make a change here. + */ +typedef struct { +	uint8_t data[16]; +} uint128_t; + +typedef struct { +	uint8_t type; +	union { +		uint16_t  uuid16; +		uint32_t  uuid32; +		uint128_t uuid128; +	} value; +} uuid_t; + +#define SDP_IS_UUID(x) ((x) == SDP_UUID16 || (x) == SDP_UUID32 || (x) ==SDP_UUID128) + +typedef struct _sdp_list sdp_list_t; +struct _sdp_list { +	sdp_list_t *next; +	void *data; +}; + +/* + * User-visible strings can be in many languages + * in addition to the universal language. + * + * Language meta-data includes language code in ISO639 + * followed by the encoding format. The third field in this + * structure is the attribute offset for the language. + * User-visible strings in the specified language can be + * obtained at this offset. + */ +typedef struct { +	uint16_t code_ISO639; +	uint16_t encoding; +	uint16_t base_offset; +} sdp_lang_attr_t; + +/* + * Profile descriptor is the Bluetooth profile metadata. If a + * service conforms to a well-known profile, then its profile + * identifier (UUID) is an attribute of the service. In addition, + * if the profile has a version number it is specified here. + */ +typedef struct { +	uuid_t uuid; +	uint16_t version; +} sdp_profile_desc_t; + +typedef struct { +	uint8_t major; +	uint8_t minor; +} sdp_version_t; + +typedef struct { +	uint8_t *data; +	uint32_t data_size; +	uint32_t buf_size; +} sdp_buf_t; + +typedef struct { +	uint32_t handle; + +	/* Search pattern: a sequence of all UUIDs seen in this record */ +	sdp_list_t *pattern; +	sdp_list_t *attrlist; + +	/* Main service class for Extended Inquiry Response */ +	uuid_t svclass; +} sdp_record_t; + +typedef struct sdp_data_struct sdp_data_t; +struct sdp_data_struct { +	uint8_t dtd; +	uint16_t attrId; +	union { +		int8_t    int8; +		int16_t   int16; +		int32_t   int32; +		int64_t   int64; +		uint128_t int128; +		uint8_t   uint8; +		uint16_t  uint16; +		uint32_t  uint32; +		uint64_t  uint64; +		uint128_t uint128; +		uuid_t    uuid; +		char     *str; +		sdp_data_t *dataseq; +	} val; +	sdp_data_t *next; +	int unitSize; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __SDP_H */ diff --git a/include/sdp_lib.h b/include/sdp_lib.h new file mode 100644 index 00000000..143056f6 --- /dev/null +++ b/include/sdp_lib.h @@ -0,0 +1,619 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2001-2002  Nokia Corporation + *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com> + *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org> + *  Copyright (C) 2002-2003  Stephen Crane <steve.crane@rococosoft.com> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifndef __SDP_LIB_H +#define __SDP_LIB_H + +#include <sys/socket.h> +#include <bluetooth/bluetooth.h> +#include <bluetooth/hci.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * SDP lists + */ +typedef void(*sdp_list_func_t)(void *, void *); +typedef void(*sdp_free_func_t)(void *); +typedef int (*sdp_comp_func_t)(const void *, const void *); + +sdp_list_t *sdp_list_append(sdp_list_t *list, void *d); +sdp_list_t *sdp_list_remove(sdp_list_t *list, void *d); +sdp_list_t *sdp_list_insert_sorted(sdp_list_t *list, void *data, sdp_comp_func_t f); +void        sdp_list_free(sdp_list_t *list, sdp_free_func_t f); + +static inline int sdp_list_len(const sdp_list_t *list)  +{ +	int n = 0; +	for (; list; list = list->next) +		n++; +	return n; +} + +static inline sdp_list_t *sdp_list_find(sdp_list_t *list, void *u, sdp_comp_func_t f) +{ +	for (; list; list = list->next) +		if (f(list->data, u) == 0) +			return list; +	return NULL; +} + +static inline void sdp_list_foreach(sdp_list_t *list, sdp_list_func_t f, void *u) +{ +	for (; list; list = list->next) +		f(list->data, u); +} + +/* + * Values of the flags parameter to sdp_record_register + */ +#define SDP_RECORD_PERSIST	0x01 +#define SDP_DEVICE_RECORD	0x02 + +/* + * Values of the flags parameter to sdp_connect + */ +#define SDP_RETRY_IF_BUSY	0x01 +#define SDP_WAIT_ON_CLOSE	0x02 +#define SDP_NON_BLOCKING	0x04 + +/* + * a session with an SDP server + */ +typedef struct { +	int sock; +	int state; +	int local; +	int flags; +	uint16_t tid;	// Current transaction ID +	void *priv; +} sdp_session_t; + +typedef enum { +	/* +	 *  Attributes are specified as individual elements +	 */ +	SDP_ATTR_REQ_INDIVIDUAL = 1, +	/* +	 *  Attributes are specified as a range +	 */ +	SDP_ATTR_REQ_RANGE +} sdp_attrreq_type_t; + +/* + * 	When the pdu_id(type) is a sdp error response, check the status value + * 	to figure out the error reason. For status values 0x0001-0x0006 check + * 	Bluetooth SPEC. If the status is 0xffff, call sdp_get_error function + * 	to get the real reason: + * 	    - wrong transaction ID(EPROTO) + * 	    - wrong PDU id or(EPROTO) + * 	    - I/O error + */ +typedef void sdp_callback_t(uint8_t type, uint16_t status, uint8_t *rsp, size_t size, void *udata); + +/* + * create an L2CAP connection to a Bluetooth device + *  + * INPUT: + *   + *  bdaddr_t *src: + *	Address of the local device to use to make the connection + *	(or BDADDR_ANY) + * + *  bdaddr_t *dst: + *    Address of the SDP server device + */ +sdp_session_t *sdp_connect(const bdaddr_t *src, const bdaddr_t *dst, uint32_t flags); +int sdp_close(sdp_session_t *session); +int sdp_get_socket(const sdp_session_t *session); + +/* + * SDP transaction: functions for asynchronous search. + */ +sdp_session_t *sdp_create(int sk, uint32_t flags); +int sdp_get_error(sdp_session_t *session); +int sdp_process(sdp_session_t *session); +int sdp_set_notify(sdp_session_t *session, sdp_callback_t *func, void *udata); + +int sdp_service_search_async(sdp_session_t *session, const sdp_list_t *search, uint16_t max_rec_num); +int sdp_service_attr_async(sdp_session_t *session, uint32_t handle, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list); +int sdp_service_search_attr_async(sdp_session_t *session, const sdp_list_t *search, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list); + +uint16_t sdp_gen_tid(sdp_session_t *session); + +/* + * find all devices in the piconet + */ +int sdp_general_inquiry(inquiry_info *ii, int dev_num, int duration, uint8_t *found); + +/* flexible extraction of basic attributes - Jean II */ +int sdp_get_int_attr(const sdp_record_t *rec, uint16_t attr, int *value); +int sdp_get_string_attr(const sdp_record_t *rec, uint16_t attr, char *value, int valuelen); + +/* + * Basic sdp data functions + */ +sdp_data_t *sdp_data_alloc(uint8_t dtd, const void *value); +sdp_data_t *sdp_data_alloc_with_length(uint8_t dtd, const void *value, uint32_t length); +void sdp_data_free(sdp_data_t *data); +sdp_data_t *sdp_data_get(const sdp_record_t *rec, uint16_t attr_id); + +sdp_data_t *sdp_seq_alloc(void **dtds, void **values, int len); +sdp_data_t *sdp_seq_alloc_with_length(void **dtds, void **values, int *length, int len); +sdp_data_t *sdp_seq_append(sdp_data_t *seq, sdp_data_t *data); + +int sdp_attr_add(sdp_record_t *rec, uint16_t attr, sdp_data_t *data); +void sdp_attr_remove(sdp_record_t *rec, uint16_t attr); +void sdp_attr_replace(sdp_record_t *rec, uint16_t attr, sdp_data_t *data); +int sdp_set_uuidseq_attr(sdp_record_t *rec, uint16_t attr, sdp_list_t *seq); +int sdp_get_uuidseq_attr(const sdp_record_t *rec, uint16_t attr, sdp_list_t **seqp); + +/* + * NOTE that none of the functions below will update the SDP server,  + * unless the {register, update}sdp_record_t() function is invoked. + * All functions which return an integer value, return 0 on success  + * or -1 on failure. + */ + +/* + * Create an attribute and add it to the service record's attribute list. + * This consists of the data type descriptor of the attribute,  + * the value of the attribute and the attribute identifier. + */ +int sdp_attr_add_new(sdp_record_t *rec, uint16_t attr, uint8_t dtd, const void *p); + +/* + * Set the information attributes of the service record. + * The set of attributes comprises service name, description  + * and provider name + */ +void sdp_set_info_attr(sdp_record_t *rec, const char *name, const char *prov, const char *desc); + +/* + * Set the ServiceClassID attribute to the sequence specified by seq. + * Note that the identifiers need to be in sorted order from the most  + * specific to the most generic service class that this service + * conforms to. + */ +static inline int sdp_set_service_classes(sdp_record_t *rec, sdp_list_t *seq) +{ +	return sdp_set_uuidseq_attr(rec, SDP_ATTR_SVCLASS_ID_LIST, seq); +} + +/* + * Get the service classes to which the service conforms. + *  + * When set, the list contains elements of ServiceClassIdentifer(uint16_t)  + * ordered from most specific to most generic + */ +static inline int sdp_get_service_classes(const sdp_record_t *rec, sdp_list_t **seqp) +{ +	return sdp_get_uuidseq_attr(rec, SDP_ATTR_SVCLASS_ID_LIST, seqp); +} + +/* + * Set the BrowseGroupList attribute to the list specified by seq. + *  + * A service can belong to one or more service groups  + * and the list comprises such group identifiers (UUIDs) + */ +static inline int sdp_set_browse_groups(sdp_record_t *rec, sdp_list_t *seq) +{ +	return sdp_set_uuidseq_attr(rec, SDP_ATTR_BROWSE_GRP_LIST, seq); +} + +/* + * Set the access protocols of the record to those specified in proto + */ +int sdp_set_access_protos(sdp_record_t *rec, const sdp_list_t *proto); + +/* + * Set the additional access protocols of the record to those specified in proto + */ +int sdp_set_add_access_protos(sdp_record_t *rec, const sdp_list_t *proto); + +/* + * Get protocol port (i.e. PSM for L2CAP, Channel for RFCOMM)  + */ +int sdp_get_proto_port(const sdp_list_t *list, int proto); + +/* + * Get protocol descriptor.  + */ +sdp_data_t *sdp_get_proto_desc(sdp_list_t *list, int proto); + +/* + * Set the LanguageBase attributes to the values specified in list  + * (a linked list of sdp_lang_attr_t objects, one for each language in  + * which user-visible attributes are present). + */ +int sdp_set_lang_attr(sdp_record_t *rec, const sdp_list_t *list); + +/* + * Set the ServiceInfoTimeToLive attribute of the service.   + * This is the number of seconds that this record is guaranteed + * not to change after being obtained by a client. + */ +static inline int sdp_set_service_ttl(sdp_record_t *rec, uint32_t ttl) +{ +	return sdp_attr_add_new(rec, SDP_ATTR_SVCINFO_TTL, SDP_UINT32, &ttl); +} + +/* + * Set the ServiceRecordState attribute of a service. This is + * guaranteed to change if there is any kind of modification to  + * the record.  + */ +static inline int sdp_set_record_state(sdp_record_t *rec, uint32_t state) +{ +	return sdp_attr_add_new(rec, SDP_ATTR_RECORD_STATE, SDP_UINT32, &state); +} + +/* + * Set the ServiceID attribute of a service.  + */ +void sdp_set_service_id(sdp_record_t *rec, uuid_t uuid); + +/* + * Set the GroupID attribute of a service + */ +void sdp_set_group_id(sdp_record_t *rec, uuid_t grouuuid); + +/* + * Set the ServiceAvailability attribute of a service. + *  + * Note that this represents the relative availability + * of the service: 0x00 means completely unavailable; + * 0xFF means maximum availability. + */ +static inline int sdp_set_service_avail(sdp_record_t *rec, uint8_t avail) +{ +	return sdp_attr_add_new(rec, SDP_ATTR_SERVICE_AVAILABILITY, SDP_UINT8, &avail); +} + +/* + * Set the profile descriptor list attribute of a record. + *  + * Each element in the list is an object of type + * sdp_profile_desc_t which is a definition of the + * Bluetooth profile that this service conforms to. + */ +int sdp_set_profile_descs(sdp_record_t *rec, const sdp_list_t *desc); + +/* + * Set URL attributes of a record. + *  + * ClientExecutableURL: a URL to a client's platform specific (WinCE,  + * PalmOS) executable code that can be used to access this service. + *  + * DocumentationURL: a URL pointing to service documentation + *  + * IconURL: a URL to an icon that can be used to represent this service. + *  + * Note: pass NULL for any URLs that you don't want to set or remove + */ +void sdp_set_url_attr(sdp_record_t *rec, const char *clientExecURL, const char *docURL, const char *iconURL); + +/* + * a service search request.  + *  + *  INPUT : + *  + *    sdp_list_t *search + *      list containing elements of the search + *      pattern. Each entry in the list is a UUID + *      of the service to be searched + *  + *    uint16_t max_rec_num + *       An integer specifying the maximum number of + *       entries that the client can handle in the response. + *  + *  OUTPUT : + *  + *    int return value + *      0  + *        The request completed successfully. This does not + *        mean the requested services were found + *      -1 + *        The request completed unsuccessfully + *  + *    sdp_list_t *rsp_list + *      This variable is set on a successful return if there are + *      non-zero service handles. It is a singly linked list of + *      service record handles (uint16_t) + */ +int sdp_service_search_req(sdp_session_t *session, const sdp_list_t *search, uint16_t max_rec_num, sdp_list_t **rsp_list); + +/* + *  a service attribute request.  + *  + *  INPUT : + *  + *    uint32_t handle + *      The handle of the service for which the attribute(s) are + *      requested + *  + *    sdp_attrreq_type_t reqtype + *      Attribute identifiers are 16 bit unsigned integers specified + *      in one of 2 ways described below : + *      SDP_ATTR_REQ_INDIVIDUAL - 16bit individual identifiers + *         They are the actual attribute identifiers in ascending order + *  + *      SDP_ATTR_REQ_RANGE - 32bit identifier range + *         The high-order 16bits is the start of range + *         the low-order 16bits are the end of range + *         0x0000 to 0xFFFF gets all attributes + *  + *    sdp_list_t *attrid_list + *      Singly linked list containing attribute identifiers desired. + *      Every element is either a uint16_t(attrSpec = SDP_ATTR_REQ_INDIVIDUAL)   + *      or a uint32_t(attrSpec=SDP_ATTR_REQ_RANGE) + *  + *  OUTPUT : + *    int return value + *      0  + *        The request completed successfully. This does not + *        mean the requested services were found + *      -1 + *        The request completed unsuccessfully due to a timeout + */ +sdp_record_t *sdp_service_attr_req(sdp_session_t *session, uint32_t handle, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list); + +/* + *  This is a service search request combined with the service + *  attribute request. First a service class match is done and + *  for matching service, requested attributes are extracted + *  + *  INPUT : + *  + *    sdp_list_t *search + *      Singly linked list containing elements of the search + *      pattern. Each entry in the list is a UUID(DataTypeSDP_UUID16) + *      of the service to be searched + *  + *    AttributeSpecification attrSpec + *      Attribute identifiers are 16 bit unsigned integers specified + *      in one of 2 ways described below : + *      SDP_ATTR_REQ_INDIVIDUAL - 16bit individual identifiers + *         They are the actual attribute identifiers in ascending order + *  + *      SDP_ATTR_REQ_RANGE - 32bit identifier range + *         The high-order 16bits is the start of range + *         the low-order 16bits are the end of range + *         0x0000 to 0xFFFF gets all attributes + *  + *    sdp_list_t *attrid_list + *      Singly linked list containing attribute identifiers desired. + *      Every element is either a uint16_t(attrSpec = SDP_ATTR_REQ_INDIVIDUAL)   + *      or a uint32_t(attrSpec=SDP_ATTR_REQ_RANGE) + *  + *  OUTPUT : + *    int return value + *      0  + *        The request completed successfully. This does not + *        mean the requested services were found + *      -1 + *        The request completed unsuccessfully due to a timeout + *  + *    sdp_list_t *rsp_list + *      This variable is set on a successful return to point to + *      service(s) found. Each element of this list is of type + *      sdp_record_t *. + */ +int sdp_service_search_attr_req(sdp_session_t *session, const sdp_list_t *search, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list, sdp_list_t **rsp_list); + +/* + * Allocate/free a service record and its attributes + */ +sdp_record_t *sdp_record_alloc(void); +void sdp_record_free(sdp_record_t *rec); + +/* + * Register a service record.  + *  + * Note: It is the responsbility of the Service Provider to create the  + * record first and set its attributes using setXXX() methods. + *  + * The service provider must then call sdp_record_register() to make  + * the service record visible to SDP clients.  This function returns 0 + * on success or -1 on failure (and sets errno). + */ +int sdp_device_record_register_binary(sdp_session_t *session, bdaddr_t *device, uint8_t *data, uint32_t size, uint8_t flags, uint32_t *handle); +int sdp_device_record_register(sdp_session_t *session, bdaddr_t *device, sdp_record_t *rec, uint8_t flags); +int sdp_record_register(sdp_session_t *session, sdp_record_t *rec, uint8_t flags); + +/* + * Unregister a service record. + */ +int sdp_device_record_unregister_binary(sdp_session_t *session, bdaddr_t *device, uint32_t handle); +int sdp_device_record_unregister(sdp_session_t *session, bdaddr_t *device, sdp_record_t *rec); +int sdp_record_unregister(sdp_session_t *session, sdp_record_t *rec); + +/* + * Update an existing service record.  (Calling this function + * before a previous call to sdp_record_register() will result + * in an error.) + */ +int sdp_device_record_update_binary(sdp_session_t *session, bdaddr_t *device, uint32_t handle, uint8_t *data, uint32_t size); +int sdp_device_record_update(sdp_session_t *session, bdaddr_t *device, const sdp_record_t *rec); +int sdp_record_update(sdp_session_t *sess, const sdp_record_t *rec); + +void sdp_record_print(const sdp_record_t *rec); + +/* + * UUID functions + */ +uuid_t *sdp_uuid16_create(uuid_t *uuid, uint16_t data); +uuid_t *sdp_uuid32_create(uuid_t *uuid, uint32_t data); +uuid_t *sdp_uuid128_create(uuid_t *uuid, const void *data); +int sdp_uuid16_cmp(const void *p1, const void *p2); +int sdp_uuid128_cmp(const void *p1, const void *p2); +uuid_t *sdp_uuid_to_uuid128(uuid_t *uuid); +void sdp_uuid16_to_uuid128(uuid_t *uuid128, uuid_t *uuid16); +void sdp_uuid32_to_uuid128(uuid_t *uuid128, uuid_t *uuid32); +int sdp_uuid128_to_uuid(uuid_t *uuid); +int sdp_uuid_to_proto(uuid_t *uuid); +int sdp_uuid_extract(const uint8_t *buffer, uuid_t *uuid, int *scanned); +int sdp_uuid_extract_safe(const uint8_t *buffer, int bufsize, uuid_t *uuid, int *scanned); +void sdp_uuid_print(const uuid_t *uuid); + +#define MAX_LEN_UUID_STR 37 +#define MAX_LEN_PROTOCOL_UUID_STR 8 +#define MAX_LEN_SERVICECLASS_UUID_STR 28 +#define MAX_LEN_PROFILEDESCRIPTOR_UUID_STR 28 + +int sdp_uuid2strn(const uuid_t *uuid, char *str, size_t n); +int sdp_proto_uuid2strn(const uuid_t *uuid, char *str, size_t n); +int sdp_svclass_uuid2strn(const uuid_t *uuid, char *str, size_t n); +int sdp_profile_uuid2strn(const uuid_t *uuid, char *str, size_t n); + +/* + * In all the sdp_get_XXX(handle, XXX *xxx) functions below,  + * the XXX * is set to point to the value, should it exist + * and 0 is returned. If the value does not exist, -1 is + * returned and errno set to ENODATA. + * + * In all the methods below, the memory management rules are + * simple. Don't free anything! The pointer returned, in the + * case of constructed types, is a pointer to the contents  + * of the sdp_record_t. + */ + +/* + * Get the access protocols from the service record + */ +int sdp_get_access_protos(const sdp_record_t *rec, sdp_list_t **protos); + +/* + * Get the additional access protocols from the service record + */ +int sdp_get_add_access_protos(const sdp_record_t *rec, sdp_list_t **protos); + +/* + * Extract the list of browse groups to which the service belongs. + * When set, seqp contains elements of GroupID (uint16_t)  + */ +static inline int sdp_get_browse_groups(const sdp_record_t *rec, sdp_list_t **seqp) +{ +	return sdp_get_uuidseq_attr(rec, SDP_ATTR_BROWSE_GRP_LIST, seqp); +} + +/* + * Extract language attribute meta-data of the service record.  + * For each language in the service record, LangSeq has a struct of type + * sdp_lang_attr_t.  + */ +int sdp_get_lang_attr(const sdp_record_t *rec, sdp_list_t **langSeq); + +/* + * Extract the Bluetooth profile descriptor sequence from a record. + * Each element in the list is of type sdp_profile_desc_t + * which contains the UUID of the profile and its version number + * (encoded as major and minor in the high-order 8bits + * and low-order 8bits respectively of the uint16_t) + */ +int sdp_get_profile_descs(const sdp_record_t *rec, sdp_list_t **profDesc); + +/* + * Extract SDP server version numbers  + *  + * Note: that this is an attribute of the SDP server only and + * contains a list of uint16_t each of which represent the + * major and minor SDP version numbers supported by this server + */ +int sdp_get_server_ver(const sdp_record_t *rec, sdp_list_t **pVnumList); + +int sdp_get_service_id(const sdp_record_t *rec, uuid_t *uuid); +int sdp_get_group_id(const sdp_record_t *rec, uuid_t *uuid); +int sdp_get_record_state(const sdp_record_t *rec, uint32_t *svcRecState); +int sdp_get_service_avail(const sdp_record_t *rec, uint8_t *svcAvail); +int sdp_get_service_ttl(const sdp_record_t *rec, uint32_t *svcTTLInfo); +int sdp_get_database_state(const sdp_record_t *rec, uint32_t *svcDBState); + +static inline int sdp_get_service_name(const sdp_record_t *rec, char *str, int len) +{ +	return sdp_get_string_attr(rec, SDP_ATTR_SVCNAME_PRIMARY, str, len); +} + +static inline int sdp_get_service_desc(const sdp_record_t *rec, char *str, int len) +{ +	return sdp_get_string_attr(rec, SDP_ATTR_SVCDESC_PRIMARY, str, len); +} + +static inline int sdp_get_provider_name(const sdp_record_t *rec, char *str, int len) +{ +	return sdp_get_string_attr(rec, SDP_ATTR_PROVNAME_PRIMARY, str, len); +} + +static inline int sdp_get_doc_url(const sdp_record_t *rec, char *str, int len) +{ +	return sdp_get_string_attr(rec, SDP_ATTR_DOC_URL, str, len); +} + +static inline int sdp_get_clnt_exec_url(const sdp_record_t *rec, char *str, int len) +{ +	return sdp_get_string_attr(rec, SDP_ATTR_CLNT_EXEC_URL, str, len); +} + +static inline int sdp_get_icon_url(const sdp_record_t *rec, char *str, int len) +{ +	return sdp_get_string_attr(rec, SDP_ATTR_ICON_URL, str, len); +} + +sdp_record_t *sdp_extract_pdu(const uint8_t *pdata, int *scanned); +sdp_record_t *sdp_extract_pdu_safe(const uint8_t *pdata, int bufsize, int *scanned); + +void sdp_data_print(sdp_data_t *data); +void sdp_print_service_attr(sdp_list_t *alist); + +int sdp_attrid_comp_func(const void *key1, const void *key2); + +void sdp_set_seq_len(uint8_t *ptr, uint32_t length); +void sdp_set_attrid(sdp_buf_t *pdu, uint16_t id); +void sdp_append_to_pdu(sdp_buf_t *dst, sdp_data_t *d); +void sdp_append_to_buf(sdp_buf_t *dst, uint8_t *data, uint32_t len); + +int sdp_gen_pdu(sdp_buf_t *pdu, sdp_data_t *data); +int sdp_gen_record_pdu(const sdp_record_t *rec, sdp_buf_t *pdu); + +int sdp_extract_seqtype(const uint8_t *buf, uint8_t *dtdp, int *seqlen); +int sdp_extract_seqtype_safe(const uint8_t *buf, int bufsize, uint8_t *dtdp, int *size); + +sdp_data_t *sdp_extract_attr(const uint8_t *pdata, int *extractedLength, sdp_record_t *rec); +sdp_data_t *sdp_extract_attr_safe(const uint8_t *pdata, int bufsize, int *extractedLength, sdp_record_t *rec); + +void sdp_pattern_add_uuid(sdp_record_t *rec, uuid_t *uuid); +void sdp_pattern_add_uuidseq(sdp_record_t *rec, sdp_list_t *seq); + +int sdp_send_req_w4_rsp(sdp_session_t *session, uint8_t *req, uint8_t *rsp, uint32_t reqsize, uint32_t *rspsize); + +#ifdef __cplusplus +} +#endif + +#endif /* __SDP_LIB_H */ | 
