linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH BlueZ] a2dp: Use streaming mode when MPS is enabled
@ 2020-06-08 20:26 Luiz Augusto von Dentz
  2020-06-10 20:24 ` Luiz Augusto von Dentz
  0 siblings, 1 reply; 2+ messages in thread
From: Luiz Augusto von Dentz @ 2020-06-08 20:26 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

If MPS is enabled use L2CAP streaming mode for AVDTP channels.
---
 profiles/audio/a2dp.c  |  8 ++++++++
 profiles/audio/avdtp.c |  9 +++++++++
 src/hcid.h             |  7 +++++++
 src/main.c             | 16 ++++++----------
 4 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
index 0a66589b0..f00e5c923 100644
--- a/profiles/audio/a2dp.c
+++ b/profiles/audio/a2dp.c
@@ -43,6 +43,7 @@
 
 #include "gdbus/gdbus.h"
 
+#include "src/hcid.h"
 #include "src/plugin.h"
 #include "src/adapter.h"
 #include "src/device.h"
@@ -2331,14 +2332,21 @@ drop:
 static bool a2dp_server_listen(struct a2dp_server *server)
 {
 	GError *err = NULL;
+	BtIOMode mode;
 
 	if (server->io)
 		return true;
 
+	if (main_opts.mps == MPS_OFF)
+		mode = BT_IO_MODE_BASIC;
+	else
+		mode = BT_IO_MODE_STREAMING;
+
 	server->io = bt_io_listen(NULL, confirm_cb, server, NULL, &err,
 				BT_IO_OPT_SOURCE_BDADDR,
 				btd_adapter_get_address(server->adapter),
 				BT_IO_OPT_PSM, AVDTP_PSM,
+				BT_IO_OPT_MODE, mode,
 				BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
 				BT_IO_OPT_MASTER, true,
 				BT_IO_OPT_INVALID);
diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c
index 45727f01e..e5193f79b 100644
--- a/profiles/audio/avdtp.c
+++ b/profiles/audio/avdtp.c
@@ -42,6 +42,7 @@
 #include "lib/uuid.h"
 
 #include "btio/btio.h"
+#include "src/hcid.h"
 #include "src/log.h"
 #include "src/shared/util.h"
 #include "src/shared/queue.h"
@@ -2406,9 +2407,15 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
 	GError *err = NULL;
 	GIOChannel *io;
 	const bdaddr_t *src;
+	BtIOMode mode;
 
 	src = btd_adapter_get_address(device_get_adapter(session->device));
 
+	if (main_opts.mps == MPS_OFF)
+		mode = BT_IO_MODE_BASIC;
+	else
+		mode = BT_IO_MODE_STREAMING;
+
 	if (session->phy)
 		io = bt_io_connect(avdtp_connect_cb, session,
 					NULL, &err,
@@ -2416,6 +2423,7 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
 					BT_IO_OPT_DEST_BDADDR,
 					device_get_address(session->device),
 					BT_IO_OPT_PSM, AVDTP_PSM,
+					BT_IO_OPT_MODE, mode,
 					BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
 					/* Set Input MTU to 0 to auto-tune */
 					BT_IO_OPT_IMTU, 0,
@@ -2427,6 +2435,7 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
 					BT_IO_OPT_DEST_BDADDR,
 					device_get_address(session->device),
 					BT_IO_OPT_PSM, AVDTP_PSM,
+					BT_IO_OPT_MODE, mode,
 					BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
 					BT_IO_OPT_INVALID);
 	if (!io) {
diff --git a/src/hcid.h b/src/hcid.h
index 56e2b4f31..1b2714b1d 100644
--- a/src/hcid.h
+++ b/src/hcid.h
@@ -41,6 +41,12 @@ enum jw_repairing_t {
 	JW_REPAIRING_ALWAYS,
 };
 
+enum mps_mode_t {
+	MPS_OFF,
+	MPS_SINGLE,
+	MPS_MULTIPLE,
+};
+
 struct main_opts {
 	char		*name;
 	uint32_t	class;
@@ -102,6 +108,7 @@ struct main_opts {
 	bt_gatt_cache_t gatt_cache;
 	uint16_t	gatt_mtu;
 	uint8_t		gatt_channels;
+	enum mps_mode_t	mps;
 
 	uint8_t		key_size;
 
diff --git a/src/main.c b/src/main.c
index 50e37e57a..e51f614b3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -74,12 +74,6 @@ struct main_opts main_opts;
 static GKeyFile *main_conf;
 static char *main_conf_file_path;
 
-static enum {
-	MPS_OFF,
-	MPS_SINGLE,
-	MPS_MULTIPLE,
-} mps = MPS_OFF;
-
 static const char *supported_options[] = {
 	"Name",
 	"Class",
@@ -583,9 +577,11 @@ static void parse_config(GKeyFile *config)
 		DBG("MultiProfile=%s", str);
 
 		if (!strcmp(str, "single"))
-			mps = MPS_SINGLE;
+			main_opts.mps = MPS_SINGLE;
 		else if (!strcmp(str, "multiple"))
-			mps = MPS_MULTIPLE;
+			main_opts.mps = MPS_MULTIPLE;
+		else
+			main_opts.mps = MPS_OFF;
 
 		g_free(str);
 	}
@@ -910,8 +906,8 @@ int main(int argc, char *argv[])
 						main_opts.did_version);
 	}
 
-	if (mps != MPS_OFF)
-		register_mps(mps == MPS_MULTIPLE);
+	if (main_opts.mps != MPS_OFF)
+		register_mps(main_opts.mps == MPS_MULTIPLE);
 
 	/* Loading plugins has to be done after D-Bus has been setup since
 	 * the plugins might wanna expose some paths on the bus. However the
-- 
2.25.3


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH BlueZ] a2dp: Use streaming mode when MPS is enabled
  2020-06-08 20:26 [PATCH BlueZ] a2dp: Use streaming mode when MPS is enabled Luiz Augusto von Dentz
@ 2020-06-10 20:24 ` Luiz Augusto von Dentz
  0 siblings, 0 replies; 2+ messages in thread
