Commit 39d5a3ee authored by Gustavo F. Padovan's avatar Gustavo F. Padovan

Bluetooth: Move SREJ list to struct l2cap_chan

As part of moving all the Channel related operation to struct l2cap_chan.
Signed-off-by: default avatarGustavo F. Padovan <padovan@profusion.mobi>
parent 2ead70b8
...@@ -277,6 +277,11 @@ struct l2cap_conn_param_update_rsp { ...@@ -277,6 +277,11 @@ struct l2cap_conn_param_update_rsp {
#define L2CAP_CONN_PARAM_REJECTED 0x0001 #define L2CAP_CONN_PARAM_REJECTED 0x0001
/* ----- L2CAP channels and connections ----- */ /* ----- L2CAP channels and connections ----- */
struct srej_list {
__u8 tx_seq;
struct list_head list;
};
struct l2cap_chan { struct l2cap_chan {
struct sock *sk; struct sock *sk;
__u8 ident; __u8 ident;
...@@ -312,6 +317,7 @@ struct l2cap_chan { ...@@ -312,6 +317,7 @@ struct l2cap_chan {
struct sk_buff_head srej_q; struct sk_buff_head srej_q;
struct sk_buff_head busy_q; struct sk_buff_head busy_q;
struct work_struct busy_work; struct work_struct busy_work;
struct list_head srej_l;
struct list_head list; struct list_head list;
}; };
...@@ -350,12 +356,6 @@ struct l2cap_conn { ...@@ -350,12 +356,6 @@ struct l2cap_conn {
/* ----- L2CAP socket info ----- */ /* ----- L2CAP socket info ----- */
#define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk)
#define TX_QUEUE(sk) (&l2cap_pi(sk)->tx_queue) #define TX_QUEUE(sk) (&l2cap_pi(sk)->tx_queue)
#define SREJ_LIST(sk) (&l2cap_pi(sk)->srej_l.list)
struct srej_list {
__u8 tx_seq;
struct list_head list;
};
struct l2cap_pinfo { struct l2cap_pinfo {
struct bt_sock bt; struct bt_sock bt;
...@@ -385,7 +385,6 @@ struct l2cap_pinfo { ...@@ -385,7 +385,6 @@ struct l2cap_pinfo {
__le16 sport; __le16 sport;
struct sk_buff_head tx_queue; struct sk_buff_head tx_queue;
struct srej_list srej_l;
struct l2cap_conn *conn; struct l2cap_conn *conn;
struct l2cap_chan *chan; struct l2cap_chan *chan;
}; };
......
...@@ -252,7 +252,7 @@ void l2cap_chan_del(struct l2cap_chan *chan, int err) ...@@ -252,7 +252,7 @@ void l2cap_chan_del(struct l2cap_chan *chan, int err)
skb_queue_purge(&chan->srej_q); skb_queue_purge(&chan->srej_q);
skb_queue_purge(&chan->busy_q); skb_queue_purge(&chan->busy_q);
list_for_each_entry_safe(l, tmp, SREJ_LIST(sk), list) { list_for_each_entry_safe(l, tmp, &chan->srej_l, list) {
list_del(&l->list); list_del(&l->list);
kfree(l); kfree(l);
} }
...@@ -1205,7 +1205,7 @@ static void l2cap_send_srejtail(struct l2cap_chan *chan) ...@@ -1205,7 +1205,7 @@ static void l2cap_send_srejtail(struct l2cap_chan *chan)
control = L2CAP_SUPER_SELECT_REJECT; control = L2CAP_SUPER_SELECT_REJECT;
control |= L2CAP_CTRL_FINAL; control |= L2CAP_CTRL_FINAL;
tail = list_entry(SREJ_LIST(chan->sk)->prev, struct srej_list, list); tail = list_entry((&chan->srej_l)->prev, struct srej_list, list);
control |= tail->tx_seq << L2CAP_CTRL_REQSEQ_SHIFT; control |= tail->tx_seq << L2CAP_CTRL_REQSEQ_SHIFT;
l2cap_send_sframe(chan, control); l2cap_send_sframe(chan, control);
...@@ -1596,6 +1596,8 @@ static inline void l2cap_ertm_init(struct l2cap_chan *chan) ...@@ -1596,6 +1596,8 @@ static inline void l2cap_ertm_init(struct l2cap_chan *chan)
skb_queue_head_init(&chan->srej_q); skb_queue_head_init(&chan->srej_q);
skb_queue_head_init(&chan->busy_q); skb_queue_head_init(&chan->busy_q);
INIT_LIST_HEAD(&chan->srej_l);
INIT_WORK(&chan->busy_work, l2cap_busy_work); INIT_WORK(&chan->busy_work, l2cap_busy_work);
sk->sk_backlog_rcv = l2cap_ertm_data_rcv; sk->sk_backlog_rcv = l2cap_ertm_data_rcv;
...@@ -3207,11 +3209,10 @@ static void l2cap_check_srej_gap(struct l2cap_chan *chan, u8 tx_seq) ...@@ -3207,11 +3209,10 @@ static void l2cap_check_srej_gap(struct l2cap_chan *chan, u8 tx_seq)
static void l2cap_resend_srejframe(struct l2cap_chan *chan, u8 tx_seq) static void l2cap_resend_srejframe(struct l2cap_chan *chan, u8 tx_seq)
{ {
struct sock *sk = chan->sk;
struct srej_list *l, *tmp; struct srej_list *l, *tmp;
u16 control; u16 control;
list_for_each_entry_safe(l, tmp, SREJ_LIST(sk), list) { list_for_each_entry_safe(l, tmp, &chan->srej_l, list) {
if (l->tx_seq == tx_seq) { if (l->tx_seq == tx_seq) {
list_del(&l->list); list_del(&l->list);
kfree(l); kfree(l);
...@@ -3221,13 +3222,12 @@ static void l2cap_resend_srejframe(struct l2cap_chan *chan, u8 tx_seq) ...@@ -3221,13 +3222,12 @@ static void l2cap_resend_srejframe(struct l2cap_chan *chan, u8 tx_seq)
control |= l->tx_seq << L2CAP_CTRL_REQSEQ_SHIFT; control |= l->tx_seq << L2CAP_CTRL_REQSEQ_SHIFT;
l2cap_send_sframe(chan, control); l2cap_send_sframe(chan, control);
list_del(&l->list); list_del(&l->list);
list_add_tail(&l->list, SREJ_LIST(sk)); list_add_tail(&l->list, &chan->srej_l);
} }
} }
static void l2cap_send_srejframe(struct l2cap_chan *chan, u8 tx_seq) static void l2cap_send_srejframe(struct l2cap_chan *chan, u8 tx_seq)
{ {
struct sock *sk = chan->sk;
struct srej_list *new; struct srej_list *new;
u16 control; u16 control;
...@@ -3239,7 +3239,7 @@ static void l2cap_send_srejframe(struct l2cap_chan *chan, u8 tx_seq) ...@@ -3239,7 +3239,7 @@ static void l2cap_send_srejframe(struct l2cap_chan *chan, u8 tx_seq)
new = kzalloc(sizeof(struct srej_list), GFP_ATOMIC); new = kzalloc(sizeof(struct srej_list), GFP_ATOMIC);
new->tx_seq = chan->expected_tx_seq; new->tx_seq = chan->expected_tx_seq;
chan->expected_tx_seq = (chan->expected_tx_seq + 1) % 64; chan->expected_tx_seq = (chan->expected_tx_seq + 1) % 64;
list_add_tail(&new->list, SREJ_LIST(sk)); list_add_tail(&new->list, &chan->srej_l);
} }
chan->expected_tx_seq = (chan->expected_tx_seq + 1) % 64; chan->expected_tx_seq = (chan->expected_tx_seq + 1) % 64;
} }
...@@ -3288,7 +3288,7 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont ...@@ -3288,7 +3288,7 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont
if (chan->conn_state & L2CAP_CONN_SREJ_SENT) { if (chan->conn_state & L2CAP_CONN_SREJ_SENT) {
struct srej_list *first; struct srej_list *first;
first = list_first_entry(SREJ_LIST(sk), first = list_first_entry(&chan->srej_l,
struct srej_list, list); struct srej_list, list);
if (tx_seq == first->tx_seq) { if (tx_seq == first->tx_seq) {
l2cap_add_to_srej_queue(chan, skb, tx_seq, sar); l2cap_add_to_srej_queue(chan, skb, tx_seq, sar);
...@@ -3297,7 +3297,7 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont ...@@ -3297,7 +3297,7 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont
list_del(&first->list); list_del(&first->list);
kfree(first); kfree(first);
if (list_empty(SREJ_LIST(sk))) { if (list_empty(&chan->srej_l)) {
chan->buffer_seq = chan->buffer_seq_srej; chan->buffer_seq = chan->buffer_seq_srej;
chan->conn_state &= ~L2CAP_CONN_SREJ_SENT; chan->conn_state &= ~L2CAP_CONN_SREJ_SENT;
l2cap_send_ack(chan); l2cap_send_ack(chan);
...@@ -3310,7 +3310,7 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont ...@@ -3310,7 +3310,7 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont
if (l2cap_add_to_srej_queue(chan, skb, tx_seq, sar) < 0) if (l2cap_add_to_srej_queue(chan, skb, tx_seq, sar) < 0)
goto drop; goto drop;
list_for_each_entry(l, SREJ_LIST(sk), list) { list_for_each_entry(l, &chan->srej_l, list) {
if (l->tx_seq == tx_seq) { if (l->tx_seq == tx_seq) {
l2cap_resend_srejframe(chan, tx_seq); l2cap_resend_srejframe(chan, tx_seq);
return 0; return 0;
...@@ -3332,7 +3332,7 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont ...@@ -3332,7 +3332,7 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u16 rx_cont
BT_DBG("sk %p, Enter SREJ", sk); BT_DBG("sk %p, Enter SREJ", sk);
INIT_LIST_HEAD(SREJ_LIST(sk)); INIT_LIST_HEAD(&chan->srej_l);
chan->buffer_seq_srej = chan->buffer_seq; chan->buffer_seq_srej = chan->buffer_seq;
__skb_queue_head_init(&chan->srej_q); __skb_queue_head_init(&chan->srej_q);
......
...@@ -1018,7 +1018,6 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent) ...@@ -1018,7 +1018,6 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent)
/* Default config options */ /* Default config options */
pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; pi->flush_to = L2CAP_DEFAULT_FLUSH_TO;
skb_queue_head_init(TX_QUEUE(sk)); skb_queue_head_init(TX_QUEUE(sk));
INIT_LIST_HEAD(SREJ_LIST(sk));
} }
static struct proto l2cap_proto = { static struct proto l2cap_proto = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment