}
}
-static void data_packet(const void *data, uint8_t size)
+static void data_packet(const void *data, uint8_t size, bool padded)
{
const uint8_t *ptr = data;
uint8_t llid, length;
switch (llid) {
case 0x03:
- llcp_packet(data + 2, size - 2);
+ llcp_packet(data + 2, size - 2, padded);
break;
default:
}
}
-void ll_packet(uint16_t frequency, const void *data, uint8_t size)
+void ll_packet(uint16_t frequency, const void *data, uint8_t size, bool padded)
{
const struct bt_ll_hdr *hdr = data;
uint8_t channel = (frequency - 2402) / 2;
if (access_addr == 0x8e89bed6)
advertising_packet(pdu_data, pdu_len);
else
- data_packet(pdu_data, pdu_len);
+ data_packet(pdu_data, pdu_len, padded);
}
static void null_pdu(const void *data, uint8_t size)
packet_print_error("Error code", pdu->error);
}
+static void slave_feature_req(const void *data, uint8_t size)
+{
+ const struct bt_ll_slave_feature_req *pdu = data;
+
+ packet_print_features_ll(pdu->features);
+}
+
+static void reject_ind_ext(const void *data, uint8_t size)
+{
+ const struct bt_ll_reject_ind_ext *pdu = data;
+
+ print_field("Reject opcode: %u (0x%2.2x)", pdu->opcode, pdu->opcode);
+ packet_print_error("Error code", pdu->error);
+}
+
struct llcp_data {
uint8_t opcode;
const char *str;
};
static const struct llcp_data llcp_table[] = {
- { 0x00, "LL_CONNECTION_UPDATE_REQ", conn_update_req, 11, true },
- { 0x01, "LL_CHANNEL_MAP_REQ", channel_map_req, 7, true },
- { 0x02, "LL_TERMINATE_IND", terminate_ind, 1, true },
- { 0x03, "LL_ENC_REQ", enc_req, 22, true },
- { 0x04, "LL_ENC_RSP", enc_rsp, 12, true },
- { 0x05, "LL_START_ENC_REQ", null_pdu, 0, true },
- { 0x06, "LL_START_ENC_RSP", null_pdu, 0, true },
- { 0x07, "LL_UNKNOWN_RSP", unknown_rsp, 1, true },
- { 0x08, "LL_FEATURE_REQ", feature_req, 8, true },
- { 0x09, "LL_FEATURE_RSP", feature_rsp, 8, true },
- { 0x0a, "LL_PAUSE_ENC_REQ", null_pdu, 0, true },
- { 0x0b, "LL_PAUSE_ENC_RSP", null_pdu, 0, true },
- { 0x0c, "LL_VERSION_IND", version_ind, 5, true },
- { 0x0d, "LL_REJECT_IND", reject_ind, 1, true },
- { 0x12, "LL_PING_REQ", null_pdu, 0, true },
- { 0x13, "LL_PING_RSP", null_pdu, 0, true },
+ { 0x00, "LL_CONNECTION_UPDATE_REQ", conn_update_req, 11, true },
+ { 0x01, "LL_CHANNEL_MAP_REQ", channel_map_req, 7, true },
+ { 0x02, "LL_TERMINATE_IND", terminate_ind, 1, true },
+ { 0x03, "LL_ENC_REQ", enc_req, 22, true },
+ { 0x04, "LL_ENC_RSP", enc_rsp, 12, true },
+ { 0x05, "LL_START_ENC_REQ", null_pdu, 0, true },
+ { 0x06, "LL_START_ENC_RSP", null_pdu, 0, true },
+ { 0x07, "LL_UNKNOWN_RSP", unknown_rsp, 1, true },
+ { 0x08, "LL_FEATURE_REQ", feature_req, 8, true },
+ { 0x09, "LL_FEATURE_RSP", feature_rsp, 8, true },
+ { 0x0a, "LL_PAUSE_ENC_REQ", null_pdu, 0, true },
+ { 0x0b, "LL_PAUSE_ENC_RSP", null_pdu, 0, true },
+ { 0x0c, "LL_VERSION_IND", version_ind, 5, true },
+ { 0x0d, "LL_REJECT_IND", reject_ind, 1, true },
+ { 0x0e, "LL_SLAVE_FEATURE_REQ", slave_feature_req, 8, true },
+ { 0x0f, "LL_CONNECTION_PARAM_REQ", NULL, 23, true },
+ { 0x10, "LL_CONNECTION_PARAM_RSP", NULL, 23, true },
+ { 0x11, "LL_REJECT_IND_EXT", reject_ind_ext, 2, true },
+ { 0x12, "LL_PING_REQ", null_pdu, 0, true },
+ { 0x13, "LL_PING_RSP", null_pdu, 0, true },
+ { 0x14, "LL_LENGTH_REQ", NULL, 8, true },
+ { 0x15, "LL_LENGTH_RSP", NULL, 8, true },
{ }
};
return "Unknown";
}
-void llcp_packet(const void *data, uint8_t size)
+void llcp_packet(const void *data, uint8_t size, bool padded)
{
uint8_t opcode = ((const uint8_t *) data)[0];
const struct llcp_data *llcp_data = NULL;
return;
}
- if (llcp_data->fixed) {
+ if (llcp_data->fixed && !padded) {
if (size - 1 != llcp_data->size) {
print_text(COLOR_ERROR, "invalid packet size");
packet_hexdump(data + 1, size - 1);