diff mbox series

[RFC,BlueZ,2/2] main.conf: Add option to configure AVDP session/stream channel modes

Message ID 20201116233910.4128702-2-luiz.dentz@gmail.com
State New
Headers show
Series [RFC,BlueZ,1/2] avdtp: Fix connecting using streaming mode with signalling channel | expand

Commit Message

Luiz Augusto von Dentz Nov. 16, 2020, 11:39 p.m. UTC
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds a new group AVDTP where platform can confure the prefered
modes L2CAP channel for both session (signalling) and stream
(transport). For better backward compatibility the default modes of
boths
---
 profiles/audio/a2dp.c  |  5 +----
 profiles/audio/avdtp.c | 14 ++-----------
 src/btd.h              |  7 +++++++
 src/main.c             | 45 ++++++++++++++++++++++++++++++++++++++++++
 src/main.conf          | 13 ++++++++++++
 5 files changed, 68 insertions(+), 16 deletions(-)

Comments

Alain Michaud Nov. 17, 2020, 2:43 p.m. UTC | #1
On Mon, Nov 16, 2020 at 7:26 PM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> This adds a new group AVDTP where platform can confure the prefered
> modes L2CAP channel for both session (signalling) and stream
> (transport). For better backward compatibility the default modes of
> boths

Reviewed-by: Alain Michaud <alainm@chromium.org>
Tested-by: Alain Michaud <alainm@chromium.org>

