• Kuba Pawlak's avatar
    Bluetooth: Remove SCO fragments on connection close · 8f9d02f4
    Kuba Pawlak authored
    SCO packet reassembler may have a fragment of SCO packet, from
    previous connection, cached and not removed when SCO connection
    is ended. Packets from new SCO connection are then going to be
    attached to that fragment, creating an invalid SCO packets.
    
    Controllers like Intel's WilkinsPeak are always fragmenting
    SCO packet into 3 parts (#1, #2, #3). Packet #1 contains
    SCO header and audio data, others just audio data. if there is
    a fragment cached from previous connection, i.e. #1, first
    SCO packet from new connection is going to be attached to it
    creating packet consisting of fragments #1-#1-#2. This will
    be forwarded to upper layers. After that, fragment #3 is going
    to be used as a starting point for another SCO packet.
    It does not contain a SCO header, but the code expects it,
    casts a SCO header structure on it, and reads whatever audio
    data happens to be there as SCO packet length and handle.
    From that point on, we are assembling random data into SCO
    packets. Usually it recovers quickly as initial audio data
    contains mostly zeros (muted stream), but setups of over
    4 seconds were observed.
    Issue manifests itself by printing on the console:
    Bluetooth: hci0 SCO packet for unknown connection handle 48
    Bluetooth: hci0 SCO packet for unknown connection handle 2560
    Bluetooth: hci0 SCO packet for unknown connection handle 12288
    It may also show random handles if audio data was non-zeroed.
    Hcidump shows SCO packets with random length and handles.
    
    Few messages with handle 0 at connection creation are OK
    for some controllers (like WilkinsPeak), as there are SCO packets
    with zeroed handle at the beginning (possible controller bug).
    Few of such messages at connection end, with a handle looking
    sane (around 256, 512, 768 ...) is also OK, as these are last
    SCO packets that were assembled and sent up, before connection
    was ended, but were not handled in time.
    
    This issue may still manifest itself on WilkinsPeak as it sometimes,
    at SCO connection creation, does not send third fragment of first
    SCO packet (#1-#2-#1-#2-#3...). This is a firmware bug and this
    patch does not address it.
    Signed-off-by: default avatarKuba Pawlak <kubax.t.pawlak@intel.com>
    Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    8f9d02f4
btusb.c 76.4 KB