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