Loading include/net/bluetooth/l2cap.h +5 −5 Original line number Original line Diff line number Diff line Loading @@ -293,6 +293,11 @@ struct l2cap_chan { __u8 expected_tx_seq; __u8 expected_tx_seq; __u8 buffer_seq; __u8 buffer_seq; __u8 buffer_seq_srej; __u8 buffer_seq_srej; __u8 srej_save_reqseq; __u8 frames_sent; __u8 unacked_frames; __u8 retry_count; __u8 num_acked; struct list_head list; struct list_head list; }; }; Loading Loading @@ -359,11 +364,6 @@ struct l2cap_pinfo { __u8 conf_state; __u8 conf_state; __u8 srej_save_reqseq; __u8 frames_sent; __u8 unacked_frames; __u8 retry_count; __u8 num_acked; __u16 sdu_len; __u16 sdu_len; __u16 partial_sdu_len; __u16 partial_sdu_len; struct sk_buff *sdu; struct sk_buff *sdu; Loading net/bluetooth/l2cap_core.c +24 −27 Original line number Original line Diff line number Diff line Loading @@ -924,7 +924,7 @@ int __l2cap_wait_ack(struct sock *sk) int timeo = HZ/5; int timeo = HZ/5; add_wait_queue(sk_sleep(sk), &wait); add_wait_queue(sk_sleep(sk), &wait); while ((l2cap_pi(sk)->unacked_frames > 0 && l2cap_pi(sk)->conn)) { while ((l2cap_pi(sk)->chan->unacked_frames > 0 && l2cap_pi(sk)->conn)) { set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE); if (!timeo) if (!timeo) Loading Loading @@ -956,13 +956,13 @@ static void l2cap_monitor_timeout(unsigned long arg) BT_DBG("chan %p", chan); BT_DBG("chan %p", chan); bh_lock_sock(sk); bh_lock_sock(sk); if (l2cap_pi(sk)->retry_count >= l2cap_pi(sk)->remote_max_tx) { if (chan->retry_count >= l2cap_pi(sk)->remote_max_tx) { l2cap_send_disconn_req(l2cap_pi(sk)->conn, sk, ECONNABORTED); l2cap_send_disconn_req(l2cap_pi(sk)->conn, sk, ECONNABORTED); bh_unlock_sock(sk); bh_unlock_sock(sk); return; return; } } l2cap_pi(sk)->retry_count++; chan->retry_count++; __mod_monitor_timer(); __mod_monitor_timer(); l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); Loading @@ -977,7 +977,7 @@ static void l2cap_retrans_timeout(unsigned long arg) BT_DBG("sk %p", sk); BT_DBG("sk %p", sk); bh_lock_sock(sk); bh_lock_sock(sk); l2cap_pi(sk)->retry_count = 1; chan->retry_count = 1; __mod_monitor_timer(); __mod_monitor_timer(); chan->conn_state |= L2CAP_CONN_WAIT_F; chan->conn_state |= L2CAP_CONN_WAIT_F; Loading @@ -992,17 +992,17 @@ static void l2cap_drop_acked_frames(struct l2cap_chan *chan) struct sk_buff *skb; struct sk_buff *skb; while ((skb = skb_peek(TX_QUEUE(sk))) && while ((skb = skb_peek(TX_QUEUE(sk))) && l2cap_pi(sk)->unacked_frames) { chan->unacked_frames) { if (bt_cb(skb)->tx_seq == chan->expected_ack_seq) if (bt_cb(skb)->tx_seq == chan->expected_ack_seq) break; break; skb = skb_dequeue(TX_QUEUE(sk)); skb = skb_dequeue(TX_QUEUE(sk)); kfree_skb(skb); kfree_skb(skb); l2cap_pi(sk)->unacked_frames--; chan->unacked_frames--; } } if (!l2cap_pi(sk)->unacked_frames) if (!chan->unacked_frames) del_timer(&l2cap_pi(sk)->retrans_timer); del_timer(&l2cap_pi(sk)->retrans_timer); } } Loading Loading @@ -1141,9 +1141,9 @@ int l2cap_ertm_send(struct l2cap_chan *chan) chan->next_tx_seq = (chan->next_tx_seq + 1) % 64; chan->next_tx_seq = (chan->next_tx_seq + 1) % 64; if (bt_cb(skb)->retries == 1) if (bt_cb(skb)->retries == 1) pi->unacked_frames++; chan->unacked_frames++; pi->frames_sent++; chan->frames_sent++; if (skb_queue_is_last(TX_QUEUE(sk), skb)) if (skb_queue_is_last(TX_QUEUE(sk), skb)) sk->sk_send_head = NULL; sk->sk_send_head = NULL; Loading Loading @@ -1574,10 +1574,10 @@ static inline void l2cap_ertm_init(struct l2cap_chan *chan) struct sock *sk = chan->sk; struct sock *sk = chan->sk; chan->expected_ack_seq = 0; chan->expected_ack_seq = 0; l2cap_pi(sk)->unacked_frames = 0; chan->unacked_frames = 0; chan->buffer_seq = 0; chan->buffer_seq = 0; l2cap_pi(sk)->num_acked = 0; chan->num_acked = 0; l2cap_pi(sk)->frames_sent = 0; chan->frames_sent = 0; setup_timer(&l2cap_pi(sk)->retrans_timer, setup_timer(&l2cap_pi(sk)->retrans_timer, l2cap_retrans_timeout, (unsigned long) chan); l2cap_retrans_timeout, (unsigned long) chan); Loading Loading @@ -2787,10 +2787,9 @@ static int l2cap_check_fcs(struct l2cap_pinfo *pi, struct sk_buff *skb) static inline void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) static inline void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) { { struct l2cap_pinfo *pi = l2cap_pi(chan->sk); u16 control = 0; u16 control = 0; pi->frames_sent = 0; chan->frames_sent = 0; control |= chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; control |= chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; Loading @@ -2806,7 +2805,7 @@ static inline void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) l2cap_ertm_send(chan); l2cap_ertm_send(chan); if (!(chan->conn_state & L2CAP_CONN_LOCAL_BUSY) && if (!(chan->conn_state & L2CAP_CONN_LOCAL_BUSY) && pi->frames_sent == 0) { chan->frames_sent == 0) { control |= L2CAP_SUPER_RCV_READY; control |= L2CAP_SUPER_RCV_READY; l2cap_send_sframe(chan, control); l2cap_send_sframe(chan, control); } } Loading Loading @@ -2988,7 +2987,7 @@ static int l2cap_try_push_rx_skb(struct l2cap_chan *chan) control = chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; control = chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; control |= L2CAP_SUPER_RCV_READY | L2CAP_CTRL_POLL; control |= L2CAP_SUPER_RCV_READY | L2CAP_CTRL_POLL; l2cap_send_sframe(chan, control); l2cap_send_sframe(chan, control); l2cap_pi(sk)->retry_count = 1; chan->retry_count = 1; del_timer(&pi->retrans_timer); del_timer(&pi->retrans_timer); __mod_monitor_timer(); __mod_monitor_timer(); Loading Loading @@ -3260,7 +3259,7 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont if (L2CAP_CTRL_FINAL & rx_control && if (L2CAP_CTRL_FINAL & rx_control && chan->conn_state & L2CAP_CONN_WAIT_F) { chan->conn_state & L2CAP_CONN_WAIT_F) { del_timer(&pi->monitor_timer); del_timer(&pi->monitor_timer); if (pi->unacked_frames > 0) if (chan->unacked_frames > 0) __mod_retrans_timer(); __mod_retrans_timer(); chan->conn_state &= ~L2CAP_CONN_WAIT_F; chan->conn_state &= ~L2CAP_CONN_WAIT_F; } } Loading Loading @@ -3369,8 +3368,8 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont __mod_ack_timer(); __mod_ack_timer(); pi->num_acked = (pi->num_acked + 1) % num_to_ack; chan->num_acked = (chan->num_acked + 1) % num_to_ack; if (pi->num_acked == num_to_ack - 1) if (chan->num_acked == num_to_ack - 1) l2cap_send_ack(chan); l2cap_send_ack(chan); return 0; return 0; Loading @@ -3383,7 +3382,6 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont static inline void l2cap_data_channel_rrframe(struct l2cap_chan *chan, u16 rx_control) static inline void l2cap_data_channel_rrframe(struct l2cap_chan *chan, u16 rx_control) { { struct sock *sk = chan->sk; struct sock *sk = chan->sk; struct l2cap_pinfo *pi = l2cap_pi(sk); BT_DBG("sk %p, req_seq %d ctrl 0x%4.4x", sk, __get_reqseq(rx_control), BT_DBG("sk %p, req_seq %d ctrl 0x%4.4x", sk, __get_reqseq(rx_control), rx_control); rx_control); Loading @@ -3395,7 +3393,7 @@ static inline void l2cap_data_channel_rrframe(struct l2cap_chan *chan, u16 rx_co chan->conn_state |= L2CAP_CONN_SEND_FBIT; chan->conn_state |= L2CAP_CONN_SEND_FBIT; if (chan->conn_state & L2CAP_CONN_SREJ_SENT) { if (chan->conn_state & L2CAP_CONN_SREJ_SENT) { if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && (pi->unacked_frames > 0)) (chan->unacked_frames > 0)) __mod_retrans_timer(); __mod_retrans_timer(); chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; Loading @@ -3414,7 +3412,7 @@ static inline void l2cap_data_channel_rrframe(struct l2cap_chan *chan, u16 rx_co } else { } else { if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && (pi->unacked_frames > 0)) (chan->unacked_frames > 0)) __mod_retrans_timer(); __mod_retrans_timer(); chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; Loading Loading @@ -3450,7 +3448,6 @@ static inline void l2cap_data_channel_rejframe(struct l2cap_chan *chan, u16 rx_c } } static inline void l2cap_data_channel_srejframe(struct l2cap_chan *chan, u16 rx_control) static inline void l2cap_data_channel_srejframe(struct l2cap_chan *chan, u16 rx_control) { { struct l2cap_pinfo *pi = l2cap_pi(chan->sk); u8 tx_seq = __get_reqseq(rx_control); u8 tx_seq = __get_reqseq(rx_control); BT_DBG("chan %p, req_seq %d ctrl 0x%4.4x", chan, tx_seq, rx_control); BT_DBG("chan %p, req_seq %d ctrl 0x%4.4x", chan, tx_seq, rx_control); Loading @@ -3467,19 +3464,19 @@ static inline void l2cap_data_channel_srejframe(struct l2cap_chan *chan, u16 rx_ l2cap_ertm_send(chan); l2cap_ertm_send(chan); if (chan->conn_state & L2CAP_CONN_WAIT_F) { if (chan->conn_state & L2CAP_CONN_WAIT_F) { pi->srej_save_reqseq = tx_seq; chan->srej_save_reqseq = tx_seq; chan->conn_state |= L2CAP_CONN_SREJ_ACT; chan->conn_state |= L2CAP_CONN_SREJ_ACT; } } } else if (rx_control & L2CAP_CTRL_FINAL) { } else if (rx_control & L2CAP_CTRL_FINAL) { if ((chan->conn_state & L2CAP_CONN_SREJ_ACT) && if ((chan->conn_state & L2CAP_CONN_SREJ_ACT) && pi->srej_save_reqseq == tx_seq) chan->srej_save_reqseq == tx_seq) chan->conn_state &= ~L2CAP_CONN_SREJ_ACT; chan->conn_state &= ~L2CAP_CONN_SREJ_ACT; else else l2cap_retransmit_one_frame(chan, tx_seq); l2cap_retransmit_one_frame(chan, tx_seq); } else { } else { l2cap_retransmit_one_frame(chan, tx_seq); l2cap_retransmit_one_frame(chan, tx_seq); if (chan->conn_state & L2CAP_CONN_WAIT_F) { if (chan->conn_state & L2CAP_CONN_WAIT_F) { pi->srej_save_reqseq = tx_seq; chan->srej_save_reqseq = tx_seq; chan->conn_state |= L2CAP_CONN_SREJ_ACT; chan->conn_state |= L2CAP_CONN_SREJ_ACT; } } } } Loading Loading @@ -3521,7 +3518,7 @@ static inline int l2cap_data_channel_sframe(struct l2cap_chan *chan, u16 rx_cont if (L2CAP_CTRL_FINAL & rx_control && if (L2CAP_CTRL_FINAL & rx_control && chan->conn_state & L2CAP_CONN_WAIT_F) { chan->conn_state & L2CAP_CONN_WAIT_F) { del_timer(&l2cap_pi(sk)->monitor_timer); del_timer(&l2cap_pi(sk)->monitor_timer); if (l2cap_pi(sk)->unacked_frames > 0) if (chan->unacked_frames > 0) __mod_retrans_timer(); __mod_retrans_timer(); chan->conn_state &= ~L2CAP_CONN_WAIT_F; chan->conn_state &= ~L2CAP_CONN_WAIT_F; } } Loading Loading
include/net/bluetooth/l2cap.h +5 −5 Original line number Original line Diff line number Diff line Loading @@ -293,6 +293,11 @@ struct l2cap_chan { __u8 expected_tx_seq; __u8 expected_tx_seq; __u8 buffer_seq; __u8 buffer_seq; __u8 buffer_seq_srej; __u8 buffer_seq_srej; __u8 srej_save_reqseq; __u8 frames_sent; __u8 unacked_frames; __u8 retry_count; __u8 num_acked; struct list_head list; struct list_head list; }; }; Loading Loading @@ -359,11 +364,6 @@ struct l2cap_pinfo { __u8 conf_state; __u8 conf_state; __u8 srej_save_reqseq; __u8 frames_sent; __u8 unacked_frames; __u8 retry_count; __u8 num_acked; __u16 sdu_len; __u16 sdu_len; __u16 partial_sdu_len; __u16 partial_sdu_len; struct sk_buff *sdu; struct sk_buff *sdu; Loading
net/bluetooth/l2cap_core.c +24 −27 Original line number Original line Diff line number Diff line Loading @@ -924,7 +924,7 @@ int __l2cap_wait_ack(struct sock *sk) int timeo = HZ/5; int timeo = HZ/5; add_wait_queue(sk_sleep(sk), &wait); add_wait_queue(sk_sleep(sk), &wait); while ((l2cap_pi(sk)->unacked_frames > 0 && l2cap_pi(sk)->conn)) { while ((l2cap_pi(sk)->chan->unacked_frames > 0 && l2cap_pi(sk)->conn)) { set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE); if (!timeo) if (!timeo) Loading Loading @@ -956,13 +956,13 @@ static void l2cap_monitor_timeout(unsigned long arg) BT_DBG("chan %p", chan); BT_DBG("chan %p", chan); bh_lock_sock(sk); bh_lock_sock(sk); if (l2cap_pi(sk)->retry_count >= l2cap_pi(sk)->remote_max_tx) { if (chan->retry_count >= l2cap_pi(sk)->remote_max_tx) { l2cap_send_disconn_req(l2cap_pi(sk)->conn, sk, ECONNABORTED); l2cap_send_disconn_req(l2cap_pi(sk)->conn, sk, ECONNABORTED); bh_unlock_sock(sk); bh_unlock_sock(sk); return; return; } } l2cap_pi(sk)->retry_count++; chan->retry_count++; __mod_monitor_timer(); __mod_monitor_timer(); l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); Loading @@ -977,7 +977,7 @@ static void l2cap_retrans_timeout(unsigned long arg) BT_DBG("sk %p", sk); BT_DBG("sk %p", sk); bh_lock_sock(sk); bh_lock_sock(sk); l2cap_pi(sk)->retry_count = 1; chan->retry_count = 1; __mod_monitor_timer(); __mod_monitor_timer(); chan->conn_state |= L2CAP_CONN_WAIT_F; chan->conn_state |= L2CAP_CONN_WAIT_F; Loading @@ -992,17 +992,17 @@ static void l2cap_drop_acked_frames(struct l2cap_chan *chan) struct sk_buff *skb; struct sk_buff *skb; while ((skb = skb_peek(TX_QUEUE(sk))) && while ((skb = skb_peek(TX_QUEUE(sk))) && l2cap_pi(sk)->unacked_frames) { chan->unacked_frames) { if (bt_cb(skb)->tx_seq == chan->expected_ack_seq) if (bt_cb(skb)->tx_seq == chan->expected_ack_seq) break; break; skb = skb_dequeue(TX_QUEUE(sk)); skb = skb_dequeue(TX_QUEUE(sk)); kfree_skb(skb); kfree_skb(skb); l2cap_pi(sk)->unacked_frames--; chan->unacked_frames--; } } if (!l2cap_pi(sk)->unacked_frames) if (!chan->unacked_frames) del_timer(&l2cap_pi(sk)->retrans_timer); del_timer(&l2cap_pi(sk)->retrans_timer); } } Loading Loading @@ -1141,9 +1141,9 @@ int l2cap_ertm_send(struct l2cap_chan *chan) chan->next_tx_seq = (chan->next_tx_seq + 1) % 64; chan->next_tx_seq = (chan->next_tx_seq + 1) % 64; if (bt_cb(skb)->retries == 1) if (bt_cb(skb)->retries == 1) pi->unacked_frames++; chan->unacked_frames++; pi->frames_sent++; chan->frames_sent++; if (skb_queue_is_last(TX_QUEUE(sk), skb)) if (skb_queue_is_last(TX_QUEUE(sk), skb)) sk->sk_send_head = NULL; sk->sk_send_head = NULL; Loading Loading @@ -1574,10 +1574,10 @@ static inline void l2cap_ertm_init(struct l2cap_chan *chan) struct sock *sk = chan->sk; struct sock *sk = chan->sk; chan->expected_ack_seq = 0; chan->expected_ack_seq = 0; l2cap_pi(sk)->unacked_frames = 0; chan->unacked_frames = 0; chan->buffer_seq = 0; chan->buffer_seq = 0; l2cap_pi(sk)->num_acked = 0; chan->num_acked = 0; l2cap_pi(sk)->frames_sent = 0; chan->frames_sent = 0; setup_timer(&l2cap_pi(sk)->retrans_timer, setup_timer(&l2cap_pi(sk)->retrans_timer, l2cap_retrans_timeout, (unsigned long) chan); l2cap_retrans_timeout, (unsigned long) chan); Loading Loading @@ -2787,10 +2787,9 @@ static int l2cap_check_fcs(struct l2cap_pinfo *pi, struct sk_buff *skb) static inline void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) static inline void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) { { struct l2cap_pinfo *pi = l2cap_pi(chan->sk); u16 control = 0; u16 control = 0; pi->frames_sent = 0; chan->frames_sent = 0; control |= chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; control |= chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; Loading @@ -2806,7 +2805,7 @@ static inline void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) l2cap_ertm_send(chan); l2cap_ertm_send(chan); if (!(chan->conn_state & L2CAP_CONN_LOCAL_BUSY) && if (!(chan->conn_state & L2CAP_CONN_LOCAL_BUSY) && pi->frames_sent == 0) { chan->frames_sent == 0) { control |= L2CAP_SUPER_RCV_READY; control |= L2CAP_SUPER_RCV_READY; l2cap_send_sframe(chan, control); l2cap_send_sframe(chan, control); } } Loading Loading @@ -2988,7 +2987,7 @@ static int l2cap_try_push_rx_skb(struct l2cap_chan *chan) control = chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; control = chan->buffer_seq << L2CAP_CTRL_REQSEQ_SHIFT; control |= L2CAP_SUPER_RCV_READY | L2CAP_CTRL_POLL; control |= L2CAP_SUPER_RCV_READY | L2CAP_CTRL_POLL; l2cap_send_sframe(chan, control); l2cap_send_sframe(chan, control); l2cap_pi(sk)->retry_count = 1; chan->retry_count = 1; del_timer(&pi->retrans_timer); del_timer(&pi->retrans_timer); __mod_monitor_timer(); __mod_monitor_timer(); Loading Loading @@ -3260,7 +3259,7 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont if (L2CAP_CTRL_FINAL & rx_control && if (L2CAP_CTRL_FINAL & rx_control && chan->conn_state & L2CAP_CONN_WAIT_F) { chan->conn_state & L2CAP_CONN_WAIT_F) { del_timer(&pi->monitor_timer); del_timer(&pi->monitor_timer); if (pi->unacked_frames > 0) if (chan->unacked_frames > 0) __mod_retrans_timer(); __mod_retrans_timer(); chan->conn_state &= ~L2CAP_CONN_WAIT_F; chan->conn_state &= ~L2CAP_CONN_WAIT_F; } } Loading Loading @@ -3369,8 +3368,8 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont __mod_ack_timer(); __mod_ack_timer(); pi->num_acked = (pi->num_acked + 1) % num_to_ack; chan->num_acked = (chan->num_acked + 1) % num_to_ack; if (pi->num_acked == num_to_ack - 1) if (chan->num_acked == num_to_ack - 1) l2cap_send_ack(chan); l2cap_send_ack(chan); return 0; return 0; Loading @@ -3383,7 +3382,6 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont static inline void l2cap_data_channel_rrframe(struct l2cap_chan *chan, u16 rx_control) static inline void l2cap_data_channel_rrframe(struct l2cap_chan *chan, u16 rx_control) { { struct sock *sk = chan->sk; struct sock *sk = chan->sk; struct l2cap_pinfo *pi = l2cap_pi(sk); BT_DBG("sk %p, req_seq %d ctrl 0x%4.4x", sk, __get_reqseq(rx_control), BT_DBG("sk %p, req_seq %d ctrl 0x%4.4x", sk, __get_reqseq(rx_control), rx_control); rx_control); Loading @@ -3395,7 +3393,7 @@ static inline void l2cap_data_channel_rrframe(struct l2cap_chan *chan, u16 rx_co chan->conn_state |= L2CAP_CONN_SEND_FBIT; chan->conn_state |= L2CAP_CONN_SEND_FBIT; if (chan->conn_state & L2CAP_CONN_SREJ_SENT) { if (chan->conn_state & L2CAP_CONN_SREJ_SENT) { if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && (pi->unacked_frames > 0)) (chan->unacked_frames > 0)) __mod_retrans_timer(); __mod_retrans_timer(); chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; Loading @@ -3414,7 +3412,7 @@ static inline void l2cap_data_channel_rrframe(struct l2cap_chan *chan, u16 rx_co } else { } else { if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && (pi->unacked_frames > 0)) (chan->unacked_frames > 0)) __mod_retrans_timer(); __mod_retrans_timer(); chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; chan->conn_state &= ~L2CAP_CONN_REMOTE_BUSY; Loading Loading @@ -3450,7 +3448,6 @@ static inline void l2cap_data_channel_rejframe(struct l2cap_chan *chan, u16 rx_c } } static inline void l2cap_data_channel_srejframe(struct l2cap_chan *chan, u16 rx_control) static inline void l2cap_data_channel_srejframe(struct l2cap_chan *chan, u16 rx_control) { { struct l2cap_pinfo *pi = l2cap_pi(chan->sk); u8 tx_seq = __get_reqseq(rx_control); u8 tx_seq = __get_reqseq(rx_control); BT_DBG("chan %p, req_seq %d ctrl 0x%4.4x", chan, tx_seq, rx_control); BT_DBG("chan %p, req_seq %d ctrl 0x%4.4x", chan, tx_seq, rx_control); Loading @@ -3467,19 +3464,19 @@ static inline void l2cap_data_channel_srejframe(struct l2cap_chan *chan, u16 rx_ l2cap_ertm_send(chan); l2cap_ertm_send(chan); if (chan->conn_state & L2CAP_CONN_WAIT_F) { if (chan->conn_state & L2CAP_CONN_WAIT_F) { pi->srej_save_reqseq = tx_seq; chan->srej_save_reqseq = tx_seq; chan->conn_state |= L2CAP_CONN_SREJ_ACT; chan->conn_state |= L2CAP_CONN_SREJ_ACT; } } } else if (rx_control & L2CAP_CTRL_FINAL) { } else if (rx_control & L2CAP_CTRL_FINAL) { if ((chan->conn_state & L2CAP_CONN_SREJ_ACT) && if ((chan->conn_state & L2CAP_CONN_SREJ_ACT) && pi->srej_save_reqseq == tx_seq) chan->srej_save_reqseq == tx_seq) chan->conn_state &= ~L2CAP_CONN_SREJ_ACT; chan->conn_state &= ~L2CAP_CONN_SREJ_ACT; else else l2cap_retransmit_one_frame(chan, tx_seq); l2cap_retransmit_one_frame(chan, tx_seq); } else { } else { l2cap_retransmit_one_frame(chan, tx_seq); l2cap_retransmit_one_frame(chan, tx_seq); if (chan->conn_state & L2CAP_CONN_WAIT_F) { if (chan->conn_state & L2CAP_CONN_WAIT_F) { pi->srej_save_reqseq = tx_seq; chan->srej_save_reqseq = tx_seq; chan->conn_state |= L2CAP_CONN_SREJ_ACT; chan->conn_state |= L2CAP_CONN_SREJ_ACT; } } } } Loading Loading @@ -3521,7 +3518,7 @@ static inline int l2cap_data_channel_sframe(struct l2cap_chan *chan, u16 rx_cont if (L2CAP_CTRL_FINAL & rx_control && if (L2CAP_CTRL_FINAL & rx_control && chan->conn_state & L2CAP_CONN_WAIT_F) { chan->conn_state & L2CAP_CONN_WAIT_F) { del_timer(&l2cap_pi(sk)->monitor_timer); del_timer(&l2cap_pi(sk)->monitor_timer); if (l2cap_pi(sk)->unacked_frames > 0) if (chan->unacked_frames > 0) __mod_retrans_timer(); __mod_retrans_timer(); chan->conn_state &= ~L2CAP_CONN_WAIT_F; chan->conn_state &= ~L2CAP_CONN_WAIT_F; } } Loading