diff mbox series

[BlueZ,v1] hcitool - Added option for Peripheral Initiated Connection Parameter Update Request.

Message ID 20240723105631.18422-1-quic_nakella@quicinc.com (mailing list archive)
State Superseded
Headers show
Series [BlueZ,v1] hcitool - Added option for Peripheral Initiated Connection Parameter Update Request. | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
tedd_an/CheckPatch fail WARNING:PREFER_LORE_ARCHIVE: Use lore.kernel.org archive links when possible - see https://lore.kernel.org/lists.html #105: https://marc.info/?l=linux-bluetooth&m=139714173525776&w=2 WARNING:LONG_LINE: line length of 125 exceeds 80 columns #124: FILE: lib/hci.c:1122: +int hci_send_acl_data(int dd, uint16_t handle, uint8_t dlen, struct signal_hdr *sh, struct signal_payload_hdr *plh, void *pl) WARNING:LEADING_SPACE: please, no spaces at the start of a line #127: FILE: lib/hci.c:1125: + hci_acl_hdr ha;$ WARNING:LONG_LINE: line length of 83 exceeds 80 columns #140: FILE: lib/hci.c:1138: + printf("\nACL Packet details[handle:%x, length:%d]\n", ha.handle, ha.dlen); WARNING:LONG_LINE: line length of 94 exceeds 80 columns #146: FILE: lib/hci.c:1144: + printf("\nACL signal command details[length:%d, cid:%d]\n", sh->len, sh->cid); ERROR:SPACING: space required before the open parenthesis '(' #147: FILE: lib/hci.c:1145: + if(sh->len > 0) { ERROR:SPACING: space required before the open parenthesis '(' #151: FILE: lib/hci.c:1149: + if(plh->len > 0) { WARNING:LONG_LINE: line length of 86 exceeds 80 columns #167: FILE: lib/hci.c:1165: +int hci_signal_le_con_param_update_req(int dd, uint16_t handle, uint16_t interval_min, WARNING:LONG_LINE: line length of 86 exceeds 80 columns #168: FILE: lib/hci.c:1166: + uint16_t interval_max, uint16_t slave_latency, ERROR:CODE_INDENT: code indent should use tabs where possible #168: FILE: lib/hci.c:1166: + uint16_t interval_max, uint16_t slave_latency,$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #168: FILE: lib/hci.c:1166: + uint16_t interval_max, uint16_t slave_latency,$ ERROR:CODE_INDENT: code indent should use tabs where possible #169: FILE: lib/hci.c:1167: + uint16_t timeout_multiplier)$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #169: FILE: lib/hci.c:1167: + uint16_t timeout_multiplier)$ WARNING:LONG_LINE: line length of 126 exceeds 80 columns #240: FILE: lib/hci_lib.h:68: +int hci_send_acl_data(int dd, uint16_t handle, uint8_t dlen, struct signal_hdr *sh, struct signal_payload_hdr *plh, void *pl); WARNING:LONG_LINE: line length of 163 exceeds 80 columns #244: FILE: lib/hci_lib.h:72: +int hci_signal_le_con_param_update_req(int dd, uint16_t handle, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier); WARNING:LEADING_SPACE: please, no spaces at the start of a line #272: FILE: tools/hcitool.c:3388: + int options = 0;$ ERROR:CODE_INDENT: code indent should use tabs where possible #306: FILE: tools/hcitool.c:3422: + options = 1;$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #306: FILE: tools/hcitool.c:3422: + options = 1;$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #309: FILE: tools/hcitool.c:3425: + if (options == 0) {$ WARNING:SUSPECT_CODE_INDENT: suspect code indent for conditional statements (4, 16) #309: FILE: tools/hcitool.c:3425: + if (options == 0) { + helper_arg(5, 5, &argc, &argv, acl_lecup_help); ERROR:CODE_INDENT: code indent should use tabs where possible #334: FILE: tools/hcitool.c:3450: + handle, min, max, latency, timeout);$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #334: FILE: tools/hcitool.c:3450: + handle, min, max, latency, timeout);$ WARNING:LONG_LINE: line length of 89 exceeds 80 columns #335: FILE: tools/hcitool.c:3451: + if (hci_signal_le_con_param_update_req(dd, htobs(handle), htobs(min), htobs(max), WARNING:LONG_LINE: line length of 82 exceeds 80 columns #336: FILE: tools/hcitool.c:3452: + htobs(latency), htobs(timeout)) < 0) { ERROR:CODE_INDENT: code indent should use tabs where possible #336: FILE: tools/hcitool.c:3452: + htobs(latency), htobs(timeout)) < 0) {$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #336: FILE: tools/hcitool.c:3452: + htobs(latency), htobs(timeout)) < 0) {$ WARNING:LINE_SPACING: Missing a blank line after declarations #338: FILE: tools/hcitool.c:3454: + int err = -errno; + fprintf(stderr, "Could not change connection params: %s(%d)\n", /github/workspace/src/src/13739894.patch total: 7 errors, 20 warnings, 224 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. NOTE: Whitespace errors detected. You may wish to use scripts/cleanpatch or scripts/cleanfile /github/workspace/src/src/13739894.patch has style problems, please review. NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO NOTE: If any of the errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS.
tedd_an/GitLint fail WARNING: I3 - ignore-body-lines: gitlint will be switching from using Python regex 'match' (match beginning) to 'search' (match anywhere) semantics. Please review your ignore-body-lines.regex option accordingly. To remove this warning, set general.regex-style-search=True. More details: https://jorisroovers.github.io/gitlint/configuration/#regex-style-search 1: T1 Title exceeds max length (95>80): "[BlueZ,v1] hcitool - Added option for Peripheral Initiated Connection Parameter Update Request." 1: T3 Title has trailing punctuation (.): "[BlueZ,v1] hcitool - Added option for Peripheral Initiated Connection Parameter Update Request."
tedd_an/BuildEll success Build ELL PASS
tedd_an/BluezMake success Bluez Make PASS
tedd_an/MakeCheck success Bluez Make Check PASS
tedd_an/MakeDistcheck success Make Distcheck PASS
tedd_an/CheckValgrind success Check Valgrind PASS
tedd_an/CheckSmatch success CheckSparse PASS
tedd_an/bluezmakeextell success Make External ELL PASS
tedd_an/IncrementalBuild success Incremental Build PASS
tedd_an/ScanBuild warning ScanBuild: tools/hcitool.c:3404:13: warning: Null pointer passed to 1st parameter expecting 'nonnull' handle = strtoul(optarg, NULL, base); ^~~~~~~~~~~~~~~~~~~~~~~~~~~ tools/hcitool.c:3407:10: warning: Null pointer passed to 1st parameter expecting 'nonnull' min = strtoul(optarg, NULL, base); ^~~~~~~~~~~~~~~~~~~~~~~~~~~ tools/hcitool.c:3410:10: warning: Null pointer passed to 1st parameter expecting 'nonnull' max = strtoul(optarg, NULL, base); ^~~~~~~~~~~~~~~~~~~~~~~~~~~ tools/hcitool.c:3413:14: warning: Null pointer passed to 1st parameter expecting 'nonnull' latency = strtoul(optarg, NULL, base); ^~~~~~~~~~~~~~~~~~~~~~~~~~~ tools/hcitool.c:3416:14: warning: Null pointer passed to 1st parameter expecting 'nonnull' timeout = strtoul(optarg, NULL, base); ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 warnings generated.

