1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#ifndef __L2CAP_H
28#define __L2CAP_H
29
30#include <asm/unaligned.h>
31
32
33#define L2CAP_DEFAULT_MTU 672
34#define L2CAP_DEFAULT_MIN_MTU 48
35#define L2CAP_DEFAULT_FLUSH_TO 0xFFFF
36#define L2CAP_EFS_DEFAULT_FLUSH_TO 0xFFFFFFFF
37#define L2CAP_DEFAULT_TX_WINDOW 63
38#define L2CAP_DEFAULT_EXT_WINDOW 0x3FFF
39#define L2CAP_DEFAULT_MAX_TX 3
40#define L2CAP_DEFAULT_RETRANS_TO 2000
41#define L2CAP_DEFAULT_MONITOR_TO 12000
42#define L2CAP_DEFAULT_MAX_PDU_SIZE 1492
43#define L2CAP_DEFAULT_ACK_TO 200
44#define L2CAP_DEFAULT_MAX_SDU_SIZE 0xFFFF
45#define L2CAP_DEFAULT_SDU_ITIME 0xFFFFFFFF
46#define L2CAP_DEFAULT_ACC_LAT 0xFFFFFFFF
47#define L2CAP_BREDR_MAX_PAYLOAD 1019
48#define L2CAP_LE_MIN_MTU 23
49
50#define L2CAP_DISC_TIMEOUT msecs_to_jiffies(100)
51#define L2CAP_DISC_REJ_TIMEOUT msecs_to_jiffies(5000)
52#define L2CAP_ENC_TIMEOUT msecs_to_jiffies(5000)
53#define L2CAP_CONN_TIMEOUT msecs_to_jiffies(40000)
54#define L2CAP_INFO_TIMEOUT msecs_to_jiffies(4000)
55#define L2CAP_MOVE_TIMEOUT msecs_to_jiffies(4000)
56#define L2CAP_MOVE_ERTX_TIMEOUT msecs_to_jiffies(60000)
57
58#define L2CAP_A2MP_DEFAULT_MTU 670
59
60
61struct sockaddr_l2 {
62 sa_family_t l2_family;
63 __le16 l2_psm;
64 bdaddr_t l2_bdaddr;
65 __le16 l2_cid;
66 __u8 l2_bdaddr_type;
67};
68
69
70#define L2CAP_OPTIONS 0x01
71struct l2cap_options {
72 __u16 omtu;
73 __u16 imtu;
74 __u16 flush_to;
75 __u8 mode;
76 __u8 fcs;
77 __u8 max_tx;
78 __u16 txwin_size;
79};
80
81#define L2CAP_CONNINFO 0x02
82struct l2cap_conninfo {
83 __u16 hci_handle;
84 __u8 dev_class[3];
85};
86
87#define L2CAP_LM 0x03
88#define L2CAP_LM_MASTER 0x0001
89#define L2CAP_LM_AUTH 0x0002
90#define L2CAP_LM_ENCRYPT 0x0004
91#define L2CAP_LM_TRUSTED 0x0008
92#define L2CAP_LM_RELIABLE 0x0010
93#define L2CAP_LM_SECURE 0x0020
94
95
96#define L2CAP_COMMAND_REJ 0x01
97#define L2CAP_CONN_REQ 0x02
98#define L2CAP_CONN_RSP 0x03
99#define L2CAP_CONF_REQ 0x04
100#define L2CAP_CONF_RSP 0x05
101#define L2CAP_DISCONN_REQ 0x06
102#define L2CAP_DISCONN_RSP 0x07
103#define L2CAP_ECHO_REQ 0x08
104#define L2CAP_ECHO_RSP 0x09
105#define L2CAP_INFO_REQ 0x0a
106#define L2CAP_INFO_RSP 0x0b
107#define L2CAP_CREATE_CHAN_REQ 0x0c
108#define L2CAP_CREATE_CHAN_RSP 0x0d
109#define L2CAP_MOVE_CHAN_REQ 0x0e
110#define L2CAP_MOVE_CHAN_RSP 0x0f
111#define L2CAP_MOVE_CHAN_CFM 0x10
112#define L2CAP_MOVE_CHAN_CFM_RSP 0x11
113#define L2CAP_CONN_PARAM_UPDATE_REQ 0x12
114#define L2CAP_CONN_PARAM_UPDATE_RSP 0x13
115
116
117#define L2CAP_FEAT_FLOWCTL 0x00000001
118#define L2CAP_FEAT_RETRANS 0x00000002
119#define L2CAP_FEAT_BIDIR_QOS 0x00000004
120#define L2CAP_FEAT_ERTM 0x00000008
121#define L2CAP_FEAT_STREAMING 0x00000010
122#define L2CAP_FEAT_FCS 0x00000020
123#define L2CAP_FEAT_EXT_FLOW 0x00000040
124#define L2CAP_FEAT_FIXED_CHAN 0x00000080
125#define L2CAP_FEAT_EXT_WINDOW 0x00000100
126#define L2CAP_FEAT_UCD 0x00000200
127
128
129#define L2CAP_FCS_NONE 0x00
130#define L2CAP_FCS_CRC16 0x01
131
132
133#define L2CAP_FC_L2CAP 0x02
134#define L2CAP_FC_A2MP 0x08
135
136
137#define L2CAP_CTRL_SAR 0xC000
138#define L2CAP_CTRL_REQSEQ 0x3F00
139#define L2CAP_CTRL_TXSEQ 0x007E
140#define L2CAP_CTRL_SUPERVISE 0x000C
141
142#define L2CAP_CTRL_RETRANS 0x0080
143#define L2CAP_CTRL_FINAL 0x0080
144#define L2CAP_CTRL_POLL 0x0010
145#define L2CAP_CTRL_FRAME_TYPE 0x0001
146
147#define L2CAP_CTRL_TXSEQ_SHIFT 1
148#define L2CAP_CTRL_SUPER_SHIFT 2
149#define L2CAP_CTRL_POLL_SHIFT 4
150#define L2CAP_CTRL_FINAL_SHIFT 7
151#define L2CAP_CTRL_REQSEQ_SHIFT 8
152#define L2CAP_CTRL_SAR_SHIFT 14
153
154
155#define L2CAP_EXT_CTRL_TXSEQ 0xFFFC0000
156#define L2CAP_EXT_CTRL_SAR 0x00030000
157#define L2CAP_EXT_CTRL_SUPERVISE 0x00030000
158#define L2CAP_EXT_CTRL_REQSEQ 0x0000FFFC
159
160#define L2CAP_EXT_CTRL_POLL 0x00040000
161#define L2CAP_EXT_CTRL_FINAL 0x00000002
162#define L2CAP_EXT_CTRL_FRAME_TYPE 0x00000001
163
164#define L2CAP_EXT_CTRL_FINAL_SHIFT 1
165#define L2CAP_EXT_CTRL_REQSEQ_SHIFT 2
166#define L2CAP_EXT_CTRL_SAR_SHIFT 16
167#define L2CAP_EXT_CTRL_SUPER_SHIFT 16
168#define L2CAP_EXT_CTRL_POLL_SHIFT 18
169#define L2CAP_EXT_CTRL_TXSEQ_SHIFT 18
170
171
172#define L2CAP_SUPER_RR 0x00
173#define L2CAP_SUPER_REJ 0x01
174#define L2CAP_SUPER_RNR 0x02
175#define L2CAP_SUPER_SREJ 0x03
176
177
178#define L2CAP_SAR_UNSEGMENTED 0x00
179#define L2CAP_SAR_START 0x01
180#define L2CAP_SAR_END 0x02
181#define L2CAP_SAR_CONTINUE 0x03
182
183
184#define L2CAP_REJ_NOT_UNDERSTOOD 0x0000
185#define L2CAP_REJ_MTU_EXCEEDED 0x0001
186#define L2CAP_REJ_INVALID_CID 0x0002
187
188
189struct l2cap_hdr {
190 __le16 len;
191 __le16 cid;
192} __packed;
193#define L2CAP_HDR_SIZE 4
194#define L2CAP_ENH_HDR_SIZE 6
195#define L2CAP_EXT_HDR_SIZE 8
196
197#define L2CAP_FCS_SIZE 2
198#define L2CAP_SDULEN_SIZE 2
199#define L2CAP_PSMLEN_SIZE 2
200#define L2CAP_ENH_CTRL_SIZE 2
201#define L2CAP_EXT_CTRL_SIZE 4
202
203struct l2cap_cmd_hdr {
204 __u8 code;
205 __u8 ident;
206 __le16 len;
207} __packed;
208#define L2CAP_CMD_HDR_SIZE 4
209
210struct l2cap_cmd_rej_unk {
211 __le16 reason;
212} __packed;
213
214struct l2cap_cmd_rej_mtu {
215 __le16 reason;
216 __le16 max_mtu;
217} __packed;
218
219struct l2cap_cmd_rej_cid {
220 __le16 reason;
221 __le16 scid;
222 __le16 dcid;
223} __packed;
224
225struct l2cap_conn_req {
226 __le16 psm;
227 __le16 scid;
228} __packed;
229
230struct l2cap_conn_rsp {
231 __le16 dcid;
232 __le16 scid;
233 __le16 result;
234 __le16 status;
235} __packed;
236
237
238#define L2CAP_PSM_SDP 0x0001
239#define L2CAP_PSM_RFCOMM 0x0003
240
241
242#define L2CAP_CID_SIGNALING 0x0001
243#define L2CAP_CID_CONN_LESS 0x0002
244#define L2CAP_CID_A2MP 0x0003
245#define L2CAP_CID_ATT 0x0004
246#define L2CAP_CID_LE_SIGNALING 0x0005
247#define L2CAP_CID_SMP 0x0006
248#define L2CAP_CID_DYN_START 0x0040
249#define L2CAP_CID_DYN_END 0xffff
250
251
252#define L2CAP_CR_SUCCESS 0x0000
253#define L2CAP_CR_PEND 0x0001
254#define L2CAP_CR_BAD_PSM 0x0002
255#define L2CAP_CR_SEC_BLOCK 0x0003
256#define L2CAP_CR_NO_MEM 0x0004
257#define L2CAP_CR_BAD_AMP 0x0005
258
259
260#define L2CAP_CS_NO_INFO 0x0000
261#define L2CAP_CS_AUTHEN_PEND 0x0001
262#define L2CAP_CS_AUTHOR_PEND 0x0002
263
264struct l2cap_conf_req {
265 __le16 dcid;
266 __le16 flags;
267 __u8 data[0];
268} __packed;
269
270struct l2cap_conf_rsp {
271 __le16 scid;
272 __le16 flags;
273 __le16 result;
274 __u8 data[0];
275} __packed;
276
277#define L2CAP_CONF_SUCCESS 0x0000
278#define L2CAP_CONF_UNACCEPT 0x0001
279#define L2CAP_CONF_REJECT 0x0002
280#define L2CAP_CONF_UNKNOWN 0x0003
281#define L2CAP_CONF_PENDING 0x0004
282#define L2CAP_CONF_EFS_REJECT 0x0005
283
284
285#define L2CAP_CONF_FLAG_CONTINUATION 0x0001
286
287struct l2cap_conf_opt {
288 __u8 type;
289 __u8 len;
290 __u8 val[0];
291} __packed;
292#define L2CAP_CONF_OPT_SIZE 2
293
294#define L2CAP_CONF_HINT 0x80
295#define L2CAP_CONF_MASK 0x7f
296
297#define L2CAP_CONF_MTU 0x01
298#define L2CAP_CONF_FLUSH_TO 0x02
299#define L2CAP_CONF_QOS 0x03
300#define L2CAP_CONF_RFC 0x04
301#define L2CAP_CONF_FCS 0x05
302#define L2CAP_CONF_EFS 0x06
303#define L2CAP_CONF_EWS 0x07
304
305#define L2CAP_CONF_MAX_SIZE 22
306
307struct l2cap_conf_rfc {
308 __u8 mode;
309 __u8 txwin_size;
310 __u8 max_transmit;
311 __le16 retrans_timeout;
312 __le16 monitor_timeout;
313 __le16 max_pdu_size;
314} __packed;
315
316#define L2CAP_MODE_BASIC 0x00
317#define L2CAP_MODE_RETRANS 0x01
318#define L2CAP_MODE_FLOWCTL 0x02
319#define L2CAP_MODE_ERTM 0x03
320#define L2CAP_MODE_STREAMING 0x04
321
322struct l2cap_conf_efs {
323 __u8 id;
324 __u8 stype;
325 __le16 msdu;
326 __le32 sdu_itime;
327 __le32 acc_lat;
328 __le32 flush_to;
329} __packed;
330
331#define L2CAP_SERV_NOTRAFIC 0x00
332#define L2CAP_SERV_BESTEFFORT 0x01
333#define L2CAP_SERV_GUARANTEED 0x02
334
335#define L2CAP_BESTEFFORT_ID 0x01
336
337struct l2cap_disconn_req {
338 __le16 dcid;
339 __le16 scid;
340} __packed;
341
342struct l2cap_disconn_rsp {
343 __le16 dcid;
344 __le16 scid;
345} __packed;
346
347struct l2cap_info_req {
348 __le16 type;
349} __packed;
350
351struct l2cap_info_rsp {
352 __le16 type;
353 __le16 result;
354 __u8 data[0];
355} __packed;
356
357struct l2cap_create_chan_req {
358 __le16 psm;
359 __le16 scid;
360 __u8 amp_id;
361} __packed;
362
363struct l2cap_create_chan_rsp {
364 __le16 dcid;
365 __le16 scid;
366 __le16 result;
367 __le16 status;
368} __packed;
369
370struct l2cap_move_chan_req {
371 __le16 icid;
372 __u8 dest_amp_id;
373} __packed;
374
375struct l2cap_move_chan_rsp {
376 __le16 icid;
377 __le16 result;
378} __packed;
379
380#define L2CAP_MR_SUCCESS 0x0000
381#define L2CAP_MR_PEND 0x0001
382#define L2CAP_MR_BAD_ID 0x0002
383#define L2CAP_MR_SAME_ID 0x0003
384#define L2CAP_MR_NOT_SUPP 0x0004
385#define L2CAP_MR_COLLISION 0x0005
386#define L2CAP_MR_NOT_ALLOWED 0x0006
387
388struct l2cap_move_chan_cfm {
389 __le16 icid;
390 __le16 result;
391} __packed;
392
393#define L2CAP_MC_CONFIRMED 0x0000
394#define L2CAP_MC_UNCONFIRMED 0x0001
395
396struct l2cap_move_chan_cfm_rsp {
397 __le16 icid;
398} __packed;
399
400
401#define L2CAP_IT_CL_MTU 0x0001
402#define L2CAP_IT_FEAT_MASK 0x0002
403#define L2CAP_IT_FIXED_CHAN 0x0003
404
405
406#define L2CAP_IR_SUCCESS 0x0000
407#define L2CAP_IR_NOTSUPP 0x0001
408
409struct l2cap_conn_param_update_req {
410 __le16 min;
411 __le16 max;
412 __le16 latency;
413 __le16 to_multiplier;
414} __packed;
415
416struct l2cap_conn_param_update_rsp {
417 __le16 result;
418} __packed;
419
420
421#define L2CAP_CONN_PARAM_ACCEPTED 0x0000
422#define L2CAP_CONN_PARAM_REJECTED 0x0001
423
424
425struct l2cap_seq_list {
426 __u16 head;
427 __u16 tail;
428 __u16 mask;
429 __u16 *list;
430};
431
432#define L2CAP_SEQ_LIST_CLEAR 0xFFFF
433#define L2CAP_SEQ_LIST_TAIL 0x8000
434
435struct l2cap_chan {
436 struct sock *sk;
437
438 struct l2cap_conn *conn;
439 struct hci_conn *hs_hcon;
440 struct hci_chan *hs_hchan;
441 struct kref kref;
442
443 __u8 state;
444
445 __le16 psm;
446 __u16 dcid;
447 __u16 scid;
448
449 __u16 imtu;
450 __u16 omtu;
451 __u16 flush_to;
452 __u8 mode;
453 __u8 chan_type;
454 __u8 chan_policy;
455
456 __le16 sport;
457
458 __u8 sec_level;
459
460 __u8 ident;
461
462 __u8 conf_req[64];
463 __u8 conf_len;
464 __u8 num_conf_req;
465 __u8 num_conf_rsp;
466
467 __u8 fcs;
468
469 __u16 tx_win;
470 __u16 tx_win_max;
471 __u16 ack_win;
472 __u8 max_tx;
473 __u16 retrans_timeout;
474 __u16 monitor_timeout;
475 __u16 mps;
476
477 __u8 tx_state;
478 __u8 rx_state;
479
480 unsigned long conf_state;
481 unsigned long conn_state;
482 unsigned long flags;
483
484 __u8 remote_amp_id;
485 __u8 local_amp_id;
486 __u8 move_id;
487 __u8 move_state;
488 __u8 move_role;
489
490 __u16 next_tx_seq;
491 __u16 expected_ack_seq;
492 __u16 expected_tx_seq;
493 __u16 buffer_seq;
494 __u16 srej_save_reqseq;
495 __u16 last_acked_seq;
496 __u16 frames_sent;
497 __u16 unacked_frames;
498 __u8 retry_count;
499 __u16 sdu_len;
500 struct sk_buff *sdu;
501 struct sk_buff *sdu_last_frag;
502
503 __u16 remote_tx_win;
504 __u8 remote_max_tx;
505 __u16 remote_mps;
506
507 __u8 local_id;
508 __u8 local_stype;
509 __u16 local_msdu;
510 __u32 local_sdu_itime;
511 __u32 local_acc_lat;
512 __u32 local_flush_to;
513
514 __u8 remote_id;
515 __u8 remote_stype;
516 __u16 remote_msdu;
517 __u32 remote_sdu_itime;
518 __u32 remote_acc_lat;
519 __u32 remote_flush_to;
520
521 struct delayed_work chan_timer;
522 struct delayed_work retrans_timer;
523 struct delayed_work monitor_timer;
524 struct delayed_work ack_timer;
525
526 struct sk_buff *tx_send_head;
527 struct sk_buff_head tx_q;
528 struct sk_buff_head srej_q;
529 struct l2cap_seq_list srej_list;
530 struct l2cap_seq_list retrans_list;
531
532 struct list_head list;
533 struct list_head global_l;
534
535 void *data;
536 struct l2cap_ops *ops;
537 struct mutex lock;
538};
539
540struct l2cap_ops {
541 char *name;
542
543 struct l2cap_chan *(*new_connection) (struct l2cap_chan *chan);
544 int (*recv) (struct l2cap_chan * chan,
545 struct sk_buff *skb);
546 void (*teardown) (struct l2cap_chan *chan, int err);
547 void (*close) (struct l2cap_chan *chan);
548 void (*state_change) (struct l2cap_chan *chan,
549 int state);
550 void (*ready) (struct l2cap_chan *chan);
551 void (*defer) (struct l2cap_chan *chan);
552 struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan,
553 unsigned long len, int nb);
554};
555
556struct l2cap_conn {
557 struct hci_conn *hcon;
558 struct hci_chan *hchan;
559
560 bdaddr_t *dst;
561 bdaddr_t *src;
562
563 unsigned int mtu;
564
565 __u32 feat_mask;
566 __u8 fixed_chan_mask;
567
568 __u8 info_state;
569 __u8 info_ident;
570
571 struct delayed_work info_timer;
572
573 spinlock_t lock;
574
575 struct sk_buff *rx_skb;
576 __u32 rx_len;
577 __u8 tx_ident;
578
579 __u8 disc_reason;
580
581 struct delayed_work security_timer;
582 struct smp_chan *smp_chan;
583
584 struct list_head chan_l;
585 struct mutex chan_lock;
586 struct kref ref;
587 struct list_head users;
588};
589
590struct l2cap_user {
591 struct list_head list;
592 int (*probe) (struct l2cap_conn *conn, struct l2cap_user *user);
593 void (*remove) (struct l2cap_conn *conn, struct l2cap_user *user);
594};
595
596#define L2CAP_INFO_CL_MTU_REQ_SENT 0x01
597#define L2CAP_INFO_FEAT_MASK_REQ_SENT 0x04
598#define L2CAP_INFO_FEAT_MASK_REQ_DONE 0x08
599
600#define L2CAP_CHAN_RAW 1
601#define L2CAP_CHAN_CONN_LESS 2
602#define L2CAP_CHAN_CONN_ORIENTED 3
603#define L2CAP_CHAN_CONN_FIX_A2MP 4
604
605
606#define l2cap_pi(sk) ((struct l2cap_pinfo *) sk)
607
608struct l2cap_pinfo {
609 struct bt_sock bt;
610 struct l2cap_chan *chan;
611 struct sk_buff *rx_busy_skb;
612};
613
614enum {
615 CONF_REQ_SENT,
616 CONF_INPUT_DONE,
617 CONF_OUTPUT_DONE,
618 CONF_MTU_DONE,
619 CONF_MODE_DONE,
620 CONF_CONNECT_PEND,
621 CONF_RECV_NO_FCS,
622 CONF_STATE2_DEVICE,
623 CONF_EWS_RECV,
624 CONF_LOC_CONF_PEND,
625 CONF_REM_CONF_PEND,
626 CONF_NOT_COMPLETE,
627};
628
629#define L2CAP_CONF_MAX_CONF_REQ 2
630#define L2CAP_CONF_MAX_CONF_RSP 2
631
632enum {
633 CONN_SREJ_SENT,
634 CONN_WAIT_F,
635 CONN_SREJ_ACT,
636 CONN_SEND_PBIT,
637 CONN_REMOTE_BUSY,
638 CONN_LOCAL_BUSY,
639 CONN_REJ_ACT,
640 CONN_SEND_FBIT,
641 CONN_RNR_SENT,
642};
643
644
645enum {
646 FLAG_ROLE_SWITCH,
647 FLAG_FORCE_ACTIVE,
648 FLAG_FORCE_RELIABLE,
649 FLAG_FLUSHABLE,
650 FLAG_EXT_CTRL,
651 FLAG_EFS_ENABLE,
652};
653
654enum {
655 L2CAP_TX_STATE_XMIT,
656 L2CAP_TX_STATE_WAIT_F,
657};
658
659enum {
660 L2CAP_RX_STATE_RECV,
661 L2CAP_RX_STATE_SREJ_SENT,
662 L2CAP_RX_STATE_MOVE,
663 L2CAP_RX_STATE_WAIT_P,
664 L2CAP_RX_STATE_WAIT_F,
665};
666
667enum {
668 L2CAP_TXSEQ_EXPECTED,
669 L2CAP_TXSEQ_EXPECTED_SREJ,
670 L2CAP_TXSEQ_UNEXPECTED,
671 L2CAP_TXSEQ_UNEXPECTED_SREJ,
672 L2CAP_TXSEQ_DUPLICATE,
673 L2CAP_TXSEQ_DUPLICATE_SREJ,
674 L2CAP_TXSEQ_INVALID,
675 L2CAP_TXSEQ_INVALID_IGNORE,
676};
677
678enum {
679 L2CAP_EV_DATA_REQUEST,
680 L2CAP_EV_LOCAL_BUSY_DETECTED,
681 L2CAP_EV_LOCAL_BUSY_CLEAR,
682 L2CAP_EV_RECV_REQSEQ_AND_FBIT,
683 L2CAP_EV_RECV_FBIT,
684 L2CAP_EV_RETRANS_TO,
685 L2CAP_EV_MONITOR_TO,
686 L2CAP_EV_EXPLICIT_POLL,
687 L2CAP_EV_RECV_IFRAME,
688 L2CAP_EV_RECV_RR,
689 L2CAP_EV_RECV_REJ,
690 L2CAP_EV_RECV_RNR,
691 L2CAP_EV_RECV_SREJ,
692 L2CAP_EV_RECV_FRAME,
693};
694
695enum {
696 L2CAP_MOVE_ROLE_NONE,
697 L2CAP_MOVE_ROLE_INITIATOR,
698 L2CAP_MOVE_ROLE_RESPONDER,
699};
700
701enum {
702 L2CAP_MOVE_STABLE,
703 L2CAP_MOVE_WAIT_REQ,
704 L2CAP_MOVE_WAIT_RSP,
705 L2CAP_MOVE_WAIT_RSP_SUCCESS,
706 L2CAP_MOVE_WAIT_CONFIRM,
707 L2CAP_MOVE_WAIT_CONFIRM_RSP,
708 L2CAP_MOVE_WAIT_LOGICAL_COMP,
709 L2CAP_MOVE_WAIT_LOGICAL_CFM,
710 L2CAP_MOVE_WAIT_LOCAL_BUSY,
711 L2CAP_MOVE_WAIT_PREPARE,
712};
713
714void l2cap_chan_hold(struct l2cap_chan *c);
715void l2cap_chan_put(struct l2cap_chan *c);
716
717static inline void l2cap_chan_lock(struct l2cap_chan *chan)
718{
719 mutex_lock(&chan->lock);
720}
721
722static inline void l2cap_chan_unlock(struct l2cap_chan *chan)
723{
724 mutex_unlock(&chan->lock);
725}
726
727static inline void l2cap_set_timer(struct l2cap_chan *chan,
728 struct delayed_work *work, long timeout)
729{
730 BT_DBG("chan %p state %s timeout %ld", chan,
731 state_to_string(chan->state), timeout);
732
733
734
735 if (!cancel_delayed_work(work))
736 l2cap_chan_hold(chan);
737
738 schedule_delayed_work(work, timeout);
739}
740
741static inline bool l2cap_clear_timer(struct l2cap_chan *chan,
742 struct delayed_work *work)
743{
744 bool ret;
745
746
747
748 ret = cancel_delayed_work(work);
749 if (ret)
750 l2cap_chan_put(chan);
751
752 return ret;
753}
754
755#define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t))
756#define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer)
757#define __clear_retrans_timer(c) l2cap_clear_timer(c, &c->retrans_timer)
758#define __clear_monitor_timer(c) l2cap_clear_timer(c, &c->monitor_timer)
759#define __set_ack_timer(c) l2cap_set_timer(c, &chan->ack_timer, \
760 msecs_to_jiffies(L2CAP_DEFAULT_ACK_TO));
761#define __clear_ack_timer(c) l2cap_clear_timer(c, &c->ack_timer)
762
763static inline int __seq_offset(struct l2cap_chan *chan, __u16 seq1, __u16 seq2)
764{
765 if (seq1 >= seq2)
766 return seq1 - seq2;
767 else
768 return chan->tx_win_max + 1 - seq2 + seq1;
769}
770
771static inline __u16 __next_seq(struct l2cap_chan *chan, __u16 seq)
772{
773 return (seq + 1) % (chan->tx_win_max + 1);
774}
775
776static inline struct l2cap_chan *l2cap_chan_no_new_connection(struct l2cap_chan *chan)
777{
778 return NULL;
779}
780
781static inline void l2cap_chan_no_teardown(struct l2cap_chan *chan, int err)
782{
783}
784
785static inline void l2cap_chan_no_ready(struct l2cap_chan *chan)
786{
787}
788
789static inline void l2cap_chan_no_defer(struct l2cap_chan *chan)
790{
791}
792
793extern bool disable_ertm;
794
795int l2cap_init_sockets(void);
796void l2cap_cleanup_sockets(void);
797bool l2cap_is_socket(struct socket *sock);
798
799void __l2cap_connect_rsp_defer(struct l2cap_chan *chan);
800int __l2cap_wait_ack(struct sock *sk);
801
802int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm);
803int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid);
804
805struct l2cap_chan *l2cap_chan_create(void);
806void l2cap_chan_close(struct l2cap_chan *chan, int reason);
807int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
808 bdaddr_t *dst, u8 dst_type);
809int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len,
810 u32 priority);
811void l2cap_chan_busy(struct l2cap_chan *chan, int busy);
812int l2cap_chan_check_security(struct l2cap_chan *chan);
813void l2cap_chan_set_defaults(struct l2cap_chan *chan);
814int l2cap_ertm_init(struct l2cap_chan *chan);
815void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
816void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
817void l2cap_chan_del(struct l2cap_chan *chan, int err);
818void l2cap_send_conn_req(struct l2cap_chan *chan);
819void l2cap_move_start(struct l2cap_chan *chan);
820void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
821 u8 status);
822void __l2cap_physical_cfm(struct l2cap_chan *chan, int result);
823
824void l2cap_conn_get(struct l2cap_conn *conn);
825void l2cap_conn_put(struct l2cap_conn *conn);
826
827int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user);
828void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user);
829
830#endif
831