xref: /netbsd/sys/netbt/rfcomm_session.c (revision 6550d01e)
1 /*	$NetBSD: rfcomm_session.c,v 1.17 2010/11/17 20:19:25 plunky Exp $	*/
2 
3 /*-
4  * Copyright (c) 2006 Itronix Inc.
5  * All rights reserved.
6  *
7  * Written by Iain Hibbert for Itronix Inc.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. The name of Itronix Inc. may not be used to endorse
18  *    or promote products derived from this software without specific
19  *    prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #include <sys/cdefs.h>
35 __KERNEL_RCSID(0, "$NetBSD: rfcomm_session.c,v 1.17 2010/11/17 20:19:25 plunky Exp $");
36 
37 #include <sys/param.h>
38 #include <sys/kernel.h>
39 #include <sys/mbuf.h>
40 #include <sys/proc.h>
41 #include <sys/socketvar.h>
42 #include <sys/systm.h>
43 #include <sys/types.h>
44 
45 #include <netbt/bluetooth.h>
46 #include <netbt/hci.h>
47 #include <netbt/l2cap.h>
48 #include <netbt/rfcomm.h>
49 
50 /******************************************************************************
51  *
52  * RFCOMM Multiplexer Sessions sit directly on L2CAP channels, and can
53  * multiplex up to 30 incoming and 30 outgoing connections.
54  * Only one Multiplexer is allowed between any two devices.
55  */
56 
57 static void rfcomm_session_timeout(void *);
58 static void rfcomm_session_recv_sabm(struct rfcomm_session *, int);
59 static void rfcomm_session_recv_disc(struct rfcomm_session *, int);
60 static void rfcomm_session_recv_ua(struct rfcomm_session *, int);
61 static void rfcomm_session_recv_dm(struct rfcomm_session *, int);
62 static void rfcomm_session_recv_uih(struct rfcomm_session *, int, int, struct mbuf *, int);
63 static void rfcomm_session_recv_mcc(struct rfcomm_session *, struct mbuf *);
64 static void rfcomm_session_recv_mcc_test(struct rfcomm_session *, int, struct mbuf *);
65 static void rfcomm_session_recv_mcc_fcon(struct rfcomm_session *, int);
66 static void rfcomm_session_recv_mcc_fcoff(struct rfcomm_session *, int);
67 static void rfcomm_session_recv_mcc_msc(struct rfcomm_session *, int, struct mbuf *);
68 static void rfcomm_session_recv_mcc_rpn(struct rfcomm_session *, int, struct mbuf *);
69 static void rfcomm_session_recv_mcc_rls(struct rfcomm_session *, int, struct mbuf *);
70 static void rfcomm_session_recv_mcc_pn(struct rfcomm_session *, int, struct mbuf *);
71 static void rfcomm_session_recv_mcc_nsc(struct rfcomm_session *, int, struct mbuf *);
72 
73 /* L2CAP callbacks */
74 static void rfcomm_session_connecting(void *);
75 static void rfcomm_session_connected(void *);
76 static void rfcomm_session_disconnected(void *, int);
77 static void *rfcomm_session_newconn(void *, struct sockaddr_bt *, struct sockaddr_bt *);
78 static void rfcomm_session_complete(void *, int);
79 static void rfcomm_session_linkmode(void *, int);
80 static void rfcomm_session_input(void *, struct mbuf *);
81 
82 static const struct btproto rfcomm_session_proto = {
83 	rfcomm_session_connecting,
84 	rfcomm_session_connected,
85 	rfcomm_session_disconnected,
86 	rfcomm_session_newconn,
87 	rfcomm_session_complete,
88 	rfcomm_session_linkmode,
89 	rfcomm_session_input,
90 };
91 
92 struct rfcomm_session_list
93 	rfcomm_session_active = LIST_HEAD_INITIALIZER(rfcomm_session_active);
94 
95 struct rfcomm_session_list
96 	rfcomm_session_listen = LIST_HEAD_INITIALIZER(rfcomm_session_listen);
97 
98 static struct pool rfcomm_credit_pool;
99 
100 /*
101  * RFCOMM System Parameters (see section 5.3)
102  */
103 int rfcomm_mtu_default = 127;	/* bytes */
104 int rfcomm_ack_timeout = 20;	/* seconds */
105 int rfcomm_mcc_timeout = 20;	/* seconds */
106 
107 /*
108  * Reversed CRC table as per TS 07.10 Annex B.3.5
109  */
110 static const uint8_t crctable[256] = {	/* reversed, 8-bit, poly=0x07 */
111 	0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75,
112 	0x0e, 0x9f, 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b,
113 	0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, 0xf8, 0x69,
114 	0x12, 0x83, 0xf1, 0x60, 0x15, 0x84, 0xf6, 0x67,
115 
116 	0x38, 0xa9, 0xdb, 0x4a, 0x3f, 0xae, 0xdc, 0x4d,
117 	0x36, 0xa7, 0xd5, 0x44, 0x31, 0xa0, 0xd2, 0x43,
118 	0x24, 0xb5, 0xc7, 0x56, 0x23, 0xb2, 0xc0, 0x51,
119 	0x2a, 0xbb, 0xc9, 0x58, 0x2d, 0xbc, 0xce, 0x5f,
120 
121 	0x70, 0xe1, 0x93, 0x02, 0x77, 0xe6, 0x94, 0x05,
122 	0x7e, 0xef, 0x9d, 0x0c, 0x79, 0xe8, 0x9a, 0x0b,
123 	0x6c, 0xfd, 0x8f, 0x1e, 0x6b, 0xfa, 0x88, 0x19,
124 	0x62, 0xf3, 0x81, 0x10, 0x65, 0xf4, 0x86, 0x17,
125 
126 	0x48, 0xd9, 0xab, 0x3a, 0x4f, 0xde, 0xac, 0x3d,
127 	0x46, 0xd7, 0xa5, 0x34, 0x41, 0xd0, 0xa2, 0x33,
128 	0x54, 0xc5, 0xb7, 0x26, 0x53, 0xc2, 0xb0, 0x21,
129 	0x5a, 0xcb, 0xb9, 0x28, 0x5d, 0xcc, 0xbe, 0x2f,
130 
131 	0xe0, 0x71, 0x03, 0x92, 0xe7, 0x76, 0x04, 0x95,
132 	0xee, 0x7f, 0x0d, 0x9c, 0xe9, 0x78, 0x0a, 0x9b,
133 	0xfc, 0x6d, 0x1f, 0x8e, 0xfb, 0x6a, 0x18, 0x89,
134 	0xf2, 0x63, 0x11, 0x80, 0xf5, 0x64, 0x16, 0x87,
135 
136 	0xd8, 0x49, 0x3b, 0xaa, 0xdf, 0x4e, 0x3c, 0xad,
137 	0xd6, 0x47, 0x35, 0xa4, 0xd1, 0x40, 0x32, 0xa3,
138 	0xc4, 0x55, 0x27, 0xb6, 0xc3, 0x52, 0x20, 0xb1,
139 	0xca, 0x5b, 0x29, 0xb8, 0xcd, 0x5c, 0x2e, 0xbf,
140 
141 	0x90, 0x01, 0x73, 0xe2, 0x97, 0x06, 0x74, 0xe5,
142 	0x9e, 0x0f, 0x7d, 0xec, 0x99, 0x08, 0x7a, 0xeb,
143 	0x8c, 0x1d, 0x6f, 0xfe, 0x8b, 0x1a, 0x68, 0xf9,
144 	0x82, 0x13, 0x61, 0xf0, 0x85, 0x14, 0x66, 0xf7,
145 
146 	0xa8, 0x39, 0x4b, 0xda, 0xaf, 0x3e, 0x4c, 0xdd,
147 	0xa6, 0x37, 0x45, 0xd4, 0xa1, 0x30, 0x42, 0xd3,
148 	0xb4, 0x25, 0x57, 0xc6, 0xb3, 0x22, 0x50, 0xc1,
149 	0xba, 0x2b, 0x59, 0xc8, 0xbd, 0x2c, 0x5e, 0xcf
150 };
151 
152 #define FCS(f, d)	crctable[(f) ^ (d)]
153 
154 void
155 rfcomm_init(void)
156 {
157 
158 	pool_init(&rfcomm_credit_pool, sizeof(struct rfcomm_credit),
159 	    0, 0, 0, "rfcomm_credit", NULL, IPL_SOFTNET);
160 }
161 
162 /*
163  * rfcomm_session_alloc(list, sockaddr)
164  *
165  * allocate a new session and fill in the blanks, then
166  * attach session to front of specified list (active or listen)
167  */
168 struct rfcomm_session *
169 rfcomm_session_alloc(struct rfcomm_session_list *list,
170 			struct sockaddr_bt *laddr)
171 {
172 	struct rfcomm_session *rs;
173 	struct sockopt sopt;
174 	int err;
175 
176 	rs = malloc(sizeof(*rs), M_BLUETOOTH, M_NOWAIT | M_ZERO);
177 	if (rs == NULL)
178 		return NULL;
179 
180 	rs->rs_state = RFCOMM_SESSION_CLOSED;
181 
182 	callout_init(&rs->rs_timeout, 0);
183 	callout_setfunc(&rs->rs_timeout, rfcomm_session_timeout, rs);
184 
185 	SIMPLEQ_INIT(&rs->rs_credits);
186 	LIST_INIT(&rs->rs_dlcs);
187 
188 	err = l2cap_attach(&rs->rs_l2cap, &rfcomm_session_proto, rs);
189 	if (err) {
190 		free(rs, M_BLUETOOTH);
191 		return NULL;
192 	}
193 
194 	sockopt_init(&sopt, BTPROTO_L2CAP, SO_L2CAP_OMTU, 0);
195 	(void)l2cap_getopt(rs->rs_l2cap, &sopt);
196 	(void)sockopt_get(&sopt, &rs->rs_mtu, sizeof(rs->rs_mtu));
197 	sockopt_destroy(&sopt);
198 
199 	if (laddr->bt_psm == L2CAP_PSM_ANY)
200 		laddr->bt_psm = L2CAP_PSM_RFCOMM;
201 
202 	(void)l2cap_bind(rs->rs_l2cap, laddr);
203 
204 	LIST_INSERT_HEAD(list, rs, rs_next);
205 
206 	return rs;
207 }
208 
209 /*
210  * rfcomm_session_free(rfcomm_session)
211  *
212  * release a session, including any cleanup
213  */
214 void
215 rfcomm_session_free(struct rfcomm_session *rs)
216 {
217 	struct rfcomm_credit *credit;
218 
219 	KASSERT(rs != NULL);
220 	KASSERT(LIST_EMPTY(&rs->rs_dlcs));
221 
222 	rs->rs_state = RFCOMM_SESSION_CLOSED;
223 
224 	/*
225 	 * If the callout is already invoked we have no way to stop it,
226 	 * but it will call us back right away (there are no DLC's) so
227 	 * not to worry.
228 	 */
229 	callout_stop(&rs->rs_timeout);
230 	if (callout_invoking(&rs->rs_timeout))
231 		return;
232 
233 	/*
234 	 * Take care that rfcomm_session_disconnected() doesnt call
235 	 * us back either as it will do if the l2cap_channel has not
236 	 * been closed when we detach it..
237 	 */
238 	if (rs->rs_flags & RFCOMM_SESSION_FREE)
239 		return;
240 
241 	rs->rs_flags |= RFCOMM_SESSION_FREE;
242 
243 	/* throw away any remaining credit notes */
244 	while ((credit = SIMPLEQ_FIRST(&rs->rs_credits)) != NULL) {
245 		SIMPLEQ_REMOVE_HEAD(&rs->rs_credits, rc_next);
246 		pool_put(&rfcomm_credit_pool, credit);
247 	}
248 
249 	KASSERT(SIMPLEQ_EMPTY(&rs->rs_credits));
250 
251 	/* Goodbye! */
252 	LIST_REMOVE(rs, rs_next);
253 	l2cap_detach(&rs->rs_l2cap);
254 	callout_destroy(&rs->rs_timeout);
255 	free(rs, M_BLUETOOTH);
256 }
257 
258 /*
259  * rfcomm_session_lookup(sockaddr, sockaddr)
260  *
261  * Find active rfcomm session matching src and dest addresses
262  * when src is BDADDR_ANY match any local address
263  */
264 struct rfcomm_session *
265 rfcomm_session_lookup(struct sockaddr_bt *src, struct sockaddr_bt *dest)
266 {
267 	struct rfcomm_session *rs;
268 	struct sockaddr_bt addr;
269 
270 	LIST_FOREACH(rs, &rfcomm_session_active, rs_next) {
271 		if (rs->rs_state == RFCOMM_SESSION_CLOSED)
272 			continue;
273 
274 		l2cap_sockaddr(rs->rs_l2cap, &addr);
275 
276 		if (bdaddr_same(&src->bt_bdaddr, &addr.bt_bdaddr) == 0)
277 			if (bdaddr_any(&src->bt_bdaddr) == 0)
278 				continue;
279 
280 		l2cap_peeraddr(rs->rs_l2cap, &addr);
281 
282 		if (addr.bt_psm != dest->bt_psm)
283 			continue;
284 
285 		if (bdaddr_same(&dest->bt_bdaddr, &addr.bt_bdaddr))
286 			break;
287 	}
288 
289 	return rs;
290 }
291 
292 /*
293  * rfcomm_session_timeout(rfcomm_session)
294  *
295  * Session timeouts are scheduled when a session is left or
296  * created with no DLCs, and when SABM(0) or DISC(0) are
297  * sent.
298  *
299  * So, if it is in an open state with DLC's attached then
300  * we leave it alone, otherwise the session is lost.
301  */
302 static void
303 rfcomm_session_timeout(void *arg)
304 {
305 	struct rfcomm_session *rs = arg;
306 	struct rfcomm_dlc *dlc;
307 
308 	KASSERT(rs != NULL);
309 
310 	mutex_enter(bt_lock);
311 	callout_ack(&rs->rs_timeout);
312 
313 	if (rs->rs_state != RFCOMM_SESSION_OPEN) {
314 		DPRINTF("timeout\n");
315 		rs->rs_state = RFCOMM_SESSION_CLOSED;
316 
317 		while (!LIST_EMPTY(&rs->rs_dlcs)) {
318 			dlc = LIST_FIRST(&rs->rs_dlcs);
319 
320 			rfcomm_dlc_close(dlc, ETIMEDOUT);
321 		}
322 	}
323 
324 	if (LIST_EMPTY(&rs->rs_dlcs)) {
325 		DPRINTF("expiring\n");
326 		rfcomm_session_free(rs);
327 	}
328 	mutex_exit(bt_lock);
329 }
330 
331 /***********************************************************************
332  *
333  *	RFCOMM Session L2CAP protocol callbacks
334  *
335  */
336 
337 static void
338 rfcomm_session_connecting(void *arg)
339 {
340 	/* struct rfcomm_session *rs = arg; */
341 
342 	DPRINTF("Connecting\n");
343 }
344 
345 static void
346 rfcomm_session_connected(void *arg)
347 {
348 	struct rfcomm_session *rs = arg;
349 	struct sockopt sopt;
350 
351 	DPRINTF("Connected\n");
352 
353 	/*
354 	 * L2CAP is open.
355 	 *
356 	 * If we are initiator, we can send our SABM(0)
357 	 * a timeout should be active?
358 	 *
359 	 * We must take note of the L2CAP MTU because currently
360 	 * the L2CAP implementation can only do Basic Mode.
361 	 */
362 	sockopt_init(&sopt, BTPROTO_L2CAP, SO_L2CAP_OMTU, 0);
363 	(void)l2cap_getopt(rs->rs_l2cap, &sopt);
364 	(void)sockopt_get(&sopt, &rs->rs_mtu, sizeof(rs->rs_mtu));
365 	sockopt_destroy(&sopt);
366 
367 	rs->rs_mtu -= 6; /* (RFCOMM overhead could be this big) */
368 	if (rs->rs_mtu < RFCOMM_MTU_MIN) {
369 		rfcomm_session_disconnected(rs, EINVAL);
370 		return;
371 	}
372 
373 	if (IS_INITIATOR(rs)) {
374 		int err;
375 
376 		err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_SABM, 0);
377 		if (err)
378 			rfcomm_session_disconnected(rs, err);
379 
380 		callout_schedule(&rs->rs_timeout, rfcomm_ack_timeout * hz);
381 	}
382 }
383 
384 static void
385 rfcomm_session_disconnected(void *arg, int err)
386 {
387 	struct rfcomm_session *rs = arg;
388 	struct rfcomm_dlc *dlc;
389 
390 	DPRINTF("Disconnected\n");
391 
392 	/*
393 	 * If we have any DLCs outstanding in the unlikely case that the
394 	 * L2CAP channel disconnected normally, close them with an error
395 	 */
396 	if (err == 0)
397 		err = ECONNRESET;
398 
399 	rs->rs_state = RFCOMM_SESSION_CLOSED;
400 
401 	while (!LIST_EMPTY(&rs->rs_dlcs)) {
402 		dlc = LIST_FIRST(&rs->rs_dlcs);
403 
404 		rfcomm_dlc_close(dlc, err);
405 	}
406 
407 	rfcomm_session_free(rs);
408 }
409 
410 static void *
411 rfcomm_session_newconn(void *arg, struct sockaddr_bt *laddr,
412 				struct sockaddr_bt *raddr)
413 {
414 	struct rfcomm_session *new, *rs = arg;
415 
416 	DPRINTF("New Connection\n");
417 
418 	/*
419 	 * Incoming session connect request. We should return a new
420 	 * session pointer if this is acceptable. The L2CAP layer
421 	 * passes local and remote addresses, which we must check as
422 	 * only one RFCOMM session is allowed between any two devices
423 	 */
424 	new = rfcomm_session_lookup(laddr, raddr);
425 	if (new != NULL)
426 		return NULL;
427 
428 	new = rfcomm_session_alloc(&rfcomm_session_active, laddr);
429 	if (new == NULL)
430 		return NULL;
431 
432 	new->rs_mtu = rs->rs_mtu;
433 	new->rs_state = RFCOMM_SESSION_WAIT_CONNECT;
434 
435 	/*
436 	 * schedule an expiry so that if nothing comes of it we
437 	 * can punt.
438 	 */
439 	callout_schedule(&new->rs_timeout, rfcomm_mcc_timeout * hz);
440 
441 	return new->rs_l2cap;
442 }
443 
444 static void
445 rfcomm_session_complete(void *arg, int count)
446 {
447 	struct rfcomm_session *rs = arg;
448 	struct rfcomm_credit *credit;
449 	struct rfcomm_dlc *dlc;
450 
451 	/*
452 	 * count L2CAP packets are 'complete', meaning that they are cleared
453 	 * our buffers (for best effort) or arrived safe (for guaranteed) so
454 	 * we can take it off our list and pass the message on, so that
455 	 * eventually the data can be removed from the sockbuf
456 	 */
457 	while (count-- > 0) {
458 		credit = SIMPLEQ_FIRST(&rs->rs_credits);
459 #ifdef DIAGNOSTIC
460 		if (credit == NULL) {
461 			printf("%s: too many packets completed!\n", __func__);
462 			break;
463 		}
464 #endif
465 		dlc = credit->rc_dlc;
466 		if (dlc != NULL) {
467 			dlc->rd_pending--;
468 			(*dlc->rd_proto->complete)
469 					(dlc->rd_upper, credit->rc_len);
470 
471 			/*
472 			 * if not using credit flow control, we may push
473 			 * more data now
474 			 */
475 			if ((rs->rs_flags & RFCOMM_SESSION_CFC) == 0
476 			    && dlc->rd_state == RFCOMM_DLC_OPEN) {
477 				rfcomm_dlc_start(dlc);
478 			}
479 
480 			/*
481 			 * When shutdown is indicated, we are just waiting to
482 			 * clear outgoing data.
483 			 */
484 			if ((dlc->rd_flags & RFCOMM_DLC_SHUTDOWN)
485 			    && dlc->rd_txbuf == NULL && dlc->rd_pending == 0) {
486 				dlc->rd_state = RFCOMM_DLC_WAIT_DISCONNECT;
487 				rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC,
488 							    dlc->rd_dlci);
489 				callout_schedule(&dlc->rd_timeout,
490 						    rfcomm_ack_timeout * hz);
491 			}
492 		}
493 
494 		SIMPLEQ_REMOVE_HEAD(&rs->rs_credits, rc_next);
495 		pool_put(&rfcomm_credit_pool, credit);
496 	}
497 
498 	/*
499 	 * If session is closed, we are just waiting to clear the queue
500 	 */
501 	if (rs->rs_state == RFCOMM_SESSION_CLOSED) {
502 		if (SIMPLEQ_EMPTY(&rs->rs_credits))
503 			l2cap_disconnect(rs->rs_l2cap, 0);
504 	}
505 }
506 
507 /*
508  * Link Mode changed
509  *
510  * This is called when a mode change is complete. Proceed with connections
511  * where appropriate, or pass the new mode to any active DLCs.
512  */
513 static void
514 rfcomm_session_linkmode(void *arg, int new)
515 {
516 	struct rfcomm_session *rs = arg;
517 	struct rfcomm_dlc *dlc, *next;
518 	int err, mode = 0;
519 
520 	DPRINTF("auth %s, encrypt %s, secure %s\n",
521 		(new & L2CAP_LM_AUTH ? "on" : "off"),
522 		(new & L2CAP_LM_ENCRYPT ? "on" : "off"),
523 		(new & L2CAP_LM_SECURE ? "on" : "off"));
524 
525 	if (new & L2CAP_LM_AUTH)
526 		mode |= RFCOMM_LM_AUTH;
527 
528 	if (new & L2CAP_LM_ENCRYPT)
529 		mode |= RFCOMM_LM_ENCRYPT;
530 
531 	if (new & L2CAP_LM_SECURE)
532 		mode |= RFCOMM_LM_SECURE;
533 
534 	next = LIST_FIRST(&rs->rs_dlcs);
535 	while ((dlc = next) != NULL) {
536 		next = LIST_NEXT(dlc, rd_next);
537 
538 		switch (dlc->rd_state) {
539 		case RFCOMM_DLC_WAIT_SEND_SABM:	/* we are connecting */
540 			if ((mode & dlc->rd_mode) != dlc->rd_mode) {
541 				rfcomm_dlc_close(dlc, ECONNABORTED);
542 			} else {
543 				err = rfcomm_session_send_frame(rs,
544 					    RFCOMM_FRAME_SABM, dlc->rd_dlci);
545 				if (err) {
546 					rfcomm_dlc_close(dlc, err);
547 				} else {
548 					dlc->rd_state = RFCOMM_DLC_WAIT_RECV_UA;
549 					callout_schedule(&dlc->rd_timeout,
550 							rfcomm_ack_timeout * hz);
551 					break;
552 				}
553 			}
554 
555 			/*
556 			 * If we aborted the connection and there are no more DLCs
557 			 * on the session, it is our responsibility to disconnect.
558 			 */
559 			if (!LIST_EMPTY(&rs->rs_dlcs))
560 				break;
561 
562 			rs->rs_state = RFCOMM_SESSION_WAIT_DISCONNECT;
563 			rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC, 0);
564 			callout_schedule(&rs->rs_timeout, rfcomm_ack_timeout * hz);
565 			break;
566 
567 		case RFCOMM_DLC_WAIT_SEND_UA: /* they are connecting */
568 			if ((mode & dlc->rd_mode) != dlc->rd_mode) {
569 				rfcomm_session_send_frame(rs,
570 					    RFCOMM_FRAME_DM, dlc->rd_dlci);
571 				rfcomm_dlc_close(dlc, ECONNABORTED);
572 				break;
573 			}
574 
575 			err = rfcomm_session_send_frame(rs,
576 					    RFCOMM_FRAME_UA, dlc->rd_dlci);
577 			if (err) {
578 				rfcomm_session_send_frame(rs,
579 						RFCOMM_FRAME_DM, dlc->rd_dlci);
580 				rfcomm_dlc_close(dlc, err);
581 				break;
582 			}
583 
584 			err = rfcomm_dlc_open(dlc);
585 			if (err) {
586 				rfcomm_session_send_frame(rs,
587 						RFCOMM_FRAME_DM, dlc->rd_dlci);
588 				rfcomm_dlc_close(dlc, err);
589 				break;
590 			}
591 
592 			break;
593 
594 		case RFCOMM_DLC_WAIT_RECV_UA:
595 		case RFCOMM_DLC_OPEN: /* already established */
596 			(*dlc->rd_proto->linkmode)(dlc->rd_upper, mode);
597 			break;
598 
599 		default:
600 			break;
601 		}
602 	}
603 }
604 
605 /*
606  * Receive data from L2CAP layer for session. There is always exactly one
607  * RFCOMM frame contained in each L2CAP frame.
608  */
609 static void
610 rfcomm_session_input(void *arg, struct mbuf *m)
611 {
612 	struct rfcomm_session *rs = arg;
613 	int dlci, len, type, pf;
614 	uint8_t fcs, b;
615 
616 	KASSERT(m != NULL);
617 	KASSERT(rs != NULL);
618 
619 	/*
620 	 * UIH frames: FCS is only calculated on address and control fields
621 	 * For other frames: FCS is calculated on address, control and length
622 	 * Length may extend to two octets
623 	 */
624 	fcs = 0xff;
625 
626 	if (m->m_pkthdr.len < 4) {
627 		DPRINTF("short frame (%d), discarded\n", m->m_pkthdr.len);
628 		goto done;
629 	}
630 
631 	/* address - one octet */
632 	m_copydata(m, 0, 1, &b);
633 	m_adj(m, 1);
634 	fcs = FCS(fcs, b);
635 	dlci = RFCOMM_DLCI(b);
636 
637 	/* control - one octet */
638 	m_copydata(m, 0, 1, &b);
639 	m_adj(m, 1);
640 	fcs = FCS(fcs, b);
641 	type = RFCOMM_TYPE(b);
642 	pf = RFCOMM_PF(b);
643 
644 	/* length - may be two octets */
645 	m_copydata(m, 0, 1, &b);
646 	m_adj(m, 1);
647 	if (type != RFCOMM_FRAME_UIH)
648 		fcs = FCS(fcs, b);
649 	len = (b >> 1) & 0x7f;
650 
651 	if (RFCOMM_EA(b) == 0) {
652 		if (m->m_pkthdr.len < 2) {
653 			DPRINTF("short frame (%d, EA = 0), discarded\n",
654 				m->m_pkthdr.len);
655 			goto done;
656 		}
657 
658 		m_copydata(m, 0, 1, &b);
659 		m_adj(m, 1);
660 		if (type != RFCOMM_FRAME_UIH)
661 			fcs = FCS(fcs, b);
662 
663 		len |= (b << 7);
664 	}
665 
666 	/* FCS byte is last octet in frame */
667 	m_copydata(m, m->m_pkthdr.len - 1, 1, &b);
668 	m_adj(m, -1);
669 	fcs = FCS(fcs, b);
670 
671 	if (fcs != 0xcf) {
672 		DPRINTF("Bad FCS value (%#2.2x), frame discarded\n", fcs);
673 		goto done;
674 	}
675 
676 	DPRINTFN(10, "dlci %d, type %2.2x, len = %d\n", dlci, type, len);
677 
678 	switch (type) {
679 	case RFCOMM_FRAME_SABM:
680 		if (pf)
681 			rfcomm_session_recv_sabm(rs, dlci);
682 		break;
683 
684 	case RFCOMM_FRAME_DISC:
685 		if (pf)
686 			rfcomm_session_recv_disc(rs, dlci);
687 		break;
688 
689 	case RFCOMM_FRAME_UA:
690 		if (pf)
691 			rfcomm_session_recv_ua(rs, dlci);
692 		break;
693 
694 	case RFCOMM_FRAME_DM:
695 		rfcomm_session_recv_dm(rs, dlci);
696 		break;
697 
698 	case RFCOMM_FRAME_UIH:
699 		rfcomm_session_recv_uih(rs, dlci, pf, m, len);
700 		return;	/* (no release) */
701 
702 	default:
703 		UNKNOWN(type);
704 		break;
705 	}
706 
707 done:
708 	m_freem(m);
709 }
710 
711 /***********************************************************************
712  *
713  *	RFCOMM Session receive processing
714  */
715 
716 /*
717  * rfcomm_session_recv_sabm(rfcomm_session, dlci)
718  *
719  * Set Asyncrhonous Balanced Mode - open the channel.
720  */
721 static void
722 rfcomm_session_recv_sabm(struct rfcomm_session *rs, int dlci)
723 {
724 	struct rfcomm_dlc *dlc;
725 	int err;
726 
727 	DPRINTFN(5, "SABM(%d)\n", dlci);
728 
729 	if (dlci == 0) {	/* Open Session */
730 		rs->rs_state = RFCOMM_SESSION_OPEN;
731 		rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, 0);
732 		LIST_FOREACH(dlc, &rs->rs_dlcs, rd_next) {
733 			if (dlc->rd_state == RFCOMM_DLC_WAIT_SESSION)
734 				rfcomm_dlc_connect(dlc);
735 		}
736 		return;
737 	}
738 
739 	if (rs->rs_state != RFCOMM_SESSION_OPEN) {
740 		DPRINTF("session was not even open!\n");
741 		return;
742 	}
743 
744 	/* validate direction bit */
745 	if ((IS_INITIATOR(rs) && !RFCOMM_DIRECTION(dlci))
746 	    || (!IS_INITIATOR(rs) && RFCOMM_DIRECTION(dlci))) {
747 		DPRINTF("Invalid direction bit on DLCI\n");
748 		return;
749 	}
750 
751 	/*
752 	 * look for our DLC - this may exist if we received PN
753 	 * already, or we may have to fabricate a new one.
754 	 */
755 	dlc = rfcomm_dlc_lookup(rs, dlci);
756 	if (dlc == NULL) {
757 		dlc = rfcomm_dlc_newconn(rs, dlci);
758 		if (dlc == NULL)
759 			return;	/* (DM is sent) */
760 	}
761 
762 	/*
763 	 * ..but if this DLC is not waiting to connect, they did
764 	 * something wrong, ignore it.
765 	 */
766 	if (dlc->rd_state != RFCOMM_DLC_WAIT_CONNECT)
767 		return;
768 
769 	/* set link mode */
770 	err = rfcomm_dlc_setmode(dlc);
771 	if (err == EINPROGRESS) {
772 		dlc->rd_state = RFCOMM_DLC_WAIT_SEND_UA;
773 		(*dlc->rd_proto->connecting)(dlc->rd_upper);
774 		return;
775 	}
776 	if (err)
777 		goto close;
778 
779 	err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, dlci);
780 	if (err)
781 		goto close;
782 
783 	/* and mark it open */
784 	err = rfcomm_dlc_open(dlc);
785 	if (err)
786 		goto close;
787 
788 	return;
789 
790 close:
791 	rfcomm_dlc_close(dlc, err);
792 }
793 
794 /*
795  * Receive Disconnect Command
796  */
797 static void
798 rfcomm_session_recv_disc(struct rfcomm_session *rs, int dlci)
799 {
800 	struct rfcomm_dlc *dlc;
801 
802 	DPRINTFN(5, "DISC(%d)\n", dlci);
803 
804 	if (dlci == 0) {
805 		/*
806 		 * Disconnect Session
807 		 *
808 		 * We set the session state to CLOSED so that when
809 		 * the UA frame is clear the session will be closed
810 		 * automatically. We wont bother to close any DLC's
811 		 * just yet as there should be none. In the unlikely
812 		 * event that something is left, it will get flushed
813 		 * out as the session goes down.
814 		 */
815 		rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, 0);
816 		rs->rs_state = RFCOMM_SESSION_CLOSED;
817 		return;
818 	}
819 
820 	dlc = rfcomm_dlc_lookup(rs, dlci);
821 	if (dlc == NULL) {
822 		rfcomm_session_send_frame(rs, RFCOMM_FRAME_DM, dlci);
823 		return;
824 	}
825 
826 	rfcomm_dlc_close(dlc, 0);
827 	rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, dlci);
828 }
829 
830 /*
831  * Receive Unnumbered Acknowledgement Response
832  *
833  * This should be a response to a DISC or SABM frame that we
834  * have previously sent. If unexpected, ignore it.
835  */
836 static void
837 rfcomm_session_recv_ua(struct rfcomm_session *rs, int dlci)
838 {
839 	struct rfcomm_dlc *dlc;
840 
841 	DPRINTFN(5, "UA(%d)\n", dlci);
842 
843 	if (dlci == 0) {
844 		switch (rs->rs_state) {
845 		case RFCOMM_SESSION_WAIT_CONNECT:	/* We sent SABM */
846 			callout_stop(&rs->rs_timeout);
847 			rs->rs_state = RFCOMM_SESSION_OPEN;
848 			LIST_FOREACH(dlc, &rs->rs_dlcs, rd_next) {
849 				if (dlc->rd_state == RFCOMM_DLC_WAIT_SESSION)
850 					rfcomm_dlc_connect(dlc);
851 			}
852 			break;
853 
854 		case RFCOMM_SESSION_WAIT_DISCONNECT:	/* We sent DISC */
855 			callout_stop(&rs->rs_timeout);
856 			rs->rs_state = RFCOMM_SESSION_CLOSED;
857 			l2cap_disconnect(rs->rs_l2cap, 0);
858 			break;
859 
860 		default:
861 			DPRINTF("Received spurious UA(0)!\n");
862 			break;
863 		}
864 
865 		return;
866 	}
867 
868 	/*
869 	 * If we have no DLC on this dlci, we may have aborted
870 	 * without shutting down properly, so check if the session
871 	 * needs disconnecting.
872 	 */
873 	dlc = rfcomm_dlc_lookup(rs, dlci);
874 	if (dlc == NULL)
875 		goto check;
876 
877 	switch (dlc->rd_state) {
878 	case RFCOMM_DLC_WAIT_RECV_UA:		/* We sent SABM */
879 		rfcomm_dlc_open(dlc);
880 		return;
881 
882 	case RFCOMM_DLC_WAIT_DISCONNECT:	/* We sent DISC */
883 		rfcomm_dlc_close(dlc, 0);
884 		break;
885 
886 	default:
887 		DPRINTF("Received spurious UA(%d)!\n", dlci);
888 		return;
889 	}
890 
891 check:	/* last one out turns out the light */
892 	if (LIST_EMPTY(&rs->rs_dlcs)) {
893 		rs->rs_state = RFCOMM_SESSION_WAIT_DISCONNECT;
894 		rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC, 0);
895 		callout_schedule(&rs->rs_timeout, rfcomm_ack_timeout * hz);
896 	}
897 }
898 
899 /*
900  * Receive Disconnected Mode Response
901  *
902  * If this does not apply to a known DLC then we may ignore it.
903  */
904 static void
905 rfcomm_session_recv_dm(struct rfcomm_session *rs, int dlci)
906 {
907 	struct rfcomm_dlc *dlc;
908 
909 	DPRINTFN(5, "DM(%d)\n", dlci);
910 
911 	dlc = rfcomm_dlc_lookup(rs, dlci);
912 	if (dlc == NULL)
913 		return;
914 
915 	if (dlc->rd_state == RFCOMM_DLC_WAIT_CONNECT)
916 		rfcomm_dlc_close(dlc, ECONNREFUSED);
917 	else
918 		rfcomm_dlc_close(dlc, ECONNRESET);
919 }
920 
921 /*
922  * Receive Unnumbered Information with Header check (MCC or data packet)
923  */
924 static void
925 rfcomm_session_recv_uih(struct rfcomm_session *rs, int dlci,
926 			int pf, struct mbuf *m, int len)
927 {
928 	struct rfcomm_dlc *dlc;
929 	uint8_t credits = 0;
930 
931 	DPRINTFN(10, "UIH(%d)\n", dlci);
932 
933 	if (dlci == 0) {
934 		rfcomm_session_recv_mcc(rs, m);
935 		return;
936 	}
937 
938 	if (m->m_pkthdr.len != len + pf) {
939 		DPRINTF("Bad Frame Length (%d), frame discarded\n",
940 			    m->m_pkthdr.len);
941 
942 		goto discard;
943 	}
944 
945 	dlc = rfcomm_dlc_lookup(rs, dlci);
946 	if (dlc == NULL) {
947 		DPRINTF("UIH received for non existent DLC, discarded\n");
948 		rfcomm_session_send_frame(rs, RFCOMM_FRAME_DM, dlci);
949 		goto discard;
950 	}
951 
952 	if (dlc->rd_state != RFCOMM_DLC_OPEN) {
953 		DPRINTF("non-open DLC (state = %d), discarded\n",
954 				dlc->rd_state);
955 		goto discard;
956 	}
957 
958 	/* if PF is set, credits were included */
959 	if (rs->rs_flags & RFCOMM_SESSION_CFC) {
960 		if (pf != 0) {
961 			if (m->m_pkthdr.len < sizeof(credits)) {
962 				DPRINTF("Bad PF value, UIH discarded\n");
963 				goto discard;
964 			}
965 
966 			m_copydata(m, 0, sizeof(credits), &credits);
967 			m_adj(m, sizeof(credits));
968 
969 			dlc->rd_txcred += credits;
970 
971 			if (credits > 0 && dlc->rd_txbuf != NULL)
972 				rfcomm_dlc_start(dlc);
973 		}
974 
975 		if (len == 0)
976 			goto discard;
977 
978 		if (dlc->rd_rxcred == 0) {
979 			DPRINTF("Credit limit reached, UIH discarded\n");
980 			goto discard;
981 		}
982 
983 		if (len > dlc->rd_rxsize) {
984 			DPRINTF("UIH frame exceeds rxsize, discarded\n");
985 			goto discard;
986 		}
987 
988 		dlc->rd_rxcred--;
989 		dlc->rd_rxsize -= len;
990 	}
991 
992 	(*dlc->rd_proto->input)(dlc->rd_upper, m);
993 	return;
994 
995 discard:
996 	m_freem(m);
997 }
998 
999 /*
1000  * Receive Multiplexer Control Command
1001  */
1002 static void
1003 rfcomm_session_recv_mcc(struct rfcomm_session *rs, struct mbuf *m)
1004 {
1005 	int type, cr, len;
1006 	uint8_t b;
1007 
1008 	/*
1009 	 * Extract MCC header.
1010 	 *
1011 	 * Fields are variable length using extension bit = 1 to signify the
1012 	 * last octet in the sequence.
1013 	 *
1014 	 * Only single octet types are defined in TS 07.10/RFCOMM spec
1015 	 *
1016 	 * Length can realistically only use 15 bits (max RFCOMM MTU)
1017 	 */
1018 	if (m->m_pkthdr.len < sizeof(b)) {
1019 		DPRINTF("Short MCC header, discarded\n");
1020 		goto release;
1021 	}
1022 
1023 	m_copydata(m, 0, sizeof(b), &b);
1024 	m_adj(m, sizeof(b));
1025 
1026 	if (RFCOMM_EA(b) == 0) {	/* verify no extensions */
1027 		DPRINTF("MCC type EA = 0, discarded\n");
1028 		goto release;
1029 	}
1030 
1031 	type = RFCOMM_MCC_TYPE(b);
1032 	cr = RFCOMM_CR(b);
1033 
1034 	len = 0;
1035 	do {
1036 		if (m->m_pkthdr.len < sizeof(b)) {
1037 			DPRINTF("Short MCC header, discarded\n");
1038 			goto release;
1039 		}
1040 
1041 		m_copydata(m, 0, sizeof(b), &b);
1042 		m_adj(m, sizeof(b));
1043 
1044 		len = (len << 7) | (b >> 1);
1045 		len = min(len, RFCOMM_MTU_MAX);
1046 	} while (RFCOMM_EA(b) == 0);
1047 
1048 	if (len != m->m_pkthdr.len) {
1049 		DPRINTF("Incorrect MCC length, discarded\n");
1050 		goto release;
1051 	}
1052 
1053 	DPRINTFN(2, "MCC %s type %2.2x (%d bytes)\n",
1054 		(cr ? "command" : "response"), type, len);
1055 
1056 	/*
1057 	 * pass to command handler
1058 	 */
1059 	switch(type) {
1060 	case RFCOMM_MCC_TEST:	/* Test */
1061 		rfcomm_session_recv_mcc_test(rs, cr, m);
1062 		break;
1063 
1064 	case RFCOMM_MCC_FCON:	/* Flow Control On */
1065 		rfcomm_session_recv_mcc_fcon(rs, cr);
1066 		break;
1067 
1068 	case RFCOMM_MCC_FCOFF:	/* Flow Control Off */
1069 		rfcomm_session_recv_mcc_fcoff(rs, cr);
1070 		break;
1071 
1072 	case RFCOMM_MCC_MSC:	/* Modem Status Command */
1073 		rfcomm_session_recv_mcc_msc(rs, cr, m);
1074 		break;
1075 
1076 	case RFCOMM_MCC_RPN:	/* Remote Port Negotiation */
1077 		rfcomm_session_recv_mcc_rpn(rs, cr, m);
1078 		break;
1079 
1080 	case RFCOMM_MCC_RLS:	/* Remote Line Status */
1081 		rfcomm_session_recv_mcc_rls(rs, cr, m);
1082 		break;
1083 
1084 	case RFCOMM_MCC_PN:	/* Parameter Negotiation */
1085 		rfcomm_session_recv_mcc_pn(rs, cr, m);
1086 		break;
1087 
1088 	case RFCOMM_MCC_NSC:	/* Non Supported Command */
1089 		rfcomm_session_recv_mcc_nsc(rs, cr, m);
1090 		break;
1091 
1092 	default:
1093 		b = RFCOMM_MKMCC_TYPE(cr, type);
1094 		rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_NSC, &b, sizeof(b));
1095 	}
1096 
1097 release:
1098 	m_freem(m);
1099 }
1100 
1101 /*
1102  * process TEST command/response
1103  */
1104 static void
1105 rfcomm_session_recv_mcc_test(struct rfcomm_session *rs, int cr, struct mbuf *m)
1106 {
1107 	void *data;
1108 	int len;
1109 
1110 	if (cr == 0)	/* ignore ack */
1111 		return;
1112 
1113 	/*
1114 	 * we must send all the data they included back as is
1115 	 */
1116 
1117 	len = m->m_pkthdr.len;
1118 	if (len > RFCOMM_MTU_MAX)
1119 		return;
1120 
1121 	data = malloc(len, M_BLUETOOTH, M_NOWAIT);
1122 	if (data == NULL)
1123 		return;
1124 
1125 	m_copydata(m, 0, len, data);
1126 	rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_TEST, data, len);
1127 	free(data, M_BLUETOOTH);
1128 }
1129 
1130 /*
1131  * process Flow Control ON command/response
1132  */
1133 static void
1134 rfcomm_session_recv_mcc_fcon(struct rfcomm_session *rs, int cr)
1135 {
1136 
1137 	if (cr == 0)	/* ignore ack */
1138 		return;
1139 
1140 	rs->rs_flags |= RFCOMM_SESSION_RFC;
1141 	rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_FCON, NULL, 0);
1142 }
1143 
1144 /*
1145  * process Flow Control OFF command/response
1146  */
1147 static void
1148 rfcomm_session_recv_mcc_fcoff(struct rfcomm_session *rs, int cr)
1149 {
1150 
1151 	if (cr == 0)	/* ignore ack */
1152 		return;
1153 
1154 	rs->rs_flags &= ~RFCOMM_SESSION_RFC;
1155 	rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_FCOFF, NULL, 0);
1156 }
1157 
1158 /*
1159  * process Modem Status Command command/response
1160  */
1161 static void
1162 rfcomm_session_recv_mcc_msc(struct rfcomm_session *rs, int cr, struct mbuf *m)
1163 {
1164 	struct rfcomm_mcc_msc msc;	/* (3 octets) */
1165 	struct rfcomm_dlc *dlc;
1166 	int len = 0;
1167 
1168 	/* [ADDRESS] */
1169 	if (m->m_pkthdr.len < sizeof(msc.address))
1170 		return;
1171 
1172 	m_copydata(m, 0, sizeof(msc.address), &msc.address);
1173 	m_adj(m, sizeof(msc.address));
1174 	len += sizeof(msc.address);
1175 
1176 	dlc = rfcomm_dlc_lookup(rs, RFCOMM_DLCI(msc.address));
1177 
1178 	if (cr == 0) {	/* ignore acks */
1179 		if (dlc != NULL)
1180 			callout_stop(&dlc->rd_timeout);
1181 
1182 		return;
1183 	}
1184 
1185 	if (dlc == NULL) {
1186 		rfcomm_session_send_frame(rs, RFCOMM_FRAME_DM,
1187 						RFCOMM_DLCI(msc.address));
1188 		return;
1189 	}
1190 
1191 	/* [SIGNALS] */
1192 	if (m->m_pkthdr.len < sizeof(msc.modem))
1193 		return;
1194 
1195 	m_copydata(m, 0, sizeof(msc.modem), &msc.modem);
1196 	m_adj(m, sizeof(msc.modem));
1197 	len += sizeof(msc.modem);
1198 
1199 	dlc->rd_rmodem = msc.modem;
1200 	/* XXX how do we signal this upstream? */
1201 
1202 	if (RFCOMM_EA(msc.modem) == 0) {
1203 		if (m->m_pkthdr.len < sizeof(msc.brk))
1204 			return;
1205 
1206 		m_copydata(m, 0, sizeof(msc.brk), &msc.brk);
1207 		m_adj(m, sizeof(msc.brk));
1208 		len += sizeof(msc.brk);
1209 
1210 		/* XXX how do we signal this upstream? */
1211 	}
1212 
1213 	rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_MSC, &msc, len);
1214 }
1215 
1216 /*
1217  * process Remote Port Negotiation command/response
1218  */
1219 static void
1220 rfcomm_session_recv_mcc_rpn(struct rfcomm_session *rs, int cr, struct mbuf *m)
1221 {
1222 	struct rfcomm_mcc_rpn rpn;
1223 	uint16_t mask;
1224 
1225 	if (cr == 0)	/* ignore ack */
1226 		return;
1227 
1228 	/* default values */
1229 	rpn.bit_rate = RFCOMM_RPN_BR_9600;
1230 	rpn.line_settings = RFCOMM_RPN_8_N_1;
1231 	rpn.flow_control = RFCOMM_RPN_FLOW_NONE;
1232 	rpn.xon_char = RFCOMM_RPN_XON_CHAR;
1233 	rpn.xoff_char = RFCOMM_RPN_XOFF_CHAR;
1234 
1235 	if (m->m_pkthdr.len == sizeof(rpn)) {
1236 		m_copydata(m, 0, sizeof(rpn), &rpn);
1237 		rpn.param_mask = RFCOMM_RPN_PM_ALL;
1238 	} else if (m->m_pkthdr.len == 1) {
1239 		m_copydata(m, 0, 1, &rpn);
1240 		rpn.param_mask = le16toh(rpn.param_mask);
1241 	} else {
1242 		DPRINTF("Bad RPN length (%d)\n", m->m_pkthdr.len);
1243 		return;
1244 	}
1245 
1246 	mask = 0;
1247 
1248 	if (rpn.param_mask & RFCOMM_RPN_PM_RATE)
1249 		mask |= RFCOMM_RPN_PM_RATE;
1250 
1251 	if (rpn.param_mask & RFCOMM_RPN_PM_DATA
1252 	    && RFCOMM_RPN_DATA_BITS(rpn.line_settings) == RFCOMM_RPN_DATA_8)
1253 		mask |= RFCOMM_RPN_PM_DATA;
1254 
1255 	if (rpn.param_mask & RFCOMM_RPN_PM_STOP
1256 	    && RFCOMM_RPN_STOP_BITS(rpn.line_settings) == RFCOMM_RPN_STOP_1)
1257 		mask |= RFCOMM_RPN_PM_STOP;
1258 
1259 	if (rpn.param_mask & RFCOMM_RPN_PM_PARITY
1260 	    && RFCOMM_RPN_PARITY(rpn.line_settings) == RFCOMM_RPN_PARITY_NONE)
1261 		mask |= RFCOMM_RPN_PM_PARITY;
1262 
1263 	if (rpn.param_mask & RFCOMM_RPN_PM_XON
1264 	    && rpn.xon_char == RFCOMM_RPN_XON_CHAR)
1265 		mask |= RFCOMM_RPN_PM_XON;
1266 
1267 	if (rpn.param_mask & RFCOMM_RPN_PM_XOFF
1268 	    && rpn.xoff_char == RFCOMM_RPN_XOFF_CHAR)
1269 		mask |= RFCOMM_RPN_PM_XOFF;
1270 
1271 	if (rpn.param_mask & RFCOMM_RPN_PM_FLOW
1272 	    && rpn.flow_control == RFCOMM_RPN_FLOW_NONE)
1273 		mask |= RFCOMM_RPN_PM_FLOW;
1274 
1275 	rpn.param_mask = htole16(mask);
1276 
1277 	rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_RPN, &rpn, sizeof(rpn));
1278 }
1279 
1280 /*
1281  * process Remote Line Status command/response
1282  */
1283 static void
1284 rfcomm_session_recv_mcc_rls(struct rfcomm_session *rs, int cr, struct mbuf *m)
1285 {
1286 	struct rfcomm_mcc_rls rls;
1287 
1288 	if (cr == 0)	/* ignore ack */
1289 		return;
1290 
1291 	if (m->m_pkthdr.len != sizeof(rls)) {
1292 		DPRINTF("Bad RLS length %d\n", m->m_pkthdr.len);
1293 		return;
1294 	}
1295 
1296 	m_copydata(m, 0, sizeof(rls), &rls);
1297 
1298 	/*
1299 	 * So far as I can tell, we just send back what
1300 	 * they sent us. This signifies errors that seem
1301 	 * irrelevent for RFCOMM over L2CAP.
1302 	 */
1303 	rls.address |= 0x03;	/* EA = 1, CR = 1 */
1304 	rls.status &= 0x0f;	/* only 4 bits valid */
1305 
1306 	rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_RLS, &rls, sizeof(rls));
1307 }
1308 
1309 /*
1310  * process Parameter Negotiation command/response
1311  */
1312 static void
1313 rfcomm_session_recv_mcc_pn(struct rfcomm_session *rs, int cr, struct mbuf *m)
1314 {
1315 	struct rfcomm_dlc *dlc;
1316 	struct rfcomm_mcc_pn pn;
1317 	int err;
1318 
1319 	if (m->m_pkthdr.len != sizeof(pn)) {
1320 		DPRINTF("Bad PN length %d\n", m->m_pkthdr.len);
1321 		return;
1322 	}
1323 
1324 	m_copydata(m, 0, sizeof(pn), &pn);
1325 
1326 	pn.dlci &= 0x3f;
1327 	pn.mtu = le16toh(pn.mtu);
1328 
1329 	dlc = rfcomm_dlc_lookup(rs, pn.dlci);
1330 	if (cr) {	/* Command */
1331 		/*
1332 		 * If there is no DLC present, this is a new
1333 		 * connection so attempt to make one
1334 		 */
1335 		if (dlc == NULL) {
1336 			dlc = rfcomm_dlc_newconn(rs, pn.dlci);
1337 			if (dlc == NULL)
1338 				return;	/* (DM is sent) */
1339 		}
1340 
1341 		/* accept any valid MTU, and offer it back */
1342 		pn.mtu = min(pn.mtu, RFCOMM_MTU_MAX);
1343 		pn.mtu = min(pn.mtu, rs->rs_mtu);
1344 		pn.mtu = max(pn.mtu, RFCOMM_MTU_MIN);
1345 		dlc->rd_mtu = pn.mtu;
1346 		pn.mtu = htole16(pn.mtu);
1347 
1348 		/* credits are only set before DLC is open */
1349 		if (dlc->rd_state == RFCOMM_DLC_WAIT_CONNECT
1350 		    && (pn.flow_control & 0xf0) == 0xf0) {
1351 			rs->rs_flags |= RFCOMM_SESSION_CFC;
1352 			dlc->rd_txcred = pn.credits & 0x07;
1353 
1354 			dlc->rd_rxcred = (dlc->rd_rxsize / dlc->rd_mtu);
1355 			dlc->rd_rxcred = min(dlc->rd_rxcred,
1356 						RFCOMM_CREDITS_DEFAULT);
1357 
1358 			pn.flow_control = 0xe0;
1359 			pn.credits = dlc->rd_rxcred;
1360 		} else {
1361 			pn.flow_control = 0x00;
1362 			pn.credits = 0x00;
1363 		}
1364 
1365 		/* unused fields must be ignored and set to zero */
1366 		pn.ack_timer = 0;
1367 		pn.max_retrans = 0;
1368 
1369 		/* send our response */
1370 		err = rfcomm_session_send_mcc(rs, 0,
1371 					RFCOMM_MCC_PN, &pn, sizeof(pn));
1372 		if (err)
1373 			goto close;
1374 
1375 	} else {	/* Response */
1376 		/* ignore responses with no matching DLC */
1377 		if (dlc == NULL)
1378 			return;
1379 
1380 		callout_stop(&dlc->rd_timeout);
1381 
1382 		/* reject invalid or unacceptable MTU */
1383 		if (pn.mtu < RFCOMM_MTU_MIN || pn.mtu > dlc->rd_mtu) {
1384 			dlc->rd_state = RFCOMM_DLC_WAIT_DISCONNECT;
1385 			err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC,
1386 							pn.dlci);
1387 			if (err)
1388 				goto close;
1389 
1390 			callout_schedule(&dlc->rd_timeout,
1391 					    rfcomm_ack_timeout * hz);
1392 			return;
1393 		}
1394 		dlc->rd_mtu = pn.mtu;
1395 
1396 		/* if DLC is not waiting to connect, we are done */
1397 		if (dlc->rd_state != RFCOMM_DLC_WAIT_CONNECT)
1398 			return;
1399 
1400 		/* set initial credits according to RFCOMM spec */
1401 		if ((pn.flow_control & 0xf0) == 0xe0) {
1402 			rs->rs_flags |= RFCOMM_SESSION_CFC;
1403 			dlc->rd_txcred = (pn.credits & 0x07);
1404 		}
1405 
1406 		callout_schedule(&dlc->rd_timeout, rfcomm_ack_timeout * hz);
1407 
1408 		/* set link mode */
1409 		err = rfcomm_dlc_setmode(dlc);
1410 		if (err == EINPROGRESS) {
1411 			dlc->rd_state = RFCOMM_DLC_WAIT_SEND_SABM;
1412 			(*dlc->rd_proto->connecting)(dlc->rd_upper);
1413 			return;
1414 		}
1415 		if (err)
1416 			goto close;
1417 
1418 		/* we can proceed now */
1419 		err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_SABM, pn.dlci);
1420 		if (err)
1421 			goto close;
1422 
1423 		dlc->rd_state = RFCOMM_DLC_WAIT_RECV_UA;
1424 	}
1425 	return;
1426 
1427 close:
1428 	rfcomm_dlc_close(dlc, err);
1429 }
1430 
1431 /*
1432  * process Non Supported Command command/response
1433  */
1434 static void
1435 rfcomm_session_recv_mcc_nsc(struct rfcomm_session *rs,
1436     int cr, struct mbuf *m)
1437 {
1438 	struct rfcomm_dlc *dlc, *next;
1439 
1440 	/*
1441 	 * Since we did nothing that is not mandatory,
1442 	 * we just abort the whole session..
1443 	 */
1444 
1445 	next = LIST_FIRST(&rs->rs_dlcs);
1446 	while ((dlc = next) != NULL) {
1447 		next = LIST_NEXT(dlc, rd_next);
1448 		rfcomm_dlc_close(dlc, ECONNABORTED);
1449 	}
1450 
1451 	rfcomm_session_free(rs);
1452 }
1453 
1454 /***********************************************************************
1455  *
1456  *	RFCOMM Session outward frame/uih/mcc building
1457  */
1458 
1459 /*
1460  * SABM/DISC/DM/UA frames are all minimal and mostly identical.
1461  */
1462 int
1463 rfcomm_session_send_frame(struct rfcomm_session *rs, int type, int dlci)
1464 {
1465 	struct rfcomm_cmd_hdr *hdr;
1466 	struct rfcomm_credit *credit;
1467 	struct mbuf *m;
1468 	uint8_t fcs, cr;
1469 
1470 	credit = pool_get(&rfcomm_credit_pool, PR_NOWAIT);
1471 	if (credit == NULL)
1472 		return ENOMEM;
1473 
1474 	m = m_gethdr(M_DONTWAIT, MT_DATA);
1475 	if (m == NULL) {
1476 		pool_put(&rfcomm_credit_pool, credit);
1477 		return ENOMEM;
1478 	}
1479 
1480 	/*
1481 	 * The CR (command/response) bit identifies the frame either as a
1482 	 * commmand or a response and is used along with the DLCI to form
1483 	 * the address. Commands contain the non-initiator address, whereas
1484 	 * responses contain the initiator address, so the CR value is
1485 	 * also dependent on the session direction.
1486 	 */
1487 	if (type == RFCOMM_FRAME_UA || type == RFCOMM_FRAME_DM)
1488 		cr = IS_INITIATOR(rs) ? 0 : 1;
1489 	else
1490 		cr = IS_INITIATOR(rs) ? 1 : 0;
1491 
1492 	hdr = mtod(m, struct rfcomm_cmd_hdr *);
1493 	hdr->address = RFCOMM_MKADDRESS(cr, dlci);
1494 	hdr->control = RFCOMM_MKCONTROL(type, 1);   /* PF = 1 */
1495 	hdr->length = (0x00 << 1) | 0x01;	    /* len = 0x00, EA = 1 */
1496 
1497 	fcs = 0xff;
1498 	fcs = FCS(fcs, hdr->address);
1499 	fcs = FCS(fcs, hdr->control);
1500 	fcs = FCS(fcs, hdr->length);
1501 	fcs = 0xff - fcs;	/* ones complement */
1502 	hdr->fcs = fcs;
1503 
1504 	m->m_pkthdr.len = m->m_len = sizeof(struct rfcomm_cmd_hdr);
1505 
1506 	/* empty credit note */
1507 	credit->rc_dlc = NULL;
1508 	credit->rc_len = m->m_pkthdr.len;
1509 	SIMPLEQ_INSERT_TAIL(&rs->rs_credits, credit, rc_next);
1510 
1511 	DPRINTFN(5, "dlci %d type %2.2x (%d bytes, fcs=%#2.2x)\n",
1512 		dlci, type, m->m_pkthdr.len, fcs);
1513 
1514 	return l2cap_send(rs->rs_l2cap, m);
1515 }
1516 
1517 /*
1518  * rfcomm_session_send_uih(rfcomm_session, rfcomm_dlc, credits, mbuf)
1519  *
1520  * UIH frame is per DLC data or Multiplexer Control Commands
1521  * when no DLC is given. Data mbuf is optional (just credits
1522  * will be sent in that case)
1523  */
1524 int
1525 rfcomm_session_send_uih(struct rfcomm_session *rs, struct rfcomm_dlc *dlc,
1526 			int credits, struct mbuf *m)
1527 {
1528 	struct rfcomm_credit *credit;
1529 	struct mbuf *m0 = NULL;
1530 	int err, len;
1531 	uint8_t fcs, *hdr;
1532 
1533 	KASSERT(rs != NULL);
1534 
1535 	len = (m == NULL) ? 0 : m->m_pkthdr.len;
1536 	KASSERT(!(credits == 0 && len == 0));
1537 
1538 	/*
1539 	 * Make a credit note for the completion notification
1540 	 */
1541 	credit = pool_get(&rfcomm_credit_pool, PR_NOWAIT);
1542 	if (credit == NULL)
1543 		goto nomem;
1544 
1545 	credit->rc_len = len;
1546 	credit->rc_dlc = dlc;
1547 
1548 	/*
1549 	 * Wrap UIH frame information around payload.
1550 	 *
1551 	 * [ADDRESS] [CONTROL] [LENGTH] [CREDITS] [...] [FCS]
1552 	 *
1553 	 * Address is one octet.
1554 	 * Control is one octet.
1555 	 * Length is one or two octets.
1556 	 * Credits may be one octet.
1557 	 *
1558 	 * FCS is one octet and calculated on address and
1559 	 *	control octets only.
1560 	 *
1561 	 * If there are credits to be sent, we will set the PF
1562 	 * flag and include them in the frame.
1563 	 */
1564 	m0 = m_gethdr(M_DONTWAIT, MT_DATA);
1565 	if (m0 == NULL)
1566 		goto nomem;
1567 
1568 	MH_ALIGN(m0, 5);	/* (max 5 header octets) */
1569 	hdr = mtod(m0, uint8_t *);
1570 
1571 	/* CR bit is set according to the initiator of the session */
1572 	*hdr = RFCOMM_MKADDRESS((IS_INITIATOR(rs) ? 1 : 0),
1573 				(dlc ? dlc->rd_dlci : 0));
1574 	fcs = FCS(0xff, *hdr);
1575 	hdr++;
1576 
1577 	/* PF bit is set if credits are being sent */
1578 	*hdr = RFCOMM_MKCONTROL(RFCOMM_FRAME_UIH, (credits > 0 ? 1 : 0));
1579 	fcs = FCS(fcs, *hdr);
1580 	hdr++;
1581 
1582 	if (len < (1 << 7)) {
1583 		*hdr++ = ((len << 1) & 0xfe) | 0x01;	/* 7 bits, EA = 1 */
1584 	} else {
1585 		*hdr++ = ((len << 1) & 0xfe);		/* 7 bits, EA = 0 */
1586 		*hdr++ = ((len >> 7) & 0xff);		/* 8 bits, no EA */
1587 	}
1588 
1589 	if (credits > 0)
1590 		*hdr++ = (uint8_t)credits;
1591 
1592 	m0->m_len = hdr - mtod(m0, uint8_t *);
1593 
1594 	/* Append payload */
1595 	m0->m_next = m;
1596 	m = NULL;
1597 
1598 	m0->m_pkthdr.len = m0->m_len + len;
1599 
1600 	/* Append FCS */
1601 	fcs = 0xff - fcs;	/* ones complement */
1602 	len = m0->m_pkthdr.len;
1603 	m_copyback(m0, len, sizeof(fcs), &fcs);
1604 	if (m0->m_pkthdr.len != len + sizeof(fcs))
1605 		goto nomem;
1606 
1607 	DPRINTFN(10, "dlci %d, pktlen %d (%d data, %d credits), fcs=%#2.2x\n",
1608 		dlc ? dlc->rd_dlci : 0, m0->m_pkthdr.len, credit->rc_len,
1609 		credits, fcs);
1610 
1611 	/*
1612 	 * UIH frame ready to go..
1613 	 */
1614 	err = l2cap_send(rs->rs_l2cap, m0);
1615 	if (err)
1616 		goto fail;
1617 
1618 	SIMPLEQ_INSERT_TAIL(&rs->rs_credits, credit, rc_next);
1619 	return 0;
1620 
1621 nomem:
1622 	err = ENOMEM;
1623 
1624 	if (m0 != NULL)
1625 		m_freem(m0);
1626 
1627 	if (m != NULL)
1628 		m_freem(m);
1629 
1630 fail:
1631 	if (credit != NULL)
1632 		pool_put(&rfcomm_credit_pool, credit);
1633 
1634 	return err;
1635 }
1636 
1637 /*
1638  * send Multiplexer Control Command (or Response) on session
1639  */
1640 int
1641 rfcomm_session_send_mcc(struct rfcomm_session *rs, int cr,
1642 			uint8_t type, void *data, int len)
1643 {
1644 	struct mbuf *m;
1645 	uint8_t *hdr;
1646 	int hlen;
1647 
1648 	m = m_gethdr(M_DONTWAIT, MT_DATA);
1649 	if (m == NULL)
1650 		return ENOMEM;
1651 
1652 	hdr = mtod(m, uint8_t *);
1653 
1654 	/*
1655 	 * Technically the type field can extend past one octet, but none
1656 	 * currently defined will do that.
1657 	 */
1658 	*hdr++ = RFCOMM_MKMCC_TYPE(cr, type);
1659 
1660 	/*
1661 	 * In the frame, the max length size is 2 octets (15 bits) whereas
1662 	 * no max length size is specified for MCC commands. We must allow
1663 	 * for 3 octets since for MCC frames we use 7 bits + EA in each.
1664 	 *
1665 	 * Only test data can possibly be that big.
1666 	 *
1667 	 * XXX Should we check this against the MTU?
1668 	 */
1669 	if (len < (1 << 7)) {
1670 		*hdr++ = ((len << 1) & 0xfe) | 0x01;	/* 7 bits, EA = 1 */
1671 	} else if (len < (1 << 14)) {
1672 		*hdr++ = ((len << 1) & 0xfe);		/* 7 bits, EA = 0 */
1673 		*hdr++ = ((len >> 6) & 0xfe) | 0x01;	/* 7 bits, EA = 1 */
1674 	} else if (len < (1 << 15)) {
1675 		*hdr++ = ((len << 1) & 0xfe);		/* 7 bits, EA = 0 */
1676 		*hdr++ = ((len >> 6) & 0xfe);		/* 7 bits, EA = 0 */
1677 		*hdr++ = ((len >> 13) & 0x02) | 0x01;	/* 1 bit,  EA = 1 */
1678 	} else {
1679 		DPRINTF("incredible length! (%d)\n", len);
1680 		m_freem(m);
1681 		return EMSGSIZE;
1682 	}
1683 
1684 	/*
1685 	 * add command data (to same mbuf if possible)
1686 	 */
1687 	hlen = hdr - mtod(m, uint8_t *);
1688 
1689 	if (len > 0) {
1690 		m->m_pkthdr.len = m->m_len = MHLEN;
1691 		m_copyback(m, hlen, len, data);
1692 		if (m->m_pkthdr.len != max(MHLEN, hlen + len)) {
1693 			m_freem(m);
1694 			return ENOMEM;
1695 		}
1696 	}
1697 
1698 	m->m_pkthdr.len = hlen + len;
1699 	m->m_len = min(MHLEN, m->m_pkthdr.len);
1700 
1701 	DPRINTFN(5, "%s type %2.2x len %d\n",
1702 		(cr ? "command" : "response"), type, m->m_pkthdr.len);
1703 
1704 	return rfcomm_session_send_uih(rs, NULL, 0, m);
1705 }
1706