Commit Message

Naga Bhavani Akella July 23, 2024, 10:56 a.m. UTC
There is no option in hcitool when Peripheral wants to
initiate Connection Parameter Update Request, hence
added provision to be able to send LL_CONNECTION_PARAM_REQ
using hcitool.

Required for PTS TC - GAP/CONN/CPUP/BV-02-C

Reference link for discussion :
https://marc.info/?l=linux-bluetooth&m=139714173525776&w=2
git code link :
https://gist.github.com/SandyChapman/4a64c9ea22cd27d935e3
---
 lib/hci.c       | 75 +++++++++++++++++++++++++++++++++++++++++
 lib/hci_lib.h   | 29 ++++++++++++++++
 tools/hcitool.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 194 insertions(+)

--

Comments

bluez.test.bot@gmail.com July 23, 2024, 12:41 p.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.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=873214

---Test result---

Test Summary:
CheckPatch                    FAIL      0.85 seconds
GitLint                       FAIL      0.51 seconds
BuildEll                      PASS      25.08 seconds
BluezMake                     PASS      1745.47 seconds
MakeCheck                     PASS      13.31 seconds
MakeDistcheck                 PASS      182.30 seconds
CheckValgrind                 PASS      258.59 seconds
CheckSmatch                   PASS      358.44 seconds
bluezmakeextell               PASS      125.23 seconds
IncrementalBuild              PASS      1496.56 seconds
ScanBuild                     WARNING   1018.73 seconds

