diff options
Diffstat (limited to 'include/net/bluetooth/l2cap.h')
-rw-r--r-- | include/net/bluetooth/l2cap.h | 134 |
1 files changed, 119 insertions, 15 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index e919fca1072a..9516f4b4a3c2 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
@@ -27,12 +27,14 @@ | |||
27 | 27 | ||
28 | /* L2CAP defaults */ | 28 | /* L2CAP defaults */ |
29 | #define L2CAP_DEFAULT_MTU 672 | 29 | #define L2CAP_DEFAULT_MTU 672 |
30 | #define L2CAP_DEFAULT_MIN_MTU 48 | ||
30 | #define L2CAP_DEFAULT_FLUSH_TO 0xffff | 31 | #define L2CAP_DEFAULT_FLUSH_TO 0xffff |
31 | #define L2CAP_DEFAULT_RX_WINDOW 1 | 32 | #define L2CAP_DEFAULT_TX_WINDOW 63 |
32 | #define L2CAP_DEFAULT_MAX_RECEIVE 1 | 33 | #define L2CAP_DEFAULT_NUM_TO_ACK (L2CAP_DEFAULT_TX_WINDOW/5) |
33 | #define L2CAP_DEFAULT_RETRANS_TO 300 /* 300 milliseconds */ | 34 | #define L2CAP_DEFAULT_MAX_TX 3 |
34 | #define L2CAP_DEFAULT_MONITOR_TO 1000 /* 1 second */ | 35 | #define L2CAP_DEFAULT_RETRANS_TO 1000 /* 1 second */ |
35 | #define L2CAP_DEFAULT_MAX_RX_APDU 0xfff7 | 36 | #define L2CAP_DEFAULT_MONITOR_TO 12000 /* 12 seconds */ |
37 | #define L2CAP_DEFAULT_MAX_PDU_SIZE 672 | ||
36 | 38 | ||
37 | #define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */ | 39 | #define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */ |
38 | #define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */ | 40 | #define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */ |
@@ -52,6 +54,7 @@ struct l2cap_options { | |||
52 | __u16 imtu; | 54 | __u16 imtu; |
53 | __u16 flush_to; | 55 | __u16 flush_to; |
54 | __u8 mode; | 56 | __u8 mode; |
57 | __u8 fcs; | ||
55 | }; | 58 | }; |
56 | 59 | ||
57 | #define L2CAP_CONNINFO 0x02 | 60 | #define L2CAP_CONNINFO 0x02 |
@@ -93,6 +96,32 @@ struct l2cap_conninfo { | |||
93 | #define L2CAP_FCS_NONE 0x00 | 96 | #define L2CAP_FCS_NONE 0x00 |
94 | #define L2CAP_FCS_CRC16 0x01 | 97 | #define L2CAP_FCS_CRC16 0x01 |
95 | 98 | ||
99 | /* L2CAP Control Field bit masks */ | ||
100 | #define L2CAP_CTRL_SAR 0xC000 | ||
101 | #define L2CAP_CTRL_REQSEQ 0x3F00 | ||
102 | #define L2CAP_CTRL_TXSEQ 0x007E | ||
103 | #define L2CAP_CTRL_RETRANS 0x0080 | ||
104 | #define L2CAP_CTRL_FINAL 0x0080 | ||
105 | #define L2CAP_CTRL_POLL 0x0010 | ||
106 | #define L2CAP_CTRL_SUPERVISE 0x000C | ||
107 | #define L2CAP_CTRL_FRAME_TYPE 0x0001 /* I- or S-Frame */ | ||
108 | |||
109 | #define L2CAP_CTRL_TXSEQ_SHIFT 1 | ||
110 | #define L2CAP_CTRL_REQSEQ_SHIFT 8 | ||
111 | #define L2CAP_CTRL_SAR_SHIFT 14 | ||
112 | |||
113 | /* L2CAP Supervisory Function */ | ||
114 | #define L2CAP_SUPER_RCV_READY 0x0000 | ||
115 | #define L2CAP_SUPER_REJECT 0x0004 | ||
116 | #define L2CAP_SUPER_RCV_NOT_READY 0x0008 | ||
117 | #define L2CAP_SUPER_SELECT_REJECT 0x000C | ||
118 | |||
119 | /* L2CAP Segmentation and Reassembly */ | ||
120 | #define L2CAP_SDU_UNSEGMENTED 0x0000 | ||
121 | #define L2CAP_SDU_START 0x4000 | ||
122 | #define L2CAP_SDU_END 0x8000 | ||
123 | #define L2CAP_SDU_CONTINUE 0xC000 | ||
124 | |||
96 | /* L2CAP structures */ | 125 | /* L2CAP structures */ |
97 | struct l2cap_hdr { | 126 | struct l2cap_hdr { |
98 | __le16 len; | 127 | __le16 len; |
@@ -190,7 +219,7 @@ struct l2cap_conf_rfc { | |||
190 | #define L2CAP_MODE_RETRANS 0x01 | 219 | #define L2CAP_MODE_RETRANS 0x01 |
191 | #define L2CAP_MODE_FLOWCTL 0x02 | 220 | #define L2CAP_MODE_FLOWCTL 0x02 |
192 | #define L2CAP_MODE_ERTM 0x03 | 221 | #define L2CAP_MODE_ERTM 0x03 |
193 | #define L2CAP_MODE_STREAM 0x04 | 222 | #define L2CAP_MODE_STREAMING 0x04 |
194 | 223 | ||
195 | struct l2cap_disconn_req { | 224 | struct l2cap_disconn_req { |
196 | __le16 dcid; | 225 | __le16 dcid; |
@@ -261,6 +290,14 @@ struct l2cap_conn { | |||
261 | 290 | ||
262 | /* ----- L2CAP channel and socket info ----- */ | 291 | /* ----- L2CAP channel and socket info ----- */ |
263 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) | 292 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) |
293 | #define TX_QUEUE(sk) (&l2cap_pi(sk)->tx_queue) | ||
294 | #define SREJ_QUEUE(sk) (&l2cap_pi(sk)->srej_queue) | ||
295 | #define SREJ_LIST(sk) (&l2cap_pi(sk)->srej_l.list) | ||
296 | |||
297 | struct srej_list { | ||
298 | __u8 tx_seq; | ||
299 | struct list_head list; | ||
300 | }; | ||
264 | 301 | ||
265 | struct l2cap_pinfo { | 302 | struct l2cap_pinfo { |
266 | struct bt_sock bt; | 303 | struct bt_sock bt; |
@@ -271,30 +308,97 @@ struct l2cap_pinfo { | |||
271 | __u16 imtu; | 308 | __u16 imtu; |
272 | __u16 omtu; | 309 | __u16 omtu; |
273 | __u16 flush_to; | 310 | __u16 flush_to; |
274 | __u8 sec_level; | 311 | __u8 mode; |
312 | __u8 num_conf_req; | ||
313 | __u8 num_conf_rsp; | ||
314 | |||
315 | __u8 fcs; | ||
316 | __u8 sec_level; | ||
275 | __u8 role_switch; | 317 | __u8 role_switch; |
276 | __u8 force_reliable; | 318 | __u8 force_reliable; |
277 | 319 | ||
278 | __u8 conf_req[64]; | 320 | __u8 conf_req[64]; |
279 | __u8 conf_len; | 321 | __u8 conf_len; |
280 | __u8 conf_state; | 322 | __u8 conf_state; |
281 | __u8 conf_retry; | 323 | __u8 conn_state; |
324 | |||
325 | __u8 next_tx_seq; | ||
326 | __u8 expected_ack_seq; | ||
327 | __u8 req_seq; | ||
328 | __u8 expected_tx_seq; | ||
329 | __u8 buffer_seq; | ||
330 | __u8 buffer_seq_srej; | ||
331 | __u8 srej_save_reqseq; | ||
332 | __u8 unacked_frames; | ||
333 | __u8 retry_count; | ||
334 | __u8 num_to_ack; | ||
335 | __u16 sdu_len; | ||
336 | __u16 partial_sdu_len; | ||
337 | struct sk_buff *sdu; | ||
282 | 338 | ||
283 | __u8 ident; | 339 | __u8 ident; |
284 | 340 | ||
341 | __u8 remote_tx_win; | ||
342 | __u8 remote_max_tx; | ||
343 | __u16 retrans_timeout; | ||
344 | __u16 monitor_timeout; | ||
345 | __u16 max_pdu_size; | ||
346 | |||
285 | __le16 sport; | 347 | __le16 sport; |
286 | 348 | ||
349 | struct timer_list retrans_timer; | ||
350 | struct timer_list monitor_timer; | ||
351 | struct sk_buff_head tx_queue; | ||
352 | struct sk_buff_head srej_queue; | ||
353 | struct srej_list srej_l; | ||
287 | struct l2cap_conn *conn; | 354 | struct l2cap_conn *conn; |
288 | struct sock *next_c; | 355 | struct sock *next_c; |
289 | struct sock *prev_c; | 356 | struct sock *prev_c; |
290 | }; | 357 | }; |
291 | 358 | ||
292 | #define L2CAP_CONF_REQ_SENT 0x01 | 359 | #define L2CAP_CONF_REQ_SENT 0x01 |
293 | #define L2CAP_CONF_INPUT_DONE 0x02 | 360 | #define L2CAP_CONF_INPUT_DONE 0x02 |
294 | #define L2CAP_CONF_OUTPUT_DONE 0x04 | 361 | #define L2CAP_CONF_OUTPUT_DONE 0x04 |
295 | #define L2CAP_CONF_CONNECT_PEND 0x80 | 362 | #define L2CAP_CONF_MTU_DONE 0x08 |
296 | 363 | #define L2CAP_CONF_MODE_DONE 0x10 | |
297 | #define L2CAP_CONF_MAX_RETRIES 2 | 364 | #define L2CAP_CONF_CONNECT_PEND 0x20 |
365 | #define L2CAP_CONF_NO_FCS_RECV 0x40 | ||
366 | #define L2CAP_CONF_STATE2_DEVICE 0x80 | ||
367 | |||
368 | #define L2CAP_CONF_MAX_CONF_REQ 2 | ||
369 | #define L2CAP_CONF_MAX_CONF_RSP 2 | ||
370 | |||
371 | #define L2CAP_CONN_SAR_SDU 0x01 | ||
372 | #define L2CAP_CONN_SREJ_SENT 0x02 | ||
373 | #define L2CAP_CONN_WAIT_F 0x04 | ||
374 | #define L2CAP_CONN_SREJ_ACT 0x08 | ||
375 | #define L2CAP_CONN_SEND_PBIT 0x10 | ||
376 | #define L2CAP_CONN_REMOTE_BUSY 0x20 | ||
377 | #define L2CAP_CONN_LOCAL_BUSY 0x40 | ||
378 | |||
379 | #define __mod_retrans_timer() mod_timer(&l2cap_pi(sk)->retrans_timer, \ | ||
380 | jiffies + msecs_to_jiffies(L2CAP_DEFAULT_RETRANS_TO)); | ||
381 | #define __mod_monitor_timer() mod_timer(&l2cap_pi(sk)->monitor_timer, \ | ||
382 | jiffies + msecs_to_jiffies(L2CAP_DEFAULT_MONITOR_TO)); | ||
383 | |||
384 | static inline int l2cap_tx_window_full(struct sock *sk) | ||
385 | { | ||
386 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
387 | int sub; | ||
388 | |||
389 | sub = (pi->next_tx_seq - pi->expected_ack_seq) % 64; | ||
390 | |||
391 | if (sub < 0) | ||
392 | sub += 64; | ||
393 | |||
394 | return (sub == pi->remote_tx_win); | ||
395 | } | ||
396 | |||
397 | #define __get_txseq(ctrl) ((ctrl) & L2CAP_CTRL_TXSEQ) >> 1 | ||
398 | #define __get_reqseq(ctrl) ((ctrl) & L2CAP_CTRL_REQSEQ) >> 8 | ||
399 | #define __is_iframe(ctrl) !((ctrl) & L2CAP_CTRL_FRAME_TYPE) | ||
400 | #define __is_sframe(ctrl) (ctrl) & L2CAP_CTRL_FRAME_TYPE | ||
401 | #define __is_sar_start(ctrl) ((ctrl) & L2CAP_CTRL_SAR) == L2CAP_SDU_START | ||
298 | 402 | ||
299 | void l2cap_load(void); | 403 | void l2cap_load(void); |
300 | 404 | ||