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