diff options
author | Gustavo F. Padovan <padovan@profusion.mobi> | 2011-03-25 19:36:10 -0400 |
---|---|---|
committer | Gustavo F. Padovan <padovan@profusion.mobi> | 2011-04-07 17:06:27 -0400 |
commit | f1c6775be6fc944e32e0150305d9753b9a846519 (patch) | |
tree | 6e860c375073aaae189231fd5eff9c27b315ea7e /net | |
parent | e92c8e70faf5e3cc22979daba2a895359aa1eab2 (diff) |
Bluetooth: Move srej and busy queues to struct l2cap_chan
As part of the moving channel stuff to l2cap_chan.
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Diffstat (limited to 'net')
-rw-r--r-- | net/bluetooth/l2cap_core.c | 42 | ||||
-rw-r--r-- | net/bluetooth/l2cap_sock.c | 2 |
2 files changed, 20 insertions, 24 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index eaac13cb7932..06c505b1476d 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -245,8 +245,8 @@ void l2cap_chan_del(struct l2cap_chan *chan, int err) | |||
245 | del_timer(&chan->monitor_timer); | 245 | del_timer(&chan->monitor_timer); |
246 | del_timer(&chan->ack_timer); | 246 | del_timer(&chan->ack_timer); |
247 | 247 | ||
248 | skb_queue_purge(SREJ_QUEUE(sk)); | 248 | skb_queue_purge(&chan->srej_q); |
249 | skb_queue_purge(BUSY_QUEUE(sk)); | 249 | skb_queue_purge(&chan->busy_q); |
250 | 250 | ||
251 | list_for_each_entry_safe(l, tmp, SREJ_LIST(sk), list) { | 251 | list_for_each_entry_safe(l, tmp, SREJ_LIST(sk), list) { |
252 | list_del(&l->list); | 252 | list_del(&l->list); |
@@ -1588,8 +1588,8 @@ static inline void l2cap_ertm_init(struct l2cap_chan *chan) | |||
1588 | (unsigned long) chan); | 1588 | (unsigned long) chan); |
1589 | setup_timer(&chan->ack_timer, l2cap_ack_timeout, (unsigned long) chan); | 1589 | setup_timer(&chan->ack_timer, l2cap_ack_timeout, (unsigned long) chan); |
1590 | 1590 | ||
1591 | __skb_queue_head_init(SREJ_QUEUE(sk)); | 1591 | skb_queue_head_init(&chan->srej_q); |
1592 | __skb_queue_head_init(BUSY_QUEUE(sk)); | 1592 | skb_queue_head_init(&chan->busy_q); |
1593 | 1593 | ||
1594 | INIT_WORK(&l2cap_pi(sk)->busy_work, l2cap_busy_work); | 1594 | INIT_WORK(&l2cap_pi(sk)->busy_work, l2cap_busy_work); |
1595 | 1595 | ||
@@ -2815,16 +2815,15 @@ static inline void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) | |||
2815 | 2815 | ||
2816 | static int l2cap_add_to_srej_queue(struct l2cap_chan *chan, struct sk_buff *skb, u8 tx_seq, u8 sar) | 2816 | static int l2cap_add_to_srej_queue(struct l2cap_chan *chan, struct sk_buff *skb, u8 tx_seq, u8 sar) |
2817 | { | 2817 | { |
2818 | struct sock *sk = chan->sk; | ||
2819 | struct sk_buff *next_skb; | 2818 | struct sk_buff *next_skb; |
2820 | int tx_seq_offset, next_tx_seq_offset; | 2819 | int tx_seq_offset, next_tx_seq_offset; |
2821 | 2820 | ||
2822 | bt_cb(skb)->tx_seq = tx_seq; | 2821 | bt_cb(skb)->tx_seq = tx_seq; |
2823 | bt_cb(skb)->sar = sar; | 2822 | bt_cb(skb)->sar = sar; |
2824 | 2823 | ||
2825 | next_skb = skb_peek(SREJ_QUEUE(sk)); | 2824 | next_skb = skb_peek(&chan->srej_q); |
2826 | if (!next_skb) { | 2825 | if (!next_skb) { |
2827 | __skb_queue_tail(SREJ_QUEUE(sk), skb); | 2826 | __skb_queue_tail(&chan->srej_q, skb); |
2828 | return 0; | 2827 | return 0; |
2829 | } | 2828 | } |
2830 | 2829 | ||
@@ -2842,16 +2841,16 @@ static int l2cap_add_to_srej_queue(struct l2cap_chan *chan, struct sk_buff *skb, | |||
2842 | next_tx_seq_offset += 64; | 2841 | next_tx_seq_offset += 64; |
2843 | 2842 | ||
2844 | if (next_tx_seq_offset > tx_seq_offset) { | 2843 | if (next_tx_seq_offset > tx_seq_offset) { |
2845 | __skb_queue_before(SREJ_QUEUE(sk), next_skb, skb); | 2844 | __skb_queue_before(&chan->srej_q, next_skb, skb); |
2846 | return 0; | 2845 | return 0; |
2847 | } | 2846 | } |
2848 | 2847 | ||
2849 | if (skb_queue_is_last(SREJ_QUEUE(sk), next_skb)) | 2848 | if (skb_queue_is_last(&chan->srej_q, next_skb)) |
2850 | break; | 2849 | break; |
2851 | 2850 | ||
2852 | } while ((next_skb = skb_queue_next(SREJ_QUEUE(sk), next_skb))); | 2851 | } while ((next_skb = skb_queue_next(&chan->srej_q, next_skb))); |
2853 | 2852 | ||
2854 | __skb_queue_tail(SREJ_QUEUE(sk), skb); | 2853 | __skb_queue_tail(&chan->srej_q, skb); |
2855 | 2854 | ||
2856 | return 0; | 2855 | return 0; |
2857 | } | 2856 | } |
@@ -2971,11 +2970,11 @@ static int l2cap_try_push_rx_skb(struct l2cap_chan *chan) | |||
2971 | u16 control; | 2970 | u16 control; |
2972 | int err; | 2971 | int err; |
2973 | 2972 | ||
2974 | while ((skb = skb_dequeue(BUSY_QUEUE(sk)))) { | 2973 | while ((skb = skb_dequeue(&chan->busy_q))) { |
2975 | control = bt_cb(skb)->sar << L2CAP_CTRL_SAR_SHIFT; | 2974 | control = bt_cb(skb)->sar << L2CAP_CTRL_SAR_SHIFT; |
2976 | err = l2cap_ertm_reassembly_sdu(chan, skb, control); | 2975 | err = l2cap_ertm_reassembly_sdu(chan, skb, control); |
2977 | if (err < 0) { | 2976 | if (err < 0) { |
2978 | skb_queue_head(BUSY_QUEUE(sk), skb); | 2977 | skb_queue_head(&chan->busy_q, skb); |
2979 | return -EBUSY; | 2978 | return -EBUSY; |
2980 | } | 2979 | } |
2981 | 2980 | ||
@@ -3016,7 +3015,7 @@ static void l2cap_busy_work(struct work_struct *work) | |||
3016 | lock_sock(sk); | 3015 | lock_sock(sk); |
3017 | 3016 | ||
3018 | add_wait_queue(sk_sleep(sk), &wait); | 3017 | add_wait_queue(sk_sleep(sk), &wait); |
3019 | while ((skb = skb_peek(BUSY_QUEUE(sk)))) { | 3018 | while ((skb = skb_peek(&pi->chan->busy_q))) { |
3020 | set_current_state(TASK_INTERRUPTIBLE); | 3019 | set_current_state(TASK_INTERRUPTIBLE); |
3021 | 3020 | ||
3022 | if (n_tries++ > L2CAP_LOCAL_BUSY_TRIES) { | 3021 | if (n_tries++ > L2CAP_LOCAL_BUSY_TRIES) { |
@@ -3059,7 +3058,7 @@ static int l2cap_push_rx_skb(struct l2cap_chan *chan, struct sk_buff *skb, u16 c | |||
3059 | 3058 | ||
3060 | if (chan->conn_state & L2CAP_CONN_LOCAL_BUSY) { | 3059 | if (chan->conn_state & L2CAP_CONN_LOCAL_BUSY) { |
3061 | bt_cb(skb)->sar = control >> L2CAP_CTRL_SAR_SHIFT; | 3060 | bt_cb(skb)->sar = control >> L2CAP_CTRL_SAR_SHIFT; |
3062 | __skb_queue_tail(BUSY_QUEUE(sk), skb); | 3061 | __skb_queue_tail(&chan->busy_q, skb); |
3063 | return l2cap_try_push_rx_skb(chan); | 3062 | return l2cap_try_push_rx_skb(chan); |
3064 | 3063 | ||
3065 | 3064 | ||
@@ -3076,7 +3075,7 @@ static int l2cap_push_rx_skb(struct l2cap_chan *chan, struct sk_buff *skb, u16 c | |||
3076 | 3075 | ||
3077 | chan->conn_state |= L2CAP_CONN_LOCAL_BUSY; | 3076 | chan->conn_state |= L2CAP_CONN_LOCAL_BUSY; |
3078 | bt_cb(skb)->sar = control >> L2CAP_CTRL_SAR_SHIFT; | 3077 | bt_cb(skb)->sar = control >> L2CAP_CTRL_SAR_SHIFT; |
3079 | __skb_queue_tail(BUSY_QUEUE(sk), skb); | 3078 | __skb_queue_tail(&chan->busy_q, skb); |
3080 | 3079 | ||
3081 | sctrl = chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; | 3080 | sctrl = chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; |
3082 | sctrl |= L2CAP_SUPER_RCV_NOT_READY; | 3081 | sctrl |= L2CAP_SUPER_RCV_NOT_READY; |
@@ -3187,15 +3186,14 @@ drop: | |||
3187 | 3186 | ||
3188 | static void l2cap_check_srej_gap(struct l2cap_chan *chan, u8 tx_seq) | 3187 | static void l2cap_check_srej_gap(struct l2cap_chan *chan, u8 tx_seq) |
3189 | { | 3188 | { |
3190 | struct sock *sk = chan->sk; | ||
3191 | struct sk_buff *skb; | 3189 | struct sk_buff *skb; |
3192 | u16 control; | 3190 | u16 control; |
3193 | 3191 | ||
3194 | while ((skb = skb_peek(SREJ_QUEUE(sk)))) { | 3192 | while ((skb = skb_peek(&chan->srej_q))) { |
3195 | if (bt_cb(skb)->tx_seq != tx_seq) | 3193 | if (bt_cb(skb)->tx_seq != tx_seq) |
3196 | break; | 3194 | break; |
3197 | 3195 | ||
3198 | skb = skb_dequeue(SREJ_QUEUE(sk)); | 3196 | skb = skb_dequeue(&chan->srej_q); |
3199 | control = bt_cb(skb)->sar << L2CAP_CTRL_SAR_SHIFT; | 3197 | control = bt_cb(skb)->sar << L2CAP_CTRL_SAR_SHIFT; |
3200 | l2cap_ertm_reassembly_sdu(chan, skb, control); | 3198 | l2cap_ertm_reassembly_sdu(chan, skb, control); |
3201 | chan->buffer_seq_srej = | 3199 | chan->buffer_seq_srej = |
@@ -3334,8 +3332,8 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont | |||
3334 | INIT_LIST_HEAD(SREJ_LIST(sk)); | 3332 | INIT_LIST_HEAD(SREJ_LIST(sk)); |
3335 | chan->buffer_seq_srej = chan->buffer_seq; | 3333 | chan->buffer_seq_srej = chan->buffer_seq; |
3336 | 3334 | ||
3337 | __skb_queue_head_init(SREJ_QUEUE(sk)); | 3335 | __skb_queue_head_init(&chan->srej_q); |
3338 | __skb_queue_head_init(BUSY_QUEUE(sk)); | 3336 | __skb_queue_head_init(&chan->busy_q); |
3339 | l2cap_add_to_srej_queue(chan, skb, tx_seq, sar); | 3337 | l2cap_add_to_srej_queue(chan, skb, tx_seq, sar); |
3340 | 3338 | ||
3341 | chan->conn_state |= L2CAP_CONN_SEND_PBIT; | 3339 | chan->conn_state |= L2CAP_CONN_SEND_PBIT; |
@@ -3352,7 +3350,7 @@ expected: | |||
3352 | if (chan->conn_state & L2CAP_CONN_SREJ_SENT) { | 3350 | if (chan->conn_state & L2CAP_CONN_SREJ_SENT) { |
3353 | bt_cb(skb)->tx_seq = tx_seq; | 3351 | bt_cb(skb)->tx_seq = tx_seq; |
3354 | bt_cb(skb)->sar = sar; | 3352 | bt_cb(skb)->sar = sar; |
3355 | __skb_queue_tail(SREJ_QUEUE(sk), skb); | 3353 | __skb_queue_tail(&chan->srej_q, skb); |
3356 | return 0; | 3354 | return 0; |
3357 | } | 3355 | } |
3358 | 3356 | ||
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index d66886f7eccb..55dee999af94 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -1018,8 +1018,6 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent) | |||
1018 | /* Default config options */ | 1018 | /* Default config options */ |
1019 | pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; | 1019 | pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; |
1020 | skb_queue_head_init(TX_QUEUE(sk)); | 1020 | skb_queue_head_init(TX_QUEUE(sk)); |
1021 | skb_queue_head_init(SREJ_QUEUE(sk)); | ||
1022 | skb_queue_head_init(BUSY_QUEUE(sk)); | ||
1023 | INIT_LIST_HEAD(SREJ_LIST(sk)); | 1021 | INIT_LIST_HEAD(SREJ_LIST(sk)); |
1024 | } | 1022 | } |
1025 | 1023 | ||