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#define L2CAP_PSM_DYN_START 0x1001
256#define L2CAP_PSM_DYN_END 0xffff
257#define L2CAP_PSM_AUTO_END 0x10ff
258#define L2CAP_PSM_LE_DYN_START 0x0080
259#define L2CAP_PSM_LE_DYN_END 0x00ff
260
261
262#define L2CAP_CID_SIGNALING 0x0001
263#define L2CAP_CID_CONN_LESS 0x0002
264#define L2CAP_CID_A2MP 0x0003
265#define L2CAP_CID_ATT 0x0004
266#define L2CAP_CID_LE_SIGNALING 0x0005
267#define L2CAP_CID_SMP 0x0006
268#define L2CAP_CID_SMP_BREDR 0x0007
269#define L2CAP_CID_DYN_START 0x0040
270#define L2CAP_CID_DYN_END 0xffff
271#define L2CAP_CID_LE_DYN_END 0x007f
272
273
274#define L2CAP_CR_SUCCESS 0x0000
275#define L2CAP_CR_PEND 0x0001
276#define L2CAP_CR_BAD_PSM 0x0002
277#define L2CAP_CR_SEC_BLOCK 0x0003
278#define L2CAP_CR_NO_MEM 0x0004
279#define L2CAP_CR_BAD_AMP 0x0005
280#define L2CAP_CR_AUTHENTICATION 0x0005
281#define L2CAP_CR_AUTHORIZATION 0x0006
282#define L2CAP_CR_BAD_KEY_SIZE 0x0007
283#define L2CAP_CR_ENCRYPTION 0x0008
284#define L2CAP_CR_INVALID_SCID 0x0009
285#define L2CAP_CR_SCID_IN_USE 0x0010
286
287
288#define L2CAP_CS_NO_INFO 0x0000
289#define L2CAP_CS_AUTHEN_PEND 0x0001
290#define L2CAP_CS_AUTHOR_PEND 0x0002
291
292struct l2cap_conf_req {
293 __le16 dcid;
294 __le16 flags;
295 __u8 data[0];
296} __packed;
297
298struct l2cap_conf_rsp {
299 __le16 scid;
300 __le16 flags;
301 __le16 result;
302 __u8 data[0];
303} __packed;
304
305#define L2CAP_CONF_SUCCESS 0x0000
306#define L2CAP_CONF_UNACCEPT 0x0001
307#define L2CAP_CONF_REJECT 0x0002
308#define L2CAP_CONF_UNKNOWN 0x0003
309#define L2CAP_CONF_PENDING 0x0004
310#define L2CAP_CONF_EFS_REJECT 0x0005
311
312
313#define L2CAP_CONF_FLAG_CONTINUATION 0x0001
314
315struct l2cap_conf_opt {
316 __u8 type;
317 __u8 len;
318 __u8 val[0];
319} __packed;
320#define L2CAP_CONF_OPT_SIZE 2
321
322#define L2CAP_CONF_HINT 0x80
323#define L2CAP_CONF_MASK 0x7f
324
325#define L2CAP_CONF_MTU 0x01
326#define L2CAP_CONF_FLUSH_TO 0x02
327#define L2CAP_CONF_QOS 0x03
328#define L2CAP_CONF_RFC 0x04
329#define L2CAP_CONF_FCS 0x05
330#define L2CAP_CONF_EFS 0x06
331#define L2CAP_CONF_EWS 0x07
332
333#define L2CAP_CONF_MAX_SIZE 22
334
335struct l2cap_conf_rfc {
336 __u8 mode;
337 __u8 txwin_size;
338 __u8 max_transmit;
339 __le16 retrans_timeout;
340 __le16 monitor_timeout;
341 __le16 max_pdu_size;
342} __packed;
343
344#define L2CAP_MODE_BASIC 0x00
345#define L2CAP_MODE_RETRANS 0x01
346#define L2CAP_MODE_FLOWCTL 0x02
347#define L2CAP_MODE_ERTM 0x03
348#define L2CAP_MODE_STREAMING 0x04
349
350
351
352
353
354#define L2CAP_MODE_LE_FLOWCTL 0x80
355
356struct l2cap_conf_efs {
357 __u8 id;
358 __u8 stype;
359 __le16 msdu;
360 __le32 sdu_itime;
361 __le32 acc_lat;
362 __le32 flush_to;
363} __packed;
364
365#define L2CAP_SERV_NOTRAFIC 0x00
366#define L2CAP_SERV_BESTEFFORT 0x01
367#define L2CAP_SERV_GUARANTEED 0x02
368
369#define L2CAP_BESTEFFORT_ID 0x01
370
371struct l2cap_disconn_req {
372 __le16 dcid;
373 __le16 scid;
374} __packed;
375
376struct l2cap_disconn_rsp {
377 __le16 dcid;
378 __le16 scid;
379} __packed;
380
381struct l2cap_info_req {
382 __le16 type;
383} __packed;
384
385struct l2cap_info_rsp {
386 __le16 type;
387 __le16 result;
388 __u8 data[0];
389} __packed;
390
391struct l2cap_create_chan_req {
392 __le16 psm;
393 __le16 scid;
394 __u8 amp_id;
395} __packed;
396
397struct l2cap_create_chan_rsp {
398 __le16 dcid;
399 __le16 scid;
400 __le16 result;
401 __le16 status;
402} __packed;
403
404struct l2cap_move_chan_req {
405 __le16 icid;
406 __u8 dest_amp_id;
407} __packed;
408
409struct l2cap_move_chan_rsp {
410 __le16 icid;
411 __le16 result;
412} __packed;
413
414#define L2CAP_MR_SUCCESS 0x0000
415#define L2CAP_MR_PEND 0x0001
416#define L2CAP_MR_BAD_ID 0x0002
417#define L2CAP_MR_SAME_ID 0x0003
418#define L2CAP_MR_NOT_SUPP 0x0004
419#define L2CAP_MR_COLLISION 0x0005
420#define L2CAP_MR_NOT_ALLOWED 0x0006
421
422struct l2cap_move_chan_cfm {
423 __le16 icid;
424 __le16 result;
425} __packed;
426
427#define L2CAP_MC_CONFIRMED 0x0000
428#define L2CAP_MC_UNCONFIRMED 0x0001
429
430struct l2cap_move_chan_cfm_rsp {
431 __le16 icid;
432} __packed;
433
434
435#define L2CAP_IT_CL_MTU 0x0001
436#define L2CAP_IT_FEAT_MASK 0x0002
437#define L2CAP_IT_FIXED_CHAN 0x0003
438
439
440#define L2CAP_IR_SUCCESS 0x0000
441#define L2CAP_IR_NOTSUPP 0x0001
442
443struct l2cap_conn_param_update_req {
444 __le16 min;
445 __le16 max;
446 __le16 latency;
447 __le16 to_multiplier;
448} __packed;
449
450struct l2cap_conn_param_update_rsp {
451 __le16 result;
452} __packed;
453
454
455#define L2CAP_CONN_PARAM_ACCEPTED 0x0000
456#define L2CAP_CONN_PARAM_REJECTED 0x0001
457
458#define L2CAP_LE_MAX_CREDITS 10
459#define L2CAP_LE_DEFAULT_MPS 230
460
461struct l2cap_le_conn_req {
462 __le16 psm;
463 __le16 scid;
464 __le16 mtu;
465 __le16 mps;
466 __le16 credits;
467} __packed;
468
469struct l2cap_le_conn_rsp {
470 __le16 dcid;
471 __le16 mtu;
472 __le16 mps;
473 __le16 credits;
474 __le16 result;
475} __packed;
476
477struct l2cap_le_credits {
478 __le16 cid;
479 __le16 credits;
480} __packed;
481
482
483struct l2cap_seq_list {
484 __u16 head;
485 __u16 tail;
486 __u16 mask;
487 __u16 *list;
488};
489
490#define L2CAP_SEQ_LIST_CLEAR 0xFFFF
491#define L2CAP_SEQ_LIST_TAIL 0x8000
492
493struct l2cap_chan {
494 struct l2cap_conn *conn;
495 struct hci_conn *hs_hcon;
496 struct hci_chan *hs_hchan;
497 struct kref kref;
498 atomic_t nesting;
499
500 __u8 state;
501
502 bdaddr_t dst;
503 __u8 dst_type;
504 bdaddr_t src;
505 __u8 src_type;
506 __le16 psm;
507 __le16 sport;
508 __u16 dcid;
509 __u16 scid;
510
511 __u16 imtu;
512 __u16 omtu;
513 __u16 flush_to;
514 __u8 mode;
515 __u8 chan_type;
516 __u8 chan_policy;
517
518 __u8 sec_level;
519
520 __u8 ident;
521
522 __u8 conf_req[64];
523 __u8 conf_len;
524 __u8 num_conf_req;
525 __u8 num_conf_rsp;
526
527 __u8 fcs;
528
529 __u16 tx_win;
530 __u16 tx_win_max;
531 __u16 ack_win;
532 __u8 max_tx;
533 __u16 retrans_timeout;
534 __u16 monitor_timeout;
535 __u16 mps;
536
537 __u16 tx_credits;
538 __u16 rx_credits;
539
540 __u8 tx_state;
541 __u8 rx_state;
542
543 unsigned long conf_state;
544 unsigned long conn_state;
545 unsigned long flags;
546
547 __u8 remote_amp_id;
548 __u8 local_amp_id;
549 __u8 move_id;
550 __u8 move_state;
551 __u8 move_role;
552
553 __u16 next_tx_seq;
554 __u16 expected_ack_seq;
555 __u16 expected_tx_seq;
556 __u16 buffer_seq;
557 __u16 srej_save_reqseq;
558 __u16 last_acked_seq;
559 __u16 frames_sent;
560 __u16 unacked_frames;
561 __u8 retry_count;
562 __u16 sdu_len;
563 struct sk_buff *sdu;
564 struct sk_buff *sdu_last_frag;
565
566 __u16 remote_tx_win;
567 __u8 remote_max_tx;
568 __u16 remote_mps;
569
570 __u8 local_id;
571 __u8 local_stype;
572 __u16 local_msdu;
573 __u32 local_sdu_itime;
574 __u32 local_acc_lat;
575 __u32 local_flush_to;
576
577 __u8 remote_id;
578 __u8 remote_stype;
579 __u16 remote_msdu;
580 __u32 remote_sdu_itime;
581 __u32 remote_acc_lat;
582 __u32 remote_flush_to;
583
584 struct delayed_work chan_timer;
585 struct delayed_work retrans_timer;
586 struct delayed_work monitor_timer;
587 struct delayed_work ack_timer;
588
589 struct sk_buff *tx_send_head;
590 struct sk_buff_head tx_q;
591 struct sk_buff_head srej_q;
592 struct l2cap_seq_list srej_list;
593 struct l2cap_seq_list retrans_list;
594
595 struct list_head list;
596 struct list_head global_l;
597
598 void *data;
599 const struct l2cap_ops *ops;
600 struct mutex lock;
601};
602
603struct l2cap_ops {
604 char *name;
605
606 struct l2cap_chan *(*new_connection) (struct l2cap_chan *chan);
607 int (*recv) (struct l2cap_chan * chan,
608 struct sk_buff *skb);
609 void (*teardown) (struct l2cap_chan *chan, int err);
610 void (*close) (struct l2cap_chan *chan);
611 void (*state_change) (struct l2cap_chan *chan,
612 int state, int err);
613 void (*ready) (struct l2cap_chan *chan);
614 void (*defer) (struct l2cap_chan *chan);
615 void (*resume) (struct l2cap_chan *chan);
616 void (*suspend) (struct l2cap_chan *chan);
617 void (*set_shutdown) (struct l2cap_chan *chan);
618 long (*get_sndtimeo) (struct l2cap_chan *chan);
619 struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan,
620 unsigned long hdr_len,
621 unsigned long len, int nb);
622};
623
624struct l2cap_conn {
625 struct hci_conn *hcon;
626 struct hci_chan *hchan;
627
628 unsigned int mtu;
629
630 __u32 feat_mask;
631 __u8 remote_fixed_chan;
632 __u8 local_fixed_chan;
633
634 __u8 info_state;
635 __u8 info_ident;
636
637 struct delayed_work info_timer;
638
639 struct sk_buff *rx_skb;
640 __u32 rx_len;
641 __u8 tx_ident;
642 struct mutex ident_lock;
643
644 struct sk_buff_head pending_rx;
645 struct work_struct pending_rx_work;
646
647 struct work_struct id_addr_update_work;
648
649 __u8 disc_reason;
650
651 struct l2cap_chan *smp;
652
653 struct list_head chan_l;
654 struct mutex chan_lock;
655 struct kref ref;
656 struct list_head users;
657};
658
659struct l2cap_user {
660 struct list_head list;
661 int (*probe) (struct l2cap_conn *conn, struct l2cap_user *user);
662 void (*remove) (struct l2cap_conn *conn, struct l2cap_user *user);
663};
664
665#define L2CAP_INFO_CL_MTU_REQ_SENT 0x01
666#define L2CAP_INFO_FEAT_MASK_REQ_SENT 0x04
667#define L2CAP_INFO_FEAT_MASK_REQ_DONE 0x08
668
669#define L2CAP_CHAN_RAW 1
670#define L2CAP_CHAN_CONN_LESS 2
671#define L2CAP_CHAN_CONN_ORIENTED 3
672#define L2CAP_CHAN_FIXED 4
673
674
675#define l2cap_pi(sk) ((struct l2cap_pinfo *) sk)
676
677struct l2cap_pinfo {
678 struct bt_sock bt;
679 struct l2cap_chan *chan;
680 struct sk_buff *rx_busy_skb;
681};
682
683enum {
684 CONF_REQ_SENT,
685 CONF_INPUT_DONE,
686 CONF_OUTPUT_DONE,
687 CONF_MTU_DONE,
688 CONF_MODE_DONE,
689 CONF_CONNECT_PEND,
690 CONF_RECV_NO_FCS,
691 CONF_STATE2_DEVICE,
692 CONF_EWS_RECV,
693 CONF_LOC_CONF_PEND,
694 CONF_REM_CONF_PEND,
695 CONF_NOT_COMPLETE,
696};
697
698#define L2CAP_CONF_MAX_CONF_REQ 2
699#define L2CAP_CONF_MAX_CONF_RSP 2
700
701enum {
702 CONN_SREJ_SENT,
703 CONN_WAIT_F,
704 CONN_SREJ_ACT,
705 CONN_SEND_PBIT,
706 CONN_REMOTE_BUSY,
707 CONN_LOCAL_BUSY,
708 CONN_REJ_ACT,
709 CONN_SEND_FBIT,
710 CONN_RNR_SENT,
711};
712
713
714enum {
715 FLAG_ROLE_SWITCH,
716 FLAG_FORCE_ACTIVE,
717 FLAG_FORCE_RELIABLE,
718 FLAG_FLUSHABLE,
719 FLAG_EXT_CTRL,
720 FLAG_EFS_ENABLE,
721 FLAG_DEFER_SETUP,
722 FLAG_LE_CONN_REQ_SENT,
723 FLAG_PENDING_SECURITY,
724 FLAG_HOLD_HCI_CONN,
725};
726
727
728
729
730
731
732enum {
733 L2CAP_NESTING_SMP,
734 L2CAP_NESTING_NORMAL,
735 L2CAP_NESTING_PARENT,
736};
737
738enum {
739 L2CAP_TX_STATE_XMIT,
740 L2CAP_TX_STATE_WAIT_F,
741};
742
743enum {
744 L2CAP_RX_STATE_RECV,
745 L2CAP_RX_STATE_SREJ_SENT,
746 L2CAP_RX_STATE_MOVE,
747 L2CAP_RX_STATE_WAIT_P,
748 L2CAP_RX_STATE_WAIT_F,
749};
750
751enum {
752 L2CAP_TXSEQ_EXPECTED,
753 L2CAP_TXSEQ_EXPECTED_SREJ,
754 L2CAP_TXSEQ_UNEXPECTED,
755 L2CAP_TXSEQ_UNEXPECTED_SREJ,
756 L2CAP_TXSEQ_DUPLICATE,
757 L2CAP_TXSEQ_DUPLICATE_SREJ,
758 L2CAP_TXSEQ_INVALID,
759 L2CAP_TXSEQ_INVALID_IGNORE,
760};
761
762enum {
763 L2CAP_EV_DATA_REQUEST,
764 L2CAP_EV_LOCAL_BUSY_DETECTED,
765 L2CAP_EV_LOCAL_BUSY_CLEAR,
766 L2CAP_EV_RECV_REQSEQ_AND_FBIT,
767 L2CAP_EV_RECV_FBIT,
768 L2CAP_EV_RETRANS_TO,
769 L2CAP_EV_MONITOR_TO,
770 L2CAP_EV_EXPLICIT_POLL,
771 L2CAP_EV_RECV_IFRAME,
772 L2CAP_EV_RECV_RR,
773 L2CAP_EV_RECV_REJ,
774 L2CAP_EV_RECV_RNR,
775 L2CAP_EV_RECV_SREJ,
776 L2CAP_EV_RECV_FRAME,
777};
778
779enum {
780 L2CAP_MOVE_ROLE_NONE,
781 L2CAP_MOVE_ROLE_INITIATOR,
782 L2CAP_MOVE_ROLE_RESPONDER,
783};
784
785enum {
786 L2CAP_MOVE_STABLE,
787 L2CAP_MOVE_WAIT_REQ,
788 L2CAP_MOVE_WAIT_RSP,
789 L2CAP_MOVE_WAIT_RSP_SUCCESS,
790 L2CAP_MOVE_WAIT_CONFIRM,
791 L2CAP_MOVE_WAIT_CONFIRM_RSP,
792 L2CAP_MOVE_WAIT_LOGICAL_COMP,
793 L2CAP_MOVE_WAIT_LOGICAL_CFM,
794 L2CAP_MOVE_WAIT_LOCAL_BUSY,
795 L2CAP_MOVE_WAIT_PREPARE,
796};
797
798void l2cap_chan_hold(struct l2cap_chan *c);
799void l2cap_chan_put(struct l2cap_chan *c);
800
801static inline void l2cap_chan_lock(struct l2cap_chan *chan)
802{
803 mutex_lock_nested(&chan->lock, atomic_read(&chan->nesting));
804}
805
806static inline void l2cap_chan_unlock(struct l2cap_chan *chan)
807{
808 mutex_unlock(&chan->lock);
809}
810
811static inline void l2cap_set_timer(struct l2cap_chan *chan,
812 struct delayed_work *work, long timeout)
813{
814 BT_DBG("chan %p state %s timeout %ld", chan,
815 state_to_string(chan->state), timeout);
816
817
818
819 if (!cancel_delayed_work(work))
820 l2cap_chan_hold(chan);
821
822 schedule_delayed_work(work, timeout);
823}
824
825static inline bool l2cap_clear_timer(struct l2cap_chan *chan,
826 struct delayed_work *work)
827{
828 bool ret;
829
830
831
832 ret = cancel_delayed_work(work);
833 if (ret)
834 l2cap_chan_put(chan);
835
836 return ret;
837}
838
839#define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t))
840#define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer)
841#define __clear_retrans_timer(c) l2cap_clear_timer(c, &c->retrans_timer)
842#define __clear_monitor_timer(c) l2cap_clear_timer(c, &c->monitor_timer)
843#define __set_ack_timer(c) l2cap_set_timer(c, &chan->ack_timer, \
844 msecs_to_jiffies(L2CAP_DEFAULT_ACK_TO));
845#define __clear_ack_timer(c) l2cap_clear_timer(c, &c->ack_timer)
846
847static inline int __seq_offset(struct l2cap_chan *chan, __u16 seq1, __u16 seq2)
848{
849 if (seq1 >= seq2)
850 return seq1 - seq2;
851 else
852 return chan->tx_win_max + 1 - seq2 + seq1;
853}
854
855static inline __u16 __next_seq(struct l2cap_chan *chan, __u16 seq)
856{
857 return (seq + 1) % (chan->tx_win_max + 1);
858}
859
860static inline struct l2cap_chan *l2cap_chan_no_new_connection(struct l2cap_chan *chan)
861{
862 return NULL;
863}
864
865static inline int l2cap_chan_no_recv(struct l2cap_chan *chan, struct sk_buff *skb)
866{
867 return -ENOSYS;
868}
869
870static inline struct sk_buff *l2cap_chan_no_alloc_skb(struct l2cap_chan *chan,
871 unsigned long hdr_len,
872 unsigned long len, int nb)
873{
874 return ERR_PTR(-ENOSYS);
875}
876
877static inline void l2cap_chan_no_teardown(struct l2cap_chan *chan, int err)
878{
879}
880
881static inline void l2cap_chan_no_close(struct l2cap_chan *chan)
882{
883}
884
885static inline void l2cap_chan_no_ready(struct l2cap_chan *chan)
886{
887}
888
889static inline void l2cap_chan_no_state_change(struct l2cap_chan *chan,
890 int state, int err)
891{
892}
893
894static inline void l2cap_chan_no_defer(struct l2cap_chan *chan)
895{
896}
897
898static inline void l2cap_chan_no_suspend(struct l2cap_chan *chan)
899{
900}
901
902static inline void l2cap_chan_no_resume(struct l2cap_chan *chan)
903{
904}
905
906static inline void l2cap_chan_no_set_shutdown(struct l2cap_chan *chan)
907{
908}
909
910static inline long l2cap_chan_no_get_sndtimeo(struct l2cap_chan *chan)
911{
912 return 0;
913}
914
915extern bool disable_ertm;
916
917int l2cap_init_sockets(void);
918void l2cap_cleanup_sockets(void);
919bool l2cap_is_socket(struct socket *sock);
920
921void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan);
922void __l2cap_connect_rsp_defer(struct l2cap_chan *chan);
923
924int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm);
925int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid);
926
927struct l2cap_chan *l2cap_chan_create(void);
928void l2cap_chan_close(struct l2cap_chan *chan, int reason);
929int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
930 bdaddr_t *dst, u8 dst_type);
931int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len);
932void l2cap_chan_busy(struct l2cap_chan *chan, int busy);
933int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator);
934void l2cap_chan_set_defaults(struct l2cap_chan *chan);
935int l2cap_ertm_init(struct l2cap_chan *chan);
936void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
937void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
938void l2cap_chan_del(struct l2cap_chan *chan, int err);
939void l2cap_send_conn_req(struct l2cap_chan *chan);
940void l2cap_move_start(struct l2cap_chan *chan);
941void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
942 u8 status);
943void __l2cap_physical_cfm(struct l2cap_chan *chan, int result);
944
945struct l2cap_conn *l2cap_conn_get(struct l2cap_conn *conn);
946void l2cap_conn_put(struct l2cap_conn *conn);
947
948int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user);
949void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user);
950
951#endif
952