Details
##############################
Test: CheckPatch - FAIL
Desc: Run checkpatch.pl script
Output:
[BlueZ,v1] hcitool - Added option for Peripheral Initiated Connection Parameter Update Request.
WARNING:PREFER_LORE_ARCHIVE: Use lore.kernel.org archive links when possible - see https://lore.kernel.org/lists.html
#105: 
https://marc.info/?l=linux-bluetooth&m=139714173525776&w=2

WARNING:LONG_LINE: line length of 125 exceeds 80 columns
#124: FILE: lib/hci.c:1122:
+int hci_send_acl_data(int dd, uint16_t handle, uint8_t dlen, struct signal_hdr *sh, struct signal_payload_hdr *plh, void *pl)

WARNING:LEADING_SPACE: please, no spaces at the start of a line
#127: FILE: lib/hci.c:1125:
+    hci_acl_hdr ha;$

WARNING:LONG_LINE: line length of 83 exceeds 80 columns
#140: FILE: lib/hci.c:1138:
+	printf("\nACL Packet details[handle:%x, length:%d]\n", ha.handle, ha.dlen);

WARNING:LONG_LINE: line length of 94 exceeds 80 columns
#146: FILE: lib/hci.c:1144:
+		printf("\nACL signal command details[length:%d, cid:%d]\n", sh->len, sh->cid);

