Bluetooth: l2cap: Process valid commands in too long frame
commit e2e49e214145a8f6ece6ecd52fec63ebc2b27ce9 upstream.
This is required for passing PTS test cases:
- L2CAP/COS/CED/BI-14-C
Multiple Signaling Command in one PDU, Data Truncated, BR/EDR,
Connection Request
- L2CAP/COS/CED/BI-15-C
Multiple Signaling Command in one PDU, Data Truncated, BR/EDR,
Disconnection Request
The test procedure defined in L2CAP.TS.p39 for both tests is:
1. The Lower Tester sends a C-frame to the IUT with PDU Length set
to 8 and Channel ID set to the correct signaling channel for the
logical link. The Information payload contains one L2CAP_ECHO_REQ
packet with Data Length set to 0 with 0 octets of echo data and
one command packet and Data Length set as specified in Table 4.6
and the correct command data.
2. The IUT sends an L2CAP_ECHO_RSP PDU to the Lower Tester.
3. Perform alternative 3A, 3B, 3C, or 3D depending on the IUT’s
response.
Alternative 3A (IUT terminates the link):
3A.1 The IUT terminates the link.
3A.2 The test ends with a Pass verdict.
Alternative 3B (IUT discards the frame):
3B.1 The IUT does not send a reply to the Lower Tester.
Alternative 3C (IUT rejects PDU):
3C.1 The IUT sends an L2CAP_COMMAND_REJECT_RSP PDU to the
Lower Tester.
Alternative 3D (Any other IUT response):
3D.1 The Upper Tester issues a warning and the test ends.
4. The Lower Tester sends a C-frame to the IUT with PDU Length set
to 4 and Channel ID set to the correct signaling channel for the
logical link. The Information payload contains Data Length set to
0 with an L2CAP_ECHO_REQ packet with 0 octets of echo data.
5. The IUT sends an L2CAP_ECHO_RSP PDU to the Lower Tester.
With expected outcome:
In Steps 2 and 5, the IUT responds with an L2CAP_ECHO_RSP.
In Step 3A.1, the IUT terminates the link.
In Step 3B.1, the IUT does not send a reply to the Lower Tester.
In Step 3C.1, the IUT rejects the PDU.
In Step 3D.1, the IUT sends any valid response.
Currently PTS fails with the following logs:
Failed to receive ECHO RESPONSE.
And HCI logs:
> ACL Data RX: Handle 11 flags 0x02 dlen 20
L2CAP: Information Response (0x0b) ident 2 len 12
Type: Fixed channels supported (0x0003)
Result: Success (0x0000)
Channels: 0x000000000000002e
L2CAP Signaling (BR/EDR)
Connectionless reception
AMP Manager Protocol
L2CAP Signaling (LE)
> ACL Data RX: Handle 11 flags 0x02 dlen 13
frame too long
08 01 00 00 08 02 01 00 aa .........
Cc: stable@vger.kernel.org
Signed-off-by: Frédéric Danis <frederic.danis@collabora.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
bde7abe8cf
commit
569bbe2fc7
@@ -7504,8 +7504,24 @@ void l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
|
|||||||
if (skb->len > len) {
|
if (skb->len > len) {
|
||||||
BT_ERR("Frame is too long (len %u, expected len %d)",
|
BT_ERR("Frame is too long (len %u, expected len %d)",
|
||||||
skb->len, len);
|
skb->len, len);
|
||||||
|
/* PTS test cases L2CAP/COS/CED/BI-14-C and BI-15-C
|
||||||
|
* (Multiple Signaling Command in one PDU, Data
|
||||||
|
* Truncated, BR/EDR) send a C-frame to the IUT with
|
||||||
|
* PDU Length set to 8 and Channel ID set to the
|
||||||
|
* correct signaling channel for the logical link.
|
||||||
|
* The Information payload contains one L2CAP_ECHO_REQ
|
||||||
|
* packet with Data Length set to 0 with 0 octets of
|
||||||
|
* echo data and one invalid command packet due to
|
||||||
|
* data truncated in PDU but present in HCI packet.
|
||||||
|
*
|
||||||
|
* Shorter the socket buffer to the PDU length to
|
||||||
|
* allow to process valid commands from the PDU before
|
||||||
|
* setting the socket unreliable.
|
||||||
|
*/
|
||||||
|
skb->len = len;
|
||||||
|
l2cap_recv_frame(conn, skb);
|
||||||
l2cap_conn_unreliable(conn, ECOMM);
|
l2cap_conn_unreliable(conn, ECOMM);
|
||||||
goto drop;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Append fragment into frame (with header) */
|
/* Append fragment into frame (with header) */
|
||||||
|
|||||||
Reference in New Issue
Block a user