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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Nov 16, 2020 at 7:26 PM Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
>
> From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
>
> 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@xxxxxxxxxxxx>
Tested-by: Alain Michaud <alainm@xxxxxxxxxxxx>

> ---
>  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
>



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux