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