ERROR:SPACING: space required before the open parenthesis '('
#147: FILE: lib/hci.c:1145:
+		if(sh->len > 0) {

ERROR:SPACING: space required before the open parenthesis '('
#151: FILE: lib/hci.c:1149:
+			if(plh->len > 0) {

WARNING:LONG_LINE: line length of 86 exceeds 80 columns
#167: FILE: lib/hci.c:1165:
+int hci_signal_le_con_param_update_req(int dd, uint16_t handle, uint16_t interval_min,

WARNING:LONG_LINE: line length of 86 exceeds 80 columns
#168: FILE: lib/hci.c:1166:
+                                        uint16_t interval_max, uint16_t slave_latency,

ERROR:CODE_INDENT: code indent should use tabs where possible
#168: FILE: lib/hci.c:1166:
+                                        uint16_t interval_max, uint16_t slave_latency,$

WARNING:LEADING_SPACE: please, no spaces at the start of a line
#168: FILE: lib/hci.c:1166:
+                                        uint16_t interval_max, uint16_t slave_latency,$

ERROR:CODE_INDENT: code indent should use tabs where possible
#169: FILE: lib/hci.c:1167:
+                                        uint16_t timeout_multiplier)$

WARNING:LEADING_SPACE: please, no spaces at the start of a line
#169: FILE: lib/hci.c:1167:
+                                        uint16_t timeout_multiplier)$

WARNING:LONG_LINE: line length of 126 exceeds 80 columns
#240: FILE: lib/hci_lib.h:68:
+int hci_send_acl_data(int dd, uint16_t handle, uint8_t dlen, struct signal_hdr *sh, struct signal_payload_hdr *plh, void *pl);

WARNING:LONG_LINE: line length of 163 exceeds 80 columns
#244: FILE: lib/hci_lib.h:72:
+int hci_signal_le_con_param_update_req(int dd, uint16_t handle, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier);

WARNING:LEADING_SPACE: please, no spaces at the start of a line
#272: FILE: tools/hcitool.c:3388:
+    int options = 0;$

ERROR:CODE_INDENT: code indent should use tabs where possible
#306: FILE: tools/hcitool.c:3422:
+        options = 1;$

WARNING:LEADING_SPACE: please, no spaces at the start of a line
#306: FILE: tools/hcitool.c:3422:
+        options = 1;$

WARNING:LEADING_SPACE: please, no spaces at the start of a line
#309: FILE: tools/hcitool.c:3425:
+    if (options == 0) {$

WARNING:SUSPECT_CODE_INDENT: suspect code indent for conditional statements (4, 16)
#309: FILE: tools/hcitool.c:3425:
+    if (options == 0) {
+		helper_arg(5, 5, &argc, &argv, acl_lecup_help);

ERROR:CODE_INDENT: code indent should use tabs where possible
#334: FILE: tools/hcitool.c:3450:
+            handle, min, max, latency, timeout);$

WARNING:LEADING_SPACE: please, no spaces at the start of a line
#334: FILE: tools/hcitool.c:3450:
+            handle, min, max, latency, timeout);$

WARNING:LONG_LINE: line length of 89 exceeds 80 columns
#335: FILE: tools/hcitool.c:3451:
+	if (hci_signal_le_con_param_update_req(dd, htobs(handle), htobs(min), htobs(max),

WARNING:LONG_LINE: line length of 82 exceeds 80 columns
#336: FILE: tools/hcitool.c:3452:
+                                            htobs(latency), htobs(timeout)) < 0) {

ERROR:CODE_INDENT: code indent should use tabs where possible
#336: FILE: tools/hcitool.c:3452:
+                                            htobs(latency), htobs(timeout)) < 0) {$

WARNING:LEADING_SPACE: please, no spaces at the start of a line
#336: FILE: tools/hcitool.c:3452:
+                                            htobs(latency), htobs(timeout)) < 0) {$

WARNING:LINE_SPACING: Missing a blank line after declarations
#338: FILE: tools/hcitool.c:3454:
+		int err = -errno;
+		fprintf(stderr, "Could not change connection params: %s(%d)\n",

/github/workspace/src/src/13739894.patch total: 7 errors, 20 warnings, 224 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.

NOTE: Whitespace errors detected.
      You may wish to use scripts/cleanpatch or scripts/cleanfile

/github/workspace/src/src/13739894.patch has style problems, please review.

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

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


##############################
Test: GitLint - FAIL
Desc: Run gitlint
Output:
[BlueZ,v1] hcitool - Added option for Peripheral Initiated Connection Parameter Update Request.

WARNING: I3 - ignore-body-lines: gitlint will be switching from using Python regex 'match' (match beginning) to 'search' (match anywhere) semantics. Please review your ignore-body-lines.regex option accordingly. To remove this warning, set general.regex-style-search=True. More details: https://jorisroovers.github.io/gitlint/configuration/#regex-style-search
1: T1 Title exceeds max length (95>80): "[BlueZ,v1] hcitool - Added option for Peripheral Initiated Connection Parameter Update Request."
1: T3 Title has trailing punctuation (.): "[BlueZ,v1] hcitool - Added option for Peripheral Initiated Connection Parameter Update Request."
##############################
Test: ScanBuild - WARNING
Desc: Run Scan Build
Output:
tools/hcitool.c:3404:13: warning: Null pointer passed to 1st parameter expecting 'nonnull'
                        handle = strtoul(optarg, NULL, base);
                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hcitool.c:3407:10: warning: Null pointer passed to 1st parameter expecting 'nonnull'
                        min = strtoul(optarg, NULL, base);
                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hcitool.c:3410:10: warning: Null pointer passed to 1st parameter expecting 'nonnull'
                        max = strtoul(optarg, NULL, base);
                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hcitool.c:3413:14: warning: Null pointer passed to 1st parameter expecting 'nonnull'
                        latency = strtoul(optarg, NULL, base);
                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hcitool.c:3416:14: warning: Null pointer passed to 1st parameter expecting 'nonnull'
                        timeout = strtoul(optarg, NULL, base);
                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
5 warnings generated.



---
Regards,
Linux Bluetooth
diff mbox series

Patch

diff --git a/lib/hci.c b/lib/hci.c
index 937e65d48..435ff63f0 100644
--- a/lib/hci.c
+++ b/lib/hci.c
@@ -1119,6 +1119,81 @@  int hci_send_cmd(int dd, uint16_t ogf, uint16_t ocf, uint8_t plen, void *param)
 	return 0;
 }
 
+int hci_send_acl_data(int dd, uint16_t handle, uint8_t dlen, struct signal_hdr *sh, struct signal_payload_hdr *plh, void *pl)
+{
+	uint8_t type = HCI_ACLDATA_PKT;
+    hci_acl_hdr ha;
+	struct iovec iv[5];
+	int ivn;
+
+	ha.handle = handle;
+	ha.dlen = dlen;
+
+	iv[0].iov_base = &type;
+	iv[0].iov_len = 1;
+	iv[1].iov_base = &ha;
+	iv[1].iov_len = HCI_ACL_HDR_SIZE;
+	ivn = 2;
+
+	printf("\nACL Packet details[handle:%x, length:%d]\n", ha.handle, ha.dlen);
+
+	if (dlen) {
+		iv[2].iov_base = sh;
+		iv[2].iov_len = 4; //HCI_SIGNAL_HDR_SIZE;
+		ivn = 3;
+		printf("\nACL signal command details[length:%d, cid:%d]\n", sh->len, sh->cid);
+		if(sh->len > 0) {
+			iv[3].iov_base = plh;
+			iv[3].iov_len = 4; //HCI_SIGNAL_PAYLOAD_HDR_SIZE;
+			ivn = 4;
+			if(plh->len > 0) {
+				iv[4].iov_base = pl;
+				iv[4].iov_len = plh->len;
+				ivn = 5;
+			}
+		}
+	}
+
+	while (writev(dd, iv, ivn) < 0) {
+		if (errno == EAGAIN || errno == EINTR)
+			continue;
+		return -1;
+	}
+	return 0;
+}
+
+int hci_signal_le_con_param_update_req(int dd, uint16_t handle, uint16_t interval_min,
+                                        uint16_t interval_max, uint16_t slave_latency,
+                                        uint16_t timeout_multiplier)
+{
+	struct signal_hdr sh;
+	struct signal_payload_hdr pl;
+	struct le_con_param_update_req ur;
+
+	uint16_t length = 0x0010;
+
+	memset(&sh, 0, sizeof(sh));
+	memset(&pl, 0, sizeof(pl));
+	memset(&ur, 0, sizeof(ur));
+
+	sh.len = HCI_SIGNAL_LE_CON_PARAM_UPDATE_REQ_SIZE;
+	sh.cid = HCI_LE_CHANNEL_ID;
+
+	pl.code = LE_CON_PARAM_UPDATE_REQ_CODE;
+	pl.id = 0x77;
+	pl.len = LE_CON_PARAM_UPDATE_LEN;
+
+	ur.interval_min = interval_min;
+	ur.interval_max = interval_max;
+	ur.slave_latency = slave_latency;
+	ur.timeout_multiplier = timeout_multiplier;
+
+	if (hci_send_acl_data(dd, handle, length, &sh, &pl, &ur) < 0)
+		return -1;
+
+	return 0;
+}
+
 int hci_send_req(int dd, struct hci_request *r, int to)
 {
 	unsigned char buf[HCI_MAX_EVENT_SIZE], *ptr;
diff --git a/lib/hci_lib.h b/lib/hci_lib.h
index baf3d3e12..906720eaa 100644
--- a/lib/hci_lib.h
+++ b/lib/hci_lib.h
@@ -35,12 +35,41 @@  struct hci_version {
 	uint16_t lmp_subver;
 };
 
+struct hci_acl_hdr {
+	uint16_t handle;
+	uint16_t len;
+};
+
+struct signal_hdr {
+	uint16_t len;
+	uint16_t cid;
+};
+
+struct signal_payload_hdr {
+	uint8_t  code;
+	uint8_t  id;
+	uint16_t len;
+};
+
+struct le_con_param_update_req {
+	uint16_t interval_min;
+	uint16_t interval_max;
+	uint16_t slave_latency;
+	uint16_t timeout_multiplier;
+};
+#define HCI_SIGNAL_LE_CON_PARAM_UPDATE_REQ_SIZE 0x000C
+#define HCI_LE_CHANNEL_ID                       0x0005
+#define LE_CON_PARAM_UPDATE_REQ_CODE            0x12
+#define LE_CON_PARAM_UPDATE_LEN                 0x0008
+
 int hci_open_dev(int dev_id);
 int hci_close_dev(int dd);
 int hci_send_cmd(int dd, uint16_t ogf, uint16_t ocf, uint8_t plen, void *param);
+int hci_send_acl_data(int dd, uint16_t handle, uint8_t dlen, struct signal_hdr *sh, struct signal_payload_hdr *plh, void *pl);
 int hci_send_req(int dd, struct hci_request *req, int timeout);
 
 int hci_create_connection(int dd, const bdaddr_t *bdaddr, uint16_t ptype, uint16_t clkoffset, uint8_t rswitch, uint16_t *handle, int to);
+int hci_signal_le_con_param_update_req(int dd, uint16_t handle, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier);
 int hci_disconnect(int dd, uint16_t handle, uint8_t reason, int to);
 
 int hci_inquiry(int dev_id, int len, int num_rsp, const uint8_t *lap, inquiry_info **ii, long flags);
diff --git a/tools/hcitool.c b/tools/hcitool.c
index 639ee6a51..d6e025e51 100644
--- a/tools/hcitool.c
+++ b/tools/hcitool.c
@@ -3369,6 +3369,95 @@  static void cmd_lecup(int dev_id, int argc, char **argv)
 	hci_close_dev(dd);
 }
 
+static const char *acl_lecup_help =
+	"Usage:\n"
+	"\tacllecup <handle> <min> <max> <latency> <timeout>\n"
+	"\tOptions:\n"
+	"\t    -H, --handle <0xXXXX>  LE connection handle\n"
+	"\t    -m, --min <interval>   Range: 0x0006 to 0x0C80\n"
+	"\t    -M, --max <interval>   Range: 0x0006 to 0x0C80\n"
+	"\t    -l, --latency <range>  Slave latency. Range: 0x0000 to 0x03E8\n"
+	"\t    -t, --timeout  <time>  N * 10ms. Range: 0x000A to 0x0C80\n"
+	"\n\t min/max range: 7.5ms to 4s. Multiply factor: 1.25ms"
+	"\n\t timeout range: 100ms to 32.0s. Larger than max interval\n";
+
+static void cmd_acl_lecup(int dev_id, int argc, char **argv)
+{
+	uint16_t handle = 0, min, max, latency, timeout;
+	int opt, dd, base;
+    int options = 0;
+
+	/* Aleatory valid values */
+	min = 0x0C8;
+	max = 0x0960;
+	latency = 0x0007;
+	timeout = 0x0C80;
+
+	for_each_opt(opt, lecup_options, NULL) {
+		if (optarg && strncasecmp("0x", optarg, 2) == 0)
+			base = 16;
+		else
+			base = 10;
+
+		switch (opt) {
+		case 'H':
+			handle = strtoul(optarg, NULL, base);
+			break;
+		case 'm':
+			min = strtoul(optarg, NULL, base);
+			break;
+		case 'M':
+			max = strtoul(optarg, NULL, base);
+			break;
+		case 'l':
+			latency = strtoul(optarg, NULL, base);
+			break;
+		case 't':
+			timeout = strtoul(optarg, NULL, base);
+			break;
+		default:
+			printf("%s", acl_lecup_help);
+			return;
+		}
+        options = 1;
+	}
+
+    if (options == 0) {
+		helper_arg(5, 5, &argc, &argv, acl_lecup_help);
+
+		handle = strtoul(argv[0], NULL, 0);
+		min = strtoul(argv[1], NULL, 0);
+		max = strtoul(argv[2], NULL, 0);
+		latency = strtoul(argv[3], NULL, 0);
+		timeout = strtoul(argv[4], NULL, 0);
+	}
+
+	if (handle == 0 || handle > 0x0EFF) {
+		printf("%s", acl_lecup_help);
+		return;
+	}
+
+	if (dev_id < 0)
+		dev_id = hci_get_route(NULL);
+
+	dd = hci_open_dev(dev_id);
+	if (dd < 0) {
+		fprintf(stderr, "HCI device open failed\n");
+		exit(1);
+	}
+
+	fprintf(stderr, "Signal LE Connection Update Request: %d %d %d %d %d\n",
+            handle, min, max, latency, timeout);
+	if (hci_signal_le_con_param_update_req(dd, htobs(handle), htobs(min), htobs(max),
+                                            htobs(latency), htobs(timeout)) < 0) {
+		int err = -errno;
+		fprintf(stderr, "Could not change connection params: %s(%d)\n",
+							strerror(-err), -err);
+	}
+
+	hci_close_dev(dd);
+}
+
 static struct {
 	char *cmd;
 	void (*func)(int dev_id, int argc, char **argv);
@@ -3417,6 +3506,7 @@  static struct {
 	{ "lecc",     cmd_lecc,    "Create a LE Connection"               },
 	{ "ledc",     cmd_ledc,    "Disconnect a LE Connection"           },
 	{ "lecup",    cmd_lecup,   "LE Connection Update"                 },
+	{ "acllecup", cmd_acl_lecup, "LE ACL Connection Param Update Req" },
 	{ NULL, NULL, 0 }
 };