1 /* $NetBSD: l2cap_upper.c,v 1.1 2006/06/19 15:44:45 gdamore 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_upper.c,v 1.1 2006/06/19 15:44:45 gdamore 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/socket.h> 42 #include <sys/socketvar.h> 43 #include <sys/systm.h> 44 45 #include <netbt/bluetooth.h> 46 #include <netbt/hci.h> 47 #include <netbt/l2cap.h> 48 49 /******************************************************************************* 50 * 51 * L2CAP Channel - Upper Protocol API 52 */ 53 54 /* 55 * l2cap_attach(handle, btproto, upper) 56 * 57 * attach new l2cap_channel to handle, populate 58 * with with reasonable defaults 59 */ 60 int 61 l2cap_attach(struct l2cap_channel **handle, 62 const struct btproto *proto, void *upper) 63 { 64 struct l2cap_channel *chan; 65 66 KASSERT(handle); 67 KASSERT(proto); 68 KASSERT(upper); 69 70 chan = malloc(sizeof(struct l2cap_channel), M_BLUETOOTH, 71 M_NOWAIT | M_ZERO); 72 if (chan == NULL) 73 return ENOMEM; 74 75 chan->lc_proto = proto; 76 chan->lc_upper = upper; 77 78 chan->lc_state = L2CAP_CLOSED; 79 80 chan->lc_lcid = L2CAP_NULL_CID; 81 chan->lc_rcid = L2CAP_NULL_CID; 82 83 chan->lc_laddr.bt_len = sizeof(struct sockaddr_bt); 84 chan->lc_laddr.bt_family = AF_BLUETOOTH; 85 chan->lc_laddr.bt_psm = L2CAP_PSM_ANY; 86 87 chan->lc_raddr.bt_len = sizeof(struct sockaddr_bt); 88 chan->lc_raddr.bt_family = AF_BLUETOOTH; 89 chan->lc_raddr.bt_psm = L2CAP_PSM_ANY; 90 91 chan->lc_imtu = L2CAP_MTU_DEFAULT; 92 chan->lc_omtu = L2CAP_MTU_DEFAULT; 93 chan->lc_flush = L2CAP_FLUSH_TIMO_DEFAULT; 94 95 memcpy(&chan->lc_iqos, &l2cap_default_qos, sizeof(l2cap_qos_t)); 96 memcpy(&chan->lc_oqos, &l2cap_default_qos, sizeof(l2cap_qos_t)); 97 98 MBUFQ_INIT(&chan->lc_txq); 99 100 *handle = chan; 101 return 0; 102 } 103 104 /* 105 * l2cap_bind(l2cap_channel, sockaddr) 106 * 107 * set local address of channel 108 */ 109 int 110 l2cap_bind(struct l2cap_channel *chan, struct sockaddr_bt *addr) 111 { 112 113 memcpy(&chan->lc_laddr, addr, sizeof(struct sockaddr_bt)); 114 return 0; 115 } 116 117 /* 118 * l2cap_sockaddr(l2cap_channel, sockaddr) 119 * 120 * get local address of channel 121 */ 122 int 123 l2cap_sockaddr(struct l2cap_channel *chan, struct sockaddr_bt *addr) 124 { 125 126 memcpy(addr, &chan->lc_laddr, sizeof(struct sockaddr_bt)); 127 return 0; 128 } 129 130 /* 131 * l2cap_connect(l2cap_channel, sockaddr) 132 * 133 * Initiate a connection to destination. This corresponds to 134 * "Open Channel Request" in the L2CAP specification and will 135 * result in one of the following: 136 * 137 * proto->connected(upper) 138 * proto->disconnected(upper, error) 139 * 140 * and, optionally 141 * proto->connecting(upper) 142 */ 143 int 144 l2cap_connect(struct l2cap_channel *chan, struct sockaddr_bt *dest) 145 { 146 struct hci_unit *unit; 147 int err; 148 149 memcpy(&chan->lc_raddr, dest, sizeof(struct sockaddr_bt)); 150 151 if (L2CAP_PSM_INVALID(chan->lc_raddr.bt_psm)) 152 return EINVAL; 153 154 if (bdaddr_any(&chan->lc_raddr.bt_bdaddr)) 155 return EDESTADDRREQ; 156 157 /* set local address if it needs setting */ 158 if (bdaddr_any(&chan->lc_laddr.bt_bdaddr)) { 159 err = hci_route_lookup(&chan->lc_laddr.bt_bdaddr, 160 &chan->lc_raddr.bt_bdaddr); 161 if (err) 162 return err; 163 } 164 165 unit = hci_unit_lookup(&chan->lc_laddr.bt_bdaddr); 166 if (unit == NULL) 167 return EHOSTUNREACH; 168 169 /* attach to active list */ 170 err = l2cap_cid_alloc(chan); 171 if (err) 172 return err; 173 174 /* open link to remote device */ 175 chan->lc_link = hci_acl_open(unit, &chan->lc_raddr.bt_bdaddr); 176 if (chan->lc_link == NULL) 177 return EHOSTUNREACH; 178 179 /* 180 * We queue a connect request right away even though the link 181 * may not yet be open; the queue will be started automatically 182 * at the right time. 183 */ 184 chan->lc_state = L2CAP_WAIT_CONNECT_RSP; 185 err = l2cap_send_connect_req(chan); 186 if (err) { 187 chan->lc_state = L2CAP_CLOSED; 188 hci_acl_close(chan->lc_link, err); 189 chan->lc_link = NULL; 190 return err; 191 } 192 193 return 0; 194 } 195 196 /* 197 * l2cap_peeraddr(l2cap_channel, sockaddr) 198 * 199 * get remote address of channel 200 */ 201 int 202 l2cap_peeraddr(struct l2cap_channel *chan, struct sockaddr_bt *addr) 203 { 204 205 memcpy(addr, &chan->lc_raddr, sizeof(struct sockaddr_bt)); 206 return 0; 207 } 208 209 /* 210 * l2cap_disconnect(l2cap_channel, linger) 211 * 212 * Initiate L2CAP disconnection. This corresponds to 213 * "Close Channel Request" in the L2CAP specification 214 * and will result in a call to 215 * 216 * proto->disconnected(upper, error) 217 * 218 * when the disconnection is complete. If linger is set, 219 * the call will not be made until data has flushed from 220 * the queue. 221 */ 222 int 223 l2cap_disconnect(struct l2cap_channel *chan, int linger) 224 { 225 int err = 0; 226 227 if (chan->lc_state & (L2CAP_CLOSED | L2CAP_WAIT_DISCONNECT)) 228 return EINVAL; 229 230 chan->lc_flags |= L2CAP_SHUTDOWN; 231 232 /* 233 * no need to do anything unless the queue is empty or 234 * we are not lingering.. 235 */ 236 if ((MBUFQ_FIRST(&chan->lc_txq) == NULL && chan->lc_pending == 0) 237 || linger == 0) { 238 chan->lc_state = L2CAP_WAIT_DISCONNECT; 239 err = l2cap_send_disconnect_req(chan); 240 if (err) 241 l2cap_close(chan, err); 242 } 243 return err; 244 } 245 246 /* 247 * l2cap_detach(handle) 248 * 249 * Detach l2cap channel from handle & close it down 250 */ 251 int 252 l2cap_detach(struct l2cap_channel **handle) 253 { 254 struct l2cap_channel *chan; 255 256 chan = *handle; 257 *handle = NULL; 258 259 if (chan->lc_state != L2CAP_CLOSED) 260 l2cap_close(chan, 0); 261 262 if (chan->lc_lcid != L2CAP_NULL_CID) { 263 LIST_REMOVE(chan, lc_ncid); 264 chan->lc_lcid = L2CAP_NULL_CID; 265 } 266 267 MBUFQ_DRAIN(&chan->lc_txq); 268 269 /* 270 * Could implement some kind of delayed expunge to make sure that the 271 * CID is really dead before it becomes available for reuse? 272 */ 273 274 free(chan, M_BLUETOOTH); 275 return 0; 276 } 277 278 /* 279 * l2cap_listen(l2cap_channel) 280 * 281 * Use this channel as a listening post (until detached). This will 282 * result in calls to: 283 * 284 * proto->newconn(upper, laddr, raddr) 285 * 286 * for incoming connections matching the psm and local address of the 287 * channel (NULL psm/address are permitted and match any protocol/device). 288 * 289 * The upper layer should create and return a new channel. 290 * 291 * You cannot use this channel for anything else subsequent to this call 292 */ 293 int 294 l2cap_listen(struct l2cap_channel *chan) 295 { 296 struct l2cap_channel *used, *prev = NULL; 297 298 if (chan->lc_lcid != L2CAP_NULL_CID) 299 return EINVAL; 300 301 if (chan->lc_laddr.bt_psm != L2CAP_PSM_ANY 302 && L2CAP_PSM_INVALID(chan->lc_laddr.bt_psm)) 303 return EADDRNOTAVAIL; 304 305 /* 306 * This CID is irrelevant, as the channel is not stored on the active 307 * list and the socket code does not allow operations on listening 308 * sockets, but we set it so the detach code knows to LIST_REMOVE the 309 * channel. 310 */ 311 chan->lc_lcid = L2CAP_SIGNAL_CID; 312 313 /* 314 * The list of listening channels is stored in an order such that new 315 * listeners dont usurp current listeners, but that specific listening 316 * takes precedence over promiscuous, and the connect request code can 317 * easily use the first matching entry. 318 */ 319 LIST_FOREACH(used, &l2cap_listen_list, lc_ncid) { 320 if (used->lc_laddr.bt_psm < chan->lc_laddr.bt_psm) 321 break; 322 323 if (used->lc_laddr.bt_psm == chan->lc_laddr.bt_psm 324 && bdaddr_any(&used->lc_laddr.bt_bdaddr) 325 && !bdaddr_any(&chan->lc_laddr.bt_bdaddr)) 326 break; 327 328 prev = used; 329 } 330 331 if (prev == NULL) 332 LIST_INSERT_HEAD(&l2cap_listen_list, chan, lc_ncid); 333 else 334 LIST_INSERT_AFTER(prev, chan, lc_ncid); 335 336 return 0; 337 } 338 339 /* 340 * l2cap_send(l2cap_channel, mbuf) 341 * 342 * Output SDU on channel described by channel. This corresponds 343 * to "Send Data Request" in the L2CAP specification. The upper 344 * layer will be notified when SDU's have completed sending by a 345 * call to: 346 * 347 * proto->complete(upper, n) 348 * 349 * (currently n == 1) 350 * 351 * Note: I'm not sure how this will work out, but I think that 352 * if outgoing Retransmission Mode or Flow Control Mode is 353 * negotiated then this call will not be made until the SDU has 354 * been acknowleged by the peer L2CAP entity. For 'Best Effort' 355 * it will be made when the packet has cleared the controller 356 * buffers. 357 * 358 * We only support Basic mode so far, so encapsulate with a 359 * B-Frame header and start sending if we are not already 360 */ 361 int 362 l2cap_send(struct l2cap_channel *chan, struct mbuf *m) 363 { 364 l2cap_hdr_t *hdr; 365 int plen; 366 367 if (chan->lc_state == L2CAP_CLOSED) { 368 m_freem(m); 369 return ENOTCONN; 370 } 371 372 plen = m->m_pkthdr.len; 373 374 DPRINTFN(5, "send %d bytes on CID #%d (pending = %d)\n", 375 plen, chan->lc_lcid, chan->lc_pending); 376 377 /* Encapsulate with B-Frame */ 378 M_PREPEND(m, sizeof(l2cap_hdr_t), M_DONTWAIT); 379 if (m == NULL) 380 return ENOMEM; 381 382 hdr = mtod(m, l2cap_hdr_t *); 383 hdr->length = htole16(plen); 384 hdr->dcid = htole16(chan->lc_rcid); 385 386 /* Queue it on our list */ 387 MBUFQ_ENQUEUE(&chan->lc_txq, m); 388 389 /* If we are not sending, then start doing so */ 390 if (chan->lc_pending == 0) 391 return l2cap_start(chan); 392 393 return 0; 394 } 395 396 /* 397 * l2cap_setopt(channel, opt, addr) 398 * 399 * Apply configuration options to channel. This corresponds to 400 * "Configure Channel Request" in the L2CAP specification. 401 */ 402 int 403 l2cap_setopt(struct l2cap_channel *chan, int opt, void *addr) 404 { 405 int err = 0; 406 uint16_t tmp; 407 408 /* 409 * currently we dont allow changing any options when channel 410 * is other than closed. We could allow this (not sure why?) 411 * but would have to instigate a configure request. 412 */ 413 if (chan->lc_state != L2CAP_CLOSED) 414 return EBUSY; 415 416 switch (opt) { 417 case SO_L2CAP_IMTU: /* set Incoming MTU */ 418 tmp = *(uint16_t *)addr; 419 if (tmp < L2CAP_MTU_MINIMUM) { 420 err = EINVAL; 421 break; 422 } 423 424 chan->lc_imtu = tmp; 425 break; 426 427 case SO_L2CAP_OQOS: /* set Outgoing QoS flow spec */ 428 // XXX 429 // memcpy(&chan->lc_oqos, addr, sizeof(l2cap_qos_t)); 430 //break; 431 432 case SO_L2CAP_FLUSH: /* set Outgoing Flush Timeout */ 433 // XXX 434 // chan->lc_flush = *(uint16_t *)addr; 435 //break; 436 437 default: 438 err = EINVAL; 439 break; 440 } 441 442 return err; 443 } 444 445 int 446 l2cap_getopt(struct l2cap_channel *chan, int opt, void *addr) 447 { 448 449 switch (opt) { 450 case SO_L2CAP_IMTU: /* get Incoming MTU */ 451 *(uint16_t *)addr = chan->lc_imtu; 452 return sizeof(uint16_t); 453 454 case SO_L2CAP_OMTU: /* get Outgoing MTU */ 455 *(uint16_t *)addr = chan->lc_omtu; 456 return sizeof(uint16_t); 457 458 case SO_L2CAP_IQOS: /* get Incoming QoS flow spec */ 459 memcpy(addr, &chan->lc_iqos, sizeof(l2cap_qos_t)); 460 return sizeof(l2cap_qos_t); 461 462 case SO_L2CAP_OQOS: /* get Outgoing QoS flow spec */ 463 memcpy(addr, &chan->lc_oqos, sizeof(l2cap_qos_t)); 464 return sizeof(l2cap_qos_t); 465 466 case SO_L2CAP_FLUSH: /* get Flush Timeout */ 467 *(uint16_t *)addr = chan->lc_flush; 468 return sizeof(uint16_t); 469 470 default: 471 break; 472 } 473 474 return 0; 475 } 476