* [PATCH BlueZ 1/3] audio/avdtp: Only set disconnect timer if connected
@ 2016-03-23 12:55 Luiz Augusto von Dentz
2016-03-23 12:55 ` [PATCH BlueZ 2/3] audio/avdtp: Fix passing wrong error code Luiz Augusto von Dentz
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Luiz Augusto von Dentz @ 2016-03-23 12:55 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
If the session is not connected it makes no sense to enable the
disconnect timer.
---
profiles/audio/avdtp.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c
index 52ee767..78e7b4d 100644
--- a/profiles/audio/avdtp.c
+++ b/profiles/audio/avdtp.c
@@ -1171,7 +1171,12 @@ void avdtp_unref(struct avdtp *session)
if (session->ref > 0)
return;
- set_disconnect_timer(session);
+ if (session->state == AVDTP_SESSION_STATE_CONNECTED) {
+ set_disconnect_timer(session);
+ return;
+ }
+
+ connection_lost(session, ECONNABORTED);
}
struct avdtp *avdtp_ref(struct avdtp *session)
--
2.5.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH BlueZ 2/3] audio/avdtp: Fix passing wrong error code
2016-03-23 12:55 [PATCH BlueZ 1/3] audio/avdtp: Only set disconnect timer if connected Luiz Augusto von Dentz
@ 2016-03-23 12:55 ` Luiz Augusto von Dentz
2016-03-23 12:55 ` [PATCH BlueZ 3/3] audio/a2dp: Simplify error handling Luiz Augusto von Dentz
2016-03-24 13:52 ` [PATCH BlueZ 1/3] audio/avdtp: Only set disconnect timer if connected Luiz Augusto von Dentz
2 siblings, 0 replies; 4+ messages in thread
From: Luiz Augusto von Dentz @ 2016-03-23 12:55 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
finalize_discovery actually expect positive codes since it passes to
avdtp_error_init.
---
profiles/audio/avdtp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c
index 78e7b4d..4f663d4 100644
--- a/profiles/audio/avdtp.c
+++ b/profiles/audio/avdtp.c
@@ -3481,7 +3481,7 @@ int avdtp_abort(struct avdtp *session, struct avdtp_stream *stream)
if (!stream && session->discover) {
/* Don't call cb since it being aborted */
session->discover->cb = NULL;
- finalize_discovery(session, -ECANCELED);
+ finalize_discovery(session, ECANCELED);
return -EALREADY;
}
--
2.5.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH BlueZ 3/3] audio/a2dp: Simplify error handling
2016-03-23 12:55 [PATCH BlueZ 1/3] audio/avdtp: Only set disconnect timer if connected Luiz Augusto von Dentz
2016-03-23 12:55 ` [PATCH BlueZ 2/3] audio/avdtp: Fix passing wrong error code Luiz Augusto von Dentz
@ 2016-03-23 12:55 ` Luiz Augusto von Dentz
2016-03-24 13:52 ` [PATCH BlueZ 1/3] audio/avdtp: Only set disconnect timer if connected Luiz Augusto von Dentz
2 siblings, 0 replies; 4+ messages in thread
From: Luiz Augusto von Dentz @ 2016-03-23 12:55 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Don't expose avdtp_error in a2dp.h instead handle it internally
converting to posix error whenever necessary.
---
profiles/audio/a2dp.c | 36 +++++++++++++++++++++++++++++++-----
profiles/audio/a2dp.h | 9 +++------
profiles/audio/sink.c | 28 ++++++++--------------------
profiles/audio/source.c | 32 ++++++++++----------------------
profiles/audio/transport.c | 8 ++++----
5 files changed, 56 insertions(+), 57 deletions(-)
diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
index b0fea7c..b391fc2 100644
--- a/profiles/audio/a2dp.c
+++ b/profiles/audio/a2dp.c
@@ -225,6 +225,29 @@ static void finalize_setup_errno(struct a2dp_setup *s, int err,
va_end(args);
}
+static int error_to_errno(struct avdtp_error *err)
+{
+ int perr;
+
+ if (!err)
+ return 0;
+
+ if (avdtp_error_category(err) != AVDTP_ERRNO)
+ return -EIO;
+
+ perr = -avdtp_error_posix_errno(err);
+ switch (-perr) {
+ case -EHOSTDOWN:
+ case -ECONNABORTED:
+ return perr;
+ default:
+ /*
+ * An unexpect error has occurred setup may be attempted again.
+ */
+ return -EAGAIN;
+ }
+}
+
static gboolean finalize_config(gpointer data)
{
struct a2dp_setup *s = data;
@@ -239,8 +262,8 @@ static gboolean finalize_config(gpointer data)
if (!cb->config_cb)
continue;
- cb->config_cb(s->session, s->sep, stream, s->err,
- cb->user_data);
+ cb->config_cb(s->session, s->sep, stream,
+ error_to_errno(s->err), cb->user_data);
setup_cb_free(cb);
}
@@ -260,7 +283,8 @@ static gboolean finalize_resume(gpointer data)
if (!cb->resume_cb)
continue;
- cb->resume_cb(s->session, s->err, cb->user_data);
+ cb->resume_cb(s->session, error_to_errno(s->err),
+ cb->user_data);
setup_cb_free(cb);
}
@@ -280,7 +304,8 @@ static gboolean finalize_suspend(gpointer data)
if (!cb->suspend_cb)
continue;
- cb->suspend_cb(s->session, s->err, cb->user_data);
+ cb->suspend_cb(s->session, error_to_errno(s->err),
+ cb->user_data);
setup_cb_free(cb);
}
@@ -316,7 +341,8 @@ static void finalize_discover(struct a2dp_setup *s)
if (!cb->discover_cb)
continue;
- cb->discover_cb(s->session, s->seps, s->err, cb->user_data);
+ cb->discover_cb(s->session, s->seps, error_to_errno(s->err),
+ cb->user_data);
setup_cb_free(cb);
}
}
diff --git a/profiles/audio/a2dp.h b/profiles/audio/a2dp.h
index 19d1877..2c388bb 100644
--- a/profiles/audio/a2dp.h
+++ b/profiles/audio/a2dp.h
@@ -53,17 +53,14 @@ struct a2dp_endpoint {
};
typedef void (*a2dp_discover_cb_t) (struct avdtp *session, GSList *seps,
- struct avdtp_error *err,
- void *user_data);
+ int err, void *user_data);
typedef void (*a2dp_select_cb_t) (struct avdtp *session,
struct a2dp_sep *sep, GSList *caps,
void *user_data);
typedef void (*a2dp_config_cb_t) (struct avdtp *session, struct a2dp_sep *sep,
- struct avdtp_stream *stream,
- struct avdtp_error *err,
+ struct avdtp_stream *stream, int err,
void *user_data);
-typedef void (*a2dp_stream_cb_t) (struct avdtp *session,
- struct avdtp_error *err,
+typedef void (*a2dp_stream_cb_t) (struct avdtp *session, int err,
void *user_data);
struct a2dp_sep *a2dp_add_sep(struct btd_adapter *adapter, uint8_t type,
diff --git a/profiles/audio/sink.c b/profiles/audio/sink.c
index ac7237b..3167b3a 100644
--- a/profiles/audio/sink.c
+++ b/profiles/audio/sink.c
@@ -180,8 +180,8 @@ static void stream_state_changed(struct avdtp_stream *stream,
}
static void stream_setup_complete(struct avdtp *session, struct a2dp_sep *sep,
- struct avdtp_stream *stream,
- struct avdtp_error *err, void *user_data)
+ struct avdtp_stream *stream, int err,
+ void *user_data)
{
struct sink *sink = user_data;
@@ -192,11 +192,7 @@ static void stream_setup_complete(struct avdtp *session, struct a2dp_sep *sep,
avdtp_unref(sink->session);
sink->session = NULL;
- if (avdtp_error_category(err) == AVDTP_ERRNO
- && avdtp_error_posix_errno(err) != EHOSTDOWN)
- btd_service_connecting_complete(sink->service, -EAGAIN);
- else
- btd_service_connecting_complete(sink->service, -EIO);
+ btd_service_connecting_complete(sink->service, err);
}
static void select_complete(struct avdtp *session, struct a2dp_sep *sep,
@@ -221,25 +217,17 @@ failed:
sink->session = NULL;
}
-static void discovery_complete(struct avdtp *session, GSList *seps, struct avdtp_error *err,
- void *user_data)
+static void discovery_complete(struct avdtp *session, GSList *seps, int err,
+ void *user_data)
{
struct sink *sink = user_data;
- int id, perr;
+ int id;
sink->connect_id = 0;
if (err) {
avdtp_unref(sink->session);
sink->session = NULL;
-
- perr = -avdtp_error_posix_errno(err);
- if (perr != -EHOSTDOWN) {
- if (avdtp_error_category(err) == AVDTP_ERRNO)
- perr = -EAGAIN;
- else
- perr = -EIO;
- }
goto failed;
}
@@ -248,7 +236,7 @@ static void discovery_complete(struct avdtp *session, GSList *seps, struct avdtp
id = a2dp_select_capabilities(sink->session, AVDTP_SEP_TYPE_SINK, NULL,
select_complete, sink);
if (id == 0) {
- perr = -EIO;
+ err = -EIO;
goto failed;
}
@@ -256,7 +244,7 @@ static void discovery_complete(struct avdtp *session, GSList *seps, struct avdtp
return;
failed:
- btd_service_connecting_complete(sink->service, perr);
+ btd_service_connecting_complete(sink->service, err);
avdtp_unref(sink->session);
sink->session = NULL;
}
diff --git a/profiles/audio/source.c b/profiles/audio/source.c
index 372b132..493524e 100644
--- a/profiles/audio/source.c
+++ b/profiles/audio/source.c
@@ -177,8 +177,8 @@ static void stream_state_changed(struct avdtp_stream *stream,
}
static void stream_setup_complete(struct avdtp *session, struct a2dp_sep *sep,
- struct avdtp_stream *stream,
- struct avdtp_error *err, void *user_data)
+ struct avdtp_stream *stream, int err,
+ void *user_data)
{
struct source *source = user_data;
@@ -189,11 +189,7 @@ static void stream_setup_complete(struct avdtp *session, struct a2dp_sep *sep,
avdtp_unref(source->session);
source->session = NULL;
- if (avdtp_error_category(err) == AVDTP_ERRNO
- && avdtp_error_posix_errno(err) != EHOSTDOWN)
- btd_service_connecting_complete(source->service, -EAGAIN);
- else
- btd_service_connecting_complete(source->service, -EIO);
+ btd_service_connecting_complete(source->service, err);
}
static void select_complete(struct avdtp *session, struct a2dp_sep *sep,
@@ -221,34 +217,26 @@ failed:
source->session = NULL;
}
-static void discovery_complete(struct avdtp *session, GSList *seps, struct avdtp_error *err,
- void *user_data)
+static void discovery_complete(struct avdtp *session, GSList *seps, int err,
+ void *user_data)
{
struct source *source = user_data;
- int id, perr;
+ int id;
source->connect_id = 0;
if (err) {
avdtp_unref(source->session);
source->session = NULL;
-
- perr = -avdtp_error_posix_errno(err);
- if (perr != -EHOSTDOWN) {
- if (avdtp_error_category(err) == AVDTP_ERRNO)
- perr = -EAGAIN;
- else
- perr = -EIO;
- }
goto failed;
}
DBG("Discovery complete");
- id = a2dp_select_capabilities(source->session, AVDTP_SEP_TYPE_SOURCE, NULL,
- select_complete, source);
+ id = a2dp_select_capabilities(source->session, AVDTP_SEP_TYPE_SOURCE,
+ NULL, select_complete, source);
if (id == 0) {
- perr = -EIO;
+ err = -EIO;
goto failed;
}
@@ -256,7 +244,7 @@ static void discovery_complete(struct avdtp *session, GSList *seps, struct avdtp
return;
failed:
- btd_service_connecting_complete(source->service, perr);
+ btd_service_connecting_complete(source->service, err);
avdtp_unref(source->session);
source->session = NULL;
}
diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
index 4121e52..b9d357e 100644
--- a/profiles/audio/transport.c
+++ b/profiles/audio/transport.c
@@ -283,8 +283,8 @@ static gboolean media_transport_set_fd(struct media_transport *transport,
return TRUE;
}
-static void a2dp_resume_complete(struct avdtp *session,
- struct avdtp_error *err, void *user_data)
+static void a2dp_resume_complete(struct avdtp *session, int err,
+ void *user_data)
{
struct media_owner *owner = user_data;
struct media_request *req = owner->pending;
@@ -362,8 +362,8 @@ static guint resume_a2dp(struct media_transport *transport,
return id;
}
-static void a2dp_suspend_complete(struct avdtp *session,
- struct avdtp_error *err, void *user_data)
+static void a2dp_suspend_complete(struct avdtp *session, int err,
+ void *user_data)
{
struct media_owner *owner = user_data;
struct media_transport *transport = owner->transport;
--
2.5.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH BlueZ 1/3] audio/avdtp: Only set disconnect timer if connected
2016-03-23 12:55 [PATCH BlueZ 1/3] audio/avdtp: Only set disconnect timer if connected Luiz Augusto von Dentz
2016-03-23 12:55 ` [PATCH BlueZ 2/3] audio/avdtp: Fix passing wrong error code Luiz Augusto von Dentz
2016-03-23 12:55 ` [PATCH BlueZ 3/3] audio/a2dp: Simplify error handling Luiz Augusto von Dentz
@ 2016-03-24 13:52 ` Luiz Augusto von Dentz
2 siblings, 0 replies; 4+ messages in thread
From: Luiz Augusto von Dentz @ 2016-03-24 13:52 UTC (permalink / raw)
To: linux-bluetooth@vger.kernel.org
Hi,
On Wed, Mar 23, 2016 at 2:55 PM, Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> If the session is not connected it makes no sense to enable the
> disconnect timer.
> ---
> profiles/audio/avdtp.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c
> index 52ee767..78e7b4d 100644
> --- a/profiles/audio/avdtp.c
> +++ b/profiles/audio/avdtp.c
> @@ -1171,7 +1171,12 @@ void avdtp_unref(struct avdtp *session)
> if (session->ref > 0)
> return;
>
> - set_disconnect_timer(session);
> + if (session->state == AVDTP_SESSION_STATE_CONNECTED) {
> + set_disconnect_timer(session);
> + return;
> + }
> +
> + connection_lost(session, ECONNABORTED);
> }
>
> struct avdtp *avdtp_ref(struct avdtp *session)
> --
> 2.5.0
Applied.
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-03-24 13:52 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-23 12:55 [PATCH BlueZ 1/3] audio/avdtp: Only set disconnect timer if connected Luiz Augusto von Dentz
2016-03-23 12:55 ` [PATCH BlueZ 2/3] audio/avdtp: Fix passing wrong error code Luiz Augusto von Dentz
2016-03-23 12:55 ` [PATCH BlueZ 3/3] audio/a2dp: Simplify error handling Luiz Augusto von Dentz
2016-03-24 13:52 ` [PATCH BlueZ 1/3] audio/avdtp: Only set disconnect timer if connected Luiz Augusto von Dentz
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).