Public bug reported:

[ Impact ]

  When a Bluetooth device running BlueZ acts as an OBEX server (OPP/FTP/PBAP
  receiver), file transfer throughput is degraded by approximately 90% compared
  to the Tx direction.

  Root cause: bt_io_listen() in src/profile.c did not set BT_IO_OPT_IMTU for
  OBEX profile listeners. This causes L2CAP_CONFIGURATION_RSP to advertise the
  minimum MTU (672 bytes), limiting incoming OBEX packets to 669 bytes instead
  of the expected ~8 KB+.

  The fix adds an `imtu` field to profile default_settings and applies
  BT_IO_OPT_IMTU = BT_RX_MTU (32767) for OPP, FTP, PSE, MAS and MNS profiles,
  matching the value already used on the client (Tx) side.

  Upstream: https://github.com/bluez/bluez/commit/646014a6a
  Merged in BlueZ 5.86.

  [ Test Plan ]

  Prerequisites:
  - An Qualcomm IQ-X device running Ubuntu as receiver
  - A remote Bluetooth device (e.g. Android phone) as the sender

  Steps to reproduce (before fix):
  1. On the IQ-X device, ensure bluetoothd and obexd are running
  2. On the Android phone, initiate an OPP file transfer sending a large file
     (e.g. 10 MB) to the IQ-X device
  3. Observe transfer speed

  Expected with fix: > 500 KB/s (comparable to Tx direction)
  Actual without fix: < 100 KB/s (limited by 669-byte OBEX packets)

  Verification after fix:
  - Repeat the OPP transfer: speed should be comparable to Tx (~500 KB/s+)
  - Optional: run obexd in debug mode and confirm recv_data() size ~8016
      $ systemctl stop obex
      $ /usr/libexec/bluetooth/obexd -s -a -d
    Before fix: recv_data() size=669
    After fix: recv_data() size=8016 depend on the remote device

  [ Where problems could occur ]

  The change increases the advertised L2CAP IMTU for OBEX server sockets from
  672 to 32767. The remote peer still decides the actual packet size to send, so
  a well-implemented BT stack will simply use its own MPS/MTU without issue.

  Possible regression scenarios:
  - Remote BT stacks with bugs handling large-MTU L2CAP negotiation might fail
    to connect or transfer. However, this is the same IMTU already used on
    BlueZ's client (Tx) side and has worked reliably.
  - Only OBEX profiles (OPP, FTP, PSE, MAS, MNS) are affected; all other
    profiles using bt_io_listen() are unmodified.
  - Slightly larger kernel socket buffers, negligible on any modern platform.

  [ Other Info ]

  - Only src/profile.c is modified (19 lines changed).

** Affects: bluez (Ubuntu)
     Importance: Undecided
         Status: New


** Tags: fixed-upstream

** Tags added: fixed-upstream

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2163625

Title:
  [SRU][Resolute]  Set L2CAP IMTU for OBEX profile listeners to fix OPP
  Rx KPI

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/2163625/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to