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