xref: /openbmc/linux/include/net/bluetooth/hci.h (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds /*
2*1da177e4SLinus Torvalds    BlueZ - Bluetooth protocol stack for Linux
3*1da177e4SLinus Torvalds    Copyright (C) 2000-2001 Qualcomm Incorporated
4*1da177e4SLinus Torvalds 
5*1da177e4SLinus Torvalds    Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6*1da177e4SLinus Torvalds 
7*1da177e4SLinus Torvalds    This program is free software; you can redistribute it and/or modify
8*1da177e4SLinus Torvalds    it under the terms of the GNU General Public License version 2 as
9*1da177e4SLinus Torvalds    published by the Free Software Foundation;
10*1da177e4SLinus Torvalds 
11*1da177e4SLinus Torvalds    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12*1da177e4SLinus Torvalds    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13*1da177e4SLinus Torvalds    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14*1da177e4SLinus Torvalds    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15*1da177e4SLinus Torvalds    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16*1da177e4SLinus Torvalds    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17*1da177e4SLinus Torvalds    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18*1da177e4SLinus Torvalds    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19*1da177e4SLinus Torvalds 
20*1da177e4SLinus Torvalds    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21*1da177e4SLinus Torvalds    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22*1da177e4SLinus Torvalds    SOFTWARE IS DISCLAIMED.
23*1da177e4SLinus Torvalds */
24*1da177e4SLinus Torvalds 
25*1da177e4SLinus Torvalds #ifndef __HCI_H
26*1da177e4SLinus Torvalds #define __HCI_H
27*1da177e4SLinus Torvalds 
28*1da177e4SLinus Torvalds #define HCI_MAX_ACL_SIZE	1024
29*1da177e4SLinus Torvalds #define HCI_MAX_SCO_SIZE	255
30*1da177e4SLinus Torvalds #define HCI_MAX_EVENT_SIZE	260
31*1da177e4SLinus Torvalds #define HCI_MAX_FRAME_SIZE	(HCI_MAX_ACL_SIZE + 4)
32*1da177e4SLinus Torvalds 
33*1da177e4SLinus Torvalds /* HCI dev events */
34*1da177e4SLinus Torvalds #define HCI_DEV_REG			1
35*1da177e4SLinus Torvalds #define HCI_DEV_UNREG			2
36*1da177e4SLinus Torvalds #define HCI_DEV_UP			3
37*1da177e4SLinus Torvalds #define HCI_DEV_DOWN			4
38*1da177e4SLinus Torvalds #define HCI_DEV_SUSPEND			5
39*1da177e4SLinus Torvalds #define HCI_DEV_RESUME			6
40*1da177e4SLinus Torvalds 
41*1da177e4SLinus Torvalds /* HCI notify events */
42*1da177e4SLinus Torvalds #define HCI_NOTIFY_CONN_ADD		1
43*1da177e4SLinus Torvalds #define HCI_NOTIFY_CONN_DEL		2
44*1da177e4SLinus Torvalds #define HCI_NOTIFY_VOICE_SETTING	3
45*1da177e4SLinus Torvalds 
46*1da177e4SLinus Torvalds /* HCI device types */
47*1da177e4SLinus Torvalds #define HCI_VHCI	0
48*1da177e4SLinus Torvalds #define HCI_USB		1
49*1da177e4SLinus Torvalds #define HCI_PCCARD	2
50*1da177e4SLinus Torvalds #define HCI_UART	3
51*1da177e4SLinus Torvalds #define HCI_RS232	4
52*1da177e4SLinus Torvalds #define HCI_PCI		5
53*1da177e4SLinus Torvalds 
54*1da177e4SLinus Torvalds /* HCI device quirks */
55*1da177e4SLinus Torvalds enum {
56*1da177e4SLinus Torvalds 	HCI_QUIRK_RESET_ON_INIT,
57*1da177e4SLinus Torvalds 	HCI_QUIRK_RAW_DEVICE
58*1da177e4SLinus Torvalds };
59*1da177e4SLinus Torvalds 
60*1da177e4SLinus Torvalds /* HCI device flags */
61*1da177e4SLinus Torvalds enum {
62*1da177e4SLinus Torvalds 	HCI_UP,
63*1da177e4SLinus Torvalds 	HCI_INIT,
64*1da177e4SLinus Torvalds 	HCI_RUNNING,
65*1da177e4SLinus Torvalds 
66*1da177e4SLinus Torvalds 	HCI_PSCAN,
67*1da177e4SLinus Torvalds 	HCI_ISCAN,
68*1da177e4SLinus Torvalds 	HCI_AUTH,
69*1da177e4SLinus Torvalds 	HCI_ENCRYPT,
70*1da177e4SLinus Torvalds 	HCI_INQUIRY,
71*1da177e4SLinus Torvalds 
72*1da177e4SLinus Torvalds 	HCI_RAW,
73*1da177e4SLinus Torvalds 
74*1da177e4SLinus Torvalds 	HCI_SECMGR
75*1da177e4SLinus Torvalds };
76*1da177e4SLinus Torvalds 
77*1da177e4SLinus Torvalds /* HCI ioctl defines */
78*1da177e4SLinus Torvalds #define HCIDEVUP	_IOW('H', 201, int)
79*1da177e4SLinus Torvalds #define HCIDEVDOWN	_IOW('H', 202, int)
80*1da177e4SLinus Torvalds #define HCIDEVRESET	_IOW('H', 203, int)
81*1da177e4SLinus Torvalds #define HCIDEVRESTAT	_IOW('H', 204, int)
82*1da177e4SLinus Torvalds 
83*1da177e4SLinus Torvalds #define HCIGETDEVLIST	_IOR('H', 210, int)
84*1da177e4SLinus Torvalds #define HCIGETDEVINFO	_IOR('H', 211, int)
85*1da177e4SLinus Torvalds #define HCIGETCONNLIST	_IOR('H', 212, int)
86*1da177e4SLinus Torvalds #define HCIGETCONNINFO	_IOR('H', 213, int)
87*1da177e4SLinus Torvalds 
88*1da177e4SLinus Torvalds #define HCISETRAW	_IOW('H', 220, int)
89*1da177e4SLinus Torvalds #define HCISETSCAN	_IOW('H', 221, int)
90*1da177e4SLinus Torvalds #define HCISETAUTH	_IOW('H', 222, int)
91*1da177e4SLinus Torvalds #define HCISETENCRYPT	_IOW('H', 223, int)
92*1da177e4SLinus Torvalds #define HCISETPTYPE	_IOW('H', 224, int)
93*1da177e4SLinus Torvalds #define HCISETLINKPOL	_IOW('H', 225, int)
94*1da177e4SLinus Torvalds #define HCISETLINKMODE	_IOW('H', 226, int)
95*1da177e4SLinus Torvalds #define HCISETACLMTU	_IOW('H', 227, int)
96*1da177e4SLinus Torvalds #define HCISETSCOMTU	_IOW('H', 228, int)
97*1da177e4SLinus Torvalds 
98*1da177e4SLinus Torvalds #define HCISETSECMGR	_IOW('H', 230, int)
99*1da177e4SLinus Torvalds 
100*1da177e4SLinus Torvalds #define HCIINQUIRY	_IOR('H', 240, int)
101*1da177e4SLinus Torvalds 
102*1da177e4SLinus Torvalds /* HCI timeouts */
103*1da177e4SLinus Torvalds #define HCI_CONN_TIMEOUT	(HZ * 40)
104*1da177e4SLinus Torvalds #define HCI_DISCONN_TIMEOUT	(HZ * 2)
105*1da177e4SLinus Torvalds #define HCI_CONN_IDLE_TIMEOUT	(HZ * 60)
106*1da177e4SLinus Torvalds 
107*1da177e4SLinus Torvalds /* HCI Packet types */
108*1da177e4SLinus Torvalds #define HCI_COMMAND_PKT		0x01
109*1da177e4SLinus Torvalds #define HCI_ACLDATA_PKT		0x02
110*1da177e4SLinus Torvalds #define HCI_SCODATA_PKT		0x03
111*1da177e4SLinus Torvalds #define HCI_EVENT_PKT		0x04
112*1da177e4SLinus Torvalds #define HCI_VENDOR_PKT		0xff
113*1da177e4SLinus Torvalds 
114*1da177e4SLinus Torvalds /* HCI Packet types */
115*1da177e4SLinus Torvalds #define HCI_DM1		0x0008
116*1da177e4SLinus Torvalds #define HCI_DM3		0x0400
117*1da177e4SLinus Torvalds #define HCI_DM5		0x4000
118*1da177e4SLinus Torvalds #define HCI_DH1		0x0010
119*1da177e4SLinus Torvalds #define HCI_DH3		0x0800
120*1da177e4SLinus Torvalds #define HCI_DH5		0x8000
121*1da177e4SLinus Torvalds 
122*1da177e4SLinus Torvalds #define HCI_HV1		0x0020
123*1da177e4SLinus Torvalds #define HCI_HV2		0x0040
124*1da177e4SLinus Torvalds #define HCI_HV3		0x0080
125*1da177e4SLinus Torvalds 
126*1da177e4SLinus Torvalds #define SCO_PTYPE_MASK	(HCI_HV1 | HCI_HV2 | HCI_HV3)
127*1da177e4SLinus Torvalds #define ACL_PTYPE_MASK	(~SCO_PTYPE_MASK)
128*1da177e4SLinus Torvalds 
129*1da177e4SLinus Torvalds /* ACL flags */
130*1da177e4SLinus Torvalds #define ACL_CONT		0x01
131*1da177e4SLinus Torvalds #define ACL_START		0x02
132*1da177e4SLinus Torvalds #define ACL_ACTIVE_BCAST	0x04
133*1da177e4SLinus Torvalds #define ACL_PICO_BCAST		0x08
134*1da177e4SLinus Torvalds 
135*1da177e4SLinus Torvalds /* Baseband links */
136*1da177e4SLinus Torvalds #define SCO_LINK	0x00
137*1da177e4SLinus Torvalds #define ACL_LINK	0x01
138*1da177e4SLinus Torvalds 
139*1da177e4SLinus Torvalds /* LMP features */
140*1da177e4SLinus Torvalds #define LMP_3SLOT	0x01
141*1da177e4SLinus Torvalds #define LMP_5SLOT	0x02
142*1da177e4SLinus Torvalds #define LMP_ENCRYPT	0x04
143*1da177e4SLinus Torvalds #define LMP_SOFFSET	0x08
144*1da177e4SLinus Torvalds #define LMP_TACCURACY	0x10
145*1da177e4SLinus Torvalds #define LMP_RSWITCH	0x20
146*1da177e4SLinus Torvalds #define LMP_HOLD	0x40
147*1da177e4SLinus Torvalds #define LMP_SNIF	0x80
148*1da177e4SLinus Torvalds 
149*1da177e4SLinus Torvalds #define LMP_PARK	0x01
150*1da177e4SLinus Torvalds #define LMP_RSSI	0x02
151*1da177e4SLinus Torvalds #define LMP_QUALITY	0x04
152*1da177e4SLinus Torvalds #define LMP_SCO		0x08
153*1da177e4SLinus Torvalds #define LMP_HV2		0x10
154*1da177e4SLinus Torvalds #define LMP_HV3		0x20
155*1da177e4SLinus Torvalds #define LMP_ULAW	0x40
156*1da177e4SLinus Torvalds #define LMP_ALAW	0x80
157*1da177e4SLinus Torvalds 
158*1da177e4SLinus Torvalds #define LMP_CVSD	0x01
159*1da177e4SLinus Torvalds #define LMP_PSCHEME	0x02
160*1da177e4SLinus Torvalds #define LMP_PCONTROL	0x04
161*1da177e4SLinus Torvalds 
162*1da177e4SLinus Torvalds /* Link policies */
163*1da177e4SLinus Torvalds #define HCI_LP_RSWITCH	0x0001
164*1da177e4SLinus Torvalds #define HCI_LP_HOLD	0x0002
165*1da177e4SLinus Torvalds #define HCI_LP_SNIFF	0x0004
166*1da177e4SLinus Torvalds #define HCI_LP_PARK	0x0008
167*1da177e4SLinus Torvalds 
168*1da177e4SLinus Torvalds /* Link mode */
169*1da177e4SLinus Torvalds #define HCI_LM_ACCEPT	0x8000
170*1da177e4SLinus Torvalds #define HCI_LM_MASTER	0x0001
171*1da177e4SLinus Torvalds #define HCI_LM_AUTH	0x0002
172*1da177e4SLinus Torvalds #define HCI_LM_ENCRYPT	0x0004
173*1da177e4SLinus Torvalds #define HCI_LM_TRUSTED	0x0008
174*1da177e4SLinus Torvalds #define HCI_LM_RELIABLE	0x0010
175*1da177e4SLinus Torvalds #define HCI_LM_SECURE	0x0020
176*1da177e4SLinus Torvalds 
177*1da177e4SLinus Torvalds /* -----  HCI Commands ---- */
178*1da177e4SLinus Torvalds /* OGF & OCF values */
179*1da177e4SLinus Torvalds 
180*1da177e4SLinus Torvalds /* Informational Parameters */
181*1da177e4SLinus Torvalds #define OGF_INFO_PARAM	0x04
182*1da177e4SLinus Torvalds 
183*1da177e4SLinus Torvalds #define OCF_READ_LOCAL_VERSION	0x0001
184*1da177e4SLinus Torvalds struct hci_rp_read_loc_version {
185*1da177e4SLinus Torvalds 	__u8     status;
186*1da177e4SLinus Torvalds 	__u8     hci_ver;
187*1da177e4SLinus Torvalds 	__u16    hci_rev;
188*1da177e4SLinus Torvalds 	__u8     lmp_ver;
189*1da177e4SLinus Torvalds 	__u16    manufacturer;
190*1da177e4SLinus Torvalds 	__u16    lmp_subver;
191*1da177e4SLinus Torvalds } __attribute__ ((packed));
192*1da177e4SLinus Torvalds 
193*1da177e4SLinus Torvalds #define OCF_READ_LOCAL_FEATURES	0x0003
194*1da177e4SLinus Torvalds struct hci_rp_read_loc_features {
195*1da177e4SLinus Torvalds 	__u8 status;
196*1da177e4SLinus Torvalds 	__u8 features[8];
197*1da177e4SLinus Torvalds } __attribute__ ((packed));
198*1da177e4SLinus Torvalds 
199*1da177e4SLinus Torvalds #define OCF_READ_BUFFER_SIZE	0x0005
200*1da177e4SLinus Torvalds struct hci_rp_read_buffer_size {
201*1da177e4SLinus Torvalds 	__u8     status;
202*1da177e4SLinus Torvalds 	__u16    acl_mtu;
203*1da177e4SLinus Torvalds 	__u8     sco_mtu;
204*1da177e4SLinus Torvalds 	__u16    acl_max_pkt;
205*1da177e4SLinus Torvalds 	__u16    sco_max_pkt;
206*1da177e4SLinus Torvalds } __attribute__ ((packed));
207*1da177e4SLinus Torvalds 
208*1da177e4SLinus Torvalds #define OCF_READ_BD_ADDR	0x0009
209*1da177e4SLinus Torvalds struct hci_rp_read_bd_addr {
210*1da177e4SLinus Torvalds 	__u8     status;
211*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
212*1da177e4SLinus Torvalds } __attribute__ ((packed));
213*1da177e4SLinus Torvalds 
214*1da177e4SLinus Torvalds /* Host Controller and Baseband */
215*1da177e4SLinus Torvalds #define OGF_HOST_CTL	0x03
216*1da177e4SLinus Torvalds #define OCF_RESET		0x0003
217*1da177e4SLinus Torvalds #define OCF_READ_AUTH_ENABLE	0x001F
218*1da177e4SLinus Torvalds #define OCF_WRITE_AUTH_ENABLE	0x0020
219*1da177e4SLinus Torvalds 	#define AUTH_DISABLED		0x00
220*1da177e4SLinus Torvalds 	#define AUTH_ENABLED		0x01
221*1da177e4SLinus Torvalds 
222*1da177e4SLinus Torvalds #define OCF_READ_ENCRYPT_MODE	0x0021
223*1da177e4SLinus Torvalds #define OCF_WRITE_ENCRYPT_MODE	0x0022
224*1da177e4SLinus Torvalds 	#define ENCRYPT_DISABLED	0x00
225*1da177e4SLinus Torvalds 	#define ENCRYPT_P2P		0x01
226*1da177e4SLinus Torvalds 	#define ENCRYPT_BOTH		0x02
227*1da177e4SLinus Torvalds 
228*1da177e4SLinus Torvalds #define OCF_WRITE_CA_TIMEOUT  	0x0016
229*1da177e4SLinus Torvalds #define OCF_WRITE_PG_TIMEOUT  	0x0018
230*1da177e4SLinus Torvalds 
231*1da177e4SLinus Torvalds #define OCF_WRITE_SCAN_ENABLE 	0x001A
232*1da177e4SLinus Torvalds 	#define SCAN_DISABLED		0x00
233*1da177e4SLinus Torvalds 	#define SCAN_INQUIRY		0x01
234*1da177e4SLinus Torvalds 	#define SCAN_PAGE		0x02
235*1da177e4SLinus Torvalds 
236*1da177e4SLinus Torvalds #define OCF_SET_EVENT_FLT	0x0005
237*1da177e4SLinus Torvalds struct hci_cp_set_event_flt {
238*1da177e4SLinus Torvalds 	__u8     flt_type;
239*1da177e4SLinus Torvalds 	__u8     cond_type;
240*1da177e4SLinus Torvalds 	__u8     condition[0];
241*1da177e4SLinus Torvalds } __attribute__ ((packed));
242*1da177e4SLinus Torvalds 
243*1da177e4SLinus Torvalds /* Filter types */
244*1da177e4SLinus Torvalds #define HCI_FLT_CLEAR_ALL	0x00
245*1da177e4SLinus Torvalds #define HCI_FLT_INQ_RESULT	0x01
246*1da177e4SLinus Torvalds #define HCI_FLT_CONN_SETUP	0x02
247*1da177e4SLinus Torvalds 
248*1da177e4SLinus Torvalds /* CONN_SETUP Condition types */
249*1da177e4SLinus Torvalds #define HCI_CONN_SETUP_ALLOW_ALL	0x00
250*1da177e4SLinus Torvalds #define HCI_CONN_SETUP_ALLOW_CLASS	0x01
251*1da177e4SLinus Torvalds #define HCI_CONN_SETUP_ALLOW_BDADDR	0x02
252*1da177e4SLinus Torvalds 
253*1da177e4SLinus Torvalds /* CONN_SETUP Conditions */
254*1da177e4SLinus Torvalds #define HCI_CONN_SETUP_AUTO_OFF	0x01
255*1da177e4SLinus Torvalds #define HCI_CONN_SETUP_AUTO_ON	0x02
256*1da177e4SLinus Torvalds 
257*1da177e4SLinus Torvalds #define OCF_READ_CLASS_OF_DEV	0x0023
258*1da177e4SLinus Torvalds struct hci_rp_read_dev_class {
259*1da177e4SLinus Torvalds 	__u8     status;
260*1da177e4SLinus Torvalds 	__u8     dev_class[3];
261*1da177e4SLinus Torvalds } __attribute__ ((packed));
262*1da177e4SLinus Torvalds 
263*1da177e4SLinus Torvalds #define OCF_WRITE_CLASS_OF_DEV	0x0024
264*1da177e4SLinus Torvalds struct hci_cp_write_dev_class {
265*1da177e4SLinus Torvalds 	__u8     dev_class[3];
266*1da177e4SLinus Torvalds } __attribute__ ((packed));
267*1da177e4SLinus Torvalds 
268*1da177e4SLinus Torvalds #define OCF_READ_VOICE_SETTING	0x0025
269*1da177e4SLinus Torvalds struct hci_rp_read_voice_setting {
270*1da177e4SLinus Torvalds 	__u8	status;
271*1da177e4SLinus Torvalds 	__u16	voice_setting;
272*1da177e4SLinus Torvalds } __attribute__ ((packed));
273*1da177e4SLinus Torvalds 
274*1da177e4SLinus Torvalds #define OCF_WRITE_VOICE_SETTING	0x0026
275*1da177e4SLinus Torvalds struct hci_cp_write_voice_setting {
276*1da177e4SLinus Torvalds 	__u16	voice_setting;
277*1da177e4SLinus Torvalds } __attribute__ ((packed));
278*1da177e4SLinus Torvalds 
279*1da177e4SLinus Torvalds #define OCF_HOST_BUFFER_SIZE	0x0033
280*1da177e4SLinus Torvalds struct hci_cp_host_buffer_size {
281*1da177e4SLinus Torvalds 	__u16    acl_mtu;
282*1da177e4SLinus Torvalds 	__u8     sco_mtu;
283*1da177e4SLinus Torvalds 	__u16    acl_max_pkt;
284*1da177e4SLinus Torvalds 	__u16    sco_max_pkt;
285*1da177e4SLinus Torvalds } __attribute__ ((packed));
286*1da177e4SLinus Torvalds 
287*1da177e4SLinus Torvalds /* Link Control */
288*1da177e4SLinus Torvalds #define OGF_LINK_CTL	0x01
289*1da177e4SLinus Torvalds #define OCF_CREATE_CONN		0x0005
290*1da177e4SLinus Torvalds struct hci_cp_create_conn {
291*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
292*1da177e4SLinus Torvalds 	__u16    pkt_type;
293*1da177e4SLinus Torvalds 	__u8     pscan_rep_mode;
294*1da177e4SLinus Torvalds 	__u8     pscan_mode;
295*1da177e4SLinus Torvalds 	__u16    clock_offset;
296*1da177e4SLinus Torvalds 	__u8     role_switch;
297*1da177e4SLinus Torvalds } __attribute__ ((packed));
298*1da177e4SLinus Torvalds 
299*1da177e4SLinus Torvalds #define OCF_ACCEPT_CONN_REQ	0x0009
300*1da177e4SLinus Torvalds struct hci_cp_accept_conn_req {
301*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
302*1da177e4SLinus Torvalds 	__u8     role;
303*1da177e4SLinus Torvalds } __attribute__ ((packed));
304*1da177e4SLinus Torvalds 
305*1da177e4SLinus Torvalds #define OCF_REJECT_CONN_REQ	0x000a
306*1da177e4SLinus Torvalds struct hci_cp_reject_conn_req {
307*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
308*1da177e4SLinus Torvalds 	__u8     reason;
309*1da177e4SLinus Torvalds } __attribute__ ((packed));
310*1da177e4SLinus Torvalds 
311*1da177e4SLinus Torvalds #define OCF_DISCONNECT	0x0006
312*1da177e4SLinus Torvalds struct hci_cp_disconnect {
313*1da177e4SLinus Torvalds 	__u16    handle;
314*1da177e4SLinus Torvalds 	__u8     reason;
315*1da177e4SLinus Torvalds } __attribute__ ((packed));
316*1da177e4SLinus Torvalds 
317*1da177e4SLinus Torvalds #define OCF_ADD_SCO	0x0007
318*1da177e4SLinus Torvalds struct hci_cp_add_sco {
319*1da177e4SLinus Torvalds 	__u16    handle;
320*1da177e4SLinus Torvalds 	__u16    pkt_type;
321*1da177e4SLinus Torvalds } __attribute__ ((packed));
322*1da177e4SLinus Torvalds 
323*1da177e4SLinus Torvalds #define OCF_INQUIRY		0x0001
324*1da177e4SLinus Torvalds struct hci_cp_inquiry {
325*1da177e4SLinus Torvalds 	__u8     lap[3];
326*1da177e4SLinus Torvalds 	__u8     length;
327*1da177e4SLinus Torvalds 	__u8     num_rsp;
328*1da177e4SLinus Torvalds } __attribute__ ((packed));
329*1da177e4SLinus Torvalds 
330*1da177e4SLinus Torvalds #define OCF_INQUIRY_CANCEL	0x0002
331*1da177e4SLinus Torvalds 
332*1da177e4SLinus Torvalds #define OCF_LINK_KEY_REPLY	0x000B
333*1da177e4SLinus Torvalds struct hci_cp_link_key_reply {
334*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
335*1da177e4SLinus Torvalds 	__u8     link_key[16];
336*1da177e4SLinus Torvalds } __attribute__ ((packed));
337*1da177e4SLinus Torvalds 
338*1da177e4SLinus Torvalds #define OCF_LINK_KEY_NEG_REPLY	0x000C
339*1da177e4SLinus Torvalds struct hci_cp_link_key_neg_reply {
340*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
341*1da177e4SLinus Torvalds } __attribute__ ((packed));
342*1da177e4SLinus Torvalds 
343*1da177e4SLinus Torvalds #define OCF_PIN_CODE_REPLY	0x000D
344*1da177e4SLinus Torvalds struct hci_cp_pin_code_reply {
345*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
346*1da177e4SLinus Torvalds 	__u8     pin_len;
347*1da177e4SLinus Torvalds 	__u8     pin_code[16];
348*1da177e4SLinus Torvalds } __attribute__ ((packed));
349*1da177e4SLinus Torvalds 
350*1da177e4SLinus Torvalds #define OCF_PIN_CODE_NEG_REPLY	0x000E
351*1da177e4SLinus Torvalds struct hci_cp_pin_code_neg_reply {
352*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
353*1da177e4SLinus Torvalds } __attribute__ ((packed));
354*1da177e4SLinus Torvalds 
355*1da177e4SLinus Torvalds #define OCF_CHANGE_CONN_PTYPE	0x000F
356*1da177e4SLinus Torvalds struct hci_cp_change_conn_ptype {
357*1da177e4SLinus Torvalds 	__u16    handle;
358*1da177e4SLinus Torvalds 	__u16    pkt_type;
359*1da177e4SLinus Torvalds } __attribute__ ((packed));
360*1da177e4SLinus Torvalds 
361*1da177e4SLinus Torvalds #define OCF_AUTH_REQUESTED	0x0011
362*1da177e4SLinus Torvalds struct hci_cp_auth_requested {
363*1da177e4SLinus Torvalds 	__u16    handle;
364*1da177e4SLinus Torvalds } __attribute__ ((packed));
365*1da177e4SLinus Torvalds 
366*1da177e4SLinus Torvalds #define OCF_SET_CONN_ENCRYPT	0x0013
367*1da177e4SLinus Torvalds struct hci_cp_set_conn_encrypt {
368*1da177e4SLinus Torvalds 	__u16    handle;
369*1da177e4SLinus Torvalds 	__u8     encrypt;
370*1da177e4SLinus Torvalds } __attribute__ ((packed));
371*1da177e4SLinus Torvalds 
372*1da177e4SLinus Torvalds #define OCF_CHANGE_CONN_LINK_KEY 0x0015
373*1da177e4SLinus Torvalds struct hci_cp_change_conn_link_key {
374*1da177e4SLinus Torvalds 	__u16    handle;
375*1da177e4SLinus Torvalds } __attribute__ ((packed));
376*1da177e4SLinus Torvalds 
377*1da177e4SLinus Torvalds #define OCF_READ_REMOTE_FEATURES 0x001B
378*1da177e4SLinus Torvalds struct hci_cp_read_rmt_features {
379*1da177e4SLinus Torvalds 	__u16    handle;
380*1da177e4SLinus Torvalds } __attribute__ ((packed));
381*1da177e4SLinus Torvalds 
382*1da177e4SLinus Torvalds #define OCF_READ_REMOTE_VERSION 0x001D
383*1da177e4SLinus Torvalds struct hci_cp_read_rmt_version {
384*1da177e4SLinus Torvalds 	__u16    handle;
385*1da177e4SLinus Torvalds } __attribute__ ((packed));
386*1da177e4SLinus Torvalds 
387*1da177e4SLinus Torvalds /* Link Policy */
388*1da177e4SLinus Torvalds #define OGF_LINK_POLICY	 0x02
389*1da177e4SLinus Torvalds #define OCF_ROLE_DISCOVERY	0x0009
390*1da177e4SLinus Torvalds struct hci_cp_role_discovery {
391*1da177e4SLinus Torvalds 	__u16    handle;
392*1da177e4SLinus Torvalds } __attribute__ ((packed));
393*1da177e4SLinus Torvalds struct hci_rp_role_discovery {
394*1da177e4SLinus Torvalds 	__u8     status;
395*1da177e4SLinus Torvalds 	__u16    handle;
396*1da177e4SLinus Torvalds 	__u8     role;
397*1da177e4SLinus Torvalds } __attribute__ ((packed));
398*1da177e4SLinus Torvalds 
399*1da177e4SLinus Torvalds #define OCF_READ_LINK_POLICY	0x000C
400*1da177e4SLinus Torvalds struct hci_cp_read_link_policy {
401*1da177e4SLinus Torvalds 	__u16    handle;
402*1da177e4SLinus Torvalds } __attribute__ ((packed));
403*1da177e4SLinus Torvalds struct hci_rp_read_link_policy {
404*1da177e4SLinus Torvalds 	__u8     status;
405*1da177e4SLinus Torvalds 	__u16    handle;
406*1da177e4SLinus Torvalds 	__u16    policy;
407*1da177e4SLinus Torvalds } __attribute__ ((packed));
408*1da177e4SLinus Torvalds 
409*1da177e4SLinus Torvalds #define OCF_SWITCH_ROLE	0x000B
410*1da177e4SLinus Torvalds struct hci_cp_switch_role {
411*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
412*1da177e4SLinus Torvalds 	__u8     role;
413*1da177e4SLinus Torvalds } __attribute__ ((packed));
414*1da177e4SLinus Torvalds 
415*1da177e4SLinus Torvalds #define OCF_WRITE_LINK_POLICY	0x000D
416*1da177e4SLinus Torvalds struct hci_cp_write_link_policy {
417*1da177e4SLinus Torvalds 	__u16    handle;
418*1da177e4SLinus Torvalds 	__u16    policy;
419*1da177e4SLinus Torvalds } __attribute__ ((packed));
420*1da177e4SLinus Torvalds struct hci_rp_write_link_policy {
421*1da177e4SLinus Torvalds 	__u8     status;
422*1da177e4SLinus Torvalds 	__u16    handle;
423*1da177e4SLinus Torvalds } __attribute__ ((packed));
424*1da177e4SLinus Torvalds 
425*1da177e4SLinus Torvalds /* Status params */
426*1da177e4SLinus Torvalds #define OGF_STATUS_PARAM	0x05
427*1da177e4SLinus Torvalds 
428*1da177e4SLinus Torvalds /* Testing commands */
429*1da177e4SLinus Torvalds #define OGF_TESTING_CMD		0x3E
430*1da177e4SLinus Torvalds 
431*1da177e4SLinus Torvalds /* Vendor specific commands */
432*1da177e4SLinus Torvalds #define OGF_VENDOR_CMD		0x3F
433*1da177e4SLinus Torvalds 
434*1da177e4SLinus Torvalds /* ---- HCI Events ---- */
435*1da177e4SLinus Torvalds #define HCI_EV_INQUIRY_COMPLETE	0x01
436*1da177e4SLinus Torvalds 
437*1da177e4SLinus Torvalds #define HCI_EV_INQUIRY_RESULT	0x02
438*1da177e4SLinus Torvalds struct inquiry_info {
439*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
440*1da177e4SLinus Torvalds 	__u8     pscan_rep_mode;
441*1da177e4SLinus Torvalds 	__u8     pscan_period_mode;
442*1da177e4SLinus Torvalds 	__u8     pscan_mode;
443*1da177e4SLinus Torvalds 	__u8     dev_class[3];
444*1da177e4SLinus Torvalds 	__u16    clock_offset;
445*1da177e4SLinus Torvalds } __attribute__ ((packed));
446*1da177e4SLinus Torvalds 
447*1da177e4SLinus Torvalds #define HCI_EV_INQUIRY_RESULT_WITH_RSSI	0x22
448*1da177e4SLinus Torvalds struct inquiry_info_with_rssi {
449*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
450*1da177e4SLinus Torvalds 	__u8     pscan_rep_mode;
451*1da177e4SLinus Torvalds 	__u8     pscan_period_mode;
452*1da177e4SLinus Torvalds 	__u8     dev_class[3];
453*1da177e4SLinus Torvalds 	__u16    clock_offset;
454*1da177e4SLinus Torvalds 	__s8     rssi;
455*1da177e4SLinus Torvalds } __attribute__ ((packed));
456*1da177e4SLinus Torvalds 
457*1da177e4SLinus Torvalds #define HCI_EV_CONN_COMPLETE 	0x03
458*1da177e4SLinus Torvalds struct hci_ev_conn_complete {
459*1da177e4SLinus Torvalds 	__u8     status;
460*1da177e4SLinus Torvalds 	__u16    handle;
461*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
462*1da177e4SLinus Torvalds 	__u8     link_type;
463*1da177e4SLinus Torvalds 	__u8     encr_mode;
464*1da177e4SLinus Torvalds } __attribute__ ((packed));
465*1da177e4SLinus Torvalds 
466*1da177e4SLinus Torvalds #define HCI_EV_CONN_REQUEST	0x04
467*1da177e4SLinus Torvalds struct hci_ev_conn_request {
468*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
469*1da177e4SLinus Torvalds 	__u8     dev_class[3];
470*1da177e4SLinus Torvalds 	__u8     link_type;
471*1da177e4SLinus Torvalds } __attribute__ ((packed));
472*1da177e4SLinus Torvalds 
473*1da177e4SLinus Torvalds #define HCI_EV_DISCONN_COMPLETE	0x05
474*1da177e4SLinus Torvalds struct hci_ev_disconn_complete {
475*1da177e4SLinus Torvalds 	__u8     status;
476*1da177e4SLinus Torvalds 	__u16    handle;
477*1da177e4SLinus Torvalds 	__u8     reason;
478*1da177e4SLinus Torvalds } __attribute__ ((packed));
479*1da177e4SLinus Torvalds 
480*1da177e4SLinus Torvalds #define HCI_EV_AUTH_COMPLETE	0x06
481*1da177e4SLinus Torvalds struct hci_ev_auth_complete {
482*1da177e4SLinus Torvalds 	__u8     status;
483*1da177e4SLinus Torvalds 	__u16    handle;
484*1da177e4SLinus Torvalds } __attribute__ ((packed));
485*1da177e4SLinus Torvalds 
486*1da177e4SLinus Torvalds #define HCI_EV_ENCRYPT_CHANGE	0x08
487*1da177e4SLinus Torvalds struct hci_ev_encrypt_change {
488*1da177e4SLinus Torvalds 	__u8     status;
489*1da177e4SLinus Torvalds 	__u16    handle;
490*1da177e4SLinus Torvalds 	__u8     encrypt;
491*1da177e4SLinus Torvalds } __attribute__ ((packed));
492*1da177e4SLinus Torvalds 
493*1da177e4SLinus Torvalds #define HCI_EV_CHANGE_CONN_LINK_KEY_COMPLETE	0x09
494*1da177e4SLinus Torvalds struct hci_ev_change_conn_link_key_complete {
495*1da177e4SLinus Torvalds 	__u8     status;
496*1da177e4SLinus Torvalds 	__u16    handle;
497*1da177e4SLinus Torvalds } __attribute__ ((packed));
498*1da177e4SLinus Torvalds 
499*1da177e4SLinus Torvalds #define HCI_EV_QOS_SETUP_COMPLETE	0x0D
500*1da177e4SLinus Torvalds struct hci_qos {
501*1da177e4SLinus Torvalds 	__u8     service_type;
502*1da177e4SLinus Torvalds 	__u32    token_rate;
503*1da177e4SLinus Torvalds 	__u32    peak_bandwidth;
504*1da177e4SLinus Torvalds 	__u32    latency;
505*1da177e4SLinus Torvalds 	__u32    delay_variation;
506*1da177e4SLinus Torvalds } __attribute__ ((packed));
507*1da177e4SLinus Torvalds struct hci_ev_qos_setup_complete {
508*1da177e4SLinus Torvalds 	__u8     status;
509*1da177e4SLinus Torvalds 	__u16    handle;
510*1da177e4SLinus Torvalds 	struct   hci_qos qos;
511*1da177e4SLinus Torvalds } __attribute__ ((packed));
512*1da177e4SLinus Torvalds 
513*1da177e4SLinus Torvalds #define HCI_EV_CMD_COMPLETE 	0x0E
514*1da177e4SLinus Torvalds struct hci_ev_cmd_complete {
515*1da177e4SLinus Torvalds 	__u8     ncmd;
516*1da177e4SLinus Torvalds 	__u16    opcode;
517*1da177e4SLinus Torvalds } __attribute__ ((packed));
518*1da177e4SLinus Torvalds 
519*1da177e4SLinus Torvalds #define HCI_EV_CMD_STATUS 	0x0F
520*1da177e4SLinus Torvalds struct hci_ev_cmd_status {
521*1da177e4SLinus Torvalds 	__u8     status;
522*1da177e4SLinus Torvalds 	__u8     ncmd;
523*1da177e4SLinus Torvalds 	__u16    opcode;
524*1da177e4SLinus Torvalds } __attribute__ ((packed));
525*1da177e4SLinus Torvalds 
526*1da177e4SLinus Torvalds #define HCI_EV_NUM_COMP_PKTS	0x13
527*1da177e4SLinus Torvalds struct hci_ev_num_comp_pkts {
528*1da177e4SLinus Torvalds 	__u8     num_hndl;
529*1da177e4SLinus Torvalds 	/* variable length part */
530*1da177e4SLinus Torvalds } __attribute__ ((packed));
531*1da177e4SLinus Torvalds 
532*1da177e4SLinus Torvalds #define HCI_EV_ROLE_CHANGE	0x12
533*1da177e4SLinus Torvalds struct hci_ev_role_change {
534*1da177e4SLinus Torvalds 	__u8     status;
535*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
536*1da177e4SLinus Torvalds 	__u8     role;
537*1da177e4SLinus Torvalds } __attribute__ ((packed));
538*1da177e4SLinus Torvalds 
539*1da177e4SLinus Torvalds #define HCI_EV_MODE_CHANGE	0x14
540*1da177e4SLinus Torvalds struct hci_ev_mode_change {
541*1da177e4SLinus Torvalds 	__u8     status;
542*1da177e4SLinus Torvalds 	__u16    handle;
543*1da177e4SLinus Torvalds 	__u8     mode;
544*1da177e4SLinus Torvalds 	__u16    interval;
545*1da177e4SLinus Torvalds } __attribute__ ((packed));
546*1da177e4SLinus Torvalds 
547*1da177e4SLinus Torvalds #define HCI_EV_PIN_CODE_REQ	0x16
548*1da177e4SLinus Torvalds struct hci_ev_pin_code_req {
549*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
550*1da177e4SLinus Torvalds } __attribute__ ((packed));
551*1da177e4SLinus Torvalds 
552*1da177e4SLinus Torvalds #define HCI_EV_LINK_KEY_REQ	0x17
553*1da177e4SLinus Torvalds struct hci_ev_link_key_req {
554*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
555*1da177e4SLinus Torvalds } __attribute__ ((packed));
556*1da177e4SLinus Torvalds 
557*1da177e4SLinus Torvalds #define HCI_EV_LINK_KEY_NOTIFY	0x18
558*1da177e4SLinus Torvalds struct hci_ev_link_key_notify {
559*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
560*1da177e4SLinus Torvalds 	__u8	 link_key[16];
561*1da177e4SLinus Torvalds 	__u8	 key_type;
562*1da177e4SLinus Torvalds } __attribute__ ((packed));
563*1da177e4SLinus Torvalds 
564*1da177e4SLinus Torvalds #define HCI_EV_RMT_FEATURES	0x0B
565*1da177e4SLinus Torvalds struct hci_ev_rmt_features {
566*1da177e4SLinus Torvalds 	__u8     status;
567*1da177e4SLinus Torvalds 	__u16    handle;
568*1da177e4SLinus Torvalds 	__u8     features[8];
569*1da177e4SLinus Torvalds } __attribute__ ((packed));
570*1da177e4SLinus Torvalds 
571*1da177e4SLinus Torvalds #define HCI_EV_RMT_VERSION	0x0C
572*1da177e4SLinus Torvalds struct hci_ev_rmt_version {
573*1da177e4SLinus Torvalds 	__u8     status;
574*1da177e4SLinus Torvalds 	__u16    handle;
575*1da177e4SLinus Torvalds 	__u8     lmp_ver;
576*1da177e4SLinus Torvalds 	__u16    manufacturer;
577*1da177e4SLinus Torvalds 	__u16    lmp_subver;
578*1da177e4SLinus Torvalds } __attribute__ ((packed));
579*1da177e4SLinus Torvalds 
580*1da177e4SLinus Torvalds #define HCI_EV_CLOCK_OFFSET	0x01C
581*1da177e4SLinus Torvalds struct hci_ev_clock_offset {
582*1da177e4SLinus Torvalds 	__u8     status;
583*1da177e4SLinus Torvalds 	__u16    handle;
584*1da177e4SLinus Torvalds 	__u16    clock_offset;
585*1da177e4SLinus Torvalds } __attribute__ ((packed));
586*1da177e4SLinus Torvalds 
587*1da177e4SLinus Torvalds /* Internal events generated by Bluetooth stack */
588*1da177e4SLinus Torvalds #define HCI_EV_STACK_INTERNAL	0xFD
589*1da177e4SLinus Torvalds struct hci_ev_stack_internal {
590*1da177e4SLinus Torvalds 	__u16    type;
591*1da177e4SLinus Torvalds 	__u8     data[0];
592*1da177e4SLinus Torvalds } __attribute__ ((packed));
593*1da177e4SLinus Torvalds 
594*1da177e4SLinus Torvalds #define HCI_EV_SI_DEVICE  	0x01
595*1da177e4SLinus Torvalds struct hci_ev_si_device {
596*1da177e4SLinus Torvalds 	__u16    event;
597*1da177e4SLinus Torvalds 	__u16    dev_id;
598*1da177e4SLinus Torvalds } __attribute__ ((packed));
599*1da177e4SLinus Torvalds 
600*1da177e4SLinus Torvalds #define HCI_EV_SI_SECURITY	0x02
601*1da177e4SLinus Torvalds struct hci_ev_si_security {
602*1da177e4SLinus Torvalds 	__u16    event;
603*1da177e4SLinus Torvalds 	__u16    proto;
604*1da177e4SLinus Torvalds 	__u16    subproto;
605*1da177e4SLinus Torvalds 	__u8     incoming;
606*1da177e4SLinus Torvalds } __attribute__ ((packed));
607*1da177e4SLinus Torvalds 
608*1da177e4SLinus Torvalds /* ---- HCI Packet structures ---- */
609*1da177e4SLinus Torvalds #define HCI_COMMAND_HDR_SIZE 3
610*1da177e4SLinus Torvalds #define HCI_EVENT_HDR_SIZE   2
611*1da177e4SLinus Torvalds #define HCI_ACL_HDR_SIZE     4
612*1da177e4SLinus Torvalds #define HCI_SCO_HDR_SIZE     3
613*1da177e4SLinus Torvalds 
614*1da177e4SLinus Torvalds struct hci_command_hdr {
615*1da177e4SLinus Torvalds 	__u16 	opcode;		/* OCF & OGF */
616*1da177e4SLinus Torvalds 	__u8 	plen;
617*1da177e4SLinus Torvalds } __attribute__ ((packed));
618*1da177e4SLinus Torvalds 
619*1da177e4SLinus Torvalds struct hci_event_hdr {
620*1da177e4SLinus Torvalds 	__u8 	evt;
621*1da177e4SLinus Torvalds 	__u8 	plen;
622*1da177e4SLinus Torvalds } __attribute__ ((packed));
623*1da177e4SLinus Torvalds 
624*1da177e4SLinus Torvalds struct hci_acl_hdr {
625*1da177e4SLinus Torvalds 	__u16 	handle;		/* Handle & Flags(PB, BC) */
626*1da177e4SLinus Torvalds 	__u16 	dlen;
627*1da177e4SLinus Torvalds } __attribute__ ((packed));
628*1da177e4SLinus Torvalds 
629*1da177e4SLinus Torvalds struct hci_sco_hdr {
630*1da177e4SLinus Torvalds 	__u16 	handle;
631*1da177e4SLinus Torvalds 	__u8 	dlen;
632*1da177e4SLinus Torvalds } __attribute__ ((packed));
633*1da177e4SLinus Torvalds 
634*1da177e4SLinus Torvalds /* Command opcode pack/unpack */
635*1da177e4SLinus Torvalds #define hci_opcode_pack(ogf, ocf)	(__u16)((ocf & 0x03ff)|(ogf << 10))
636*1da177e4SLinus Torvalds #define hci_opcode_ogf(op)		(op >> 10)
637*1da177e4SLinus Torvalds #define hci_opcode_ocf(op)		(op & 0x03ff)
638*1da177e4SLinus Torvalds 
639*1da177e4SLinus Torvalds /* ACL handle and flags pack/unpack */
640*1da177e4SLinus Torvalds #define hci_handle_pack(h, f)	(__u16)((h & 0x0fff)|(f << 12))
641*1da177e4SLinus Torvalds #define hci_handle(h)		(h & 0x0fff)
642*1da177e4SLinus Torvalds #define hci_flags(h)		(h >> 12)
643*1da177e4SLinus Torvalds 
644*1da177e4SLinus Torvalds /* ---- HCI Sockets ---- */
645*1da177e4SLinus Torvalds 
646*1da177e4SLinus Torvalds /* Socket options */
647*1da177e4SLinus Torvalds #define HCI_DATA_DIR	1
648*1da177e4SLinus Torvalds #define HCI_FILTER	2
649*1da177e4SLinus Torvalds #define HCI_TIME_STAMP	3
650*1da177e4SLinus Torvalds 
651*1da177e4SLinus Torvalds /* CMSG flags */
652*1da177e4SLinus Torvalds #define HCI_CMSG_DIR	0x0001
653*1da177e4SLinus Torvalds #define HCI_CMSG_TSTAMP	0x0002
654*1da177e4SLinus Torvalds 
655*1da177e4SLinus Torvalds struct sockaddr_hci {
656*1da177e4SLinus Torvalds 	sa_family_t    hci_family;
657*1da177e4SLinus Torvalds 	unsigned short hci_dev;
658*1da177e4SLinus Torvalds };
659*1da177e4SLinus Torvalds #define HCI_DEV_NONE	0xffff
660*1da177e4SLinus Torvalds 
661*1da177e4SLinus Torvalds struct hci_filter {
662*1da177e4SLinus Torvalds 	unsigned long type_mask;
663*1da177e4SLinus Torvalds 	unsigned long event_mask[2];
664*1da177e4SLinus Torvalds 	__u16   opcode;
665*1da177e4SLinus Torvalds };
666*1da177e4SLinus Torvalds 
667*1da177e4SLinus Torvalds struct hci_ufilter {
668*1da177e4SLinus Torvalds 	__u32   type_mask;
669*1da177e4SLinus Torvalds 	__u32   event_mask[2];
670*1da177e4SLinus Torvalds 	__u16   opcode;
671*1da177e4SLinus Torvalds };
672*1da177e4SLinus Torvalds 
673*1da177e4SLinus Torvalds #define HCI_FLT_TYPE_BITS	31
674*1da177e4SLinus Torvalds #define HCI_FLT_EVENT_BITS	63
675*1da177e4SLinus Torvalds #define HCI_FLT_OGF_BITS	63
676*1da177e4SLinus Torvalds #define HCI_FLT_OCF_BITS	127
677*1da177e4SLinus Torvalds 
678*1da177e4SLinus Torvalds /* ---- HCI Ioctl requests structures ---- */
679*1da177e4SLinus Torvalds struct hci_dev_stats {
680*1da177e4SLinus Torvalds 	__u32 err_rx;
681*1da177e4SLinus Torvalds 	__u32 err_tx;
682*1da177e4SLinus Torvalds 	__u32 cmd_tx;
683*1da177e4SLinus Torvalds 	__u32 evt_rx;
684*1da177e4SLinus Torvalds 	__u32 acl_tx;
685*1da177e4SLinus Torvalds 	__u32 acl_rx;
686*1da177e4SLinus Torvalds 	__u32 sco_tx;
687*1da177e4SLinus Torvalds 	__u32 sco_rx;
688*1da177e4SLinus Torvalds 	__u32 byte_rx;
689*1da177e4SLinus Torvalds 	__u32 byte_tx;
690*1da177e4SLinus Torvalds };
691*1da177e4SLinus Torvalds 
692*1da177e4SLinus Torvalds struct hci_dev_info {
693*1da177e4SLinus Torvalds 	__u16 dev_id;
694*1da177e4SLinus Torvalds 	char  name[8];
695*1da177e4SLinus Torvalds 
696*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
697*1da177e4SLinus Torvalds 
698*1da177e4SLinus Torvalds 	__u32 flags;
699*1da177e4SLinus Torvalds 	__u8  type;
700*1da177e4SLinus Torvalds 
701*1da177e4SLinus Torvalds 	__u8  features[8];
702*1da177e4SLinus Torvalds 
703*1da177e4SLinus Torvalds 	__u32 pkt_type;
704*1da177e4SLinus Torvalds 	__u32 link_policy;
705*1da177e4SLinus Torvalds 	__u32 link_mode;
706*1da177e4SLinus Torvalds 
707*1da177e4SLinus Torvalds 	__u16 acl_mtu;
708*1da177e4SLinus Torvalds 	__u16 acl_pkts;
709*1da177e4SLinus Torvalds 	__u16 sco_mtu;
710*1da177e4SLinus Torvalds 	__u16 sco_pkts;
711*1da177e4SLinus Torvalds 
712*1da177e4SLinus Torvalds 	struct hci_dev_stats stat;
713*1da177e4SLinus Torvalds };
714*1da177e4SLinus Torvalds 
715*1da177e4SLinus Torvalds struct hci_conn_info {
716*1da177e4SLinus Torvalds 	__u16    handle;
717*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
718*1da177e4SLinus Torvalds 	__u8	 type;
719*1da177e4SLinus Torvalds 	__u8	 out;
720*1da177e4SLinus Torvalds 	__u16	 state;
721*1da177e4SLinus Torvalds 	__u32	 link_mode;
722*1da177e4SLinus Torvalds };
723*1da177e4SLinus Torvalds 
724*1da177e4SLinus Torvalds struct hci_dev_req {
725*1da177e4SLinus Torvalds 	__u16 dev_id;
726*1da177e4SLinus Torvalds 	__u32 dev_opt;
727*1da177e4SLinus Torvalds };
728*1da177e4SLinus Torvalds 
729*1da177e4SLinus Torvalds struct hci_dev_list_req {
730*1da177e4SLinus Torvalds 	__u16  dev_num;
731*1da177e4SLinus Torvalds 	struct hci_dev_req dev_req[0];	/* hci_dev_req structures */
732*1da177e4SLinus Torvalds };
733*1da177e4SLinus Torvalds 
734*1da177e4SLinus Torvalds struct hci_conn_list_req {
735*1da177e4SLinus Torvalds 	__u16  dev_id;
736*1da177e4SLinus Torvalds 	__u16  conn_num;
737*1da177e4SLinus Torvalds 	struct hci_conn_info conn_info[0];
738*1da177e4SLinus Torvalds };
739*1da177e4SLinus Torvalds 
740*1da177e4SLinus Torvalds struct hci_conn_info_req {
741*1da177e4SLinus Torvalds 	bdaddr_t bdaddr;
742*1da177e4SLinus Torvalds 	__u8     type;
743*1da177e4SLinus Torvalds 	struct   hci_conn_info conn_info[0];
744*1da177e4SLinus Torvalds };
745*1da177e4SLinus Torvalds 
746*1da177e4SLinus Torvalds struct hci_inquiry_req {
747*1da177e4SLinus Torvalds 	__u16 dev_id;
748*1da177e4SLinus Torvalds 	__u16 flags;
749*1da177e4SLinus Torvalds 	__u8  lap[3];
750*1da177e4SLinus Torvalds 	__u8  length;
751*1da177e4SLinus Torvalds 	__u8  num_rsp;
752*1da177e4SLinus Torvalds };
753*1da177e4SLinus Torvalds #define IREQ_CACHE_FLUSH 0x0001
754*1da177e4SLinus Torvalds 
755*1da177e4SLinus Torvalds #endif /* __HCI_H */
756