hci_event.c revision 1.24
1/* $NetBSD: hci_event.c,v 1.24 2015/11/28 09:04:34 plunky Exp $ */ 2 3/*- 4 * Copyright (c) 2005 Iain Hibbert. 5 * Copyright (c) 2006 Itronix Inc. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. The name of Itronix Inc. may not be used to endorse 17 * or promote products derived from this software without specific 18 * prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY 24 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 27 * ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33#include <sys/cdefs.h> 34__KERNEL_RCSID(0, "$NetBSD: hci_event.c,v 1.24 2015/11/28 09:04:34 plunky Exp $"); 35 36#include <sys/param.h> 37#include <sys/kernel.h> 38#include <sys/malloc.h> 39#include <sys/mbuf.h> 40#include <sys/proc.h> 41#include <sys/systm.h> 42 43#include <netbt/bluetooth.h> 44#include <netbt/hci.h> 45#include <netbt/sco.h> 46 47static void hci_event_inquiry_result(struct hci_unit *, struct mbuf *); 48static void hci_event_rssi_result(struct hci_unit *, struct mbuf *); 49static void hci_event_extended_result(struct hci_unit *, struct mbuf *); 50static void hci_event_command_status(struct hci_unit *, struct mbuf *); 51static void hci_event_command_compl(struct hci_unit *, struct mbuf *); 52static void hci_event_con_compl(struct hci_unit *, struct mbuf *); 53static void hci_event_discon_compl(struct hci_unit *, struct mbuf *); 54static void hci_event_con_req(struct hci_unit *, struct mbuf *); 55static void hci_event_num_compl_pkts(struct hci_unit *, struct mbuf *); 56static void hci_event_auth_compl(struct hci_unit *, struct mbuf *); 57static void hci_event_encryption_change(struct hci_unit *, struct mbuf *); 58static void hci_event_change_con_link_key_compl(struct hci_unit *, struct mbuf *); 59static void hci_event_read_clock_offset_compl(struct hci_unit *, struct mbuf *); 60static void hci_cmd_read_bdaddr(struct hci_unit *, struct mbuf *); 61static void hci_cmd_read_buffer_size(struct hci_unit *, struct mbuf *); 62static void hci_cmd_read_local_features(struct hci_unit *, struct mbuf *); 63static void hci_cmd_read_local_extended_features(struct hci_unit *, struct mbuf *); 64static void hci_cmd_read_local_ver(struct hci_unit *, struct mbuf *); 65static void hci_cmd_read_local_commands(struct hci_unit *, struct mbuf *); 66static void hci_cmd_reset(struct hci_unit *, struct mbuf *); 67static void hci_cmd_create_con(struct hci_unit *unit, uint8_t status); 68 69#ifdef BLUETOOTH_DEBUG 70int bluetooth_debug; 71 72static const char *hci_eventnames[] = { 73/* 0x00 */ "NULL", 74/* 0x01 */ "INQUIRY COMPLETE", 75/* 0x02 */ "INQUIRY RESULT", 76/* 0x03 */ "CONN COMPLETE", 77/* 0x04 */ "CONN REQ", 78/* 0x05 */ "DISCONN COMPLETE", 79/* 0x06 */ "AUTH COMPLETE", 80/* 0x07 */ "REMOTE NAME REQ COMPLETE", 81/* 0x08 */ "ENCRYPTION CHANGE", 82/* 0x09 */ "CHANGE CONN LINK KEY COMPLETE", 83/* 0x0a */ "MASTER LINK KEY COMPLETE", 84/* 0x0b */ "READ REMOTE FEATURES COMPLETE", 85/* 0x0c */ "READ REMOTE VERSION INFO COMPLETE", 86/* 0x0d */ "QoS SETUP COMPLETE", 87/* 0x0e */ "COMMAND COMPLETE", 88/* 0x0f */ "COMMAND STATUS", 89/* 0x10 */ "HARDWARE ERROR", 90/* 0x11 */ "FLUSH OCCUR", 91/* 0x12 */ "ROLE CHANGE", 92/* 0x13 */ "NUM COMPLETED PACKETS", 93/* 0x14 */ "MODE CHANGE", 94/* 0x15 */ "RETURN LINK KEYS", 95/* 0x16 */ "PIN CODE REQ", 96/* 0x17 */ "LINK KEY REQ", 97/* 0x18 */ "LINK KEY NOTIFICATION", 98/* 0x19 */ "LOOPBACK COMMAND", 99/* 0x1a */ "DATA BUFFER OVERFLOW", 100/* 0x1b */ "MAX SLOT CHANGE", 101/* 0x1c */ "READ CLOCK OFFSET COMPLETE", 102/* 0x1d */ "CONN PKT TYPE CHANGED", 103/* 0x1e */ "QOS VIOLATION", 104/* 0x1f */ "PAGE SCAN MODE CHANGE", 105/* 0x20 */ "PAGE SCAN REP MODE CHANGE", 106/* 0x21 */ "FLOW SPECIFICATION COMPLETE", 107/* 0x22 */ "RSSI RESULT", 108/* 0x23 */ "READ REMOTE EXT FEATURES", 109/* 0x24 */ "UNKNOWN", 110/* 0x25 */ "UNKNOWN", 111/* 0x26 */ "UNKNOWN", 112/* 0x27 */ "UNKNOWN", 113/* 0x28 */ "UNKNOWN", 114/* 0x29 */ "UNKNOWN", 115/* 0x2a */ "UNKNOWN", 116/* 0x2b */ "UNKNOWN", 117/* 0x2c */ "SCO CON COMPLETE", 118/* 0x2d */ "SCO CON CHANGED", 119/* 0x2e */ "SNIFF SUBRATING", 120/* 0x2f */ "EXTENDED INQUIRY RESULT", 121/* 0x30 */ "ENCRYPTION KEY REFRESH", 122/* 0x31 */ "IO CAPABILITY REQUEST", 123/* 0x32 */ "IO CAPABILITY RESPONSE", 124/* 0x33 */ "USER CONFIRM REQUEST", 125/* 0x34 */ "USER PASSKEY REQUEST", 126/* 0x35 */ "REMOTE OOB DATA REQUEST", 127/* 0x36 */ "SIMPLE PAIRING COMPLETE", 128/* 0x37 */ "UNKNOWN", 129/* 0x38 */ "LINK SUPERVISION TIMEOUT CHANGED", 130/* 0x39 */ "ENHANCED FLUSH COMPLETE", 131/* 0x3a */ "UNKNOWN", 132/* 0x3b */ "USER PASSKEY NOTIFICATION", 133/* 0x3c */ "KEYPRESS NOTIFICATION", 134/* 0x3d */ "REMOTE HOST FEATURES NOTIFICATION", 135}; 136 137static const char * 138hci_eventstr(unsigned int event) 139{ 140 141 if (event < __arraycount(hci_eventnames)) 142 return hci_eventnames[event]; 143 144 switch (event) { 145 case HCI_EVENT_BT_LOGO: /* 0xfe */ 146 return "BT_LOGO"; 147 148 case HCI_EVENT_VENDOR: /* 0xff */ 149 return "VENDOR"; 150 } 151 152 return "UNKNOWN"; 153} 154#endif /* BLUETOOTH_DEBUG */ 155 156/* 157 * process HCI Events 158 * 159 * We will free the mbuf at the end, no need for any sub 160 * functions to handle that. 161 */ 162void 163hci_event(struct mbuf *m, struct hci_unit *unit) 164{ 165 hci_event_hdr_t hdr; 166 167 KASSERT(m->m_flags & M_PKTHDR); 168 169 if (m->m_pkthdr.len < sizeof(hdr)) 170 goto done; 171 172 m_copydata(m, 0, sizeof(hdr), &hdr); 173 m_adj(m, sizeof(hdr)); 174 175 KASSERT(hdr.type == HCI_EVENT_PKT); 176 if (m->m_pkthdr.len != hdr.length) 177 goto done; 178 179 DPRINTFN(1, "(%s) event %s\n", 180 device_xname(unit->hci_dev), hci_eventstr(hdr.event)); 181 182 switch(hdr.event) { 183 case HCI_EVENT_COMMAND_STATUS: 184 hci_event_command_status(unit, m); 185 break; 186 187 case HCI_EVENT_COMMAND_COMPL: 188 hci_event_command_compl(unit, m); 189 break; 190 191 case HCI_EVENT_NUM_COMPL_PKTS: 192 hci_event_num_compl_pkts(unit, m); 193 break; 194 195 case HCI_EVENT_INQUIRY_RESULT: 196 hci_event_inquiry_result(unit, m); 197 break; 198 199 case HCI_EVENT_RSSI_RESULT: 200 hci_event_rssi_result(unit, m); 201 break; 202 203 case HCI_EVENT_EXTENDED_RESULT: 204 hci_event_extended_result(unit, m); 205 break; 206 207 case HCI_EVENT_CON_COMPL: 208 hci_event_con_compl(unit, m); 209 break; 210 211 case HCI_EVENT_DISCON_COMPL: 212 hci_event_discon_compl(unit, m); 213 break; 214 215 case HCI_EVENT_CON_REQ: 216 hci_event_con_req(unit, m); 217 break; 218 219 case HCI_EVENT_AUTH_COMPL: 220 hci_event_auth_compl(unit, m); 221 break; 222 223 case HCI_EVENT_ENCRYPTION_CHANGE: 224 hci_event_encryption_change(unit, m); 225 break; 226 227 case HCI_EVENT_CHANGE_CON_LINK_KEY_COMPL: 228 hci_event_change_con_link_key_compl(unit, m); 229 break; 230 231 case HCI_EVENT_READ_CLOCK_OFFSET_COMPL: 232 hci_event_read_clock_offset_compl(unit, m); 233 break; 234 235 default: 236 break; 237 } 238 239done: 240 m_freem(m); 241} 242 243/* 244 * Command Status 245 * 246 * Restart command queue and post-process any pending commands 247 */ 248static void 249hci_event_command_status(struct hci_unit *unit, struct mbuf *m) 250{ 251 hci_command_status_ep ep; 252 253 if (m->m_pkthdr.len < sizeof(ep)) 254 return; 255 256 m_copydata(m, 0, sizeof(ep), &ep); 257 m_adj(m, sizeof(ep)); 258 259 ep.opcode = le16toh(ep.opcode); 260 261 DPRINTFN(1, "(%s) opcode (%03x|%04x) status = 0x%x num_cmd_pkts = %d\n", 262 device_xname(unit->hci_dev), 263 HCI_OGF(ep.opcode), HCI_OCF(ep.opcode), 264 ep.status, 265 ep.num_cmd_pkts); 266 267 hci_num_cmds(unit, ep.num_cmd_pkts); 268 269 /* 270 * post processing of pending commands 271 */ 272 switch(ep.opcode) { 273 case HCI_CMD_CREATE_CON: 274 hci_cmd_create_con(unit, ep.status); 275 break; 276 277 default: 278 if (ep.status == 0) 279 break; 280 281 aprint_error_dev(unit->hci_dev, 282 "CommandStatus opcode (%03x|%04x) failed (status=0x%02x)\n", 283 HCI_OGF(ep.opcode), HCI_OCF(ep.opcode), 284 ep.status); 285 286 break; 287 } 288} 289 290/* 291 * Command Complete 292 * 293 * Restart command queue and handle the completed command 294 */ 295static void 296hci_event_command_compl(struct hci_unit *unit, struct mbuf *m) 297{ 298 hci_command_compl_ep ep; 299 hci_status_rp rp; 300 301 if (m->m_pkthdr.len < sizeof(ep)) 302 return; 303 304 m_copydata(m, 0, sizeof(ep), &ep); 305 m_adj(m, sizeof(ep)); 306 307 DPRINTFN(1, "(%s) opcode (%03x|%04x) num_cmd_pkts = %d\n", 308 device_xname(unit->hci_dev), 309 HCI_OGF(le16toh(ep.opcode)), HCI_OCF(le16toh(ep.opcode)), 310 ep.num_cmd_pkts); 311 312 hci_num_cmds(unit, ep.num_cmd_pkts); 313 314 /* 315 * I am not sure if this is completely correct, it is not guaranteed 316 * that a command_complete packet will contain the status though most 317 * do seem to. 318 */ 319 m_copydata(m, 0, sizeof(rp), &rp); 320 if (rp.status > 0) 321 aprint_error_dev(unit->hci_dev, 322 "CommandComplete opcode (%03x|%04x) failed (status=0x%02x)\n", 323 HCI_OGF(le16toh(ep.opcode)), HCI_OCF(le16toh(ep.opcode)), 324 rp.status); 325 326 /* 327 * post processing of completed commands 328 */ 329 switch(le16toh(ep.opcode)) { 330 case HCI_CMD_READ_BDADDR: 331 hci_cmd_read_bdaddr(unit, m); 332 break; 333 334 case HCI_CMD_READ_BUFFER_SIZE: 335 hci_cmd_read_buffer_size(unit, m); 336 break; 337 338 case HCI_CMD_READ_LOCAL_FEATURES: 339 hci_cmd_read_local_features(unit, m); 340 break; 341 342 case HCI_CMD_READ_LOCAL_EXTENDED_FEATURES: 343 hci_cmd_read_local_extended_features(unit, m); 344 break; 345 346 case HCI_CMD_READ_LOCAL_VER: 347 hci_cmd_read_local_ver(unit, m); 348 break; 349 350 case HCI_CMD_READ_LOCAL_COMMANDS: 351 hci_cmd_read_local_commands(unit, m); 352 break; 353 354 case HCI_CMD_RESET: 355 hci_cmd_reset(unit, m); 356 break; 357 358 default: 359 break; 360 } 361} 362 363/* 364 * Number of Completed Packets 365 * 366 * This is sent periodically by the Controller telling us how many 367 * buffers are now freed up and which handle was using them. From 368 * this we determine which type of buffer it was and add the qty 369 * back into the relevant packet counter, then restart output on 370 * links that have halted. 371 */ 372static void 373hci_event_num_compl_pkts(struct hci_unit *unit, struct mbuf *m) 374{ 375 hci_num_compl_pkts_ep ep; 376 struct hci_link *link, *next; 377 uint16_t handle, num; 378 int num_acl = 0, num_sco = 0; 379 380 if (m->m_pkthdr.len < sizeof(ep)) 381 return; 382 383 m_copydata(m, 0, sizeof(ep), &ep); 384 m_adj(m, sizeof(ep)); 385 386 while (ep.num_con_handles--) { 387 m_copydata(m, 0, sizeof(handle), &handle); 388 m_adj(m, sizeof(handle)); 389 handle = le16toh(handle); 390 391 m_copydata(m, 0, sizeof(num), &num); 392 m_adj(m, sizeof(num)); 393 num = le16toh(num); 394 395 link = hci_link_lookup_handle(unit, handle); 396 if (link) { 397 if (link->hl_type == HCI_LINK_ACL) { 398 num_acl += num; 399 hci_acl_complete(link, num); 400 } else { 401 num_sco += num; 402 hci_sco_complete(link, num); 403 } 404 } else { 405 /* XXX need to issue Read_Buffer_Size or Reset? */ 406 aprint_error_dev(unit->hci_dev, 407 "unknown handle %d! (losing track of %d packet buffer%s)\n", 408 handle, num, (num == 1 ? "" : "s")); 409 } 410 } 411 412 /* 413 * Move up any queued packets. When a link has sent data, it will move 414 * to the back of the queue - technically then if a link had something 415 * to send and there were still buffers available it could get started 416 * twice but it seemed more important to to handle higher loads fairly 417 * than worry about wasting cycles when we are not busy. 418 */ 419 420 unit->hci_num_acl_pkts += num_acl; 421 unit->hci_num_sco_pkts += num_sco; 422 423 link = TAILQ_FIRST(&unit->hci_links); 424 while (link && (unit->hci_num_acl_pkts > 0 || unit->hci_num_sco_pkts > 0)) { 425 next = TAILQ_NEXT(link, hl_next); 426 427 if (link->hl_type == HCI_LINK_ACL) { 428 if (unit->hci_num_acl_pkts > 0 && link->hl_txqlen > 0) 429 hci_acl_start(link); 430 } else { 431 if (unit->hci_num_sco_pkts > 0 && link->hl_txqlen > 0) 432 hci_sco_start(link); 433 } 434 435 link = next; 436 } 437} 438 439/* 440 * Inquiry Result 441 * 442 * keep a note of devices seen, so we know which unit to use 443 * on outgoing connections 444 */ 445static void 446hci_event_inquiry_result(struct hci_unit *unit, struct mbuf *m) 447{ 448 hci_inquiry_result_ep ep; 449 hci_inquiry_response ir; 450 struct hci_memo *memo; 451 452 if (m->m_pkthdr.len < sizeof(ep)) 453 return; 454 455 m_copydata(m, 0, sizeof(ep), &ep); 456 m_adj(m, sizeof(ep)); 457 458 DPRINTFN(1, "%d response%s\n", ep.num_responses, 459 (ep.num_responses == 1 ? "" : "s")); 460 461 while(ep.num_responses--) { 462 if (m->m_pkthdr.len < sizeof(ir)) 463 return; 464 465 m_copydata(m, 0, sizeof(ir), &ir); 466 m_adj(m, sizeof(ir)); 467 468 DPRINTFN(1, "bdaddr %02x:%02x:%02x:%02x:%02x:%02x\n", 469 ir.bdaddr.b[5], ir.bdaddr.b[4], ir.bdaddr.b[3], 470 ir.bdaddr.b[2], ir.bdaddr.b[1], ir.bdaddr.b[0]); 471 472 memo = hci_memo_new(unit, &ir.bdaddr); 473 if (memo != NULL) { 474 memo->page_scan_rep_mode = ir.page_scan_rep_mode; 475 memo->page_scan_mode = ir.page_scan_mode; 476 memo->clock_offset = ir.clock_offset; 477 } 478 } 479} 480 481/* 482 * Inquiry Result with RSSI 483 * 484 * as above but different packet when RSSI result is enabled 485 */ 486static void 487hci_event_rssi_result(struct hci_unit *unit, struct mbuf *m) 488{ 489 hci_rssi_result_ep ep; 490 hci_rssi_response rr; 491 struct hci_memo *memo; 492 493 if (m->m_pkthdr.len < sizeof(ep)) 494 return; 495 496 m_copydata(m, 0, sizeof(ep), &ep); 497 m_adj(m, sizeof(ep)); 498 499 DPRINTFN(1, "%d response%s\n", ep.num_responses, 500 (ep.num_responses == 1 ? "" : "s")); 501 502 while(ep.num_responses--) { 503 if (m->m_pkthdr.len < sizeof(rr)) 504 return; 505 506 m_copydata(m, 0, sizeof(rr), &rr); 507 m_adj(m, sizeof(rr)); 508 509 DPRINTFN(1, "bdaddr %02x:%02x:%02x:%02x:%02x:%02x\n", 510 rr.bdaddr.b[5], rr.bdaddr.b[4], rr.bdaddr.b[3], 511 rr.bdaddr.b[2], rr.bdaddr.b[1], rr.bdaddr.b[0]); 512 513 memo = hci_memo_new(unit, &rr.bdaddr); 514 if (memo != NULL) { 515 memo->page_scan_rep_mode = rr.page_scan_rep_mode; 516 memo->page_scan_mode = 0; 517 memo->clock_offset = rr.clock_offset; 518 } 519 } 520} 521 522/* 523 * Extended Inquiry Result 524 * 525 * as above but provides only one response and extended service info 526 */ 527static void 528hci_event_extended_result(struct hci_unit *unit, struct mbuf *m) 529{ 530 hci_extended_result_ep ep; 531 struct hci_memo *memo; 532 533 if (m->m_pkthdr.len < sizeof(ep)) 534 return; 535 536 m_copydata(m, 0, sizeof(ep), &ep); 537 m_adj(m, sizeof(ep)); 538 539 if (ep.num_responses != 1) 540 return; 541 542 DPRINTFN(1, "bdaddr %02x:%02x:%02x:%02x:%02x:%02x\n", 543 ep.bdaddr.b[5], ep.bdaddr.b[4], ep.bdaddr.b[3], 544 ep.bdaddr.b[2], ep.bdaddr.b[1], ep.bdaddr.b[0]); 545 546 memo = hci_memo_new(unit, &ep.bdaddr); 547 if (memo != NULL) { 548 memo->page_scan_rep_mode = ep.page_scan_rep_mode; 549 memo->page_scan_mode = 0; 550 memo->clock_offset = ep.clock_offset; 551 } 552} 553 554/* 555 * Connection Complete 556 * 557 * Sent to us when a connection is made. If there is no link 558 * structure already allocated for this, we must have changed 559 * our mind, so just disconnect. 560 */ 561static void 562hci_event_con_compl(struct hci_unit *unit, struct mbuf *m) 563{ 564 hci_con_compl_ep ep; 565 hci_write_link_policy_settings_cp cp; 566 struct hci_link *link; 567 int err; 568 569 if (m->m_pkthdr.len < sizeof(ep)) 570 return; 571 572 m_copydata(m, 0, sizeof(ep), &ep); 573 m_adj(m, sizeof(ep)); 574 575 DPRINTFN(1, "(%s) %s connection complete for " 576 "%02x:%02x:%02x:%02x:%02x:%02x status %#x\n", 577 device_xname(unit->hci_dev), 578 (ep.link_type == HCI_LINK_ACL ? "ACL" : "SCO"), 579 ep.bdaddr.b[5], ep.bdaddr.b[4], ep.bdaddr.b[3], 580 ep.bdaddr.b[2], ep.bdaddr.b[1], ep.bdaddr.b[0], 581 ep.status); 582 583 link = hci_link_lookup_bdaddr(unit, &ep.bdaddr, ep.link_type); 584 585 if (ep.status) { 586 if (link != NULL) { 587 switch (ep.status) { 588 case 0x04: /* "Page Timeout" */ 589 err = EHOSTDOWN; 590 break; 591 592 case 0x08: /* "Connection Timed Out" */ 593 err = ETIMEDOUT; 594 break; 595 596 case 0x16: /* "Connection Terminated by Local Host" */ 597 err = 0; 598 break; 599 600 default: 601 err = ECONNREFUSED; 602 break; 603 } 604 605 hci_link_free(link, err); 606 } 607 608 return; 609 } 610 611 if (link == NULL) { 612 hci_discon_cp dp; 613 614 dp.con_handle = ep.con_handle; 615 dp.reason = 0x13; /* "Remote User Terminated Connection" */ 616 617 hci_send_cmd(unit, HCI_CMD_DISCONNECT, &dp, sizeof(dp)); 618 return; 619 } 620 621 /* XXX could check auth_enable here */ 622 623 if (ep.encryption_mode) 624 link->hl_flags |= (HCI_LINK_AUTH | HCI_LINK_ENCRYPT); 625 626 link->hl_state = HCI_LINK_OPEN; 627 link->hl_handle = HCI_CON_HANDLE(le16toh(ep.con_handle)); 628 629 if (ep.link_type == HCI_LINK_ACL) { 630 cp.con_handle = ep.con_handle; 631 cp.settings = htole16(unit->hci_link_policy); 632 err = hci_send_cmd(unit, HCI_CMD_WRITE_LINK_POLICY_SETTINGS, 633 &cp, sizeof(cp)); 634 if (err) 635 aprint_error_dev(unit->hci_dev, 636 "Warning, could not write link policy\n"); 637 638 err = hci_send_cmd(unit, HCI_CMD_READ_CLOCK_OFFSET, 639 &cp.con_handle, sizeof(cp.con_handle)); 640 if (err) 641 aprint_error_dev(unit->hci_dev, 642 "Warning, could not read clock offset\n"); 643 644 err = hci_acl_setmode(link); 645 if (err == EINPROGRESS) 646 return; 647 648 hci_acl_linkmode(link); 649 } else { 650 (*link->hl_sco->sp_proto->connected)(link->hl_sco->sp_upper); 651 } 652} 653 654/* 655 * Disconnection Complete 656 * 657 * This is sent in response to a disconnection request, but also if 658 * the remote device goes out of range. 659 */ 660static void 661hci_event_discon_compl(struct hci_unit *unit, struct mbuf *m) 662{ 663 hci_discon_compl_ep ep; 664 struct hci_link *link; 665 666 if (m->m_pkthdr.len < sizeof(ep)) 667 return; 668 669 m_copydata(m, 0, sizeof(ep), &ep); 670 m_adj(m, sizeof(ep)); 671 672 ep.con_handle = le16toh(ep.con_handle); 673 674 DPRINTFN(1, "handle #%d, status=0x%x\n", ep.con_handle, ep.status); 675 676 link = hci_link_lookup_handle(unit, HCI_CON_HANDLE(ep.con_handle)); 677 if (link) 678 hci_link_free(link, ENOLINK); 679} 680 681/* 682 * Connect Request 683 * 684 * We check upstream for appropriate listeners and accept connections 685 * that are wanted. 686 */ 687static void 688hci_event_con_req(struct hci_unit *unit, struct mbuf *m) 689{ 690 hci_con_req_ep ep; 691 hci_accept_con_cp ap; 692 hci_reject_con_cp rp; 693 struct hci_link *link; 694 695 if (m->m_pkthdr.len < sizeof(ep)) 696 return; 697 698 m_copydata(m, 0, sizeof(ep), &ep); 699 m_adj(m, sizeof(ep)); 700 701 DPRINTFN(1, "bdaddr %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x " 702 "class %2.2x%2.2x%2.2x type %s\n", 703 ep.bdaddr.b[5], ep.bdaddr.b[4], ep.bdaddr.b[3], 704 ep.bdaddr.b[2], ep.bdaddr.b[1], ep.bdaddr.b[0], 705 ep.uclass[0], ep.uclass[1], ep.uclass[2], 706 ep.link_type == HCI_LINK_ACL ? "ACL" : "SCO"); 707 708 if (ep.link_type == HCI_LINK_ACL) 709 link = hci_acl_newconn(unit, &ep.bdaddr); 710 else 711 link = hci_sco_newconn(unit, &ep.bdaddr); 712 713 if (link == NULL) { 714 memset(&rp, 0, sizeof(rp)); 715 bdaddr_copy(&rp.bdaddr, &ep.bdaddr); 716 rp.reason = 0x0f; /* Unacceptable BD_ADDR */ 717 718 hci_send_cmd(unit, HCI_CMD_REJECT_CON, &rp, sizeof(rp)); 719 } else { 720 memset(&ap, 0, sizeof(ap)); 721 bdaddr_copy(&ap.bdaddr, &ep.bdaddr); 722 if (unit->hci_flags & BTF_MASTER) 723 ap.role = HCI_ROLE_MASTER; 724 else 725 ap.role = HCI_ROLE_SLAVE; 726 727 hci_send_cmd(unit, HCI_CMD_ACCEPT_CON, &ap, sizeof(ap)); 728 } 729} 730 731/* 732 * Auth Complete 733 * 734 * Authentication has been completed on an ACL link. We can notify the 735 * upper layer protocols unless further mode changes are pending. 736 */ 737static void 738hci_event_auth_compl(struct hci_unit *unit, struct mbuf *m) 739{ 740 hci_auth_compl_ep ep; 741 struct hci_link *link; 742 int err; 743 744 if (m->m_pkthdr.len < sizeof(ep)) 745 return; 746 747 m_copydata(m, 0, sizeof(ep), &ep); 748 m_adj(m, sizeof(ep)); 749 750 ep.con_handle = HCI_CON_HANDLE(le16toh(ep.con_handle)); 751 752 DPRINTFN(1, "handle #%d, status=0x%x\n", ep.con_handle, ep.status); 753 754 link = hci_link_lookup_handle(unit, ep.con_handle); 755 if (link == NULL || link->hl_type != HCI_LINK_ACL) 756 return; 757 758 if (ep.status == 0) { 759 link->hl_flags |= HCI_LINK_AUTH; 760 761 if (link->hl_state == HCI_LINK_WAIT_AUTH) 762 link->hl_state = HCI_LINK_OPEN; 763 764 err = hci_acl_setmode(link); 765 if (err == EINPROGRESS) 766 return; 767 } 768 769 hci_acl_linkmode(link); 770} 771 772/* 773 * Encryption Change 774 * 775 * The encryption status has changed. Basically, we note the change 776 * then notify the upper layer protocol unless further mode changes 777 * are pending. 778 * Note that if encryption gets disabled when it has been requested, 779 * we will attempt to enable it again.. (its a feature not a bug :) 780 */ 781static void 782hci_event_encryption_change(struct hci_unit *unit, struct mbuf *m) 783{ 784 hci_encryption_change_ep ep; 785 struct hci_link *link; 786 int err; 787 788 if (m->m_pkthdr.len < sizeof(ep)) 789 return; 790 791 m_copydata(m, 0, sizeof(ep), &ep); 792 m_adj(m, sizeof(ep)); 793 794 ep.con_handle = HCI_CON_HANDLE(le16toh(ep.con_handle)); 795 796 DPRINTFN(1, "handle #%d, status=0x%x, encryption_enable=0x%x\n", 797 ep.con_handle, ep.status, ep.encryption_enable); 798 799 link = hci_link_lookup_handle(unit, ep.con_handle); 800 if (link == NULL || link->hl_type != HCI_LINK_ACL) 801 return; 802 803 if (ep.status == 0) { 804 if (ep.encryption_enable == 0) 805 link->hl_flags &= ~HCI_LINK_ENCRYPT; 806 else 807 link->hl_flags |= (HCI_LINK_AUTH | HCI_LINK_ENCRYPT); 808 809 if (link->hl_state == HCI_LINK_WAIT_ENCRYPT) 810 link->hl_state = HCI_LINK_OPEN; 811 812 err = hci_acl_setmode(link); 813 if (err == EINPROGRESS) 814 return; 815 } 816 817 hci_acl_linkmode(link); 818} 819 820/* 821 * Change Connection Link Key Complete 822 * 823 * Link keys are handled in userland but if we are waiting to secure 824 * this link, we should notify the upper protocols. A SECURE request 825 * only needs a single key change, so we can cancel the request. 826 */ 827static void 828hci_event_change_con_link_key_compl(struct hci_unit *unit, struct mbuf *m) 829{ 830 hci_change_con_link_key_compl_ep ep; 831 struct hci_link *link; 832 int err; 833 834 if (m->m_pkthdr.len < sizeof(ep)) 835 return; 836 837 m_copydata(m, 0, sizeof(ep), &ep); 838 m_adj(m, sizeof(ep)); 839 840 ep.con_handle = HCI_CON_HANDLE(le16toh(ep.con_handle)); 841 842 DPRINTFN(1, "handle #%d, status=0x%x\n", ep.con_handle, ep.status); 843 844 link = hci_link_lookup_handle(unit, ep.con_handle); 845 if (link == NULL || link->hl_type != HCI_LINK_ACL) 846 return; 847 848 link->hl_flags &= ~HCI_LINK_SECURE_REQ; 849 850 if (ep.status == 0) { 851 link->hl_flags |= (HCI_LINK_AUTH | HCI_LINK_SECURE); 852 853 if (link->hl_state == HCI_LINK_WAIT_SECURE) 854 link->hl_state = HCI_LINK_OPEN; 855 856 err = hci_acl_setmode(link); 857 if (err == EINPROGRESS) 858 return; 859 } 860 861 hci_acl_linkmode(link); 862} 863 864/* 865 * Read Clock Offset Complete 866 * 867 * We keep a note of the clock offset of remote devices when a 868 * link is made, in order to facilitate reconnections to the device 869 */ 870static void 871hci_event_read_clock_offset_compl(struct hci_unit *unit, struct mbuf *m) 872{ 873 hci_read_clock_offset_compl_ep ep; 874 struct hci_link *link; 875 876 if (m->m_pkthdr.len < sizeof(ep)) 877 return; 878 879 m_copydata(m, 0, sizeof(ep), &ep); 880 m_adj(m, sizeof(ep)); 881 882 DPRINTFN(1, "handle #%d, offset=%u, status=0x%x\n", 883 le16toh(ep.con_handle), le16toh(ep.clock_offset), ep.status); 884 885 ep.con_handle = HCI_CON_HANDLE(le16toh(ep.con_handle)); 886 link = hci_link_lookup_handle(unit, ep.con_handle); 887 if (link == NULL || link->hl_type != HCI_LINK_ACL) 888 return; 889 890 if (ep.status == 0) 891 link->hl_clock = ep.clock_offset; 892} 893 894/* 895 * process results of read_bdaddr command_complete event 896 */ 897static void 898hci_cmd_read_bdaddr(struct hci_unit *unit, struct mbuf *m) 899{ 900 hci_read_bdaddr_rp rp; 901 902 if (m->m_pkthdr.len < sizeof(rp)) 903 return; 904 905 m_copydata(m, 0, sizeof(rp), &rp); 906 m_adj(m, sizeof(rp)); 907 908 if (rp.status > 0) 909 return; 910 911 if ((unit->hci_flags & BTF_INIT_BDADDR) == 0) 912 return; 913 914 bdaddr_copy(&unit->hci_bdaddr, &rp.bdaddr); 915 916 unit->hci_flags &= ~BTF_INIT_BDADDR; 917 918 cv_broadcast(&unit->hci_init); 919} 920 921/* 922 * process results of read_buffer_size command_complete event 923 */ 924static void 925hci_cmd_read_buffer_size(struct hci_unit *unit, struct mbuf *m) 926{ 927 hci_read_buffer_size_rp rp; 928 929 if (m->m_pkthdr.len < sizeof(rp)) 930 return; 931 932 m_copydata(m, 0, sizeof(rp), &rp); 933 m_adj(m, sizeof(rp)); 934 935 if (rp.status > 0) 936 return; 937 938 if ((unit->hci_flags & BTF_INIT_BUFFER_SIZE) == 0) 939 return; 940 941 unit->hci_max_acl_size = le16toh(rp.max_acl_size); 942 unit->hci_num_acl_pkts = le16toh(rp.num_acl_pkts); 943 unit->hci_max_acl_pkts = le16toh(rp.num_acl_pkts); 944 unit->hci_max_sco_size = rp.max_sco_size; 945 unit->hci_num_sco_pkts = le16toh(rp.num_sco_pkts); 946 unit->hci_max_sco_pkts = le16toh(rp.num_sco_pkts); 947 948 unit->hci_flags &= ~BTF_INIT_BUFFER_SIZE; 949 950 cv_broadcast(&unit->hci_init); 951} 952 953/* 954 * process results of read_local_features command_complete event 955 */ 956static void 957hci_cmd_read_local_features(struct hci_unit *unit, struct mbuf *m) 958{ 959 hci_read_local_features_rp rp; 960 961 if (m->m_pkthdr.len < sizeof(rp)) 962 return; 963 964 m_copydata(m, 0, sizeof(rp), &rp); 965 m_adj(m, sizeof(rp)); 966 967 if (rp.status > 0) 968 return; 969 970 if ((unit->hci_flags & BTF_INIT_FEATURES) == 0) 971 return; 972 973 memcpy(unit->hci_feat0, rp.features, HCI_FEATURES_SIZE); 974 975 unit->hci_lmp_mask = 0; 976 977 if (rp.features[0] & HCI_LMP_ROLE_SWITCH) 978 unit->hci_lmp_mask |= HCI_LINK_POLICY_ENABLE_ROLE_SWITCH; 979 980 if (rp.features[0] & HCI_LMP_HOLD_MODE) 981 unit->hci_lmp_mask |= HCI_LINK_POLICY_ENABLE_HOLD_MODE; 982 983 if (rp.features[0] & HCI_LMP_SNIFF_MODE) 984 unit->hci_lmp_mask |= HCI_LINK_POLICY_ENABLE_SNIFF_MODE; 985 986 if (rp.features[1] & HCI_LMP_PARK_MODE) 987 unit->hci_lmp_mask |= HCI_LINK_POLICY_ENABLE_PARK_MODE; 988 989 DPRINTFN(1, "%s: lmp_mask %4.4x\n", 990 device_xname(unit->hci_dev), unit->hci_lmp_mask); 991 992 /* ACL packet mask */ 993 unit->hci_acl_mask = HCI_PKT_DM1 | HCI_PKT_DH1; 994 995 if (rp.features[0] & HCI_LMP_3SLOT) 996 unit->hci_acl_mask |= HCI_PKT_DM3 | HCI_PKT_DH3; 997 998 if (rp.features[0] & HCI_LMP_5SLOT) 999 unit->hci_acl_mask |= HCI_PKT_DM5 | HCI_PKT_DH5; 1000 1001 if ((rp.features[3] & HCI_LMP_EDR_ACL_2MBPS) == 0) 1002 unit->hci_acl_mask |= HCI_PKT_2MBPS_DH1 1003 | HCI_PKT_2MBPS_DH3 1004 | HCI_PKT_2MBPS_DH5; 1005 1006 if ((rp.features[3] & HCI_LMP_EDR_ACL_3MBPS) == 0) 1007 unit->hci_acl_mask |= HCI_PKT_3MBPS_DH1 1008 | HCI_PKT_3MBPS_DH3 1009 | HCI_PKT_3MBPS_DH5; 1010 1011 if ((rp.features[4] & HCI_LMP_3SLOT_EDR_ACL) == 0) 1012 unit->hci_acl_mask |= HCI_PKT_2MBPS_DH3 1013 | HCI_PKT_3MBPS_DH3; 1014 1015 if ((rp.features[5] & HCI_LMP_5SLOT_EDR_ACL) == 0) 1016 unit->hci_acl_mask |= HCI_PKT_2MBPS_DH5 1017 | HCI_PKT_3MBPS_DH5; 1018 1019 DPRINTFN(1, "%s: acl_mask %4.4x\n", 1020 device_xname(unit->hci_dev), unit->hci_acl_mask); 1021 1022 unit->hci_packet_type = unit->hci_acl_mask; 1023 1024 /* SCO packet mask */ 1025 unit->hci_sco_mask = 0; 1026 if (rp.features[1] & HCI_LMP_SCO_LINK) 1027 unit->hci_sco_mask |= HCI_PKT_HV1; 1028 1029 if (rp.features[1] & HCI_LMP_HV2_PKT) 1030 unit->hci_sco_mask |= HCI_PKT_HV2; 1031 1032 if (rp.features[1] & HCI_LMP_HV3_PKT) 1033 unit->hci_sco_mask |= HCI_PKT_HV3; 1034 1035 if (rp.features[3] & HCI_LMP_EV3_PKT) 1036 unit->hci_sco_mask |= HCI_PKT_EV3; 1037 1038 if (rp.features[4] & HCI_LMP_EV4_PKT) 1039 unit->hci_sco_mask |= HCI_PKT_EV4; 1040 1041 if (rp.features[4] & HCI_LMP_EV5_PKT) 1042 unit->hci_sco_mask |= HCI_PKT_EV5; 1043 1044 /* XXX what do 2MBPS/3MBPS/3SLOT eSCO mean? */ 1045 1046 DPRINTFN(1, "%s: sco_mask %4.4x\n", 1047 device_xname(unit->hci_dev), unit->hci_sco_mask); 1048 1049 /* extended feature masks */ 1050 if (rp.features[7] & HCI_LMP_EXTENDED_FEATURES) { 1051 hci_read_local_extended_features_cp cp; 1052 1053 cp.page = 0; 1054 hci_send_cmd(unit, HCI_CMD_READ_LOCAL_EXTENDED_FEATURES, 1055 &cp, sizeof(cp)); 1056 1057 return; 1058 } 1059 1060 unit->hci_flags &= ~BTF_INIT_FEATURES; 1061 cv_broadcast(&unit->hci_init); 1062} 1063 1064/* 1065 * process results of read_local_extended_features command_complete event 1066 */ 1067static void 1068hci_cmd_read_local_extended_features(struct hci_unit *unit, struct mbuf *m) 1069{ 1070 hci_read_local_extended_features_rp rp; 1071 1072 if (m->m_pkthdr.len < sizeof(rp)) 1073 return; 1074 1075 m_copydata(m, 0, sizeof(rp), &rp); 1076 m_adj(m, sizeof(rp)); 1077 1078 if (rp.status > 0) 1079 return; 1080 1081 if ((unit->hci_flags & BTF_INIT_FEATURES) == 0) 1082 return; 1083 1084 DPRINTFN(1, "%s: page %d of %d\n", device_xname(unit->hci_dev), 1085 rp.page, rp.max_page); 1086 1087 switch (rp.page) { 1088 case 2: 1089 memcpy(unit->hci_feat2, rp.features, HCI_FEATURES_SIZE); 1090 break; 1091 1092 case 1: 1093 memcpy(unit->hci_feat1, rp.features, HCI_FEATURES_SIZE); 1094 break; 1095 1096 case 0: /* (already handled) */ 1097 default: 1098 break; 1099 } 1100 1101 if (rp.page < rp.max_page) { 1102 hci_read_local_extended_features_cp cp; 1103 1104 cp.page = rp.page + 1; 1105 hci_send_cmd(unit, HCI_CMD_READ_LOCAL_EXTENDED_FEATURES, 1106 &cp, sizeof(cp)); 1107 1108 return; 1109 } 1110 1111 unit->hci_flags &= ~BTF_INIT_FEATURES; 1112 cv_broadcast(&unit->hci_init); 1113} 1114 1115/* 1116 * process results of read_local_ver command_complete event 1117 * 1118 * reading local supported commands is only supported from 1.2 spec 1119 */ 1120static void 1121hci_cmd_read_local_ver(struct hci_unit *unit, struct mbuf *m) 1122{ 1123 hci_read_local_ver_rp rp; 1124 1125 if (m->m_pkthdr.len < sizeof(rp)) 1126 return; 1127 1128 m_copydata(m, 0, sizeof(rp), &rp); 1129 m_adj(m, sizeof(rp)); 1130 1131 if (rp.status != 0) 1132 return; 1133 1134 if ((unit->hci_flags & BTF_INIT_COMMANDS) == 0) 1135 return; 1136 1137 if (rp.hci_version < HCI_SPEC_V12) { 1138 unit->hci_flags &= ~BTF_INIT_COMMANDS; 1139 cv_broadcast(&unit->hci_init); 1140 return; 1141 } 1142 1143 hci_send_cmd(unit, HCI_CMD_READ_LOCAL_COMMANDS, NULL, 0); 1144} 1145 1146/* 1147 * process results of read_local_commands command_complete event 1148 */ 1149static void 1150hci_cmd_read_local_commands(struct hci_unit *unit, struct mbuf *m) 1151{ 1152 hci_read_local_commands_rp rp; 1153 1154 if (m->m_pkthdr.len < sizeof(rp)) 1155 return; 1156 1157 m_copydata(m, 0, sizeof(rp), &rp); 1158 m_adj(m, sizeof(rp)); 1159 1160 if (rp.status != 0) 1161 return; 1162 1163 if ((unit->hci_flags & BTF_INIT_COMMANDS) == 0) 1164 return; 1165 1166 unit->hci_flags &= ~BTF_INIT_COMMANDS; 1167 memcpy(unit->hci_cmds, rp.commands, HCI_COMMANDS_SIZE); 1168 1169 cv_broadcast(&unit->hci_init); 1170} 1171 1172/* 1173 * process results of reset command_complete event 1174 * 1175 * This has killed all the connections, so close down anything we have left, 1176 * and reinitialise the unit. 1177 */ 1178static void 1179hci_cmd_reset(struct hci_unit *unit, struct mbuf *m) 1180{ 1181 hci_reset_rp rp; 1182 struct hci_link *link, *next; 1183 int acl; 1184 1185 if (m->m_pkthdr.len < sizeof(rp)) 1186 return; 1187 1188 m_copydata(m, 0, sizeof(rp), &rp); 1189 m_adj(m, sizeof(rp)); 1190 1191 if (rp.status != 0) 1192 return; 1193 1194 /* 1195 * release SCO links first, since they may be holding 1196 * an ACL link reference. 1197 */ 1198 for (acl = 0 ; acl < 2 ; acl++) { 1199 next = TAILQ_FIRST(&unit->hci_links); 1200 while ((link = next) != NULL) { 1201 next = TAILQ_NEXT(link, hl_next); 1202 if (acl || link->hl_type != HCI_LINK_ACL) 1203 hci_link_free(link, ECONNABORTED); 1204 } 1205 } 1206 1207 unit->hci_num_acl_pkts = 0; 1208 unit->hci_num_sco_pkts = 0; 1209 1210 if (hci_send_cmd(unit, HCI_CMD_READ_BDADDR, NULL, 0)) 1211 return; 1212 1213 if (hci_send_cmd(unit, HCI_CMD_READ_BUFFER_SIZE, NULL, 0)) 1214 return; 1215 1216 if (hci_send_cmd(unit, HCI_CMD_READ_LOCAL_FEATURES, NULL, 0)) 1217 return; 1218 1219 if (hci_send_cmd(unit, HCI_CMD_READ_LOCAL_VER, NULL, 0)) 1220 return; 1221} 1222 1223/* 1224 * process command_status event for create_con command 1225 * 1226 * a "Create Connection" command can sometimes fail to start for whatever 1227 * reason and the command_status event returns failure but we get no 1228 * indication of which connection failed (for instance in the case where 1229 * we tried to open too many connections all at once) So, we keep a flag 1230 * on the link to indicate pending status until the command_status event 1231 * is returned to help us decide which needs to be failed. 1232 * 1233 * since created links are inserted at the tail of hci_links, we know that 1234 * the first pending link we find will be the one that this command status 1235 * refers to. 1236 */ 1237static void 1238hci_cmd_create_con(struct hci_unit *unit, uint8_t status) 1239{ 1240 struct hci_link *link; 1241 1242 TAILQ_FOREACH(link, &unit->hci_links, hl_next) { 1243 if ((link->hl_flags & HCI_LINK_CREATE_CON) == 0) 1244 continue; 1245 1246 link->hl_flags &= ~HCI_LINK_CREATE_CON; 1247 1248 switch(status) { 1249 case 0x00: /* success */ 1250 break; 1251 1252 case 0x0c: /* "Command Disallowed" */ 1253 hci_link_free(link, EBUSY); 1254 break; 1255 1256 default: /* some other trouble */ 1257 hci_link_free(link, EPROTO); 1258 break; 1259 } 1260 1261 return; 1262 } 1263} 1264