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