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