diff options
author | Gustavo F. Padovan <gustavo@las.ic.unicamp.br> | 2009-08-20 21:25:58 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-08-22 17:53:58 -0400 |
commit | c74e560cd0101455f1889515e1527e4c2e266113 (patch) | |
tree | a828b646b60578c1e90580da0d92e5d1ee7e7981 /include/net/bluetooth | |
parent | 1c2acffb76d4bc5fd27c4ea55cc27ad8ead10f9a (diff) |
Bluetooth: Add support for Segmentation and Reassembly of SDUs
ERTM should use Segmentation and Reassembly to break down a SDU in many
PDUs on sending data to the other side.
On sending packets we queue all 'segments' until end of segmentation and
just the add them to the queue for sending. On receiving we create a new
SKB with the SDU reassembled.
Initially based on a patch from Nathan Holstein <nathan@lampreynetworks.com>
Signed-off-by: Gustavo F. Padovan <gustavo@las.ic.unicamp.br>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'include/net/bluetooth')
-rw-r--r-- | include/net/bluetooth/l2cap.h | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 9bbfbe74d400..0afde8d22b56 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
@@ -34,7 +34,7 @@ | |||
34 | #define L2CAP_DEFAULT_MAX_RECEIVE 1 | 34 | #define L2CAP_DEFAULT_MAX_RECEIVE 1 |
35 | #define L2CAP_DEFAULT_RETRANS_TO 300 /* 300 milliseconds */ | 35 | #define L2CAP_DEFAULT_RETRANS_TO 300 /* 300 milliseconds */ |
36 | #define L2CAP_DEFAULT_MONITOR_TO 1000 /* 1 second */ | 36 | #define L2CAP_DEFAULT_MONITOR_TO 1000 /* 1 second */ |
37 | #define L2CAP_DEFAULT_MAX_RX_APDU 0xfff7 | 37 | #define L2CAP_DEFAULT_MAX_PDU_SIZE 672 |
38 | 38 | ||
39 | #define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */ | 39 | #define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */ |
40 | #define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */ | 40 | #define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */ |
@@ -311,6 +311,7 @@ struct l2cap_pinfo { | |||
311 | __u8 conf_req[64]; | 311 | __u8 conf_req[64]; |
312 | __u8 conf_len; | 312 | __u8 conf_len; |
313 | __u8 conf_state; | 313 | __u8 conf_state; |
314 | __u8 conn_state; | ||
314 | 315 | ||
315 | __u8 next_tx_seq; | 316 | __u8 next_tx_seq; |
316 | __u8 expected_ack_seq; | 317 | __u8 expected_ack_seq; |
@@ -318,6 +319,9 @@ struct l2cap_pinfo { | |||
318 | __u8 expected_tx_seq; | 319 | __u8 expected_tx_seq; |
319 | __u8 unacked_frames; | 320 | __u8 unacked_frames; |
320 | __u8 num_to_ack; | 321 | __u8 num_to_ack; |
322 | __u16 sdu_len; | ||
323 | __u16 partial_sdu_len; | ||
324 | struct sk_buff *sdu; | ||
321 | 325 | ||
322 | __u8 ident; | 326 | __u8 ident; |
323 | 327 | ||
@@ -346,6 +350,8 @@ struct l2cap_pinfo { | |||
346 | #define L2CAP_CONF_MAX_CONF_REQ 2 | 350 | #define L2CAP_CONF_MAX_CONF_REQ 2 |
347 | #define L2CAP_CONF_MAX_CONF_RSP 2 | 351 | #define L2CAP_CONF_MAX_CONF_RSP 2 |
348 | 352 | ||
353 | #define L2CAP_CONN_SAR_SDU 0x01 | ||
354 | |||
349 | static inline int l2cap_tx_window_full(struct sock *sk) | 355 | static inline int l2cap_tx_window_full(struct sock *sk) |
350 | { | 356 | { |
351 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 357 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
@@ -363,6 +369,7 @@ static inline int l2cap_tx_window_full(struct sock *sk) | |||
363 | #define __get_reqseq(ctrl) ((ctrl) & L2CAP_CTRL_REQSEQ) >> 8 | 369 | #define __get_reqseq(ctrl) ((ctrl) & L2CAP_CTRL_REQSEQ) >> 8 |
364 | #define __is_iframe(ctrl) !((ctrl) & L2CAP_CTRL_FRAME_TYPE) | 370 | #define __is_iframe(ctrl) !((ctrl) & L2CAP_CTRL_FRAME_TYPE) |
365 | #define __is_sframe(ctrl) (ctrl) & L2CAP_CTRL_FRAME_TYPE | 371 | #define __is_sframe(ctrl) (ctrl) & L2CAP_CTRL_FRAME_TYPE |
372 | #define __is_sar_start(ctrl) ((ctrl) & L2CAP_CTRL_SAR) == L2CAP_SDU_START | ||
366 | 373 | ||
367 | void l2cap_load(void); | 374 | void l2cap_load(void); |
368 | 375 | ||