1 /* $NetBSD: rfcomm_session.c,v 1.28 2021/12/05 04:35:38 msaitoh 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.28 2021/12/05 04:35:38 msaitoh 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
rfcomm_init(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 *
rfcomm_session_alloc(struct rfcomm_session_list * list,struct sockaddr_bt * laddr)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_pcb(&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_pcb(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
rfcomm_session_free(struct rfcomm_session * rs)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_pcb(&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 *
rfcomm_session_lookup(struct sockaddr_bt * src,struct sockaddr_bt * dest)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_pcb(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_pcb(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
rfcomm_session_timeout(void * arg)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
rfcomm_session_connecting(void * arg)338 rfcomm_session_connecting(void *arg)
339 {
340 /* struct rfcomm_session *rs = arg; */
341
342 DPRINTF("Connecting\n");
343 }
344
345 static void
rfcomm_session_connected(void * arg)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
rfcomm_session_disconnected(void * arg,int err)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 *
rfcomm_session_newconn(void * arg,struct sockaddr_bt * laddr,struct sockaddr_bt * raddr)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
rfcomm_session_complete(void * arg,int count)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 if (credit == NULL) {
460 printf("%s: too many packets completed!\n", __func__);
461 break;
462 }
463
464 dlc = credit->rc_dlc;
465 if (dlc != NULL) {
466 dlc->rd_pending--;
467 (*dlc->rd_proto->complete)
468 (dlc->rd_upper, credit->rc_len);
469
470 /*
471 * if not using credit flow control, we may push
472 * more data now
473 */
474 if ((rs->rs_flags & RFCOMM_SESSION_CFC) == 0
475 && dlc->rd_state == RFCOMM_DLC_OPEN) {
476 rfcomm_dlc_start(dlc);
477 }
478
479 /*
480 * When shutdown is indicated, we are just waiting to
481 * clear outgoing data.
482 */
483 if ((dlc->rd_flags & RFCOMM_DLC_SHUTDOWN)
484 && dlc->rd_txbuf == NULL && dlc->rd_pending == 0) {
485 dlc->rd_state = RFCOMM_DLC_WAIT_DISCONNECT;
486 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC,
487 dlc->rd_dlci);
488 callout_schedule(&dlc->rd_timeout,
489 rfcomm_ack_timeout * hz);
490 }
491 }
492
493 SIMPLEQ_REMOVE_HEAD(&rs->rs_credits, rc_next);
494 pool_put(&rfcomm_credit_pool, credit);
495 }
496
497 /*
498 * If session is closed, we are just waiting to clear the queue
499 */
500 if (rs->rs_state == RFCOMM_SESSION_CLOSED) {
501 if (SIMPLEQ_EMPTY(&rs->rs_credits))
502 l2cap_disconnect_pcb(rs->rs_l2cap, 0);
503 }
504 }
505
506 /*
507 * Link Mode changed
508 *
509 * This is called when a mode change is complete. Proceed with connections
510 * where appropriate, or pass the new mode to any active DLCs.
511 */
512 static void
rfcomm_session_linkmode(void * arg,int new)513 rfcomm_session_linkmode(void *arg, int new)
514 {
515 struct rfcomm_session *rs = arg;
516 struct rfcomm_dlc *dlc, *next;
517 int err, mode = 0;
518
519 DPRINTF("auth %s, encrypt %s, secure %s\n",
520 (new & L2CAP_LM_AUTH ? "on" : "off"),
521 (new & L2CAP_LM_ENCRYPT ? "on" : "off"),
522 (new & L2CAP_LM_SECURE ? "on" : "off"));
523
524 if (new & L2CAP_LM_AUTH)
525 mode |= RFCOMM_LM_AUTH;
526
527 if (new & L2CAP_LM_ENCRYPT)
528 mode |= RFCOMM_LM_ENCRYPT;
529
530 if (new & L2CAP_LM_SECURE)
531 mode |= RFCOMM_LM_SECURE;
532
533 next = LIST_FIRST(&rs->rs_dlcs);
534 while ((dlc = next) != NULL) {
535 next = LIST_NEXT(dlc, rd_next);
536
537 switch (dlc->rd_state) {
538 case RFCOMM_DLC_WAIT_SEND_SABM: /* we are connecting */
539 if ((mode & dlc->rd_mode) != dlc->rd_mode) {
540 rfcomm_dlc_close(dlc, ECONNABORTED);
541 } else {
542 err = rfcomm_session_send_frame(rs,
543 RFCOMM_FRAME_SABM, dlc->rd_dlci);
544 if (err) {
545 rfcomm_dlc_close(dlc, err);
546 } else {
547 dlc->rd_state = RFCOMM_DLC_WAIT_RECV_UA;
548 callout_schedule(&dlc->rd_timeout,
549 rfcomm_ack_timeout * hz);
550 break;
551 }
552 }
553
554 /*
555 * If we aborted the connection and there are no more DLCs
556 * on the session, it is our responsibility to disconnect.
557 */
558 if (!LIST_EMPTY(&rs->rs_dlcs))
559 break;
560
561 rs->rs_state = RFCOMM_SESSION_WAIT_DISCONNECT;
562 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC, 0);
563 callout_schedule(&rs->rs_timeout, rfcomm_ack_timeout * hz);
564 break;
565
566 case RFCOMM_DLC_WAIT_SEND_UA: /* they are connecting */
567 if ((mode & dlc->rd_mode) != dlc->rd_mode) {
568 rfcomm_session_send_frame(rs,
569 RFCOMM_FRAME_DM, dlc->rd_dlci);
570 rfcomm_dlc_close(dlc, ECONNABORTED);
571 break;
572 }
573
574 err = rfcomm_session_send_frame(rs,
575 RFCOMM_FRAME_UA, dlc->rd_dlci);
576 if (err) {
577 rfcomm_session_send_frame(rs,
578 RFCOMM_FRAME_DM, dlc->rd_dlci);
579 rfcomm_dlc_close(dlc, err);
580 break;
581 }
582
583 err = rfcomm_dlc_open(dlc);
584 if (err) {
585 rfcomm_session_send_frame(rs,
586 RFCOMM_FRAME_DM, dlc->rd_dlci);
587 rfcomm_dlc_close(dlc, err);
588 break;
589 }
590
591 break;
592
593 case RFCOMM_DLC_WAIT_RECV_UA:
594 case RFCOMM_DLC_OPEN: /* already established */
595 (*dlc->rd_proto->linkmode)(dlc->rd_upper, mode);
596 break;
597
598 default:
599 break;
600 }
601 }
602 }
603
604 /*
605 * Receive data from L2CAP layer for session. There is always exactly one
606 * RFCOMM frame contained in each L2CAP frame.
607 */
608 static void
rfcomm_session_input(void * arg,struct mbuf * m)609 rfcomm_session_input(void *arg, struct mbuf *m)
610 {
611 struct rfcomm_session *rs = arg;
612 int dlci, len, type, pf;
613 uint8_t fcs, b;
614
615 KASSERT(m != NULL);
616 KASSERT(rs != NULL);
617
618 /*
619 * UIH frames: FCS is only calculated on address and control fields
620 * For other frames: FCS is calculated on address, control and length
621 * Length may extend to two octets
622 */
623 fcs = 0xff;
624
625 if (m->m_pkthdr.len < 4) {
626 DPRINTF("short frame (%d), discarded\n", m->m_pkthdr.len);
627 goto done;
628 }
629
630 /* address - one octet */
631 m_copydata(m, 0, 1, &b);
632 m_adj(m, 1);
633 fcs = FCS(fcs, b);
634 dlci = RFCOMM_DLCI(b);
635
636 /* control - one octet */
637 m_copydata(m, 0, 1, &b);
638 m_adj(m, 1);
639 fcs = FCS(fcs, b);
640 type = RFCOMM_TYPE(b);
641 pf = RFCOMM_PF(b);
642
643 /* length - may be two octets */
644 m_copydata(m, 0, 1, &b);
645 m_adj(m, 1);
646 if (type != RFCOMM_FRAME_UIH)
647 fcs = FCS(fcs, b);
648 len = (b >> 1) & 0x7f;
649
650 if (RFCOMM_EA(b) == 0) {
651 if (m->m_pkthdr.len < 2) {
652 DPRINTF("short frame (%d, EA = 0), discarded\n",
653 m->m_pkthdr.len);
654 goto done;
655 }
656
657 m_copydata(m, 0, 1, &b);
658 m_adj(m, 1);
659 if (type != RFCOMM_FRAME_UIH)
660 fcs = FCS(fcs, b);
661
662 len |= (b << 7);
663 }
664
665 /* FCS byte is last octet in frame */
666 m_copydata(m, m->m_pkthdr.len - 1, 1, &b);
667 m_adj(m, -1);
668 fcs = FCS(fcs, b);
669
670 if (fcs != 0xcf) {
671 DPRINTF("Bad FCS value (%#2.2x), frame discarded\n", fcs);
672 goto done;
673 }
674
675 DPRINTFN(10, "dlci %d, type %2.2x, len = %d\n", dlci, type, len);
676
677 switch (type) {
678 case RFCOMM_FRAME_SABM:
679 if (pf)
680 rfcomm_session_recv_sabm(rs, dlci);
681 break;
682
683 case RFCOMM_FRAME_DISC:
684 if (pf)
685 rfcomm_session_recv_disc(rs, dlci);
686 break;
687
688 case RFCOMM_FRAME_UA:
689 if (pf)
690 rfcomm_session_recv_ua(rs, dlci);
691 break;
692
693 case RFCOMM_FRAME_DM:
694 rfcomm_session_recv_dm(rs, dlci);
695 break;
696
697 case RFCOMM_FRAME_UIH:
698 rfcomm_session_recv_uih(rs, dlci, pf, m, len);
699 return; /* (no release) */
700
701 default:
702 UNKNOWN(type);
703 break;
704 }
705
706 done:
707 m_freem(m);
708 }
709
710 /***********************************************************************
711 *
712 * RFCOMM Session receive processing
713 */
714
715 /*
716 * rfcomm_session_recv_sabm(rfcomm_session, dlci)
717 *
718 * Set Asyncrhonous Balanced Mode - open the channel.
719 */
720 static void
rfcomm_session_recv_sabm(struct rfcomm_session * rs,int dlci)721 rfcomm_session_recv_sabm(struct rfcomm_session *rs, int dlci)
722 {
723 struct rfcomm_dlc *dlc;
724 int err;
725
726 DPRINTFN(5, "SABM(%d)\n", dlci);
727
728 if (dlci == 0) { /* Open Session */
729 rs->rs_state = RFCOMM_SESSION_OPEN;
730 rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, 0);
731 LIST_FOREACH(dlc, &rs->rs_dlcs, rd_next) {
732 if (dlc->rd_state == RFCOMM_DLC_WAIT_SESSION)
733 rfcomm_dlc_connect(dlc);
734 }
735 return;
736 }
737
738 if (rs->rs_state != RFCOMM_SESSION_OPEN) {
739 DPRINTF("session was not even open!\n");
740 return;
741 }
742
743 /* validate direction bit */
744 if ((IS_INITIATOR(rs) && !RFCOMM_DIRECTION(dlci))
745 || (!IS_INITIATOR(rs) && RFCOMM_DIRECTION(dlci))) {
746 DPRINTF("Invalid direction bit on DLCI\n");
747 return;
748 }
749
750 /*
751 * look for our DLC - this may exist if we received PN
752 * already, or we may have to fabricate a new one.
753 */
754 dlc = rfcomm_dlc_lookup(rs, dlci);
755 if (dlc == NULL) {
756 dlc = rfcomm_dlc_newconn(rs, dlci);
757 if (dlc == NULL)
758 return; /* (DM is sent) */
759 }
760
761 /*
762 * ..but if this DLC is not waiting to connect, they did
763 * something wrong, ignore it.
764 */
765 if (dlc->rd_state != RFCOMM_DLC_WAIT_CONNECT)
766 return;
767
768 /* set link mode */
769 err = rfcomm_dlc_setmode(dlc);
770 if (err == EINPROGRESS) {
771 dlc->rd_state = RFCOMM_DLC_WAIT_SEND_UA;
772 (*dlc->rd_proto->connecting)(dlc->rd_upper);
773 return;
774 }
775 if (err)
776 goto close;
777
778 err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, dlci);
779 if (err)
780 goto close;
781
782 /* and mark it open */
783 err = rfcomm_dlc_open(dlc);
784 if (err)
785 goto close;
786
787 return;
788
789 close:
790 rfcomm_dlc_close(dlc, err);
791 }
792
793 /*
794 * Receive Disconnect Command
795 */
796 static void
rfcomm_session_recv_disc(struct rfcomm_session * rs,int dlci)797 rfcomm_session_recv_disc(struct rfcomm_session *rs, int dlci)
798 {
799 struct rfcomm_dlc *dlc;
800
801 DPRINTFN(5, "DISC(%d)\n", dlci);
802
803 if (dlci == 0) {
804 /*
805 * Disconnect Session
806 *
807 * We set the session state to CLOSED so that when
808 * the UA frame is clear the session will be closed
809 * automatically. We wont bother to close any DLC's
810 * just yet as there should be none. In the unlikely
811 * event that something is left, it will get flushed
812 * out as the session goes down.
813 */
814 rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, 0);
815 rs->rs_state = RFCOMM_SESSION_CLOSED;
816 return;
817 }
818
819 dlc = rfcomm_dlc_lookup(rs, dlci);
820 if (dlc == NULL) {
821 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DM, dlci);
822 return;
823 }
824
825 rfcomm_dlc_close(dlc, 0);
826 rfcomm_session_send_frame(rs, RFCOMM_FRAME_UA, dlci);
827 }
828
829 /*
830 * Receive Unnumbered Acknowledgement Response
831 *
832 * This should be a response to a DISC or SABM frame that we
833 * have previously sent. If unexpected, ignore it.
834 */
835 static void
rfcomm_session_recv_ua(struct rfcomm_session * rs,int dlci)836 rfcomm_session_recv_ua(struct rfcomm_session *rs, int dlci)
837 {
838 struct rfcomm_dlc *dlc;
839
840 DPRINTFN(5, "UA(%d)\n", dlci);
841
842 if (dlci == 0) {
843 switch (rs->rs_state) {
844 case RFCOMM_SESSION_WAIT_CONNECT: /* We sent SABM */
845 callout_stop(&rs->rs_timeout);
846 rs->rs_state = RFCOMM_SESSION_OPEN;
847 LIST_FOREACH(dlc, &rs->rs_dlcs, rd_next) {
848 if (dlc->rd_state == RFCOMM_DLC_WAIT_SESSION)
849 rfcomm_dlc_connect(dlc);
850 }
851 break;
852
853 case RFCOMM_SESSION_WAIT_DISCONNECT: /* We sent DISC */
854 callout_stop(&rs->rs_timeout);
855 rs->rs_state = RFCOMM_SESSION_CLOSED;
856 l2cap_disconnect_pcb(rs->rs_l2cap, 0);
857 break;
858
859 default:
860 DPRINTF("Received spurious UA(0)!\n");
861 break;
862 }
863
864 return;
865 }
866
867 /*
868 * If we have no DLC on this dlci, we may have aborted
869 * without shutting down properly, so check if the session
870 * needs disconnecting.
871 */
872 dlc = rfcomm_dlc_lookup(rs, dlci);
873 if (dlc == NULL)
874 goto check;
875
876 switch (dlc->rd_state) {
877 case RFCOMM_DLC_WAIT_RECV_UA: /* We sent SABM */
878 rfcomm_dlc_open(dlc);
879 return;
880
881 case RFCOMM_DLC_WAIT_DISCONNECT: /* We sent DISC */
882 rfcomm_dlc_close(dlc, 0);
883 break;
884
885 default:
886 DPRINTF("Received spurious UA(%d)!\n", dlci);
887 return;
888 }
889
890 check: /* last one out turns out the light */
891 if (LIST_EMPTY(&rs->rs_dlcs)) {
892 rs->rs_state = RFCOMM_SESSION_WAIT_DISCONNECT;
893 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC, 0);
894 callout_schedule(&rs->rs_timeout, rfcomm_ack_timeout * hz);
895 }
896 }
897
898 /*
899 * Receive Disconnected Mode Response
900 *
901 * If this does not apply to a known DLC then we may ignore it.
902 */
903 static void
rfcomm_session_recv_dm(struct rfcomm_session * rs,int dlci)904 rfcomm_session_recv_dm(struct rfcomm_session *rs, int dlci)
905 {
906 struct rfcomm_dlc *dlc;
907
908 DPRINTFN(5, "DM(%d)\n", dlci);
909
910 dlc = rfcomm_dlc_lookup(rs, dlci);
911 if (dlc == NULL)
912 return;
913
914 if (dlc->rd_state == RFCOMM_DLC_WAIT_CONNECT)
915 rfcomm_dlc_close(dlc, ECONNREFUSED);
916 else
917 rfcomm_dlc_close(dlc, ECONNRESET);
918 }
919
920 /*
921 * Receive Unnumbered Information with Header check (MCC or data packet)
922 */
923 static void
rfcomm_session_recv_uih(struct rfcomm_session * rs,int dlci,int pf,struct mbuf * m,int len)924 rfcomm_session_recv_uih(struct rfcomm_session *rs, int dlci,
925 int pf, struct mbuf *m, int len)
926 {
927 struct rfcomm_dlc *dlc;
928 uint8_t credits = 0;
929
930 DPRINTFN(10, "UIH(%d)\n", dlci);
931
932 if (dlci == 0) {
933 rfcomm_session_recv_mcc(rs, m);
934 return;
935 }
936
937 if (m->m_pkthdr.len != len + pf) {
938 DPRINTF("Bad Frame Length (%d), frame discarded\n",
939 m->m_pkthdr.len);
940
941 goto discard;
942 }
943
944 dlc = rfcomm_dlc_lookup(rs, dlci);
945 if (dlc == NULL) {
946 DPRINTF("UIH received for non existent DLC, discarded\n");
947 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DM, dlci);
948 goto discard;
949 }
950
951 if (dlc->rd_state != RFCOMM_DLC_OPEN) {
952 DPRINTF("non-open DLC (state = %d), discarded\n",
953 dlc->rd_state);
954 goto discard;
955 }
956
957 /* if PF is set, credits were included */
958 if (rs->rs_flags & RFCOMM_SESSION_CFC) {
959 if (pf != 0) {
960 if (m->m_pkthdr.len < sizeof(credits)) {
961 DPRINTF("Bad PF value, UIH discarded\n");
962 goto discard;
963 }
964
965 m_copydata(m, 0, sizeof(credits), &credits);
966 m_adj(m, sizeof(credits));
967
968 dlc->rd_txcred += credits;
969
970 if (credits > 0 && dlc->rd_txbuf != NULL)
971 rfcomm_dlc_start(dlc);
972 }
973
974 if (len == 0)
975 goto discard;
976
977 if (dlc->rd_rxcred == 0) {
978 DPRINTF("Credit limit reached, UIH discarded\n");
979 goto discard;
980 }
981
982 if (len > dlc->rd_rxsize) {
983 DPRINTF("UIH frame exceeds rxsize, discarded\n");
984 goto discard;
985 }
986
987 dlc->rd_rxcred--;
988 dlc->rd_rxsize -= len;
989 }
990
991 (*dlc->rd_proto->input)(dlc->rd_upper, m);
992 return;
993
994 discard:
995 m_freem(m);
996 }
997
998 /*
999 * Receive Multiplexer Control Command
1000 */
1001 static void
rfcomm_session_recv_mcc(struct rfcomm_session * rs,struct mbuf * m)1002 rfcomm_session_recv_mcc(struct rfcomm_session *rs, struct mbuf *m)
1003 {
1004 int type, cr, len;
1005 uint8_t b;
1006
1007 /*
1008 * Extract MCC header.
1009 *
1010 * Fields are variable length using extension bit = 1 to signify the
1011 * last octet in the sequence.
1012 *
1013 * Only single octet types are defined in TS 07.10/RFCOMM spec
1014 *
1015 * Length can realistically only use 15 bits (max RFCOMM MTU)
1016 */
1017 if (m->m_pkthdr.len < sizeof(b)) {
1018 DPRINTF("Short MCC header, discarded\n");
1019 goto release;
1020 }
1021
1022 m_copydata(m, 0, sizeof(b), &b);
1023 m_adj(m, sizeof(b));
1024
1025 if (RFCOMM_EA(b) == 0) { /* verify no extensions */
1026 DPRINTF("MCC type EA = 0, discarded\n");
1027 goto release;
1028 }
1029
1030 type = RFCOMM_MCC_TYPE(b);
1031 cr = RFCOMM_CR(b);
1032
1033 len = 0;
1034 do {
1035 if (m->m_pkthdr.len < sizeof(b)) {
1036 DPRINTF("Short MCC header, discarded\n");
1037 goto release;
1038 }
1039
1040 m_copydata(m, 0, sizeof(b), &b);
1041 m_adj(m, sizeof(b));
1042
1043 len = (len << 7) | (b >> 1);
1044 len = uimin(len, RFCOMM_MTU_MAX);
1045 } while (RFCOMM_EA(b) == 0);
1046
1047 if (len != m->m_pkthdr.len) {
1048 DPRINTF("Incorrect MCC length, discarded\n");
1049 goto release;
1050 }
1051
1052 DPRINTFN(2, "MCC %s type %2.2x (%d bytes)\n",
1053 (cr ? "command" : "response"), type, len);
1054
1055 /*
1056 * pass to command handler
1057 */
1058 switch(type) {
1059 case RFCOMM_MCC_TEST: /* Test */
1060 rfcomm_session_recv_mcc_test(rs, cr, m);
1061 break;
1062
1063 case RFCOMM_MCC_FCON: /* Flow Control On */
1064 rfcomm_session_recv_mcc_fcon(rs, cr);
1065 break;
1066
1067 case RFCOMM_MCC_FCOFF: /* Flow Control Off */
1068 rfcomm_session_recv_mcc_fcoff(rs, cr);
1069 break;
1070
1071 case RFCOMM_MCC_MSC: /* Modem Status Command */
1072 rfcomm_session_recv_mcc_msc(rs, cr, m);
1073 break;
1074
1075 case RFCOMM_MCC_RPN: /* Remote Port Negotiation */
1076 rfcomm_session_recv_mcc_rpn(rs, cr, m);
1077 break;
1078
1079 case RFCOMM_MCC_RLS: /* Remote Line Status */
1080 rfcomm_session_recv_mcc_rls(rs, cr, m);
1081 break;
1082
1083 case RFCOMM_MCC_PN: /* Parameter Negotiation */
1084 rfcomm_session_recv_mcc_pn(rs, cr, m);
1085 break;
1086
1087 case RFCOMM_MCC_NSC: /* Non Supported Command */
1088 rfcomm_session_recv_mcc_nsc(rs, cr, m);
1089 break;
1090
1091 default:
1092 b = RFCOMM_MKMCC_TYPE(cr, type);
1093 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_NSC, &b, sizeof(b));
1094 }
1095
1096 release:
1097 m_freem(m);
1098 }
1099
1100 /*
1101 * process TEST command/response
1102 */
1103 static void
rfcomm_session_recv_mcc_test(struct rfcomm_session * rs,int cr,struct mbuf * m)1104 rfcomm_session_recv_mcc_test(struct rfcomm_session *rs, int cr, struct mbuf *m)
1105 {
1106 void *data;
1107 int len;
1108
1109 if (cr == 0) /* ignore ack */
1110 return;
1111
1112 /*
1113 * we must send all the data they included back as is
1114 */
1115
1116 len = m->m_pkthdr.len;
1117 if (len > RFCOMM_MTU_MAX)
1118 return;
1119
1120 data = malloc(len, M_BLUETOOTH, M_NOWAIT);
1121 if (data == NULL)
1122 return;
1123
1124 m_copydata(m, 0, len, data);
1125 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_TEST, data, len);
1126 free(data, M_BLUETOOTH);
1127 }
1128
1129 /*
1130 * process Flow Control ON command/response
1131 */
1132 static void
rfcomm_session_recv_mcc_fcon(struct rfcomm_session * rs,int cr)1133 rfcomm_session_recv_mcc_fcon(struct rfcomm_session *rs, int cr)
1134 {
1135
1136 if (cr == 0) /* ignore ack */
1137 return;
1138
1139 rs->rs_flags |= RFCOMM_SESSION_RFC;
1140 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_FCON, NULL, 0);
1141 }
1142
1143 /*
1144 * process Flow Control OFF command/response
1145 */
1146 static void
rfcomm_session_recv_mcc_fcoff(struct rfcomm_session * rs,int cr)1147 rfcomm_session_recv_mcc_fcoff(struct rfcomm_session *rs, int cr)
1148 {
1149
1150 if (cr == 0) /* ignore ack */
1151 return;
1152
1153 rs->rs_flags &= ~RFCOMM_SESSION_RFC;
1154 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_FCOFF, NULL, 0);
1155 }
1156
1157 /*
1158 * process Modem Status Command command/response
1159 */
1160 static void
rfcomm_session_recv_mcc_msc(struct rfcomm_session * rs,int cr,struct mbuf * m)1161 rfcomm_session_recv_mcc_msc(struct rfcomm_session *rs, int cr, struct mbuf *m)
1162 {
1163 struct rfcomm_mcc_msc msc; /* (3 octets) */
1164 struct rfcomm_dlc *dlc;
1165 int len = 0;
1166
1167 /* [ADDRESS] */
1168 if (m->m_pkthdr.len < sizeof(msc.address))
1169 return;
1170
1171 m_copydata(m, 0, sizeof(msc.address), &msc.address);
1172 m_adj(m, sizeof(msc.address));
1173 len += sizeof(msc.address);
1174
1175 dlc = rfcomm_dlc_lookup(rs, RFCOMM_DLCI(msc.address));
1176
1177 if (cr == 0) { /* ignore acks */
1178 if (dlc != NULL)
1179 callout_stop(&dlc->rd_timeout);
1180
1181 return;
1182 }
1183
1184 if (dlc == NULL) {
1185 rfcomm_session_send_frame(rs, RFCOMM_FRAME_DM,
1186 RFCOMM_DLCI(msc.address));
1187 return;
1188 }
1189
1190 /* [SIGNALS] */
1191 if (m->m_pkthdr.len < sizeof(msc.modem))
1192 return;
1193
1194 m_copydata(m, 0, sizeof(msc.modem), &msc.modem);
1195 m_adj(m, sizeof(msc.modem));
1196 len += sizeof(msc.modem);
1197
1198 dlc->rd_rmodem = msc.modem;
1199 /* XXX how do we signal this upstream? */
1200
1201 if (RFCOMM_EA(msc.modem) == 0) {
1202 if (m->m_pkthdr.len < sizeof(msc.brk))
1203 return;
1204
1205 m_copydata(m, 0, sizeof(msc.brk), &msc.brk);
1206 m_adj(m, sizeof(msc.brk));
1207 len += sizeof(msc.brk);
1208
1209 /* XXX how do we signal this upstream? */
1210 }
1211
1212 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_MSC, &msc, len);
1213 }
1214
1215 /*
1216 * process Remote Port Negotiation command/response
1217 */
1218 static void
rfcomm_session_recv_mcc_rpn(struct rfcomm_session * rs,int cr,struct mbuf * m)1219 rfcomm_session_recv_mcc_rpn(struct rfcomm_session *rs, int cr, struct mbuf *m)
1220 {
1221 struct rfcomm_mcc_rpn rpn;
1222 uint16_t mask;
1223
1224 if (cr == 0) /* ignore ack */
1225 return;
1226
1227 /* default values */
1228 rpn.bit_rate = RFCOMM_RPN_BR_9600;
1229 rpn.line_settings = RFCOMM_RPN_8_N_1;
1230 rpn.flow_control = RFCOMM_RPN_FLOW_NONE;
1231 rpn.xon_char = RFCOMM_RPN_XON_CHAR;
1232 rpn.xoff_char = RFCOMM_RPN_XOFF_CHAR;
1233
1234 if (m->m_pkthdr.len == sizeof(rpn)) {
1235 /* negotiation request */
1236 m_copydata(m, 0, sizeof(rpn), &rpn);
1237 rpn.param_mask = le16toh(rpn.param_mask);
1238 } else if (m->m_pkthdr.len == 1) {
1239 /* current settings request */
1240 m_copydata(m, 0, 1, &rpn.dlci);
1241 rpn.param_mask = RFCOMM_RPN_PM_ALL;
1242 } else {
1243 DPRINTF("Bad RPN length (%d)\n", m->m_pkthdr.len);
1244 return;
1245 }
1246
1247 mask = 0;
1248
1249 if (rpn.param_mask & RFCOMM_RPN_PM_RATE)
1250 mask |= RFCOMM_RPN_PM_RATE;
1251
1252 if (rpn.param_mask & RFCOMM_RPN_PM_DATA
1253 && RFCOMM_RPN_DATA_BITS(rpn.line_settings) == RFCOMM_RPN_DATA_8)
1254 mask |= RFCOMM_RPN_PM_DATA;
1255
1256 if (rpn.param_mask & RFCOMM_RPN_PM_STOP
1257 && RFCOMM_RPN_STOP_BITS(rpn.line_settings) == RFCOMM_RPN_STOP_1)
1258 mask |= RFCOMM_RPN_PM_STOP;
1259
1260 if (rpn.param_mask & RFCOMM_RPN_PM_PARITY
1261 && RFCOMM_RPN_PARITY(rpn.line_settings) == RFCOMM_RPN_PARITY_NONE)
1262 mask |= RFCOMM_RPN_PM_PARITY;
1263
1264 if (rpn.param_mask & RFCOMM_RPN_PM_XON
1265 && rpn.xon_char == RFCOMM_RPN_XON_CHAR)
1266 mask |= RFCOMM_RPN_PM_XON;
1267
1268 if (rpn.param_mask & RFCOMM_RPN_PM_XOFF
1269 && rpn.xoff_char == RFCOMM_RPN_XOFF_CHAR)
1270 mask |= RFCOMM_RPN_PM_XOFF;
1271
1272 if (rpn.param_mask & RFCOMM_RPN_PM_FLOW
1273 && rpn.flow_control == RFCOMM_RPN_FLOW_NONE)
1274 mask |= RFCOMM_RPN_PM_FLOW;
1275
1276 rpn.param_mask = htole16(mask);
1277
1278 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_RPN, &rpn, sizeof(rpn));
1279 }
1280
1281 /*
1282 * process Remote Line Status command/response
1283 */
1284 static void
rfcomm_session_recv_mcc_rls(struct rfcomm_session * rs,int cr,struct mbuf * m)1285 rfcomm_session_recv_mcc_rls(struct rfcomm_session *rs, int cr, struct mbuf *m)
1286 {
1287 struct rfcomm_mcc_rls rls;
1288
1289 if (cr == 0) /* ignore ack */
1290 return;
1291
1292 if (m->m_pkthdr.len != sizeof(rls)) {
1293 DPRINTF("Bad RLS length %d\n", m->m_pkthdr.len);
1294 return;
1295 }
1296
1297 m_copydata(m, 0, sizeof(rls), &rls);
1298
1299 /*
1300 * So far as I can tell, we just send back what
1301 * they sent us. This signifies errors that seem
1302 * irrelevent for RFCOMM over L2CAP.
1303 */
1304 rls.address |= 0x03; /* EA = 1, CR = 1 */
1305 rls.status &= 0x0f; /* only 4 bits valid */
1306
1307 rfcomm_session_send_mcc(rs, 0, RFCOMM_MCC_RLS, &rls, sizeof(rls));
1308 }
1309
1310 /*
1311 * process Parameter Negotiation command/response
1312 */
1313 static void
rfcomm_session_recv_mcc_pn(struct rfcomm_session * rs,int cr,struct mbuf * m)1314 rfcomm_session_recv_mcc_pn(struct rfcomm_session *rs, int cr, struct mbuf *m)
1315 {
1316 struct rfcomm_dlc *dlc;
1317 struct rfcomm_mcc_pn pn;
1318 int err;
1319
1320 if (m->m_pkthdr.len != sizeof(pn)) {
1321 DPRINTF("Bad PN length %d\n", m->m_pkthdr.len);
1322 return;
1323 }
1324
1325 m_copydata(m, 0, sizeof(pn), &pn);
1326
1327 pn.dlci &= 0x3f;
1328 pn.mtu = le16toh(pn.mtu);
1329
1330 dlc = rfcomm_dlc_lookup(rs, pn.dlci);
1331 if (cr) { /* Command */
1332 /*
1333 * If there is no DLC present, this is a new
1334 * connection so attempt to make one
1335 */
1336 if (dlc == NULL) {
1337 dlc = rfcomm_dlc_newconn(rs, pn.dlci);
1338 if (dlc == NULL)
1339 return; /* (DM is sent) */
1340 }
1341
1342 /* accept any valid MTU, and offer it back */
1343 pn.mtu = uimin(pn.mtu, RFCOMM_MTU_MAX);
1344 pn.mtu = uimin(pn.mtu, rs->rs_mtu);
1345 pn.mtu = uimax(pn.mtu, RFCOMM_MTU_MIN);
1346 dlc->rd_mtu = pn.mtu;
1347 pn.mtu = htole16(pn.mtu);
1348
1349 /* credits are only set before DLC is open */
1350 if (dlc->rd_state == RFCOMM_DLC_WAIT_CONNECT
1351 && (pn.flow_control & 0xf0) == 0xf0) {
1352 rs->rs_flags |= RFCOMM_SESSION_CFC;
1353 dlc->rd_txcred = pn.credits & 0x07;
1354
1355 dlc->rd_rxcred = (dlc->rd_rxsize / dlc->rd_mtu);
1356 dlc->rd_rxcred = uimin(dlc->rd_rxcred,
1357 RFCOMM_CREDITS_DEFAULT);
1358
1359 pn.flow_control = 0xe0;
1360 pn.credits = dlc->rd_rxcred;
1361 } else {
1362 pn.flow_control = 0x00;
1363 pn.credits = 0x00;
1364 }
1365
1366 /* unused fields must be ignored and set to zero */
1367 pn.ack_timer = 0;
1368 pn.max_retrans = 0;
1369
1370 /* send our response */
1371 err = rfcomm_session_send_mcc(rs, 0,
1372 RFCOMM_MCC_PN, &pn, sizeof(pn));
1373 if (err)
1374 goto close;
1375
1376 } else { /* Response */
1377 /* ignore responses with no matching DLC */
1378 if (dlc == NULL)
1379 return;
1380
1381 callout_stop(&dlc->rd_timeout);
1382
1383 /* reject invalid or unacceptable MTU */
1384 if (pn.mtu < RFCOMM_MTU_MIN || pn.mtu > dlc->rd_mtu) {
1385 dlc->rd_state = RFCOMM_DLC_WAIT_DISCONNECT;
1386 err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC,
1387 pn.dlci);
1388 if (err)
1389 goto close;
1390
1391 callout_schedule(&dlc->rd_timeout,
1392 rfcomm_ack_timeout * hz);
1393 return;
1394 }
1395 dlc->rd_mtu = pn.mtu;
1396
1397 /* if DLC is not waiting to connect, we are done */
1398 if (dlc->rd_state != RFCOMM_DLC_WAIT_CONNECT)
1399 return;
1400
1401 /* set initial credits according to RFCOMM spec */
1402 if ((pn.flow_control & 0xf0) == 0xe0) {
1403 rs->rs_flags |= RFCOMM_SESSION_CFC;
1404 dlc->rd_txcred = (pn.credits & 0x07);
1405 }
1406
1407 callout_schedule(&dlc->rd_timeout, rfcomm_ack_timeout * hz);
1408
1409 /* set link mode */
1410 err = rfcomm_dlc_setmode(dlc);
1411 if (err == EINPROGRESS) {
1412 dlc->rd_state = RFCOMM_DLC_WAIT_SEND_SABM;
1413 (*dlc->rd_proto->connecting)(dlc->rd_upper);
1414 return;
1415 }
1416 if (err)
1417 goto close;
1418
1419 /* we can proceed now */
1420 err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_SABM, pn.dlci);
1421 if (err)
1422 goto close;
1423
1424 dlc->rd_state = RFCOMM_DLC_WAIT_RECV_UA;
1425 }
1426 return;
1427
1428 close:
1429 rfcomm_dlc_close(dlc, err);
1430 }
1431
1432 /*
1433 * process Non Supported Command command/response
1434 */
1435 static void
rfcomm_session_recv_mcc_nsc(struct rfcomm_session * rs,int cr,struct mbuf * m)1436 rfcomm_session_recv_mcc_nsc(struct rfcomm_session *rs,
1437 int cr, struct mbuf *m)
1438 {
1439 struct rfcomm_dlc *dlc, *next;
1440
1441 /*
1442 * Since we did nothing that is not mandatory,
1443 * we just abort the whole session..
1444 */
1445
1446 next = LIST_FIRST(&rs->rs_dlcs);
1447 while ((dlc = next) != NULL) {
1448 next = LIST_NEXT(dlc, rd_next);
1449 rfcomm_dlc_close(dlc, ECONNABORTED);
1450 }
1451
1452 rfcomm_session_free(rs);
1453 }
1454
1455 /***********************************************************************
1456 *
1457 * RFCOMM Session outward frame/uih/mcc building
1458 */
1459
1460 /*
1461 * SABM/DISC/DM/UA frames are all minimal and mostly identical.
1462 */
1463 int
rfcomm_session_send_frame(struct rfcomm_session * rs,int type,int dlci)1464 rfcomm_session_send_frame(struct rfcomm_session *rs, int type, int dlci)
1465 {
1466 struct rfcomm_cmd_hdr *hdr;
1467 struct rfcomm_credit *credit;
1468 struct mbuf *m;
1469 uint8_t fcs, cr;
1470
1471 credit = pool_get(&rfcomm_credit_pool, PR_NOWAIT);
1472 if (credit == NULL)
1473 return ENOMEM;
1474
1475 m = m_gethdr(M_DONTWAIT, MT_DATA);
1476 if (m == NULL) {
1477 pool_put(&rfcomm_credit_pool, credit);
1478 return ENOMEM;
1479 }
1480
1481 /*
1482 * The CR (command/response) bit identifies the frame either as a
1483 * command or a response and is used along with the DLCI to form
1484 * the address. Commands contain the non-initiator address, whereas
1485 * responses contain the initiator address, so the CR value is
1486 * also dependent on the session direction.
1487 */
1488 if (type == RFCOMM_FRAME_UA || type == RFCOMM_FRAME_DM)
1489 cr = IS_INITIATOR(rs) ? 0 : 1;
1490 else
1491 cr = IS_INITIATOR(rs) ? 1 : 0;
1492
1493 hdr = mtod(m, struct rfcomm_cmd_hdr *);
1494 hdr->address = RFCOMM_MKADDRESS(cr, dlci);
1495 hdr->control = RFCOMM_MKCONTROL(type, 1); /* PF = 1 */
1496 hdr->length = (0x00 << 1) | 0x01; /* len = 0x00, EA = 1 */
1497
1498 fcs = 0xff;
1499 fcs = FCS(fcs, hdr->address);
1500 fcs = FCS(fcs, hdr->control);
1501 fcs = FCS(fcs, hdr->length);
1502 fcs = 0xff - fcs; /* ones complement */
1503 hdr->fcs = fcs;
1504
1505 m->m_pkthdr.len = m->m_len = sizeof(struct rfcomm_cmd_hdr);
1506
1507 /* empty credit note */
1508 credit->rc_dlc = NULL;
1509 credit->rc_len = m->m_pkthdr.len;
1510 SIMPLEQ_INSERT_TAIL(&rs->rs_credits, credit, rc_next);
1511
1512 DPRINTFN(5, "dlci %d type %2.2x (%d bytes, fcs=%#2.2x)\n",
1513 dlci, type, m->m_pkthdr.len, fcs);
1514
1515 return l2cap_send_pcb(rs->rs_l2cap, m);
1516 }
1517
1518 /*
1519 * rfcomm_session_send_uih(rfcomm_session, rfcomm_dlc, credits, mbuf)
1520 *
1521 * UIH frame is per DLC data or Multiplexer Control Commands
1522 * when no DLC is given. Data mbuf is optional (just credits
1523 * will be sent in that case)
1524 */
1525 int
rfcomm_session_send_uih(struct rfcomm_session * rs,struct rfcomm_dlc * dlc,int credits,struct mbuf * m)1526 rfcomm_session_send_uih(struct rfcomm_session *rs, struct rfcomm_dlc *dlc,
1527 int credits, struct mbuf *m)
1528 {
1529 struct rfcomm_credit *credit;
1530 struct mbuf *m0 = NULL;
1531 int err, len;
1532 uint8_t fcs, *hdr;
1533
1534 KASSERT(rs != NULL);
1535
1536 len = (m == NULL) ? 0 : m->m_pkthdr.len;
1537 KASSERT(!(credits == 0 && len == 0));
1538
1539 /*
1540 * Make a credit note for the completion notification
1541 */
1542 credit = pool_get(&rfcomm_credit_pool, PR_NOWAIT);
1543 if (credit == NULL)
1544 goto nomem;
1545
1546 credit->rc_len = len;
1547 credit->rc_dlc = dlc;
1548
1549 /*
1550 * Wrap UIH frame information around payload.
1551 *
1552 * [ADDRESS] [CONTROL] [LENGTH] [CREDITS] [...] [FCS]
1553 *
1554 * Address is one octet.
1555 * Control is one octet.
1556 * Length is one or two octets.
1557 * Credits may be one octet.
1558 *
1559 * FCS is one octet and calculated on address and
1560 * control octets only.
1561 *
1562 * If there are credits to be sent, we will set the PF
1563 * flag and include them in the frame.
1564 */
1565 m0 = m_gethdr(M_DONTWAIT, MT_DATA);
1566 if (m0 == NULL)
1567 goto nomem;
1568
1569 m_align(m0, 5); /* (max 5 header octets) */
1570 hdr = mtod(m0, uint8_t *);
1571
1572 /* CR bit is set according to the initiator of the session */
1573 *hdr = RFCOMM_MKADDRESS((IS_INITIATOR(rs) ? 1 : 0),
1574 (dlc ? dlc->rd_dlci : 0));
1575 fcs = FCS(0xff, *hdr);
1576 hdr++;
1577
1578 /* PF bit is set if credits are being sent */
1579 *hdr = RFCOMM_MKCONTROL(RFCOMM_FRAME_UIH, (credits > 0 ? 1 : 0));
1580 fcs = FCS(fcs, *hdr);
1581 hdr++;
1582
1583 if (len < (1 << 7)) {
1584 *hdr++ = ((len << 1) & 0xfe) | 0x01; /* 7 bits, EA = 1 */
1585 } else {
1586 *hdr++ = ((len << 1) & 0xfe); /* 7 bits, EA = 0 */
1587 *hdr++ = ((len >> 7) & 0xff); /* 8 bits, no EA */
1588 }
1589
1590 if (credits > 0)
1591 *hdr++ = (uint8_t)credits;
1592
1593 m0->m_len = hdr - mtod(m0, uint8_t *);
1594
1595 /* Append payload */
1596 m0->m_next = m;
1597 m = NULL;
1598
1599 m0->m_pkthdr.len = m0->m_len + len;
1600
1601 /* Append FCS */
1602 fcs = 0xff - fcs; /* ones complement */
1603 len = m0->m_pkthdr.len;
1604 m_copyback(m0, len, sizeof(fcs), &fcs);
1605 if (m0->m_pkthdr.len != len + sizeof(fcs))
1606 goto nomem;
1607
1608 DPRINTFN(10, "dlci %d, pktlen %d (%d data, %d credits), fcs=%#2.2x\n",
1609 dlc ? dlc->rd_dlci : 0, m0->m_pkthdr.len, credit->rc_len,
1610 credits, fcs);
1611
1612 /*
1613 * UIH frame ready to go..
1614 */
1615 err = l2cap_send_pcb(rs->rs_l2cap, m0);
1616 if (err)
1617 goto fail;
1618
1619 SIMPLEQ_INSERT_TAIL(&rs->rs_credits, credit, rc_next);
1620 return 0;
1621
1622 nomem:
1623 err = ENOMEM;
1624
1625 if (m0 != NULL)
1626 m_freem(m0);
1627
1628 if (m != NULL)
1629 m_freem(m);
1630
1631 fail:
1632 if (credit != NULL)
1633 pool_put(&rfcomm_credit_pool, credit);
1634
1635 return err;
1636 }
1637
1638 /*
1639 * send Multiplexer Control Command (or Response) on session
1640 */
1641 int
rfcomm_session_send_mcc(struct rfcomm_session * rs,int cr,uint8_t type,void * data,int len)1642 rfcomm_session_send_mcc(struct rfcomm_session *rs, int cr,
1643 uint8_t type, void *data, int len)
1644 {
1645 struct mbuf *m;
1646 uint8_t *hdr;
1647 int hlen;
1648
1649 m = m_gethdr(M_DONTWAIT, MT_DATA);
1650 if (m == NULL)
1651 return ENOMEM;
1652
1653 hdr = mtod(m, uint8_t *);
1654
1655 /*
1656 * Technically the type field can extend past one octet, but none
1657 * currently defined will do that.
1658 */
1659 *hdr++ = RFCOMM_MKMCC_TYPE(cr, type);
1660
1661 /*
1662 * In the frame, the max length size is 2 octets (15 bits) whereas
1663 * no max length size is specified for MCC commands. We must allow
1664 * for 3 octets since for MCC frames we use 7 bits + EA in each.
1665 *
1666 * Only test data can possibly be that big.
1667 *
1668 * XXX Should we check this against the MTU?
1669 */
1670 if (len < (1 << 7)) {
1671 *hdr++ = ((len << 1) & 0xfe) | 0x01; /* 7 bits, EA = 1 */
1672 } else if (len < (1 << 14)) {
1673 *hdr++ = ((len << 1) & 0xfe); /* 7 bits, EA = 0 */
1674 *hdr++ = ((len >> 6) & 0xfe) | 0x01; /* 7 bits, EA = 1 */
1675 } else if (len < (1 << 15)) {
1676 *hdr++ = ((len << 1) & 0xfe); /* 7 bits, EA = 0 */
1677 *hdr++ = ((len >> 6) & 0xfe); /* 7 bits, EA = 0 */
1678 *hdr++ = ((len >> 13) & 0x02) | 0x01; /* 1 bit, EA = 1 */
1679 } else {
1680 DPRINTF("incredible length! (%d)\n", len);
1681 m_freem(m);
1682 return EMSGSIZE;
1683 }
1684
1685 /*
1686 * add command data (to same mbuf if possible)
1687 */
1688 hlen = hdr - mtod(m, uint8_t *);
1689
1690 if (len > 0) {
1691 m->m_pkthdr.len = m->m_len = MHLEN;
1692 m_copyback(m, hlen, len, data);
1693 if (m->m_pkthdr.len != uimax(MHLEN, hlen + len)) {
1694 m_freem(m);
1695 return ENOMEM;
1696 }
1697 }
1698
1699 m->m_pkthdr.len = hlen + len;
1700 m->m_len = uimin(MHLEN, m->m_pkthdr.len);
1701
1702 DPRINTFN(5, "%s type %2.2x len %d\n",
1703 (cr ? "command" : "response"), type, m->m_pkthdr.len);
1704
1705 return rfcomm_session_send_uih(rs, NULL, 0, m);
1706 }
1707