aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/bluetooth/l2cap.h
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
commit8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch)
treea8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /include/net/bluetooth/l2cap.h
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'include/net/bluetooth/l2cap.h')
-rw-r--r--include/net/bluetooth/l2cap.h545
1 files changed, 123 insertions, 422 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index 7588ef44eba..4f34ad25e75 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -27,35 +27,20 @@
27#ifndef __L2CAP_H 27#ifndef __L2CAP_H
28#define __L2CAP_H 28#define __L2CAP_H
29 29
30#include <asm/unaligned.h>
31
32/* L2CAP defaults */ 30/* L2CAP defaults */
33#define L2CAP_DEFAULT_MTU 672 31#define L2CAP_DEFAULT_MTU 672
34#define L2CAP_DEFAULT_MIN_MTU 48 32#define L2CAP_DEFAULT_MIN_MTU 48
35#define L2CAP_DEFAULT_FLUSH_TO 0xFFFF 33#define L2CAP_DEFAULT_FLUSH_TO 0xffff
36#define L2CAP_EFS_DEFAULT_FLUSH_TO 0xFFFFFFFF
37#define L2CAP_DEFAULT_TX_WINDOW 63 34#define L2CAP_DEFAULT_TX_WINDOW 63
38#define L2CAP_DEFAULT_EXT_WINDOW 0x3FFF
39#define L2CAP_DEFAULT_MAX_TX 3 35#define L2CAP_DEFAULT_MAX_TX 3
40#define L2CAP_DEFAULT_RETRANS_TO 2000 /* 2 seconds */ 36#define L2CAP_DEFAULT_RETRANS_TO 2000 /* 2 seconds */
41#define L2CAP_DEFAULT_MONITOR_TO 12000 /* 12 seconds */ 37#define L2CAP_DEFAULT_MONITOR_TO 12000 /* 12 seconds */
42#define L2CAP_DEFAULT_MAX_PDU_SIZE 1492 /* Sized for AMP packet */ 38#define L2CAP_DEFAULT_MAX_PDU_SIZE 1009 /* Sized for 3-DH5 packet */
43#define L2CAP_DEFAULT_ACK_TO 200 39#define L2CAP_DEFAULT_ACK_TO 200
44#define L2CAP_DEFAULT_MAX_SDU_SIZE 0xFFFF 40#define L2CAP_LE_DEFAULT_MTU 23
45#define L2CAP_DEFAULT_SDU_ITIME 0xFFFFFFFF 41
46#define L2CAP_DEFAULT_ACC_LAT 0xFFFFFFFF 42#define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */
47#define L2CAP_BREDR_MAX_PAYLOAD 1019 /* 3-DH5 packet */ 43#define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */
48#define L2CAP_LE_MIN_MTU 23
49
50#define L2CAP_DISC_TIMEOUT msecs_to_jiffies(100)
51#define L2CAP_DISC_REJ_TIMEOUT msecs_to_jiffies(5000)
52#define L2CAP_ENC_TIMEOUT msecs_to_jiffies(5000)
53#define L2CAP_CONN_TIMEOUT msecs_to_jiffies(40000)
54#define L2CAP_INFO_TIMEOUT msecs_to_jiffies(4000)
55#define L2CAP_MOVE_TIMEOUT msecs_to_jiffies(4000)
56#define L2CAP_MOVE_ERTX_TIMEOUT msecs_to_jiffies(60000)
57
58#define L2CAP_A2MP_DEFAULT_MTU 670
59 44
60/* L2CAP socket address */ 45/* L2CAP socket address */
61struct sockaddr_l2 { 46struct sockaddr_l2 {
@@ -63,7 +48,6 @@ struct sockaddr_l2 {
63 __le16 l2_psm; 48 __le16 l2_psm;
64 bdaddr_t l2_bdaddr; 49 bdaddr_t l2_bdaddr;
65 __le16 l2_cid; 50 __le16 l2_cid;
66 __u8 l2_bdaddr_type;
67}; 51};
68 52
69/* L2CAP socket options */ 53/* L2CAP socket options */
@@ -104,86 +88,52 @@ struct l2cap_conninfo {
104#define L2CAP_ECHO_RSP 0x09 88#define L2CAP_ECHO_RSP 0x09
105#define L2CAP_INFO_REQ 0x0a 89#define L2CAP_INFO_REQ 0x0a
106#define L2CAP_INFO_RSP 0x0b 90#define L2CAP_INFO_RSP 0x0b
107#define L2CAP_CREATE_CHAN_REQ 0x0c
108#define L2CAP_CREATE_CHAN_RSP 0x0d
109#define L2CAP_MOVE_CHAN_REQ 0x0e
110#define L2CAP_MOVE_CHAN_RSP 0x0f
111#define L2CAP_MOVE_CHAN_CFM 0x10
112#define L2CAP_MOVE_CHAN_CFM_RSP 0x11
113#define L2CAP_CONN_PARAM_UPDATE_REQ 0x12 91#define L2CAP_CONN_PARAM_UPDATE_REQ 0x12
114#define L2CAP_CONN_PARAM_UPDATE_RSP 0x13 92#define L2CAP_CONN_PARAM_UPDATE_RSP 0x13
115 93
116/* L2CAP extended feature mask */ 94/* L2CAP feature mask */
117#define L2CAP_FEAT_FLOWCTL 0x00000001 95#define L2CAP_FEAT_FLOWCTL 0x00000001
118#define L2CAP_FEAT_RETRANS 0x00000002 96#define L2CAP_FEAT_RETRANS 0x00000002
119#define L2CAP_FEAT_BIDIR_QOS 0x00000004
120#define L2CAP_FEAT_ERTM 0x00000008 97#define L2CAP_FEAT_ERTM 0x00000008
121#define L2CAP_FEAT_STREAMING 0x00000010 98#define L2CAP_FEAT_STREAMING 0x00000010
122#define L2CAP_FEAT_FCS 0x00000020 99#define L2CAP_FEAT_FCS 0x00000020
123#define L2CAP_FEAT_EXT_FLOW 0x00000040
124#define L2CAP_FEAT_FIXED_CHAN 0x00000080 100#define L2CAP_FEAT_FIXED_CHAN 0x00000080
125#define L2CAP_FEAT_EXT_WINDOW 0x00000100
126#define L2CAP_FEAT_UCD 0x00000200
127 101
128/* L2CAP checksum option */ 102/* L2CAP checksum option */
129#define L2CAP_FCS_NONE 0x00 103#define L2CAP_FCS_NONE 0x00
130#define L2CAP_FCS_CRC16 0x01 104#define L2CAP_FCS_CRC16 0x01
131 105
132/* L2CAP fixed channels */
133#define L2CAP_FC_L2CAP 0x02
134#define L2CAP_FC_A2MP 0x08
135
136/* L2CAP Control Field bit masks */ 106/* L2CAP Control Field bit masks */
137#define L2CAP_CTRL_SAR 0xC000 107#define L2CAP_CTRL_SAR 0xC000
138#define L2CAP_CTRL_REQSEQ 0x3F00 108#define L2CAP_CTRL_REQSEQ 0x3F00
139#define L2CAP_CTRL_TXSEQ 0x007E 109#define L2CAP_CTRL_TXSEQ 0x007E
140#define L2CAP_CTRL_SUPERVISE 0x000C 110#define L2CAP_CTRL_RETRANS 0x0080
141 111#define L2CAP_CTRL_FINAL 0x0080
142#define L2CAP_CTRL_RETRANS 0x0080 112#define L2CAP_CTRL_POLL 0x0010
143#define L2CAP_CTRL_FINAL 0x0080 113#define L2CAP_CTRL_SUPERVISE 0x000C
144#define L2CAP_CTRL_POLL 0x0010 114#define L2CAP_CTRL_FRAME_TYPE 0x0001 /* I- or S-Frame */
145#define L2CAP_CTRL_FRAME_TYPE 0x0001 /* I- or S-Frame */ 115
146 116#define L2CAP_CTRL_TXSEQ_SHIFT 1
147#define L2CAP_CTRL_TXSEQ_SHIFT 1 117#define L2CAP_CTRL_REQSEQ_SHIFT 8
148#define L2CAP_CTRL_SUPER_SHIFT 2 118#define L2CAP_CTRL_SAR_SHIFT 14
149#define L2CAP_CTRL_POLL_SHIFT 4
150#define L2CAP_CTRL_FINAL_SHIFT 7
151#define L2CAP_CTRL_REQSEQ_SHIFT 8
152#define L2CAP_CTRL_SAR_SHIFT 14
153
154/* L2CAP Extended Control Field bit mask */
155#define L2CAP_EXT_CTRL_TXSEQ 0xFFFC0000
156#define L2CAP_EXT_CTRL_SAR 0x00030000
157#define L2CAP_EXT_CTRL_SUPERVISE 0x00030000
158#define L2CAP_EXT_CTRL_REQSEQ 0x0000FFFC
159
160#define L2CAP_EXT_CTRL_POLL 0x00040000
161#define L2CAP_EXT_CTRL_FINAL 0x00000002
162#define L2CAP_EXT_CTRL_FRAME_TYPE 0x00000001 /* I- or S-Frame */
163
164#define L2CAP_EXT_CTRL_FINAL_SHIFT 1
165#define L2CAP_EXT_CTRL_REQSEQ_SHIFT 2
166#define L2CAP_EXT_CTRL_SAR_SHIFT 16
167#define L2CAP_EXT_CTRL_SUPER_SHIFT 16
168#define L2CAP_EXT_CTRL_POLL_SHIFT 18
169#define L2CAP_EXT_CTRL_TXSEQ_SHIFT 18
170 119
171/* L2CAP Supervisory Function */ 120/* L2CAP Supervisory Function */
172#define L2CAP_SUPER_RR 0x00 121#define L2CAP_SUPER_RCV_READY 0x0000
173#define L2CAP_SUPER_REJ 0x01 122#define L2CAP_SUPER_REJECT 0x0004
174#define L2CAP_SUPER_RNR 0x02 123#define L2CAP_SUPER_RCV_NOT_READY 0x0008
175#define L2CAP_SUPER_SREJ 0x03 124#define L2CAP_SUPER_SELECT_REJECT 0x000C
176 125
177/* L2CAP Segmentation and Reassembly */ 126/* L2CAP Segmentation and Reassembly */
178#define L2CAP_SAR_UNSEGMENTED 0x00 127#define L2CAP_SDU_UNSEGMENTED 0x0000
179#define L2CAP_SAR_START 0x01 128#define L2CAP_SDU_START 0x4000
180#define L2CAP_SAR_END 0x02 129#define L2CAP_SDU_END 0x8000
181#define L2CAP_SAR_CONTINUE 0x03 130#define L2CAP_SDU_CONTINUE 0xC000
182 131
183/* L2CAP Command rej. reasons */ 132/* L2CAP Command rej. reasons */
184#define L2CAP_REJ_NOT_UNDERSTOOD 0x0000 133#define L2CAP_REJ_NOT_UNDERSTOOD 0x0000
185#define L2CAP_REJ_MTU_EXCEEDED 0x0001 134#define L2CAP_REJ_MTU_EXCEEDED 0x0001
186#define L2CAP_REJ_INVALID_CID 0x0002 135#define L2CAP_REJ_INVALID_CID 0x0002
136
187 137
188/* L2CAP structures */ 138/* L2CAP structures */
189struct l2cap_hdr { 139struct l2cap_hdr {
@@ -191,14 +141,6 @@ struct l2cap_hdr {
191 __le16 cid; 141 __le16 cid;
192} __packed; 142} __packed;
193#define L2CAP_HDR_SIZE 4 143#define L2CAP_HDR_SIZE 4
194#define L2CAP_ENH_HDR_SIZE 6
195#define L2CAP_EXT_HDR_SIZE 8
196
197#define L2CAP_FCS_SIZE 2
198#define L2CAP_SDULEN_SIZE 2
199#define L2CAP_PSMLEN_SIZE 2
200#define L2CAP_ENH_CTRL_SIZE 2
201#define L2CAP_EXT_CTRL_SIZE 4
202 144
203struct l2cap_cmd_hdr { 145struct l2cap_cmd_hdr {
204 __u8 code; 146 __u8 code;
@@ -234,29 +176,23 @@ struct l2cap_conn_rsp {
234 __le16 status; 176 __le16 status;
235} __packed; 177} __packed;
236 178
237/* protocol/service multiplexer (PSM) */
238#define L2CAP_PSM_SDP 0x0001
239#define L2CAP_PSM_RFCOMM 0x0003
240
241/* channel indentifier */ 179/* channel indentifier */
242#define L2CAP_CID_SIGNALING 0x0001 180#define L2CAP_CID_SIGNALING 0x0001
243#define L2CAP_CID_CONN_LESS 0x0002 181#define L2CAP_CID_CONN_LESS 0x0002
244#define L2CAP_CID_A2MP 0x0003
245#define L2CAP_CID_LE_DATA 0x0004 182#define L2CAP_CID_LE_DATA 0x0004
246#define L2CAP_CID_LE_SIGNALING 0x0005 183#define L2CAP_CID_LE_SIGNALING 0x0005
247#define L2CAP_CID_SMP 0x0006 184#define L2CAP_CID_SMP 0x0006
248#define L2CAP_CID_DYN_START 0x0040 185#define L2CAP_CID_DYN_START 0x0040
249#define L2CAP_CID_DYN_END 0xffff 186#define L2CAP_CID_DYN_END 0xffff
250 187
251/* connect/create channel results */ 188/* connect result */
252#define L2CAP_CR_SUCCESS 0x0000 189#define L2CAP_CR_SUCCESS 0x0000
253#define L2CAP_CR_PEND 0x0001 190#define L2CAP_CR_PEND 0x0001
254#define L2CAP_CR_BAD_PSM 0x0002 191#define L2CAP_CR_BAD_PSM 0x0002
255#define L2CAP_CR_SEC_BLOCK 0x0003 192#define L2CAP_CR_SEC_BLOCK 0x0003
256#define L2CAP_CR_NO_MEM 0x0004 193#define L2CAP_CR_NO_MEM 0x0004
257#define L2CAP_CR_BAD_AMP 0x0005
258 194
259/* connect/create channel status */ 195/* connect status */
260#define L2CAP_CS_NO_INFO 0x0000 196#define L2CAP_CS_NO_INFO 0x0000
261#define L2CAP_CS_AUTHEN_PEND 0x0001 197#define L2CAP_CS_AUTHEN_PEND 0x0001
262#define L2CAP_CS_AUTHOR_PEND 0x0002 198#define L2CAP_CS_AUTHOR_PEND 0x0002
@@ -278,11 +214,6 @@ struct l2cap_conf_rsp {
278#define L2CAP_CONF_UNACCEPT 0x0001 214#define L2CAP_CONF_UNACCEPT 0x0001
279#define L2CAP_CONF_REJECT 0x0002 215#define L2CAP_CONF_REJECT 0x0002
280#define L2CAP_CONF_UNKNOWN 0x0003 216#define L2CAP_CONF_UNKNOWN 0x0003
281#define L2CAP_CONF_PENDING 0x0004
282#define L2CAP_CONF_EFS_REJECT 0x0005
283
284/* configuration req/rsp continuation flag */
285#define L2CAP_CONF_FLAG_CONTINUATION 0x0001
286 217
287struct l2cap_conf_opt { 218struct l2cap_conf_opt {
288 __u8 type; 219 __u8 type;
@@ -299,8 +230,6 @@ struct l2cap_conf_opt {
299#define L2CAP_CONF_QOS 0x03 230#define L2CAP_CONF_QOS 0x03
300#define L2CAP_CONF_RFC 0x04 231#define L2CAP_CONF_RFC 0x04
301#define L2CAP_CONF_FCS 0x05 232#define L2CAP_CONF_FCS 0x05
302#define L2CAP_CONF_EFS 0x06
303#define L2CAP_CONF_EWS 0x07
304 233
305#define L2CAP_CONF_MAX_SIZE 22 234#define L2CAP_CONF_MAX_SIZE 22
306 235
@@ -319,21 +248,6 @@ struct l2cap_conf_rfc {
319#define L2CAP_MODE_ERTM 0x03 248#define L2CAP_MODE_ERTM 0x03
320#define L2CAP_MODE_STREAMING 0x04 249#define L2CAP_MODE_STREAMING 0x04
321 250
322struct l2cap_conf_efs {
323 __u8 id;
324 __u8 stype;
325 __le16 msdu;
326 __le32 sdu_itime;
327 __le32 acc_lat;
328 __le32 flush_to;
329} __packed;
330
331#define L2CAP_SERV_NOTRAFIC 0x00
332#define L2CAP_SERV_BESTEFFORT 0x01
333#define L2CAP_SERV_GUARANTEED 0x02
334
335#define L2CAP_BESTEFFORT_ID 0x01
336
337struct l2cap_disconn_req { 251struct l2cap_disconn_req {
338 __le16 dcid; 252 __le16 dcid;
339 __le16 scid; 253 __le16 scid;
@@ -354,57 +268,14 @@ struct l2cap_info_rsp {
354 __u8 data[0]; 268 __u8 data[0];
355} __packed; 269} __packed;
356 270
357struct l2cap_create_chan_req {
358 __le16 psm;
359 __le16 scid;
360 __u8 amp_id;
361} __packed;
362
363struct l2cap_create_chan_rsp {
364 __le16 dcid;
365 __le16 scid;
366 __le16 result;
367 __le16 status;
368} __packed;
369
370struct l2cap_move_chan_req {
371 __le16 icid;
372 __u8 dest_amp_id;
373} __packed;
374
375struct l2cap_move_chan_rsp {
376 __le16 icid;
377 __le16 result;
378} __packed;
379
380#define L2CAP_MR_SUCCESS 0x0000
381#define L2CAP_MR_PEND 0x0001
382#define L2CAP_MR_BAD_ID 0x0002
383#define L2CAP_MR_SAME_ID 0x0003
384#define L2CAP_MR_NOT_SUPP 0x0004
385#define L2CAP_MR_COLLISION 0x0005
386#define L2CAP_MR_NOT_ALLOWED 0x0006
387
388struct l2cap_move_chan_cfm {
389 __le16 icid;
390 __le16 result;
391} __packed;
392
393#define L2CAP_MC_CONFIRMED 0x0000
394#define L2CAP_MC_UNCONFIRMED 0x0001
395
396struct l2cap_move_chan_cfm_rsp {
397 __le16 icid;
398} __packed;
399
400/* info type */ 271/* info type */
401#define L2CAP_IT_CL_MTU 0x0001 272#define L2CAP_IT_CL_MTU 0x0001
402#define L2CAP_IT_FEAT_MASK 0x0002 273#define L2CAP_IT_FEAT_MASK 0x0002
403#define L2CAP_IT_FIXED_CHAN 0x0003 274#define L2CAP_IT_FIXED_CHAN 0x0003
404 275
405/* info result */ 276/* info result */
406#define L2CAP_IR_SUCCESS 0x0000 277#define L2CAP_IR_SUCCESS 0x0000
407#define L2CAP_IR_NOTSUPP 0x0001 278#define L2CAP_IR_NOTSUPP 0x0001
408 279
409struct l2cap_conn_param_update_req { 280struct l2cap_conn_param_update_req {
410 __le16 min; 281 __le16 min;
@@ -422,26 +293,20 @@ struct l2cap_conn_param_update_rsp {
422#define L2CAP_CONN_PARAM_REJECTED 0x0001 293#define L2CAP_CONN_PARAM_REJECTED 0x0001
423 294
424/* ----- L2CAP channels and connections ----- */ 295/* ----- L2CAP channels and connections ----- */
425struct l2cap_seq_list { 296struct srej_list {
426 __u16 head; 297 __u8 tx_seq;
427 __u16 tail; 298 struct list_head list;
428 __u16 mask;
429 __u16 *list;
430}; 299};
431 300
432#define L2CAP_SEQ_LIST_CLEAR 0xFFFF
433#define L2CAP_SEQ_LIST_TAIL 0x8000
434
435struct l2cap_chan { 301struct l2cap_chan {
436 struct sock *sk; 302 struct sock *sk;
437 303
438 struct l2cap_conn *conn; 304 struct l2cap_conn *conn;
439 struct hci_conn *hs_hcon;
440 struct hci_chan *hs_hchan;
441 struct kref kref;
442 305
443 __u8 state; 306 __u8 state;
444 307
308 atomic_t refcnt;
309
445 __le16 psm; 310 __le16 psm;
446 __u16 dcid; 311 __u16 dcid;
447 __u16 scid; 312 __u16 scid;
@@ -451,11 +316,14 @@ struct l2cap_chan {
451 __u16 flush_to; 316 __u16 flush_to;
452 __u8 mode; 317 __u8 mode;
453 __u8 chan_type; 318 __u8 chan_type;
454 __u8 chan_policy;
455 319
456 __le16 sport; 320 __le16 sport;
457 321
458 __u8 sec_level; 322 __u8 sec_level;
323 __u8 role_switch;
324 __u8 force_reliable;
325 __u8 flushable;
326 __u8 force_active;
459 327
460 __u8 ident; 328 __u8 ident;
461 329
@@ -466,124 +334,92 @@ struct l2cap_chan {
466 334
467 __u8 fcs; 335 __u8 fcs;
468 336
469 __u16 tx_win; 337 __u8 tx_win;
470 __u16 tx_win_max;
471 __u16 ack_win;
472 __u8 max_tx; 338 __u8 max_tx;
473 __u16 retrans_timeout; 339 __u16 retrans_timeout;
474 __u16 monitor_timeout; 340 __u16 monitor_timeout;
475 __u16 mps; 341 __u16 mps;
476 342
477 __u8 tx_state;
478 __u8 rx_state;
479
480 unsigned long conf_state; 343 unsigned long conf_state;
481 unsigned long conn_state; 344 unsigned long conn_state;
482 unsigned long flags; 345
483 346 __u8 next_tx_seq;
484 __u8 remote_amp_id; 347 __u8 expected_ack_seq;
485 __u8 local_amp_id; 348 __u8 expected_tx_seq;
486 __u8 move_id; 349 __u8 buffer_seq;
487 __u8 move_state; 350 __u8 buffer_seq_srej;
488 __u8 move_role; 351 __u8 srej_save_reqseq;
489 352 __u8 frames_sent;
490 __u16 next_tx_seq; 353 __u8 unacked_frames;
491 __u16 expected_ack_seq;
492 __u16 expected_tx_seq;
493 __u16 buffer_seq;
494 __u16 srej_save_reqseq;
495 __u16 last_acked_seq;
496 __u16 frames_sent;
497 __u16 unacked_frames;
498 __u8 retry_count; 354 __u8 retry_count;
499 __u16 srej_queue_next; 355 __u8 num_acked;
500 __u16 sdu_len; 356 __u16 sdu_len;
357 __u16 partial_sdu_len;
501 struct sk_buff *sdu; 358 struct sk_buff *sdu;
502 struct sk_buff *sdu_last_frag;
503 359
504 __u16 remote_tx_win; 360 __u8 remote_tx_win;
505 __u8 remote_max_tx; 361 __u8 remote_max_tx;
506 __u16 remote_mps; 362 __u16 remote_mps;
507 363
508 __u8 local_id; 364 struct timer_list chan_timer;
509 __u8 local_stype; 365 struct timer_list retrans_timer;
510 __u16 local_msdu; 366 struct timer_list monitor_timer;
511 __u32 local_sdu_itime; 367 struct timer_list ack_timer;
512 __u32 local_acc_lat;
513 __u32 local_flush_to;
514
515 __u8 remote_id;
516 __u8 remote_stype;
517 __u16 remote_msdu;
518 __u32 remote_sdu_itime;
519 __u32 remote_acc_lat;
520 __u32 remote_flush_to;
521
522 struct delayed_work chan_timer;
523 struct delayed_work retrans_timer;
524 struct delayed_work monitor_timer;
525 struct delayed_work ack_timer;
526
527 struct sk_buff *tx_send_head; 368 struct sk_buff *tx_send_head;
528 struct sk_buff_head tx_q; 369 struct sk_buff_head tx_q;
529 struct sk_buff_head srej_q; 370 struct sk_buff_head srej_q;
530 struct l2cap_seq_list srej_list; 371 struct list_head srej_l;
531 struct l2cap_seq_list retrans_list;
532 372
533 struct list_head list; 373 struct list_head list;
534 struct list_head global_l; 374 struct list_head global_l;
535 375
536 void *data; 376 void *data;
537 struct l2cap_ops *ops; 377 struct l2cap_ops *ops;
538 struct mutex lock;
539}; 378};
540 379
541struct l2cap_ops { 380struct l2cap_ops {
542 char *name; 381 char *name;
543 382
544 struct l2cap_chan *(*new_connection) (struct l2cap_chan *chan); 383 struct l2cap_chan *(*new_connection) (void *data);
545 int (*recv) (struct l2cap_chan * chan, 384 int (*recv) (void *data, struct sk_buff *skb);
546 struct sk_buff *skb); 385 void (*close) (void *data);
547 void (*teardown) (struct l2cap_chan *chan, int err); 386 void (*state_change) (void *data, int state);
548 void (*close) (struct l2cap_chan *chan);
549 void (*state_change) (struct l2cap_chan *chan,
550 int state);
551 void (*ready) (struct l2cap_chan *chan);
552 void (*defer) (struct l2cap_chan *chan);
553 struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan,
554 unsigned long len, int nb);
555}; 387};
556 388
557struct l2cap_conn { 389struct l2cap_conn {
558 struct hci_conn *hcon; 390 struct hci_conn *hcon;
559 struct hci_chan *hchan; 391
392 bdaddr_t *dst;
393 bdaddr_t *src;
560 394
561 bdaddr_t *dst; 395 unsigned int mtu;
562 bdaddr_t *src;
563 396
564 unsigned int mtu; 397 __u32 feat_mask;
565 398
566 __u32 feat_mask; 399 __u8 info_state;
567 __u8 fixed_chan_mask; 400 __u8 info_ident;
568 401
569 __u8 info_state; 402 struct timer_list info_timer;
570 __u8 info_ident;
571 403
572 struct delayed_work info_timer; 404 spinlock_t lock;
573 405
574 spinlock_t lock; 406 struct sk_buff *rx_skb;
407 __u32 rx_len;
408 __u8 tx_ident;
575 409
576 struct sk_buff *rx_skb; 410 __u8 disc_reason;
577 __u32 rx_len;
578 __u8 tx_ident;
579 411
580 __u8 disc_reason; 412 __u8 preq[7]; /* SMP Pairing Request */
413 __u8 prsp[7]; /* SMP Pairing Response */
414 __u8 prnd[16]; /* SMP Pairing Random */
415 __u8 pcnf[16]; /* SMP Pairing Confirm */
416 __u8 tk[16]; /* SMP Temporary Key */
417 __u8 smp_key_size;
581 418
582 struct delayed_work security_timer; 419 struct timer_list security_timer;
583 struct smp_chan *smp_chan;
584 420
585 struct list_head chan_l; 421 struct list_head chan_l;
586 struct mutex chan_lock; 422 rwlock_t chan_lock;
587}; 423};
588 424
589#define L2CAP_INFO_CL_MTU_REQ_SENT 0x01 425#define L2CAP_INFO_CL_MTU_REQ_SENT 0x01
@@ -593,15 +429,14 @@ struct l2cap_conn {
593#define L2CAP_CHAN_RAW 1 429#define L2CAP_CHAN_RAW 1
594#define L2CAP_CHAN_CONN_LESS 2 430#define L2CAP_CHAN_CONN_LESS 2
595#define L2CAP_CHAN_CONN_ORIENTED 3 431#define L2CAP_CHAN_CONN_ORIENTED 3
596#define L2CAP_CHAN_CONN_FIX_A2MP 4
597 432
598/* ----- L2CAP socket info ----- */ 433/* ----- L2CAP socket info ----- */
599#define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) 434#define l2cap_pi(sk) ((struct l2cap_pinfo *) sk)
600 435
601struct l2cap_pinfo { 436struct l2cap_pinfo {
602 struct bt_sock bt; 437 struct bt_sock bt;
603 struct l2cap_chan *chan; 438 struct l2cap_chan *chan;
604 struct sk_buff *rx_busy_skb; 439 struct sk_buff *rx_busy_skb;
605}; 440};
606 441
607enum { 442enum {
@@ -611,18 +446,15 @@ enum {
611 CONF_MTU_DONE, 446 CONF_MTU_DONE,
612 CONF_MODE_DONE, 447 CONF_MODE_DONE,
613 CONF_CONNECT_PEND, 448 CONF_CONNECT_PEND,
614 CONF_RECV_NO_FCS, 449 CONF_NO_FCS_RECV,
615 CONF_STATE2_DEVICE, 450 CONF_STATE2_DEVICE,
616 CONF_EWS_RECV,
617 CONF_LOC_CONF_PEND,
618 CONF_REM_CONF_PEND,
619 CONF_NOT_COMPLETE,
620}; 451};
621 452
622#define L2CAP_CONF_MAX_CONF_REQ 2 453#define L2CAP_CONF_MAX_CONF_REQ 2
623#define L2CAP_CONF_MAX_CONF_RSP 2 454#define L2CAP_CONF_MAX_CONF_RSP 2
624 455
625enum { 456enum {
457 CONN_SAR_SDU,
626 CONN_SREJ_SENT, 458 CONN_SREJ_SENT,
627 CONN_WAIT_F, 459 CONN_WAIT_F,
628 CONN_SREJ_ACT, 460 CONN_SREJ_ACT,
@@ -634,156 +466,37 @@ enum {
634 CONN_RNR_SENT, 466 CONN_RNR_SENT,
635}; 467};
636 468
637/* Definitions for flags in l2cap_chan */
638enum {
639 FLAG_ROLE_SWITCH,
640 FLAG_FORCE_ACTIVE,
641 FLAG_FORCE_RELIABLE,
642 FLAG_FLUSHABLE,
643 FLAG_EXT_CTRL,
644 FLAG_EFS_ENABLE,
645};
646
647enum {
648 L2CAP_TX_STATE_XMIT,
649 L2CAP_TX_STATE_WAIT_F,
650};
651
652enum {
653 L2CAP_RX_STATE_RECV,
654 L2CAP_RX_STATE_SREJ_SENT,
655 L2CAP_RX_STATE_MOVE,
656 L2CAP_RX_STATE_WAIT_P,
657 L2CAP_RX_STATE_WAIT_F,
658};
659
660enum {
661 L2CAP_TXSEQ_EXPECTED,
662 L2CAP_TXSEQ_EXPECTED_SREJ,
663 L2CAP_TXSEQ_UNEXPECTED,
664 L2CAP_TXSEQ_UNEXPECTED_SREJ,
665 L2CAP_TXSEQ_DUPLICATE,
666 L2CAP_TXSEQ_DUPLICATE_SREJ,
667 L2CAP_TXSEQ_INVALID,
668 L2CAP_TXSEQ_INVALID_IGNORE,
669};
670
671enum {
672 L2CAP_EV_DATA_REQUEST,
673 L2CAP_EV_LOCAL_BUSY_DETECTED,
674 L2CAP_EV_LOCAL_BUSY_CLEAR,
675 L2CAP_EV_RECV_REQSEQ_AND_FBIT,
676 L2CAP_EV_RECV_FBIT,
677 L2CAP_EV_RETRANS_TO,
678 L2CAP_EV_MONITOR_TO,
679 L2CAP_EV_EXPLICIT_POLL,
680 L2CAP_EV_RECV_IFRAME,
681 L2CAP_EV_RECV_RR,
682 L2CAP_EV_RECV_REJ,
683 L2CAP_EV_RECV_RNR,
684 L2CAP_EV_RECV_SREJ,
685 L2CAP_EV_RECV_FRAME,
686};
687
688enum {
689 L2CAP_MOVE_ROLE_NONE,
690 L2CAP_MOVE_ROLE_INITIATOR,
691 L2CAP_MOVE_ROLE_RESPONDER,
692};
693
694enum {
695 L2CAP_MOVE_STABLE,
696 L2CAP_MOVE_WAIT_REQ,
697 L2CAP_MOVE_WAIT_RSP,
698 L2CAP_MOVE_WAIT_RSP_SUCCESS,
699 L2CAP_MOVE_WAIT_CONFIRM,
700 L2CAP_MOVE_WAIT_CONFIRM_RSP,
701 L2CAP_MOVE_WAIT_LOGICAL_COMP,
702 L2CAP_MOVE_WAIT_LOGICAL_CFM,
703 L2CAP_MOVE_WAIT_LOCAL_BUSY,
704 L2CAP_MOVE_WAIT_PREPARE,
705};
706
707void l2cap_chan_hold(struct l2cap_chan *c);
708void l2cap_chan_put(struct l2cap_chan *c);
709
710static inline void l2cap_chan_lock(struct l2cap_chan *chan)
711{
712 mutex_lock(&chan->lock);
713}
714
715static inline void l2cap_chan_unlock(struct l2cap_chan *chan)
716{
717 mutex_unlock(&chan->lock);
718}
719
720static inline void l2cap_set_timer(struct l2cap_chan *chan,
721 struct delayed_work *work, long timeout)
722{
723 BT_DBG("chan %p state %s timeout %ld", chan,
724 state_to_string(chan->state), timeout);
725
726 /* If delayed work cancelled do not hold(chan)
727 since it is already done with previous set_timer */
728 if (!cancel_delayed_work(work))
729 l2cap_chan_hold(chan);
730
731 schedule_delayed_work(work, timeout);
732}
733
734static inline bool l2cap_clear_timer(struct l2cap_chan *chan,
735 struct delayed_work *work)
736{
737 bool ret;
738
739 /* put(chan) if delayed work cancelled otherwise it
740 is done in delayed work function */
741 ret = cancel_delayed_work(work);
742 if (ret)
743 l2cap_chan_put(chan);
744
745 return ret;
746}
747
748#define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t)) 469#define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t))
749#define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer) 470#define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer)
471#define __set_retrans_timer(c) l2cap_set_timer(c, &c->retrans_timer, \
472 L2CAP_DEFAULT_RETRANS_TO);
750#define __clear_retrans_timer(c) l2cap_clear_timer(c, &c->retrans_timer) 473#define __clear_retrans_timer(c) l2cap_clear_timer(c, &c->retrans_timer)
474#define __set_monitor_timer(c) l2cap_set_timer(c, &c->monitor_timer, \
475 L2CAP_DEFAULT_MONITOR_TO);
751#define __clear_monitor_timer(c) l2cap_clear_timer(c, &c->monitor_timer) 476#define __clear_monitor_timer(c) l2cap_clear_timer(c, &c->monitor_timer)
752#define __set_ack_timer(c) l2cap_set_timer(c, &chan->ack_timer, \ 477#define __set_ack_timer(c) l2cap_set_timer(c, &chan->ack_timer, \
753 msecs_to_jiffies(L2CAP_DEFAULT_ACK_TO)); 478 L2CAP_DEFAULT_ACK_TO);
754#define __clear_ack_timer(c) l2cap_clear_timer(c, &c->ack_timer) 479#define __clear_ack_timer(c) l2cap_clear_timer(c, &c->ack_timer)
755 480
756static inline int __seq_offset(struct l2cap_chan *chan, __u16 seq1, __u16 seq2) 481static inline int l2cap_tx_window_full(struct l2cap_chan *ch)
757{ 482{
758 if (seq1 >= seq2) 483 int sub;
759 return seq1 - seq2;
760 else
761 return chan->tx_win_max + 1 - seq2 + seq1;
762}
763 484
764static inline __u16 __next_seq(struct l2cap_chan *chan, __u16 seq) 485 sub = (ch->next_tx_seq - ch->expected_ack_seq) % 64;
765{
766 return (seq + 1) % (chan->tx_win_max + 1);
767}
768
769static inline struct l2cap_chan *l2cap_chan_no_new_connection(struct l2cap_chan *chan)
770{
771 return NULL;
772}
773 486
774static inline void l2cap_chan_no_teardown(struct l2cap_chan *chan, int err) 487 if (sub < 0)
775{ 488 sub += 64;
776}
777 489
778static inline void l2cap_chan_no_ready(struct l2cap_chan *chan) 490 return sub == ch->remote_tx_win;
779{
780} 491}
781 492
782static inline void l2cap_chan_no_defer(struct l2cap_chan *chan) 493#define __get_txseq(ctrl) (((ctrl) & L2CAP_CTRL_TXSEQ) >> 1)
783{ 494#define __get_reqseq(ctrl) (((ctrl) & L2CAP_CTRL_REQSEQ) >> 8)
784} 495#define __is_iframe(ctrl) (!((ctrl) & L2CAP_CTRL_FRAME_TYPE))
496#define __is_sframe(ctrl) ((ctrl) & L2CAP_CTRL_FRAME_TYPE)
497#define __is_sar_start(ctrl) (((ctrl) & L2CAP_CTRL_SAR) == L2CAP_SDU_START)
785 498
786extern bool disable_ertm; 499extern int disable_ertm;
787 500
788int l2cap_init_sockets(void); 501int l2cap_init_sockets(void);
789void l2cap_cleanup_sockets(void); 502void l2cap_cleanup_sockets(void);
@@ -794,23 +507,11 @@ int __l2cap_wait_ack(struct sock *sk);
794int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm); 507int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm);
795int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid); 508int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid);
796 509
797struct l2cap_chan *l2cap_chan_create(void); 510struct l2cap_chan *l2cap_chan_create(struct sock *sk);
798void l2cap_chan_close(struct l2cap_chan *chan, int reason); 511void l2cap_chan_close(struct l2cap_chan *chan, int reason);
799int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, 512void l2cap_chan_destroy(struct l2cap_chan *chan);
800 bdaddr_t *dst, u8 dst_type); 513int l2cap_chan_connect(struct l2cap_chan *chan);
801int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len, 514int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len);
802 u32 priority);
803void l2cap_chan_busy(struct l2cap_chan *chan, int busy); 515void l2cap_chan_busy(struct l2cap_chan *chan, int busy);
804int l2cap_chan_check_security(struct l2cap_chan *chan);
805void l2cap_chan_set_defaults(struct l2cap_chan *chan);
806int l2cap_ertm_init(struct l2cap_chan *chan);
807void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
808void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
809void l2cap_chan_del(struct l2cap_chan *chan, int err);
810void l2cap_send_conn_req(struct l2cap_chan *chan);
811void l2cap_move_start(struct l2cap_chan *chan);
812void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
813 u8 status);
814void __l2cap_physical_cfm(struct l2cap_chan *chan, int result);
815 516
816#endif /* __L2CAP_H */ 517#endif /* __L2CAP_H */