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