3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2011-2012 Intel Corporation
6 * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
37 #define le16_to_cpu(val) (val)
38 #define cpu_to_le16(val) (val)
43 btdev_send_func send_handler;
46 uint16_t manufacturer;
55 uint8_t le_features[8];
58 uint16_t default_link_policy;
59 uint8_t event_mask[8];
63 uint16_t voice_setting;
64 uint16_t conn_accept_timeout;
65 uint16_t page_timeout;
69 uint8_t afh_assess_mode;
70 uint8_t ext_inquiry_fec;
71 uint8_t ext_inquiry_rsp[240];
72 uint8_t simple_pairing_mode;
74 uint8_t le_simultaneous;
75 uint8_t le_event_mask[8];
78 #define MAX_BTDEV_ENTRIES 16
80 static struct btdev *btdev_list[MAX_BTDEV_ENTRIES] = { };
82 static inline int add_btdev(struct btdev *btdev)
86 for (i = 0; i < MAX_BTDEV_ENTRIES; i++) {
87 if (btdev_list[i] == NULL) {
89 btdev_list[index] = btdev;
97 static inline int del_btdev(struct btdev *btdev)
101 for (i = 0; i < MAX_BTDEV_ENTRIES; i++) {
102 if (btdev_list[i] == btdev) {
104 btdev_list[index] = NULL;
112 static inline struct btdev *find_btdev_by_bdaddr(const uint8_t *bdaddr)
116 for (i = 0; i < MAX_BTDEV_ENTRIES; i++) {
117 if (btdev_list[i] && !memcmp(btdev_list[i]->bdaddr, bdaddr, 6))
118 return btdev_list[i];
124 static void hexdump(const unsigned char *buf, uint16_t len)
126 static const char hexdigits[] = "0123456789abcdef";
133 for (i = 0; i < len; i++) {
134 str[((i % 16) * 3) + 0] = hexdigits[buf[i] >> 4];
135 str[((i % 16) * 3) + 1] = hexdigits[buf[i] & 0xf];
136 str[((i % 16) * 3) + 2] = ' ';
137 str[(i % 16) + 49] = isprint(buf[i]) ? buf[i] : '.';
139 if ((i + 1) % 16 == 0) {
143 printf("%-12c%s\n", ' ', str);
150 for (j = (i % 16); j < 16; j++) {
151 str[(j * 3) + 0] = ' ';
152 str[(j * 3) + 1] = ' ';
153 str[(j * 3) + 2] = ' ';
159 printf("%-12c%s\n", ' ', str);
163 static void get_bdaddr(uint16_t id, uint8_t *bdaddr)
165 bdaddr[0] = id & 0xff;
173 struct btdev *btdev_create(uint16_t id)
177 btdev = malloc(sizeof(*btdev));
181 memset(btdev, 0, sizeof(*btdev));
183 btdev->manufacturer = 63;
184 btdev->version = 0x06;
185 btdev->revision = 0x0000;
187 btdev->features[0] |= 0x04; /* Encryption */
188 btdev->features[0] |= 0x20; /* Role switch */
189 btdev->features[0] |= 0x80; /* Sniff mode */
190 btdev->features[1] |= 0x08; /* SCO link */
191 btdev->features[3] |= 0x40; /* RSSI with inquiry results */
192 btdev->features[3] |= 0x80; /* Extended SCO link */
193 btdev->features[4] |= 0x08; /* AFH capable slave */
194 btdev->features[4] |= 0x10; /* AFH classification slave */
195 btdev->features[4] |= 0x40; /* LE Supported */
196 btdev->features[5] |= 0x02; /* Sniff subrating */
197 btdev->features[5] |= 0x04; /* Pause encryption */
198 btdev->features[5] |= 0x08; /* AFH capable master */
199 btdev->features[5] |= 0x10; /* AFH classification master */
200 btdev->features[6] |= 0x01; /* Extended Inquiry Response */
201 btdev->features[6] |= 0x02; /* Simultaneous LE and BR/EDR */
202 btdev->features[6] |= 0x08; /* Secure Simple Pairing */
203 btdev->features[6] |= 0x10; /* Encapsulated PDU */
204 btdev->features[6] |= 0x20; /* Erroneous Data Reporting */
205 btdev->features[6] |= 0x40; /* Non-flushable Packet Boundary Flag */
206 btdev->features[7] |= 0x01; /* Link Supervision Timeout Event */
207 btdev->features[7] |= 0x02; /* Inquiry TX Power Level */
208 btdev->features[7] |= 0x80; /* Extended features */
210 btdev->acl_mtu = 192;
211 btdev->acl_max_pkt = 1;
213 btdev->country_code = 0x00;
215 get_bdaddr(id, btdev->bdaddr);
222 void btdev_destroy(struct btdev *btdev)
232 void btdev_set_send_handler(struct btdev *btdev, btdev_send_func handler,
238 btdev->send_handler = handler;
239 btdev->send_data = user_data;
242 static void send_packet(struct btdev *btdev, const void *data, uint16_t len)
244 if (!btdev->send_handler)
247 btdev->send_handler(data, len, btdev->send_data);
250 static void send_event(struct btdev *btdev, uint8_t event,
251 const void *data, uint8_t len)
253 struct bt_hci_evt_hdr *hdr;
257 pkt_len = 1 + sizeof(*hdr) + len;
259 pkt_data = malloc(pkt_len);
263 ((uint8_t *) pkt_data)[0] = BT_H4_EVT_PKT;
270 memcpy(pkt_data + 1 + sizeof(*hdr), data, len);
272 send_packet(btdev, pkt_data, pkt_len);
277 static void cmd_complete(struct btdev *btdev, uint16_t opcode,
278 const void *data, uint8_t len)
280 struct bt_hci_evt_hdr *hdr;
281 struct bt_hci_evt_cmd_complete *cc;
285 pkt_len = 1 + sizeof(*hdr) + sizeof(*cc) + len;
287 pkt_data = malloc(pkt_len);
291 ((uint8_t *) pkt_data)[0] = BT_H4_EVT_PKT;
294 hdr->evt = BT_HCI_EVT_CMD_COMPLETE;
295 hdr->plen = sizeof(*cc) + len;
297 cc = pkt_data + 1 + sizeof(*hdr);
299 cc->opcode = cpu_to_le16(opcode);
302 memcpy(pkt_data + 1 + sizeof(*hdr) + sizeof(*cc), data, len);
304 send_packet(btdev, pkt_data, pkt_len);
309 static void cmd_status(struct btdev *btdev, uint8_t status, uint16_t opcode)
311 struct bt_hci_evt_cmd_status cs;
315 cs.opcode = cpu_to_le16(opcode);
317 send_event(btdev, BT_HCI_EVT_CMD_STATUS, &cs, sizeof(cs));
320 static void num_completed_packets(struct btdev *btdev)
323 struct bt_hci_evt_num_completed_packets ncp;
326 ncp.handle = cpu_to_le16(42);
327 ncp.count = cpu_to_le16(1);
329 send_event(btdev, BT_HCI_EVT_NUM_COMPLETED_PACKETS,
334 static void inquiry_complete(struct btdev *btdev, uint8_t status)
336 struct bt_hci_evt_inquiry_complete ic;
339 for (i = 0; i < MAX_BTDEV_ENTRIES; i++) {
340 if (!btdev_list[i] || btdev_list[i] == btdev)
343 if (!(btdev_list[i]->scan_enable & 0x02))
346 if (btdev->inquiry_mode == 0x02 &&
347 btdev_list[i]->ext_inquiry_rsp[0]) {
348 struct bt_hci_evt_ext_inquiry_result ir;
351 memcpy(ir.bdaddr, btdev_list[i]->bdaddr, 6);
352 memcpy(ir.dev_class, btdev_list[i]->dev_class, 3);
354 memcpy(ir.data, btdev_list[i]->ext_inquiry_rsp, 240);
356 send_event(btdev, BT_HCI_EVT_EXT_INQUIRY_RESULT,
361 if (btdev->inquiry_mode > 0x00) {
362 struct bt_hci_evt_inquiry_result_with_rssi ir;
365 memcpy(ir.bdaddr, btdev_list[i]->bdaddr, 6);
366 memcpy(ir.dev_class, btdev_list[i]->dev_class, 3);
369 send_event(btdev, BT_HCI_EVT_INQUIRY_RESULT_WITH_RSSI,
372 struct bt_hci_evt_inquiry_result ir;
375 memcpy(ir.bdaddr, btdev_list[i]->bdaddr, 6);
376 memcpy(ir.dev_class, btdev_list[i]->dev_class, 3);
378 send_event(btdev, BT_HCI_EVT_INQUIRY_RESULT,
385 send_event(btdev, BT_HCI_EVT_INQUIRY_COMPLETE, &ic, sizeof(ic));
388 static void conn_complete(struct btdev *btdev,
389 const uint8_t *bdaddr, uint8_t status)
391 struct bt_hci_evt_conn_complete cc;
394 struct btdev *remote = find_btdev_by_bdaddr(bdaddr);
396 btdev->conn = remote;
397 remote->conn = btdev;
400 memcpy(cc.bdaddr, btdev->bdaddr, 6);
403 cc.handle = cpu_to_le16(42);
406 send_event(remote, BT_HCI_EVT_CONN_COMPLETE, &cc, sizeof(cc));
408 cc.handle = cpu_to_le16(42);
411 cc.handle = cpu_to_le16(0x0000);
416 memcpy(cc.bdaddr, bdaddr, 6);
419 send_event(btdev, BT_HCI_EVT_CONN_COMPLETE, &cc, sizeof(cc));
422 static void conn_request(struct btdev *btdev, const uint8_t *bdaddr)
424 struct btdev *remote = find_btdev_by_bdaddr(bdaddr);
427 if (remote->scan_enable & 0x01) {
428 struct bt_hci_evt_conn_request cr;
430 memcpy(cr.bdaddr, btdev->bdaddr, 6);
431 memcpy(cr.dev_class, btdev->dev_class, 3);
434 send_event(remote, BT_HCI_EVT_CONN_REQUEST,
437 conn_complete(btdev, bdaddr, BT_HCI_ERR_PAGE_TIMEOUT);
439 conn_complete(btdev, bdaddr, BT_HCI_ERR_UNKNOWN_CONN_ID);
442 static void disconnect_complete(struct btdev *btdev, uint16_t handle,
445 struct bt_hci_evt_disconnect_complete dc;
446 struct btdev *remote;
449 dc.status = BT_HCI_ERR_UNKNOWN_CONN_ID;
450 dc.handle = cpu_to_le16(handle);
453 send_event(btdev, BT_HCI_EVT_DISCONNECT_COMPLETE,
458 dc.status = BT_HCI_ERR_SUCCESS;
459 dc.handle = cpu_to_le16(handle);
462 remote = btdev->conn;
467 send_event(btdev, BT_HCI_EVT_DISCONNECT_COMPLETE, &dc, sizeof(dc));
468 send_event(remote, BT_HCI_EVT_DISCONNECT_COMPLETE, &dc, sizeof(dc));
471 static void name_request_complete(struct btdev *btdev,
472 const uint8_t *bdaddr, uint8_t status)
474 struct bt_hci_evt_remote_name_req_complete nc;
477 memcpy(nc.bdaddr, bdaddr, 6);
478 memset(nc.name, 0, 248);
481 struct btdev *remote = find_btdev_by_bdaddr(bdaddr);
484 memcpy(nc.name, remote->name, 248);
486 nc.status = BT_HCI_ERR_UNKNOWN_CONN_ID;
489 send_event(btdev, BT_HCI_EVT_REMOTE_NAME_REQUEST_COMPLETE,
493 static void remote_features_complete(struct btdev *btdev, uint16_t handle)
495 struct bt_hci_evt_remote_features_complete rfc;
498 rfc.status = BT_HCI_ERR_SUCCESS;
499 rfc.handle = cpu_to_le16(handle);
500 memcpy(rfc.features, btdev->conn->features, 8);
502 rfc.status = BT_HCI_ERR_UNKNOWN_CONN_ID;
503 rfc.handle = cpu_to_le16(handle);
504 memset(rfc.features, 0, 8);
507 send_event(btdev, BT_HCI_EVT_REMOTE_FEATURES_COMPLETE,
511 static void remote_ext_features_complete(struct btdev *btdev, uint16_t handle,
514 struct bt_hci_evt_remote_ext_features_complete refc;
516 if (btdev->conn && page < 0x02) {
517 refc.handle = cpu_to_le16(handle);
519 refc.max_page = 0x01;
523 refc.status = BT_HCI_ERR_SUCCESS;
524 memcpy(refc.features, btdev->conn->features, 8);
527 refc.status = BT_HCI_ERR_SUCCESS;
528 memset(refc.features, 0, 8);
531 refc.status = BT_HCI_ERR_INVALID_PARAMETERS;
532 memset(refc.features, 0, 8);
536 refc.status = BT_HCI_ERR_UNKNOWN_CONN_ID;
537 refc.handle = cpu_to_le16(handle);
539 refc.max_page = 0x01;
540 memset(refc.features, 0, 8);
543 send_event(btdev, BT_HCI_EVT_REMOTE_EXT_FEATURES_COMPLETE,
544 &refc, sizeof(refc));
547 static void remote_version_complete(struct btdev *btdev, uint16_t handle)
549 struct bt_hci_evt_remote_version_complete rvc;
552 rvc.status = BT_HCI_ERR_SUCCESS;
553 rvc.handle = cpu_to_le16(handle);
554 rvc.lmp_ver = btdev->conn->version;
555 rvc.manufacturer = cpu_to_le16(btdev->conn->manufacturer);
556 rvc.lmp_subver = cpu_to_le16(btdev->conn->revision);
558 rvc.status = BT_HCI_ERR_UNKNOWN_CONN_ID;
559 rvc.handle = cpu_to_le16(handle);
561 rvc.manufacturer = cpu_to_le16(0);
562 rvc.lmp_subver = cpu_to_le16(0);
565 send_event(btdev, BT_HCI_EVT_REMOTE_VERSION_COMPLETE,
569 static void process_cmd(struct btdev *btdev, const void *data, uint16_t len)
571 const struct bt_hci_cmd_hdr *hdr = data;
572 const struct bt_hci_cmd_create_conn *cc;
573 const struct bt_hci_cmd_disconnect *dc;
574 const struct bt_hci_cmd_create_conn_cancel *ccc;
575 const struct bt_hci_cmd_accept_conn_request *acr;
576 const struct bt_hci_cmd_reject_conn_request *rcr;
577 const struct bt_hci_cmd_remote_name_request *rnr;
578 const struct bt_hci_cmd_remote_name_request_cancel *rnrc;
579 const struct bt_hci_cmd_read_remote_features *rrf;
580 const struct bt_hci_cmd_read_remote_ext_features *rref;
581 const struct bt_hci_cmd_read_remote_version *rrv;
582 const struct bt_hci_cmd_write_default_link_policy *wdlp;
583 const struct bt_hci_cmd_set_event_mask *sem;
584 const struct bt_hci_cmd_set_event_filter *sef;
585 const struct bt_hci_cmd_write_local_name *wln;
586 const struct bt_hci_cmd_write_conn_accept_timeout *wcat;
587 const struct bt_hci_cmd_write_page_timeout *wpt;
588 const struct bt_hci_cmd_write_scan_enable *wse;
589 const struct bt_hci_cmd_write_auth_enable *wae;
590 const struct bt_hci_cmd_write_class_of_dev *wcod;
591 const struct bt_hci_cmd_write_voice_setting *wvs;
592 const struct bt_hci_cmd_write_inquiry_mode *wim;
593 const struct bt_hci_cmd_write_afh_assess_mode *waam;
594 const struct bt_hci_cmd_write_ext_inquiry_rsp *weir;
595 const struct bt_hci_cmd_write_simple_pairing_mode *wspm;
596 const struct bt_hci_cmd_write_le_host_supported *wlhs;
597 const struct bt_hci_cmd_le_set_event_mask *lsem;
598 struct bt_hci_rsp_read_default_link_policy rdlp;
599 struct bt_hci_rsp_read_stored_link_key rslk;
600 struct bt_hci_rsp_write_stored_link_key wslk;
601 struct bt_hci_rsp_delete_stored_link_key dslk;
602 struct bt_hci_rsp_read_local_name rln;
603 struct bt_hci_rsp_read_conn_accept_timeout rcat;
604 struct bt_hci_rsp_read_page_timeout rpt;
605 struct bt_hci_rsp_read_scan_enable rse;
606 struct bt_hci_rsp_read_auth_enable rae;
607 struct bt_hci_rsp_read_class_of_dev rcod;
608 struct bt_hci_rsp_read_voice_setting rvs;
609 struct bt_hci_rsp_read_inquiry_mode rim;
610 struct bt_hci_rsp_read_afh_assess_mode raam;
611 struct bt_hci_rsp_read_ext_inquiry_rsp reir;
612 struct bt_hci_rsp_read_simple_pairing_mode rspm;
613 struct bt_hci_rsp_read_inquiry_rsp_tx_power rirtp;
614 struct bt_hci_rsp_read_le_host_supported rlhs;
615 struct bt_hci_rsp_read_local_version rlv;
616 struct bt_hci_rsp_read_local_commands rlc;
617 struct bt_hci_rsp_read_local_features rlf;
618 struct bt_hci_rsp_read_local_ext_features rlef;
619 struct bt_hci_rsp_read_buffer_size rbs;
620 struct bt_hci_rsp_read_country_code rcc;
621 struct bt_hci_rsp_read_bd_addr rba;
622 struct bt_hci_rsp_read_data_block_size rdbs;
623 struct bt_hci_rsp_le_read_buffer_size lrbs;
624 struct bt_hci_rsp_le_read_local_features lrlf;
625 struct bt_hci_rsp_le_read_supported_states lrss;
627 uint8_t status, page;
629 if (len < sizeof(*hdr))
632 opcode = le16_to_cpu(hdr->opcode);
635 case BT_HCI_CMD_INQUIRY:
636 cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
637 inquiry_complete(btdev, BT_HCI_ERR_SUCCESS);
640 case BT_HCI_CMD_INQUIRY_CANCEL:
641 status = BT_HCI_ERR_SUCCESS;
642 cmd_complete(btdev, opcode, &status, sizeof(status));
645 case BT_HCI_CMD_CREATE_CONN:
646 cc = data + sizeof(*hdr);
647 cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
648 conn_request(btdev, cc->bdaddr);
651 case BT_HCI_CMD_DISCONNECT:
652 dc = data + sizeof(*hdr);
653 cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
654 disconnect_complete(btdev, le16_to_cpu(dc->handle), dc->reason);
657 case BT_HCI_CMD_CREATE_CONN_CANCEL:
658 ccc = data + sizeof(*hdr);
659 cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
660 conn_complete(btdev, ccc->bdaddr, BT_HCI_ERR_UNKNOWN_CONN_ID);
663 case BT_HCI_CMD_ACCEPT_CONN_REQUEST:
664 acr = data + sizeof(*hdr);
665 cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
666 conn_complete(btdev, acr->bdaddr, BT_HCI_ERR_SUCCESS);
669 case BT_HCI_CMD_REJECT_CONN_REQUEST:
670 rcr = data + sizeof(*hdr);
671 cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
672 conn_complete(btdev, rcr->bdaddr, BT_HCI_ERR_UNKNOWN_CONN_ID);
675 case BT_HCI_CMD_REMOTE_NAME_REQUEST:
676 rnr = data + sizeof(*hdr);
677 cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
678 name_request_complete(btdev, rnr->bdaddr, BT_HCI_ERR_SUCCESS);
681 case BT_HCI_CMD_REMOTE_NAME_REQUEST_CANCEL:
682 rnrc = data + sizeof(*hdr);
683 status = BT_HCI_ERR_SUCCESS;
684 cmd_complete(btdev, opcode, &status, sizeof(status));
685 name_request_complete(btdev, rnrc->bdaddr,
686 BT_HCI_ERR_UNKNOWN_CONN_ID);
689 case BT_HCI_CMD_READ_REMOTE_FEATURES:
690 rrf = data + sizeof(*hdr);
691 cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
692 remote_features_complete(btdev, le16_to_cpu(rrf->handle));
695 case BT_HCI_CMD_READ_REMOTE_EXT_FEATURES:
696 rref = data + sizeof(*hdr);
697 cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
698 remote_ext_features_complete(btdev, le16_to_cpu(rref->handle),
702 case BT_HCI_CMD_READ_REMOTE_VERSION:
703 rrv = data + sizeof(*hdr);
704 cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
705 remote_version_complete(btdev, le16_to_cpu(rrv->handle));
708 case BT_HCI_CMD_READ_DEFAULT_LINK_POLICY:
709 rdlp.status = BT_HCI_ERR_SUCCESS;
710 rdlp.policy = cpu_to_le16(btdev->default_link_policy);
711 cmd_complete(btdev, opcode, &rdlp, sizeof(rdlp));
714 case BT_HCI_CMD_WRITE_DEFAULT_LINK_POLICY:
715 wdlp = data + sizeof(*hdr);
716 btdev->default_link_policy = le16_to_cpu(wdlp->policy);
717 status = BT_HCI_ERR_SUCCESS;
718 cmd_complete(btdev, opcode, &status, sizeof(status));
721 case BT_HCI_CMD_SET_EVENT_MASK:
722 sem = data + sizeof(*hdr);
723 memcpy(btdev->event_mask, sem->mask, 8);
724 status = BT_HCI_ERR_SUCCESS;
725 cmd_complete(btdev, opcode, &status, sizeof(status));
728 case BT_HCI_CMD_RESET:
729 status = BT_HCI_ERR_SUCCESS;
730 cmd_complete(btdev, opcode, &status, sizeof(status));
733 case BT_HCI_CMD_SET_EVENT_FILTER:
734 sef = data + sizeof(*hdr);
735 btdev->event_filter = sef->type;
736 status = BT_HCI_ERR_SUCCESS;
737 cmd_complete(btdev, opcode, &status, sizeof(status));
740 case BT_HCI_CMD_READ_STORED_LINK_KEY:
741 rslk.status = BT_HCI_ERR_SUCCESS;
742 rslk.max_num_keys = cpu_to_le16(0);
743 rslk.num_keys = cpu_to_le16(0);
744 cmd_complete(btdev, opcode, &rslk, sizeof(rslk));
747 case BT_HCI_CMD_WRITE_STORED_LINK_KEY:
748 wslk.status = BT_HCI_ERR_SUCCESS;
750 cmd_complete(btdev, opcode, &wslk, sizeof(wslk));
753 case BT_HCI_CMD_DELETE_STORED_LINK_KEY:
754 dslk.status = BT_HCI_ERR_SUCCESS;
755 dslk.num_keys = cpu_to_le16(0);
756 cmd_complete(btdev, opcode, &dslk, sizeof(dslk));
759 case BT_HCI_CMD_WRITE_LOCAL_NAME:
760 wln = data + sizeof(*hdr);
761 memcpy(btdev->name, wln->name, 248);
762 status = BT_HCI_ERR_SUCCESS;
763 cmd_complete(btdev, opcode, &status, sizeof(status));
766 case BT_HCI_CMD_READ_LOCAL_NAME:
767 rln.status = BT_HCI_ERR_SUCCESS;
768 memcpy(rln.name, btdev->name, 248);
769 cmd_complete(btdev, opcode, &rln, sizeof(rln));
772 case BT_HCI_CMD_READ_CONN_ACCEPT_TIMEOUT:
773 rcat.status = BT_HCI_ERR_SUCCESS;
774 rcat.timeout = cpu_to_le16(btdev->conn_accept_timeout);
775 cmd_complete(btdev, opcode, &rcat, sizeof(rcat));
778 case BT_HCI_CMD_WRITE_CONN_ACCEPT_TIMEOUT:
779 wcat = data + sizeof(*hdr);
780 btdev->conn_accept_timeout = le16_to_cpu(wcat->timeout);
781 status = BT_HCI_ERR_SUCCESS;
782 cmd_complete(btdev, opcode, &status, sizeof(status));
785 case BT_HCI_CMD_READ_PAGE_TIMEOUT:
786 rpt.status = BT_HCI_ERR_SUCCESS;
787 rpt.timeout = cpu_to_le16(btdev->page_timeout);
788 cmd_complete(btdev, opcode, &rpt, sizeof(rpt));
791 case BT_HCI_CMD_WRITE_PAGE_TIMEOUT:
792 wpt = data + sizeof(*hdr);
793 btdev->page_timeout = le16_to_cpu(wpt->timeout);
794 status = BT_HCI_ERR_SUCCESS;
795 cmd_complete(btdev, opcode, &status, sizeof(status));
798 case BT_HCI_CMD_READ_SCAN_ENABLE:
799 rse.status = BT_HCI_ERR_SUCCESS;
800 rse.enable = btdev->scan_enable;
801 cmd_complete(btdev, opcode, &rse, sizeof(rse));
804 case BT_HCI_CMD_WRITE_SCAN_ENABLE:
805 wse = data + sizeof(*hdr);
806 btdev->scan_enable = wse->enable;
807 status = BT_HCI_ERR_SUCCESS;
808 cmd_complete(btdev, opcode, &status, sizeof(status));
811 case BT_HCI_CMD_READ_AUTH_ENABLE:
812 rae.status = BT_HCI_ERR_SUCCESS;
813 rae.enable = btdev->auth_enable;
814 cmd_complete(btdev, opcode, &rae, sizeof(rae));
817 case BT_HCI_CMD_WRITE_AUTH_ENABLE:
818 wae = data + sizeof(*hdr);
819 btdev->auth_enable = wae->enable;
820 status = BT_HCI_ERR_SUCCESS;
821 cmd_complete(btdev, opcode, &status, sizeof(status));
824 case BT_HCI_CMD_READ_CLASS_OF_DEV:
825 rcod.status = BT_HCI_ERR_SUCCESS;
826 memcpy(rcod.dev_class, btdev->dev_class, 3);
827 cmd_complete(btdev, opcode, &rcod, sizeof(rcod));
830 case BT_HCI_CMD_WRITE_CLASS_OF_DEV:
831 wcod = data + sizeof(*hdr);
832 memcpy(btdev->dev_class, wcod->dev_class, 3);
833 status = BT_HCI_ERR_SUCCESS;
834 cmd_complete(btdev, opcode, &status, sizeof(status));
837 case BT_HCI_CMD_READ_VOICE_SETTING:
838 rvs.status = BT_HCI_ERR_SUCCESS;
839 rvs.setting = cpu_to_le16(btdev->voice_setting);
840 cmd_complete(btdev, opcode, &rvs, sizeof(rvs));
843 case BT_HCI_CMD_WRITE_VOICE_SETTING:
844 wvs = data + sizeof(*hdr);
845 btdev->voice_setting = le16_to_cpu(wvs->setting);
846 status = BT_HCI_ERR_SUCCESS;
847 cmd_complete(btdev, opcode, &status, sizeof(status));
850 case BT_HCI_CMD_READ_INQUIRY_MODE:
851 rim.status = BT_HCI_ERR_SUCCESS;
852 rim.mode = btdev->inquiry_mode;
853 cmd_complete(btdev, opcode, &rim, sizeof(rim));
856 case BT_HCI_CMD_WRITE_INQUIRY_MODE:
857 wim = data + sizeof(*hdr);
858 btdev->inquiry_mode = wim->mode;
859 status = BT_HCI_ERR_SUCCESS;
860 cmd_complete(btdev, opcode, &status, sizeof(status));
863 case BT_HCI_CMD_READ_AFH_ASSESS_MODE:
864 raam.status = BT_HCI_ERR_SUCCESS;
865 raam.mode = btdev->afh_assess_mode;
866 cmd_complete(btdev, opcode, &raam, sizeof(raam));
869 case BT_HCI_CMD_WRITE_AFH_ASSESS_MODE:
870 waam = data + sizeof(*hdr);
871 btdev->afh_assess_mode = waam->mode;
872 status = BT_HCI_ERR_SUCCESS;
873 cmd_complete(btdev, opcode, &status, sizeof(status));
876 case BT_HCI_CMD_READ_EXT_INQUIRY_RSP:
877 reir.status = BT_HCI_ERR_SUCCESS;
878 reir.fec = btdev->ext_inquiry_fec;
879 memcpy(reir.data, btdev->ext_inquiry_rsp, 240);
880 cmd_complete(btdev, opcode, &reir, sizeof(reir));
883 case BT_HCI_CMD_WRITE_EXT_INQUIRY_RSP:
884 weir = data + sizeof(*hdr);
885 btdev->ext_inquiry_fec = weir->fec;
886 memcpy(btdev->ext_inquiry_rsp, weir->data, 240);
887 status = BT_HCI_ERR_SUCCESS;
888 cmd_complete(btdev, opcode, &status, sizeof(status));
891 case BT_HCI_CMD_READ_SIMPLE_PAIRING_MODE:
892 rspm.status = BT_HCI_ERR_SUCCESS;
893 rspm.mode = btdev->simple_pairing_mode;
894 cmd_complete(btdev, opcode, &rspm, sizeof(rspm));
897 case BT_HCI_CMD_WRITE_SIMPLE_PAIRING_MODE:
898 wspm = data + sizeof(*hdr);
899 btdev->simple_pairing_mode = wspm->mode;
900 status = BT_HCI_ERR_SUCCESS;
901 cmd_complete(btdev, opcode, &status, sizeof(status));
904 case BT_HCI_CMD_READ_INQUIRY_RSP_TX_POWER:
905 rirtp.status = BT_HCI_ERR_SUCCESS;
907 cmd_complete(btdev, opcode, &rirtp, sizeof(rirtp));
910 case BT_HCI_CMD_READ_LE_HOST_SUPPORTED:
911 rlhs.status = BT_HCI_ERR_SUCCESS;
912 rlhs.supported = btdev->le_supported;
913 rlhs.simultaneous = btdev->le_simultaneous;
914 cmd_complete(btdev, opcode, &rlhs, sizeof(rlhs));
917 case BT_HCI_CMD_WRITE_LE_HOST_SUPPORTED:
918 wlhs = data + sizeof(*hdr);
919 btdev->le_supported = wlhs->supported;
920 btdev->le_simultaneous = wlhs->simultaneous;
921 status = BT_HCI_ERR_SUCCESS;
922 cmd_complete(btdev, opcode, &status, sizeof(status));
925 case BT_HCI_CMD_READ_LOCAL_VERSION:
926 rlv.status = BT_HCI_ERR_SUCCESS;
927 rlv.hci_ver = btdev->version;
928 rlv.hci_rev = cpu_to_le16(btdev->revision);
929 rlv.lmp_ver = btdev->version;
930 rlv.manufacturer = cpu_to_le16(btdev->manufacturer);
931 rlv.lmp_subver = cpu_to_le16(btdev->revision);
932 cmd_complete(btdev, opcode, &rlv, sizeof(rlv));
935 case BT_HCI_CMD_READ_LOCAL_COMMANDS:
936 rlc.status = BT_HCI_ERR_SUCCESS;
937 memcpy(rlc.commands, btdev->commands, 64);
938 cmd_complete(btdev, opcode, &rlc, sizeof(rlc));
941 case BT_HCI_CMD_READ_LOCAL_FEATURES:
942 rlf.status = BT_HCI_ERR_SUCCESS;
943 memcpy(rlf.features, btdev->features, 8);
944 cmd_complete(btdev, opcode, &rlf, sizeof(rlf));
947 case BT_HCI_CMD_READ_LOCAL_EXT_FEATURES:
948 page = ((const uint8_t *) data)[sizeof(*hdr)];
951 rlef.status = BT_HCI_ERR_SUCCESS;
953 rlef.max_page = 0x01;
954 memcpy(rlef.features, btdev->features, 8);
957 rlef.status = BT_HCI_ERR_SUCCESS;
959 rlef.max_page = 0x01;
960 memset(rlef.features, 0, 8);
961 if (btdev->simple_pairing_mode)
962 rlef.features[0] |= 0x01;
963 if (btdev->le_supported)
964 rlef.features[0] |= 0x02;
965 if (btdev->le_simultaneous)
966 rlef.features[0] |= 0x04;
969 rlef.status = BT_HCI_ERR_INVALID_PARAMETERS;
971 rlef.max_page = 0x01;
972 memset(rlef.features, 0, 8);
975 cmd_complete(btdev, opcode, &rlef, sizeof(rlef));
978 case BT_HCI_CMD_READ_BUFFER_SIZE:
979 rbs.status = BT_HCI_ERR_SUCCESS;
980 rbs.acl_mtu = cpu_to_le16(btdev->acl_mtu);
982 rbs.acl_max_pkt = cpu_to_le16(btdev->acl_max_pkt);
983 rbs.sco_max_pkt = cpu_to_le16(0);
984 cmd_complete(btdev, opcode, &rbs, sizeof(rbs));
987 case BT_HCI_CMD_READ_COUNTRY_CODE:
988 rcc.status = BT_HCI_ERR_SUCCESS;
989 rcc.code = btdev->country_code;
990 cmd_complete(btdev, opcode, &rcc, sizeof(rcc));
993 case BT_HCI_CMD_READ_BD_ADDR:
994 rba.status = BT_HCI_ERR_SUCCESS;
995 memcpy(rba.bdaddr, btdev->bdaddr, 6);
996 cmd_complete(btdev, opcode, &rba, sizeof(rba));
999 case BT_HCI_CMD_READ_DATA_BLOCK_SIZE:
1000 rdbs.status = BT_HCI_ERR_SUCCESS;
1001 rdbs.max_acl_len = cpu_to_le16(btdev->acl_mtu);
1002 rdbs.block_len = cpu_to_le16(btdev->acl_mtu);
1003 rdbs.num_blocks = cpu_to_le16(btdev->acl_max_pkt);
1004 cmd_complete(btdev, opcode, &rdbs, sizeof(rdbs));
1007 case BT_HCI_CMD_LE_SET_EVENT_MASK:
1008 lsem = data + sizeof(*hdr);
1009 memcpy(btdev->le_event_mask, lsem->mask, 8);
1010 status = BT_HCI_ERR_SUCCESS;
1011 cmd_complete(btdev, opcode, &status, sizeof(status));
1014 case BT_HCI_CMD_LE_READ_BUFFER_SIZE:
1015 lrbs.status = BT_HCI_ERR_SUCCESS;
1016 lrbs.le_mtu = cpu_to_le16(btdev->acl_mtu);
1017 lrbs.le_max_pkt = btdev->acl_max_pkt;
1018 cmd_complete(btdev, opcode, &lrbs, sizeof(lrbs));
1021 case BT_HCI_CMD_LE_READ_LOCAL_FEATURES:
1022 lrlf.status = BT_HCI_ERR_SUCCESS;
1023 memcpy(lrlf.features, btdev->le_features, 8);
1024 cmd_complete(btdev, opcode, &lrlf, sizeof(lrlf));
1027 case BT_HCI_CMD_LE_SET_SCAN_PARAMETERS:
1028 status = BT_HCI_ERR_SUCCESS;
1029 cmd_complete(btdev, opcode, &status, sizeof(status));
1032 case BT_HCI_CMD_LE_SET_SCAN_ENABLE:
1033 status = BT_HCI_ERR_SUCCESS;
1034 cmd_complete(btdev, opcode, &status, sizeof(status));
1037 case BT_HCI_CMD_LE_READ_SUPPORTED_STATES:
1038 lrss.status = BT_HCI_ERR_SUCCESS;
1039 memcpy(lrss.states, btdev->le_states, 8);
1040 cmd_complete(btdev, opcode, &lrss, sizeof(lrss));
1044 printf("Unsupported command 0x%4.4x\n", opcode);
1046 cmd_status(btdev, BT_HCI_ERR_UNKNOWN_COMMAND, opcode);
1051 void btdev_receive_h4(struct btdev *btdev, const void *data, uint16_t len)
1061 pkt_type = ((const uint8_t *) data)[0];
1065 process_cmd(btdev, data + 1, len - 1);
1069 send_packet(btdev->conn, data, len);
1070 num_completed_packets(btdev);
1073 printf("Unsupported packet 0x%2.2x\n", pkt_type);