From: Mikel Astiz <mikel.astiz@xxxxxxxxxxxx> If a non-default value was set to the socket option, override the value provided by the Media API and set the MTU size accordingly. --- [WAS: bluetooth: Dynamically change outgoing MTU] This third proposal rethinks the whole approach and instead of trying to change the MTU dynamically, we read the setting from the socket option. After all, anybody trying to setup two SCO streams (e.g. two simultaneous headsets) will have to configure this setting anyway. src/Makefile.am | 4 ++-- src/modules/bluetooth/bluetooth-util.c | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index fc787c2..60bc61c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2004,8 +2004,8 @@ libbluetooth_util_la_SOURCES = \ modules/bluetooth/bluetooth-util.c \ modules/bluetooth/bluetooth-util.h libbluetooth_util_la_LDFLAGS = -avoid-version -libbluetooth_util_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) -libbluetooth_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) +libbluetooth_util_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) $(BLUEZ_LIBS) +libbluetooth_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) $(BLUEZ_CFLAGS) module_bluetooth_device_la_SOURCES = modules/bluetooth/module-bluetooth-device.c modules/bluetooth/rtp.h module_bluetooth_device_la_LDFLAGS = $(MODULE_LDFLAGS) diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c index 5e4b77b..00db24e 100644 --- a/src/modules/bluetooth/bluetooth-util.c +++ b/src/modules/bluetooth/bluetooth-util.c @@ -29,6 +29,9 @@ #include <pulsecore/shared.h> #include <pulsecore/dbus-shared.h> +#include <bluetooth/bluetooth.h> +#include <bluetooth/sco.h> + #include "bluetooth-util.h" #include "a2dp-codecs.h" @@ -37,6 +40,8 @@ #define A2DP_SOURCE_ENDPOINT "/MediaEndpoint/A2DPSource" #define A2DP_SINK_ENDPOINT "/MediaEndpoint/A2DPSink" +#define DEFAULT_KERNEL_SCO_MTU 64 + #define ENDPOINT_INTROSPECT_XML \ DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ "<node>" \ @@ -1163,6 +1168,28 @@ int pa_bluetooth_transport_acquire(pa_bluetooth_transport *t, bool optional, siz goto fail; } + /* For SCO sockets, read the MTU from the socket options and if necessary + * override the value provided by the Media API */ + if (t->profile == PROFILE_HSP || t->profile == PROFILE_HFGW) { + struct sco_options opts; + socklen_t size = sizeof(opts); + + memset(&opts, 0, size); + + if (getsockopt(ret, SOL_SCO, SCO_OPTIONS, &opts, &size) == 0 && size >= sizeof(opts)) { + if (opts.mtu == DEFAULT_KERNEL_SCO_MTU) + pa_log_debug("Ignoring default kernel SCO MTU"); + else if (opts.mtu < i || opts.mtu < o) + pa_log_warn("Ignoring socket option SCO MTU size %u because it's too small", opts.mtu); + else { + pa_log_info("Overriding MediaTransport MTU (%u, %u) with socket option SCO MTU size %u", i, o, opts.mtu); + + i = opts.mtu; + o = opts.mtu; + } + } + } + if (imtu) *imtu = i; -- 1.8.1.4