Home | History | Annotate | Line # | Download | only in netbt
rfcomm_session.c revision 1.17
      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