diff mbox series

[bluez,v1,1/3] btmgmt: Add btmgmt command advmon-features

Message ID 20200616000318.42664-2-michaelfsun@google.com (mailing list archive)
State New, archived
Headers show
Series Add new commands in btmgmt to support adv monitor | expand

Commit Message

Michael Sun June 16, 2020, 12:03 a.m. UTC
This patch introduces a new btmgmt command ‘advmon-features’ to help
user query for supported advertisement features. The command will work
with the new MGMT opcode MGMT_OP_READ_ADV_MONITOR_FEATURES.

Reviewed-by: Alain Michaud <alainm@chromium.org>
Reviewed-by: Miao-chen Chou <mcchou@chromium.org>
Signed-off-by: Michael Sun <michaelfsun@google.com>
---

 tools/btmgmt.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)

Comments

bluez.test.bot@gmail.com June 16, 2020, 12:12 a.m. UTC | #1
This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
While we are preparing for reviewing the patches, we found the following
issue/warning.

Test Result:
checkpatch Failed

Outputs:
WARNING:STATIC_CONST_CHAR_ARRAY: static const char * array should probably be static const char * const
#25: FILE: tools/btmgmt.c:4570:
+static const char *advmon_features_str[] = {

WARNING:BRACES: braces {} are not necessary for single statement blocks
#81: FILE: tools/btmgmt.c:4626:
+	for (i = 0; i < num_handles; i++) {
+		print("\t0x%04x ", le16_to_cpu(rp->handles[i]));
+	}

- total: 0 errors, 2 warnings, 93 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

Your patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPLIT_STRING

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.



---
Regards,
Linux Bluetooth
bluez.test.bot@gmail.com June 16, 2020, 12:13 a.m. UTC | #2
This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
While we are preparing for reviewing the patches, we found the following
issue/warning.

Test Result:
checkbuild Failed

Outputs:
ar: `u' modifier ignored since `D' is the default (see `U')
ar: `u' modifier ignored since `D' is the default (see `U')
ar: `u' modifier ignored since `D' is the default (see `U')
ar: `u' modifier ignored since `D' is the default (see `U')
ar: `u' modifier ignored since `D' is the default (see `U')
tools/btmgmt.c: In function ‘advmon_features2str’:
tools/btmgmt.c:4608:16: error: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Werror=sign-compare]
 4608 |  for (i = 0; i < NELEM(advmon_features_str); i++) {
      |                ^
tools/btmgmt.c:4609:41: error: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Werror=sign-compare]
 4609 |   if ((features & (1 << i)) != 0 && off < sizeof(str))
      |                                         ^
tools/btmgmt.c: In function ‘str2pattern’:
tools/btmgmt.c:4692:44: error: unused variable ‘length’ [-Werror=unused-variable]
 4692 |  int type_len, offset_len, offset_end_pos, length, str_len;
      |                                            ^~~~~~
tools/btmgmt.c: In function ‘cmd_advmon_add’:
tools/btmgmt.c:4771:12: error: invalid application of ‘sizeof’ to incomplete type ‘struct mgmt_cp_add_adv_patterns_monitor’
 4771 |     sizeof(struct mgmt_cp_add_adv_patterns_monitor) +
      |            ^~~~~~
tools/btmgmt.c:4776:6: error: dereferencing pointer to incomplete type ‘struct mgmt_cp_add_adv_patterns_monitor’
 4776 |      ->pattern_count = pattern_count;
      |      ^~
