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