2020-01-08 11:48:13

by Szymon Czapracki

[permalink] [raw]
Subject: [PATCH v2 1/8] monitor: Update periodic sync commands.

Change fields in periodic_adv_(create/term)_sync_cmd, according to their
description with 5.1 specification.

< HCI Command: LE Periodic Advertising Create Sync (0x08|0x0044) plen 14
Options: 0x0001
Use Periodic Advertiser List
Reporting initially enabled
SID: 0x00
Adv address type: Public (0x00)
Adv address: 00:00:00:00:00:00 (OUI 00-00-00)
Skip: 0x0000
Sync timeout: 0 msec (0x0000)
Sync CTE type: 0x0000
> HCI Event: Command Status (0x0f) plen 4
LE Periodic Advertising Create Sync (0x08|0x0044) ncmd 1
Status: Unknown HCI Command (0x01)
---
monitor/bt.h | 6 +--
monitor/packet.c | 96 ++++++++++++++++++++++++++++++++++++++++--------
2 files changed, 83 insertions(+), 19 deletions(-)

diff --git a/monitor/bt.h b/monitor/bt.h
index 8edc895e8..ecf3782c9 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -2371,13 +2371,13 @@ struct bt_hci_le_ext_create_conn {

#define BT_HCI_CMD_LE_PERIODIC_ADV_CREATE_SYNC 0x2044
struct bt_hci_cmd_le_periodic_adv_create_sync {
- uint8_t filter_policy;
+ uint8_t options;
uint8_t sid;
uint8_t addr_type;
uint8_t addr[6];
uint16_t skip;
uint16_t sync_timeout;
- uint8_t unused;
+ uint8_t sync_cte_type;
} __attribute__ ((packed));

#define BT_HCI_CMD_LE_PERIODIC_ADV_CREATE_SYNC_CANCEL 0x2045
@@ -3108,7 +3108,7 @@ struct bt_hci_le_per_adv_report {
uint16_t handle;
uint8_t tx_power;
int8_t rssi;
- uint8_t unused;
+ uint8_t cte_type;
uint8_t data_status;
uint8_t data_len;
uint8_t data[0];
diff --git a/monitor/packet.c b/monitor/packet.c
index ab8bbdee5..64f75cf8e 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -7321,24 +7321,70 @@ static void le_ext_create_conn_cmd(const void *data, uint8_t size)
print_ext_conn_phys(cmd->data, cmd->phys);
}

-static void le_periodic_adv_create_sync_cmd(const void *data, uint8_t size)
+static const struct bitfield_data create_sync_cte_type[] = {
+ { 0, "Do not sync to packets with AoA CTE" },
+ { 1, "Do not sync to packets with AoD CTE 1us" },
+ { 2, "Do not sync to packets with AoD CTE 2us" },
+ { 3, "Do not sync to packets with type 3 AoD" },
+ { 4, "Do not sync to packets without CTE" },
+ { },
+};
+
+static const struct bitfield_data create_sync_options[] = {
+ { 0, "Use Periodic Advertiser List" },
+ { 1, "Reporting initially disabled" },
+ { },
+};
+
+static const struct bitfield_data create_sync_options_alt[] = {
+ { 0, "Use advertising SID, Advertiser Address Type and address"},
+ { 1, "Reporting initially enabled" },
+ { },
+};
+
+static void print_create_sync_cte_type(uint8_t flags)
{
- const struct bt_hci_cmd_le_periodic_adv_create_sync *cmd = data;
- const char *str;
+ uint8_t mask = flags;

- switch (cmd->filter_policy) {
- case 0x00:
- str = "Use specified advertising parameters";
- break;
- case 0x01:
- str = "Use Periodic Advertiser List";
- break;
- default:
- str = "Reserved";
- break;
+ print_field("Sync CTE type: 0x%4.4x", flags);
+
+ mask = print_bitfield(2, flags, create_sync_cte_type);
+
+ if (mask) {
+ print_text(COLOR_UNKNOWN_ADV_FLAG,
+ "Unknown sync CTE type properties (0x%4.4x)",
+ mask);
}
+}

- print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);
+static void print_create_sync_options(uint8_t flags)
+{
+ uint8_t mask = flags;
+ int i;
+
+ print_field("Options: 0x%4.4x", flags);
+
+ for (i = 0; create_sync_options[i].str; i++) {
+ if (flags & (1 << create_sync_options[i].bit)) {
+ print_field("%s", create_sync_options[i].str);
+ mask &= ~(1 << create_sync_options[i].bit);
+ } else {
+ print_field("%s", create_sync_options_alt[i].str);
+ mask &= ~(1 << create_sync_options_alt[i].bit);
+ }
+ }
+
+ if (mask) {
+ print_text(COLOR_UNKNOWN_ADV_FLAG,
+ " Unknown options (0x%4.4x)", mask);
+ }
+}
+
+static void le_periodic_adv_create_sync_cmd(const void *data, uint8_t size)
+{
+ const struct bt_hci_cmd_le_periodic_adv_create_sync *cmd = data;
+
+ print_create_sync_options(cmd->options);
print_field("SID: 0x%2.2x", cmd->sid);
print_addr_type("Adv address type", cmd->addr_type);
print_addr("Adv address", cmd->addr, cmd->addr_type);
@@ -7346,7 +7392,7 @@ static void le_periodic_adv_create_sync_cmd(const void *data, uint8_t size)
print_field("Sync timeout: %d msec (0x%4.4x)",
le16_to_cpu(cmd->sync_timeout) * 10,
le16_to_cpu(cmd->sync_timeout));
- print_field("Unused: 0x%2.2x", cmd->unused);
+ print_create_sync_cte_type(cmd->sync_cte_type);
}

static void le_periodic_adv_term_sync_cmd(const void *data, uint8_t size)
@@ -9648,7 +9694,25 @@ static void le_per_adv_report_evt(const void *data, uint8_t size)
else
print_field("RSSI: reserved (0x%2.2x)",
(uint8_t) evt->rssi);
- print_field("Unused: (0x%2.2x)", evt->unused);
+
+ switch (evt->cte_type) {
+ case 0x00:
+ str = "AoA Constant Tone Extension";
+ break;
+ case 0x01:
+ str = "AoA Constant Tone Extension with 1us slots";
+ break;
+ case 0x02:
+ str = "AoD Constant Tone Extension with 2us slots";
+ break;
+ case 0xff:
+ str = "No Constant Tone Extension";
+ break;
+ default:
+ str = "Reserved";
+ color_on = COLOR_RED;
+ break;
+ }

switch (evt->data_status) {
case 0x00:
--
2.24.1


2020-01-08 11:48:13

by Szymon Czapracki

[permalink] [raw]
Subject: [PATCH v2 2/8] monitor: Decode LE Periodic Advertising Sync Transfer Received Event

---
monitor/bt.h | 14 ++++++++++++++
monitor/packet.c | 21 +++++++++++++++++++++
2 files changed, 35 insertions(+)

diff --git a/monitor/bt.h b/monitor/bt.h
index ecf3782c9..e14c1771f 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -3140,6 +3140,20 @@ struct bt_hci_evt_le_chan_select_alg {
uint8_t algorithm;
} __attribute__ ((packed));

+#define BT_HCI_EVT_LE_PER_ADV_SYNC_TRANS_REC 0x18
+struct bt_hci_evt_le_per_adv_sync_trans_rec {
+ uint8_t status;
+ uint16_t handle;
+ uint16_t service_data;
+ uint16_t sync_handle;
+ uint8_t sid;
+ uint8_t addr_type;
+ uint8_t addr[6];
+ uint8_t phy;
+ uint16_t interval;
+ uint8_t clock_accuracy;
+} __attribute__ ((packed));
+
#define BT_HCI_ERR_SUCCESS 0x00
#define BT_HCI_ERR_UNKNOWN_COMMAND 0x01
#define BT_HCI_ERR_UNKNOWN_CONN_ID 0x02
diff --git a/monitor/packet.c b/monitor/packet.c
index 64f75cf8e..8e5219bef 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -9788,6 +9788,24 @@ static void le_chan_select_alg_evt(const void *data, uint8_t size)
print_field("Algorithm: %s (0x%2.2x)", str, evt->algorithm);
}

+static void le_per_adv_sync_trans_rec_evt(const void *data, uint8_t size)
+{
+ const struct bt_hci_evt_le_per_adv_sync_trans_rec *evt = data;
+
+ print_status(evt->status);
+ print_field("Handle: %d", evt->handle);
+ print_field("Connection handle: %d", evt->handle);
+ print_field("Service data: 0x%4.4x", evt->service_data);
+ print_field("Sync handle: %d", evt->sync_handle);
+ print_field("SID: 0x%2.2x", evt->sid);
+ print_peer_addr_type("Address type:", evt->addr_type);
+ print_addr("Addres:", evt->addr, evt->addr_type);
+ print_le_phy("PHY:", evt->phy);
+ print_field("Periodic advertising Interval: %.3f",
+ 1.25 * evt->interval);
+ print_clock_accuracy(evt->clock_accuracy);
+}
+
struct subevent_data {
uint8_t subevent;
const char *str;
@@ -9871,6 +9889,9 @@ static const struct subevent_data le_meta_event_table[] = {
le_scan_req_received_evt, 8, true},
{ 0x14, "LE Channel Selection Algorithm",
le_chan_select_alg_evt, 3, true},
+ { 0x18, "LE Periodic Advertising Sync Transfer Received",
+ le_per_adv_sync_trans_rec_evt, 19,
+ true},
{ }
};

--
2.24.1

2020-01-08 11:48:15

by Szymon Czapracki

[permalink] [raw]
Subject: [PATCH v2 4/8] monitor: Decode LE Periodic Advertising Sync Transfer command

< HCI Command: LE Periodic Advertising Sync Transfer (0x08|0x005a) plen 6
Connection handle: 1
Service data: 0x0001
Sync handle: 1
> HCI Event: Command Status (0x0f) plen 4
LE Periodic Advertising Sync Transfer (0x08|0x005a) ncmd 1
Status: Unknown HCI Command (0x01)
---
monitor/bt.h | 7 +++++++
monitor/packet.c | 20 ++++++++++++++++++++
2 files changed, 27 insertions(+)

diff --git a/monitor/bt.h b/monitor/bt.h
index bb373b528..efaf80f55 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -2467,6 +2467,13 @@ struct bt_hci_cmd_set_periodic_adv_rec_enable {
uint8_t enable;
} __attribute__ ((packed));

+#define BT_HCI_CMD_PERIODIC_SYNC_TRANS 0x205a
+struct bt_hci_cmd_periodic_sync_trans {
+ uint16_t handle;
+ uint16_t service_data;
+ uint16_t sync_handle;
+} __attribute__ ((packed));
+
#define BT_HCI_EVT_INQUIRY_COMPLETE 0x01
struct bt_hci_evt_inquiry_complete {
uint8_t status;
diff --git a/monitor/packet.c b/monitor/packet.c
index e5681b5ff..23eb48374 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -4019,6 +4019,14 @@ static void status_rsp(const void *data, uint8_t size)
print_status(status);
}

+static void status_handle_rsp(const void *data, uint8_t size)
+{
+ uint8_t status = *((const uint8_t *) data);
+
+ print_status(status);
+ print_field("Connection handle: %d", get_u8(data + 1));
+}
+
static void status_bdaddr_rsp(const void *data, uint8_t size)
{
uint8_t status = *((const uint8_t *) data);
@@ -7592,6 +7600,15 @@ static void le_periodic_adv_rec_enable(const void *data, uint8_t size)
print_enable("Reporting", cmd->enable);
}

+static void le_periodic_adv_sync_trans(const void *data, uint8_t size)
+{
+ const struct bt_hci_cmd_periodic_sync_trans *cmd = data;
+
+ print_field("Connection handle: %d", cmd->handle);
+ print_field("Service data: 0x%4.4x", cmd->service_data);
+ print_field("Sync handle: %d", cmd->sync_handle);
+}
+
struct opcode_data {
uint16_t opcode;
int bit;
@@ -8388,6 +8405,9 @@ static const struct opcode_data opcode_table[] = {
{ 0x2059, 325, "LE Periodic Advertising Receive Enable",
le_periodic_adv_rec_enable, 3, true,
status_rsp, 1, true },
+ { 0x205a, 326, "LE Periodic Advertising Sync Transfer",
+ le_periodic_adv_sync_trans, 6, true,
+ status_handle_rsp, 3, true },
{ }
};

--
2.24.1

2020-01-08 11:49:06

by Szymon Czapracki

[permalink] [raw]
Subject: [PATCH v2 3/8] monitor: Decode LE Set Periodic Advertising Receive Enable command

< HCI Command: LE Periodic Advertising Receive Enable (0x08|0x0059) plen 3
Sync handle: 0
Reporting: Enabled (0x01)
> HCI Event: Command Status (0x0f) plen 4
LE Periodic Advertising Receive Enable (0x08|0x0059) ncmd 1
Status: Unknown HCI Command (0x01)
---
monitor/bt.h | 6 ++++++
monitor/packet.c | 11 +++++++++++
2 files changed, 17 insertions(+)

diff --git a/monitor/bt.h b/monitor/bt.h
index e14c1771f..bb373b528 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -2461,6 +2461,12 @@ struct bt_hci_cmd_le_tx_test_v3 {
uint8_t antenna_ids[0];
} __attribute__ ((packed));

+#define BT_HCI_CMD_SET_PERIODIC_ADV_REC_ENABLE 0x2059
+struct bt_hci_cmd_set_periodic_adv_rec_enable {
+ uint16_t sync_handle;
+ uint8_t enable;
+} __attribute__ ((packed));
+
#define BT_HCI_EVT_INQUIRY_COMPLETE 0x01
struct bt_hci_evt_inquiry_complete {
uint8_t status;
diff --git a/monitor/packet.c b/monitor/packet.c
index 8e5219bef..e5681b5ff 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -7584,6 +7584,14 @@ static void le_tx_test_cmd_v3(const void *data, uint8_t size)
print_field(" Antenna ID: %u", cmd->antenna_ids[i]);
}

+static void le_periodic_adv_rec_enable(const void *data, uint8_t size)
+{
+ const struct bt_hci_cmd_le_set_periodic_adv_enable *cmd = data;
+
+ print_field("Sync handle: %d", cmd->handle);
+ print_enable("Reporting", cmd->enable);
+}
+
struct opcode_data {
uint16_t opcode;
int bit;
@@ -8377,6 +8385,9 @@ static const struct opcode_data opcode_table[] = {
{ 0x2050, 316, "LE Transmitter Test command [v3]",
le_tx_test_cmd_v3, 9, false,
status_rsp, 1, true },
+ { 0x2059, 325, "LE Periodic Advertising Receive Enable",
+ le_periodic_adv_rec_enable, 3, true,
+ status_rsp, 1, true },
{ }
};

--
2.24.1

2020-01-08 11:49:06

by Szymon Czapracki

[permalink] [raw]
Subject: [PATCH v2 5/8] monitor: Decode LE Periodic Advertising Set Info Transfer command

< HCI Command: LE Periodic Advertising Set Info Transfer (0x08|0x005b) plen 5
Connection handle: 1
Service data: 0x0000
Advertising handle: 0
> HCI Event: Command Status (0x0f) plen 4
LE Periodic Advertising Set Info Transfer (0x08|0x005b) ncmd 1
Status: Unknown HCI Command (0x01)
---
monitor/bt.h | 7 +++++++
monitor/packet.c | 12 ++++++++++++
2 files changed, 19 insertions(+)

diff --git a/monitor/bt.h b/monitor/bt.h
index efaf80f55..f8422ccc9 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -2474,6 +2474,13 @@ struct bt_hci_cmd_periodic_sync_trans {
uint16_t sync_handle;
} __attribute__ ((packed));

+#define BT_HCI_CMD_PERIODIC_ADV_SET_INFO_TRANS 0x205b
+struct bt_hci_cmd_periodic_adv_set_info_trans {
+ uint16_t handle;
+ uint16_t service_data;
+ uint16_t adv_handle;
+} __attribute__ ((packed));
+
#define BT_HCI_EVT_INQUIRY_COMPLETE 0x01
struct bt_hci_evt_inquiry_complete {
uint8_t status;
diff --git a/monitor/packet.c b/monitor/packet.c
index 23eb48374..34b3d1895 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -7609,6 +7609,15 @@ static void le_periodic_adv_sync_trans(const void *data, uint8_t size)
print_field("Sync handle: %d", cmd->sync_handle);
}

+static void le_periodic_adv_set_info_trans(const void *data, uint8_t size)
+{
+ const struct bt_hci_cmd_periodic_adv_set_info_trans *cmd = data;
+
+ print_field("Connection handle: %d", cmd->handle);
+ print_field("Service data: 0x%4.4x", cmd->service_data);
+ print_field("Advertising handle: %d", cmd->adv_handle);
+}
+
struct opcode_data {
uint16_t opcode;
int bit;
@@ -8408,6 +8417,9 @@ static const struct opcode_data opcode_table[] = {
{ 0x205a, 326, "LE Periodic Advertising Sync Transfer",
le_periodic_adv_sync_trans, 6, true,
status_handle_rsp, 3, true },
+ { 0x205b, 327, "LE Periodic Advertising Set Info Transfer",
+ le_periodic_adv_set_info_trans, 5, true,
+ status_handle_rsp, 3, true },
{ }
};

--
2.24.1

2020-01-08 11:49:21

by Szymon Czapracki

[permalink] [raw]
Subject: [PATCH v2 7/8] monitor: Decode LE Set Default Periodic Adv Sync Transfer Params. command

< HCI Command: LE Set Default Periodic Advertisng Sync Transfer Parameters (0x08|0x005d) plen 6
Mode: Enabled with report events disabled (0x01)
Skip: 0x00
Sync timeout: 0 msec (0x0000)
Sync CTE type: 0x0000
> HCI Event: Command Status (0x0f) plen 4
LE Set Default Periodic Advertisng Sync Transfer Parameters (0x08|0x005d) ncmd 1
Status: Unknown HCI Command (0x01)
---
monitor/bt.h | 8 ++++++++
monitor/packet.c | 17 +++++++++++++++++
2 files changed, 25 insertions(+)

diff --git a/monitor/bt.h b/monitor/bt.h
index 2ec2ea0a7..1859dfb21 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -2490,6 +2490,14 @@ struct bt_hci_cmd_periodic_adv_sync_trans_params {
uint8_t cte_type;
} __attribute__ ((packed));

+#define BT_HCI_CMD_DEFAULT_PERIODIC_ADV_SYNC_TRANS_PARAMS 0x205d
+struct bt_hci_cmd_default_periodic_adv_sync_trans_params {
+ uint8_t mode;
+ uint16_t skip;
+ uint16_t sync_timeout;
+ uint8_t cte_type;
+} __attribute__ ((packed));
+
#define BT_HCI_EVT_INQUIRY_COMPLETE 0x01
struct bt_hci_evt_inquiry_complete {
uint8_t status;
diff --git a/monitor/packet.c b/monitor/packet.c
index 74c73f145..9d22dfc15 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -7653,6 +7653,19 @@ static void le_periodic_adv_sync_trans_params(const void *data, uint8_t size)
print_create_sync_cte_type(cmd->cte_type);
}

+static void le_set_default_periodic_adv_sync_trans_params(const void *data,
+ uint8_t size)
+{
+ const struct bt_hci_cmd_default_periodic_adv_sync_trans_params *cmd = data;
+
+ print_sync_mode(cmd->mode);
+ print_field("Skip: 0x%2.2x", cmd->skip);
+ print_field("Sync timeout: %d msec (0x%4.4x)",
+ le16_to_cpu(cmd->sync_timeout) * 10,
+ le16_to_cpu(cmd->sync_timeout));
+ print_create_sync_cte_type(cmd->cte_type);
+}
+
struct opcode_data {
uint16_t opcode;
int bit;
@@ -8458,6 +8471,10 @@ static const struct opcode_data opcode_table[] = {
{ 0x205c, 328, "LE Periodic Advertising Sync Transfer Parameters",
le_periodic_adv_sync_trans_params, 8, true,
status_handle_rsp, 3, true},
+ { 0x205d, 329, "LE Set Default Periodic Advertisng Sync Transfer "
+ "Parameters",
+ le_set_default_periodic_adv_sync_trans_params,
+ 6, true, status_rsp, 1, true},
{ }
};

--
2.24.1

2020-01-08 11:50:09

by Szymon Czapracki

[permalink] [raw]
Subject: [PATCH v2 6/8] monitor: Decode LE Set Periodic Adv Sync Transfer Parameterers command

< HCI Command: LE Periodic Advertising Sync Transfer Parameters (0x08|0x005c) plen 8
Connection handle: 1
Mode: Disabled (0x00)
Skip: 0x00
Sync timeout: 0 msec (0x0000)
Sync CTE type: 0x0000
> HCI Event: Command Status (0x0f) plen 4
LE Periodic Advertising Sync Transfer Parameters (0x08|0x005c) ncmd 1
Status: Unknown HCI Command (0x01)
---
monitor/bt.h | 9 +++++++++
monitor/packet.c | 38 ++++++++++++++++++++++++++++++++++++++
2 files changed, 47 insertions(+)

diff --git a/monitor/bt.h b/monitor/bt.h
index f8422ccc9..2ec2ea0a7 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -2481,6 +2481,15 @@ struct bt_hci_cmd_periodic_adv_set_info_trans {
uint16_t adv_handle;
} __attribute__ ((packed));

+#define BT_HCI_CMD_PERIODIC_ADV_SYNC_TRANS_PARAMS 0x205c
+struct bt_hci_cmd_periodic_adv_sync_trans_params {
+ uint16_t handle;
+ uint8_t mode;
+ uint16_t skip;
+ uint16_t sync_timeout;
+ uint8_t cte_type;
+} __attribute__ ((packed));
+
#define BT_HCI_EVT_INQUIRY_COMPLETE 0x01
struct bt_hci_evt_inquiry_complete {
uint8_t status;
diff --git a/monitor/packet.c b/monitor/packet.c
index 34b3d1895..74c73f145 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -7618,6 +7618,41 @@ static void le_periodic_adv_set_info_trans(const void *data, uint8_t size)
print_field("Advertising handle: %d", cmd->adv_handle);
}

+static void print_sync_mode(uint8_t mode)
+{
+ const char *str;
+
+ switch (mode) {
+ case 0x00:
+ str = "Disabled";
+ break;
+ case 0x01:
+ str = "Enabled with report events disabled";
+ break;
+ case 0x02:
+ str = "Enabled with report events enabled";
+ break;
+ default:
+ str = "RFU";
+ break;
+ }
+
+ print_field("Mode: %s (0x%2.2x)", str, mode);
+}
+
+static void le_periodic_adv_sync_trans_params(const void *data, uint8_t size)
+{
+ const struct bt_hci_cmd_periodic_adv_sync_trans_params *cmd = data;
+
+ print_field("Connection handle: %d", cmd->handle);
+ print_sync_mode(cmd->mode);
+ print_field("Skip: 0x%2.2x", cmd->skip);
+ print_field("Sync timeout: %d msec (0x%4.4x)",
+ le16_to_cpu(cmd->sync_timeout) * 10,
+ le16_to_cpu(cmd->sync_timeout));
+ print_create_sync_cte_type(cmd->cte_type);
+}
+
struct opcode_data {
uint16_t opcode;
int bit;
@@ -8420,6 +8455,9 @@ static const struct opcode_data opcode_table[] = {
{ 0x205b, 327, "LE Periodic Advertising Set Info Transfer",
le_periodic_adv_set_info_trans, 5, true,
status_handle_rsp, 3, true },
+ { 0x205c, 328, "LE Periodic Advertising Sync Transfer Parameters",
+ le_periodic_adv_sync_trans_params, 8, true,
+ status_handle_rsp, 3, true},
{ }
};

--
2.24.1

2020-01-08 11:50:10

by Szymon Czapracki

[permalink] [raw]
Subject: [PATCH v2 8/8] monitor: Decode LE CTE Request Failed event

---
monitor/bt.h | 6 ++++++
monitor/packet.c | 10 ++++++++++
2 files changed, 16 insertions(+)

diff --git a/monitor/bt.h b/monitor/bt.h
index 1859dfb21..b31e6c5c5 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -3177,6 +3177,12 @@ struct bt_hci_evt_le_chan_select_alg {
uint8_t algorithm;
} __attribute__ ((packed));

+#define BT_HCI_EVT_LE_CTE_REQUEST_FAILED 0x17
+struct bt_hci_evt_le_cte_request_failed {
+ uint8_t status;
+ uint16_t handle;
+} __attribute__ ((packed));
+
#define BT_HCI_EVT_LE_PER_ADV_SYNC_TRANS_REC 0x18
struct bt_hci_evt_le_per_adv_sync_trans_rec {
uint8_t status;
diff --git a/monitor/packet.c b/monitor/packet.c
index 9d22dfc15..415a6abfa 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -9886,6 +9886,14 @@ static void le_chan_select_alg_evt(const void *data, uint8_t size)
print_field("Algorithm: %s (0x%2.2x)", str, evt->algorithm);
}

+static void le_cte_request_failed_evt(const void *data, uint8_t size)
+{
+ const struct bt_hci_evt_le_cte_request_failed *evt = data;
+
+ print_status(evt->status);
+ print_field("Connection handle: %d", evt->handle);
+}
+
static void le_per_adv_sync_trans_rec_evt(const void *data, uint8_t size)
{
const struct bt_hci_evt_le_per_adv_sync_trans_rec *evt = data;
@@ -9987,6 +9995,8 @@ static const struct subevent_data le_meta_event_table[] = {
le_scan_req_received_evt, 8, true},
{ 0x14, "LE Channel Selection Algorithm",
le_chan_select_alg_evt, 3, true},
+ { 0x17, "LE CTE Request Failed",
+ le_cte_request_failed_evt, 3, true},
{ 0x18, "LE Periodic Advertising Sync Transfer Received",
le_per_adv_sync_trans_rec_evt, 19,
true},
--
2.24.1

2020-01-09 11:40:40

by Szymon Janc

[permalink] [raw]
Subject: Re: [PATCH v2 1/8] monitor: Update periodic sync commands.

Hi Szymon,

On Wednesday, 8 January 2020 12:47:45 CET Szymon Czapracki wrote:
> Change fields in periodic_adv_(create/term)_sync_cmd, according to their
> description with 5.1 specification.
>
> < HCI Command: LE Periodic Advertising Create Sync (0x08|0x0044) plen 14
> Options: 0x0001
> Use Periodic Advertiser List
> Reporting initially enabled
> SID: 0x00
> Adv address type: Public (0x00)
> Adv address: 00:00:00:00:00:00 (OUI 00-00-00)
> Skip: 0x0000
> Sync timeout: 0 msec (0x0000)
> Sync CTE type: 0x0000
>
> > HCI Event: Command Status (0x0f) plen 4
>
> LE Periodic Advertising Create Sync (0x08|0x0044) ncmd 1
> Status: Unknown HCI Command (0x01)
> ---
> monitor/bt.h | 6 +--
> monitor/packet.c | 96 ++++++++++++++++++++++++++++++++++++++++--------
> 2 files changed, 83 insertions(+), 19 deletions(-)
>
> diff --git a/monitor/bt.h b/monitor/bt.h
> index 8edc895e8..ecf3782c9 100644
> --- a/monitor/bt.h
> +++ b/monitor/bt.h
> @@ -2371,13 +2371,13 @@ struct bt_hci_le_ext_create_conn {
>
> #define BT_HCI_CMD_LE_PERIODIC_ADV_CREATE_SYNC 0x2044
> struct bt_hci_cmd_le_periodic_adv_create_sync {
> - uint8_t filter_policy;
> + uint8_t options;
> uint8_t sid;
> uint8_t addr_type;
> uint8_t addr[6];
> uint16_t skip;
> uint16_t sync_timeout;
> - uint8_t unused;
> + uint8_t sync_cte_type;
> } __attribute__ ((packed));
>
> #define BT_HCI_CMD_LE_PERIODIC_ADV_CREATE_SYNC_CANCEL 0x2045
> @@ -3108,7 +3108,7 @@ struct bt_hci_le_per_adv_report {
> uint16_t handle;
> uint8_t tx_power;
> int8_t rssi;
> - uint8_t unused;
> + uint8_t cte_type;
> uint8_t data_status;
> uint8_t data_len;
> uint8_t data[0];
> diff --git a/monitor/packet.c b/monitor/packet.c
> index ab8bbdee5..64f75cf8e 100644
> --- a/monitor/packet.c
> +++ b/monitor/packet.c
> @@ -7321,24 +7321,70 @@ static void le_ext_create_conn_cmd(const void *data,
> uint8_t size) print_ext_conn_phys(cmd->data, cmd->phys);
> }
>
> -static void le_periodic_adv_create_sync_cmd(const void *data, uint8_t size)
> +static const struct bitfield_data create_sync_cte_type[] = {
> + { 0, "Do not sync to packets with AoA CTE" },
> + { 1, "Do not sync to packets with AoD CTE 1us" },
> + { 2, "Do not sync to packets with AoD CTE 2us" },
> + { 3, "Do not sync to packets with type 3 AoD" },
> + { 4, "Do not sync to packets without CTE" },
> + { },
> +};
> +
> +static const struct bitfield_data create_sync_options[] = {
> + { 0, "Use Periodic Advertiser List" },
> + { 1, "Reporting initially disabled" },
> + { },
> +};
> +
> +static const struct bitfield_data create_sync_options_alt[] = {
> + { 0, "Use advertising SID, Advertiser Address Type and address"},
> + { 1, "Reporting initially enabled"
},
> + { },
> +};
> +
> +static void print_create_sync_cte_type(uint8_t flags)
> {
> - const struct bt_hci_cmd_le_periodic_adv_create_sync *cmd = data;
> - const char *str;
> + uint8_t mask = flags;
>
> - switch (cmd->filter_policy) {
> - case 0x00:
> - str = "Use specified advertising parameters";
> - break;
> - case 0x01:
> - str = "Use Periodic Advertiser List";
> - break;
> - default:
> - str = "Reserved";
> - break;
> + print_field("Sync CTE type: 0x%4.4x", flags);
> +
> + mask = print_bitfield(2, flags, create_sync_cte_type);
> +
> + if (mask) {
> + print_text(COLOR_UNKNOWN_ADV_FLAG,
> + "Unknown sync CTE type properties
(0x%4.4x)",
> +
mask);
> }
> +}
>
> - print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);
> +static void print_create_sync_options(uint8_t flags)
> +{
> + uint8_t mask = flags;
> + int i;
> +
> + print_field("Options: 0x%4.4x", flags);
> +
> + for (i = 0; create_sync_options[i].str; i++) {
> + if (flags & (1 << create_sync_options[i].bit)) {
> + print_field("%s", create_sync_options[i].str);
> + mask &= ~(1 << create_sync_options[i].bit);
> + } else {
> + print_field("%s",
create_sync_options_alt[i].str);
> + mask &= ~(1 << create_sync_options_alt[i].bit);
> + }
> + }
> +
> + if (mask) {
> + print_text(COLOR_UNKNOWN_ADV_FLAG,
> + " Unknown options
(0x%4.4x)", mask);
> + }
> +}
> +
> +static void le_periodic_adv_create_sync_cmd(const void *data, uint8_t size)
> +{
> + const struct bt_hci_cmd_le_periodic_adv_create_sync *cmd = data;
> +
> + print_create_sync_options(cmd->options);
> print_field("SID: 0x%2.2x", cmd->sid);
> print_addr_type("Adv address type", cmd->addr_type);
> print_addr("Adv address", cmd->addr, cmd->addr_type);
> @@ -7346,7 +7392,7 @@ static void le_periodic_adv_create_sync_cmd(const void
> *data, uint8_t size) print_field("Sync timeout: %d msec (0x%4.4x)",
> le16_to_cpu(cmd-
>sync_timeout) * 10,
> le16_to_cpu(cmd-
>sync_timeout));
> - print_field("Unused: 0x%2.2x", cmd->unused);
> + print_create_sync_cte_type(cmd->sync_cte_type);
> }
>
> static void le_periodic_adv_term_sync_cmd(const void *data, uint8_t size)
> @@ -9648,7 +9694,25 @@ static void le_per_adv_report_evt(const void *data,
> uint8_t size) else
> print_field("RSSI: reserved (0x%2.2x)",
> (uint8_t) evt-
>rssi);
> - print_field("Unused: (0x%2.2x)", evt->unused);
> +
> + switch (evt->cte_type) {
> + case 0x00:
> + str = "AoA Constant Tone Extension";
> + break;
> + case 0x01:
> + str = "AoA Constant Tone Extension with 1us slots";
> + break;
> + case 0x02:
> + str = "AoD Constant Tone Extension with 2us slots";
> + break;
> + case 0xff:
> + str = "No Constant Tone Extension";
> + break;
> + default:
> + str = "Reserved";
> + color_on = COLOR_RED;
> + break;
> + }
>
> switch (evt->data_status) {
> case 0x00:

All patches in this set are now applied, thanks.
Note that I fixed small typo before pushing (addres -> address)

--
pozdrawiam
Szymon Janc