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