From: Gustavo Padovan <padovan@profusion.mobi>
To: Vinicius Costa Gomes <vinicius.gomes@openbossa.org>
Cc: linux-bluetooth@vger.kernel.org
Subject: Re: [PATCH 4/7] Bluetooth: Add support for reusing the same hci_conn for LE links
Date: Wed, 24 Aug 2011 22:27:12 -0300 [thread overview]
Message-ID: <20110825012712.GF5462@joana> (raw)
In-Reply-To: <1313798816-8647-5-git-send-email-vinicius.gomes@openbossa.org>
Hi Vinicius,
* Vinicius Costa Gomes <vinicius.gomes@openbossa.org> [2011-08-19 21:06:53 -0300]:
> As most LE devices leave advertising mode when they enter the connected
> state, we may want to "pass" that connection to other users.
>
> The first user will be the pairing procedure, the connection is
> established without an associated socket, after the pairing is
> complete, userspace may want to discover via GATT what services the
> newly bonded device has.
>
> If userspace establishes the connection while the timeout still
> hasn't expired, the connection will be re-used.
>
> Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@openbossa.org>
> ---
> net/bluetooth/hci_conn.c | 31 ++++++++++++-----------
> net/bluetooth/l2cap_core.c | 56 ++++++++++++++++++++++++++++++-------------
> 2 files changed, 55 insertions(+), 32 deletions(-)
>
> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> index fa6820e..f5e2bd8 100644
> --- a/net/bluetooth/hci_conn.c
> +++ b/net/bluetooth/hci_conn.c
> @@ -501,23 +501,24 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8
> BT_DBG("%s dst %s", hdev->name, batostr(dst));
>
> if (type == LE_LINK) {
> - struct adv_entry *entry;
> + struct adv_entry *entry = NULL;
>
> le = hci_conn_hash_lookup_ba(hdev, LE_LINK, dst);
> - if (le)
> - return ERR_PTR(-EBUSY);
> -
> - entry = hci_find_adv_entry(hdev, dst);
> - if (!entry)
> - return ERR_PTR(-EHOSTUNREACH);
> -
> - le = hci_conn_add(hdev, LE_LINK, dst);
> - if (!le)
> - return ERR_PTR(-ENOMEM);
> -
> - le->dst_type = entry->bdaddr_type;
> -
> - hci_le_connect(le);
> + if (!le) {
> + entry = hci_find_adv_entry(hdev, dst);
> + if (!entry)
> + return ERR_PTR(-EHOSTUNREACH);
> +
> + le = hci_conn_add(hdev, LE_LINK, dst);
> + if (!le)
> + return ERR_PTR(-ENOMEM);
> +
> + le->dst_type = entry->bdaddr_type;
> + le->pending_sec_level = sec_level;
> + le->sec_level = BT_SECURITY_LOW;
> + le->auth_type = auth_type;
> + hci_le_connect(le);
> + }
>
> hci_conn_hold(le);
>
> diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
> index d5ef9a2..ed1d2bd 100644
> --- a/net/bluetooth/l2cap_core.c
> +++ b/net/bluetooth/l2cap_core.c
> @@ -627,10 +627,32 @@ static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
> return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
> }
>
> +static void l2cap_chan_ready(struct sock *sk)
> +{
> + struct l2cap_chan *chan = l2cap_pi(sk)->chan;
> + struct sock *parent = bt_sk(sk)->parent;
> +
> + BT_DBG("sk %p, parent %p", sk, parent);
> +
> + chan->conf_state = 0;
> + __clear_chan_timer(chan);
> +
> + l2cap_state_change(chan, BT_CONNECTED);
> + sk->sk_state_change(sk);
> +
> + if (parent)
> + parent->sk_data_ready(parent, 0);
> +}
> +
> static void l2cap_do_start(struct l2cap_chan *chan)
> {
> struct l2cap_conn *conn = chan->conn;
>
> + if (conn->hcon->type == LE_LINK) {
> + l2cap_chan_ready(chan->sk);
> + return;
> + }
> +
> if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
> if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
> return;
> @@ -881,23 +903,6 @@ clean:
> bh_unlock_sock(parent);
> }
>
> -static void l2cap_chan_ready(struct sock *sk)
> -{
> - struct l2cap_chan *chan = l2cap_pi(sk)->chan;
> - struct sock *parent = bt_sk(sk)->parent;
> -
> - BT_DBG("sk %p, parent %p", sk, parent);
> -
> - chan->conf_state = 0;
> - __clear_chan_timer(chan);
> -
> - l2cap_state_change(chan, BT_CONNECTED);
> - sk->sk_state_change(sk);
> -
> - if (parent)
> - parent->sk_data_ready(parent, 0);
> -}
> -
> static void l2cap_conn_ready(struct l2cap_conn *conn)
> {
> struct l2cap_chan *chan;
> @@ -1087,6 +1092,17 @@ static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm, bdaddr
> return c1;
> }
>
> +static int l2cap_chan_empty(struct l2cap_conn *conn)
> +{
> + int ret;
> +
> + read_lock(&conn->chan_lock);
> + ret = list_empty(&conn->chan_l);
> + read_unlock(&conn->chan_lock);
> +
> + return ret;
> +}
> +
> int l2cap_chan_connect(struct l2cap_chan *chan)
> {
> struct sock *sk = chan->sk;
> @@ -1128,6 +1144,12 @@ int l2cap_chan_connect(struct l2cap_chan *chan)
> goto done;
> }
>
> + if (hcon->type == LE_LINK && !l2cap_chan_empty(conn)) {
> + hci_conn_put(hcon);
The lock (in l2cap_chan_empty) have to be release after conn put. So just get
rid of l2cap_chan_empty and do an inline locking here.
Gustavo
next prev parent reply other threads:[~2011-08-25 1:27 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-20 0:06 [PATCH 0/7] Bluetooth: LE Pairing support Vinicius Costa Gomes
2011-08-20 0:06 ` [PATCH 1/7] Bluetooth: Reset the security timer when a command is queued Vinicius Costa Gomes
2011-08-25 1:17 ` Gustavo Padovan
2011-08-20 0:06 ` [PATCH 2/7] Bluetooth: Add a flag to indicate that SMP is going on Vinicius Costa Gomes
2011-08-25 1:19 ` Gustavo Padovan
2011-08-20 0:06 ` [PATCH 3/7] Bluetooth: Use the same timeouts for both ACL and LE links Vinicius Costa Gomes
2011-08-25 1:20 ` Gustavo Padovan
2011-08-20 0:06 ` [PATCH 4/7] Bluetooth: Add support for reusing the same hci_conn for " Vinicius Costa Gomes
2011-08-25 1:27 ` Gustavo Padovan [this message]
2011-08-25 14:27 ` Vinicius Costa Gomes
2011-08-25 22:13 ` [PATCH] " Vinicius Costa Gomes
2011-08-20 0:06 ` [PATCH 5/7] Bluetooth: Add support for pairing via mgmt over LE Vinicius Costa Gomes
2011-08-25 1:30 ` Gustavo Padovan
2011-08-20 0:06 ` [PATCH 6/7] Bluetooth: Add support for running SMP without a socket Vinicius Costa Gomes
2011-08-25 1:30 ` Gustavo Padovan
2011-08-20 0:06 ` [PATCH 7/7] Bluetooth: Add link_type information to the mgmt Connected event Vinicius Costa Gomes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110825012712.GF5462@joana \
--to=padovan@profusion.mobi \
--cc=linux-bluetooth@vger.kernel.org \
--cc=vinicius.gomes@openbossa.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).