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