Commit 08333283 authored by Mat Martineau's avatar Mat Martineau Committed by Gustavo Padovan

Bluetooth: Add new l2cap_chan struct members for high speed channels

An L2CAP channel using high speed continues to be associated with a
BR/EDR l2cap_conn, while also tracking an additional hci_conn
(representing a physical link on a high speed controller) and hci_chan
(representing a logical link).  There may only be one physical link
between two high speed controllers.  Each physical link may contain
several logical links, with each logical link representing a channel
with specific quality of service.

During a channel move, the destination channel id, current move state,
and role (initiator vs. responder) are tracked and used by the channel
move state machine.  The ident value associated with a move request
must also be stored in order to use it in later move responses.

The active channel is stored in local_amp_id.
Signed-off-by: default avatarMat Martineau <mathewm@codeaurora.org>
Signed-off-by: default avatarAndrei Emeltchenko <andrei.emeltchenko@intel.com>
Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
parent 9917c85b
...@@ -434,6 +434,8 @@ struct l2cap_chan { ...@@ -434,6 +434,8 @@ struct l2cap_chan {
struct sock *sk; struct sock *sk;
struct l2cap_conn *conn; struct l2cap_conn *conn;
struct hci_conn *hs_hcon;
struct hci_chan *hs_hchan;
struct kref kref; struct kref kref;
__u8 state; __u8 state;
...@@ -477,6 +479,11 @@ struct l2cap_chan { ...@@ -477,6 +479,11 @@ struct l2cap_chan {
unsigned long conn_state; unsigned long conn_state;
unsigned long flags; unsigned long flags;
__u8 local_amp_id;
__u8 move_id;
__u8 move_state;
__u8 move_role;
__u16 next_tx_seq; __u16 next_tx_seq;
__u16 expected_ack_seq; __u16 expected_ack_seq;
__u16 expected_tx_seq; __u16 expected_tx_seq;
...@@ -644,6 +651,9 @@ enum { ...@@ -644,6 +651,9 @@ enum {
enum { enum {
L2CAP_RX_STATE_RECV, L2CAP_RX_STATE_RECV,
L2CAP_RX_STATE_SREJ_SENT, L2CAP_RX_STATE_SREJ_SENT,
L2CAP_RX_STATE_MOVE,
L2CAP_RX_STATE_WAIT_P,
L2CAP_RX_STATE_WAIT_F,
}; };
enum { enum {
...@@ -674,6 +684,25 @@ enum { ...@@ -674,6 +684,25 @@ enum {
L2CAP_EV_RECV_FRAME, L2CAP_EV_RECV_FRAME,
}; };
enum {
L2CAP_MOVE_ROLE_NONE,
L2CAP_MOVE_ROLE_INITIATOR,
L2CAP_MOVE_ROLE_RESPONDER,
};
enum {
L2CAP_MOVE_STABLE,
L2CAP_MOVE_WAIT_REQ,
L2CAP_MOVE_WAIT_RSP,
L2CAP_MOVE_WAIT_RSP_SUCCESS,
L2CAP_MOVE_WAIT_CONFIRM,
L2CAP_MOVE_WAIT_CONFIRM_RSP,
L2CAP_MOVE_WAIT_LOGICAL_COMP,
L2CAP_MOVE_WAIT_LOGICAL_CFM,
L2CAP_MOVE_WAIT_LOCAL_BUSY,
L2CAP_MOVE_WAIT_PREPARE,
};
void l2cap_chan_hold(struct l2cap_chan *c); void l2cap_chan_hold(struct l2cap_chan *c);
void l2cap_chan_put(struct l2cap_chan *c); void l2cap_chan_put(struct l2cap_chan *c);
......
...@@ -2788,6 +2788,11 @@ int l2cap_ertm_init(struct l2cap_chan *chan) ...@@ -2788,6 +2788,11 @@ int l2cap_ertm_init(struct l2cap_chan *chan)
skb_queue_head_init(&chan->tx_q); skb_queue_head_init(&chan->tx_q);
chan->local_amp_id = 0;
chan->move_id = 0;
chan->move_state = L2CAP_MOVE_STABLE;
chan->move_role = L2CAP_MOVE_ROLE_NONE;
if (chan->mode != L2CAP_MODE_ERTM) if (chan->mode != L2CAP_MODE_ERTM)
return 0; return 0;
......
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