> ---
>  profiles/audio/a2dp.c  |  5 +----
>  profiles/audio/avdtp.c | 14 ++-----------
>  src/btd.h              |  7 +++++++
>  src/main.c             | 45 ++++++++++++++++++++++++++++++++++++++++++
>  src/main.conf          | 13 ++++++++++++
>  5 files changed, 68 insertions(+), 16 deletions(-)
>
> diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
> index 626f61d34..59d11a0aa 100644
> --- a/profiles/audio/a2dp.c
> +++ b/profiles/audio/a2dp.c
> @@ -2324,10 +2324,7 @@ static bool a2dp_server_listen(struct a2dp_server *server)
>         if (server->io)
>                 return true;
>
> -       if (btd_opts.mps == MPS_OFF)
> -               mode = BT_IO_MODE_BASIC;
> -       else
> -               mode = BT_IO_MODE_STREAMING;
> +       mode = btd_opts.avdtp.session_mode;
>
>         server->io = bt_io_listen(NULL, confirm_cb, server, NULL, &err,
>                                 BT_IO_OPT_SOURCE_BDADDR,
> diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c
> index 619b94e29..ff0a124c3 100644
> --- a/profiles/audio/avdtp.c
> +++ b/profiles/audio/avdtp.c
> @@ -2603,12 +2603,7 @@ static int send_req(struct avdtp *session, gboolean priority,
>         int err, timeout;
>
>         if (session->state == AVDTP_SESSION_STATE_DISCONNECTED) {
> -               BtIOMode mode;
> -
> -               if (btd_opts.mps == MPS_OFF)
> -                       mode = BT_IO_MODE_BASIC;
> -               else
> -                       mode = BT_IO_MODE_ERTM;
> +               BtIOMode mode = btd_opts.avdtp.session_mode;
>
>                 session->io = l2cap_connect(session, mode);
>                 if (!session->io) {
> @@ -2807,12 +2802,7 @@ static gboolean avdtp_open_resp(struct avdtp *session, struct avdtp_stream *stre
>                                 struct seid_rej *resp, int size)
>  {
>         struct avdtp_local_sep *sep = stream->lsep;
> -       BtIOMode mode;
> -
> -       if (btd_opts.mps == MPS_OFF)
> -               mode = BT_IO_MODE_BASIC;
> -       else
> -               mode = BT_IO_MODE_STREAMING;
> +       BtIOMode mode = btd_opts.avdtp.stream_mode;
>
>         stream->io = l2cap_connect(session, mode);
>         if (!stream->io) {
> diff --git a/src/btd.h b/src/btd.h
> index c98414e35..a3247e4fd 100644
> --- a/src/btd.h
> +++ b/src/btd.h
> @@ -84,6 +84,11 @@ struct btd_defaults {
>         struct btd_le_defaults le;
>  };
>
> +struct btd_avdtp_opts {
> +       uint8_t  session_mode;
> +       uint8_t  stream_mode;
> +};
> +
>  struct btd_opts {
>         char            *name;
>         uint32_t        class;
> @@ -112,6 +117,8 @@ struct btd_opts {
>         uint8_t         gatt_channels;
>         enum mps_mode_t mps;
>
> +       struct btd_avdtp_opts avdtp;
> +
>         uint8_t         key_size;
>
>         enum jw_repairing_t jw_repairing;
> diff --git a/src/main.c b/src/main.c
> index e6c4d861e..33c0f0d15 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -34,6 +34,7 @@
>  #include "lib/sdp.h"
>
>  #include "gdbus/gdbus.h"
> +#include "btio/btio.h"
>
>  #include "log.h"
>  #include "backtrace.h"
> @@ -137,6 +138,12 @@ static const char *gatt_options[] = {
>         NULL
>  };
>
> +static const char *avdtp_options[] = {
> +       "SessionMode",
> +       "StreamMode",
> +       NULL
> +};
> +
>  static const struct group_table {
>         const char *name;
>         const char **options;
> @@ -146,6 +153,7 @@ static const struct group_table {
>         { "LE",         le_options },
>         { "Policy",     policy_options },
>         { "GATT",       gatt_options },
> +       { "AVDTP",      avdtp_options },
>         { }
>  };
>
> @@ -744,6 +752,40 @@ static void parse_config(GKeyFile *config)
>                 btd_opts.gatt_channels = val;
>         }
>
> +       str = g_key_file_get_string(config, "AVDTP", "SessionMode", &err);
> +       if (err) {
> +               DBG("%s", err->message);
> +               g_clear_error(&err);
> +       } else {
> +               DBG("SessionMode=%s", str);
> +
> +               if (!strcmp(str, "basic"))
> +                       btd_opts.avdtp.session_mode = BT_IO_MODE_BASIC;
> +               else if (!strcmp(str, "ertm"))
> +                       btd_opts.avdtp.session_mode = BT_IO_MODE_ERTM;
> +               else {
> +                       DBG("Invalid mode option: %s", str);
> +                       btd_opts.avdtp.session_mode = BT_IO_MODE_BASIC;
> +               }
> +       }
> +
> +       val = g_key_file_get_integer(config, "AVDTP", "StreamMode", &err);
> +       if (err) {
> +               DBG("%s", err->message);
> +               g_clear_error(&err);
> +       } else {
> +               DBG("StreamMode=%s", str);
> +
> +               if (!strcmp(str, "basic"))
> +                       btd_opts.avdtp.stream_mode = BT_IO_MODE_BASIC;
> +               else if (!strcmp(str, "streaming"))
> +                       btd_opts.avdtp.stream_mode = BT_IO_MODE_STREAMING;
> +               else {
> +                       DBG("Invalid mode option: %s", str);
> +                       btd_opts.avdtp.stream_mode = BT_IO_MODE_BASIC;
> +               }
> +       }
> +
>         parse_br_config(config);
>         parse_le_config(config);
>  }
> @@ -780,6 +822,9 @@ static void init_defaults(void)
>         btd_opts.gatt_cache = BT_GATT_CACHE_ALWAYS;
>         btd_opts.gatt_mtu = BT_ATT_MAX_LE_MTU;
>         btd_opts.gatt_channels = 3;
> +
> +       btd_opts.avdtp.session_mode = BT_IO_MODE_BASIC;
> +       btd_opts.avdtp.stream_mode = BT_IO_MODE_BASIC;
>  }
>
>  static void log_handler(const gchar *log_domain, GLogLevelFlags log_level,
> diff --git a/src/main.conf b/src/main.conf
> index 54f6a36bd..d3bc61441 100644
> --- a/src/main.conf
> +++ b/src/main.conf
> @@ -200,6 +200,19 @@
>  # Default to 3
>  #Channels = 3
>
> +[AVDTP]
> +# AVDTP L2CAP Signalling Channel Mode.
> +# Possible values:
> +# basic: Use L2CAP Basic Mode
> +# ertm: Use L2CAP Enhanced Retransmission Mode
> +#SessionMode = basic
> +
> +# AVDTP L2CAP Transport Channel Mode.
> +# Possible values:
> +# basic: Use L2CAP Basic Mode
> +# streaming: Use L2CAP Streaming Mode
> +#StreamMode = basic
> +
>  [Policy]
>  #
>  # The ReconnectUUIDs defines the set of remote services that should try
> --
> 2.26.2
>
diff mbox series

Patch

diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
index 626f61d34..59d11a0aa 100644
--- a/profiles/audio/a2dp.c
+++ b/profiles/audio/a2dp.c
@@ -2324,10 +2324,7 @@  static bool a2dp_server_listen(struct a2dp_server *server)
 	if (server->io)
 		return true;
 
-	if (btd_opts.mps == MPS_OFF)
-		mode = BT_IO_MODE_BASIC;
-	else
-		mode = BT_IO_MODE_STREAMING;
+	mode = btd_opts.avdtp.session_mode;
 
 	server->io = bt_io_listen(NULL, confirm_cb, server, NULL, &err,
 				BT_IO_OPT_SOURCE_BDADDR,
diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c
index 619b94e29..ff0a124c3 100644
--- a/profiles/audio/avdtp.c
+++ b/profiles/audio/avdtp.c
@@ -2603,12 +2603,7 @@  static int send_req(struct avdtp *session, gboolean priority,
 	int err, timeout;
 
 	if (session->state == AVDTP_SESSION_STATE_DISCONNECTED) {
-		BtIOMode mode;
-
-		if (btd_opts.mps == MPS_OFF)
-			mode = BT_IO_MODE_BASIC;
-		else
-			mode = BT_IO_MODE_ERTM;
+		BtIOMode mode = btd_opts.avdtp.session_mode;
 
 		session->io = l2cap_connect(session, mode);
 		if (!session->io) {
@@ -2807,12 +2802,7 @@  static gboolean avdtp_open_resp(struct avdtp *session, struct avdtp_stream *stre
 				struct seid_rej *resp, int size)
 {
 	struct avdtp_local_sep *sep = stream->lsep;
-	BtIOMode mode;
-
-	if (btd_opts.mps == MPS_OFF)
-		mode = BT_IO_MODE_BASIC;
-	else
-		mode = BT_IO_MODE_STREAMING;
+	BtIOMode mode = btd_opts.avdtp.stream_mode;
 
 	stream->io = l2cap_connect(session, mode);
 	if (!stream->io) {
diff --git a/src/btd.h b/src/btd.h
index c98414e35..a3247e4fd 100644
--- a/src/btd.h
+++ b/src/btd.h
@@ -84,6 +84,11 @@  struct btd_defaults {
 	struct btd_le_defaults le;
 };
 
+struct btd_avdtp_opts {
+	uint8_t  session_mode;
+	uint8_t  stream_mode;
+};
+
 struct btd_opts {
 	char		*name;
 	uint32_t	class;
@@ -112,6 +117,8 @@  struct btd_opts {
 	uint8_t		gatt_channels;
 	enum mps_mode_t	mps;
 
+	struct btd_avdtp_opts avdtp;
+
 	uint8_t		key_size;
 
 	enum jw_repairing_t jw_repairing;
diff --git a/src/main.c b/src/main.c
index e6c4d861e..33c0f0d15 100644
--- a/src/main.c
+++ b/src/main.c
@@ -34,6 +34,7 @@ 
 #include "lib/sdp.h"
 
 #include "gdbus/gdbus.h"
+#include "btio/btio.h"
 
 #include "log.h"
 #include "backtrace.h"
@@ -137,6 +138,12 @@  static const char *gatt_options[] = {
 	NULL
 };
 
+static const char *avdtp_options[] = {
+	"SessionMode",
+	"StreamMode",
+	NULL
+};
+
 static const struct group_table {
 	const char *name;
 	const char **options;
@@ -146,6 +153,7 @@  static const struct group_table {
 	{ "LE",		le_options },
 	{ "Policy",	policy_options },
 	{ "GATT",	gatt_options },
+	{ "AVDTP",	avdtp_options },
 	{ }
 };
 
@@ -744,6 +752,40 @@  static void parse_config(GKeyFile *config)
 		btd_opts.gatt_channels = val;
 	}
 
+	str = g_key_file_get_string(config, "AVDTP", "SessionMode", &err);
+	if (err) {
+		DBG("%s", err->message);
+		g_clear_error(&err);
+	} else {
+		DBG("SessionMode=%s", str);
+
+		if (!strcmp(str, "basic"))
+			btd_opts.avdtp.session_mode = BT_IO_MODE_BASIC;
+		else if (!strcmp(str, "ertm"))
+			btd_opts.avdtp.session_mode = BT_IO_MODE_ERTM;
+		else {
+			DBG("Invalid mode option: %s", str);
+			btd_opts.avdtp.session_mode = BT_IO_MODE_BASIC;
+		}
+	}
+
+	val = g_key_file_get_integer(config, "AVDTP", "StreamMode", &err);
+	if (err) {
+		DBG("%s", err->message);
+		g_clear_error(&err);
+	} else {
+		DBG("StreamMode=%s", str);
+
+		if (!strcmp(str, "basic"))
+			btd_opts.avdtp.stream_mode = BT_IO_MODE_BASIC;
+		else if (!strcmp(str, "streaming"))
+			btd_opts.avdtp.stream_mode = BT_IO_MODE_STREAMING;
+		else {
+			DBG("Invalid mode option: %s", str);
+			btd_opts.avdtp.stream_mode = BT_IO_MODE_BASIC;
+		}
+	}
+
 	parse_br_config(config);
 	parse_le_config(config);
 }
@@ -780,6 +822,9 @@  static void init_defaults(void)
 	btd_opts.gatt_cache = BT_GATT_CACHE_ALWAYS;
 	btd_opts.gatt_mtu = BT_ATT_MAX_LE_MTU;
 	btd_opts.gatt_channels = 3;
+
+	btd_opts.avdtp.session_mode = BT_IO_MODE_BASIC;
+	btd_opts.avdtp.stream_mode = BT_IO_MODE_BASIC;
 }
 
 static void log_handler(const gchar *log_domain, GLogLevelFlags log_level,
diff --git a/src/main.conf b/src/main.conf
index 54f6a36bd..d3bc61441 100644
--- a/src/main.conf
+++ b/src/main.conf
@@ -200,6 +200,19 @@ 
 # Default to 3
 #Channels = 3
 
+[AVDTP]
+# AVDTP L2CAP Signalling Channel Mode.
+# Possible values:
+# basic: Use L2CAP Basic Mode
+# ertm: Use L2CAP Enhanced Retransmission Mode
+#SessionMode = basic
+
+# AVDTP L2CAP Transport Channel Mode.
+# Possible values:
+# basic: Use L2CAP Basic Mode
+# streaming: Use L2CAP Streaming Mode
+#StreamMode = basic
+
 [Policy]
 #
 # The ReconnectUUIDs defines the set of remote services that should try