Bluetooth: SDP: Handle SSA PDU response
Adds initial handling of SDP Service Search Attribute response PDU. Currently attributes data are not collected. Main focus was done on proper handling PDU continuation state to be able receive whole requested SDP record(s) if found for given UUID. < ACL Data TX: Handle 74 flags 0x00 dlen 24 Channel: 64 len 20 [PSM 1 mode 0] {chan 3} SDP: Service Search Attribute Request (0x06) tid 1 len 15 Search pattern: [len 5] Sequence (6) with 3 bytes [8 extra bits] len 5 UUID (3) with 2 bytes [0 extra bits] len 3 OBEX Object Push (0x1105) Max record count: 65535 Attribute list: [len 7] Sequence (6) with 5 bytes [8 extra bits] len 7 Unsigned Integer (1) with 4 bytes [0 extra bits] len 5 0x0000ffff Continuation state: 0 > HCI Event: Number of Completed Packets (0x13) plen 5 Num handles: 1 Handle: 74 Count: 1 > ACL Data RX: Handle 74 flags 0x02 dlen 68 Channel: 64 len 64 [PSM 1 mode 0] {chan 3} SDP: Service Search Attribute Response (0x07) tid 1 len 59 Attribute bytes: 48 Continuation state: 8 cd 91 5a 58 30 00 00 00 ..ZX0... < HCI Command: Host Number of Completed Packets (0x03|0x0035) plen 5 Num handles: 1 Handle: 74 Count: 1 < ACL Data TX: Handle 74 flags 0x00 dlen 32 Channel: 64 len 28 [PSM 1 mode 0] {chan 3} SDP: Service Search Attribute Request (0x06) tid 2 len 23 Search pattern: [len 5] Sequence (6) with 3 bytes [8 extra bits] len 5 UUID (3) with 2 bytes [0 extra bits] len 3 OBEX Object Push (0x1105) Max record count: 65535 Attribute list: [len 7] Sequence (6) with 5 bytes [8 extra bits] len 7 Unsigned Integer (1) with 4 bytes [0 extra bits] len 5 0x0000ffff Continuation state: 8 cd 91 5a 58 30 00 00 00 ..ZX0... > HCI Event: Number of Completed Packets (0x13) plen 5 Num handles: 1 Handle: 74 Count: 1 > ACL Data RX: Handle 74 flags 0x02 dlen 68 Channel: 64 len 64 [PSM 1 mode 0] {chan 3} SDP: Service Search Attribute Response (0x07) tid 2 len 59 Attribute bytes: 48 Continuation state: 8 cd 91 5a 58 60 00 00 00 ..ZX`... < HCI Command: Host Number of Completed Packets (0x03|0x0035) plen 5 Num handles: 1 Handle: 74 Count: 1 < ACL Data TX: Handle 74 flags 0x00 dlen 32 Channel: 64 len 28 [PSM 1 mode 0] {chan 3} SDP: Service Search Attribute Request (0x06) tid 3 len 23 Search pattern: [len 5] Sequence (6) with 3 bytes [8 extra bits] len 5 UUID (3) with 2 bytes [0 extra bits] len 3 OBEX Object Push (0x1105) Max record count: 65535 Attribute list: [len 7] Sequence (6) with 5 bytes [8 extra bits] len 7 Unsigned Integer (1) with 4 bytes [0 extra bits] len 5 0x0000ffff Continuation state: 8 cd 91 5a 58 60 00 00 00 ..ZX`... > HCI Event: Number of Completed Packets (0x13) plen 5 Num handles: 1 Handle: 74 Count: 1 > ACL Data RX: Handle 74 flags 0x02 dlen 19 Channel: 64 len 15 [PSM 1 mode 0] {chan 3} SDP: Service Search Attribute Response (0x07) tid 3 len 10 Attribute bytes: 7 Continuation state: 0 Combined attribute bytes: 103 Attribute list: [len 99] {position 0} Attribute: Service Record Handle (0x0000) [len 2] 0x00010001 Attribute: Service Class ID List (0x0001) [len 2] UUID (3) with 2 bytes [0 extra bits] len 3 OBEX Object Push (0x1105) Attribute: Protocol Descriptor List (0x0004) [len 2] Sequence (6) with 3 bytes [8 extra bits] len 5 UUID (3) with 2 bytes [0 extra bits] len 3 L2CAP (0x0100) Sequence (6) with 5 bytes [8 extra bits] len 7 UUID (3) with 2 bytes [0 extra bits] len 3 RFCOMM (0x0003) Unsigned Integer (1) with 1 byte [0 extra bits] len 2 0x09 Sequence (6) with 3 bytes [8 extra bits] len 5 UUID (3) with 2 bytes [0 extra bits] len 3 OBEX (0x0008) Attribute: Browse Group List (0x0005) [len 2] UUID (3) with 2 bytes [0 extra bits] len 3 Public Browse Root (0x1002) Attribute: Bluetooth Profile Descriptor List (0x0009) [len 2] Sequence (6) with 6 bytes [8 extra bits] len 8 UUID (3) with 2 bytes [0 extra bits] len 3 OBEX Object Push (0x1105) Unsigned Integer (1) with 2 bytes [0 extra bits] len 3 0x0100 Attribute: Unknown (0x0100) [len 2] OBEX Object Push [len 16] Attribute: Unknown (0x0303) [len 2] Unsigned Integer (1) with 1 byte [0 extra bits] len 2 0x01 Unsigned Integer (1) with 1 byte [0 extra bits] len 2 0x02 Unsigned Integer (1) with 1 byte [0 extra bits] len 2 0x03 Unsigned Integer (1) with 1 byte [0 extra bits] len 2 0x04 Unsigned Integer (1) with 1 byte [0 extra bits] len 2 0x05 Unsigned Integer (1) with 1 byte [0 extra bits] len 2 0x06 Unsigned Integer (1) with 1 byte [0 extra bits] len 2 0xff Jira: ZEP-1112 Change-Id: Ie282782fba6ef06c6826b3e624f83c8f4c94ebbe Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
This commit is contained in:
parent
4b7cdd499f
commit
d333b3892b
1 changed files with 55 additions and 1 deletions
|
@ -432,7 +432,9 @@ static void sdp_client_receive(struct bt_l2cap_chan *chan, struct net_buf *buf)
|
|||
{
|
||||
struct bt_sdp_client *session = SDP_CLIENT_CHAN(chan);
|
||||
struct bt_sdp_hdr *hdr = (void *)buf->data;
|
||||
uint16_t len, tid;
|
||||
struct bt_sdp_pdu_cstate *cstate;
|
||||
struct bt_conn *conn = session->chan.chan.conn;
|
||||
uint16_t len, tid, frame_len;
|
||||
|
||||
BT_DBG("session %p buf %p", session, buf);
|
||||
|
||||
|
@ -461,6 +463,58 @@ static void sdp_client_receive(struct bt_l2cap_chan *chan, struct net_buf *buf)
|
|||
BT_ERR("Mismatch transaction ID value in SDP PDU");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (hdr->op_code) {
|
||||
case BT_SDP_SVC_SEARCH_ATTR_RSP:
|
||||
/* Get number of attributes in this frame. */
|
||||
frame_len = net_buf_pull_be16(buf);
|
||||
/* Get PDU continuation state */
|
||||
cstate = (struct bt_sdp_pdu_cstate *)(buf->data + frame_len);
|
||||
|
||||
if (cstate->length > BT_SDP_MAX_PDU_CSTATE_LEN) {
|
||||
BT_ERR("Invalid SDP PDU Continuation State length %u",
|
||||
cstate->length);
|
||||
return;
|
||||
}
|
||||
|
||||
/* No record found for given UUID */
|
||||
if (frame_len == 2 && cstate->length == 0 &&
|
||||
session->cstate.length == 0) {
|
||||
BT_DBG("record for UUID 0x%s not found",
|
||||
bt_uuid_str(session->param->uuid));
|
||||
/* Call user UUID handler */
|
||||
session->param->func(conn, NULL);
|
||||
net_buf_pull(buf, frame_len + sizeof(cstate->length));
|
||||
break;
|
||||
}
|
||||
|
||||
/* TO DO: fillup user buffer with record's data */
|
||||
|
||||
net_buf_pull(buf, frame_len);
|
||||
|
||||
/*
|
||||
* check if current response says there's next portion to be
|
||||
* fetched
|
||||
*/
|
||||
if (cstate->length) {
|
||||
/* Cache original Continuation State in context */
|
||||
memcpy(&session->cstate, cstate,
|
||||
sizeof(struct bt_sdp_pdu_cstate));
|
||||
|
||||
net_buf_pull(buf, cstate->length +
|
||||
sizeof(cstate->length));
|
||||
|
||||
/* Request for next portion of attributes data */
|
||||
sdp_client_ssa_search(session);
|
||||
break;
|
||||
}
|
||||
|
||||
net_buf_pull(buf, sizeof(cstate->length));
|
||||
break;
|
||||
default:
|
||||
BT_DBG("PDU 0x%0x response not handled", hdr->op_code);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int sdp_client_chan_connect(struct bt_sdp_client *session)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue