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