• Bastien Nocera's avatar
    Bluetooth: L2CAP: Try harder to accept device not knowing options · 98d2c3e1
    Bastien Nocera authored
    The current implementation of L2CAP options negotiation will continue
    the negotiation when a device responds with L2CAP_CONF_UNACCEPT ("unaccepted
    options"), but not when the device replies with L2CAP_CONF_UNKNOWN ("unknown
    options").
    
    Trying to continue the negotiation without ERTM support will allow
    Bluetooth-capable XBox One controllers (notably models 1708 and 1797)
    to connect.
    
    btmon before patch:
    > ACL Data RX: Handle 256 flags 0x02 dlen 16                            #64 [hci0] 59.182702
          L2CAP: Connection Response (0x03) ident 2 len 8
            Destination CID: 64
            Source CID: 64
            Result: Connection successful (0x0000)
            Status: No further information available (0x0000)
    < ACL Data TX: Handle 256 flags 0x00 dlen 23                            #65 [hci0] 59.182744
          L2CAP: Configure Request (0x04) ident 3 len 15
            Destination CID: 64
            Flags: 0x0000
            Option: Retransmission and Flow Control (0x04) [mandatory]
              Mode: Basic (0x00)
              TX window size: 0
              Max transmit: 0
              Retransmission timeout: 0
              Monitor timeout: 0
              Maximum PDU size: 0
    > ACL Data RX: Handle 256 flags 0x02 dlen 16                            #66 [hci0] 59.183948
          L2CAP: Configure Request (0x04) ident 1 len 8
            Destination CID: 64
            Flags: 0x0000
            Option: Maximum Transmission Unit (0x01) [mandatory]
              MTU: 1480
    < ACL Data TX: Handle 256 flags 0x00 dlen 18                            #67 [hci0] 59.183994
          L2CAP: Configure Response (0x05) ident 1 len 10
            Source CID: 64
            Flags: 0x0000
            Result: Success (0x0000)
            Option: Maximum Transmission Unit (0x01) [mandatory]
              MTU: 1480
    > ACL Data RX: Handle 256 flags 0x02 dlen 15                            #69 [hci0] 59.187676
          L2CAP: Configure Response (0x05) ident 3 len 7
            Source CID: 64
            Flags: 0x0000
            Result: Failure - unknown options (0x0003)
            04                                               .
    < ACL Data TX: Handle 256 flags 0x00 dlen 12                            #70 [hci0] 59.187722
          L2CAP: Disconnection Request (0x06) ident 4 len 4
            Destination CID: 64
            Source CID: 64
    > ACL Data RX: Handle 256 flags 0x02 dlen 12                            #73 [hci0] 59.192714
          L2CAP: Disconnection Response (0x07) ident 4 len 4
            Destination CID: 64
            Source CID: 64
    
    btmon after patch:
    > ACL Data RX: Handle 256 flags 0x02 dlen 16                          #248 [hci0] 103.502970
          L2CAP: Connection Response (0x03) ident 5 len 8
            Destination CID: 65
            Source CID: 65
            Result: Connection pending (0x0001)
            Status: No further information available (0x0000)
    > ACL Data RX: Handle 256 flags 0x02 dlen 16                          #249 [hci0] 103.504184
          L2CAP: Connection Response (0x03) ident 5 len 8
            Destination CID: 65
            Source CID: 65
            Result: Connection successful (0x0000)
            Status: No further information available (0x0000)
    < ACL Data TX: Handle 256 flags 0x00 dlen 23                          #250 [hci0] 103.504398
          L2CAP: Configure Request (0x04) ident 6 len 15
            Destination CID: 65
            Flags: 0x0000
            Option: Retransmission and Flow Control (0x04) [mandatory]
              Mode: Basic (0x00)
              TX window size: 0
              Max transmit: 0
              Retransmission timeout: 0
              Monitor timeout: 0
              Maximum PDU size: 0
    > ACL Data RX: Handle 256 flags 0x02 dlen 16                          #251 [hci0] 103.505472
          L2CAP: Configure Request (0x04) ident 3 len 8
            Destination CID: 65
            Flags: 0x0000
            Option: Maximum Transmission Unit (0x01) [mandatory]
              MTU: 1480
    < ACL Data TX: Handle 256 flags 0x00 dlen 18                          #252 [hci0] 103.505689
          L2CAP: Configure Response (0x05) ident 3 len 10
            Source CID: 65
            Flags: 0x0000
            Result: Success (0x0000)
            Option: Maximum Transmission Unit (0x01) [mandatory]
              MTU: 1480
    > ACL Data RX: Handle 256 flags 0x02 dlen 15                          #254 [hci0] 103.509165
          L2CAP: Configure Response (0x05) ident 6 len 7
            Source CID: 65
            Flags: 0x0000
            Result: Failure - unknown options (0x0003)
            04                                               .
    < ACL Data TX: Handle 256 flags 0x00 dlen 12                          #255 [hci0] 103.509426
          L2CAP: Configure Request (0x04) ident 7 len 4
            Destination CID: 65
            Flags: 0x0000
    < ACL Data TX: Handle 256 flags 0x00 dlen 12                          #257 [hci0] 103.511870
          L2CAP: Connection Request (0x02) ident 8 len 4
            PSM: 1 (0x0001)
            Source CID: 66
    > ACL Data RX: Handle 256 flags 0x02 dlen 14                          #259 [hci0] 103.514121
          L2CAP: Configure Response (0x05) ident 7 len 6
            Source CID: 65
            Flags: 0x0000
            Result: Success (0x0000)
    Signed-off-by: default avatarFlorian Dollinger <dollinger.florian@gmx.de>
    Co-developed-by: default avatarFlorian Dollinger <dollinger.florian@gmx.de>
    Reviewed-by: default avatarLuiz Augusto Von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    98d2c3e1
l2cap_core.c 199 KB