]> git.proxmox.com Git - qemu.git/blob - hw/bt/hci.c
sysemu: avoid proliferation of include/ subdirectories
[qemu.git] / hw / bt / hci.c
1 /*
2 * QEMU Bluetooth HCI logic.
3 *
4 * Copyright (C) 2007 OpenMoko, Inc.
5 * Copyright (C) 2008 Andrzej Zaborowski <balrog@zabor.org>
6 *
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.
11 *
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.
16 *
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/>.
19 */
20
21 #include "qemu-common.h"
22 #include "qemu/timer.h"
23 #include "hw/usb.h"
24 #include "sysemu/bt.h"
25 #include "hw/bt.h"
26
27 struct bt_hci_s {
28 uint8_t *(*evt_packet)(void *opaque);
29 void (*evt_submit)(void *opaque, int len);
30 void *opaque;
31 uint8_t evt_buf[256];
32
33 uint8_t acl_buf[4096];
34 int acl_len;
35
36 uint16_t asb_handle;
37 uint16_t psb_handle;
38
39 int last_cmd; /* Note: Always little-endian */
40
41 struct bt_device_s *conn_req_host;
42
43 struct {
44 int inquire;
45 int periodic;
46 int responses_left;
47 int responses;
48 QEMUTimer *inquiry_done;
49 QEMUTimer *inquiry_next;
50 int inquiry_length;
51 int inquiry_period;
52 int inquiry_mode;
53
54 #define HCI_HANDLE_OFFSET 0x20
55 #define HCI_HANDLES_MAX 0x10
56 struct bt_hci_master_link_s {
57 struct bt_link_s *link;
58 void (*lmp_acl_data)(struct bt_link_s *link,
59 const uint8_t *data, int start, int len);
60 QEMUTimer *acl_mode_timer;
61 } handle[HCI_HANDLES_MAX];
62 uint32_t role_bmp;
63 int last_handle;
64 int connecting;
65 bdaddr_t awaiting_bdaddr[HCI_HANDLES_MAX];
66 } lm;
67
68 uint8_t event_mask[8];
69 uint16_t voice_setting; /* Notw: Always little-endian */
70 uint16_t conn_accept_tout;
71 QEMUTimer *conn_accept_timer;
72
73 struct HCIInfo info;
74 struct bt_device_s device;
75 };
76
77 #define DEFAULT_RSSI_DBM 20
78
79 #define hci_from_info(ptr) container_of((ptr), struct bt_hci_s, info)
80 #define hci_from_device(ptr) container_of((ptr), struct bt_hci_s, device)
81
82 struct bt_hci_link_s {
83 struct bt_link_s btlink;
84 uint16_t handle; /* Local */
85 };
86
87 /* LMP layer emulation */
88 #if 0
89 static void bt_submit_lmp(struct bt_device_s *bt, int length, uint8_t *data)
90 {
91 int resp, resplen, error, op, tr;
92 uint8_t respdata[17];
93
94 if (length < 1)
95 return;
96
97 tr = *data & 1;
98 op = *(data ++) >> 1;
99 resp = LMP_ACCEPTED;
100 resplen = 2;
101 respdata[1] = op;
102 error = 0;
103 length --;
104
105 if (op >= 0x7c) { /* Extended opcode */
106 op |= *(data ++) << 8;
107 resp = LMP_ACCEPTED_EXT;
108 resplen = 4;
109 respdata[0] = op >> 8;
110 respdata[1] = op & 0xff;
111 length --;
112 }
113
114 switch (op) {
115 case LMP_ACCEPTED:
116 /* data[0] Op code
117 */
118 if (length < 1) {
119 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
120 goto not_accepted;
121 }
122 resp = 0;
123 break;
124
125 case LMP_ACCEPTED_EXT:
126 /* data[0] Escape op code
127 * data[1] Extended op code
128 */
129 if (length < 2) {
130 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
131 goto not_accepted;
132 }
133 resp = 0;
134 break;
135
136 case LMP_NOT_ACCEPTED:
137 /* data[0] Op code
138 * data[1] Error code
139 */
140 if (length < 2) {
141 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
142 goto not_accepted;
143 }
144 resp = 0;
145 break;
146
147 case LMP_NOT_ACCEPTED_EXT:
148 /* data[0] Op code
149 * data[1] Extended op code
150 * data[2] Error code
151 */
152 if (length < 3) {
153 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
154 goto not_accepted;
155 }
156 resp = 0;
157 break;
158
159 case LMP_HOST_CONNECTION_REQ:
160 break;
161
162 case LMP_SETUP_COMPLETE:
163 resp = LMP_SETUP_COMPLETE;
164 resplen = 1;
165 bt->setup = 1;
166 break;
167
168 case LMP_DETACH:
169 /* data[0] Error code
170 */
171 if (length < 1) {
172 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
173 goto not_accepted;
174 }
175 bt->setup = 0;
176 resp = 0;
177 break;
178
179 case LMP_SUPERVISION_TIMEOUT:
180 /* data[0,1] Supervision timeout
181 */
182 if (length < 2) {
183 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
184 goto not_accepted;
185 }
186 resp = 0;
187 break;
188
189 case LMP_QUALITY_OF_SERVICE:
190 resp = 0;
191 /* Fall through */
192 case LMP_QOS_REQ:
193 /* data[0,1] Poll interval
194 * data[2] N(BC)
195 */
196 if (length < 3) {
197 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
198 goto not_accepted;
199 }
200 break;
201
202 case LMP_MAX_SLOT:
203 resp = 0;
204 /* Fall through */
205 case LMP_MAX_SLOT_REQ:
206 /* data[0] Max slots
207 */
208 if (length < 1) {
209 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
210 goto not_accepted;
211 }
212 break;
213
214 case LMP_AU_RAND:
215 case LMP_IN_RAND:
216 case LMP_COMB_KEY:
217 /* data[0-15] Random number
218 */
219 if (length < 16) {
220 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
221 goto not_accepted;
222 }
223 if (op == LMP_AU_RAND) {
224 if (bt->key_present) {
225 resp = LMP_SRES;
226 resplen = 5;
227 /* XXX: [Part H] Section 6.1 on page 801 */
228 } else {
229 error = HCI_PIN_OR_KEY_MISSING;
230 goto not_accepted;
231 }
232 } else if (op == LMP_IN_RAND) {
233 error = HCI_PAIRING_NOT_ALLOWED;
234 goto not_accepted;
235 } else {
236 /* XXX: [Part H] Section 3.2 on page 779 */
237 resp = LMP_UNIT_KEY;
238 resplen = 17;
239 memcpy(respdata + 1, bt->key, 16);
240
241 error = HCI_UNIT_LINK_KEY_USED;
242 goto not_accepted;
243 }
244 break;
245
246 case LMP_UNIT_KEY:
247 /* data[0-15] Key
248 */
249 if (length < 16) {
250 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
251 goto not_accepted;
252 }
253 memcpy(bt->key, data, 16);
254 bt->key_present = 1;
255 break;
256
257 case LMP_SRES:
258 /* data[0-3] Authentication response
259 */
260 if (length < 4) {
261 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
262 goto not_accepted;
263 }
264 break;
265
266 case LMP_CLKOFFSET_REQ:
267 resp = LMP_CLKOFFSET_RES;
268 resplen = 3;
269 respdata[1] = 0x33;
270 respdata[2] = 0x33;
271 break;
272
273 case LMP_CLKOFFSET_RES:
274 /* data[0,1] Clock offset
275 * (Slave to master only)
276 */
277 if (length < 2) {
278 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
279 goto not_accepted;
280 }
281 break;
282
283 case LMP_VERSION_REQ:
284 case LMP_VERSION_RES:
285 /* data[0] VersNr
286 * data[1,2] CompId
287 * data[3,4] SubVersNr
288 */
289 if (length < 5) {
290 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
291 goto not_accepted;
292 }
293 if (op == LMP_VERSION_REQ) {
294 resp = LMP_VERSION_RES;
295 resplen = 6;
296 respdata[1] = 0x20;
297 respdata[2] = 0xff;
298 respdata[3] = 0xff;
299 respdata[4] = 0xff;
300 respdata[5] = 0xff;
301 } else
302 resp = 0;
303 break;
304
305 case LMP_FEATURES_REQ:
306 case LMP_FEATURES_RES:
307 /* data[0-7] Features
308 */
309 if (length < 8) {
310 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
311 goto not_accepted;
312 }
313 if (op == LMP_FEATURES_REQ) {
314 resp = LMP_FEATURES_RES;
315 resplen = 9;
316 respdata[1] = (bt->lmp_caps >> 0) & 0xff;
317 respdata[2] = (bt->lmp_caps >> 8) & 0xff;
318 respdata[3] = (bt->lmp_caps >> 16) & 0xff;
319 respdata[4] = (bt->lmp_caps >> 24) & 0xff;
320 respdata[5] = (bt->lmp_caps >> 32) & 0xff;
321 respdata[6] = (bt->lmp_caps >> 40) & 0xff;
322 respdata[7] = (bt->lmp_caps >> 48) & 0xff;
323 respdata[8] = (bt->lmp_caps >> 56) & 0xff;
324 } else
325 resp = 0;
326 break;
327
328 case LMP_NAME_REQ:
329 /* data[0] Name offset
330 */
331 if (length < 1) {
332 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
333 goto not_accepted;
334 }
335 resp = LMP_NAME_RES;
336 resplen = 17;
337 respdata[1] = data[0];
338 respdata[2] = strlen(bt->lmp_name);
339 memset(respdata + 3, 0x00, 14);
340 if (respdata[2] > respdata[1])
341 memcpy(respdata + 3, bt->lmp_name + respdata[1],
342 respdata[2] - respdata[1]);
343 break;
344
345 case LMP_NAME_RES:
346 /* data[0] Name offset
347 * data[1] Name length
348 * data[2-15] Name fragment
349 */
350 if (length < 16) {
351 error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
352 goto not_accepted;
353 }
354 resp = 0;
355 break;
356
357 default:
358 error = HCI_UNKNOWN_LMP_PDU;
359 /* Fall through */
360 not_accepted:
361 if (op >> 8) {
362 resp = LMP_NOT_ACCEPTED_EXT;
363 resplen = 5;
364 respdata[0] = op >> 8;
365 respdata[1] = op & 0xff;
366 respdata[2] = error;
367 } else {
368 resp = LMP_NOT_ACCEPTED;
369 resplen = 3;
370 respdata[0] = op & 0xff;
371 respdata[1] = error;
372 }
373 }
374
375 if (resp == 0)
376 return;
377
378 if (resp >> 8) {
379 respdata[0] = resp >> 8;
380 respdata[1] = resp & 0xff;
381 } else
382 respdata[0] = resp & 0xff;
383
384 respdata[0] <<= 1;
385 respdata[0] |= tr;
386 }
387
388 static void bt_submit_raw_acl(struct bt_piconet_s *net, int length, uint8_t *data)
389 {
390 struct bt_device_s *slave;
391 if (length < 1)
392 return;
393
394 slave = 0;
395 #if 0
396 slave = net->slave;
397 #endif
398
399 switch (data[0] & 3) {
400 case LLID_ACLC:
401 bt_submit_lmp(slave, length - 1, data + 1);
402 break;
403 case LLID_ACLU_START:
404 #if 0
405 bt_sumbit_l2cap(slave, length - 1, data + 1, (data[0] >> 2) & 1);
406 breka;
407 #endif
408 default:
409 case LLID_ACLU_CONT:
410 break;
411 }
412 }
413 #endif
414
415 /* HCI layer emulation */
416
417 /* Note: we could ignore endiannes because unswapped handles will still
418 * be valid as connection identifiers for the guest - they don't have to
419 * be continuously allocated. We do it though, to preserve similar
420 * behaviour between hosts. Some things, like the BD_ADDR cannot be
421 * preserved though (for example if a real hci is used). */
422 #ifdef HOST_WORDS_BIGENDIAN
423 # define HNDL(raw) bswap16(raw)
424 #else
425 # define HNDL(raw) (raw)
426 #endif
427
428 static const uint8_t bt_event_reserved_mask[8] = {
429 0xff, 0x9f, 0xfb, 0xff, 0x07, 0x18, 0x00, 0x00,
430 };
431
432 static inline uint8_t *bt_hci_event_start(struct bt_hci_s *hci,
433 int evt, int len)
434 {
435 uint8_t *packet, mask;
436 int mask_byte;
437
438 if (len > 255) {
439 fprintf(stderr, "%s: HCI event params too long (%ib)\n",
440 __FUNCTION__, len);
441 exit(-1);
442 }
443
444 mask_byte = (evt - 1) >> 3;
445 mask = 1 << ((evt - 1) & 3);
446 if (mask & bt_event_reserved_mask[mask_byte] & ~hci->event_mask[mask_byte])
447 return NULL;
448
449 packet = hci->evt_packet(hci->opaque);
450 packet[0] = evt;
451 packet[1] = len;
452
453 return &packet[2];
454 }
455
456 static inline void bt_hci_event(struct bt_hci_s *hci, int evt,
457 void *params, int len)
458 {
459 uint8_t *packet = bt_hci_event_start(hci, evt, len);
460
461 if (!packet)
462 return;
463
464 if (len)
465 memcpy(packet, params, len);
466
467 hci->evt_submit(hci->opaque, len + 2);
468 }
469
470 static inline void bt_hci_event_status(struct bt_hci_s *hci, int status)
471 {
472 evt_cmd_status params = {
473 .status = status,
474 .ncmd = 1,
475 .opcode = hci->last_cmd,
476 };
477
478 bt_hci_event(hci, EVT_CMD_STATUS, &params, EVT_CMD_STATUS_SIZE);
479 }
480
481 static inline void bt_hci_event_complete(struct bt_hci_s *hci,
482 void *ret, int len)
483 {
484 uint8_t *packet = bt_hci_event_start(hci, EVT_CMD_COMPLETE,
485 len + EVT_CMD_COMPLETE_SIZE);
486 evt_cmd_complete *params = (evt_cmd_complete *) packet;
487
488 if (!packet)
489 return;
490
491 params->ncmd = 1;
492 params->opcode = hci->last_cmd;
493 if (len)
494 memcpy(&packet[EVT_CMD_COMPLETE_SIZE], ret, len);
495
496 hci->evt_submit(hci->opaque, len + EVT_CMD_COMPLETE_SIZE + 2);
497 }
498
499 static void bt_hci_inquiry_done(void *opaque)
500 {
501 struct bt_hci_s *hci = (struct bt_hci_s *) opaque;
502 uint8_t status = HCI_SUCCESS;
503
504 if (!hci->lm.periodic)
505 hci->lm.inquire = 0;
506
507 /* The specification is inconsistent about this one. Page 565 reads
508 * "The event parameters of Inquiry Complete event will have a summary
509 * of the result from the Inquiry process, which reports the number of
510 * nearby Bluetooth devices that responded [so hci->responses].", but
511 * Event Parameters (see page 729) has only Status. */
512 bt_hci_event(hci, EVT_INQUIRY_COMPLETE, &status, 1);
513 }
514
515 static void bt_hci_inquiry_result_standard(struct bt_hci_s *hci,
516 struct bt_device_s *slave)
517 {
518 inquiry_info params = {
519 .num_responses = 1,
520 .bdaddr = BAINIT(&slave->bd_addr),
521 .pscan_rep_mode = 0x00, /* R0 */
522 .pscan_period_mode = 0x00, /* P0 - deprecated */
523 .pscan_mode = 0x00, /* Standard scan - deprecated */
524 .dev_class[0] = slave->class[0],
525 .dev_class[1] = slave->class[1],
526 .dev_class[2] = slave->class[2],
527 /* TODO: return the clkoff *differenece* */
528 .clock_offset = slave->clkoff, /* Note: no swapping */
529 };
530
531 bt_hci_event(hci, EVT_INQUIRY_RESULT, &params, INQUIRY_INFO_SIZE);
532 }
533
534 static void bt_hci_inquiry_result_with_rssi(struct bt_hci_s *hci,
535 struct bt_device_s *slave)
536 {
537 inquiry_info_with_rssi params = {
538 .num_responses = 1,
539 .bdaddr = BAINIT(&slave->bd_addr),
540 .pscan_rep_mode = 0x00, /* R0 */
541 .pscan_period_mode = 0x00, /* P0 - deprecated */
542 .dev_class[0] = slave->class[0],
543 .dev_class[1] = slave->class[1],
544 .dev_class[2] = slave->class[2],
545 /* TODO: return the clkoff *differenece* */
546 .clock_offset = slave->clkoff, /* Note: no swapping */
547 .rssi = DEFAULT_RSSI_DBM,
548 };
549
550 bt_hci_event(hci, EVT_INQUIRY_RESULT_WITH_RSSI,
551 &params, INQUIRY_INFO_WITH_RSSI_SIZE);
552 }
553
554 static void bt_hci_inquiry_result(struct bt_hci_s *hci,
555 struct bt_device_s *slave)
556 {
557 if (!slave->inquiry_scan || !hci->lm.responses_left)
558 return;
559
560 hci->lm.responses_left --;
561 hci->lm.responses ++;
562
563 switch (hci->lm.inquiry_mode) {
564 case 0x00:
565 bt_hci_inquiry_result_standard(hci, slave);
566 return;
567 case 0x01:
568 bt_hci_inquiry_result_with_rssi(hci, slave);
569 return;
570 default:
571 fprintf(stderr, "%s: bad inquiry mode %02x\n", __FUNCTION__,
572 hci->lm.inquiry_mode);
573 exit(-1);
574 }
575 }
576
577 static void bt_hci_mod_timer_1280ms(QEMUTimer *timer, int period)
578 {
579 qemu_mod_timer(timer, qemu_get_clock_ns(vm_clock) +
580 muldiv64(period << 7, get_ticks_per_sec(), 100));
581 }
582
583 static void bt_hci_inquiry_start(struct bt_hci_s *hci, int length)
584 {
585 struct bt_device_s *slave;
586
587 hci->lm.inquiry_length = length;
588 for (slave = hci->device.net->slave; slave; slave = slave->next)
589 /* Don't uncover ourselves. */
590 if (slave != &hci->device)
591 bt_hci_inquiry_result(hci, slave);
592
593 /* TODO: register for a callback on a new device's addition to the
594 * scatternet so that if it's added before inquiry_length expires,
595 * an Inquiry Result is generated immediately. Alternatively re-loop
596 * through the devices on the inquiry_length expiration and report
597 * devices not seen before. */
598 if (hci->lm.responses_left)
599 bt_hci_mod_timer_1280ms(hci->lm.inquiry_done, hci->lm.inquiry_length);
600 else
601 bt_hci_inquiry_done(hci);
602
603 if (hci->lm.periodic)
604 bt_hci_mod_timer_1280ms(hci->lm.inquiry_next, hci->lm.inquiry_period);
605 }
606
607 static void bt_hci_inquiry_next(void *opaque)
608 {
609 struct bt_hci_s *hci = (struct bt_hci_s *) opaque;
610
611 hci->lm.responses_left += hci->lm.responses;
612 hci->lm.responses = 0;
613 bt_hci_inquiry_start(hci, hci->lm.inquiry_length);
614 }
615
616 static inline int bt_hci_handle_bad(struct bt_hci_s *hci, uint16_t handle)
617 {
618 return !(handle & HCI_HANDLE_OFFSET) ||
619 handle >= (HCI_HANDLE_OFFSET | HCI_HANDLES_MAX) ||
620 !hci->lm.handle[handle & ~HCI_HANDLE_OFFSET].link;
621 }
622
623 static inline int bt_hci_role_master(struct bt_hci_s *hci, uint16_t handle)
624 {
625 return !!(hci->lm.role_bmp & (1 << (handle & ~HCI_HANDLE_OFFSET)));
626 }
627
628 static inline struct bt_device_s *bt_hci_remote_dev(struct bt_hci_s *hci,
629 uint16_t handle)
630 {
631 struct bt_link_s *link = hci->lm.handle[handle & ~HCI_HANDLE_OFFSET].link;
632
633 return bt_hci_role_master(hci, handle) ? link->slave : link->host;
634 }
635
636 static void bt_hci_mode_tick(void *opaque);
637 static void bt_hci_lmp_link_establish(struct bt_hci_s *hci,
638 struct bt_link_s *link, int master)
639 {
640 hci->lm.handle[hci->lm.last_handle].link = link;
641
642 if (master) {
643 /* We are the master side of an ACL link */
644 hci->lm.role_bmp |= 1 << hci->lm.last_handle;
645
646 hci->lm.handle[hci->lm.last_handle].lmp_acl_data =
647 link->slave->lmp_acl_data;
648 } else {
649 /* We are the slave side of an ACL link */
650 hci->lm.role_bmp &= ~(1 << hci->lm.last_handle);
651
652 hci->lm.handle[hci->lm.last_handle].lmp_acl_data =
653 link->host->lmp_acl_resp;
654 }
655
656 /* Mode */
657 if (master) {
658 link->acl_mode = acl_active;
659 hci->lm.handle[hci->lm.last_handle].acl_mode_timer =
660 qemu_new_timer_ns(vm_clock, bt_hci_mode_tick, link);
661 }
662 }
663
664 static void bt_hci_lmp_link_teardown(struct bt_hci_s *hci, uint16_t handle)
665 {
666 handle &= ~HCI_HANDLE_OFFSET;
667 hci->lm.handle[handle].link = NULL;
668
669 if (bt_hci_role_master(hci, handle)) {
670 qemu_del_timer(hci->lm.handle[handle].acl_mode_timer);
671 qemu_free_timer(hci->lm.handle[handle].acl_mode_timer);
672 }
673 }
674
675 static int bt_hci_connect(struct bt_hci_s *hci, bdaddr_t *bdaddr)
676 {
677 struct bt_device_s *slave;
678 struct bt_link_s link;
679
680 for (slave = hci->device.net->slave; slave; slave = slave->next)
681 if (slave->page_scan && !bacmp(&slave->bd_addr, bdaddr))
682 break;
683 if (!slave || slave == &hci->device)
684 return -ENODEV;
685
686 bacpy(&hci->lm.awaiting_bdaddr[hci->lm.connecting ++], &slave->bd_addr);
687
688 link.slave = slave;
689 link.host = &hci->device;
690 link.slave->lmp_connection_request(&link); /* Always last */
691
692 return 0;
693 }
694
695 static void bt_hci_connection_reject(struct bt_hci_s *hci,
696 struct bt_device_s *host, uint8_t because)
697 {
698 struct bt_link_s link = {
699 .slave = &hci->device,
700 .host = host,
701 /* Rest uninitialised */
702 };
703
704 host->reject_reason = because;
705 host->lmp_connection_complete(&link);
706 }
707
708 static void bt_hci_connection_reject_event(struct bt_hci_s *hci,
709 bdaddr_t *bdaddr)
710 {
711 evt_conn_complete params;
712
713 params.status = HCI_NO_CONNECTION;
714 params.handle = 0;
715 bacpy(&params.bdaddr, bdaddr);
716 params.link_type = ACL_LINK;
717 params.encr_mode = 0x00; /* Encryption not required */
718 bt_hci_event(hci, EVT_CONN_COMPLETE, &params, EVT_CONN_COMPLETE_SIZE);
719 }
720
721 static void bt_hci_connection_accept(struct bt_hci_s *hci,
722 struct bt_device_s *host)
723 {
724 struct bt_hci_link_s *link = g_malloc0(sizeof(struct bt_hci_link_s));
725 evt_conn_complete params;
726 uint16_t handle;
727 uint8_t status = HCI_SUCCESS;
728 int tries = HCI_HANDLES_MAX;
729
730 /* Make a connection handle */
731 do {
732 while (hci->lm.handle[++ hci->lm.last_handle].link && -- tries)
733 hci->lm.last_handle &= HCI_HANDLES_MAX - 1;
734 handle = hci->lm.last_handle | HCI_HANDLE_OFFSET;
735 } while ((handle == hci->asb_handle || handle == hci->psb_handle) &&
736 tries);
737
738 if (!tries) {
739 g_free(link);
740 bt_hci_connection_reject(hci, host, HCI_REJECTED_LIMITED_RESOURCES);
741 status = HCI_NO_CONNECTION;
742 goto complete;
743 }
744
745 link->btlink.slave = &hci->device;
746 link->btlink.host = host;
747 link->handle = handle;
748
749 /* Link established */
750 bt_hci_lmp_link_establish(hci, &link->btlink, 0);
751
752 complete:
753 params.status = status;
754 params.handle = HNDL(handle);
755 bacpy(&params.bdaddr, &host->bd_addr);
756 params.link_type = ACL_LINK;
757 params.encr_mode = 0x00; /* Encryption not required */
758 bt_hci_event(hci, EVT_CONN_COMPLETE, &params, EVT_CONN_COMPLETE_SIZE);
759
760 /* Neets to be done at the very end because it can trigger a (nested)
761 * disconnected, in case the other and had cancelled the request
762 * locally. */
763 if (status == HCI_SUCCESS) {
764 host->reject_reason = 0;
765 host->lmp_connection_complete(&link->btlink);
766 }
767 }
768
769 static void bt_hci_lmp_connection_request(struct bt_link_s *link)
770 {
771 struct bt_hci_s *hci = hci_from_device(link->slave);
772 evt_conn_request params;
773
774 if (hci->conn_req_host) {
775 bt_hci_connection_reject(hci, link->host,
776 HCI_REJECTED_LIMITED_RESOURCES);
777 return;
778 }
779 hci->conn_req_host = link->host;
780 /* TODO: if masked and auto-accept, then auto-accept,
781 * if masked and not auto-accept, then auto-reject */
782 /* TODO: kick the hci->conn_accept_timer, timeout after
783 * hci->conn_accept_tout * 0.625 msec */
784
785 bacpy(&params.bdaddr, &link->host->bd_addr);
786 memcpy(&params.dev_class, &link->host->class, sizeof(params.dev_class));
787 params.link_type = ACL_LINK;
788 bt_hci_event(hci, EVT_CONN_REQUEST, &params, EVT_CONN_REQUEST_SIZE);
789 }
790
791 static void bt_hci_conn_accept_timeout(void *opaque)
792 {
793 struct bt_hci_s *hci = (struct bt_hci_s *) opaque;
794
795 if (!hci->conn_req_host)
796 /* Already accepted or rejected. If the other end cancelled the
797 * connection request then we still have to reject or accept it
798 * and then we'll get a disconnect. */
799 return;
800
801 /* TODO */
802 }
803
804 /* Remove from the list of devices which we wanted to connect to and
805 * are awaiting a response from. If the callback sees a response from
806 * a device which is not on the list it will assume it's a connection
807 * that's been cancelled by the host in the meantime and immediately
808 * try to detach the link and send a Connection Complete. */
809 static int bt_hci_lmp_connection_ready(struct bt_hci_s *hci,
810 bdaddr_t *bdaddr)
811 {
812 int i;
813
814 for (i = 0; i < hci->lm.connecting; i ++)
815 if (!bacmp(&hci->lm.awaiting_bdaddr[i], bdaddr)) {
816 if (i < -- hci->lm.connecting)
817 bacpy(&hci->lm.awaiting_bdaddr[i],
818 &hci->lm.awaiting_bdaddr[hci->lm.connecting]);
819 return 0;
820 }
821
822 return 1;
823 }
824
825 static void bt_hci_lmp_connection_complete(struct bt_link_s *link)
826 {
827 struct bt_hci_s *hci = hci_from_device(link->host);
828 evt_conn_complete params;
829 uint16_t handle;
830 uint8_t status = HCI_SUCCESS;
831 int tries = HCI_HANDLES_MAX;
832
833 if (bt_hci_lmp_connection_ready(hci, &link->slave->bd_addr)) {
834 if (!hci->device.reject_reason)
835 link->slave->lmp_disconnect_slave(link);
836 handle = 0;
837 status = HCI_NO_CONNECTION;
838 goto complete;
839 }
840
841 if (hci->device.reject_reason) {
842 handle = 0;
843 status = hci->device.reject_reason;
844 goto complete;
845 }
846
847 /* Make a connection handle */
848 do {
849 while (hci->lm.handle[++ hci->lm.last_handle].link && -- tries)
850 hci->lm.last_handle &= HCI_HANDLES_MAX - 1;
851 handle = hci->lm.last_handle | HCI_HANDLE_OFFSET;
852 } while ((handle == hci->asb_handle || handle == hci->psb_handle) &&
853 tries);
854
855 if (!tries) {
856 link->slave->lmp_disconnect_slave(link);
857 status = HCI_NO_CONNECTION;
858 goto complete;
859 }
860
861 /* Link established */
862 link->handle = handle;
863 bt_hci_lmp_link_establish(hci, link, 1);
864
865 complete:
866 params.status = status;
867 params.handle = HNDL(handle);
868 params.link_type = ACL_LINK;
869 bacpy(&params.bdaddr, &link->slave->bd_addr);
870 params.encr_mode = 0x00; /* Encryption not required */
871 bt_hci_event(hci, EVT_CONN_COMPLETE, &params, EVT_CONN_COMPLETE_SIZE);
872 }
873
874 static void bt_hci_disconnect(struct bt_hci_s *hci,
875 uint16_t handle, int reason)
876 {
877 struct bt_link_s *btlink =
878 hci->lm.handle[handle & ~HCI_HANDLE_OFFSET].link;
879 struct bt_hci_link_s *link;
880 evt_disconn_complete params;
881
882 if (bt_hci_role_master(hci, handle)) {
883 btlink->slave->reject_reason = reason;
884 btlink->slave->lmp_disconnect_slave(btlink);
885 /* The link pointer is invalid from now on */
886
887 goto complete;
888 }
889
890 btlink->host->reject_reason = reason;
891 btlink->host->lmp_disconnect_master(btlink);
892
893 /* We are the slave, we get to clean this burden */
894 link = (struct bt_hci_link_s *) btlink;
895 g_free(link);
896
897 complete:
898 bt_hci_lmp_link_teardown(hci, handle);
899
900 params.status = HCI_SUCCESS;
901 params.handle = HNDL(handle);
902 params.reason = HCI_CONNECTION_TERMINATED;
903 bt_hci_event(hci, EVT_DISCONN_COMPLETE,
904 &params, EVT_DISCONN_COMPLETE_SIZE);
905 }
906
907 /* TODO: use only one function */
908 static void bt_hci_lmp_disconnect_host(struct bt_link_s *link)
909 {
910 struct bt_hci_s *hci = hci_from_device(link->host);
911 uint16_t handle = link->handle;
912 evt_disconn_complete params;
913
914 bt_hci_lmp_link_teardown(hci, handle);
915
916 params.status = HCI_SUCCESS;
917 params.handle = HNDL(handle);
918 params.reason = hci->device.reject_reason;
919 bt_hci_event(hci, EVT_DISCONN_COMPLETE,
920 &params, EVT_DISCONN_COMPLETE_SIZE);
921 }
922
923 static void bt_hci_lmp_disconnect_slave(struct bt_link_s *btlink)
924 {
925 struct bt_hci_link_s *link = (struct bt_hci_link_s *) btlink;
926 struct bt_hci_s *hci = hci_from_device(btlink->slave);
927 uint16_t handle = link->handle;
928 evt_disconn_complete params;
929
930 g_free(link);
931
932 bt_hci_lmp_link_teardown(hci, handle);
933
934 params.status = HCI_SUCCESS;
935 params.handle = HNDL(handle);
936 params.reason = hci->device.reject_reason;
937 bt_hci_event(hci, EVT_DISCONN_COMPLETE,
938 &params, EVT_DISCONN_COMPLETE_SIZE);
939 }
940
941 static int bt_hci_name_req(struct bt_hci_s *hci, bdaddr_t *bdaddr)
942 {
943 struct bt_device_s *slave;
944 evt_remote_name_req_complete params;
945
946 for (slave = hci->device.net->slave; slave; slave = slave->next)
947 if (slave->page_scan && !bacmp(&slave->bd_addr, bdaddr))
948 break;
949 if (!slave)
950 return -ENODEV;
951
952 bt_hci_event_status(hci, HCI_SUCCESS);
953
954 params.status = HCI_SUCCESS;
955 bacpy(&params.bdaddr, &slave->bd_addr);
956 pstrcpy(params.name, sizeof(params.name), slave->lmp_name ?: "");
957 bt_hci_event(hci, EVT_REMOTE_NAME_REQ_COMPLETE,
958 &params, EVT_REMOTE_NAME_REQ_COMPLETE_SIZE);
959
960 return 0;
961 }
962
963 static int bt_hci_features_req(struct bt_hci_s *hci, uint16_t handle)
964 {
965 struct bt_device_s *slave;
966 evt_read_remote_features_complete params;
967
968 if (bt_hci_handle_bad(hci, handle))
969 return -ENODEV;
970
971 slave = bt_hci_remote_dev(hci, handle);
972
973 bt_hci_event_status(hci, HCI_SUCCESS);
974
975 params.status = HCI_SUCCESS;
976 params.handle = HNDL(handle);
977 params.features[0] = (slave->lmp_caps >> 0) & 0xff;
978 params.features[1] = (slave->lmp_caps >> 8) & 0xff;
979 params.features[2] = (slave->lmp_caps >> 16) & 0xff;
980 params.features[3] = (slave->lmp_caps >> 24) & 0xff;
981 params.features[4] = (slave->lmp_caps >> 32) & 0xff;
982 params.features[5] = (slave->lmp_caps >> 40) & 0xff;
983 params.features[6] = (slave->lmp_caps >> 48) & 0xff;
984 params.features[7] = (slave->lmp_caps >> 56) & 0xff;
985 bt_hci_event(hci, EVT_READ_REMOTE_FEATURES_COMPLETE,
986 &params, EVT_READ_REMOTE_FEATURES_COMPLETE_SIZE);
987
988 return 0;
989 }
990
991 static int bt_hci_version_req(struct bt_hci_s *hci, uint16_t handle)
992 {
993 evt_read_remote_version_complete params;
994
995 if (bt_hci_handle_bad(hci, handle))
996 return -ENODEV;
997
998 bt_hci_remote_dev(hci, handle);
999
1000 bt_hci_event_status(hci, HCI_SUCCESS);
1001
1002 params.status = HCI_SUCCESS;
1003 params.handle = HNDL(handle);
1004 params.lmp_ver = 0x03;
1005 params.manufacturer = cpu_to_le16(0xa000);
1006 params.lmp_subver = cpu_to_le16(0xa607);
1007 bt_hci_event(hci, EVT_READ_REMOTE_VERSION_COMPLETE,
1008 &params, EVT_READ_REMOTE_VERSION_COMPLETE_SIZE);
1009
1010 return 0;
1011 }
1012
1013 static int bt_hci_clkoffset_req(struct bt_hci_s *hci, uint16_t handle)
1014 {
1015 struct bt_device_s *slave;
1016 evt_read_clock_offset_complete params;
1017
1018 if (bt_hci_handle_bad(hci, handle))
1019 return -ENODEV;
1020
1021 slave = bt_hci_remote_dev(hci, handle);
1022
1023 bt_hci_event_status(hci, HCI_SUCCESS);
1024
1025 params.status = HCI_SUCCESS;
1026 params.handle = HNDL(handle);
1027 /* TODO: return the clkoff *differenece* */
1028 params.clock_offset = slave->clkoff; /* Note: no swapping */
1029 bt_hci_event(hci, EVT_READ_CLOCK_OFFSET_COMPLETE,
1030 &params, EVT_READ_CLOCK_OFFSET_COMPLETE_SIZE);
1031
1032 return 0;
1033 }
1034
1035 static void bt_hci_event_mode(struct bt_hci_s *hci, struct bt_link_s *link,
1036 uint16_t handle)
1037 {
1038 evt_mode_change params = {
1039 .status = HCI_SUCCESS,
1040 .handle = HNDL(handle),
1041 .mode = link->acl_mode,
1042 .interval = cpu_to_le16(link->acl_interval),
1043 };
1044
1045 bt_hci_event(hci, EVT_MODE_CHANGE, &params, EVT_MODE_CHANGE_SIZE);
1046 }
1047
1048 static void bt_hci_lmp_mode_change_master(struct bt_hci_s *hci,
1049 struct bt_link_s *link, int mode, uint16_t interval)
1050 {
1051 link->acl_mode = mode;
1052 link->acl_interval = interval;
1053
1054 bt_hci_event_mode(hci, link, link->handle);
1055
1056 link->slave->lmp_mode_change(link);
1057 }
1058
1059 static void bt_hci_lmp_mode_change_slave(struct bt_link_s *btlink)
1060 {
1061 struct bt_hci_link_s *link = (struct bt_hci_link_s *) btlink;
1062 struct bt_hci_s *hci = hci_from_device(btlink->slave);
1063
1064 bt_hci_event_mode(hci, btlink, link->handle);
1065 }
1066
1067 static int bt_hci_mode_change(struct bt_hci_s *hci, uint16_t handle,
1068 int interval, int mode)
1069 {
1070 struct bt_hci_master_link_s *link;
1071
1072 if (bt_hci_handle_bad(hci, handle) || !bt_hci_role_master(hci, handle))
1073 return -ENODEV;
1074
1075 link = &hci->lm.handle[handle & ~HCI_HANDLE_OFFSET];
1076 if (link->link->acl_mode != acl_active) {
1077 bt_hci_event_status(hci, HCI_COMMAND_DISALLOWED);
1078 return 0;
1079 }
1080
1081 bt_hci_event_status(hci, HCI_SUCCESS);
1082
1083 qemu_mod_timer(link->acl_mode_timer, qemu_get_clock_ns(vm_clock) +
1084 muldiv64(interval * 625, get_ticks_per_sec(), 1000000));
1085 bt_hci_lmp_mode_change_master(hci, link->link, mode, interval);
1086
1087 return 0;
1088 }
1089
1090 static int bt_hci_mode_cancel(struct bt_hci_s *hci, uint16_t handle, int mode)
1091 {
1092 struct bt_hci_master_link_s *link;
1093
1094 if (bt_hci_handle_bad(hci, handle) || !bt_hci_role_master(hci, handle))
1095 return -ENODEV;
1096
1097 link = &hci->lm.handle[handle & ~HCI_HANDLE_OFFSET];
1098 if (link->link->acl_mode != mode) {
1099 bt_hci_event_status(hci, HCI_COMMAND_DISALLOWED);
1100
1101 return 0;
1102 }
1103
1104 bt_hci_event_status(hci, HCI_SUCCESS);
1105
1106 qemu_del_timer(link->acl_mode_timer);
1107 bt_hci_lmp_mode_change_master(hci, link->link, acl_active, 0);
1108
1109 return 0;
1110 }
1111
1112 static void bt_hci_mode_tick(void *opaque)
1113 {
1114 struct bt_link_s *link = opaque;
1115 struct bt_hci_s *hci = hci_from_device(link->host);
1116
1117 bt_hci_lmp_mode_change_master(hci, link, acl_active, 0);
1118 }
1119
1120 static void bt_hci_reset(struct bt_hci_s *hci)
1121 {
1122 hci->acl_len = 0;
1123 hci->last_cmd = 0;
1124 hci->lm.connecting = 0;
1125
1126 hci->event_mask[0] = 0xff;
1127 hci->event_mask[1] = 0xff;
1128 hci->event_mask[2] = 0xff;
1129 hci->event_mask[3] = 0xff;
1130 hci->event_mask[4] = 0xff;
1131 hci->event_mask[5] = 0x1f;
1132 hci->event_mask[6] = 0x00;
1133 hci->event_mask[7] = 0x00;
1134 hci->device.inquiry_scan = 0;
1135 hci->device.page_scan = 0;
1136 if (hci->device.lmp_name)
1137 g_free((void *) hci->device.lmp_name);
1138 hci->device.lmp_name = NULL;
1139 hci->device.class[0] = 0x00;
1140 hci->device.class[1] = 0x00;
1141 hci->device.class[2] = 0x00;
1142 hci->voice_setting = 0x0000;
1143 hci->conn_accept_tout = 0x1f40;
1144 hci->lm.inquiry_mode = 0x00;
1145
1146 hci->psb_handle = 0x000;
1147 hci->asb_handle = 0x000;
1148
1149 /* XXX: qemu_del_timer(sl->acl_mode_timer); for all links */
1150 qemu_del_timer(hci->lm.inquiry_done);
1151 qemu_del_timer(hci->lm.inquiry_next);
1152 qemu_del_timer(hci->conn_accept_timer);
1153 }
1154
1155 static void bt_hci_read_local_version_rp(struct bt_hci_s *hci)
1156 {
1157 read_local_version_rp lv = {
1158 .status = HCI_SUCCESS,
1159 .hci_ver = 0x03,
1160 .hci_rev = cpu_to_le16(0xa607),
1161 .lmp_ver = 0x03,
1162 .manufacturer = cpu_to_le16(0xa000),
1163 .lmp_subver = cpu_to_le16(0xa607),
1164 };
1165
1166 bt_hci_event_complete(hci, &lv, READ_LOCAL_VERSION_RP_SIZE);
1167 }
1168
1169 static void bt_hci_read_local_commands_rp(struct bt_hci_s *hci)
1170 {
1171 read_local_commands_rp lc = {
1172 .status = HCI_SUCCESS,
1173 .commands = {
1174 /* Keep updated! */
1175 /* Also, keep in sync with hci->device.lmp_caps in bt_new_hci */
1176 0xbf, 0x80, 0xf9, 0x03, 0xb2, 0xc0, 0x03, 0xc3,
1177 0x00, 0x0f, 0x80, 0x00, 0xc0, 0x00, 0xe8, 0x13,
1178 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1184 },
1185 };
1186
1187 bt_hci_event_complete(hci, &lc, READ_LOCAL_COMMANDS_RP_SIZE);
1188 }
1189
1190 static void bt_hci_read_local_features_rp(struct bt_hci_s *hci)
1191 {
1192 read_local_features_rp lf = {
1193 .status = HCI_SUCCESS,
1194 .features = {
1195 (hci->device.lmp_caps >> 0) & 0xff,
1196 (hci->device.lmp_caps >> 8) & 0xff,
1197 (hci->device.lmp_caps >> 16) & 0xff,
1198 (hci->device.lmp_caps >> 24) & 0xff,
1199 (hci->device.lmp_caps >> 32) & 0xff,
1200 (hci->device.lmp_caps >> 40) & 0xff,
1201 (hci->device.lmp_caps >> 48) & 0xff,
1202 (hci->device.lmp_caps >> 56) & 0xff,
1203 },
1204 };
1205
1206 bt_hci_event_complete(hci, &lf, READ_LOCAL_FEATURES_RP_SIZE);
1207 }
1208
1209 static void bt_hci_read_local_ext_features_rp(struct bt_hci_s *hci, int page)
1210 {
1211 read_local_ext_features_rp lef = {
1212 .status = HCI_SUCCESS,
1213 .page_num = page,
1214 .max_page_num = 0x00,
1215 .features = {
1216 /* Keep updated! */
1217 0x5f, 0x35, 0x85, 0x7e, 0x9b, 0x19, 0x00, 0x80,
1218 },
1219 };
1220 if (page)
1221 memset(lef.features, 0, sizeof(lef.features));
1222
1223 bt_hci_event_complete(hci, &lef, READ_LOCAL_EXT_FEATURES_RP_SIZE);
1224 }
1225
1226 static void bt_hci_read_buffer_size_rp(struct bt_hci_s *hci)
1227 {
1228 read_buffer_size_rp bs = {
1229 /* This can be made configurable, for one standard USB dongle HCI
1230 * the four values are cpu_to_le16(0x0180), 0x40,
1231 * cpu_to_le16(0x0008), cpu_to_le16(0x0008). */
1232 .status = HCI_SUCCESS,
1233 .acl_mtu = cpu_to_le16(0x0200),
1234 .sco_mtu = 0,
1235 .acl_max_pkt = cpu_to_le16(0x0001),
1236 .sco_max_pkt = cpu_to_le16(0x0000),
1237 };
1238
1239 bt_hci_event_complete(hci, &bs, READ_BUFFER_SIZE_RP_SIZE);
1240 }
1241
1242 /* Deprecated in V2.0 (page 661) */
1243 static void bt_hci_read_country_code_rp(struct bt_hci_s *hci)
1244 {
1245 read_country_code_rp cc ={
1246 .status = HCI_SUCCESS,
1247 .country_code = 0x00, /* North America & Europe^1 and Japan */
1248 };
1249
1250 bt_hci_event_complete(hci, &cc, READ_COUNTRY_CODE_RP_SIZE);
1251
1252 /* ^1. Except France, sorry */
1253 }
1254
1255 static void bt_hci_read_bd_addr_rp(struct bt_hci_s *hci)
1256 {
1257 read_bd_addr_rp ba = {
1258 .status = HCI_SUCCESS,
1259 .bdaddr = BAINIT(&hci->device.bd_addr),
1260 };
1261
1262 bt_hci_event_complete(hci, &ba, READ_BD_ADDR_RP_SIZE);
1263 }
1264
1265 static int bt_hci_link_quality_rp(struct bt_hci_s *hci, uint16_t handle)
1266 {
1267 read_link_quality_rp lq = {
1268 .status = HCI_SUCCESS,
1269 .handle = HNDL(handle),
1270 .link_quality = 0xff,
1271 };
1272
1273 if (bt_hci_handle_bad(hci, handle))
1274 lq.status = HCI_NO_CONNECTION;
1275
1276 bt_hci_event_complete(hci, &lq, READ_LINK_QUALITY_RP_SIZE);
1277 return 0;
1278 }
1279
1280 /* Generate a Command Complete event with only the Status parameter */
1281 static inline void bt_hci_event_complete_status(struct bt_hci_s *hci,
1282 uint8_t status)
1283 {
1284 bt_hci_event_complete(hci, &status, 1);
1285 }
1286
1287 static inline void bt_hci_event_complete_conn_cancel(struct bt_hci_s *hci,
1288 uint8_t status, bdaddr_t *bd_addr)
1289 {
1290 create_conn_cancel_rp params = {
1291 .status = status,
1292 .bdaddr = BAINIT(bd_addr),
1293 };
1294
1295 bt_hci_event_complete(hci, &params, CREATE_CONN_CANCEL_RP_SIZE);
1296 }
1297
1298 static inline void bt_hci_event_auth_complete(struct bt_hci_s *hci,
1299 uint16_t handle)
1300 {
1301 evt_auth_complete params = {
1302 .status = HCI_SUCCESS,
1303 .handle = HNDL(handle),
1304 };
1305
1306 bt_hci_event(hci, EVT_AUTH_COMPLETE, &params, EVT_AUTH_COMPLETE_SIZE);
1307 }
1308
1309 static inline void bt_hci_event_encrypt_change(struct bt_hci_s *hci,
1310 uint16_t handle, uint8_t mode)
1311 {
1312 evt_encrypt_change params = {
1313 .status = HCI_SUCCESS,
1314 .handle = HNDL(handle),
1315 .encrypt = mode,
1316 };
1317
1318 bt_hci_event(hci, EVT_ENCRYPT_CHANGE, &params, EVT_ENCRYPT_CHANGE_SIZE);
1319 }
1320
1321 static inline void bt_hci_event_complete_name_cancel(struct bt_hci_s *hci,
1322 bdaddr_t *bd_addr)
1323 {
1324 remote_name_req_cancel_rp params = {
1325 .status = HCI_INVALID_PARAMETERS,
1326 .bdaddr = BAINIT(bd_addr),
1327 };
1328
1329 bt_hci_event_complete(hci, &params, REMOTE_NAME_REQ_CANCEL_RP_SIZE);
1330 }
1331
1332 static inline void bt_hci_event_read_remote_ext_features(struct bt_hci_s *hci,
1333 uint16_t handle)
1334 {
1335 evt_read_remote_ext_features_complete params = {
1336 .status = HCI_UNSUPPORTED_FEATURE,
1337 .handle = HNDL(handle),
1338 /* Rest uninitialised */
1339 };
1340
1341 bt_hci_event(hci, EVT_READ_REMOTE_EXT_FEATURES_COMPLETE,
1342 &params, EVT_READ_REMOTE_EXT_FEATURES_COMPLETE_SIZE);
1343 }
1344
1345 static inline void bt_hci_event_complete_lmp_handle(struct bt_hci_s *hci,
1346 uint16_t handle)
1347 {
1348 read_lmp_handle_rp params = {
1349 .status = HCI_NO_CONNECTION,
1350 .handle = HNDL(handle),
1351 .reserved = 0,
1352 /* Rest uninitialised */
1353 };
1354
1355 bt_hci_event_complete(hci, &params, READ_LMP_HANDLE_RP_SIZE);
1356 }
1357
1358 static inline void bt_hci_event_complete_role_discovery(struct bt_hci_s *hci,
1359 int status, uint16_t handle, int master)
1360 {
1361 role_discovery_rp params = {
1362 .status = status,
1363 .handle = HNDL(handle),
1364 .role = master ? 0x00 : 0x01,
1365 };
1366
1367 bt_hci_event_complete(hci, &params, ROLE_DISCOVERY_RP_SIZE);
1368 }
1369
1370 static inline void bt_hci_event_complete_flush(struct bt_hci_s *hci,
1371 int status, uint16_t handle)
1372 {
1373 flush_rp params = {
1374 .status = status,
1375 .handle = HNDL(handle),
1376 };
1377
1378 bt_hci_event_complete(hci, &params, FLUSH_RP_SIZE);
1379 }
1380
1381 static inline void bt_hci_event_complete_read_local_name(struct bt_hci_s *hci)
1382 {
1383 read_local_name_rp params;
1384 params.status = HCI_SUCCESS;
1385 memset(params.name, 0, sizeof(params.name));
1386 if (hci->device.lmp_name)
1387 pstrcpy(params.name, sizeof(params.name), hci->device.lmp_name);
1388
1389 bt_hci_event_complete(hci, &params, READ_LOCAL_NAME_RP_SIZE);
1390 }
1391
1392 static inline void bt_hci_event_complete_read_conn_accept_timeout(
1393 struct bt_hci_s *hci)
1394 {
1395 read_conn_accept_timeout_rp params = {
1396 .status = HCI_SUCCESS,
1397 .timeout = cpu_to_le16(hci->conn_accept_tout),
1398 };
1399
1400 bt_hci_event_complete(hci, &params, READ_CONN_ACCEPT_TIMEOUT_RP_SIZE);
1401 }
1402
1403 static inline void bt_hci_event_complete_read_scan_enable(struct bt_hci_s *hci)
1404 {
1405 read_scan_enable_rp params = {
1406 .status = HCI_SUCCESS,
1407 .enable =
1408 (hci->device.inquiry_scan ? SCAN_INQUIRY : 0) |
1409 (hci->device.page_scan ? SCAN_PAGE : 0),
1410 };
1411
1412 bt_hci_event_complete(hci, &params, READ_SCAN_ENABLE_RP_SIZE);
1413 }
1414
1415 static inline void bt_hci_event_complete_read_local_class(struct bt_hci_s *hci)
1416 {
1417 read_class_of_dev_rp params;
1418
1419 params.status = HCI_SUCCESS;
1420 memcpy(params.dev_class, hci->device.class, sizeof(params.dev_class));
1421
1422 bt_hci_event_complete(hci, &params, READ_CLASS_OF_DEV_RP_SIZE);
1423 }
1424
1425 static inline void bt_hci_event_complete_voice_setting(struct bt_hci_s *hci)
1426 {
1427 read_voice_setting_rp params = {
1428 .status = HCI_SUCCESS,
1429 .voice_setting = hci->voice_setting, /* Note: no swapping */
1430 };
1431
1432 bt_hci_event_complete(hci, &params, READ_VOICE_SETTING_RP_SIZE);
1433 }
1434
1435 static inline void bt_hci_event_complete_read_inquiry_mode(
1436 struct bt_hci_s *hci)
1437 {
1438 read_inquiry_mode_rp params = {
1439 .status = HCI_SUCCESS,
1440 .mode = hci->lm.inquiry_mode,
1441 };
1442
1443 bt_hci_event_complete(hci, &params, READ_INQUIRY_MODE_RP_SIZE);
1444 }
1445
1446 static inline void bt_hci_event_num_comp_pkts(struct bt_hci_s *hci,
1447 uint16_t handle, int packets)
1448 {
1449 uint16_t buf[EVT_NUM_COMP_PKTS_SIZE(1) / 2 + 1];
1450 evt_num_comp_pkts *params = (void *) ((uint8_t *) buf + 1);
1451
1452 params->num_hndl = 1;
1453 params->connection->handle = HNDL(handle);
1454 params->connection->num_packets = cpu_to_le16(packets);
1455
1456 bt_hci_event(hci, EVT_NUM_COMP_PKTS, params, EVT_NUM_COMP_PKTS_SIZE(1));
1457 }
1458
1459 static void bt_submit_hci(struct HCIInfo *info,
1460 const uint8_t *data, int length)
1461 {
1462 struct bt_hci_s *hci = hci_from_info(info);
1463 uint16_t cmd;
1464 int paramlen, i;
1465
1466 if (length < HCI_COMMAND_HDR_SIZE)
1467 goto short_hci;
1468
1469 memcpy(&hci->last_cmd, data, 2);
1470
1471 cmd = (data[1] << 8) | data[0];
1472 paramlen = data[2];
1473 if (cmd_opcode_ogf(cmd) == 0 || cmd_opcode_ocf(cmd) == 0) /* NOP */
1474 return;
1475
1476 data += HCI_COMMAND_HDR_SIZE;
1477 length -= HCI_COMMAND_HDR_SIZE;
1478
1479 if (paramlen > length)
1480 return;
1481
1482 #define PARAM(cmd, param) (((cmd##_cp *) data)->param)
1483 #define PARAM16(cmd, param) le16_to_cpup(&PARAM(cmd, param))
1484 #define PARAMHANDLE(cmd) HNDL(PARAM(cmd, handle))
1485 #define LENGTH_CHECK(cmd) if (length < sizeof(cmd##_cp)) goto short_hci
1486 /* Note: the supported commands bitmask in bt_hci_read_local_commands_rp
1487 * needs to be updated every time a command is implemented here! */
1488 switch (cmd) {
1489 case cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY):
1490 LENGTH_CHECK(inquiry);
1491
1492 if (PARAM(inquiry, length) < 1) {
1493 bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1494 break;
1495 }
1496
1497 hci->lm.inquire = 1;
1498 hci->lm.periodic = 0;
1499 hci->lm.responses_left = PARAM(inquiry, num_rsp) ?: INT_MAX;
1500 hci->lm.responses = 0;
1501 bt_hci_event_status(hci, HCI_SUCCESS);
1502 bt_hci_inquiry_start(hci, PARAM(inquiry, length));
1503 break;
1504
1505 case cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY_CANCEL):
1506 if (!hci->lm.inquire || hci->lm.periodic) {
1507 fprintf(stderr, "%s: Inquiry Cancel should only be issued after "
1508 "the Inquiry command has been issued, a Command "
1509 "Status event has been received for the Inquiry "
1510 "command, and before the Inquiry Complete event "
1511 "occurs", __FUNCTION__);
1512 bt_hci_event_complete_status(hci, HCI_COMMAND_DISALLOWED);
1513 break;
1514 }
1515
1516 hci->lm.inquire = 0;
1517 qemu_del_timer(hci->lm.inquiry_done);
1518 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1519 break;
1520
1521 case cmd_opcode_pack(OGF_LINK_CTL, OCF_PERIODIC_INQUIRY):
1522 LENGTH_CHECK(periodic_inquiry);
1523
1524 if (!(PARAM(periodic_inquiry, length) <
1525 PARAM16(periodic_inquiry, min_period) &&
1526 PARAM16(periodic_inquiry, min_period) <
1527 PARAM16(periodic_inquiry, max_period)) ||
1528 PARAM(periodic_inquiry, length) < 1 ||
1529 PARAM16(periodic_inquiry, min_period) < 2 ||
1530 PARAM16(periodic_inquiry, max_period) < 3) {
1531 bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1532 break;
1533 }
1534
1535 hci->lm.inquire = 1;
1536 hci->lm.periodic = 1;
1537 hci->lm.responses_left = PARAM(periodic_inquiry, num_rsp);
1538 hci->lm.responses = 0;
1539 hci->lm.inquiry_period = PARAM16(periodic_inquiry, max_period);
1540 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1541 bt_hci_inquiry_start(hci, PARAM(periodic_inquiry, length));
1542 break;
1543
1544 case cmd_opcode_pack(OGF_LINK_CTL, OCF_EXIT_PERIODIC_INQUIRY):
1545 if (!hci->lm.inquire || !hci->lm.periodic) {
1546 fprintf(stderr, "%s: Inquiry Cancel should only be issued after "
1547 "the Inquiry command has been issued, a Command "
1548 "Status event has been received for the Inquiry "
1549 "command, and before the Inquiry Complete event "
1550 "occurs", __FUNCTION__);
1551 bt_hci_event_complete_status(hci, HCI_COMMAND_DISALLOWED);
1552 break;
1553 }
1554 hci->lm.inquire = 0;
1555 qemu_del_timer(hci->lm.inquiry_done);
1556 qemu_del_timer(hci->lm.inquiry_next);
1557 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1558 break;
1559
1560 case cmd_opcode_pack(OGF_LINK_CTL, OCF_CREATE_CONN):
1561 LENGTH_CHECK(create_conn);
1562
1563 if (hci->lm.connecting >= HCI_HANDLES_MAX) {
1564 bt_hci_event_status(hci, HCI_REJECTED_LIMITED_RESOURCES);
1565 break;
1566 }
1567 bt_hci_event_status(hci, HCI_SUCCESS);
1568
1569 if (bt_hci_connect(hci, &PARAM(create_conn, bdaddr)))
1570 bt_hci_connection_reject_event(hci, &PARAM(create_conn, bdaddr));
1571 break;
1572
1573 case cmd_opcode_pack(OGF_LINK_CTL, OCF_DISCONNECT):
1574 LENGTH_CHECK(disconnect);
1575
1576 if (bt_hci_handle_bad(hci, PARAMHANDLE(disconnect))) {
1577 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1578 break;
1579 }
1580
1581 bt_hci_event_status(hci, HCI_SUCCESS);
1582 bt_hci_disconnect(hci, PARAMHANDLE(disconnect),
1583 PARAM(disconnect, reason));
1584 break;
1585
1586 case cmd_opcode_pack(OGF_LINK_CTL, OCF_CREATE_CONN_CANCEL):
1587 LENGTH_CHECK(create_conn_cancel);
1588
1589 if (bt_hci_lmp_connection_ready(hci,
1590 &PARAM(create_conn_cancel, bdaddr))) {
1591 for (i = 0; i < HCI_HANDLES_MAX; i ++)
1592 if (bt_hci_role_master(hci, i) && hci->lm.handle[i].link &&
1593 !bacmp(&hci->lm.handle[i].link->slave->bd_addr,
1594 &PARAM(create_conn_cancel, bdaddr)))
1595 break;
1596
1597 bt_hci_event_complete_conn_cancel(hci, i < HCI_HANDLES_MAX ?
1598 HCI_ACL_CONNECTION_EXISTS : HCI_NO_CONNECTION,
1599 &PARAM(create_conn_cancel, bdaddr));
1600 } else
1601 bt_hci_event_complete_conn_cancel(hci, HCI_SUCCESS,
1602 &PARAM(create_conn_cancel, bdaddr));
1603 break;
1604
1605 case cmd_opcode_pack(OGF_LINK_CTL, OCF_ACCEPT_CONN_REQ):
1606 LENGTH_CHECK(accept_conn_req);
1607
1608 if (!hci->conn_req_host ||
1609 bacmp(&PARAM(accept_conn_req, bdaddr),
1610 &hci->conn_req_host->bd_addr)) {
1611 bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1612 break;
1613 }
1614
1615 bt_hci_event_status(hci, HCI_SUCCESS);
1616 bt_hci_connection_accept(hci, hci->conn_req_host);
1617 hci->conn_req_host = NULL;
1618 break;
1619
1620 case cmd_opcode_pack(OGF_LINK_CTL, OCF_REJECT_CONN_REQ):
1621 LENGTH_CHECK(reject_conn_req);
1622
1623 if (!hci->conn_req_host ||
1624 bacmp(&PARAM(reject_conn_req, bdaddr),
1625 &hci->conn_req_host->bd_addr)) {
1626 bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1627 break;
1628 }
1629
1630 bt_hci_event_status(hci, HCI_SUCCESS);
1631 bt_hci_connection_reject(hci, hci->conn_req_host,
1632 PARAM(reject_conn_req, reason));
1633 bt_hci_connection_reject_event(hci, &hci->conn_req_host->bd_addr);
1634 hci->conn_req_host = NULL;
1635 break;
1636
1637 case cmd_opcode_pack(OGF_LINK_CTL, OCF_AUTH_REQUESTED):
1638 LENGTH_CHECK(auth_requested);
1639
1640 if (bt_hci_handle_bad(hci, PARAMHANDLE(auth_requested)))
1641 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1642 else {
1643 bt_hci_event_status(hci, HCI_SUCCESS);
1644 bt_hci_event_auth_complete(hci, PARAMHANDLE(auth_requested));
1645 }
1646 break;
1647
1648 case cmd_opcode_pack(OGF_LINK_CTL, OCF_SET_CONN_ENCRYPT):
1649 LENGTH_CHECK(set_conn_encrypt);
1650
1651 if (bt_hci_handle_bad(hci, PARAMHANDLE(set_conn_encrypt)))
1652 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1653 else {
1654 bt_hci_event_status(hci, HCI_SUCCESS);
1655 bt_hci_event_encrypt_change(hci,
1656 PARAMHANDLE(set_conn_encrypt),
1657 PARAM(set_conn_encrypt, encrypt));
1658 }
1659 break;
1660
1661 case cmd_opcode_pack(OGF_LINK_CTL, OCF_REMOTE_NAME_REQ):
1662 LENGTH_CHECK(remote_name_req);
1663
1664 if (bt_hci_name_req(hci, &PARAM(remote_name_req, bdaddr)))
1665 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1666 break;
1667
1668 case cmd_opcode_pack(OGF_LINK_CTL, OCF_REMOTE_NAME_REQ_CANCEL):
1669 LENGTH_CHECK(remote_name_req_cancel);
1670
1671 bt_hci_event_complete_name_cancel(hci,
1672 &PARAM(remote_name_req_cancel, bdaddr));
1673 break;
1674
1675 case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_FEATURES):
1676 LENGTH_CHECK(read_remote_features);
1677
1678 if (bt_hci_features_req(hci, PARAMHANDLE(read_remote_features)))
1679 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1680 break;
1681
1682 case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_EXT_FEATURES):
1683 LENGTH_CHECK(read_remote_ext_features);
1684
1685 if (bt_hci_handle_bad(hci, PARAMHANDLE(read_remote_ext_features)))
1686 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1687 else {
1688 bt_hci_event_status(hci, HCI_SUCCESS);
1689 bt_hci_event_read_remote_ext_features(hci,
1690 PARAMHANDLE(read_remote_ext_features));
1691 }
1692 break;
1693
1694 case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_VERSION):
1695 LENGTH_CHECK(read_remote_version);
1696
1697 if (bt_hci_version_req(hci, PARAMHANDLE(read_remote_version)))
1698 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1699 break;
1700
1701 case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_CLOCK_OFFSET):
1702 LENGTH_CHECK(read_clock_offset);
1703
1704 if (bt_hci_clkoffset_req(hci, PARAMHANDLE(read_clock_offset)))
1705 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1706 break;
1707
1708 case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_LMP_HANDLE):
1709 LENGTH_CHECK(read_lmp_handle);
1710
1711 /* TODO: */
1712 bt_hci_event_complete_lmp_handle(hci, PARAMHANDLE(read_lmp_handle));
1713 break;
1714
1715 case cmd_opcode_pack(OGF_LINK_POLICY, OCF_HOLD_MODE):
1716 LENGTH_CHECK(hold_mode);
1717
1718 if (PARAM16(hold_mode, min_interval) >
1719 PARAM16(hold_mode, max_interval) ||
1720 PARAM16(hold_mode, min_interval) < 0x0002 ||
1721 PARAM16(hold_mode, max_interval) > 0xff00 ||
1722 (PARAM16(hold_mode, min_interval) & 1) ||
1723 (PARAM16(hold_mode, max_interval) & 1)) {
1724 bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1725 break;
1726 }
1727
1728 if (bt_hci_mode_change(hci, PARAMHANDLE(hold_mode),
1729 PARAM16(hold_mode, max_interval),
1730 acl_hold))
1731 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1732 break;
1733
1734 case cmd_opcode_pack(OGF_LINK_POLICY, OCF_PARK_MODE):
1735 LENGTH_CHECK(park_mode);
1736
1737 if (PARAM16(park_mode, min_interval) >
1738 PARAM16(park_mode, max_interval) ||
1739 PARAM16(park_mode, min_interval) < 0x000e ||
1740 (PARAM16(park_mode, min_interval) & 1) ||
1741 (PARAM16(park_mode, max_interval) & 1)) {
1742 bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1743 break;
1744 }
1745
1746 if (bt_hci_mode_change(hci, PARAMHANDLE(park_mode),
1747 PARAM16(park_mode, max_interval),
1748 acl_parked))
1749 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1750 break;
1751
1752 case cmd_opcode_pack(OGF_LINK_POLICY, OCF_EXIT_PARK_MODE):
1753 LENGTH_CHECK(exit_park_mode);
1754
1755 if (bt_hci_mode_cancel(hci, PARAMHANDLE(exit_park_mode),
1756 acl_parked))
1757 bt_hci_event_status(hci, HCI_NO_CONNECTION);
1758 break;
1759
1760 case cmd_opcode_pack(OGF_LINK_POLICY, OCF_ROLE_DISCOVERY):
1761 LENGTH_CHECK(role_discovery);
1762
1763 if (bt_hci_handle_bad(hci, PARAMHANDLE(role_discovery)))
1764 bt_hci_event_complete_role_discovery(hci,
1765 HCI_NO_CONNECTION, PARAMHANDLE(role_discovery), 0);
1766 else
1767 bt_hci_event_complete_role_discovery(hci,
1768 HCI_SUCCESS, PARAMHANDLE(role_discovery),
1769 bt_hci_role_master(hci,
1770 PARAMHANDLE(role_discovery)));
1771 break;
1772
1773 case cmd_opcode_pack(OGF_HOST_CTL, OCF_SET_EVENT_MASK):
1774 LENGTH_CHECK(set_event_mask);
1775
1776 memcpy(hci->event_mask, PARAM(set_event_mask, mask), 8);
1777 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1778 break;
1779
1780 case cmd_opcode_pack(OGF_HOST_CTL, OCF_RESET):
1781 bt_hci_reset(hci);
1782 bt_hci_event_status(hci, HCI_SUCCESS);
1783 break;
1784
1785 case cmd_opcode_pack(OGF_HOST_CTL, OCF_SET_EVENT_FLT):
1786 if (length >= 1 && PARAM(set_event_flt, flt_type) == FLT_CLEAR_ALL)
1787 /* No length check */;
1788 else
1789 LENGTH_CHECK(set_event_flt);
1790
1791 /* Filters are not implemented */
1792 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1793 break;
1794
1795 case cmd_opcode_pack(OGF_HOST_CTL, OCF_FLUSH):
1796 LENGTH_CHECK(flush);
1797
1798 if (bt_hci_handle_bad(hci, PARAMHANDLE(flush)))
1799 bt_hci_event_complete_flush(hci,
1800 HCI_NO_CONNECTION, PARAMHANDLE(flush));
1801 else {
1802 /* TODO: ordering? */
1803 bt_hci_event(hci, EVT_FLUSH_OCCURRED,
1804 &PARAM(flush, handle),
1805 EVT_FLUSH_OCCURRED_SIZE);
1806 bt_hci_event_complete_flush(hci,
1807 HCI_SUCCESS, PARAMHANDLE(flush));
1808 }
1809 break;
1810
1811 case cmd_opcode_pack(OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME):
1812 LENGTH_CHECK(change_local_name);
1813
1814 if (hci->device.lmp_name)
1815 g_free((void *) hci->device.lmp_name);
1816 hci->device.lmp_name = g_strndup(PARAM(change_local_name, name),
1817 sizeof(PARAM(change_local_name, name)));
1818 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1819 break;
1820
1821 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_LOCAL_NAME):
1822 bt_hci_event_complete_read_local_name(hci);
1823 break;
1824
1825 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_CONN_ACCEPT_TIMEOUT):
1826 bt_hci_event_complete_read_conn_accept_timeout(hci);
1827 break;
1828
1829 case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_CONN_ACCEPT_TIMEOUT):
1830 /* TODO */
1831 LENGTH_CHECK(write_conn_accept_timeout);
1832
1833 if (PARAM16(write_conn_accept_timeout, timeout) < 0x0001 ||
1834 PARAM16(write_conn_accept_timeout, timeout) > 0xb540) {
1835 bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1836 break;
1837 }
1838
1839 hci->conn_accept_tout = PARAM16(write_conn_accept_timeout, timeout);
1840 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1841 break;
1842
1843 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_SCAN_ENABLE):
1844 bt_hci_event_complete_read_scan_enable(hci);
1845 break;
1846
1847 case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE):
1848 LENGTH_CHECK(write_scan_enable);
1849
1850 /* TODO: check that the remaining bits are all 0 */
1851 hci->device.inquiry_scan =
1852 !!(PARAM(write_scan_enable, scan_enable) & SCAN_INQUIRY);
1853 hci->device.page_scan =
1854 !!(PARAM(write_scan_enable, scan_enable) & SCAN_PAGE);
1855 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1856 break;
1857
1858 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_CLASS_OF_DEV):
1859 bt_hci_event_complete_read_local_class(hci);
1860 break;
1861
1862 case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_CLASS_OF_DEV):
1863 LENGTH_CHECK(write_class_of_dev);
1864
1865 memcpy(hci->device.class, PARAM(write_class_of_dev, dev_class),
1866 sizeof(PARAM(write_class_of_dev, dev_class)));
1867 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1868 break;
1869
1870 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_VOICE_SETTING):
1871 bt_hci_event_complete_voice_setting(hci);
1872 break;
1873
1874 case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_VOICE_SETTING):
1875 LENGTH_CHECK(write_voice_setting);
1876
1877 hci->voice_setting = PARAM(write_voice_setting, voice_setting);
1878 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1879 break;
1880
1881 case cmd_opcode_pack(OGF_HOST_CTL, OCF_HOST_NUMBER_OF_COMPLETED_PACKETS):
1882 if (length < data[0] * 2 + 1)
1883 goto short_hci;
1884
1885 for (i = 0; i < data[0]; i ++)
1886 if (bt_hci_handle_bad(hci,
1887 data[i * 2 + 1] | (data[i * 2 + 2] << 8)))
1888 bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1889 break;
1890
1891 case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_INQUIRY_MODE):
1892 /* Only if (local_features[3] & 0x40) && (local_commands[12] & 0x40)
1893 * else
1894 * goto unknown_command */
1895 bt_hci_event_complete_read_inquiry_mode(hci);
1896 break;
1897
1898 case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_INQUIRY_MODE):
1899 /* Only if (local_features[3] & 0x40) && (local_commands[12] & 0x80)
1900 * else
1901 * goto unknown_command */
1902 LENGTH_CHECK(write_inquiry_mode);
1903
1904 if (PARAM(write_inquiry_mode, mode) > 0x01) {
1905 bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1906 break;
1907 }
1908
1909 hci->lm.inquiry_mode = PARAM(write_inquiry_mode, mode);
1910 bt_hci_event_complete_status(hci, HCI_SUCCESS);
1911 break;
1912
1913 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION):
1914 bt_hci_read_local_version_rp(hci);
1915 break;
1916
1917 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_COMMANDS):
1918 bt_hci_read_local_commands_rp(hci);
1919 break;
1920
1921 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_FEATURES):
1922 bt_hci_read_local_features_rp(hci);
1923 break;
1924
1925 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_EXT_FEATURES):
1926 LENGTH_CHECK(read_local_ext_features);
1927
1928 bt_hci_read_local_ext_features_rp(hci,
1929 PARAM(read_local_ext_features, page_num));
1930 break;
1931
1932 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_BUFFER_SIZE):
1933 bt_hci_read_buffer_size_rp(hci);
1934 break;
1935
1936 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_COUNTRY_CODE):
1937 bt_hci_read_country_code_rp(hci);
1938 break;
1939
1940 case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_BD_ADDR):
1941 bt_hci_read_bd_addr_rp(hci);
1942 break;
1943
1944 case cmd_opcode_pack(OGF_STATUS_PARAM, OCF_READ_LINK_QUALITY):
1945 LENGTH_CHECK(read_link_quality);
1946
1947 bt_hci_link_quality_rp(hci, PARAMHANDLE(read_link_quality));
1948 break;
1949
1950 default:
1951 bt_hci_event_status(hci, HCI_UNKNOWN_COMMAND);
1952 break;
1953
1954 short_hci:
1955 fprintf(stderr, "%s: HCI packet too short (%iB)\n",
1956 __FUNCTION__, length);
1957 bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1958 break;
1959 }
1960 }
1961
1962 /* We could perform fragmentation here, we can't do "recombination" because
1963 * at this layer the length of the payload is not know ahead, so we only
1964 * know that a packet contained the last fragment of the SDU when the next
1965 * SDU starts. */
1966 static inline void bt_hci_lmp_acl_data(struct bt_hci_s *hci, uint16_t handle,
1967 const uint8_t *data, int start, int len)
1968 {
1969 struct hci_acl_hdr *pkt = (void *) hci->acl_buf;
1970
1971 /* TODO: packet flags */
1972 /* TODO: avoid memcpy'ing */
1973
1974 if (len + HCI_ACL_HDR_SIZE > sizeof(hci->acl_buf)) {
1975 fprintf(stderr, "%s: can't take ACL packets %i bytes long\n",
1976 __FUNCTION__, len);
1977 return;
1978 }
1979 memcpy(hci->acl_buf + HCI_ACL_HDR_SIZE, data, len);
1980
1981 pkt->handle = cpu_to_le16(
1982 acl_handle_pack(handle, start ? ACL_START : ACL_CONT));
1983 pkt->dlen = cpu_to_le16(len);
1984 hci->info.acl_recv(hci->info.opaque,
1985 hci->acl_buf, len + HCI_ACL_HDR_SIZE);
1986 }
1987
1988 static void bt_hci_lmp_acl_data_slave(struct bt_link_s *btlink,
1989 const uint8_t *data, int start, int len)
1990 {
1991 struct bt_hci_link_s *link = (struct bt_hci_link_s *) btlink;
1992
1993 bt_hci_lmp_acl_data(hci_from_device(btlink->slave),
1994 link->handle, data, start, len);
1995 }
1996
1997 static void bt_hci_lmp_acl_data_host(struct bt_link_s *link,
1998 const uint8_t *data, int start, int len)
1999 {
2000 bt_hci_lmp_acl_data(hci_from_device(link->host),
2001 link->handle, data, start, len);
2002 }
2003
2004 static void bt_submit_acl(struct HCIInfo *info,
2005 const uint8_t *data, int length)
2006 {
2007 struct bt_hci_s *hci = hci_from_info(info);
2008 uint16_t handle;
2009 int datalen, flags;
2010 struct bt_link_s *link;
2011
2012 if (length < HCI_ACL_HDR_SIZE) {
2013 fprintf(stderr, "%s: ACL packet too short (%iB)\n",
2014 __FUNCTION__, length);
2015 return;
2016 }
2017
2018 handle = acl_handle((data[1] << 8) | data[0]);
2019 flags = acl_flags((data[1] << 8) | data[0]);
2020 datalen = (data[3] << 8) | data[2];
2021 data += HCI_ACL_HDR_SIZE;
2022 length -= HCI_ACL_HDR_SIZE;
2023
2024 if (bt_hci_handle_bad(hci, handle)) {
2025 fprintf(stderr, "%s: invalid ACL handle %03x\n",
2026 __FUNCTION__, handle);
2027 /* TODO: signal an error */
2028 return;
2029 }
2030 handle &= ~HCI_HANDLE_OFFSET;
2031
2032 if (datalen > length) {
2033 fprintf(stderr, "%s: ACL packet too short (%iB < %iB)\n",
2034 __FUNCTION__, length, datalen);
2035 return;
2036 }
2037
2038 link = hci->lm.handle[handle].link;
2039
2040 if ((flags & ~3) == ACL_ACTIVE_BCAST) {
2041 if (!hci->asb_handle)
2042 hci->asb_handle = handle;
2043 else if (handle != hci->asb_handle) {
2044 fprintf(stderr, "%s: Bad handle %03x in Active Slave Broadcast\n",
2045 __FUNCTION__, handle);
2046 /* TODO: signal an error */
2047 return;
2048 }
2049
2050 /* TODO */
2051 }
2052
2053 if ((flags & ~3) == ACL_PICO_BCAST) {
2054 if (!hci->psb_handle)
2055 hci->psb_handle = handle;
2056 else if (handle != hci->psb_handle) {
2057 fprintf(stderr, "%s: Bad handle %03x in Parked Slave Broadcast\n",
2058 __FUNCTION__, handle);
2059 /* TODO: signal an error */
2060 return;
2061 }
2062
2063 /* TODO */
2064 }
2065
2066 /* TODO: increase counter and send EVT_NUM_COMP_PKTS */
2067 bt_hci_event_num_comp_pkts(hci, handle | HCI_HANDLE_OFFSET, 1);
2068
2069 /* Do this last as it can trigger further events even in this HCI */
2070 hci->lm.handle[handle].lmp_acl_data(link, data,
2071 (flags & 3) == ACL_START, length);
2072 }
2073
2074 static void bt_submit_sco(struct HCIInfo *info,
2075 const uint8_t *data, int length)
2076 {
2077 struct bt_hci_s *hci = hci_from_info(info);
2078 uint16_t handle;
2079 int datalen;
2080
2081 if (length < 3)
2082 return;
2083
2084 handle = acl_handle((data[1] << 8) | data[0]);
2085 datalen = data[2];
2086 length -= 3;
2087
2088 if (bt_hci_handle_bad(hci, handle)) {
2089 fprintf(stderr, "%s: invalid SCO handle %03x\n",
2090 __FUNCTION__, handle);
2091 return;
2092 }
2093
2094 if (datalen > length) {
2095 fprintf(stderr, "%s: SCO packet too short (%iB < %iB)\n",
2096 __FUNCTION__, length, datalen);
2097 return;
2098 }
2099
2100 /* TODO */
2101
2102 /* TODO: increase counter and send EVT_NUM_COMP_PKTS if synchronous
2103 * Flow Control is enabled.
2104 * (See Read/Write_Synchronous_Flow_Control_Enable on page 513 and
2105 * page 514.) */
2106 }
2107
2108 static uint8_t *bt_hci_evt_packet(void *opaque)
2109 {
2110 /* TODO: allocate a packet from upper layer */
2111 struct bt_hci_s *s = opaque;
2112
2113 return s->evt_buf;
2114 }
2115
2116 static void bt_hci_evt_submit(void *opaque, int len)
2117 {
2118 /* TODO: notify upper layer */
2119 struct bt_hci_s *s = opaque;
2120
2121 s->info.evt_recv(s->info.opaque, s->evt_buf, len);
2122 }
2123
2124 static int bt_hci_bdaddr_set(struct HCIInfo *info, const uint8_t *bd_addr)
2125 {
2126 struct bt_hci_s *hci = hci_from_info(info);
2127
2128 bacpy(&hci->device.bd_addr, (const bdaddr_t *) bd_addr);
2129 return 0;
2130 }
2131
2132 static void bt_hci_done(struct HCIInfo *info);
2133 static void bt_hci_destroy(struct bt_device_s *dev)
2134 {
2135 struct bt_hci_s *hci = hci_from_device(dev);
2136
2137 bt_hci_done(&hci->info);
2138 }
2139
2140 struct HCIInfo *bt_new_hci(struct bt_scatternet_s *net)
2141 {
2142 struct bt_hci_s *s = g_malloc0(sizeof(struct bt_hci_s));
2143
2144 s->lm.inquiry_done = qemu_new_timer_ns(vm_clock, bt_hci_inquiry_done, s);
2145 s->lm.inquiry_next = qemu_new_timer_ns(vm_clock, bt_hci_inquiry_next, s);
2146 s->conn_accept_timer =
2147 qemu_new_timer_ns(vm_clock, bt_hci_conn_accept_timeout, s);
2148
2149 s->evt_packet = bt_hci_evt_packet;
2150 s->evt_submit = bt_hci_evt_submit;
2151 s->opaque = s;
2152
2153 bt_device_init(&s->device, net);
2154 s->device.lmp_connection_request = bt_hci_lmp_connection_request;
2155 s->device.lmp_connection_complete = bt_hci_lmp_connection_complete;
2156 s->device.lmp_disconnect_master = bt_hci_lmp_disconnect_host;
2157 s->device.lmp_disconnect_slave = bt_hci_lmp_disconnect_slave;
2158 s->device.lmp_acl_data = bt_hci_lmp_acl_data_slave;
2159 s->device.lmp_acl_resp = bt_hci_lmp_acl_data_host;
2160 s->device.lmp_mode_change = bt_hci_lmp_mode_change_slave;
2161
2162 /* Keep updated! */
2163 /* Also keep in sync with supported commands bitmask in
2164 * bt_hci_read_local_commands_rp */
2165 s->device.lmp_caps = 0x8000199b7e85355fll;
2166
2167 bt_hci_reset(s);
2168
2169 s->info.cmd_send = bt_submit_hci;
2170 s->info.sco_send = bt_submit_sco;
2171 s->info.acl_send = bt_submit_acl;
2172 s->info.bdaddr_set = bt_hci_bdaddr_set;
2173
2174 s->device.handle_destroy = bt_hci_destroy;
2175
2176 return &s->info;
2177 }
2178
2179 static void bt_hci_done(struct HCIInfo *info)
2180 {
2181 struct bt_hci_s *hci = hci_from_info(info);
2182 int handle;
2183
2184 bt_device_done(&hci->device);
2185
2186 if (hci->device.lmp_name)
2187 g_free((void *) hci->device.lmp_name);
2188
2189 /* Be gentle and send DISCONNECT to all connected peers and those
2190 * currently waiting for us to accept or reject a connection request.
2191 * This frees the links. */
2192 if (hci->conn_req_host) {
2193 bt_hci_connection_reject(hci,
2194 hci->conn_req_host, HCI_OE_POWER_OFF);
2195 return;
2196 }
2197
2198 for (handle = HCI_HANDLE_OFFSET;
2199 handle < (HCI_HANDLE_OFFSET | HCI_HANDLES_MAX); handle ++)
2200 if (!bt_hci_handle_bad(hci, handle))
2201 bt_hci_disconnect(hci, handle, HCI_OE_POWER_OFF);
2202
2203 /* TODO: this is not enough actually, there may be slaves from whom
2204 * we have requested a connection who will soon (or not) respond with
2205 * an accept or a reject, so we should also check if hci->lm.connecting
2206 * is non-zero and if so, avoid freeing the hci but otherwise disappear
2207 * from all qemu social life (e.g. stop scanning and request to be
2208 * removed from s->device.net) and arrange for
2209 * s->device.lmp_connection_complete to free the remaining bits once
2210 * hci->lm.awaiting_bdaddr[] is empty. */
2211
2212 qemu_free_timer(hci->lm.inquiry_done);
2213 qemu_free_timer(hci->lm.inquiry_next);
2214 qemu_free_timer(hci->conn_accept_timer);
2215
2216 g_free(hci);
2217 }