diff mbox series

[BlueZ,2/3] monitor: Decode Add ADV monitor command

Message ID 20201029180756.BlueZ.2.I194824d306a62ad461fd47421c505a39fbdc1bf4@changeid
State New
Headers show
Series [BlueZ,1/3] monitor: Decode ADV Monitor read feature command | expand

Commit Message

Howard Chung Oct. 29, 2020, 10:09 a.m. UTC
Add support for Add Advertisement Monitor MGMT command and event.

@ MGMT Command: Add Advertisement Monitor (0x0052) plen 69
        Number of patterns: 2
          Pattern 1:
            AD type: 0
            Offset: 1
            Length: 2
            Value : ...
          Pattern 2:
            AD type: 1
            Offset: 10
            Length: 4
            Value : ...
@ MGMT Event: Advertisement Monitor Added (0x002b) plen 2
        Handle: 1
@ MGMT Event: Command Complete (0x0001) plen 5
      Add Advertisement Monitor (0x0052) plen 2
        Status: Success (0x00)
        Handle: 1

Reviewed-by: Miao-chen Chou <mcchou@chromium.org>
---

 monitor/packet.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)
diff mbox series

Patch

diff --git a/monitor/packet.c b/monitor/packet.c
index 2516cf970f9f..b3a6ed24d5fc 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -13196,6 +13196,42 @@  static void mgmt_read_adv_monitor_features_rsp(const void *data, uint16_t size)
 	mgmt_print_adv_monitor_handles(data + 13, size - 13);
 }
 
+static void mgmt_print_adv_monitor_patterns(const void *data, uint8_t len)
+{
+	uint8_t data_idx = 0, pattern_idx = 1;
+
+	/* Reference: struct mgmt_adv_pattern in lib/mgmt.h. */
+	while (data_idx + 34 <= len) {
+		uint8_t ad_type = get_u8(data + data_idx);
+		uint8_t offset = get_u8(data + data_idx + 1);
+		uint8_t length = get_u8(data + data_idx + 2);
+
+		print_field("  Pattern %d:", pattern_idx);
+		print_field("    AD type: %d", ad_type);
+		print_field("    Offset: %d", offset);
+		print_field("    Length: %d", length);
+		print_hex_field("    Value ", data + data_idx + 3, 31);
+
+		pattern_idx += 1;
+		data_idx += 34;
+	}
+}
+
+static void mgmt_add_adv_monitor_patterns_cmd(const void *data, uint16_t size)
+{
+	uint8_t pattern_count = get_u8(data);
+
+	print_field("Number of patterns: %d", pattern_count);
+	mgmt_print_adv_monitor_patterns(data + 1, size - 1);
+}
+
+static void mgmt_add_adv_monitor_patterns_rsp(const void *data, uint16_t size)
+{
+	uint16_t handle = get_le16(data);
+
+	print_field("Handle: %d", handle);
+}
+
 struct mgmt_data {
 	uint16_t opcode;
 	const char *str;
@@ -13430,6 +13466,9 @@  static const struct mgmt_data mgmt_command_table[] = {
 	{ 0x0051, "Read Advertisement Monitor Features",
 				mgmt_null_cmd, 0, true,
 				mgmt_read_adv_monitor_features_rsp, 13, false},
+	{ 0x0052, "Add Advertisement Monitor",
+				mgmt_add_adv_monitor_patterns_cmd, 1, false,
+				mgmt_add_adv_monitor_patterns_rsp, 2, true},
 	{ }
 };
 
@@ -13834,6 +13873,13 @@  static void mgmt_device_flags_changed_evt(const void *data, uint16_t size)
 	mgmt_print_added_device_flags("Current Flags", current_flags);
 }
 
+static void mgmt_adv_monitor_added_evt(const void *data, uint16_t size)
+{
+	uint16_t handle = get_le16(data);
+
+	print_field("Handle: %d", handle);
+}
+
 static void mgmt_controller_suspend_evt(const void *data, uint16_t size)
 {
 	uint8_t state = get_u8(data);
@@ -13963,6 +14009,8 @@  static const struct mgmt_data mgmt_event_table[] = {
 			mgmt_exp_feature_changed_evt, 20, true },
 	{ 0x002a, "Device Flags Changed",
 			mgmt_device_flags_changed_evt, 15, true },
+	{ 0x002b, "Advertisement Monitor Added",
+			mgmt_adv_monitor_added_evt, 2, true },
 	{ 0x002d, "Controller Suspended",
 			mgmt_controller_suspend_evt, 1, true },
 	{ 0x002e, "Controller Resumed",