From: Luiz Augusto von Dentz @ 2020-06-10 20:24 UTC (permalink / raw)
  To: linux-bluetooth

Hi,

On Mon, Jun 8, 2020 at 1:26 PM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> If MPS is enabled use L2CAP streaming mode for AVDTP channels.
> ---
>  profiles/audio/a2dp.c  |  8 ++++++++
>  profiles/audio/avdtp.c |  9 +++++++++
>  src/hcid.h             |  7 +++++++
>  src/main.c             | 16 ++++++----------
>  4 files changed, 30 insertions(+), 10 deletions(-)
>
> diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
> index 0a66589b0..f00e5c923 100644
> --- a/profiles/audio/a2dp.c
> +++ b/profiles/audio/a2dp.c
> @@ -43,6 +43,7 @@
>
>  #include "gdbus/gdbus.h"
>
> +#include "src/hcid.h"
>  #include "src/plugin.h"
>  #include "src/adapter.h"
>  #include "src/device.h"
> @@ -2331,14 +2332,21 @@ drop:
>  static bool a2dp_server_listen(struct a2dp_server *server)
>  {
>         GError *err = NULL;
> +       BtIOMode mode;
>
>         if (server->io)
>                 return true;
>
> +       if (main_opts.mps == MPS_OFF)
> +               mode = BT_IO_MODE_BASIC;
> +       else
> +               mode = BT_IO_MODE_STREAMING;
> +
>         server->io = bt_io_listen(NULL, confirm_cb, server, NULL, &err,
>                                 BT_IO_OPT_SOURCE_BDADDR,
>                                 btd_adapter_get_address(server->adapter),
>                                 BT_IO_OPT_PSM, AVDTP_PSM,
> +                               BT_IO_OPT_MODE, mode,
>                                 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
>                                 BT_IO_OPT_MASTER, true,
>                                 BT_IO_OPT_INVALID);
> diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c
> index 45727f01e..e5193f79b 100644
> --- a/profiles/audio/avdtp.c
> +++ b/profiles/audio/avdtp.c
> @@ -42,6 +42,7 @@
>  #include "lib/uuid.h"
>
>  #include "btio/btio.h"
> +#include "src/hcid.h"
>  #include "src/log.h"
>  #include "src/shared/util.h"
>  #include "src/shared/queue.h"
> @@ -2406,9 +2407,15 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
>         GError *err = NULL;
>         GIOChannel *io;
>         const bdaddr_t *src;
> +       BtIOMode mode;
>
>         src = btd_adapter_get_address(device_get_adapter(session->device));
>
> +       if (main_opts.mps == MPS_OFF)
> +               mode = BT_IO_MODE_BASIC;
> +       else
> +               mode = BT_IO_MODE_STREAMING;
> +
>         if (session->phy)
>                 io = bt_io_connect(avdtp_connect_cb, session,
>                                         NULL, &err,
> @@ -2416,6 +2423,7 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
>                                         BT_IO_OPT_DEST_BDADDR,
>                                         device_get_address(session->device),
>                                         BT_IO_OPT_PSM, AVDTP_PSM,
> +                                       BT_IO_OPT_MODE, mode,
>                                         BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
>                                         /* Set Input MTU to 0 to auto-tune */
>                                         BT_IO_OPT_IMTU, 0,
> @@ -2427,6 +2435,7 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
>                                         BT_IO_OPT_DEST_BDADDR,
>                                         device_get_address(session->device),
>                                         BT_IO_OPT_PSM, AVDTP_PSM,
> +                                       BT_IO_OPT_MODE, mode,
>                                         BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
>                                         BT_IO_OPT_INVALID);
>         if (!io) {
> diff --git a/src/hcid.h b/src/hcid.h
> index 56e2b4f31..1b2714b1d 100644
> --- a/src/hcid.h
> +++ b/src/hcid.h
> @@ -41,6 +41,12 @@ enum jw_repairing_t {
>         JW_REPAIRING_ALWAYS,
>  };
>
> +enum mps_mode_t {
> +       MPS_OFF,
> +       MPS_SINGLE,
> +       MPS_MULTIPLE,
> +};
> +
>  struct main_opts {
>         char            *name;
>         uint32_t        class;
> @@ -102,6 +108,7 @@ struct main_opts {
>         bt_gatt_cache_t gatt_cache;
>         uint16_t        gatt_mtu;
>         uint8_t         gatt_channels;
> +       enum mps_mode_t mps;
>
>         uint8_t         key_size;
>
> diff --git a/src/main.c b/src/main.c
> index 50e37e57a..e51f614b3 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -74,12 +74,6 @@ struct main_opts main_opts;
>  static GKeyFile *main_conf;
>  static char *main_conf_file_path;
>
> -static enum {
> -       MPS_OFF,
> -       MPS_SINGLE,
> -       MPS_MULTIPLE,
> -} mps = MPS_OFF;
> -
>  static const char *supported_options[] = {
>         "Name",
>         "Class",
> @@ -583,9 +577,11 @@ static void parse_config(GKeyFile *config)
>                 DBG("MultiProfile=%s", str);
>
>                 if (!strcmp(str, "single"))
> -                       mps = MPS_SINGLE;
> +                       main_opts.mps = MPS_SINGLE;
>                 else if (!strcmp(str, "multiple"))
> -                       mps = MPS_MULTIPLE;
> +                       main_opts.mps = MPS_MULTIPLE;
> +               else
> +                       main_opts.mps = MPS_OFF;
>
>                 g_free(str);
>         }
> @@ -910,8 +906,8 @@ int main(int argc, char *argv[])
>                                                 main_opts.did_version);
>         }
>
> -       if (mps != MPS_OFF)
> -               register_mps(mps == MPS_MULTIPLE);
> +       if (main_opts.mps != MPS_OFF)
> +               register_mps(main_opts.mps == MPS_MULTIPLE);
>
>         /* Loading plugins has to be done after D-Bus has been setup since
>          * the plugins might wanna expose some paths on the bus. However the
> --
> 2.25.3
>

Pushed.

-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-06-10 20:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-08 20:26 [PATCH BlueZ] a2dp: Use streaming mode when MPS is enabled Luiz Augusto von Dentz
2020-06-10 20:24 ` 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).