public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
From: Mat Martineau <mathewm@codeaurora.org>
To: Andrei Emeltchenko <Andrei.Emeltchenko.news@gmail.com>
Cc: linux-bluetooth@vger.kernel.org, pkrystad@codeaurora.org
Subject: Re: [PATCHv1 16/17] Bluetooth: A2MP: Handling fixed channels
Date: Mon, 21 May 2012 15:28:57 -0700 (PDT)	[thread overview]
Message-ID: <alpine.DEB.2.02.1205211438590.2239@mathewm-linux> (raw)
In-Reply-To: <1337351150-20526-17-git-send-email-Andrei.Emeltchenko.news@gmail.com>


Hi Andrei -

On Fri, 18 May 2012, Andrei Emeltchenko wrote:

> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
>
> A2MP fixed channel do not have sk
>
> Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> ---
> include/net/bluetooth/l2cap.h |    1 +
> net/bluetooth/a2mp.c          |    3 +--
> net/bluetooth/l2cap_core.c    |   25 +++++++++++++++++++++++--
> 3 files changed, 25 insertions(+), 4 deletions(-)
>
> diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
> index 8cc739f..db47103 100644
> --- a/include/net/bluetooth/l2cap.h
> +++ b/include/net/bluetooth/l2cap.h
> @@ -582,6 +582,7 @@ struct l2cap_conn {
> #define L2CAP_CHAN_RAW			1
> #define L2CAP_CHAN_CONN_LESS		2
> #define L2CAP_CHAN_CONN_ORIENTED	3
> +#define L2CAP_CHAN_CONN_FIX_A2MP	4
>
> /* ----- L2CAP socket info ----- */
> #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk)
> diff --git a/net/bluetooth/a2mp.c b/net/bluetooth/a2mp.c
> index 4616da1..86b2078 100644
> --- a/net/bluetooth/a2mp.c
> +++ b/net/bluetooth/a2mp.c
> @@ -465,8 +465,7 @@ static struct l2cap_chan *a2mp_chan_open(struct l2cap_conn *conn)
>
> 	hci_conn_hold(conn->hcon);
>
> -	chan->omtu = L2CAP_A2MP_DEFAULT_MTU;
> -	chan->imtu = L2CAP_A2MP_DEFAULT_MTU;
> +	chan->chan_type = L2CAP_CHAN_CONN_FIX_A2MP;
> 	chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
>
> 	chan->ops = &a2mp_chan_ops;
> diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
> index ee333f0..b5c4229 100644
> --- a/net/bluetooth/l2cap_core.c
> +++ b/net/bluetooth/l2cap_core.c
> @@ -450,6 +450,13 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
> 		chan->omtu = L2CAP_DEFAULT_MTU;
> 		break;
>
> +	case L2CAP_CHAN_CONN_FIX_A2MP:
> +		chan->scid = L2CAP_CID_A2MP;
> +		chan->dcid = L2CAP_CID_A2MP;
> +		chan->omtu = L2CAP_A2MP_DEFAULT_MTU;
> +		chan->imtu = L2CAP_A2MP_DEFAULT_MTU;
> +		break;
> +
> 	default:
> 		/* Raw socket can send/recv signalling messages only */
> 		chan->scid = L2CAP_CID_SIGNALING;
> @@ -480,7 +487,7 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err)
> {
> 	struct sock *sk = chan->sk;
> 	struct l2cap_conn *conn = chan->conn;
> -	struct sock *parent = bt_sk(sk)->parent;
> +	struct sock *parent;
>
> 	__clear_chan_timer(chan);
>
> @@ -496,6 +503,9 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err)
> 		hci_conn_put(conn->hcon);
> 	}
>
> +	if (chan->chan_type == L2CAP_CHAN_CONN_FIX_A2MP)
> +		goto clean;
> +

Since this has more to do with socketless channels than A2MP, it might 
be better to do something more generic here like add a callback to 
l2cap_ops so this socket code can be removed from l2cap_core rather 
than worked around.

