aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMat Martineau <mathewm@codeaurora.org>2012-10-23 18:24:23 -0400
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>2012-10-23 22:26:30 -0400
commit3f7a56c4ff438f4727439cb048034f56320dd228 (patch)
treebdd3ce761c4055bed50b3f301e1de2b745acb1af
parente6a3ee6e8aa27d0a38be7ead0c1624041697ffbc (diff)
Bluetooth: Start channel move when socket option is changed
Channel moves are triggered by changes to the BT_CHANNEL_POLICY sockopt when an ERTM or streaming-mode channel is connected. Moves are only started if enable_hs is true. Signed-off-by: Mat Martineau <mathewm@codeaurora.org> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
-rw-r--r--include/net/bluetooth/l2cap.h1
-rw-r--r--net/bluetooth/l2cap_core.c19
-rw-r--r--net/bluetooth/l2cap_sock.c5
3 files changed, 25 insertions, 0 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index b4c3c65c1f58..49783e948856 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -809,5 +809,6 @@ void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
809void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); 809void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
810void l2cap_chan_del(struct l2cap_chan *chan, int err); 810void l2cap_chan_del(struct l2cap_chan *chan, int err);
811void l2cap_send_conn_req(struct l2cap_chan *chan); 811void l2cap_send_conn_req(struct l2cap_chan *chan);
812void l2cap_move_start(struct l2cap_chan *chan);
812 813
813#endif /* __L2CAP_H */ 814#endif /* __L2CAP_H */
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 93f1ebbd7502..fae0c70e8e10 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -4453,6 +4453,25 @@ static void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4453 } 4453 }
4454} 4454}
4455 4455
4456void l2cap_move_start(struct l2cap_chan *chan)
4457{
4458 BT_DBG("chan %p", chan);
4459
4460 if (chan->local_amp_id == HCI_BREDR_ID) {
4461 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4462 return;
4463 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4464 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4465 /* Placeholder - start physical link setup */
4466 } else {
4467 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4468 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4469 chan->move_id = 0;
4470 l2cap_move_setup(chan);
4471 l2cap_send_move_chan_req(chan, 0);
4472 }
4473}
4474
4456static void l2cap_do_create(struct l2cap_chan *chan, int result, 4475static void l2cap_do_create(struct l2cap_chan *chan, int result,
4457 u8 local_amp_id, u8 remote_amp_id) 4476 u8 local_amp_id, u8 remote_amp_id)
4458{ 4477{
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index 89f1472939ec..1bcfb8422fdc 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -736,6 +736,11 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
736 } 736 }
737 737
738 chan->chan_policy = (u8) opt; 738 chan->chan_policy = (u8) opt;
739
740 if (sk->sk_state == BT_CONNECTED &&
741 chan->move_role == L2CAP_MOVE_ROLE_NONE)
742 l2cap_move_start(chan);
743
739 break; 744 break;
740 745
741 default: 746 default: