struct chan_data {
uint16_t index;
uint16_t handle;
+ uint8_t ident;
uint16_t scid;
uint16_t dcid;
uint16_t psm;
memset(&chan_list[n], 0, sizeof(chan_list[n]));
chan_list[n].index = frame->index;
chan_list[n].handle = frame->handle;
+ chan_list[n].ident = frame->ident;
if (frame->in)
chan_list[n].dcid = scid;
}
}
-static void assign_dcid(const struct l2cap_frame *frame,
- uint16_t dcid, uint16_t scid)
+static void assign_dcid(const struct l2cap_frame *frame, uint16_t dcid,
+ uint16_t scid)
{
int i;
if (chan_list[i].handle != frame->handle)
continue;
+ if (frame->ident != 0 && chan_list[i].ident != frame->ident)
+ continue;
+
if (frame->in) {
- if (chan_list[i].scid == scid) {
- chan_list[i].dcid = dcid;
- break;
+ if (scid) {
+ if (chan_list[i].scid == scid) {
+ chan_list[i].dcid = dcid;
+ break;
+ }
+ } else {
+ if (chan_list[i].scid && !chan_list[i].dcid) {
+ chan_list[i].dcid = dcid;
+ break;
+ }
}
} else {
- if (chan_list[i].dcid == scid) {
- chan_list[i].scid = dcid;
- break;
+ if (scid) {
+ if (chan_list[i].dcid == scid) {
+ chan_list[i].scid = dcid;
+ break;
+ }
+ } else {
+ if (chan_list[i].dcid && !chan_list[i].scid) {
+ chan_list[i].scid = dcid;
+ break;
+ }
}
}
}
print_field("Credits: %u", le16_to_cpu(pdu->credits));
print_conn_result(pdu->result);
- /*assign_dcid(frame, le16_to_cpu(pdu->dcid), le16_to_cpu(pdu->scid));*/
+ assign_dcid(frame, le16_to_cpu(pdu->dcid), 0);
}
static void sig_le_flowctl_creds(const struct l2cap_frame *frame)
{ },
};
-static void l2cap_frame_init(struct l2cap_frame *frame,
- uint16_t index, bool in, uint16_t handle,
+static void l2cap_frame_init(struct l2cap_frame *frame, uint16_t index, bool in,
+ uint16_t handle, uint8_t ident,
uint16_t cid, const void *data, uint16_t size)
{
frame->index = index;
frame->in = in;
frame->handle = handle;
+ frame->ident = ident;
frame->cid = cid;
frame->data = data;
frame->size = size;
}
}
- l2cap_frame_init(&frame, index, in, handle, cid, data, len);
+ l2cap_frame_init(&frame, index, in, handle, hdr->ident, cid,
+ data, len);
opcode_data->func(&frame);
data += len;
}
}
- l2cap_frame_init(&frame, index, in, handle, cid, data, len);
+ l2cap_frame_init(&frame, index, in, handle, hdr->ident, cid, data, len);
opcode_data->func(&frame);
}
break;
}
- l2cap_frame_init(&frame, index, in, handle, cid, data, size);
+ l2cap_frame_init(&frame, index, in, handle, 0, cid, data, size);
}
static void print_controller_list(const uint8_t *data, uint16_t size)
}
}
- l2cap_frame_init(&frame, index, in, handle, cid, data + 6, len);
+ l2cap_frame_init(&frame, index, in, handle, 0, cid, data + 6, len);
opcode_data->func(&frame);
}
}
}
- l2cap_frame_init(&frame, index, in, handle, cid, data + 1, size - 1);
+ l2cap_frame_init(&frame, index, in, handle, 0, cid, data + 1, size - 1);
opcode_data->func(&frame);
}
}
}
- l2cap_frame_init(&frame, index, in, handle, cid, data + 1, size - 1);
+ l2cap_frame_init(&frame, index, in, handle, 0, cid, data + 1, size - 1);
opcode_data->func(&frame);
}
smp_packet(index, in, handle, cid, data, size);
break;
default:
- l2cap_frame_init(&frame, index, in, handle, cid, data, size);
+ l2cap_frame_init(&frame, index, in, handle, 0, cid, data, size);
if (frame.mode > 0) {
ext_ctrl = get_ext_ctrl(&frame);