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: Mat Martineau <mathewm@codeaurora.org> Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
This commit is contained in:
parent
9917c85b06
commit
08333283a7
|
@ -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 {
|
||||||
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 {
|
||||||
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 {
|
||||||
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)
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue