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)
+ uint16_t cid, uint16_t psm,
+ const void *data, uint16_t size)
{
frame->index = index;
frame->in = in;
frame->cid = cid;
frame->data = data;
frame->size = size;
- frame->psm = get_psm(frame);
+ frame->psm = psm ? psm : get_psm(frame);
frame->mode = get_mode(frame);
frame->chan = get_chan(frame);
- frame->seq_num = get_seq_num(frame);
+ frame->seq_num = psm ? 1 : get_seq_num(frame);
}
static void bredr_sig_packet(uint16_t index, bool in, uint16_t handle,
}
}
- l2cap_frame_init(&frame, index, in, handle, hdr->ident, cid,
+ l2cap_frame_init(&frame, index, in, handle, hdr->ident, cid, 0,
data, len);
opcode_data->func(&frame);
}
}
- l2cap_frame_init(&frame, index, in, handle, hdr->ident, cid, data, len);
+ l2cap_frame_init(&frame, index, in, handle, hdr->ident, cid, 0,
+ data, len);
opcode_data->func(&frame);
}
break;
}
- l2cap_frame_init(&frame, index, in, handle, 0, cid, data, size);
+ l2cap_frame_init(&frame, index, in, handle, 0, cid, 0, data, size);
}
static void print_controller_list(const uint8_t *data, uint16_t size)
}
}
- l2cap_frame_init(&frame, index, in, handle, 0, cid, data + 6, len);
+ l2cap_frame_init(&frame, index, in, handle, 0, cid, 0, data + 6, len);
opcode_data->func(&frame);
}
}
}
- l2cap_frame_init(&frame, index, in, handle, 0, cid, data + 1, size - 1);
+ l2cap_frame_init(&frame, index, in, handle, 0, cid, 0,
+ data + 1, size - 1);
opcode_data->func(&frame);
}
}
}
- l2cap_frame_init(&frame, index, in, handle, 0, cid, data + 1, size - 1);
+ l2cap_frame_init(&frame, index, in, handle, 0, cid, 0,
+ data + 1, size - 1);
opcode_data->func(&frame);
}
-static void l2cap_frame(uint16_t index, bool in, uint16_t handle,
- uint16_t cid, const void *data, uint16_t size)
+void l2cap_frame(uint16_t index, bool in, uint16_t handle, uint16_t cid,
+ uint16_t psm, const void *data, uint16_t size)
{
struct l2cap_frame frame;
uint32_t ctrl32 = 0;
smp_packet(index, in, handle, cid, data, size);
break;
default:
- l2cap_frame_init(&frame, index, in, handle, 0, cid, data, size);
+ l2cap_frame_init(&frame, index, in, handle, 0, cid, psm,
+ data, size);
if (frame.mode > 0) {
ext_ctrl = get_ext_ctrl(&frame);
if (len == size) {
/* complete frame */
- l2cap_frame(index, in, handle, cid, data, len);
+ l2cap_frame(index, in, handle, cid, 0, data, len);
return;
}
if (!index_list[index][in].frag_len) {
/* complete frame */
l2cap_frame(index, in, handle,
- index_list[index][in].frag_cid,
+ index_list[index][in].frag_cid, 0,
index_list[index][in].frag_buf,
index_list[index][in].frag_pos);
clear_fragment_buffer(index, in);
}
/* complete frame */
- l2cap_frame(index, in, handle, cid, data, len);
+ l2cap_frame(index, in, handle, cid, 0, data, len);
break;
default:
ident = ul->ident_len ? data + sizeof(*ul) : NULL;
packet_user_logging(tv, cred, index, ul->priority, ident,
- data + sizeof(*ul) + ul->ident_len);
+ data + sizeof(*ul) + ul->ident_len,
+ size - (sizeof(*ul) + ul->ident_len));
break;
case BTSNOOP_OPCODE_CTRL_OPEN:
control_disable_decoding();
"Note", message, NULL);
}
+struct monitor_l2cap_hdr {
+ uint16_t cid;
+ uint16_t psm;
+};
+
+static void packet_decode(struct timeval *tv, struct ucred *cred, char dir,
+ uint16_t index, const char *color,
+ const char *label, const void *data,
+ uint16_t size)
+{
+ const struct monitor_l2cap_hdr *hdr = data;
+
+ if (size < sizeof(*hdr)) {
+ print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
+ "Malformed User Data packet", NULL, NULL);
+ }
+
+ print_packet(tv, cred, dir, index, NULL, COLOR_HCI_ACLDATA, label,
+ dir == '>' ? "User Data RX" : "User Data TX",
+ NULL);
+
+ /* Discard last byte since it just a filler */
+ l2cap_frame(index, dir == '>', 0, hdr->cid, hdr->psm,
+ data + sizeof(*hdr), size - (sizeof(*hdr) + 1));
+}
+
void packet_user_logging(struct timeval *tv, struct ucred *cred,
uint16_t index, uint8_t priority,
- const char *ident, const char *message)
+ const char *ident, const void *data,
+ uint16_t size)
{
char pid_str[140];
const char *label;
label = "Message";
}
- print_packet(tv, cred, '=', index, NULL, color, label, message, NULL);
+ if (ident[0] == '<' || ident[0] == '>') {
+ packet_decode(tv, cred, ident[0], index, color,
+ label == ident ? &ident[2] : label,
+ data, size);
+ return;
+ }
+
+ print_packet(tv, cred, '=', index, NULL, color, label, data, NULL);
}
void packet_hci_command(struct timeval *tv, struct ucred *cred, uint16_t index,