From ae443493b7bb73b27d376a419ecbbf29e09aa92a Mon Sep 17 00:00:00 2001 From: Szymon Janc Date: Wed, 18 Feb 2015 22:46:32 +0100 Subject: [PATCH] monitor: Fix selecting PSM for L2CAP frame Current code could fail to pick up right PSM resulting in using PSM 1 for non-SDP traffic. Fix following: > ACL Data RX: Handle 3 flags 0x02 dlen 9 Channel: 64 len 5 [PSM 1 mode 0] {chan 0} invalid frame size > ACL Data RX: Handle 3 flags 0x02 dlen 20 Channel: 64 len 16 [PSM 1 mode 0] {chan 0} invalid frame size 2b 42 52 53 46 3d 32 35 35 0d e4 +BRSF=255.. < ACL Data TX: Handle 3 flags 0x00 dlen 28 Channel: 256 len 24 [PSM 3 mode 0] {chan 1} RFCOMM: Unnumbered Info with Header Check (UIH)(0xef) Address: 0x69 cr 0 dlci 0x1a Control: 0xef poll/final 0 Length: 20 FCS: 0x3e 0d 0a 2b 42 52 53 46 3a 20 38 37 31 0d 0a 0d 0a ..+BRSF: 871.... 4f 4b 0d 0a 3e OK..> instead of: > ACL Data RX: Handle 4 flags 0x02 dlen 20 Channel: 64 len 16 [PSM 3 mode 0] {chan 1} RFCOMM: Unnumbered Info with Header Check (UIH)(0xef) Address: 0x6b cr 1 dlci 0x1a Control: 0xef poll/final 0 Length: 12 FCS: 0xe4 41 54 2b 42 52 53 46 3d 32 35 35 0d e4 AT+BRSF=255.. < ACL Data TX: Handle 4 flags 0x00 dlen 28 Channel: 384 len 24 [PSM 3 mode 0] {chan 1} RFCOMM: Unnumbered Info with Header Check (UIH)(0xef) Address: 0x69 cr 0 dlci 0x1a Control: 0xef poll/final 0 Length: 20 FCS: 0x3e 0d 0a 2b 42 52 53 46 3a 20 38 37 31 0d 0a 0d 0a ..+BRSF: 871.... 4f 4b 0d 0a 3e OK..> --- monitor/l2cap.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/monitor/l2cap.c b/monitor/l2cap.c index 342bd8e7b..7a6edbe5d 100644 --- a/monitor/l2cap.c +++ b/monitor/l2cap.c @@ -232,10 +232,13 @@ static int get_chan_data_index(const struct l2cap_frame *frame) chan_list[i].ctrlid == 0) continue; - if (chan_list[i].handle != frame->handle && + if (chan_list[i].ctrlid != 0 && chan_list[i].ctrlid != frame->index) continue; + if (chan_list[i].handle != frame->handle) + continue; + if (frame->in) { if (chan_list[i].scid == frame->cid) return i; -- 2.47.3