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