tools/btmgmt.c:4799:23: error: ‘MGMT_OP_ADD_ADV_PATTERNS_MONITOR’ undeclared (first use in this function); did you mean ‘MGMT_OP_ADD_ADV_MONITOR’?
 4799 |  if (!mgmt_send(mgmt, MGMT_OP_ADD_ADV_PATTERNS_MONITOR, index, cp_len,
      |                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                       MGMT_OP_ADD_ADV_MONITOR
tools/btmgmt.c:4799:23: note: each undeclared identifier is reported only once for each function it appears in
tools/btmgmt.c:4744:11: error: unused variable ‘i’ [-Werror=unused-variable]
 4744 |  int opt, i;
      |           ^
cc1: all warnings being treated as errors
make[1]: *** [Makefile:6791: tools/btmgmt.o] Error 1
make: *** [Makefile:4010: all] Error 2



---
Regards,
Linux Bluetooth
Von Dentz, Luiz June 16, 2020, 1:34 a.m. UTC | #3
Hi Michael,

On Mon, Jun 15, 2020 at 5:03 PM Michael Sun <michaelfsun@google.com> wrote:
>
> This patch introduces a new btmgmt command ‘advmon-features’ to help
> user query for supported advertisement features. The command will work
> with the new MGMT opcode MGMT_OP_READ_ADV_MONITOR_FEATURES.
>
> Reviewed-by: Alain Michaud <alainm@chromium.org>
> Reviewed-by: Miao-chen Chou <mcchou@chromium.org>
> Signed-off-by: Michael Sun <michaelfsun@google.com>
> ---
>
>  tools/btmgmt.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 81 insertions(+)
>
> diff --git a/tools/btmgmt.c b/tools/btmgmt.c
> index 46e7465b3..1aae7098c 100644
> --- a/tools/btmgmt.c
> +++ b/tools/btmgmt.c
> @@ -4567,6 +4567,84 @@ static void cmd_wbs(int argc, char **argv)
>         cmd_setting(MGMT_OP_SET_WIDEBAND_SPEECH, argc, argv);
>  }
>
> +static const char *advmon_features_str[] = {
> +       "Pattern monitor with logic OR.",
> +};
> +
> +static const char *advmon_features2str(uint32_t features)
> +{
> +       static char str[512];
> +       int off, i;
> +
> +       off = 0;
> +       snprintf(str, sizeof(str), "\n\tNone");
> +
> +       for (i = 0; i < NELEM(advmon_features_str); i++) {
> +               if ((features & (1 << i)) != 0 && off < sizeof(str))
> +                       off += snprintf(str + off, sizeof(str) - off, "\n\t%s",
> +                                               advmon_features_str[i]);
> +       }
> +
> +       return str;
> +}
> +
> +static void advmon_features_rsp(uint8_t status, uint16_t len, const void *param,
> +                                                       void *user_data)
> +{
> +       const struct mgmt_rp_read_adv_monitor_features *rp = param;
> +       uint32_t supported_features, enabled_features;
> +       uint16_t num_handles;
> +       int i;
> +
> +       if (status != MGMT_STATUS_SUCCESS) {
> +               error("Reading adv monitor features failed with status 0x%02x "
> +                                       "(%s)", status, mgmt_errstr(status));
> +               return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +       }
> +
> +       if (len < sizeof(*rp)) {
> +               error("Too small adv monitor features reply (%u bytes)", len);
> +               return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +       }
> +
> +       if (len < sizeof(*rp) + rp->num_handles * sizeof(uint16_t)) {
> +               error("Handles count (%u) doesn't match reply length (%u)",
> +                                                       rp->num_handles, len);
> +               return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +       }
> +
> +       supported_features = le32_to_cpu(rp->supported_features);
> +       enabled_features = le32_to_cpu(rp->enabled_features);
> +       num_handles = le16_to_cpu(rp->num_handles);
> +
> +       print("Supported features:%s", advmon_features2str(supported_features));
> +       print("Enabled features:%s", advmon_features2str(enabled_features));
> +       print("Max number of handles: %u", le16_to_cpu(rp->max_num_handles));
> +       print("Max number of patterns: %u", rp->max_num_patterns);
> +       print("Handles list with %u item%s", num_handles,
> +                       num_handles == 0 ? "" : num_handles == 1 ? ":" : "s:");
> +       for (i = 0; i < num_handles; i++) {
> +               print("\t0x%04x ", le16_to_cpu(rp->handles[i]));
> +       }
> +
> +       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
> +}
> +
> +static void cmd_advmon_features(int argc, char **argv)
> +{
> +       uint16_t index;
> +
> +       index = mgmt_index;
> +       if (index == MGMT_INDEX_NONE)
> +               index = 0;
> +
> +       if (!mgmt_send(mgmt, MGMT_OP_READ_ADV_MONITOR_FEATURES, index, 0, NULL,
> +                                       advmon_features_rsp, NULL, NULL)) {
> +               error("Unable to send advertising monitor features command");
> +               return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +       }
> +}
> +
>  static void register_mgmt_callbacks(struct mgmt *mgmt, uint16_t index)
>  {
>         mgmt_register(mgmt, MGMT_EV_CONTROLLER_ERROR, index, controller_error,
> @@ -4776,6 +4854,9 @@ static const struct bt_shell_menu main_menu = {
>                 cmd_expinfo,            "Show experimental features"    },
>         { "exp-debug",          "<on/off>",
>                 cmd_exp_debug,          "Set debug feature"             },
> +       { "advmon-features",    NULL,
> +               cmd_advmon_features,    "Show advertisement monitor "
> +                                       "features"                      },
>         {} },
>  };

It might be a good idea to organize this as a submenu e.g.
> menu monitor
> features

That way we can expand the number of commands for adding/removing
monitors without making the list of commands way too big to show in
one screen (although it already is).
diff mbox series

Patch

diff --git a/tools/btmgmt.c b/tools/btmgmt.c
index 46e7465b3..1aae7098c 100644
--- a/tools/btmgmt.c
+++ b/tools/btmgmt.c
@@ -4567,6 +4567,84 @@  static void cmd_wbs(int argc, char **argv)
 	cmd_setting(MGMT_OP_SET_WIDEBAND_SPEECH, argc, argv);
 }
 
