aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/bluetooth
diff options
context:
space:
mode:
authorGustavo F. Padovan <gustavo@las.ic.unicamp.br>2009-08-20 21:25:58 -0400
committerMarcel Holtmann <marcel@holtmann.org>2009-08-22 17:53:58 -0400
commitc74e560cd0101455f1889515e1527e4c2e266113 (patch)
treea828b646b60578c1e90580da0d92e5d1ee7e7981 /include/net/bluetooth
parent1c2acffb76d4bc5fd27c4ea55cc27ad8ead10f9a (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.h9
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
349static inline int l2cap_tx_window_full(struct sock *sk) 355static 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
367void l2cap_load(void); 374void l2cap_load(void);
368 375