usb-bot: hotplug support
[qemu/kevin.git] / hw / bt / hci.c
blob7d5220509318616b0bcf355f18bf5c3eda5abd5b
1 /*
2 * QEMU Bluetooth HCI logic.
4 * Copyright (C) 2007 OpenMoko, Inc.
5 * Copyright (C) 2008 Andrzej Zaborowski <balrog@zabor.org>
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of
10 * the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, see <http://www.gnu.org/licenses/>.
21 #include "qemu/osdep.h"
22 #include "qapi/error.h"
23 #include "qemu-common.h"
24 #include "qemu/timer.h"
25 #include "hw/usb.h"
26 #include "sysemu/bt.h"
27 #include "hw/bt.h"
28 #include "qapi/qmp/qerror.h"
29 #include "sysemu/replay.h"
30 #include "qemu/cutils.h"
32 struct bt_hci_s {
33 uint8_t *(*evt_packet)(void *opaque);
34 void (*evt_submit)(void *opaque, int len);
35 void *opaque;
36 uint8_t evt_buf[256];
38 uint8_t acl_buf[4096];
39 int acl_len;
41 uint16_t asb_handle;
42 uint16_t psb_handle;
44 int last_cmd; /* Note: Always little-endian */
46 struct bt_device_s *conn_req_host;
48 struct {
49 int inquire;
50 int periodic;
51 int responses_left;
52 int responses;
53 QEMUTimer *inquiry_done;
54 QEMUTimer *inquiry_next;
55 int inquiry_length;
56 int inquiry_period;
57 int inquiry_mode;
59 #define HCI_HANDLE_OFFSET 0x20
60 #define HCI_HANDLES_MAX 0x10
61 struct bt_hci_master_link_s {
62 struct bt_link_s *link;
63 void (*lmp_acl_data)(struct bt_link_s *link,
64 const uint8_t *data, int start, int len);
65 QEMUTimer *acl_mode_timer;
66 } handle[HCI_HANDLES_MAX];
67 uint32_t role_bmp;
68 int last_handle;
69 int connecting;
70 bdaddr_t awaiting_bdaddr[HCI_HANDLES_MAX];
71 } lm;
73 uint8_t event_mask[8];
74 uint16_t voice_setting; /* Notw: Always little-endian */
75 uint16_t conn_accept_tout;
76 QEMUTimer *conn_accept_timer;
78 struct HCIInfo info;
79 struct bt_device_s device;
81 Error *replay_blocker;
84 #define DEFAULT_RSSI_DBM 20
86 #define hci_from_info(ptr) container_of((ptr), struct bt_hci_s, info)
87 #define hci_from_device(ptr) container_of((ptr), struct bt_hci_s, device)
89 struct bt_hci_link_s {
90 struct bt_link_s btlink;
91 uint16_t handle; /* Local */
94 /* LMP layer emulation */
95 #if 0
96 static void bt_submit_lmp(struct bt_device_s *bt, int length, uint8_t *data)
98 int resp, resplen, error, op, tr;
99 uint8_t respdata[17];
101 if (length < 1)
102 return;
104 tr = *data & 1;
105 op = *(data ++) >> 1;
106 resp = LMP_ACCEPTED;
107 resplen = 2;
108 respdata[1] = op;
109 error = 0;
110 length --;
112 if (op >= 0x7c) { /* Extended opcode */
113 op |= *(data ++) << 8;
114 resp = LMP_ACCEPTED_EXT;
115 resplen = 4;
116 respdata[0] = op >> 8;
117 respdata[1] = op & 0xff;
118 length --;
121 switch (op) {
122 case LMP_ACCEPTED:
123 /* data[0] Op code
125 if (length < 1) {
126 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
127 goto not_accepted;
129 resp = 0;
130 break;
132 case LMP_ACCEPTED_EXT:
133 /* data[0] Escape op code
134 * data[1] Extended op code
136 if (length < 2) {
137 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
138 goto not_accepted;
140 resp = 0;
141 break;
143 case LMP_NOT_ACCEPTED:
144 /* data[0] Op code
145 * data[1] Error code
147 if (length < 2) {
148 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
149 goto not_accepted;
151 resp = 0;
152 break;
154 case LMP_NOT_ACCEPTED_EXT:
155 /* data[0] Op code
156 * data[1] Extended op code
157 * data[2] Error code
159 if (length < 3) {
160 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
161 goto not_accepted;
163 resp = 0;
164 break;
166 case LMP_HOST_CONNECTION_REQ:
167 break;
169 case LMP_SETUP_COMPLETE:
170 resp = LMP_SETUP_COMPLETE;
171 resplen = 1;
172 bt->setup = 1;
173 break;
175 case LMP_DETACH:
176 /* data[0] Error code
178 if (length < 1) {
179 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
180 goto not_accepted;
182 bt->setup = 0;
183 resp = 0;
184 break;
186 case LMP_SUPERVISION_TIMEOUT:
187 /* data[0,1] Supervision timeout
189 if (length < 2) {
190 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
191 goto not_accepted;
193 resp = 0;
194 break;
196 case LMP_QUALITY_OF_SERVICE:
197 resp = 0;
198 /* Fall through */
199 case LMP_QOS_REQ:
200 /* data[0,1] Poll interval
201 * data[2] N(BC)
203 if (length < 3) {
204 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
205 goto not_accepted;
207 break;
209 case LMP_MAX_SLOT:
210 resp = 0;
211 /* Fall through */
212 case LMP_MAX_SLOT_REQ:
213 /* data[0] Max slots
215 if (length < 1) {
216 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
217 goto not_accepted;
219 break;
221 case LMP_AU_RAND:
222 case LMP_IN_RAND:
223 case LMP_COMB_KEY:
224 /* data[0-15] Random number
226 if (length < 16) {
227 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
228 goto not_accepted;
230 if (op == LMP_AU_RAND) {
231 if (bt->key_present) {
232 resp = LMP_SRES;
233 resplen = 5;
234 /* XXX: [Part H] Section 6.1 on page 801 */
235 } else {
236 error = HCI_PIN_OR_KEY_MISSING;
237 goto not_accepted;
239 } else if (op == LMP_IN_RAND) {
240 error = HCI_PAIRING_NOT_ALLOWED;
241 goto not_accepted;
242 } else {
243 /* XXX: [Part H] Section 3.2 on page 779 */
244 resp = LMP_UNIT_KEY;
245 resplen = 17;
246 memcpy(respdata + 1, bt->key, 16);
248 error = HCI_UNIT_LINK_KEY_USED;
249 goto not_accepted;
251 break;
253 case LMP_UNIT_KEY:
254 /* data[0-15] Key
256 if (length < 16) {
257 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
258 goto not_accepted;
260 memcpy(bt->key, data, 16);
261 bt->key_present = 1;
262 break;
264 case LMP_SRES:
265 /* data[0-3] Authentication response
267 if (length < 4) {
268 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
269 goto not_accepted;
271 break;
273 case LMP_CLKOFFSET_REQ:
274 resp = LMP_CLKOFFSET_RES;
275 resplen = 3;
276 respdata[1] = 0x33;
277 respdata[2] = 0x33;
278 break;
280 case LMP_CLKOFFSET_RES:
281 /* data[0,1] Clock offset
282 * (Slave to master only)
284 if (length < 2) {
285 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
286 goto not_accepted;
288 break;
290 case LMP_VERSION_REQ:
291 case LMP_VERSION_RES:
292 /* data[0] VersNr
293 * data[1,2] CompId
294 * data[3,4] SubVersNr
296 if (length < 5) {
297 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
298 goto not_accepted;
300 if (op == LMP_VERSION_REQ) {
301 resp = LMP_VERSION_RES;
302 resplen = 6;
303 respdata[1] = 0x20;
304 respdata[2] = 0xff;
305 respdata[3] = 0xff;
306 respdata[4] = 0xff;
307 respdata[5] = 0xff;
308 } else
309 resp = 0;
310 break;
312 case LMP_FEATURES_REQ:
313 case LMP_FEATURES_RES:
314 /* data[0-7] Features
316 if (length < 8) {
317 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
318 goto not_accepted;
320 if (op == LMP_FEATURES_REQ) {
321 resp = LMP_FEATURES_RES;
322 resplen = 9;
323 respdata[1] = (bt->lmp_caps >> 0) & 0xff;
324 respdata[2] = (bt->lmp_caps >> 8) & 0xff;
325 respdata[3] = (bt->lmp_caps >> 16) & 0xff;
326 respdata[4] = (bt->lmp_caps >> 24) & 0xff;
327 respdata[5] = (bt->lmp_caps >> 32) & 0xff;
328 respdata[6] = (bt->lmp_caps >> 40) & 0xff;
329 respdata[7] = (bt->lmp_caps >> 48) & 0xff;
330 respdata[8] = (bt->lmp_caps >> 56) & 0xff;
331 } else
332 resp = 0;
333 break;
335 case LMP_NAME_REQ:
336 /* data[0] Name offset
338 if (length < 1) {
339 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
340 goto not_accepted;
342 resp = LMP_NAME_RES;
343 resplen = 17;
344 respdata[1] = data[0];
345 respdata[2] = strlen(bt->lmp_name);
346 memset(respdata + 3, 0x00, 14);
347 if (respdata[2] > respdata[1])
348 memcpy(respdata + 3, bt->lmp_name + respdata[1],
349 respdata[2] - respdata[1]);
350 break;
352 case LMP_NAME_RES:
353 /* data[0] Name offset
354 * data[1] Name length
355 * data[2-15] Name fragment
357 if (length < 16) {
358 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
359 goto not_accepted;
361 resp = 0;
362 break;
364 default:
365 error = HCI_UNKNOWN_LMP_PDU;
366 /* Fall through */
367 not_accepted:
368 if (op >> 8) {
369 resp = LMP_NOT_ACCEPTED_EXT;
370 resplen = 5;
371 respdata[0] = op >> 8;
372 respdata[1] = op & 0xff;
373 respdata[2] = error;
374 } else {
375 resp = LMP_NOT_ACCEPTED;
376 resplen = 3;
377 respdata[0] = op & 0xff;
378 respdata[1] = error;
382 if (resp == 0)
383 return;
385 if (resp >> 8) {
386 respdata[0] = resp >> 8;
387 respdata[1] = resp & 0xff;
388 } else
389 respdata[0] = resp & 0xff;
391 respdata[0] <<= 1;
392 respdata[0] |= tr;
395 static void bt_submit_raw_acl(struct bt_piconet_s *net, int length, uint8_t *data)
397 struct bt_device_s *slave;
398 if (length < 1)
399 return;
401 slave = 0;
402 #if 0
403 slave = net->slave;
404 #endif
406 switch (data[0] & 3) {
407 case LLID_ACLC:
408 bt_submit_lmp(slave, length - 1, data + 1);
409 break;
410 case LLID_ACLU_START:
411 #if 0
412 bt_sumbit_l2cap(slave, length - 1, data + 1, (data[0] >> 2) & 1);
413 breka;
414 #endif
415 default:
416 case LLID_ACLU_CONT:
417 break;
420 #endif
422 /* HCI layer emulation */
424 /* Note: we could ignore endiannes because unswapped handles will still
425 * be valid as connection identifiers for the guest - they don't have to
426 * be continuously allocated. We do it though, to preserve similar
427 * behaviour between hosts. Some things, like the BD_ADDR cannot be
428 * preserved though (for example if a real hci is used). */
429 #ifdef HOST_WORDS_BIGENDIAN
430 # define HNDL(raw) bswap16(raw)
431 #else
432 # define HNDL(raw) (raw)
433 #endif
435 static const uint8_t bt_event_reserved_mask[8] = {
436 0xff, 0x9f, 0xfb, 0xff, 0x07, 0x18, 0x00, 0x00,
440 static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
444 static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
446 return -ENOTSUP;
449 struct HCIInfo null_hci = {
450 .cmd_send = null_hci_send,
451 .sco_send = null_hci_send,
452 .acl_send = null_hci_send,
453 .bdaddr_set = null_hci_addr_set,
457 static inline uint8_t *bt_hci_event_start(struct bt_hci_s *hci,
458 int evt, int len)
460 uint8_t *packet, mask;
461 int mask_byte;
463 if (len > 255) {
464 fprintf(stderr, "%s: HCI event params too long (%ib)\n",
465 __FUNCTION__, len);
466 exit(-1);
469 mask_byte = (evt - 1) >> 3;
470 mask = 1 << ((evt - 1) & 3);
471 if (mask & bt_event_reserved_mask[mask_byte] & ~hci->event_mask[mask_byte])
472 return NULL;
474 packet = hci->evt_packet(hci->opaque);
475 packet[0] = evt;
476 packet[1] = len;
478 return &packet[2];
481 static inline void bt_hci_event(struct bt_hci_s *hci, int evt,
482 void *params, int len)
484 uint8_t *packet = bt_hci_event_start(hci, evt, len);
486 if (!packet)
487 return;
489 if (len)
490 memcpy(packet, params, len);
492 hci->evt_submit(hci->opaque, len + 2);
495 static inline void bt_hci_event_status(struct bt_hci_s *hci, int status)
497 evt_cmd_status params = {
498 .status = status,
499 .ncmd = 1,
500 .opcode = hci->last_cmd,
503 bt_hci_event(hci, EVT_CMD_STATUS, &params, EVT_CMD_STATUS_SIZE);
506 static inline void bt_hci_event_complete(struct bt_hci_s *hci,
507 void *ret, int len)
509 uint8_t *packet = bt_hci_event_start(hci, EVT_CMD_COMPLETE,
510 len + EVT_CMD_COMPLETE_SIZE);
511 evt_cmd_complete *params = (evt_cmd_complete *) packet;
513 if (!packet)
514 return;
516 params->ncmd = 1;
517 params->opcode = hci->last_cmd;
518 if (len)
519 memcpy(&packet[EVT_CMD_COMPLETE_SIZE], ret, len);
521 hci->evt_submit(hci->opaque, len + EVT_CMD_COMPLETE_SIZE + 2);
524 static void bt_hci_inquiry_done(void *opaque)
526 struct bt_hci_s *hci = (struct bt_hci_s *) opaque;
527 uint8_t status = HCI_SUCCESS;
529 if (!hci->lm.periodic)
530 hci->lm.inquire = 0;
532 /* The specification is inconsistent about this one. Page 565 reads
533 * "The event parameters of Inquiry Complete event will have a summary
534 * of the result from the Inquiry process, which reports the number of
535 * nearby Bluetooth devices that responded [so hci->responses].", but
536 * Event Parameters (see page 729) has only Status. */
537 bt_hci_event(hci, EVT_INQUIRY_COMPLETE, &status, 1);
540 static void bt_hci_inquiry_result_standard(struct bt_hci_s *hci,
541 struct bt_device_s *slave)
543 inquiry_info params = {
544 .num_responses = 1,
545 .bdaddr = BAINIT(&slave->bd_addr),
546 .pscan_rep_mode = 0x00, /* R0 */
547 .pscan_period_mode = 0x00, /* P0 - deprecated */
548 .pscan_mode = 0x00, /* Standard scan - deprecated */
549 .dev_class[0] = slave->class[0],
550 .dev_class[1] = slave->class[1],
551 .dev_class[2] = slave->class[2],
552 /* TODO: return the clkoff *differenece* */
553 .clock_offset = slave->clkoff, /* Note: no swapping */
556 bt_hci_event(hci, EVT_INQUIRY_RESULT, &params, INQUIRY_INFO_SIZE);
559 static void bt_hci_inquiry_result_with_rssi(struct bt_hci_s *hci,
560 struct bt_device_s *slave)
562 inquiry_info_with_rssi params = {
563 .num_responses = 1,
564 .bdaddr = BAINIT(&slave->bd_addr),
565 .pscan_rep_mode = 0x00, /* R0 */
566 .pscan_period_mode = 0x00, /* P0 - deprecated */
567 .dev_class[0] = slave->class[0],
568 .dev_class[1] = slave->class[1],
569 .dev_class[2] = slave->class[2],
570 /* TODO: return the clkoff *differenece* */
571 .clock_offset = slave->clkoff, /* Note: no swapping */
572 .rssi = DEFAULT_RSSI_DBM,
575 bt_hci_event(hci, EVT_INQUIRY_RESULT_WITH_RSSI,
576 &params, INQUIRY_INFO_WITH_RSSI_SIZE);
579 static void bt_hci_inquiry_result(struct bt_hci_s *hci,
580 struct bt_device_s *slave)
582 if (!slave->inquiry_scan || !hci->lm.responses_left)
583 return;
585 hci->lm.responses_left --;
586 hci->lm.responses ++;
588 switch (hci->lm.inquiry_mode) {
589 case 0x00:
590 bt_hci_inquiry_result_standard(hci, slave);
591 return;
592 case 0x01:
593 bt_hci_inquiry_result_with_rssi(hci, slave);
594 return;
595 default:
596 fprintf(stderr, "%s: bad inquiry mode %02x\n", __FUNCTION__,
597 hci->lm.inquiry_mode);
598 exit(-1);
602 static void bt_hci_mod_timer_1280ms(QEMUTimer *timer, int period)
604 timer_mod(timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
605 (uint64_t)(period << 7) * 10000000);
608 static void bt_hci_inquiry_start(struct bt_hci_s *hci, int length)
610 struct bt_device_s *slave;
612 hci->lm.inquiry_length = length;
613 for (slave = hci->device.net->slave; slave; slave = slave->next)
614 /* Don't uncover ourselves. */
615 if (slave != &hci->device)
616 bt_hci_inquiry_result(hci, slave);
618 /* TODO: register for a callback on a new device's addition to the
619 * scatternet so that if it's added before inquiry_length expires,
620 * an Inquiry Result is generated immediately. Alternatively re-loop
621 * through the devices on the inquiry_length expiration and report
622 * devices not seen before. */
623 if (hci->lm.responses_left)
624 bt_hci_mod_timer_1280ms(hci->lm.inquiry_done, hci->lm.inquiry_length);
625 else
626 bt_hci_inquiry_done(hci);
628 if (hci->lm.periodic)
629 bt_hci_mod_timer_1280ms(hci->lm.inquiry_next, hci->lm.inquiry_period);
632 static void bt_hci_inquiry_next(void *opaque)
634 struct bt_hci_s *hci = (struct bt_hci_s *) opaque;
636 hci->lm.responses_left += hci->lm.responses;
637 hci->lm.responses = 0;
638 bt_hci_inquiry_start(hci, hci->lm.inquiry_length);
641 static inline int bt_hci_handle_bad(struct bt_hci_s *hci, uint16_t handle)
643 return !(handle & HCI_HANDLE_OFFSET) ||
644 handle >= (HCI_HANDLE_OFFSET | HCI_HANDLES_MAX) ||
645 !hci->lm.handle[handle & ~HCI_HANDLE_OFFSET].link;
648 static inline int bt_hci_role_master(struct bt_hci_s *hci, uint16_t handle)
650 return !!(hci->lm.role_bmp & (1 << (handle & ~HCI_HANDLE_OFFSET)));
653 static inline struct bt_device_s *bt_hci_remote_dev(struct bt_hci_s *hci,
654 uint16_t handle)
656 struct bt_link_s *link = hci->lm.handle[handle & ~HCI_HANDLE_OFFSET].link;
658 return bt_hci_role_master(hci, handle) ? link->slave : link->host;
661 static void bt_hci_mode_tick(void *opaque);
662 static void bt_hci_lmp_link_establish(struct bt_hci_s *hci,
663 struct bt_link_s *link, int master)
665 hci->lm.handle[hci->lm.last_handle].link = link;
667 if (master) {
668 /* We are the master side of an ACL link */
669 hci->lm.role_bmp |= 1 << hci->lm.last_handle;
671 hci->lm.handle[hci->lm.last_handle].lmp_acl_data =
672 link->slave->lmp_acl_data;
673 } else {
674 /* We are the slave side of an ACL link */
675 hci->lm.role_bmp &= ~(1 << hci->lm.last_handle);
677 hci->lm.handle[hci->lm.last_handle].lmp_acl_data =
678 link->host->lmp_acl_resp;
681 /* Mode */
682 if (master) {
683 link->acl_mode = acl_active;
684 hci->lm.handle[hci->lm.last_handle].acl_mode_timer =
685 timer_new_ns(QEMU_CLOCK_VIRTUAL, bt_hci_mode_tick, link);
689 static void bt_hci_lmp_link_teardown(struct bt_hci_s *hci, uint16_t handle)
691 handle &= ~HCI_HANDLE_OFFSET;
692 hci->lm.handle[handle].link = NULL;
694 if (bt_hci_role_master(hci, handle)) {
695 timer_del(hci->lm.handle[handle].acl_mode_timer);
696 timer_free(hci->lm.handle[handle].acl_mode_timer);
700 static int bt_hci_connect(struct bt_hci_s *hci, bdaddr_t *bdaddr)
702 struct bt_device_s *slave;
703 struct bt_link_s link;
705 for (slave = hci->device.net->slave; slave; slave = slave->next)
706 if (slave->page_scan && !bacmp(&slave->bd_addr, bdaddr))
707 break;
708 if (!slave || slave == &hci->device)
709 return -ENODEV;
711 bacpy(&hci->lm.awaiting_bdaddr[hci->lm.connecting ++], &slave->bd_addr);
713 link.slave = slave;
714 link.host = &hci->device;
715 link.slave->lmp_connection_request(&link); /* Always last */
717 return 0;
720 static void bt_hci_connection_reject(struct bt_hci_s *hci,
721 struct bt_device_s *host, uint8_t because)
723 struct bt_link_s link = {
724 .slave = &hci->device,
725 .host = host,
726 /* Rest uninitialised */
729 host->reject_reason = because;
730 host->lmp_connection_complete(&link);
733 static void bt_hci_connection_reject_event(struct bt_hci_s *hci,
734 bdaddr_t *bdaddr)
736 evt_conn_complete params;
738 params.status = HCI_NO_CONNECTION;
739 params.handle = 0;
740 bacpy(&params.bdaddr, bdaddr);
741 params.link_type = ACL_LINK;
742 params.encr_mode = 0x00; /* Encryption not required */
743 bt_hci_event(hci, EVT_CONN_COMPLETE, &params, EVT_CONN_COMPLETE_SIZE);
746 static void bt_hci_connection_accept(struct bt_hci_s *hci,
747 struct bt_device_s *host)
749 struct bt_hci_link_s *link = g_malloc0(sizeof(struct bt_hci_link_s));
750 evt_conn_complete params;
751 uint16_t handle;
752 uint8_t status = HCI_SUCCESS;
753 int tries = HCI_HANDLES_MAX;
755 /* Make a connection handle */
756 do {
757 while (hci->lm.handle[++ hci->lm.last_handle].link && -- tries)
758 hci->lm.last_handle &= HCI_HANDLES_MAX - 1;
759 handle = hci->lm.last_handle | HCI_HANDLE_OFFSET;
760 } while ((handle == hci->asb_handle || handle == hci->psb_handle) &&
761 tries);
763 if (!tries) {
764 g_free(link);
765 bt_hci_connection_reject(hci, host, HCI_REJECTED_LIMITED_RESOURCES);
766 status = HCI_NO_CONNECTION;
767 goto complete;
770 link->btlink.slave = &hci->device;
771 link->btlink.host = host;
772 link->handle = handle;
774 /* Link established */
775 bt_hci_lmp_link_establish(hci, &link->btlink, 0);
777 complete:
778 params.status = status;
779 params.handle = HNDL(handle);
780 bacpy(&params.bdaddr, &host->bd_addr);
781 params.link_type = ACL_LINK;
782 params.encr_mode = 0x00; /* Encryption not required */
783 bt_hci_event(hci, EVT_CONN_COMPLETE, &params, EVT_CONN_COMPLETE_SIZE);
785 /* Neets to be done at the very end because it can trigger a (nested)
786 * disconnected, in case the other and had cancelled the request
787 * locally. */
788 if (status == HCI_SUCCESS) {
789 host->reject_reason = 0;
790 host->lmp_connection_complete(&link->btlink);
794 static void bt_hci_lmp_connection_request(struct bt_link_s *link)
796 struct bt_hci_s *hci = hci_from_device(link->slave);
797 evt_conn_request params;
799 if (hci->conn_req_host) {
800 bt_hci_connection_reject(hci, link->host,
801 HCI_REJECTED_LIMITED_RESOURCES);
802 return;
804 hci->conn_req_host = link->host;
805 /* TODO: if masked and auto-accept, then auto-accept,
806 * if masked and not auto-accept, then auto-reject */
807 /* TODO: kick the hci->conn_accept_timer, timeout after
808 * hci->conn_accept_tout * 0.625 msec */
810 bacpy(&params.bdaddr, &link->host->bd_addr);
811 memcpy(&params.dev_class, &link->host->class, sizeof(params.dev_class));
812 params.link_type = ACL_LINK;
813 bt_hci_event(hci, EVT_CONN_REQUEST, &params, EVT_CONN_REQUEST_SIZE);
816 static void bt_hci_conn_accept_timeout(void *opaque)
818 struct bt_hci_s *hci = (struct bt_hci_s *) opaque;
820 if (!hci->conn_req_host)
821 /* Already accepted or rejected. If the other end cancelled the
822 * connection request then we still have to reject or accept it
823 * and then we'll get a disconnect. */
824 return;
826 /* TODO */
829 /* Remove from the list of devices which we wanted to connect to and
830 * are awaiting a response from. If the callback sees a response from
831 * a device which is not on the list it will assume it's a connection
832 * that's been cancelled by the host in the meantime and immediately
833 * try to detach the link and send a Connection Complete. */
834 static int bt_hci_lmp_connection_ready(struct bt_hci_s *hci,
835 bdaddr_t *bdaddr)
837 int i;
839 for (i = 0; i < hci->lm.connecting; i ++)
840 if (!bacmp(&hci->lm.awaiting_bdaddr[i], bdaddr)) {
841 if (i < -- hci->lm.connecting)
842 bacpy(&hci->lm.awaiting_bdaddr[i],
843 &hci->lm.awaiting_bdaddr[hci->lm.connecting]);
844 return 0;
847 return 1;
850 static void bt_hci_lmp_connection_complete(struct bt_link_s *link)
852 struct bt_hci_s *hci = hci_from_device(link->host);
853 evt_conn_complete params;
854 uint16_t handle;
855 uint8_t status = HCI_SUCCESS;
856 int tries = HCI_HANDLES_MAX;
858 if (bt_hci_lmp_connection_ready(hci, &link->slave->bd_addr)) {
859 if (!hci->device.reject_reason)
860 link->slave->lmp_disconnect_slave(link);
861 handle = 0;
862 status = HCI_NO_CONNECTION;
863 goto complete;
866 if (hci->device.reject_reason) {
867 handle = 0;
868 status = hci->device.reject_reason;
869 goto complete;
872 /* Make a connection handle */
873 do {
874 while (hci->lm.handle[++ hci->lm.last_handle].link && -- tries)
875 hci->lm.last_handle &= HCI_HANDLES_MAX - 1;
876 handle = hci->lm.last_handle | HCI_HANDLE_OFFSET;
877 } while ((handle == hci->asb_handle || handle == hci->psb_handle) &&
878 tries);
880 if (!tries) {
881 link->slave->lmp_disconnect_slave(link);
882 status = HCI_NO_CONNECTION;
883 goto complete;
886 /* Link established */
887 link->handle = handle;
888 bt_hci_lmp_link_establish(hci, link, 1);
890 complete:
891 params.status = status;
892 params.handle = HNDL(handle);
893 params.link_type = ACL_LINK;
894 bacpy(&params.bdaddr, &link->slave->bd_addr);
895 params.encr_mode = 0x00; /* Encryption not required */
896 bt_hci_event(hci, EVT_CONN_COMPLETE, &params, EVT_CONN_COMPLETE_SIZE);
899 static void bt_hci_disconnect(struct bt_hci_s *hci,
900 uint16_t handle, int reason)
902 struct bt_link_s *btlink =
903 hci->lm.handle[handle & ~HCI_HANDLE_OFFSET].link;
904 struct bt_hci_link_s *link;
905 evt_disconn_complete params;
907 if (bt_hci_role_master(hci, handle)) {
908 btlink->slave->reject_reason = reason;
909 btlink->slave->lmp_disconnect_slave(btlink);
910 /* The link pointer is invalid from now on */
912 goto complete;
915 btlink->host->reject_reason = reason;
916 btlink->host->lmp_disconnect_master(btlink);
918 /* We are the slave, we get to clean this burden */
919 link = (struct bt_hci_link_s *) btlink;
920 g_free(link);
922 complete:
923 bt_hci_lmp_link_teardown(hci, handle);
925 params.status = HCI_SUCCESS;
926 params.handle = HNDL(handle);
927 params.reason = HCI_CONNECTION_TERMINATED;
928 bt_hci_event(hci, EVT_DISCONN_COMPLETE,
929 &params, EVT_DISCONN_COMPLETE_SIZE);
932 /* TODO: use only one function */
933 static void bt_hci_lmp_disconnect_host(struct bt_link_s *link)
935 struct bt_hci_s *hci = hci_from_device(link->host);
936 uint16_t handle = link->handle;
937 evt_disconn_complete params;
939 bt_hci_lmp_link_teardown(hci, handle);
941 params.status = HCI_SUCCESS;
942 params.handle = HNDL(handle);
943 params.reason = hci->device.reject_reason;
944 bt_hci_event(hci, EVT_DISCONN_COMPLETE,
945 &params, EVT_DISCONN_COMPLETE_SIZE);
948 static void bt_hci_lmp_disconnect_slave(struct bt_link_s *btlink)
950 struct bt_hci_link_s *link = (struct bt_hci_link_s *) btlink;
951 struct bt_hci_s *hci = hci_from_device(btlink->slave);
952 uint16_t handle = link->handle;
953 evt_disconn_complete params;
955 g_free(link);
957 bt_hci_lmp_link_teardown(hci, handle);
959 params.status = HCI_SUCCESS;
960 params.handle = HNDL(handle);
961 params.reason = hci->device.reject_reason;
962 bt_hci_event(hci, EVT_DISCONN_COMPLETE,
963 &params, EVT_DISCONN_COMPLETE_SIZE);
966 static int bt_hci_name_req(struct bt_hci_s *hci, bdaddr_t *bdaddr)
968 struct bt_device_s *slave;
969 evt_remote_name_req_complete params;
971 for (slave = hci->device.net->slave; slave; slave = slave->next)
972 if (slave->page_scan && !bacmp(&slave->bd_addr, bdaddr))
973 break;
974 if (!slave)
975 return -ENODEV;
977 bt_hci_event_status(hci, HCI_SUCCESS);
979 params.status = HCI_SUCCESS;
980 bacpy(&params.bdaddr, &slave->bd_addr);
981 pstrcpy(params.name, sizeof(params.name), slave->lmp_name ?: "");
982 bt_hci_event(hci, EVT_REMOTE_NAME_REQ_COMPLETE,
983 &params, EVT_REMOTE_NAME_REQ_COMPLETE_SIZE);
985 return 0;
988 static int bt_hci_features_req(struct bt_hci_s *hci, uint16_t handle)
990 struct bt_device_s *slave;
991 evt_read_remote_features_complete params;
993 if (bt_hci_handle_bad(hci, handle))
994 return -ENODEV;
996 slave = bt_hci_remote_dev(hci, handle);
998 bt_hci_event_status(hci, HCI_SUCCESS);
1000 params.status = HCI_SUCCESS;
1001 params.handle = HNDL(handle);
1002 params.features[0] = (slave->lmp_caps >> 0) & 0xff;
1003 params.features[1] = (slave->lmp_caps >> 8) & 0xff;
1004 params.features[2] = (slave->lmp_caps >> 16) & 0xff;
1005 params.features[3] = (slave->lmp_caps >> 24) & 0xff;
1006 params.features[4] = (slave->lmp_caps >> 32) & 0xff;
1007 params.features[5] = (slave->lmp_caps >> 40) & 0xff;
1008 params.features[6] = (slave->lmp_caps >> 48) & 0xff;
1009 params.features[7] = (slave->lmp_caps >> 56) & 0xff;
1010 bt_hci_event(hci, EVT_READ_REMOTE_FEATURES_COMPLETE,
1011 &params, EVT_READ_REMOTE_FEATURES_COMPLETE_SIZE);
1013 return 0;
1016 static int bt_hci_version_req(struct bt_hci_s *hci, uint16_t handle)
1018 evt_read_remote_version_complete params;
1020 if (bt_hci_handle_bad(hci, handle))
1021 return -ENODEV;
1023 bt_hci_remote_dev(hci, handle);
1025 bt_hci_event_status(hci, HCI_SUCCESS);
1027 params.status = HCI_SUCCESS;
1028 params.handle = HNDL(handle);
1029 params.lmp_ver = 0x03;
1030 params.manufacturer = cpu_to_le16(0xa000);
1031 params.lmp_subver = cpu_to_le16(0xa607);
1032 bt_hci_event(hci, EVT_READ_REMOTE_VERSION_COMPLETE,
1033 &params, EVT_READ_REMOTE_VERSION_COMPLETE_SIZE);
1035 return 0;
1038 static int bt_hci_clkoffset_req(struct bt_hci_s *hci, uint16_t handle)
1040 struct bt_device_s *slave;
1041 evt_read_clock_offset_complete params;
1043 if (bt_hci_handle_bad(hci, handle))
1044 return -ENODEV;
1046 slave = bt_hci_remote_dev(hci, handle);
1048 bt_hci_event_status(hci, HCI_SUCCESS);
1050 params.status = HCI_SUCCESS;
1051 params.handle = HNDL(handle);
1052 /* TODO: return the clkoff *differenece* */
1053 params.clock_offset = slave->clkoff; /* Note: no swapping */
1054 bt_hci_event(hci, EVT_READ_CLOCK_OFFSET_COMPLETE,
1055 &params, EVT_READ_CLOCK_OFFSET_COMPLETE_SIZE);
1057 return 0;
1060 static void bt_hci_event_mode(struct bt_hci_s *hci, struct bt_link_s *link,
1061 uint16_t handle)
1063 evt_mode_change params = {
1064 .status = HCI_SUCCESS,
1065 .handle = HNDL(handle),
1066 .mode = link->acl_mode,
1067 .interval = cpu_to_le16(link->acl_interval),
1070 bt_hci_event(hci, EVT_MODE_CHANGE, &params, EVT_MODE_CHANGE_SIZE);
1073 static void bt_hci_lmp_mode_change_master(struct bt_hci_s *hci,
1074 struct bt_link_s *link, int mode, uint16_t interval)
1076 link->acl_mode = mode;
1077 link->acl_interval = interval;
1079 bt_hci_event_mode(hci, link, link->handle);
1081 link->slave->lmp_mode_change(link);
1084 static void bt_hci_lmp_mode_change_slave(struct bt_link_s *btlink)
1086 struct bt_hci_link_s *link = (struct bt_hci_link_s *) btlink;
1087 struct bt_hci_s *hci = hci_from_device(btlink->slave);
1089 bt_hci_event_mode(hci, btlink, link->handle);
1092 static int bt_hci_mode_change(struct bt_hci_s *hci, uint16_t handle,
1093 int interval, int mode)
1095 struct bt_hci_master_link_s *link;
1097 if (bt_hci_handle_bad(hci, handle) || !bt_hci_role_master(hci, handle))
1098 return -ENODEV;
1100 link = &hci->lm.handle[handle & ~HCI_HANDLE_OFFSET];
1101 if (link->link->acl_mode != acl_active) {
1102 bt_hci_event_status(hci, HCI_COMMAND_DISALLOWED);
1103 return 0;
1106 bt_hci_event_status(hci, HCI_SUCCESS);
1108 timer_mod(link->acl_mode_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
1109 ((uint64_t)interval * 625) * 1000);
1110 bt_hci_lmp_mode_change_master(hci, link->link, mode, interval);
1112 return 0;
1115 static int bt_hci_mode_cancel(struct bt_hci_s *hci, uint16_t handle, int mode)
1117 struct bt_hci_master_link_s *link;
1119 if (bt_hci_handle_bad(hci, handle) || !bt_hci_role_master(hci, handle))
1120 return -ENODEV;
1122 link = &hci->lm.handle[handle & ~HCI_HANDLE_OFFSET];
1123 if (link->link->acl_mode != mode) {
1124 bt_hci_event_status(hci, HCI_COMMAND_DISALLOWED);
1126 return 0;
1129 bt_hci_event_status(hci, HCI_SUCCESS);
1131 timer_del(link->acl_mode_timer);
1132 bt_hci_lmp_mode_change_master(hci, link->link, acl_active, 0);
1134 return 0;
1137 static void bt_hci_mode_tick(void *opaque)
1139 struct bt_link_s *link = opaque;
1140 struct bt_hci_s *hci = hci_from_device(link->host);
1142 bt_hci_lmp_mode_change_master(hci, link, acl_active, 0);
1145 static void bt_hci_reset(struct bt_hci_s *hci)
1147 hci->acl_len = 0;
1148 hci->last_cmd = 0;
1149 hci->lm.connecting = 0;
1151 hci->event_mask[0] = 0xff;
1152 hci->event_mask[1] = 0xff;
1153 hci->event_mask[2] = 0xff;
1154 hci->event_mask[3] = 0xff;
1155 hci->event_mask[4] = 0xff;
1156 hci->event_mask[5] = 0x1f;
1157 hci->event_mask[6] = 0x00;
1158 hci->event_mask[7] = 0x00;
1159 hci->device.inquiry_scan = 0;
1160 hci->device.page_scan = 0;
1161 g_free((void *) hci->device.lmp_name);
1162 hci->device.lmp_name = NULL;
1163 hci->device.class[0] = 0x00;
1164 hci->device.class[1] = 0x00;
1165 hci->device.class[2] = 0x00;
1166 hci->voice_setting = 0x0000;
1167 hci->conn_accept_tout = 0x1f40;
1168 hci->lm.inquiry_mode = 0x00;
1170 hci->psb_handle = 0x000;
1171 hci->asb_handle = 0x000;
1173 /* XXX: timer_del(sl->acl_mode_timer); for all links */
1174 timer_del(hci->lm.inquiry_done);
1175 timer_del(hci->lm.inquiry_next);
1176 timer_del(hci->conn_accept_timer);
1179 static void bt_hci_read_local_version_rp(struct bt_hci_s *hci)
1181 read_local_version_rp lv = {
1182 .status = HCI_SUCCESS,
1183 .hci_ver = 0x03,
1184 .hci_rev = cpu_to_le16(0xa607),
1185 .lmp_ver = 0x03,
1186 .manufacturer = cpu_to_le16(0xa000),
1187 .lmp_subver = cpu_to_le16(0xa607),
1190 bt_hci_event_complete(hci, &lv, READ_LOCAL_VERSION_RP_SIZE);
1193 static void bt_hci_read_local_commands_rp(struct bt_hci_s *hci)
1195 read_local_commands_rp lc = {
1196 .status = HCI_SUCCESS,
1197 .commands = {
1198 /* Keep updated! */
1199 /* Also, keep in sync with hci->device.lmp_caps in bt_new_hci */
1200 0xbf, 0x80, 0xf9, 0x03, 0xb2, 0xc0, 0x03, 0xc3,
1201 0x00, 0x0f, 0x80, 0x00, 0xc0, 0x00, 0xe8, 0x13,
1202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1211 bt_hci_event_complete(hci, &lc, READ_LOCAL_COMMANDS_RP_SIZE);
1214 static void bt_hci_read_local_features_rp(struct bt_hci_s *hci)
1216 read_local_features_rp lf = {
1217 .status = HCI_SUCCESS,
1218 .features = {
1219 (hci->device.lmp_caps >> 0) & 0xff,
1220 (hci->device.lmp_caps >> 8) & 0xff,
1221 (hci->device.lmp_caps >> 16) & 0xff,
1222 (hci->device.lmp_caps >> 24) & 0xff,
1223 (hci->device.lmp_caps >> 32) & 0xff,
1224 (hci->device.lmp_caps >> 40) & 0xff,
1225 (hci->device.lmp_caps >> 48) & 0xff,
1226 (hci->device.lmp_caps >> 56) & 0xff,
1230 bt_hci_event_complete(hci, &lf, READ_LOCAL_FEATURES_RP_SIZE);
1233 static void bt_hci_read_local_ext_features_rp(struct bt_hci_s *hci, int page)
1235 read_local_ext_features_rp lef = {
1236 .status = HCI_SUCCESS,
1237 .page_num = page,
1238 .max_page_num = 0x00,
1239 .features = {
1240 /* Keep updated! */
1241 0x5f, 0x35, 0x85, 0x7e, 0x9b, 0x19, 0x00, 0x80,
1244 if (page)
1245 memset(lef.features, 0, sizeof(lef.features));
1247 bt_hci_event_complete(hci, &lef, READ_LOCAL_EXT_FEATURES_RP_SIZE);
1250 static void bt_hci_read_buffer_size_rp(struct bt_hci_s *hci)
1252 read_buffer_size_rp bs = {
1253 /* This can be made configurable, for one standard USB dongle HCI
1254 * the four values are cpu_to_le16(0x0180), 0x40,
1255 * cpu_to_le16(0x0008), cpu_to_le16(0x0008). */
1256 .status = HCI_SUCCESS,
1257 .acl_mtu = cpu_to_le16(0x0200),
1258 .sco_mtu = 0,
1259 .acl_max_pkt = cpu_to_le16(0x0001),
1260 .sco_max_pkt = cpu_to_le16(0x0000),
1263 bt_hci_event_complete(hci, &bs, READ_BUFFER_SIZE_RP_SIZE);
1266 /* Deprecated in V2.0 (page 661) */
1267 static void bt_hci_read_country_code_rp(struct bt_hci_s *hci)
1269 read_country_code_rp cc ={
1270 .status = HCI_SUCCESS,
1271 .country_code = 0x00, /* North America & Europe^1 and Japan */
1274 bt_hci_event_complete(hci, &cc, READ_COUNTRY_CODE_RP_SIZE);
1276 /* ^1. Except France, sorry */
1279 static void bt_hci_read_bd_addr_rp(struct bt_hci_s *hci)
1281 read_bd_addr_rp ba = {
1282 .status = HCI_SUCCESS,
1283 .bdaddr = BAINIT(&hci->device.bd_addr),
1286 bt_hci_event_complete(hci, &ba, READ_BD_ADDR_RP_SIZE);
1289 static int bt_hci_link_quality_rp(struct bt_hci_s *hci, uint16_t handle)
1291 read_link_quality_rp lq = {
1292 .status = HCI_SUCCESS,
1293 .handle = HNDL(handle),
1294 .link_quality = 0xff,
1297 if (bt_hci_handle_bad(hci, handle))
1298 lq.status = HCI_NO_CONNECTION;
1300 bt_hci_event_complete(hci, &lq, READ_LINK_QUALITY_RP_SIZE);
1301 return 0;
1304 /* Generate a Command Complete event with only the Status parameter */
1305 static inline void bt_hci_event_complete_status(struct bt_hci_s *hci,
1306 uint8_t status)
1308 bt_hci_event_complete(hci, &status, 1);
1311 static inline void bt_hci_event_complete_conn_cancel(struct bt_hci_s *hci,
1312 uint8_t status, bdaddr_t *bd_addr)
1314 create_conn_cancel_rp params = {
1315 .status = status,
1316 .bdaddr = BAINIT(bd_addr),
1319 bt_hci_event_complete(hci, &params, CREATE_CONN_CANCEL_RP_SIZE);
1322 static inline void bt_hci_event_auth_complete(struct bt_hci_s *hci,
1323 uint16_t handle)
1325 evt_auth_complete params = {
1326 .status = HCI_SUCCESS,
1327 .handle = HNDL(handle),
1330 bt_hci_event(hci, EVT_AUTH_COMPLETE, &params, EVT_AUTH_COMPLETE_SIZE);
1333 static inline void bt_hci_event_encrypt_change(struct bt_hci_s *hci,
1334 uint16_t handle, uint8_t mode)
1336 evt_encrypt_change params = {
1337 .status = HCI_SUCCESS,
1338 .handle = HNDL(handle),
1339 .encrypt = mode,
1342 bt_hci_event(hci, EVT_ENCRYPT_CHANGE, &params, EVT_ENCRYPT_CHANGE_SIZE);
1345 static inline void bt_hci_event_complete_name_cancel(struct bt_hci_s *hci,
1346 bdaddr_t *bd_addr)
1348 remote_name_req_cancel_rp params = {
1349 .status = HCI_INVALID_PARAMETERS,
1350 .bdaddr = BAINIT(bd_addr),
1353 bt_hci_event_complete(hci, &params, REMOTE_NAME_REQ_CANCEL_RP_SIZE);
1356 static inline void bt_hci_event_read_remote_ext_features(struct bt_hci_s *hci,
1357 uint16_t handle)
1359 evt_read_remote_ext_features_complete params = {
1360 .status = HCI_UNSUPPORTED_FEATURE,
1361 .handle = HNDL(handle),
1362 /* Rest uninitialised */
1365 bt_hci_event(hci, EVT_READ_REMOTE_EXT_FEATURES_COMPLETE,
1366 &params, EVT_READ_REMOTE_EXT_FEATURES_COMPLETE_SIZE);
1369 static inline void bt_hci_event_complete_lmp_handle(struct bt_hci_s *hci,
1370 uint16_t handle)
1372 read_lmp_handle_rp params = {
1373 .status = HCI_NO_CONNECTION,
1374 .handle = HNDL(handle),
1375 .reserved = 0,
1376 /* Rest uninitialised */
1379 bt_hci_event_complete(hci, &params, READ_LMP_HANDLE_RP_SIZE);
1382 static inline void bt_hci_event_complete_role_discovery(struct bt_hci_s *hci,
1383 int status, uint16_t handle, int master)
1385 role_discovery_rp params = {
1386 .status = status,
1387 .handle = HNDL(handle),
1388 .role = master ? 0x00 : 0x01,
1391 bt_hci_event_complete(hci, &params, ROLE_DISCOVERY_RP_SIZE);
1394 static inline void bt_hci_event_complete_flush(struct bt_hci_s *hci,
1395 int status, uint16_t handle)
1397 flush_rp params = {
1398 .status = status,
1399 .handle = HNDL(handle),
1402 bt_hci_event_complete(hci, &params, FLUSH_RP_SIZE);
1405 static inline void bt_hci_event_complete_read_local_name(struct bt_hci_s *hci)
1407 read_local_name_rp params;
1408 params.status = HCI_SUCCESS;
1409 memset(params.name, 0, sizeof(params.name));
1410 if (hci->device.lmp_name)
1411 pstrcpy(params.name, sizeof(params.name), hci->device.lmp_name);
1413 bt_hci_event_complete(hci, &params, READ_LOCAL_NAME_RP_SIZE);
1416 static inline void bt_hci_event_complete_read_conn_accept_timeout(
1417 struct bt_hci_s *hci)
1419 read_conn_accept_timeout_rp params = {
1420 .status = HCI_SUCCESS,
1421 .timeout = cpu_to_le16(hci->conn_accept_tout),
1424 bt_hci_event_complete(hci, &params, READ_CONN_ACCEPT_TIMEOUT_RP_SIZE);
1427 static inline void bt_hci_event_complete_read_scan_enable(struct bt_hci_s *hci)
1429 read_scan_enable_rp params = {
1430 .status = HCI_SUCCESS,
1431 .enable =
1432 (hci->device.inquiry_scan ? SCAN_INQUIRY : 0) |
1433 (hci->device.page_scan ? SCAN_PAGE : 0),
1436 bt_hci_event_complete(hci, &params, READ_SCAN_ENABLE_RP_SIZE);
1439 static inline void bt_hci_event_complete_read_local_class(struct bt_hci_s *hci)
1441 read_class_of_dev_rp params;
1443 params.status = HCI_SUCCESS;
1444 memcpy(params.dev_class, hci->device.class, sizeof(params.dev_class));
1446 bt_hci_event_complete(hci, &params, READ_CLASS_OF_DEV_RP_SIZE);
1449 static inline void bt_hci_event_complete_voice_setting(struct bt_hci_s *hci)
1451 read_voice_setting_rp params = {
1452 .status = HCI_SUCCESS,
1453 .voice_setting = hci->voice_setting, /* Note: no swapping */
1456 bt_hci_event_complete(hci, &params, READ_VOICE_SETTING_RP_SIZE);
1459 static inline void bt_hci_event_complete_read_inquiry_mode(
1460 struct bt_hci_s *hci)
1462 read_inquiry_mode_rp params = {
1463 .status = HCI_SUCCESS,
1464 .mode = hci->lm.inquiry_mode,
1467 bt_hci_event_complete(hci, &params, READ_INQUIRY_MODE_RP_SIZE);
1470 static inline void bt_hci_event_num_comp_pkts(struct bt_hci_s *hci,
1471 uint16_t handle, int packets)
1473 uint16_t buf[EVT_NUM_COMP_PKTS_SIZE(1) / 2 + 1];
1474 evt_num_comp_pkts *params = (void *) ((uint8_t *) buf + 1);
1476 params->num_hndl = 1;
1477 params->connection->handle = HNDL(handle);
1478 params->connection->num_packets = cpu_to_le16(packets);
1480 bt_hci_event(hci, EVT_NUM_COMP_PKTS, params, EVT_NUM_COMP_PKTS_SIZE(1));
1483 static void bt_submit_hci(struct HCIInfo *info,
1484 const uint8_t *data, int length)
1486 struct bt_hci_s *hci = hci_from_info(info);
1487 uint16_t cmd;
1488 int paramlen, i;
1490 if (length < HCI_COMMAND_HDR_SIZE)
1491 goto short_hci;
1493 memcpy(&hci->last_cmd, data, 2);
1495 cmd = (data[1] << 8) | data[0];
1496 paramlen = data[2];
1497 if (cmd_opcode_ogf(cmd) == 0 || cmd_opcode_ocf(cmd) == 0) /* NOP */
1498 return;
1500 data += HCI_COMMAND_HDR_SIZE;
1501 length -= HCI_COMMAND_HDR_SIZE;
1503 if (paramlen > length)
1504 return;
1506 #define PARAM(cmd, param) (((cmd##_cp *) data)->param)
1507 #define PARAM16(cmd, param) le16_to_cpup(&PARAM(cmd, param))
1508 #define PARAMHANDLE(cmd) HNDL(PARAM(cmd, handle))
1509 #define LENGTH_CHECK(cmd) if (length < sizeof(cmd##_cp)) goto short_hci
1510 /* Note: the supported commands bitmask in bt_hci_read_local_commands_rp
1511 * needs to be updated every time a command is implemented here! */
1512 switch (cmd) {
1513 case cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY):
1514 LENGTH_CHECK(inquiry);
1516 if (PARAM(inquiry, length) < 1) {
1517 bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1518 break;
1521 hci->lm.inquire = 1;
1522 hci->lm.periodic = 0;
1523 hci->lm.responses_left = PARAM(inquiry, num_rsp) ?: INT_MAX;
1524 hci->lm.responses = 0;
1525 bt_hci_event_status(hci, HCI_SUCCESS);
1526 bt_hci_inquiry_start(hci, PARAM(inquiry, length));
1527 break;
1529 case cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY_CANCEL):
1530 if (!hci->lm.inquire || hci->lm.periodic) {
1531 fprintf(stderr, "%s: Inquiry Cancel should only be issued after "
1532 "the Inquiry command has been issued, a Command "
1533 "Status event has been received for the Inquiry "
1534 "command, and before the Inquiry Complete event "
1535 "occurs", __FUNCTION__);
1536 bt_hci_event_complete_status(hci, HCI_COMMAND_DISALLOWED);
1537 break;
1540 hci->lm.inquire = 0;
1541 timer_del(hci->lm.inquiry_done);
1542 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1543 break;
1545 case cmd_opcode_pack(OGF_LINK_CTL, OCF_PERIODIC_INQUIRY):
1546 LENGTH_CHECK(periodic_inquiry);
1548 if (!(PARAM(periodic_inquiry, length) <
1549 PARAM16(periodic_inquiry, min_period) &&
1550 PARAM16(periodic_inquiry, min_period) <
1551 PARAM16(periodic_inquiry, max_period)) ||
1552 PARAM(periodic_inquiry, length) < 1 ||
1553 PARAM16(periodic_inquiry, min_period) < 2 ||
1554 PARAM16(periodic_inquiry, max_period) < 3) {
1555 bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1556 break;
1559 hci->lm.inquire = 1;
1560 hci->lm.periodic = 1;
1561 hci->lm.responses_left = PARAM(periodic_inquiry, num_rsp);
1562 hci->lm.responses = 0;
1563 hci->lm.inquiry_period = PARAM16(periodic_inquiry, max_period);
1564 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1565 bt_hci_inquiry_start(hci, PARAM(periodic_inquiry, length));
1566 break;
1568 case cmd_opcode_pack(OGF_LINK_CTL, OCF_EXIT_PERIODIC_INQUIRY):
1569 if (!hci->lm.inquire || !hci->lm.periodic) {
1570 fprintf(stderr, "%s: Inquiry Cancel should only be issued after "
1571 "the Inquiry command has been issued, a Command "
1572 "Status event has been received for the Inquiry "
1573 "command, and before the Inquiry Complete event "
1574 "occurs", __FUNCTION__);
1575 bt_hci_event_complete_status(hci, HCI_COMMAND_DISALLOWED);
1576 break;
1578 hci->lm.inquire = 0;
1579 timer_del(hci->lm.inquiry_done);
1580 timer_del(hci->lm.inquiry_next);
1581 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1582 break;
1584 case cmd_opcode_pack(OGF_LINK_CTL, OCF_CREATE_CONN):
1585 LENGTH_CHECK(create_conn);
1587 if (hci->lm.connecting >= HCI_HANDLES_MAX) {
1588 bt_hci_event_status(hci, HCI_REJECTED_LIMITED_RESOURCES);
1589 break;
1591 bt_hci_event_status(hci, HCI_SUCCESS);
1593 if (bt_hci_connect(hci, &PARAM(create_conn, bdaddr)))
1594 bt_hci_connection_reject_event(hci, &PARAM(create_conn, bdaddr));
1595 break;
1597 case cmd_opcode_pack(OGF_LINK_CTL, OCF_DISCONNECT):
1598 LENGTH_CHECK(disconnect);
1600 if (bt_hci_handle_bad(hci, PARAMHANDLE(disconnect))) {
1601 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1602 break;
1605 bt_hci_event_status(hci, HCI_SUCCESS);
1606 bt_hci_disconnect(hci, PARAMHANDLE(disconnect),
1607 PARAM(disconnect, reason));
1608 break;
1610 case cmd_opcode_pack(OGF_LINK_CTL, OCF_CREATE_CONN_CANCEL):
1611 LENGTH_CHECK(create_conn_cancel);
1613 if (bt_hci_lmp_connection_ready(hci,
1614 &PARAM(create_conn_cancel, bdaddr))) {
1615 for (i = 0; i < HCI_HANDLES_MAX; i ++)
1616 if (bt_hci_role_master(hci, i) && hci->lm.handle[i].link &&
1617 !bacmp(&hci->lm.handle[i].link->slave->bd_addr,
1618 &PARAM(create_conn_cancel, bdaddr)))
1619 break;
1621 bt_hci_event_complete_conn_cancel(hci, i < HCI_HANDLES_MAX ?
1622 HCI_ACL_CONNECTION_EXISTS : HCI_NO_CONNECTION,
1623 &PARAM(create_conn_cancel, bdaddr));
1624 } else
1625 bt_hci_event_complete_conn_cancel(hci, HCI_SUCCESS,
1626 &PARAM(create_conn_cancel, bdaddr));
1627 break;
1629 case cmd_opcode_pack(OGF_LINK_CTL, OCF_ACCEPT_CONN_REQ):
1630 LENGTH_CHECK(accept_conn_req);
1632 if (!hci->conn_req_host ||
1633 bacmp(&PARAM(accept_conn_req, bdaddr),
1634 &hci->conn_req_host->bd_addr)) {
1635 bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1636 break;
1639 bt_hci_event_status(hci, HCI_SUCCESS);
1640 bt_hci_connection_accept(hci, hci->conn_req_host);
1641 hci->conn_req_host = NULL;
1642 break;
1644 case cmd_opcode_pack(OGF_LINK_CTL, OCF_REJECT_CONN_REQ):
1645 LENGTH_CHECK(reject_conn_req);
1647 if (!hci->conn_req_host ||
1648 bacmp(&PARAM(reject_conn_req, bdaddr),
1649 &hci->conn_req_host->bd_addr)) {
1650 bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1651 break;
1654 bt_hci_event_status(hci, HCI_SUCCESS);
1655 bt_hci_connection_reject(hci, hci->conn_req_host,
1656 PARAM(reject_conn_req, reason));
1657 bt_hci_connection_reject_event(hci, &hci->conn_req_host->bd_addr);
1658 hci->conn_req_host = NULL;
1659 break;
1661 case cmd_opcode_pack(OGF_LINK_CTL, OCF_AUTH_REQUESTED):
1662 LENGTH_CHECK(auth_requested);
1664 if (bt_hci_handle_bad(hci, PARAMHANDLE(auth_requested)))
1665 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1666 else {
1667 bt_hci_event_status(hci, HCI_SUCCESS);
1668 bt_hci_event_auth_complete(hci, PARAMHANDLE(auth_requested));
1670 break;
1672 case cmd_opcode_pack(OGF_LINK_CTL, OCF_SET_CONN_ENCRYPT):
1673 LENGTH_CHECK(set_conn_encrypt);
1675 if (bt_hci_handle_bad(hci, PARAMHANDLE(set_conn_encrypt)))
1676 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1677 else {
1678 bt_hci_event_status(hci, HCI_SUCCESS);
1679 bt_hci_event_encrypt_change(hci,
1680 PARAMHANDLE(set_conn_encrypt),
1681 PARAM(set_conn_encrypt, encrypt));
1683 break;
1685 case cmd_opcode_pack(OGF_LINK_CTL, OCF_REMOTE_NAME_REQ):
1686 LENGTH_CHECK(remote_name_req);
1688 if (bt_hci_name_req(hci, &PARAM(remote_name_req, bdaddr)))
1689 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1690 break;
1692 case cmd_opcode_pack(OGF_LINK_CTL, OCF_REMOTE_NAME_REQ_CANCEL):
1693 LENGTH_CHECK(remote_name_req_cancel);
1695 bt_hci_event_complete_name_cancel(hci,
1696 &PARAM(remote_name_req_cancel, bdaddr));
1697 break;
1699 case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_FEATURES):
1700 LENGTH_CHECK(read_remote_features);
1702 if (bt_hci_features_req(hci, PARAMHANDLE(read_remote_features)))
1703 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1704 break;
1706 case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_EXT_FEATURES):
1707 LENGTH_CHECK(read_remote_ext_features);
1709 if (bt_hci_handle_bad(hci, PARAMHANDLE(read_remote_ext_features)))
1710 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1711 else {
1712 bt_hci_event_status(hci, HCI_SUCCESS);
1713 bt_hci_event_read_remote_ext_features(hci,
1714 PARAMHANDLE(read_remote_ext_features));
1716 break;
1718 case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_VERSION):
1719 LENGTH_CHECK(read_remote_version);
1721 if (bt_hci_version_req(hci, PARAMHANDLE(read_remote_version)))
1722 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1723 break;
1725 case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_CLOCK_OFFSET):
1726 LENGTH_CHECK(read_clock_offset);
1728 if (bt_hci_clkoffset_req(hci, PARAMHANDLE(read_clock_offset)))
1729 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1730 break;
1732 case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_LMP_HANDLE):
1733 LENGTH_CHECK(read_lmp_handle);
1735 /* TODO: */
1736 bt_hci_event_complete_lmp_handle(hci, PARAMHANDLE(read_lmp_handle));
1737 break;
1739 case cmd_opcode_pack(OGF_LINK_POLICY, OCF_HOLD_MODE):
1740 LENGTH_CHECK(hold_mode);
1742 if (PARAM16(hold_mode, min_interval) >
1743 PARAM16(hold_mode, max_interval) ||
1744 PARAM16(hold_mode, min_interval) < 0x0002 ||
1745 PARAM16(hold_mode, max_interval) > 0xff00 ||
1746 (PARAM16(hold_mode, min_interval) & 1) ||
1747 (PARAM16(hold_mode, max_interval) & 1)) {
1748 bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1749 break;
1752 if (bt_hci_mode_change(hci, PARAMHANDLE(hold_mode),
1753 PARAM16(hold_mode, max_interval),
1754 acl_hold))
1755 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1756 break;
1758 case cmd_opcode_pack(OGF_LINK_POLICY, OCF_PARK_MODE):
1759 LENGTH_CHECK(park_mode);
1761 if (PARAM16(park_mode, min_interval) >
1762 PARAM16(park_mode, max_interval) ||
1763 PARAM16(park_mode, min_interval) < 0x000e ||
1764 (PARAM16(park_mode, min_interval) & 1) ||
1765 (PARAM16(park_mode, max_interval) & 1)) {
1766 bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1767 break;
1770 if (bt_hci_mode_change(hci, PARAMHANDLE(park_mode),
1771 PARAM16(park_mode, max_interval),
1772 acl_parked))
1773 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1774 break;
1776 case cmd_opcode_pack(OGF_LINK_POLICY, OCF_EXIT_PARK_MODE):
1777 LENGTH_CHECK(exit_park_mode);
1779 if (bt_hci_mode_cancel(hci, PARAMHANDLE(exit_park_mode),
1780 acl_parked))
1781 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1782 break;
1784 case cmd_opcode_pack(OGF_LINK_POLICY, OCF_ROLE_DISCOVERY):
1785 LENGTH_CHECK(role_discovery);
1787 if (bt_hci_handle_bad(hci, PARAMHANDLE(role_discovery)))
1788 bt_hci_event_complete_role_discovery(hci,
1789 HCI_NO_CONNECTION, PARAMHANDLE(role_discovery), 0);
1790 else
1791 bt_hci_event_complete_role_discovery(hci,
1792 HCI_SUCCESS, PARAMHANDLE(role_discovery),
1793 bt_hci_role_master(hci,
1794 PARAMHANDLE(role_discovery)));
1795 break;
1797 case cmd_opcode_pack(OGF_HOST_CTL, OCF_SET_EVENT_MASK):
1798 LENGTH_CHECK(set_event_mask);
1800 memcpy(hci->event_mask, PARAM(set_event_mask, mask), 8);
1801 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1802 break;
1804 case cmd_opcode_pack(OGF_HOST_CTL, OCF_RESET):
1805 bt_hci_reset(hci);
1806 bt_hci_event_status(hci, HCI_SUCCESS);
1807 break;
1809 case cmd_opcode_pack(OGF_HOST_CTL, OCF_SET_EVENT_FLT):
1810 if (length >= 1 && PARAM(set_event_flt, flt_type) == FLT_CLEAR_ALL)
1811 /* No length check */;
1812 else
1813 LENGTH_CHECK(set_event_flt);
1815 /* Filters are not implemented */
1816 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1817 break;
1819 case cmd_opcode_pack(OGF_HOST_CTL, OCF_FLUSH):
1820 LENGTH_CHECK(flush);
1822 if (bt_hci_handle_bad(hci, PARAMHANDLE(flush)))
1823 bt_hci_event_complete_flush(hci,
1824 HCI_NO_CONNECTION, PARAMHANDLE(flush));
1825 else {
1826 /* TODO: ordering? */
1827 bt_hci_event(hci, EVT_FLUSH_OCCURRED,
1828 &PARAM(flush, handle),
1829 EVT_FLUSH_OCCURRED_SIZE);
1830 bt_hci_event_complete_flush(hci,
1831 HCI_SUCCESS, PARAMHANDLE(flush));
1833 break;
1835 case cmd_opcode_pack(OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME):
1836 LENGTH_CHECK(change_local_name);
1838 g_free((void *) hci->device.lmp_name);
1839 hci->device.lmp_name = g_strndup(PARAM(change_local_name, name),
1840 sizeof(PARAM(change_local_name, name)));
1841 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1842 break;
1844 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_LOCAL_NAME):
1845 bt_hci_event_complete_read_local_name(hci);
1846 break;
1848 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_CONN_ACCEPT_TIMEOUT):
1849 bt_hci_event_complete_read_conn_accept_timeout(hci);
1850 break;
1852 case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_CONN_ACCEPT_TIMEOUT):
1853 /* TODO */
1854 LENGTH_CHECK(write_conn_accept_timeout);
1856 if (PARAM16(write_conn_accept_timeout, timeout) < 0x0001 ||
1857 PARAM16(write_conn_accept_timeout, timeout) > 0xb540) {
1858 bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1859 break;
1862 hci->conn_accept_tout = PARAM16(write_conn_accept_timeout, timeout);
1863 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1864 break;
1866 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_SCAN_ENABLE):
1867 bt_hci_event_complete_read_scan_enable(hci);
1868 break;
1870 case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE):
1871 LENGTH_CHECK(write_scan_enable);
1873 /* TODO: check that the remaining bits are all 0 */
1874 hci->device.inquiry_scan =
1875 !!(PARAM(write_scan_enable, scan_enable) & SCAN_INQUIRY);
1876 hci->device.page_scan =
1877 !!(PARAM(write_scan_enable, scan_enable) & SCAN_PAGE);
1878 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1879 break;
1881 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_CLASS_OF_DEV):
1882 bt_hci_event_complete_read_local_class(hci);
1883 break;
1885 case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_CLASS_OF_DEV):
1886 LENGTH_CHECK(write_class_of_dev);
1888 memcpy(hci->device.class, PARAM(write_class_of_dev, dev_class),
1889 sizeof(PARAM(write_class_of_dev, dev_class)));
1890 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1891 break;
1893 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_VOICE_SETTING):
1894 bt_hci_event_complete_voice_setting(hci);
1895 break;
1897 case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_VOICE_SETTING):
1898 LENGTH_CHECK(write_voice_setting);
1900 hci->voice_setting = PARAM(write_voice_setting, voice_setting);
1901 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1902 break;
1904 case cmd_opcode_pack(OGF_HOST_CTL, OCF_HOST_NUMBER_OF_COMPLETED_PACKETS):
1905 if (length < data[0] * 2 + 1)
1906 goto short_hci;
1908 for (i = 0; i < data[0]; i ++)
1909 if (bt_hci_handle_bad(hci,
1910 data[i * 2 + 1] | (data[i * 2 + 2] << 8)))
1911 bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1912 break;
1914 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_INQUIRY_MODE):
1915 /* Only if (local_features[3] & 0x40) && (local_commands[12] & 0x40)
1916 * else
1917 * goto unknown_command */
1918 bt_hci_event_complete_read_inquiry_mode(hci);
1919 break;
1921 case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_INQUIRY_MODE):
1922 /* Only if (local_features[3] & 0x40) && (local_commands[12] & 0x80)
1923 * else
1924 * goto unknown_command */
1925 LENGTH_CHECK(write_inquiry_mode);
1927 if (PARAM(write_inquiry_mode, mode) > 0x01) {
1928 bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1929 break;
1932 hci->lm.inquiry_mode = PARAM(write_inquiry_mode, mode);
1933 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1934 break;
1936 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION):
1937 bt_hci_read_local_version_rp(hci);
1938 break;
1940 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_COMMANDS):
1941 bt_hci_read_local_commands_rp(hci);
1942 break;
1944 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_FEATURES):
1945 bt_hci_read_local_features_rp(hci);
1946 break;
1948 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_EXT_FEATURES):
1949 LENGTH_CHECK(read_local_ext_features);
1951 bt_hci_read_local_ext_features_rp(hci,
1952 PARAM(read_local_ext_features, page_num));
1953 break;
1955 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_BUFFER_SIZE):
1956 bt_hci_read_buffer_size_rp(hci);
1957 break;
1959 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_COUNTRY_CODE):
1960 bt_hci_read_country_code_rp(hci);
1961 break;
1963 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_BD_ADDR):
1964 bt_hci_read_bd_addr_rp(hci);
1965 break;
1967 case cmd_opcode_pack(OGF_STATUS_PARAM, OCF_READ_LINK_QUALITY):
1968 LENGTH_CHECK(read_link_quality);
1970 bt_hci_link_quality_rp(hci, PARAMHANDLE(read_link_quality));
1971 break;
1973 default:
1974 bt_hci_event_status(hci, HCI_UNKNOWN_COMMAND);
1975 break;
1977 short_hci:
1978 fprintf(stderr, "%s: HCI packet too short (%iB)\n",
1979 __FUNCTION__, length);
1980 bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1981 break;
1985 /* We could perform fragmentation here, we can't do "recombination" because
1986 * at this layer the length of the payload is not know ahead, so we only
1987 * know that a packet contained the last fragment of the SDU when the next
1988 * SDU starts. */
1989 static inline void bt_hci_lmp_acl_data(struct bt_hci_s *hci, uint16_t handle,
1990 const uint8_t *data, int start, int len)
1992 struct hci_acl_hdr *pkt = (void *) hci->acl_buf;
1994 /* TODO: packet flags */
1995 /* TODO: avoid memcpy'ing */
1997 if (len + HCI_ACL_HDR_SIZE > sizeof(hci->acl_buf)) {
1998 fprintf(stderr, "%s: can't take ACL packets %i bytes long\n",
1999 __FUNCTION__, len);
2000 return;
2002 memcpy(hci->acl_buf + HCI_ACL_HDR_SIZE, data, len);
2004 pkt->handle = cpu_to_le16(
2005 acl_handle_pack(handle, start ? ACL_START : ACL_CONT));
2006 pkt->dlen = cpu_to_le16(len);
2007 hci->info.acl_recv(hci->info.opaque,
2008 hci->acl_buf, len + HCI_ACL_HDR_SIZE);
2011 static void bt_hci_lmp_acl_data_slave(struct bt_link_s *btlink,
2012 const uint8_t *data, int start, int len)
2014 struct bt_hci_link_s *link = (struct bt_hci_link_s *) btlink;
2016 bt_hci_lmp_acl_data(hci_from_device(btlink->slave),
2017 link->handle, data, start, len);
2020 static void bt_hci_lmp_acl_data_host(struct bt_link_s *link,
2021 const uint8_t *data, int start, int len)
2023 bt_hci_lmp_acl_data(hci_from_device(link->host),
2024 link->handle, data, start, len);
2027 static void bt_submit_acl(struct HCIInfo *info,
2028 const uint8_t *data, int length)
2030 struct bt_hci_s *hci = hci_from_info(info);
2031 uint16_t handle;
2032 int datalen, flags;
2033 struct bt_link_s *link;
2035 if (length < HCI_ACL_HDR_SIZE) {
2036 fprintf(stderr, "%s: ACL packet too short (%iB)\n",
2037 __FUNCTION__, length);
2038 return;
2041 handle = acl_handle((data[1] << 8) | data[0]);
2042 flags = acl_flags((data[1] << 8) | data[0]);
2043 datalen = (data[3] << 8) | data[2];
2044 data += HCI_ACL_HDR_SIZE;
2045 length -= HCI_ACL_HDR_SIZE;
2047 if (bt_hci_handle_bad(hci, handle)) {
2048 fprintf(stderr, "%s: invalid ACL handle %03x\n",
2049 __FUNCTION__, handle);
2050 /* TODO: signal an error */
2051 return;
2053 handle &= ~HCI_HANDLE_OFFSET;
2055 if (datalen > length) {
2056 fprintf(stderr, "%s: ACL packet too short (%iB < %iB)\n",
2057 __FUNCTION__, length, datalen);
2058 return;
2061 link = hci->lm.handle[handle].link;
2063 if ((flags & ~3) == ACL_ACTIVE_BCAST) {
2064 if (!hci->asb_handle)
2065 hci->asb_handle = handle;
2066 else if (handle != hci->asb_handle) {
2067 fprintf(stderr, "%s: Bad handle %03x in Active Slave Broadcast\n",
2068 __FUNCTION__, handle);
2069 /* TODO: signal an error */
2070 return;
2073 /* TODO */
2076 if ((flags & ~3) == ACL_PICO_BCAST) {
2077 if (!hci->psb_handle)
2078 hci->psb_handle = handle;
2079 else if (handle != hci->psb_handle) {
2080 fprintf(stderr, "%s: Bad handle %03x in Parked Slave Broadcast\n",
2081 __FUNCTION__, handle);
2082 /* TODO: signal an error */
2083 return;
2086 /* TODO */
2089 /* TODO: increase counter and send EVT_NUM_COMP_PKTS */
2090 bt_hci_event_num_comp_pkts(hci, handle | HCI_HANDLE_OFFSET, 1);
2092 /* Do this last as it can trigger further events even in this HCI */
2093 hci->lm.handle[handle].lmp_acl_data(link, data,
2094 (flags & 3) == ACL_START, length);
2097 static void bt_submit_sco(struct HCIInfo *info,
2098 const uint8_t *data, int length)
2100 struct bt_hci_s *hci = hci_from_info(info);
2101 uint16_t handle;
2102 int datalen;
2104 if (length < 3)
2105 return;
2107 handle = acl_handle((data[1] << 8) | data[0]);
2108 datalen = data[2];
2109 length -= 3;
2111 if (bt_hci_handle_bad(hci, handle)) {
2112 fprintf(stderr, "%s: invalid SCO handle %03x\n",
2113 __FUNCTION__, handle);
2114 return;
2117 if (datalen > length) {
2118 fprintf(stderr, "%s: SCO packet too short (%iB < %iB)\n",
2119 __FUNCTION__, length, datalen);
2120 return;
2123 /* TODO */
2125 /* TODO: increase counter and send EVT_NUM_COMP_PKTS if synchronous
2126 * Flow Control is enabled.
2127 * (See Read/Write_Synchronous_Flow_Control_Enable on page 513 and
2128 * page 514.) */
2131 static uint8_t *bt_hci_evt_packet(void *opaque)
2133 /* TODO: allocate a packet from upper layer */
2134 struct bt_hci_s *s = opaque;
2136 return s->evt_buf;
2139 static void bt_hci_evt_submit(void *opaque, int len)
2141 /* TODO: notify upper layer */
2142 struct bt_hci_s *s = opaque;
2144 s->info.evt_recv(s->info.opaque, s->evt_buf, len);
2147 static int bt_hci_bdaddr_set(struct HCIInfo *info, const uint8_t *bd_addr)
2149 struct bt_hci_s *hci = hci_from_info(info);
2151 bacpy(&hci->device.bd_addr, (const bdaddr_t *) bd_addr);
2152 return 0;
2155 static void bt_hci_done(struct HCIInfo *info);
2156 static void bt_hci_destroy(struct bt_device_s *dev)
2158 struct bt_hci_s *hci = hci_from_device(dev);
2160 bt_hci_done(&hci->info);
2163 struct HCIInfo *bt_new_hci(struct bt_scatternet_s *net)
2165 struct bt_hci_s *s = g_malloc0(sizeof(struct bt_hci_s));
2167 s->lm.inquiry_done = timer_new_ns(QEMU_CLOCK_VIRTUAL, bt_hci_inquiry_done, s);
2168 s->lm.inquiry_next = timer_new_ns(QEMU_CLOCK_VIRTUAL, bt_hci_inquiry_next, s);
2169 s->conn_accept_timer =
2170 timer_new_ns(QEMU_CLOCK_VIRTUAL, bt_hci_conn_accept_timeout, s);
2172 s->evt_packet = bt_hci_evt_packet;
2173 s->evt_submit = bt_hci_evt_submit;
2174 s->opaque = s;
2176 bt_device_init(&s->device, net);
2177 s->device.lmp_connection_request = bt_hci_lmp_connection_request;
2178 s->device.lmp_connection_complete = bt_hci_lmp_connection_complete;
2179 s->device.lmp_disconnect_master = bt_hci_lmp_disconnect_host;
2180 s->device.lmp_disconnect_slave = bt_hci_lmp_disconnect_slave;
2181 s->device.lmp_acl_data = bt_hci_lmp_acl_data_slave;
2182 s->device.lmp_acl_resp = bt_hci_lmp_acl_data_host;
2183 s->device.lmp_mode_change = bt_hci_lmp_mode_change_slave;
2185 /* Keep updated! */
2186 /* Also keep in sync with supported commands bitmask in
2187 * bt_hci_read_local_commands_rp */
2188 s->device.lmp_caps = 0x8000199b7e85355fll;
2190 bt_hci_reset(s);
2192 s->info.cmd_send = bt_submit_hci;
2193 s->info.sco_send = bt_submit_sco;
2194 s->info.acl_send = bt_submit_acl;
2195 s->info.bdaddr_set = bt_hci_bdaddr_set;
2197 s->device.handle_destroy = bt_hci_destroy;
2199 error_setg(&s->replay_blocker, QERR_REPLAY_NOT_SUPPORTED, "-bt hci");
2200 replay_add_blocker(s->replay_blocker);
2202 return &s->info;
2205 struct HCIInfo *hci_init(const char *str)
2207 char *endp;
2208 struct bt_scatternet_s *vlan = 0;
2210 if (!strcmp(str, "null"))
2211 /* null */
2212 return &null_hci;
2213 else if (!strncmp(str, "host", 4) && (str[4] == '\0' || str[4] == ':'))
2214 /* host[:hciN] */
2215 return bt_host_hci(str[4] ? str + 5 : "hci0");
2216 else if (!strncmp(str, "hci", 3)) {
2217 /* hci[,vlan=n] */
2218 if (str[3]) {
2219 if (!strncmp(str + 3, ",vlan=", 6)) {
2220 vlan = qemu_find_bt_vlan(strtol(str + 9, &endp, 0));
2221 if (*endp)
2222 vlan = 0;
2224 } else
2225 vlan = qemu_find_bt_vlan(0);
2226 if (vlan)
2227 return bt_new_hci(vlan);
2230 fprintf(stderr, "qemu: Unknown bluetooth HCI `%s'.\n", str);
2232 return 0;
2235 static void bt_hci_done(struct HCIInfo *info)
2237 struct bt_hci_s *hci = hci_from_info(info);
2238 int handle;
2240 bt_device_done(&hci->device);
2242 g_free((void *) hci->device.lmp_name);
2244 /* Be gentle and send DISCONNECT to all connected peers and those
2245 * currently waiting for us to accept or reject a connection request.
2246 * This frees the links. */
2247 if (hci->conn_req_host) {
2248 bt_hci_connection_reject(hci,
2249 hci->conn_req_host, HCI_OE_POWER_OFF);
2250 return;
2253 for (handle = HCI_HANDLE_OFFSET;
2254 handle < (HCI_HANDLE_OFFSET | HCI_HANDLES_MAX); handle ++)
2255 if (!bt_hci_handle_bad(hci, handle))
2256 bt_hci_disconnect(hci, handle, HCI_OE_POWER_OFF);
2258 /* TODO: this is not enough actually, there may be slaves from whom
2259 * we have requested a connection who will soon (or not) respond with
2260 * an accept or a reject, so we should also check if hci->lm.connecting
2261 * is non-zero and if so, avoid freeing the hci but otherwise disappear
2262 * from all qemu social life (e.g. stop scanning and request to be
2263 * removed from s->device.net) and arrange for
2264 * s->device.lmp_connection_complete to free the remaining bits once
2265 * hci->lm.awaiting_bdaddr[] is empty. */
2267 timer_free(hci->lm.inquiry_done);
2268 timer_free(hci->lm.inquiry_next);
2269 timer_free(hci->conn_accept_timer);
2271 g_free(hci);