1 /* $NetBSD: l2cap_signal.c,v 1.14 2011/07/27 10:25:09 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: l2cap_signal.c,v 1.14 2011/07/27 10:25:09 plunky Exp $"); 35 36 #include <sys/param.h> 37 #include <sys/kernel.h> 38 #include <sys/mbuf.h> 39 #include <sys/proc.h> 40 #include <sys/queue.h> 41 #include <sys/systm.h> 42 43 #include <netbt/bluetooth.h> 44 #include <netbt/hci.h> 45 #include <netbt/l2cap.h> 46 47 /******************************************************************************* 48 * 49 * L2CAP Signal processing 50 */ 51 52 static void l2cap_recv_command_rej(struct mbuf *, struct hci_link *); 53 static void l2cap_recv_connect_req(struct mbuf *, struct hci_link *); 54 static void l2cap_recv_connect_rsp(struct mbuf *, struct hci_link *); 55 static void l2cap_recv_config_req(struct mbuf *, struct hci_link *); 56 static void l2cap_recv_config_rsp(struct mbuf *, struct hci_link *); 57 static void l2cap_recv_disconnect_req(struct mbuf *, struct hci_link *); 58 static void l2cap_recv_disconnect_rsp(struct mbuf *, struct hci_link *); 59 static void l2cap_recv_info_req(struct mbuf *, struct hci_link *); 60 static int l2cap_send_signal(struct hci_link *, uint8_t, uint8_t, uint16_t, void *); 61 static int l2cap_send_command_rej(struct hci_link *, uint8_t, uint16_t, ...); 62 63 /* 64 * process incoming signal packets (CID 0x0001). Can contain multiple 65 * requests/responses. 66 */ 67 void 68 l2cap_recv_signal(struct mbuf *m, struct hci_link *link) 69 { 70 l2cap_cmd_hdr_t cmd; 71 72 for(;;) { 73 if (m->m_pkthdr.len == 0) 74 goto finish; 75 76 if (m->m_pkthdr.len < sizeof(cmd)) 77 goto reject; 78 79 m_copydata(m, 0, sizeof(cmd), &cmd); 80 cmd.length = le16toh(cmd.length); 81 82 if (m->m_pkthdr.len < sizeof(cmd) + cmd.length) 83 goto reject; 84 85 DPRINTFN(2, "(%s) code %d, ident %d, len %d\n", 86 device_xname(link->hl_unit->hci_dev), 87 cmd.code, cmd.ident, cmd.length); 88 89 switch (cmd.code) { 90 case L2CAP_COMMAND_REJ: 91 if (cmd.length > sizeof(l2cap_cmd_rej_cp)) 92 goto finish; 93 94 l2cap_recv_command_rej(m, link); 95 break; 96 97 case L2CAP_CONNECT_REQ: 98 if (cmd.length != sizeof(l2cap_con_req_cp)) 99 goto reject; 100 101 l2cap_recv_connect_req(m, link); 102 break; 103 104 case L2CAP_CONNECT_RSP: 105 if (cmd.length != sizeof(l2cap_con_rsp_cp)) 106 goto finish; 107 108 l2cap_recv_connect_rsp(m, link); 109 break; 110 111 case L2CAP_CONFIG_REQ: 112 l2cap_recv_config_req(m, link); 113 break; 114 115 case L2CAP_CONFIG_RSP: 116 l2cap_recv_config_rsp(m, link); 117 break; 118 119 case L2CAP_DISCONNECT_REQ: 120 if (cmd.length != sizeof(l2cap_discon_req_cp)) 121 goto reject; 122 123 l2cap_recv_disconnect_req(m, link); 124 break; 125 126 case L2CAP_DISCONNECT_RSP: 127 if (cmd.length != sizeof(l2cap_discon_rsp_cp)) 128 goto finish; 129 130 l2cap_recv_disconnect_rsp(m, link); 131 break; 132 133 case L2CAP_ECHO_REQ: 134 m_adj(m, sizeof(cmd) + cmd.length); 135 l2cap_send_signal(link, L2CAP_ECHO_RSP, cmd.ident, 136 0, NULL); 137 break; 138 139 case L2CAP_ECHO_RSP: 140 m_adj(m, sizeof(cmd) + cmd.length); 141 break; 142 143 case L2CAP_INFO_REQ: 144 if (cmd.length != sizeof(l2cap_info_req_cp)) 145 goto reject; 146 147 l2cap_recv_info_req(m, link); 148 break; 149 150 case L2CAP_INFO_RSP: 151 m_adj(m, sizeof(cmd) + cmd.length); 152 break; 153 154 default: 155 goto reject; 156 } 157 } 158 panic("impossible!"); 159 160 reject: 161 l2cap_send_command_rej(link, cmd.ident, L2CAP_REJ_NOT_UNDERSTOOD); 162 finish: 163 m_freem(m); 164 } 165 166 /* 167 * Process Received Command Reject. For now we dont try to recover gracefully 168 * from this, it probably means that the link is garbled or the other end is 169 * insufficiently capable of handling normal traffic. (not *my* fault, no way!) 170 */ 171 static void 172 l2cap_recv_command_rej(struct mbuf *m, struct hci_link *link) 173 { 174 struct l2cap_req *req; 175 struct l2cap_channel *chan; 176 l2cap_cmd_hdr_t cmd; 177 l2cap_cmd_rej_cp cp; 178 179 m_copydata(m, 0, sizeof(cmd), &cmd); 180 m_adj(m, sizeof(cmd)); 181 182 cmd.length = le16toh(cmd.length); 183 184 m_copydata(m, 0, cmd.length, &cp); 185 m_adj(m, cmd.length); 186 187 req = l2cap_request_lookup(link, cmd.ident); 188 if (req == NULL) 189 return; 190 191 switch (le16toh(cp.reason)) { 192 case L2CAP_REJ_NOT_UNDERSTOOD: 193 /* 194 * I dont know what to do, just move up the timeout 195 */ 196 callout_schedule(&req->lr_rtx, 0); 197 break; 198 199 case L2CAP_REJ_MTU_EXCEEDED: 200 /* 201 * I didnt send any commands over L2CAP_MTU_MINIMUM size, but.. 202 * 203 * XXX maybe we should resend this, instead? 204 */ 205 link->hl_mtu = le16toh(cp.data[0]); 206 callout_schedule(&req->lr_rtx, 0); 207 break; 208 209 case L2CAP_REJ_INVALID_CID: 210 /* 211 * Well, if they dont have such a channel then our channel is 212 * most likely closed. Make it so. 213 */ 214 chan = req->lr_chan; 215 l2cap_request_free(req); 216 if (chan != NULL && chan->lc_state != L2CAP_CLOSED) 217 l2cap_close(chan, ECONNABORTED); 218 219 break; 220 221 default: 222 UNKNOWN(le16toh(cp.reason)); 223 break; 224 } 225 } 226 227 /* 228 * Process Received Connect Request. Find listening channel matching 229 * psm & addr and ask upper layer for a new channel. 230 */ 231 static void 232 l2cap_recv_connect_req(struct mbuf *m, struct hci_link *link) 233 { 234 struct sockaddr_bt laddr, raddr; 235 struct l2cap_channel *chan, *new; 236 l2cap_cmd_hdr_t cmd; 237 l2cap_con_req_cp cp; 238 int err; 239 240 /* extract cmd */ 241 m_copydata(m, 0, sizeof(cmd), &cmd); 242 m_adj(m, sizeof(cmd)); 243 244 /* extract request */ 245 m_copydata(m, 0, sizeof(cp), &cp); 246 m_adj(m, sizeof(cp)); 247 248 cp.scid = le16toh(cp.scid); 249 cp.psm = le16toh(cp.psm); 250 251 memset(&laddr, 0, sizeof(struct sockaddr_bt)); 252 laddr.bt_len = sizeof(struct sockaddr_bt); 253 laddr.bt_family = AF_BLUETOOTH; 254 laddr.bt_psm = cp.psm; 255 bdaddr_copy(&laddr.bt_bdaddr, &link->hl_unit->hci_bdaddr); 256 257 memset(&raddr, 0, sizeof(struct sockaddr_bt)); 258 raddr.bt_len = sizeof(struct sockaddr_bt); 259 raddr.bt_family = AF_BLUETOOTH; 260 raddr.bt_psm = cp.psm; 261 bdaddr_copy(&raddr.bt_bdaddr, &link->hl_bdaddr); 262 263 LIST_FOREACH(chan, &l2cap_listen_list, lc_ncid) { 264 if (chan->lc_laddr.bt_psm != laddr.bt_psm) 265 continue; 266 267 if (!bdaddr_same(&laddr.bt_bdaddr, &chan->lc_laddr.bt_bdaddr) 268 && bdaddr_any(&chan->lc_laddr.bt_bdaddr) == 0) 269 continue; 270 271 new= (*chan->lc_proto->newconn)(chan->lc_upper, &laddr, &raddr); 272 if (new == NULL) 273 continue; 274 275 err = l2cap_cid_alloc(new); 276 if (err) { 277 l2cap_send_connect_rsp(link, cmd.ident, 278 0, cp.scid, 279 L2CAP_NO_RESOURCES); 280 281 (*new->lc_proto->disconnected)(new->lc_upper, err); 282 return; 283 } 284 285 new->lc_link = hci_acl_open(link->hl_unit, &link->hl_bdaddr); 286 KASSERT(new->lc_link == link); 287 288 new->lc_rcid = cp.scid; 289 new->lc_ident = cmd.ident; 290 291 memcpy(&new->lc_laddr, &laddr, sizeof(struct sockaddr_bt)); 292 memcpy(&new->lc_raddr, &raddr, sizeof(struct sockaddr_bt)); 293 294 new->lc_mode = chan->lc_mode; 295 296 err = l2cap_setmode(new); 297 if (err == EINPROGRESS) { 298 new->lc_state = L2CAP_WAIT_SEND_CONNECT_RSP; 299 (*new->lc_proto->connecting)(new->lc_upper); 300 return; 301 } 302 if (err) { 303 new->lc_state = L2CAP_CLOSED; 304 hci_acl_close(link, err); 305 new->lc_link = NULL; 306 307 l2cap_send_connect_rsp(link, cmd.ident, 308 0, cp.scid, 309 L2CAP_NO_RESOURCES); 310 311 (*new->lc_proto->disconnected)(new->lc_upper, err); 312 return; 313 } 314 315 err = l2cap_send_connect_rsp(link, cmd.ident, 316 new->lc_lcid, new->lc_rcid, 317 L2CAP_SUCCESS); 318 if (err) { 319 l2cap_close(new, err); 320 return; 321 } 322 323 new->lc_state = L2CAP_WAIT_CONFIG; 324 new->lc_flags |= (L2CAP_WAIT_CONFIG_REQ | L2CAP_WAIT_CONFIG_RSP); 325 err = l2cap_send_config_req(new); 326 if (err) 327 l2cap_close(new, err); 328 329 return; 330 } 331 332 l2cap_send_connect_rsp(link, cmd.ident, 333 0, cp.scid, 334 L2CAP_PSM_NOT_SUPPORTED); 335 } 336 337 /* 338 * Process Received Connect Response. 339 */ 340 static void 341 l2cap_recv_connect_rsp(struct mbuf *m, struct hci_link *link) 342 { 343 l2cap_cmd_hdr_t cmd; 344 l2cap_con_rsp_cp cp; 345 struct l2cap_req *req; 346 struct l2cap_channel *chan; 347 348 m_copydata(m, 0, sizeof(cmd), &cmd); 349 m_adj(m, sizeof(cmd)); 350 351 m_copydata(m, 0, sizeof(cp), &cp); 352 m_adj(m, sizeof(cp)); 353 354 cp.scid = le16toh(cp.scid); 355 cp.dcid = le16toh(cp.dcid); 356 cp.result = le16toh(cp.result); 357 358 req = l2cap_request_lookup(link, cmd.ident); 359 if (req == NULL || req->lr_code != L2CAP_CONNECT_REQ) 360 return; 361 362 chan = req->lr_chan; 363 if (chan != NULL && chan->lc_lcid != cp.scid) 364 return; 365 366 if (chan == NULL || chan->lc_state != L2CAP_WAIT_RECV_CONNECT_RSP) { 367 l2cap_request_free(req); 368 return; 369 } 370 371 switch (cp.result) { 372 case L2CAP_SUCCESS: 373 /* 374 * Ok, at this point we have a connection to the other party. We 375 * could indicate upstream that we are ready for business and 376 * wait for a "Configure Channel Request" but I'm not so sure 377 * that is required in our case - we will proceed directly to 378 * sending our config request. We set two state bits because in 379 * the config state we are waiting for requests and responses. 380 */ 381 l2cap_request_free(req); 382 chan->lc_rcid = cp.dcid; 383 chan->lc_state = L2CAP_WAIT_CONFIG; 384 chan->lc_flags |= (L2CAP_WAIT_CONFIG_REQ | L2CAP_WAIT_CONFIG_RSP); 385 l2cap_send_config_req(chan); 386 break; 387 388 case L2CAP_PENDING: 389 /* XXX dont release request, should start eRTX timeout? */ 390 (*chan->lc_proto->connecting)(chan->lc_upper); 391 break; 392 393 case L2CAP_PSM_NOT_SUPPORTED: 394 case L2CAP_SECURITY_BLOCK: 395 case L2CAP_NO_RESOURCES: 396 default: 397 l2cap_request_free(req); 398 l2cap_close(chan, ECONNREFUSED); 399 break; 400 } 401 } 402 403 /* 404 * Process Received Config Reqest. 405 */ 406 static void 407 l2cap_recv_config_req(struct mbuf *m, struct hci_link *link) 408 { 409 uint8_t buf[L2CAP_MTU_MINIMUM]; 410 l2cap_cmd_hdr_t cmd; 411 l2cap_cfg_req_cp cp; 412 l2cap_cfg_opt_t opt; 413 l2cap_cfg_opt_val_t val; 414 l2cap_cfg_rsp_cp rp; 415 struct l2cap_channel *chan; 416 int left, len; 417 418 m_copydata(m, 0, sizeof(cmd), &cmd); 419 m_adj(m, sizeof(cmd)); 420 left = le16toh(cmd.length); 421 422 if (left < sizeof(cp)) 423 goto reject; 424 425 m_copydata(m, 0, sizeof(cp), &cp); 426 m_adj(m, sizeof(cp)); 427 left -= sizeof(cp); 428 429 cp.dcid = le16toh(cp.dcid); 430 cp.flags = le16toh(cp.flags); 431 432 chan = l2cap_cid_lookup(cp.dcid); 433 if (chan == NULL || chan->lc_link != link 434 || chan->lc_state != L2CAP_WAIT_CONFIG 435 || (chan->lc_flags & L2CAP_WAIT_CONFIG_REQ) == 0) { 436 /* XXX we should really accept reconfiguration requests */ 437 l2cap_send_command_rej(link, cmd.ident, L2CAP_REJ_INVALID_CID, 438 L2CAP_NULL_CID, cp.dcid); 439 goto out; 440 } 441 442 /* ready our response packet */ 443 rp.scid = htole16(chan->lc_rcid); 444 rp.flags = 0; /* "No Continuation" */ 445 rp.result = L2CAP_SUCCESS; 446 len = sizeof(rp); 447 448 /* 449 * Process the packet. We build the return packet on the fly adding any 450 * unacceptable parameters as we go. As we can only return one result, 451 * unknown option takes precedence so we start our return packet anew 452 * and ignore option values thereafter as they will be re-sent. 453 * 454 * Since we do not support enough options to make overflowing the min 455 * MTU size an issue in normal use, we just reject config requests that 456 * make that happen. This could be because options are repeated or the 457 * packet is corrupted in some way. 458 * 459 * If unknown option types threaten to overflow the packet, we just 460 * ignore them. We can deny them next time. 461 */ 462 while (left > 0) { 463 if (left < sizeof(opt)) 464 goto reject; 465 466 m_copydata(m, 0, sizeof(opt), &opt); 467 m_adj(m, sizeof(opt)); 468 left -= sizeof(opt); 469 470 if (left < opt.length) 471 goto reject; 472 473 switch(opt.type & L2CAP_OPT_HINT_MASK) { 474 case L2CAP_OPT_MTU: 475 if (rp.result == L2CAP_UNKNOWN_OPTION) 476 break; 477 478 if (opt.length != L2CAP_OPT_MTU_SIZE) 479 goto reject; 480 481 m_copydata(m, 0, L2CAP_OPT_MTU_SIZE, &val); 482 val.mtu = le16toh(val.mtu); 483 484 /* 485 * XXX how do we know what the minimum acceptable MTU is 486 * for a channel? Spec says some profiles have a higher 487 * minimum but I have no way to find that out at this 488 * juncture.. 489 */ 490 if (val.mtu < L2CAP_MTU_MINIMUM) { 491 if (len + sizeof(opt) + L2CAP_OPT_MTU_SIZE > sizeof(buf)) 492 goto reject; 493 494 rp.result = L2CAP_UNACCEPTABLE_PARAMS; 495 memcpy(buf + len, &opt, sizeof(opt)); 496 len += sizeof(opt); 497 val.mtu = htole16(L2CAP_MTU_MINIMUM); 498 memcpy(buf + len, &val, L2CAP_OPT_MTU_SIZE); 499 len += L2CAP_OPT_MTU_SIZE; 500 } else 501 chan->lc_omtu = val.mtu; 502 503 break; 504 505 case L2CAP_OPT_FLUSH_TIMO: 506 if (rp.result == L2CAP_UNKNOWN_OPTION) 507 break; 508 509 if (opt.length != L2CAP_OPT_FLUSH_TIMO_SIZE) 510 goto reject; 511 512 /* 513 * I think that this is informational only - he is 514 * informing us of the flush timeout he will be using. 515 * I dont think this affects us in any significant way, 516 * so just ignore this value for now. 517 */ 518 break; 519 520 case L2CAP_OPT_QOS: 521 default: 522 /* ignore hints */ 523 if (opt.type & L2CAP_OPT_HINT_BIT) 524 break; 525 526 /* unknown options supercede all else */ 527 if (rp.result != L2CAP_UNKNOWN_OPTION) { 528 rp.result = L2CAP_UNKNOWN_OPTION; 529 len = sizeof(rp); 530 } 531 532 /* ignore if it don't fit */ 533 if (len + sizeof(opt) > sizeof(buf)) 534 break; 535 536 /* return unknown option type, but no data */ 537 buf[len++] = opt.type; 538 buf[len++] = 0; 539 break; 540 } 541 542 m_adj(m, opt.length); 543 left -= opt.length; 544 } 545 546 rp.result = htole16(rp.result); 547 memcpy(buf, &rp, sizeof(rp)); 548 l2cap_send_signal(link, L2CAP_CONFIG_RSP, cmd.ident, len, buf); 549 550 if ((cp.flags & L2CAP_OPT_CFLAG_BIT) == 0 551 && rp.result == le16toh(L2CAP_SUCCESS)) { 552 553 chan->lc_flags &= ~L2CAP_WAIT_CONFIG_REQ; 554 555 if ((chan->lc_flags & L2CAP_WAIT_CONFIG_RSP) == 0) { 556 chan->lc_state = L2CAP_OPEN; 557 /* XXX how to distinguish REconfiguration? */ 558 (*chan->lc_proto->connected)(chan->lc_upper); 559 } 560 } 561 return; 562 563 reject: 564 l2cap_send_command_rej(link, cmd.ident, L2CAP_REJ_NOT_UNDERSTOOD); 565 out: 566 m_adj(m, left); 567 } 568 569 /* 570 * Process Received Config Response. 571 */ 572 static void 573 l2cap_recv_config_rsp(struct mbuf *m, struct hci_link *link) 574 { 575 l2cap_cmd_hdr_t cmd; 576 l2cap_cfg_rsp_cp cp; 577 l2cap_cfg_opt_t opt; 578 l2cap_cfg_opt_val_t val; 579 struct l2cap_req *req; 580 struct l2cap_channel *chan; 581 int left; 582 583 m_copydata(m, 0, sizeof(cmd), &cmd); 584 m_adj(m, sizeof(cmd)); 585 left = le16toh(cmd.length); 586 587 if (left < sizeof(cp)) 588 goto out; 589 590 m_copydata(m, 0, sizeof(cp), &cp); 591 m_adj(m, sizeof(cp)); 592 left -= sizeof(cp); 593 594 cp.scid = le16toh(cp.scid); 595 cp.flags = le16toh(cp.flags); 596 cp.result = le16toh(cp.result); 597 598 req = l2cap_request_lookup(link, cmd.ident); 599 if (req == NULL || req->lr_code != L2CAP_CONFIG_REQ) 600 goto out; 601 602 chan = req->lr_chan; 603 if (chan != NULL && chan->lc_lcid != cp.scid) 604 goto out; 605 606 l2cap_request_free(req); 607 608 if (chan == NULL || chan->lc_state != L2CAP_WAIT_CONFIG 609 || (chan->lc_flags & L2CAP_WAIT_CONFIG_RSP) == 0) 610 goto out; 611 612 if ((cp.flags & L2CAP_OPT_CFLAG_BIT)) { 613 l2cap_cfg_req_cp rp; 614 615 /* 616 * They have more to tell us and want another ID to 617 * use, so send an empty config request 618 */ 619 if (l2cap_request_alloc(chan, L2CAP_CONFIG_REQ)) 620 goto discon; 621 622 rp.dcid = htole16(cp.scid); 623 rp.flags = 0; 624 625 if (l2cap_send_signal(link, L2CAP_CONFIG_REQ, link->hl_lastid, 626 sizeof(rp), &rp)) 627 goto discon; 628 } 629 630 switch(cp.result) { 631 case L2CAP_SUCCESS: 632 /* 633 * If continuation flag was not set, our config request was 634 * accepted. We may have to wait for their config request to 635 * complete, so check that but otherwise we are open 636 * 637 * There may be 'advisory' values in the packet but we just 638 * ignore those.. 639 */ 640 if ((cp.flags & L2CAP_OPT_CFLAG_BIT) == 0) { 641 chan->lc_flags &= ~L2CAP_WAIT_CONFIG_RSP; 642 643 if ((chan->lc_flags & L2CAP_WAIT_CONFIG_REQ) == 0) { 644 chan->lc_state = L2CAP_OPEN; 645 /* XXX how to distinguish REconfiguration? */ 646 (*chan->lc_proto->connected)(chan->lc_upper); 647 } 648 } 649 goto out; 650 651 case L2CAP_UNACCEPTABLE_PARAMS: 652 /* 653 * Packet contains unacceptable parameters with preferred values 654 */ 655 while (left > 0) { 656 if (left < sizeof(opt)) 657 goto discon; 658 659 m_copydata(m, 0, sizeof(opt), &opt); 660 m_adj(m, sizeof(opt)); 661 left -= sizeof(opt); 662 663 if (left < opt.length) 664 goto discon; 665 666 switch (opt.type) { 667 case L2CAP_OPT_MTU: 668 if (opt.length != L2CAP_OPT_MTU_SIZE) 669 goto discon; 670 671 m_copydata(m, 0, L2CAP_OPT_MTU_SIZE, &val); 672 chan->lc_imtu = le16toh(val.mtu); 673 if (chan->lc_imtu < L2CAP_MTU_MINIMUM) 674 chan->lc_imtu = L2CAP_MTU_DEFAULT; 675 break; 676 677 case L2CAP_OPT_FLUSH_TIMO: 678 if (opt.length != L2CAP_OPT_FLUSH_TIMO_SIZE) 679 goto discon; 680 681 /* 682 * Spec says: If we cannot honor proposed value, 683 * either disconnect or try again with original 684 * value. I can't really see why they want to 685 * interfere with OUR flush timeout in any case 686 * so we just punt for now. 687 */ 688 goto discon; 689 690 case L2CAP_OPT_QOS: 691 break; 692 693 default: 694 UNKNOWN(opt.type); 695 goto discon; 696 } 697 698 m_adj(m, opt.length); 699 left -= opt.length; 700 } 701 702 if ((cp.flags & L2CAP_OPT_CFLAG_BIT) == 0) 703 l2cap_send_config_req(chan); /* no state change */ 704 705 goto out; 706 707 case L2CAP_REJECT: 708 goto discon; 709 710 case L2CAP_UNKNOWN_OPTION: 711 /* 712 * Packet contains options not understood. Turn off unknown 713 * options by setting them to default values (means they will 714 * not be requested again). 715 * 716 * If our option was already off then fail (paranoia?) 717 * 718 * XXX Should we consider that options were set for a reason? 719 */ 720 while (left > 0) { 721 if (left < sizeof(opt)) 722 goto discon; 723 724 m_copydata(m, 0, sizeof(opt), &opt); 725 m_adj(m, sizeof(opt)); 726 left -= sizeof(opt); 727 728 if (left < opt.length) 729 goto discon; 730 731 m_adj(m, opt.length); 732 left -= opt.length; 733 734 switch(opt.type) { 735 case L2CAP_OPT_MTU: 736 if (chan->lc_imtu == L2CAP_MTU_DEFAULT) 737 goto discon; 738 739 chan->lc_imtu = L2CAP_MTU_DEFAULT; 740 break; 741 742 case L2CAP_OPT_FLUSH_TIMO: 743 if (chan->lc_flush == L2CAP_FLUSH_TIMO_DEFAULT) 744 goto discon; 745 746 chan->lc_flush = L2CAP_FLUSH_TIMO_DEFAULT; 747 break; 748 749 case L2CAP_OPT_QOS: 750 break; 751 752 default: 753 UNKNOWN(opt.type); 754 goto discon; 755 } 756 } 757 758 if ((cp.flags & L2CAP_OPT_CFLAG_BIT) == 0) 759 l2cap_send_config_req(chan); /* no state change */ 760 761 goto out; 762 763 default: 764 UNKNOWN(cp.result); 765 goto discon; 766 } 767 768 DPRINTF("how did I get here!?\n"); 769 770 discon: 771 l2cap_send_disconnect_req(chan); 772 l2cap_close(chan, ECONNABORTED); 773 774 out: 775 m_adj(m, left); 776 } 777 778 /* 779 * Process Received Disconnect Request. We must validate scid and dcid 780 * just in case but otherwise this connection is finished. 781 */ 782 static void 783 l2cap_recv_disconnect_req(struct mbuf *m, struct hci_link *link) 784 { 785 l2cap_cmd_hdr_t cmd; 786 l2cap_discon_req_cp cp; 787 l2cap_discon_rsp_cp rp; 788 struct l2cap_channel *chan; 789 790 m_copydata(m, 0, sizeof(cmd), &cmd); 791 m_adj(m, sizeof(cmd)); 792 793 m_copydata(m, 0, sizeof(cp), &cp); 794 m_adj(m, sizeof(cp)); 795 796 cp.scid = le16toh(cp.scid); 797 cp.dcid = le16toh(cp.dcid); 798 799 chan = l2cap_cid_lookup(cp.dcid); 800 if (chan == NULL || chan->lc_link != link || chan->lc_rcid != cp.scid) { 801 l2cap_send_command_rej(link, cmd.ident, L2CAP_REJ_INVALID_CID, 802 cp.dcid, cp.scid); 803 return; 804 } 805 806 rp.dcid = htole16(chan->lc_lcid); 807 rp.scid = htole16(chan->lc_rcid); 808 l2cap_send_signal(link, L2CAP_DISCONNECT_RSP, cmd.ident, 809 sizeof(rp), &rp); 810 811 if (chan->lc_state != L2CAP_CLOSED) 812 l2cap_close(chan, 0); 813 } 814 815 /* 816 * Process Received Disconnect Response. We must validate scid and dcid but 817 * unless we were waiting for this signal, ignore it. 818 */ 819 static void 820 l2cap_recv_disconnect_rsp(struct mbuf *m, struct hci_link *link) 821 { 822 l2cap_cmd_hdr_t cmd; 823 l2cap_discon_rsp_cp cp; 824 struct l2cap_req *req; 825 struct l2cap_channel *chan; 826 827 m_copydata(m, 0, sizeof(cmd), &cmd); 828 m_adj(m, sizeof(cmd)); 829 830 m_copydata(m, 0, sizeof(cp), &cp); 831 m_adj(m, sizeof(cp)); 832 833 cp.scid = le16toh(cp.scid); 834 cp.dcid = le16toh(cp.dcid); 835 836 req = l2cap_request_lookup(link, cmd.ident); 837 if (req == NULL || req->lr_code != L2CAP_DISCONNECT_REQ) 838 return; 839 840 chan = req->lr_chan; 841 if (chan == NULL 842 || chan->lc_lcid != cp.scid 843 || chan->lc_rcid != cp.dcid) 844 return; 845 846 l2cap_request_free(req); 847 848 if (chan->lc_state != L2CAP_WAIT_DISCONNECT) 849 return; 850 851 l2cap_close(chan, 0); 852 } 853 854 /* 855 * Process Received Info Request. 856 */ 857 static void 858 l2cap_recv_info_req(struct mbuf *m, struct hci_link *link) 859 { 860 l2cap_cmd_hdr_t cmd; 861 l2cap_info_req_cp cp; 862 uint8_t rsp[12]; 863 864 m_copydata(m, 0, sizeof(cmd), &cmd); 865 m_adj(m, sizeof(cmd)); 866 867 m_copydata(m, 0, sizeof(cp), &cp); 868 m_adj(m, sizeof(cp)); 869 870 cp.type = le16toh(cp.type); 871 switch(cp.type) { 872 case L2CAP_EXTENDED_FEATURES: 873 /* 874 * 32-bit data field, unused bits set to zero 875 * 876 * octet bit feature 877 * 0 0 Flow control mode 878 * 0 1 Retransmission mode 879 * 0 2 Bi-directional QoS 880 * 0 3 Enhanced retransmission mode 881 * 0 4 Streaming mode 882 * 0 5 FCS option 883 * 0 6 Extended flow specification for BR/EDR 884 * 0 7 Fixed channels (SET) 885 * 1 0 Extended window size 886 * 1 1 Unicast connectionless data reception 887 */ 888 le16enc(rsp + 0, cp.type); 889 le16enc(rsp + 2, L2CAP_SUCCESS); 890 le32enc(rsp + 4, 0x00000080); 891 l2cap_send_signal(link, L2CAP_INFO_RSP, cmd.ident, 8, rsp); 892 break; 893 894 case L2CAP_FIXED_CHANNELS: 895 /* 896 * 64-bit data field, unused bits set to zero 897 * 898 * octet bit channel 899 * 0 0 0x0000 Null 900 * 0 1 0x0001 L2CAP Signalling Channel (SET) 901 * 0 2 0x0002 Connectionless Reception 902 * 0 3 0x0003 AMP Manager Protocol Channel 903 */ 904 le16enc(rsp + 0, cp.type); 905 le16enc(rsp + 2, L2CAP_SUCCESS); 906 le64enc(rsp + 4, 0x0000000000000002); 907 l2cap_send_signal(link, L2CAP_INFO_RSP, cmd.ident, 12, rsp); 908 break; 909 910 case L2CAP_CONNLESS_MTU: 911 default: 912 le16enc(rsp + 0, cp.type); 913 le16enc(rsp + 2, L2CAP_NOT_SUPPORTED); 914 l2cap_send_signal(link, L2CAP_INFO_RSP, cmd.ident, 4, rsp); 915 break; 916 } 917 } 918 919 /* 920 * Construct signal and wrap in C-Frame for link. 921 */ 922 static int 923 l2cap_send_signal(struct hci_link *link, uint8_t code, uint8_t ident, 924 uint16_t length, void *data) 925 { 926 struct mbuf *m; 927 l2cap_hdr_t *hdr; 928 l2cap_cmd_hdr_t *cmd; 929 930 KASSERT(link != NULL); 931 KASSERT(sizeof(l2cap_cmd_hdr_t) + length <= link->hl_mtu); 932 933 m = m_gethdr(M_DONTWAIT, MT_DATA); 934 if (m == NULL) 935 return ENOMEM; 936 937 hdr = mtod(m, l2cap_hdr_t *); 938 cmd = (l2cap_cmd_hdr_t *)(hdr + 1); 939 940 m->m_len = m->m_pkthdr.len = MHLEN; 941 942 /* Command Data */ 943 if (length > 0) 944 m_copyback(m, sizeof(*hdr) + sizeof(*cmd), length, data); 945 946 /* Command Header */ 947 cmd->code = code; 948 cmd->ident = ident; 949 cmd->length = htole16(length); 950 length += sizeof(*cmd); 951 952 /* C-Frame Header */ 953 hdr->length = htole16(length); 954 hdr->dcid = htole16(L2CAP_SIGNAL_CID); 955 length += sizeof(*hdr); 956 957 if (m->m_pkthdr.len != MAX(MHLEN, length)) { 958 m_freem(m); 959 return ENOMEM; 960 } 961 962 m->m_pkthdr.len = length; 963 m->m_len = MIN(length, MHLEN); 964 965 DPRINTFN(2, "(%s) code %d, ident %d, len %d\n", 966 device_xname(link->hl_unit->hci_dev), code, ident, length); 967 968 return hci_acl_send(m, link, NULL); 969 } 970 971 /* 972 * Send Command Reject packet. 973 */ 974 static int 975 l2cap_send_command_rej(struct hci_link *link, uint8_t ident, 976 uint16_t reason, ...) 977 { 978 l2cap_cmd_rej_cp cp; 979 int len = 0; 980 va_list ap; 981 982 va_start(ap, reason); 983 984 cp.reason = htole16(reason); 985 986 switch (reason) { 987 case L2CAP_REJ_NOT_UNDERSTOOD: 988 len = 2; 989 break; 990 991 case L2CAP_REJ_MTU_EXCEEDED: 992 len = 4; 993 cp.data[0] = va_arg(ap, int); /* SigMTU */ 994 cp.data[0] = htole16(cp.data[0]); 995 break; 996 997 case L2CAP_REJ_INVALID_CID: 998 len = 6; 999 cp.data[0] = va_arg(ap, int); /* dcid */ 1000 cp.data[0] = htole16(cp.data[0]); 1001 cp.data[1] = va_arg(ap, int); /* scid */ 1002 cp.data[1] = htole16(cp.data[1]); 1003 break; 1004 1005 default: 1006 UNKNOWN(reason); 1007 return EINVAL; 1008 } 1009 1010 va_end(ap); 1011 1012 return l2cap_send_signal(link, L2CAP_COMMAND_REJ, ident, len, &cp); 1013 } 1014 1015 /* 1016 * Send Connect Request 1017 */ 1018 int 1019 l2cap_send_connect_req(struct l2cap_channel *chan) 1020 { 1021 l2cap_con_req_cp cp; 1022 int err; 1023 1024 err = l2cap_request_alloc(chan, L2CAP_CONNECT_REQ); 1025 if (err) 1026 return err; 1027 1028 cp.psm = htole16(chan->lc_raddr.bt_psm); 1029 cp.scid = htole16(chan->lc_lcid); 1030 1031 return l2cap_send_signal(chan->lc_link, L2CAP_CONNECT_REQ, 1032 chan->lc_link->hl_lastid, sizeof(cp), &cp); 1033 } 1034 1035 /* 1036 * Send Config Request 1037 * 1038 * For outgoing config request, we only put options in the packet if they 1039 * differ from the default and would have to be actioned. We dont support 1040 * enough option types to make overflowing SigMTU an issue so it can all 1041 * go in one packet. 1042 */ 1043 int 1044 l2cap_send_config_req(struct l2cap_channel *chan) 1045 { 1046 l2cap_cfg_req_cp *cp; 1047 l2cap_cfg_opt_t *opt; 1048 l2cap_cfg_opt_val_t *val; 1049 uint8_t *next, buf[L2CAP_MTU_MINIMUM]; 1050 int err; 1051 1052 err = l2cap_request_alloc(chan, L2CAP_CONFIG_REQ); 1053 if (err) 1054 return err; 1055 1056 /* Config Header (4 octets) */ 1057 cp = (l2cap_cfg_req_cp *)buf; 1058 cp->dcid = htole16(chan->lc_rcid); 1059 cp->flags = 0; /* "No Continuation" */ 1060 1061 next = buf + sizeof(l2cap_cfg_req_cp); 1062 1063 /* Incoming MTU (4 octets) */ 1064 if (chan->lc_imtu != L2CAP_MTU_DEFAULT) { 1065 opt = (l2cap_cfg_opt_t *)next; 1066 opt->type = L2CAP_OPT_MTU; 1067 opt->length = L2CAP_OPT_MTU_SIZE; 1068 1069 val = (l2cap_cfg_opt_val_t *)(opt + 1); 1070 val->mtu = htole16(chan->lc_imtu); 1071 1072 next += sizeof(l2cap_cfg_opt_t) + L2CAP_OPT_MTU_SIZE; 1073 } 1074 1075 /* Flush Timeout (4 octets) */ 1076 if (chan->lc_flush != L2CAP_FLUSH_TIMO_DEFAULT) { 1077 opt = (l2cap_cfg_opt_t *)next; 1078 opt->type = L2CAP_OPT_FLUSH_TIMO; 1079 opt->length = L2CAP_OPT_FLUSH_TIMO_SIZE; 1080 1081 val = (l2cap_cfg_opt_val_t *)(opt + 1); 1082 val->flush_timo = htole16(chan->lc_flush); 1083 1084 next += sizeof(l2cap_cfg_opt_t) + L2CAP_OPT_FLUSH_TIMO_SIZE; 1085 } 1086 1087 /* Outgoing QoS Flow (24 octets) */ 1088 /* Retransmission & Flow Control (11 octets) */ 1089 /* 1090 * From here we need to start paying attention to SigMTU as we have 1091 * possibly overflowed the minimum supported.. 1092 */ 1093 1094 return l2cap_send_signal(chan->lc_link, L2CAP_CONFIG_REQ, 1095 chan->lc_link->hl_lastid, (int)(next - buf), buf); 1096 } 1097 1098 /* 1099 * Send Disconnect Request 1100 */ 1101 int 1102 l2cap_send_disconnect_req(struct l2cap_channel *chan) 1103 { 1104 l2cap_discon_req_cp cp; 1105 int err; 1106 1107 err = l2cap_request_alloc(chan, L2CAP_DISCONNECT_REQ); 1108 if (err) 1109 return err; 1110 1111 cp.dcid = htole16(chan->lc_rcid); 1112 cp.scid = htole16(chan->lc_lcid); 1113 1114 return l2cap_send_signal(chan->lc_link, L2CAP_DISCONNECT_REQ, 1115 chan->lc_link->hl_lastid, sizeof(cp), &cp); 1116 } 1117 1118 /* 1119 * Send Connect Response 1120 */ 1121 int 1122 l2cap_send_connect_rsp(struct hci_link *link, uint8_t ident, uint16_t dcid, uint16_t scid, uint16_t result) 1123 { 1124 l2cap_con_rsp_cp cp; 1125 1126 memset(&cp, 0, sizeof(cp)); 1127 cp.dcid = htole16(dcid); 1128 cp.scid = htole16(scid); 1129 cp.result = htole16(result); 1130 1131 return l2cap_send_signal(link, L2CAP_CONNECT_RSP, ident, sizeof(cp), &cp); 1132 } 1133