> 	lock_sock(sk);
>
> 	__l2cap_state_change(chan, BT_CLOSED);
> @@ -504,6 +514,7 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err)
> 	if (err)
> 		__l2cap_chan_set_err(chan, err);
>
> +	parent = bt_sk(sk)->parent;
> 	if (parent) {
> 		bt_accept_unlink(sk);
> 		parent->sk_data_ready(parent, 0);
> @@ -515,6 +526,7 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err)
> 	if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
> 		return;
>
> +clean:
> 	skb_queue_purge(&chan->tx_q);
>
> 	if (chan->mode == L2CAP_MODE_ERTM) {
> @@ -992,6 +1004,9 @@ static void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *c
> 	if (!conn)
> 		return;
>
> +	if (chan->chan_type == L2CAP_CHAN_CONN_FIX_A2MP)
> +		return;
> +

There are places in the ERTM state machine that call 
l2cap_send_disconn_req() to tear down an unrecoverable ERTM 
connection.  If the connection remained up, I'm not sure how ERTM will 
behave.

I don't know that the spec is very clear about what to do 
when ERTM must disconnect the channel, but the channel is fixed.

I think it would be best to tell the owner of the channel (A2MP in 
this case) that the channel has been disconnected using the 
state_change l2cap op, even if no disconnect request is sent to the 
remote device.  This way a new A2MP fixed channel can be started up so 
there is some chance that the two sides of the A2MP ERTM connection 
can sync up again.


> 	if (chan->mode == L2CAP_MODE_ERTM) {
> 		__clear_retrans_timer(chan);
> 		__clear_monitor_timer(chan);
> @@ -1201,6 +1216,11 @@ static void l2cap_conn_ready(struct l2cap_conn *conn)
>
> 		l2cap_chan_lock(chan);
>
> +		if (chan->chan_type == L2CAP_CHAN_CONN_FIX_A2MP) {
> +			l2cap_chan_unlock(chan);
> +			continue;
> +		}
> +

This bypasses the socket code in that loop, but also means the state 
change is not sent to the AMP manager.  Is there a way to fix up the 
state change code in l2cap_ops so the socket code can be removed from 
l2cap_conn_ready and other socketless L2CAP channels will also work 
without special case code?

> 		if (conn->hcon->type == LE_LINK) {
> 			if (smp_conn_security(conn, chan->sec_level))
> 				l2cap_chan_ready(chan);
> @@ -1581,7 +1601,8 @@ static void l2cap_monitor_timeout(struct work_struct *work)
> 	l2cap_chan_lock(chan);
>
> 	if (chan->retry_count >= chan->remote_max_tx) {
> -		l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED);
> +		if (chan->chan_type != L2CAP_CHAN_CONN_FIX_A2MP)
> +			l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED);

The spec defines the MaxTransmit value as 0xff for the A2MP channel, 
not 0x00 (for infinite retries).  There is therefore an expectation 
that the ERTM connection will reset after too many retries - and I 
don't think it is ok to skip the disconnect here.

> 		l2cap_chan_unlock(chan);
> 		l2cap_chan_put(chan);
> 		return;
> -- 
> 1.7.9.5

Regards,

--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum


  reply	other threads:[~2012-05-21 22:28 UTC|newest]

Thread overview: 104+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-18 14:25 [PATCHv1 00/17] Bluetooth A2MP implementation Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 01/17] Bluetooth: A2MP: Create A2MP channel Andrei Emeltchenko
2012-05-22 17:45   ` Mat Martineau
2012-05-23  7:49     ` Andrei Emeltchenko
2012-05-23 15:44       ` Mat Martineau
2012-05-24  7:51         ` Andrei Emeltchenko
2012-05-24 15:59           ` Mat Martineau
2012-05-25  8:09             ` Andrei Emeltchenko
2012-05-25 17:18               ` Mat Martineau
2012-05-28  7:24                 ` Andrei Emeltchenko
2012-05-28 13:59                   ` Andrei Emeltchenko
2012-05-29 16:23                     ` Mat Martineau
2012-05-30 13:29                       ` Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 02/17] Bluetooth: A2MP: AMP Manager basic functions Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 03/17] Bluetooth: A2MP: Build and Send msg helpers Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 04/17] Bluetooth: A2MP: Add chan callbacks Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 05/17] Bluetooth: A2MP: Definitions for A2MP commands Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 06/17] Bluetooth: A2MP: Define A2MP status codes Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 07/17] Bluetooth: A2MP: Process A2MP messages Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 08/17] Bluetooth: A2MP: Process A2MP Command Reject Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 09/17] Bluetooth: A2MP: Process A2MP Discover Request Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 10/17] Bluetooth: A2MP: Process A2MP Change Notify Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 11/17] Bluetooth: A2MP: Process A2MP Get Info Request Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 12/17] Bluetooth: A2MP: Process A2MP Get AMP Assoc Request Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 13/17] Bluetooth: A2MP: Process A2MP Create Physlink Request Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 14/17] Bluetooth: A2MP: Process A2MP Disc " Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 15/17] Bluetooth: A2MP: Process A2MP Command Responses Andrei Emeltchenko
2012-05-18 14:25 ` [PATCHv1 16/17] Bluetooth: A2MP: Handling fixed channels Andrei Emeltchenko
2012-05-21 22:28   ` Mat Martineau [this message]
2012-05-22  8:12     ` Andrei Emeltchenko
2012-05-22 17:35       ` Mat Martineau
2012-05-18 14:25 ` [PATCHv1 17/17] Bluetooth: A2MP: Manage incoming connections Andrei Emeltchenko
2012-05-21 22:45   ` Mat Martineau
2012-05-22  7:37     ` Andrei Emeltchenko
2012-05-22 17:38       ` Mat Martineau
2012-05-18 20:57 ` [PATCHv1 00/17] Bluetooth A2MP implementation Gustavo Padovan
2012-05-23 15:37 ` [PATCHv2 00/19] " Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 01/19] Bluetooth: Add unlink to L2CAP channel ops Andrei Emeltchenko
2012-05-23 23:13     ` Mat Martineau
2012-05-23 15:37   ` [PATCHv2 02/19] Bluetooth: Add ready " Andrei Emeltchenko
2012-05-23 23:16     ` Mat Martineau
2012-05-24  7:59       ` Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 03/19] Bluetooth: A2MP: Create A2MP channel Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 04/19] Bluetooth: A2MP: AMP Manager basic functions Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 05/19] Bluetooth: A2MP: Build and Send msg helpers Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 06/19] Bluetooth: A2MP: Add chan callbacks Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 07/19] Bluetooth: A2MP: Definitions for A2MP commands Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 08/19] Bluetooth: A2MP: Define A2MP status codes Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 09/19] Bluetooth: A2MP: Process A2MP messages Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 10/19] Bluetooth: A2MP: Process A2MP Command Reject Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 11/19] Bluetooth: A2MP: Process A2MP Discover Request Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 12/19] Bluetooth: A2MP: Process A2MP Change Notify Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 13/19] Bluetooth: A2MP: Process A2MP Get Info Request Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 14/19] Bluetooth: A2MP: Process A2MP Get AMP Assoc Request Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 15/19] Bluetooth: A2MP: Process A2MP Create Physlink Request Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 16/19] Bluetooth: A2MP: Process A2MP Disc " Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 17/19] Bluetooth: A2MP: Process A2MP Command Responses Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 18/19] Bluetooth: A2MP: Handling fixed channels Andrei Emeltchenko
2012-05-23 15:37   ` [PATCHv2 19/19] Bluetooth: A2MP: Manage incoming connections Andrei Emeltchenko
2012-05-23 23:30     ` Mat Martineau
2012-05-24 11:43       ` Andrei Emeltchenko
2012-05-24 11:38 ` [PATCHv3 00/18] Bluetooth A2MP implementation Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 01/18] Bluetooth: Add ready to L2CAP channel ops Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 02/18] Bluetooth: A2MP: Create A2MP channel Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 03/18] Bluetooth: A2MP: AMP Manager basic functions Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 04/18] Bluetooth: A2MP: Build and Send msg helpers Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 05/18] Bluetooth: A2MP: Add chan callbacks Andrei Emeltchenko
2012-05-25 12:20     ` Gustavo Padovan
2012-05-25 13:08       ` Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 06/18] Bluetooth: A2MP: Definitions for A2MP commands Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 07/18] Bluetooth: A2MP: Define A2MP status codes Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 08/18] Bluetooth: A2MP: Process A2MP messages Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 09/18] Bluetooth: A2MP: Process A2MP Command Reject Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 10/18] Bluetooth: A2MP: Process A2MP Discover Request Andrei Emeltchenko
2012-05-25 12:19     ` Gustavo Padovan
2012-05-25 13:11       ` Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 11/18] Bluetooth: A2MP: Process A2MP Change Notify Andrei Emeltchenko
2012-05-25 12:29     ` Gustavo Padovan
2012-05-24 11:38   ` [PATCHv3 12/18] Bluetooth: A2MP: Process A2MP Get Info Request Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 13/18] Bluetooth: A2MP: Process A2MP Get AMP Assoc Request Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 14/18] Bluetooth: A2MP: Process A2MP Create Physlink Request Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 15/18] Bluetooth: A2MP: Process A2MP Disc " Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 16/18] Bluetooth: A2MP: Process A2MP Command Responses Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 17/18] Bluetooth: A2MP: Handling fixed channels Andrei Emeltchenko
2012-05-24 11:38   ` [PATCHv3 18/18] Bluetooth: A2MP: Manage incoming connections Andrei Emeltchenko
2012-05-29 10:59 ` [PATCHv4 00/17] Bluetooth A2MP implementation Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 01/17] Bluetooth: A2MP: Create A2MP channel Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 02/17] Bluetooth: A2MP: AMP Manager basic functions Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 03/17] Bluetooth: A2MP: Build and Send msg helpers Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 04/17] Bluetooth: A2MP: Add chan callbacks Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 05/17] Bluetooth: A2MP: Definitions for A2MP commands Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 06/17] Bluetooth: A2MP: Define A2MP status codes Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 07/17] Bluetooth: A2MP: Process A2MP messages Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 08/17] Bluetooth: A2MP: Process A2MP Command Reject Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 09/17] Bluetooth: A2MP: Process A2MP Discover Request Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 10/17] Bluetooth: A2MP: Process A2MP Change Notify Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 11/17] Bluetooth: A2MP: Process A2MP Get Info Request Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 12/17] Bluetooth: A2MP: Process A2MP Get AMP Assoc Request Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 13/17] Bluetooth: A2MP: Process A2MP Create Physlink Request Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 14/17] Bluetooth: A2MP: Process A2MP Disc " Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 15/17] Bluetooth: A2MP: Process A2MP Command Responses Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 16/17] Bluetooth: A2MP: Handling fixed channels Andrei Emeltchenko
2012-05-29 10:59   ` [PATCHv4 17/17] Bluetooth: A2MP: Manage incoming connections Andrei Emeltchenko
2012-05-29 15:52     ` Gustavo Padovan

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=alpine.DEB.2.02.1205211438590.2239@mathewm-linux \
    --to=mathewm@codeaurora.org \
    --cc=Andrei.Emeltchenko.news@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=pkrystad@codeaurora.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