diff --git a/monitor/bt.h b/monitor/bt.h
index 214e035..c8adb8d 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
uint8_t features[8];
} __attribute__ ((packed));
+#define BT_HCI_CMD_LE_SET_RANDOM_ADDRESS 0x2005
+struct bt_hci_cmd_le_set_random_address {
+ uint8_t bdaddr[6];
+} __attribute__ ((packed));
+
#define BT_HCI_CMD_LE_READ_ADV_TX_POWER 0x2007
struct bt_hci_rsp_le_read_adv_tx_power {
uint8_t status;
diff --git a/monitor/packet.c b/monitor/packet.c
index 9edd0a8..26c0e9a 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
print_field("Num blocks: %d", btohs(rsp->num_blocks));
}
+static void le_set_event_mask_cmd(const void *data, uint8_t size)
+{
+ const struct bt_hci_cmd_le_set_event_mask *cmd = data;
+
+ print_event_mask(cmd->mask);
+}
+
static void le_read_buffer_size_rsp(const void *data, uint8_t size)
{
const struct bt_hci_rsp_le_read_buffer_size *rsp = data;
print_field("Num data packets: %d", rsp->le_max_pkt);
}
+static void le_read_local_features_rsp(const void *data, uint8_t size)
+{
+ const struct bt_hci_rsp_le_read_local_features *rsp = data;
+
+ print_status(rsp->status);
+ print_features(rsp->features);
+}
+
+static void le_set_random_address_cmd(const void *data, uint8_t size)
+{
+ const struct bt_hci_cmd_le_set_random_address *cmd = data;
+
+ print_bdaddr(cmd->bdaddr);
+}
+
+static void le_set_scan_parameters_cmd(const void *data, uint8_t size)
+{
+ const struct bt_hci_cmd_le_set_scan_parameters *cmd = data;
+ const char *str;
+
+ switch (cmd->type) {
+ case 0x00:
+ str = "Passive";
+ break;
+ case 0x01:
+ str = "Active";
+ break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ print_field("Type: %s (0x%2.2x)", str, cmd->type);
+
+ print_field("Interval: %.3f msec (0x%4.4x)",
+ cmd->interval * 0.625, cmd->interval);
+ print_field("Window: %.3f msec (0x%4.4x)",
+ cmd->window * 0.625, cmd->window);
+
+ switch (cmd->own_addr_type) {
+ case 0x00:
+ str = "Public";
+ break;
+ case 0x01:
+ str = "Random";
+ break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ print_field("Own address type: %s (0x%2.2x)", str, cmd->own_addr_type);
+
+ switch (cmd->filter_policy) {
+ case 0x00:
+ str = "Accept all advertisement";
+ break;
+ case 0x01:
+ str = "Ignore not in white list";
+ break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);
+}
+
+static void le_set_scan_enable_cmd(const void *data, uint8_t size)
+{
+ const struct bt_hci_cmd_le_set_scan_enable *cmd = data;
+ const char *str;
+
+ switch (cmd->enable) {
+ case 0x00:
+ str = "Disabled";
+ break;
+ case 0x01:
+ str = "Enabled";
+ break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ print_field("Scanning: %s (0x%2.2x)", str, cmd->enable);
+
+ switch (cmd->filter_dup) {
+ case 0x00:
+ str = "Disabled";
+ break;
+ case 0x01:
+ str = "Enabled";
+ break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ print_field("Filter duplicates: %s (0x%2.2x)", str, cmd->filter_dup);
+}
+
struct opcode_data {
uint16_t opcode;
const char *str;
{ 0x140b, "Write Remote AMP ASSOC" },
/* OGF 8 - LE Control */
- { 0x2001, "LE Set Event Mask" },
+ { 0x2001, "LE Set Event Mask",
+ le_set_event_mask_cmd, 8, true,
+ status_rsp, 1, true },
{ 0x2002, "LE Read Buffer Size",
null_cmd, 0, true,
le_read_buffer_size_rsp, 4, true },
- { 0x2003, "LE Read Local Supported Features" },
+ { 0x2003, "LE Read Local Supported Features",
+ null_cmd, 0, true,
+ le_read_local_features_rsp, 9, true },
/* reserved command */
- { 0x2005, "LE Set Random Address" },
+ { 0x2005, "LE Set Random Address",
+ le_set_random_address_cmd, 6, true,
+ status_rsp, 1, true },
{ 0x2006, "LE Set Advertising Parameters" },
{ 0x2007, "LE Read Advertising Channel TX Power"},
{ 0x2008, "LE Set Advertising Data" },
{ 0x2009, "LE Set Scan Response Data" },
{ 0x200a, "LE Set Advertise Enable" },
- { 0x200b, "LE Set Scan Parameters" },
- { 0x200c, "LE Set Scan Enable" },
+ { 0x200b, "LE Set Scan Parameters",
+ le_set_scan_parameters_cmd, 7, true,
+ status_rsp, 1, true },
+ { 0x200c, "LE Set Scan Enable",
+ le_set_scan_enable_cmd, 2, true,
+ status_rsp, 1, true },
{ 0x200d, "LE Create Connection" },
{ 0x200e, "LE Create Connection Cancel" },
{ 0x200f, "LE Read White List Size" },