+static const char *advmon_features_str[] = {
+	"Pattern monitor with logic OR.",
+};
+
+static const char *advmon_features2str(uint32_t features)
+{
+	static char str[512];
+	int off, i;
+
+	off = 0;
+	snprintf(str, sizeof(str), "\n\tNone");
+
+	for (i = 0; i < NELEM(advmon_features_str); i++) {
+		if ((features & (1 << i)) != 0 && off < sizeof(str))
+			off += snprintf(str + off, sizeof(str) - off, "\n\t%s",
+						advmon_features_str[i]);
+	}
+
+	return str;
+}
+
+static void advmon_features_rsp(uint8_t status, uint16_t len, const void *param,
+							void *user_data)
+{
+	const struct mgmt_rp_read_adv_monitor_features *rp = param;
+	uint32_t supported_features, enabled_features;
+	uint16_t num_handles;
+	int i;
+
+	if (status != MGMT_STATUS_SUCCESS) {
+		error("Reading adv monitor features failed with status 0x%02x "
+					"(%s)", status, mgmt_errstr(status));
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+
+	if (len < sizeof(*rp)) {
+		error("Too small adv monitor features reply (%u bytes)", len);
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+
+	if (len < sizeof(*rp) + rp->num_handles * sizeof(uint16_t)) {
+		error("Handles count (%u) doesn't match reply length (%u)",
+							rp->num_handles, len);
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+
+	supported_features = le32_to_cpu(rp->supported_features);
+	enabled_features = le32_to_cpu(rp->enabled_features);
+	num_handles = le16_to_cpu(rp->num_handles);
+
+	print("Supported features:%s", advmon_features2str(supported_features));
+	print("Enabled features:%s", advmon_features2str(enabled_features));
+	print("Max number of handles: %u", le16_to_cpu(rp->max_num_handles));
+	print("Max number of patterns: %u", rp->max_num_patterns);
+	print("Handles list with %u item%s", num_handles,
+			num_handles == 0 ? "" : num_handles == 1 ? ":" : "s:");
+	for (i = 0; i < num_handles; i++) {
+		print("\t0x%04x ", le16_to_cpu(rp->handles[i]));
+	}
+
+	return bt_shell_noninteractive_quit(EXIT_SUCCESS);
+}
+
+static void cmd_advmon_features(int argc, char **argv)
+{
+	uint16_t index;
+
+	index = mgmt_index;
+	if (index == MGMT_INDEX_NONE)
+		index = 0;
+
+	if (!mgmt_send(mgmt, MGMT_OP_READ_ADV_MONITOR_FEATURES, index, 0, NULL,
+					advmon_features_rsp, NULL, NULL)) {
+		error("Unable to send advertising monitor features command");
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+}
+
 static void register_mgmt_callbacks(struct mgmt *mgmt, uint16_t index)
 {
 	mgmt_register(mgmt, MGMT_EV_CONTROLLER_ERROR, index, controller_error,
@@ -4776,6 +4854,9 @@  static const struct bt_shell_menu main_menu = {
 		cmd_expinfo,		"Show experimental features"	},
 	{ "exp-debug",		"<on/off>",
 		cmd_exp_debug,		"Set debug feature"		},
+	{ "advmon-features",	NULL,
+		cmd_advmon_features,	"Show advertisement monitor "
+					"features"			},
 	{} },
 };