tests: add TX timestamping tests
Subsystems (2)
cover tests: add TX timestamping tests
Add tests for ISO and L2CAP TX timestamping
Pauli Virtanen (3):
lib: add BT_SCM_ERROR sock_extended_err CMSG
iso-tester: Add tests for TX timestamping
l2cap-tester: Add test for TX timestamping
lib/bluetooth.h | 1 + tools/iso-tester.c | 169 ++++++++++++++++++++++++++++++++++++++++--- tools/l2cap-tester.c | 106 +++++++++++++++++++++++++-- tools/tester-utils.h | 163 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 424 insertions(+), 15 deletions(-) create mode 100644 tools/tester-utils.h
Signature · 1 line
2.44.0
PATCH 1/3 lib: add BT_SCM_ERROR sock_extended_err CMSG
Add new CMSG type used in new kernel TX timestamping support.
--- lib/bluetooth.h | 1 + 1 file changed, 1 insertion(+)
lib/bluetooth.h +1 -0
@@ -141,6 +141,7 @@ struct bt_voice {#define BT_PKT_STATUS 16#define BT_SCM_PKT_STATUS 0x03 +#define BT_SCM_ERROR 0x04#define BT_ISO_QOS 17
Signature · 1 line
2.44.0
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=831820
---Test result---
Test Summary:
CheckPatch PASS 1.47 seconds GitLint PASS 0.83 seconds BuildEll PASS 25.73 seconds BluezMake FAIL 48.53 seconds MakeCheck FAIL 141.99 seconds MakeDistcheck PASS 159.67 seconds CheckValgrind FAIL 40.58 seconds CheckSmatch FAIL 90.79 seconds bluezmakeextell FAIL 23.45 seconds IncrementalBuild FAIL 690.99 seconds ScanBuild FAIL 543.24 seconds
Details
##############################
Test: BluezMake - FAIL
Desc: Build BlueZ
Output:
tools/l2cap-tester.c: In function ‘l2cap_tx_timestamping’:tools/l2cap-tester.c:1264:9: error: variable ‘so’ has initializer but incomplete type
1264 | struct so_timestamping so = {
| ^~~~~~~~~~~~~~~
tools/l2cap-tester.c:1265:4: error: ‘struct so_timestamping’ has no member named ‘flags’
1265 | .flags = l2data->so_timestamping,
| ^~~~~
tools/l2cap-tester.c:1265:12: error: excess elements in struct initializer [-Werror]
1265 | .flags = l2data->so_timestamping,
| ^~~~~~tools/l2cap-tester.c:1265:12: note: (near initialization for ‘so’)tools/l2cap-tester.c:1264:25: error: storage size of ‘so’ isn’t known
1264 | struct so_timestamping so = {
| ^~tools/l2cap-tester.c:1264:25: error: unused variable ‘so’ [-Werror=unused-variable]
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7803: tools/l2cap-tester.o] Error 1
make[1]: *** Waiting for unfinished jobs....tools/mgmt-tester.c: In function ‘main’:tools/mgmt-tester.c:12723:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without 12723 | int main(int argc, char *argv[])
| ^~~~
make: *** [Makefile:4645: all] Error 2
##############################
Test: MakeCheck - FAIL
Desc: Run Bluez Make Check
Output:
tools/l2cap-tester.c: In function ‘l2cap_tx_timestamping’:tools/l2cap-tester.c:1264:9: error: variable ‘so’ has initializer but incomplete type
1264 | struct so_timestamping so = {
| ^~~~~~~~~~~~~~~
tools/l2cap-tester.c:1265:4: error: ‘struct so_timestamping’ has no member named ‘flags’
1265 | .flags = l2data->so_timestamping,
| ^~~~~
tools/l2cap-tester.c:1265:12: error: excess elements in struct initializer [-Werror]
1265 | .flags = l2data->so_timestamping,
| ^~~~~~tools/l2cap-tester.c:1265:12: note: (near initialization for ‘so’) tools/l2cap-tester.c:1264:25: error: storage size of ‘so’ isn’t known
1264 | struct so_timestamping so = {
| ^~tools/l2cap-tester.c:1264:25: error: unused variable ‘so’ [-Werror=unused-variable]
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7803: tools/l2cap-tester.o] Error 1
make: *** [Makefile:12180: check] Error 2
##############################
Test: CheckValgrind - FAIL
Desc: Run Bluez Make Check with Valgrind
Output:
tools/l2cap-tester.c: In function ‘l2cap_tx_timestamping’:tools/l2cap-tester.c:1264:9: error: variable ‘so’ has initializer but incomplete type
1264 | struct so_timestamping so = {
| ^~~~~~~~~~~~~~~
tools/l2cap-tester.c:1265:4: error: ‘struct so_timestamping’ has no member named ‘flags’
1265 | .flags = l2data->so_timestamping,
| ^~~~~
tools/l2cap-tester.c:1265:12: error: excess elements in struct initializer [-Werror]
1265 | .flags = l2data->so_timestamping,
| ^~~~~~tools/l2cap-tester.c:1265:12: note: (near initialization for ‘so’)tools/l2cap-tester.c:1264:25: error: storage size of ‘so’ isn’t known
1264 | struct so_timestamping so = {
| ^~tools/l2cap-tester.c:1264:25: error: unused variable ‘so’ [-Werror=unused-variable]
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7803: tools/l2cap-tester.o] Error 1
make[1]: *** Waiting for unfinished jobs....tools/mgmt-tester.c: In function ‘main’:tools/mgmt-tester.c:12723:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without 12723 | int main(int argc, char *argv[])
| ^~~~
make: *** [Makefile:12180: check] Error 2
##############################
Test: CheckSmatch - FAIL
Desc: Run smatch tool with source
Output:
src/shared/crypto.c:271:21: warning: Variable length array is used. src/shared/crypto.c:272:23: warning: Variable length array is used. src/shared/gatt-helpers.c:768:31: warning: Variable length array is used. src/shared/gatt-helpers.c:830:31: warning: Variable length array is used. src/shared/gatt-helpers.c:1323:31: warning: Variable length array is used. src/shared/gatt-helpers.c:1354:23: warning: Variable length array is used. src/shared/gatt-server.c:276:25: warning: Variable length array is used. src/shared/gatt-server.c:619:25: warning: Variable length array is used. src/shared/gatt-server.c:718:25: warning: Variable length array is used. src/shared/shell.c: note: in included file (through /usr/include/readline/readline.h):/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function' /usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction' /usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction' /usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction' src/shared/crypto.c:271:21: warning: Variable length array is used. src/shared/crypto.c:272:23: warning: Variable length array is used. src/shared/gatt-helpers.c:768:31: warning: Variable length array is used. src/shared/gatt-helpers.c:830:31: warning: Variable length array is used. src/shared/gatt-helpers.c:1323:31: warning: Variable length array is used. src/shared/gatt-helpers.c:1354:23: warning: Variable length array is used. src/shared/gatt-server.c:276:25: warning: Variable length array is used. src/shared/gatt-server.c:619:25: warning: Variable length array is used. src/shared/gatt-server.c:718:25: warning: Variable length array is used. src/shared/shell.c: note: in included file (through /usr/include/readline/readline.h):/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function' /usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction' /usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction' /usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction' tools/mesh-cfgtest.c:1453:17: warning: unknown escape sequence: '\%' tools/l2cap-tester.c: In function ‘l2cap_tx_timestamping’:tools/l2cap-tester.c:1264:9: error: variable ‘so’ has initializer but incomplete type
1264 | struct so_timestamping so = {
| ^~~~~~~~~~~~~~~
tools/l2cap-tester.c:1265:4: error: ‘struct so_timestamping’ has no member named ‘flags’
1265 | .flags = l2data->so_timestamping,
| ^~~~~
tools/l2cap-tester.c:1265:12: error: excess elements in struct initializer [-Werror]
1265 | .flags = l2data->so_timestamping,
| ^~~~~~tools/l2cap-tester.c:1265:12: note: (near initialization for ‘so’) tools/l2cap-tester.c:1264:25: error: storage size of ‘so’ isn’t known
1264 | struct so_timestamping so = {
| ^~tools/l2cap-tester.c:1264:25: error: unused variable ‘so’ [-Werror=unused-variable]
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7803: tools/l2cap-tester.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4645: all] Error 2
##############################
Test: bluezmakeextell - FAIL
Desc: Build Bluez with External ELL
Output:
tools/l2cap-tester.c: In function ‘l2cap_tx_timestamping’:tools/l2cap-tester.c:1264:9: error: variable ‘so’ has initializer but incomplete type
1264 | struct so_timestamping so = {
| ^~~~~~~~~~~~~~~
tools/l2cap-tester.c:1265:4: error: ‘struct so_timestamping’ has no member named ‘flags’
1265 | .flags = l2data->so_timestamping,
| ^~~~~
tools/l2cap-tester.c:1265:12: error: excess elements in struct initializer [-Werror]
1265 | .flags = l2data->so_timestamping,
| ^~~~~~tools/l2cap-tester.c:1265:12: note: (near initialization for ‘so’) tools/l2cap-tester.c:1264:25: error: storage size of ‘so’ isn’t known
1264 | struct so_timestamping so = {
| ^~tools/l2cap-tester.c:1264:25: error: unused variable ‘so’ [-Werror=unused-variable]
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7803: tools/l2cap-tester.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4645: all] Error 2
##############################
Test: IncrementalBuild - FAIL
Desc: Incremental build with the patches in the series
Output:
[BlueZ,2/3] iso-tester: Add tests for TX timestamping
tools/iso-tester.c: In function ‘iso_tx_timestamping’:tools/iso-tester.c:2128:9: error: variable ‘so’ has initializer but incomplete type
2128 | struct so_timestamping so = {
| ^~~~~~~~~~~~~~~
tools/iso-tester.c:2129:4: error: ‘struct so_timestamping’ has no member named ‘flags’
2129 | .flags = isodata->so_timestamping,
| ^~~~~
tools/iso-tester.c:2129:12: error: excess elements in struct initializer [-Werror]
2129 | .flags = isodata->so_timestamping,
| ^~~~~~~tools/iso-tester.c:2129:12: note: (near initialization for ‘so’)tools/iso-tester.c:2128:25: error: storage size of ‘so’ isn’t known
2128 | struct so_timestamping so = {
| ^~tools/iso-tester.c:2128:25: error: unused variable ‘so’ [-Werror=unused-variable]
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7803: tools/iso-tester.o] Error 1
make[1]: *** Waiting for unfinished jobs....tools/mgmt-tester.c: In function ‘main’:tools/mgmt-tester.c:12723:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without 12723 | int main(int argc, char *argv[])
| ^~~~
make: *** [Makefile:4645: all] Error 2
##############################
Test: ScanBuild - FAIL
Desc: Run Scan Build
Output:
src/shared/gatt-client.c:451:21: warning: Use of memory after it is freed
gatt_db_unregister(op->client->db, op->db_id);
^~~~~~~~~~
src/shared/gatt-client.c:696:2: warning: Use of memory after it is freed
discovery_op_complete(op, false, att_ecode);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:993:2: warning: Use of memory after it is freed
discovery_op_complete(op, success, att_ecode);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1099:2: warning: Use of memory after it is freed
discovery_op_complete(op, success, att_ecode);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1291:2: warning: Use of memory after it is freed
discovery_op_complete(op, success, att_ecode);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1356:2: warning: Use of memory after it is freed
discovery_op_complete(op, success, att_ecode);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1631:6: warning: Use of memory after it is freed
if (read_db_hash(op)) {
^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1636:2: warning: Use of memory after it is freed
discover_all(op);
^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:2140:6: warning: Use of memory after it is freed
if (read_db_hash(op)) {
^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:2148:8: warning: Use of memory after it is freed
discovery_op_ref(op),
^~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:3237:2: warning: Use of memory after it is freed
complete_write_long_op(req, success, 0, false);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:3259:2: warning: Use of memory after it is freed
request_unref(req);
^~~~~~~~~~~~~~~~~~
12 warnings generated.
src/shared/bap.c:1156:2: warning: Use of memory after it is freed
DBG(stream->bap, "stream %p", stream);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/bap.c:40:2: note: expanded from macro 'DBG'
bap_debug(_bap, "%s:%s() " fmt, __FILE__, __func__, ## arg)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
src/shared/shell.c:1228:13: warning: Access to field 'options' results in a dereference of a null pointer (loaded from variable 'opt')
if (c != opt->options[index - offset].val) {
^~~~~~~~~~~~
1 warning generated.
src/shared/gatt-client.c:451:21: warning: Use of memory after it is freed
gatt_db_unregister(op->client->db, op->db_id);
^~~~~~~~~~
src/shared/gatt-client.c:696:2: warning: Use of memory after it is freed
discovery_op_complete(op, false, att_ecode);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:993:2: warning: Use of memory after it is freed
discovery_op_complete(op, success, att_ecode);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1099:2: warning: Use of memory after it is freed
discovery_op_complete(op, success, att_ecode);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1291:2: warning: Use of memory after it is freed
discovery_op_complete(op, success, att_ecode);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1356:2: warning: Use of memory after it is freed
discovery_op_complete(op, success, att_ecode);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1631:6: warning: Use of memory after it is freed
if (read_db_hash(op)) {
^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1636:2: warning: Use of memory after it is freed
discover_all(op);
^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:2140:6: warning: Use of memory after it is freed
if (read_db_hash(op)) {
^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:2148:8: warning: Use of memory after it is freed
discovery_op_ref(op),
^~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:3237:2: warning: Use of memory after it is freed
complete_write_long_op(req, success, 0, false);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:3259:2: warning: Use of memory after it is freed
request_unref(req);
^~~~~~~~~~~~~~~~~~
12 warnings generated.
src/shared/bap.c:1156:2: warning: Use of memory after it is freed
DBG(stream->bap, "stream %p", stream);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/bap.c:40:2: note: expanded from macro 'DBG'
bap_debug(_bap, "%s:%s() " fmt, __FILE__, __func__, ## arg)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
src/shared/shell.c:1228:13: warning: Access to field 'options' results in a dereference of a null pointer (loaded from variable 'opt')
if (c != opt->options[index - offset].val) {
^~~~~~~~~~~~
1 warning generated.
tools/hciattach.c:816:7: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
if ((n = read_hci_event(fd, resp, 10)) < 0) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hciattach.c:864:7: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
if ((n = read_hci_event(fd, resp, 4)) < 0) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hciattach.c:886:8: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
if ((n = read_hci_event(fd, resp, 10)) < 0) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hciattach.c:908:7: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
if ((n = read_hci_event(fd, resp, 4)) < 0) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hciattach.c:929:7: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
if ((n = read_hci_event(fd, resp, 4)) < 0) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hciattach.c:973:7: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
if ((n = read_hci_event(fd, resp, 6)) < 0) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 warnings generated.
src/oui.c:50:2: warning: Value stored to 'hwdb' is never read
hwdb = udev_hwdb_unref(hwdb);
^ ~~~~~~~~~~~~~~~~~~~~~
src/oui.c:53:2: warning: Value stored to 'udev' is never read
udev = udev_unref(udev);
^ ~~~~~~~~~~~~~~~~
2 warnings generated.
tools/hcidump.c:180:9: warning: Potential leak of memory pointed to by 'dp'
if (fds[i].fd == sock)
^~~
tools/hcidump.c:248:17: warning: Assigned value is garbage or undefined
dh->ts_sec = htobl(frm.ts.tv_sec);
^ ~~~~~~~~~~~~~~~~~~~~
tools/hcidump.c:326:9: warning: 1st function call argument is an uninitialized value
if (be32toh(dp.flags) & 0x02) {
^~~~~~~~~~~~~~~~~
/usr/include/endian.h:46:22: note: expanded from macro 'be32toh'
# define be32toh(x) __bswap_32 (x)
^~~~~~~~~~~~~~
tools/hcidump.c:341:20: warning: 1st function call argument is an uninitialized value
frm.data_len = be32toh(dp.len);
^~~~~~~~~~~~~~~
/usr/include/endian.h:46:22: note: expanded from macro 'be32toh'
# define be32toh(x) __bswap_32 (x)
^~~~~~~~~~~~~~
tools/hcidump.c:346:14: warning: 1st function call argument is an uninitialized value
opcode = be32toh(dp.flags) & 0xffff;
^~~~~~~~~~~~~~~~~
/usr/include/endian.h:46:22: note: expanded from macro 'be32toh'
# define be32toh(x) __bswap_32 (x)
^~~~~~~~~~~~~~
tools/hcidump.c:384:17: warning: Assigned value is garbage or undefined
frm.data_len = btohs(dh.len);
^ ~~~~~~~~~~~~~
tools/hcidump.c:394:11: warning: Assigned value is garbage or undefined
frm.len = frm.data_len;
^ ~~~~~~~~~~~~
tools/hcidump.c:398:9: warning: 1st function call argument is an uninitialized value
ts = be64toh(ph.ts);
^~~~~~~~~~~~~~
/usr/include/endian.h:51:22: note: expanded from macro 'be64toh'
# define be64toh(x) __bswap_64 (x)
^~~~~~~~~~~~~~
tools/hcidump.c:403:13: warning: 1st function call argument is an uninitialized value
frm.in = be32toh(dp.flags) & 0x01;
^~~~~~~~~~~~~~~~~
/usr/include/endian.h:46:22: note: expanded from macro 'be32toh'
# define be32toh(x) __bswap_32 (x)
^~~~~~~~~~~~~~
tools/hcidump.c:408:11: warning: Assigned value is garbage or undefined
frm.in = dh.in;
^ ~~~~~
tools/hcidump.c:437:7: warning: Null pointer passed to 1st parameter expecting 'nonnull'
fd = open(file, open_flags, 0644);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
11 warnings generated.
tools/rfcomm.c:234:3: warning: Value stored to 'i' is never read
i = execvp(cmdargv[0], cmdargv);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/rfcomm.c:234:7: warning: Null pointer passed to 1st parameter expecting 'nonnull'
i = execvp(cmdargv[0], cmdargv);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/rfcomm.c:354:8: warning: Although the value stored to 'fd' is used in the enclosing expression, the value is never actually read from 'fd'
if ((fd = open(devname, O_RDONLY | O_NOCTTY)) < 0) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/rfcomm.c:497:14: warning: Assigned value is garbage or undefined
req.channel = raddr.rc_channel;
^ ~~~~~~~~~~~~~~~~
tools/rfcomm.c:515:8: warning: Although the value stored to 'fd' is used in the enclosing expression, the value is never actually read from 'fd'
if ((fd = open(devname, O_RDONLY | O_NOCTTY)) < 0) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 warnings generated.
src/sdp-xml.c:126:10: warning: Assigned value is garbage or undefined
buf[1] = data[i + 1];
^ ~~~~~~~~~~~
src/sdp-xml.c:300:11: warning: Assigned value is garbage or undefined
buf[1] = data[i + 1];
^ ~~~~~~~~~~~
src/sdp-xml.c:338:11: warning: Assigned value is garbage or undefined
buf[1] = data[i + 1];
^ ~~~~~~~~~~~
3 warnings generated.
tools/ciptool.c:350:7: warning: 5th function call argument is an uninitialized value
sk = do_connect(ctl, dev_id, &src, &dst, psm, (1 << CMTP_LOOPBACK));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
tools/sdptool.c:941:26: warning: Result of 'malloc' is converted to a pointer of type 'uint32_t', which is incompatible with sizeof operand type 'int'
uint32_t *value_int = malloc(sizeof(int));
~~~~~~~~~~ ^~~~~~ ~~~~~~~~~~~
tools/sdptool.c:980:4: warning: 1st function call argument is an uninitialized value
free(allocArray[i]);
^~~~~~~~~~~~~~~~~~~
tools/sdptool.c:3777:2: warning: Potential leak of memory pointed to by 'si.name'
return add_service(0, &si);
^~~~~~~~~~~~~~~~~~~~~~~~~~
tools/sdptool.c:4112:4: warning: Potential leak of memory pointed to by 'context.svc'
return -1;
^~~~~~~~~
4 warnings generated.
tools/iso-tester.c: In function ‘iso_tx_timestamping’:
tools/iso-tester.c:2128:9: error: variable ‘so’ has initializer but incomplete type
2128 | struct so_timestamping so = {
| ^~~~~~~~~~~~~~~
tools/iso-tester.c:2129:4: error: ‘struct so_timestamping’ has no member named ‘flags’
2129 | .flags = isodata->so_timestamping,
| ^~~~~
tools/iso-tester.c:2129:12: error: excess elements in struct initializer [-Werror]
2129 | .flags = isodata->so_timestamping,
| ^~~~~~~tools/iso-tester.c:2129:12: note: (near initialization for ‘so’) tools/iso-tester.c:2128:25: error: storage size of ‘so’ isn’t known
2128 | struct so_timestamping so = {
| ^~tools/iso-tester.c:2128:25: error: unused variable ‘so’ [-Werror=unused-variable]
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7803: tools/iso-tester.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4645: all] Error 2
---
Regards,
Linux Bluetooth
PATCH 2/3 iso-tester: Add tests for TX timestamping
In reply to Pauli VirtanenAdd TX timestamping test utilities in new tester-utils.h, so that they can be shared between testers.
Add tests:
ISO Send - TX Timestamping
ISO Send - TX Sched Timestamping
ISO Send - TX Msg Timestamping
--- tools/iso-tester.c | 169 ++++++++++++++++++++++++++++++++++++++++--- tools/tester-utils.h | 163 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 322 insertions(+), 10 deletions(-) create mode 100644 tools/tester-utils.h
tools/iso-tester.c +159 -10
@@ -18,6 +18,9 @@#include <poll.h> #include <stdbool.h> +#include <linux/errqueue.h> +#include <linux/net_tstamp.h> +#include <glib.h> #include "lib/bluetooth.h"
@@ -34,6 +37,8 @@#include "src/shared/util.h" #include "src/shared/queue.h" +#include "tester-utils.h" +#define QOS_IO (_interval, _latency, _sdu, _phy, _rtn) \ { \ .interval = _interval, \
@@ -462,11 +467,12 @@ struct test_data {uint16_t handle;uint16_t acl_handle;struct queue *io_queue; -unsigned int io_id[2 ]; +unsigned int io_id[3 ];uint8_t client_num;int step;bool reconnect;bool suspending; +struct tx_tstamp_data tx_ts; };struct iso_client_data {
@@ -487,6 +493,10 @@ struct iso_client_data {size_t base_len;bool listen_bind;bool pa_bind; +uint32_t so_timestamping; +bool msg_timestamping; +unsigned int send_extra; +unsigned int send_extra_pre_ts; };static void mgmt_debug (const char *str,void *user_data)
@@ -675,15 +685,14 @@ static void io_free(void *data)static void test_data_free (void *test_data) {struct test_data *data = test_data; +unsigned int i;if (data->io_queue)queue_destroy (data->io_queue, io_free); -if (data->io_id[0 ] >0 ) -g_source_remove (data->io_id[0 ]); - -if (data->io_id[1 ] >0 ) -g_source_remove (data->io_id[1 ]); +for (i =0 ; i <ARRAY_SIZE (data->io_id); ++i) +if (data->io_id[i] >0 ) +g_source_remove (data->io_id[i]);free (data); }
@@ -985,6 +994,38 @@ static const struct iso_client_data connect_16_2_1_send = { .send = &send_16_2_1, }; +static const struct iso_client_data connect_send_tx_timestamping = { + .qos =QOS_16_2_1 , + .expect_err =0 , + .send = &send_16_2_1, + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | +SOF_TIMESTAMPING_OPT_ID | +SOF_TIMESTAMPING_TX_SOFTWARE ), + .send_extra =1 , + .send_extra_pre_ts =2 , +}; + +static const struct iso_client_data connect_send_tx_sched_timestamping = { + .qos =QOS_16_2_1 , + .expect_err =0 , + .send = &send_16_2_1, + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | +SOF_TIMESTAMPING_TX_SOFTWARE | +SOF_TIMESTAMPING_OPT_TSONLY | +SOF_TIMESTAMPING_TX_SCHED ), + .send_extra =1 , +}; + +static const struct iso_client_data connect_send_tx_msg_timestamping = { + .qos =QOS_16_2_1 , + .expect_err =0 , + .send = &send_16_2_1, + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | +SOF_TIMESTAMPING_TX_SOFTWARE ), + .send_extra =1 , + .msg_timestamping = true, +}; +static const struct iso_client_data listen_16_2_1_recv = { .qos =QOS_16_2_1 , .expect_err =0 ,
@@ -1408,14 +1449,17 @@ static void bthost_recv_data(const void *buf, uint16_t len, void *user_data)struct test_data *data = user_data;const struct iso_client_data *isodata = data->test_data; + --data->step; +tester_print ("Client received %u bytes of data" , len);if (isodata->send && (isodata->send->iov_len != len ||memcmp (isodata->send->iov_base, buf, len))) {if (!isodata->recv->iov_base)tester_test_failed (); - }else + }else if (!data->step) {tester_test_passed (); + } }static void bthost_iso_disconnected (void *user_data)
@@ -2056,17 +2100,95 @@ static void iso_recv(struct test_data *data, GIOChannel *io) data->io_id[0 ] =g_io_add_watch (io,G_IO_IN , iso_recv_data, data); } -static void iso_send (struct test_data *data,GIOChannel *io) +static gboolean iso_recv_errqueue (GIOChannel *io,GIOCondition cond, +gpointer user_data) { +struct test_data *data = user_data;const struct iso_client_data *isodata = data->test_data; -ssize_t ret; +int sk =g_io_channel_unix_get_fd (io); +int err; + + data->step--; + + err =tx_tstamp_recv (&data->tx_ts, sk, isodata->send->iov_len); +if (err >0 ) +return TRUE; +else if (!err && !data->step) +tester_test_passed (); +else +tester_test_failed (); + + data->io_id[2 ] =0 ; +return FALSE; +} + +static void iso_tx_timestamping (struct test_data *data,GIOChannel *io) +{ +const struct iso_client_data *isodata = data->test_data; +struct so_timestamping so = { + .flags = isodata->so_timestamping, + };int sk; +int err; +unsigned int count; + +if (!(isodata->so_timestamping &SOF_TIMESTAMPING_TX_RECORD_MASK )) +return ; + +tester_print ("Enabling TX timestamping" ); + +tx_tstamp_init (&data->tx_ts, isodata->so_timestamping); + +for (count =0 ; count < isodata->send_extra +1 ; ++count) + data->step +=tx_tstamp_expect (&data->tx_ts); sk =g_io_channel_unix_get_fd (io); + data->io_id[2 ] =g_io_add_watch (io,G_IO_ERR , iso_recv_errqueue, data); + +if (isodata->msg_timestamping) + so.flags &= ~SOF_TIMESTAMPING_TX_RECORD_MASK ; + + err =setsockopt (sk,SOL_SOCKET ,SO_TIMESTAMPING , &so,sizeof (so)); +if (err <0 ) { +tester_warn ("setsockopt SO_TIMESTAMPING: %s (%d)" , +strerror (errno), errno); +tester_test_failed (); +return ; + } +} + +static void iso_send_data (struct test_data *data,GIOChannel *io) +{ +const struct iso_client_data *isodata = data->test_data; +char control[CMSG_SPACE (sizeof (uint32_t ))]; +struct msghdr msg = { + .msg_iov = (struct iovec *)isodata->send, + .msg_iovlen =1 , + }; +struct cmsghdr *cmsg; +ssize_t ret; +int sk; +tester_print ("Writing %zu bytes of data" , isodata->send->iov_len); - ret =writev (sk, isodata->send,1 ); + sk =g_io_channel_unix_get_fd (io); + +if (isodata->msg_timestamping) { +memset (control,0 ,sizeof (control)); + msg.msg_control = control; + msg.msg_controllen =sizeof (control); + + cmsg =CMSG_FIRSTHDR (&msg); + cmsg->cmsg_level =SOL_SOCKET ; + cmsg->cmsg_type =SO_TIMESTAMPING ; + cmsg->cmsg_len =CMSG_LEN (sizeof (uint32_t )); + + *((uint32_t *)CMSG_DATA (cmsg)) = (isodata->so_timestamping & +SOF_TIMESTAMPING_TX_RECORD_MASK ); + } + + ret =sendmsg (sk, &msg,0 );if (ret <0 || isodata->send->iov_len != (size_t ) ret) {tester_warn ("Failed to write %zu bytes: %s (%d)" , isodata->send->iov_len,strerror (errno), errno);
@@ -2074,6 +2196,22 @@ static void iso_send(struct test_data *data, GIOChannel *io)return ; } + data->step++; +} + +static void iso_send (struct test_data *data,GIOChannel *io) +{ +const struct iso_client_data *isodata = data->test_data; +unsigned int count; + +for (count =0 ; count < isodata->send_extra_pre_ts; ++count) +iso_send_data (data, io); + +iso_tx_timestamping (data, io); + +for (count =0 ; count < isodata->send_extra +1 ; ++count) +iso_send_data (data, io); +if (isodata->bcast) {tester_test_passed ();return ;
@@ -3172,6 +3310,17 @@ int main(int argc, char *argv[])test_iso ("ISO Send - Success" , &connect_16_2_1_send, setup_powered, test_connect); +test_iso ("ISO Send - TX Timestamping" , &connect_send_tx_timestamping, + setup_powered, test_connect); + +test_iso ("ISO Send - TX Sched Timestamping" , + &connect_send_tx_sched_timestamping, setup_powered, + test_connect); + +test_iso ("ISO Send - TX Msg Timestamping" , + &connect_send_tx_msg_timestamping, setup_powered, + test_connect); +test_iso ("ISO Receive - Success" , &listen_16_2_1_recv, setup_powered, test_listen);
tools/tester-utils.h new file +163 -0
163 lines not on this page · raw message
Signature · 1 line
2.44.0
PATCH 3/3 l2cap-tester: Add test for TX timestamping
In reply to Pauli VirtanenAdd test
L2CAP BR/EDR Client - TX Timestamping
--- tools/l2cap-tester.c | 106 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 101 insertions(+), 5 deletions(-)
tools/l2cap-tester.c +101 -5
@@ -30,6 +30,9 @@#include "src/shared/tester.h" #include "src/shared/mgmt.h" +#include "src/shared/util.h" + +#include "tester-utils.h" struct test_data {const void *test_data;
@@ -38,12 +41,15 @@ struct test_data {struct hciemu *hciemu;enum hciemu_type hciemu_type;unsigned int io_id; +unsigned int err_io_id;uint16_t handle;uint16_t scid;uint16_t dcid;int sk;int sk2;bool host_disconnected; +int step; +struct tx_tstamp_data tx_ts; };struct l2cap_data {
@@ -86,6 +92,9 @@ struct l2cap_data {bool defer;bool shut_sock_wr; + +uint32_t so_timestamping; +unsigned int send_extra; };static void print_debug (const char *str,void *user_data)
@@ -226,6 +235,11 @@ static void test_post_teardown(const void *test_data) data->io_id =0 ; } +if (data->err_io_id >0 ) { +g_source_remove (data->err_io_id); + data->err_io_id =0 ; + } +hciemu_unref (data->hciemu); data->hciemu =NULL ; }
@@ -245,6 +259,7 @@ static void test_data_free(void *test_data)break ; \ user->hciemu_type =HCIEMU_TYPE_BREDR ; \ user->io_id =0 ; \ + user->err_io_id =0 ; \ user->test_data = data; \ tester_add_full(name, data, \ test_pre_setup, setup, func, NULL, \
@@ -259,6 +274,7 @@ static void test_data_free(void *test_data)break ; \ user->hciemu_type =HCIEMU_TYPE_LE ; \ user->io_id =0 ; \ + user->err_io_id =0 ; \ user->test_data = data; \ tester_add_full(name, data, \ test_pre_setup, setup, func, NULL, \
@@ -321,6 +337,17 @@ static const struct l2cap_data client_connect_write_success_test = { .data_len = sizeof(l2_data), }; +static const struct l2cap_data client_connect_tx_timestamping_test = { + .client_psm =0x1001 , + .server_psm =0x1001 , + .write_data = l2_data, + .data_len =sizeof (l2_data), + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | +SOF_TIMESTAMPING_OPT_ID | +SOF_TIMESTAMPING_TX_SOFTWARE ), + .send_extra =2 , +}; +static const struct l2cap_data client_connect_shut_wr_success_test = { .client_psm =0x1001 , .server_psm =0x1001 ,
@@ -1096,6 +1123,8 @@ static void bthost_received_data(const void *buf, uint16_t len,struct test_data *data =tester_get_data ();const struct l2cap_data *l2data = data->test_data; + --data->step; +if (len != l2data->data_len) {tester_test_failed ();return ;
@@ -1103,7 +1132,7 @@ static void bthost_received_data(const void *buf, uint16_t len,if (memcmp (buf, l2data->write_data, l2data->data_len))tester_test_failed (); -else +else if (!data->step)tester_test_passed (); }
@@ -1207,6 +1236,61 @@ static bool check_mtu(struct test_data *data, int sk)return true; } +static gboolean recv_errqueue (GIOChannel *io,GIOCondition cond, +gpointer user_data) +{ +struct test_data *data = user_data; +const struct l2cap_data *l2data = data->test_data; +int sk =g_io_channel_unix_get_fd (io); +int err; + + data->step--; + + err =tx_tstamp_recv (&data->tx_ts, sk, l2data->data_len); +if (err >0 ) +return TRUE; +else if (!err && !data->step) +tester_test_passed (); +else +tester_test_failed (); + + data->err_io_id =0 ; +return FALSE; +} + +static void l2cap_tx_timestamping (struct test_data *data,GIOChannel *io) +{ +const struct l2cap_data *l2data = data->test_data; +struct so_timestamping so = { + .flags = l2data->so_timestamping, + }; +int sk; +int err; +unsigned int count; + +if (!(l2data->so_timestamping &SOF_TIMESTAMPING_TX_RECORD_MASK )) +return ; + + sk =g_io_channel_unix_get_fd (io); + +tester_print ("Enabling TX timestamping" ); + +tx_tstamp_init (&data->tx_ts, l2data->so_timestamping); + +for (count =0 ; count < l2data->send_extra +1 ; ++count) + data->step +=tx_tstamp_expect (&data->tx_ts); + + err =setsockopt (sk,SOL_SOCKET ,SO_TIMESTAMPING , &so,sizeof (so)); +if (err <0 ) { +tester_warn ("setsockopt SO_TIMESTAMPING: %s (%d)" , +strerror (errno), errno); +tester_test_failed (); +return ; + } + + data->err_io_id =g_io_add_watch (io,G_IO_ERR , recv_errqueue, data); +} +static gboolean l2cap_connect_cb (GIOChannel *io,GIOCondition cond,gpointer user_data) {
@@ -1249,15 +1333,23 @@ static gboolean l2cap_connect_cb(GIOChannel *io, GIOCondition cond, }else if (l2data->write_data) {struct bthost *bthost;ssize_t ret; +unsigned int count; + + data->step =0 ; bthost =hciemu_client_get_host (data->hciemu);bthost_add_cid_hook (bthost, data->handle, data->dcid, bthost_received_data,NULL ); - ret =write (sk, l2data->write_data, l2data->data_len); -if (ret != l2data->data_len) { -tester_warn ("Unable to write all data" ); -tester_test_failed (); +l2cap_tx_timestamping (data, io); + +for (count =0 ; count < l2data->send_extra +1 ; ++count) { + ret =write (sk, l2data->write_data, l2data->data_len); +if (ret != l2data->data_len) { +tester_warn ("Unable to write all data" ); +tester_test_failed (); + } + ++data->step; }return FALSE;
@@ -2280,6 +2372,10 @@ int main(int argc, char *argv[]) &client_connect_write_success_test, setup_powered_client, test_connect); +test_l2cap_bredr ("L2CAP BR/EDR Client - TX Timestamping" , + &client_connect_tx_timestamping_test, + setup_powered_client, test_connect); +test_l2cap_bredr ("L2CAP BR/EDR Client - Invalid PSM 1" , &client_connect_nval_psm_test_1, setup_powered_client, test_connect);
Signature · 1 line
2.44.0
Luiz Augusto von Dentz
maintainerHi Pauli,
Quoted 7 lines · Pauli Virtanen
Add tests for ISO and L2CAP TX timestamping
Pauli Virtanen (3):
lib: addBT_SCM_ERRORsock_extended_errCMSG
iso-tester: Add tests for TX timestamping
l2cap-tester: Add test for TX timestamping
Same thing as for missing SCO_LINK handing in the kernel, we probably want to do the same for sco-tester.
Quoted 11 lines
lib/bluetooth.h | 1 + tools/iso-tester.c | 169 ++++++++++++++++++++++++++++++++++++++++--- tools/l2cap-tester.c | 106 +++++++++++++++++++++++++-- tools/tester-utils.h | 163 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 424 insertions(+), 15 deletions(-) create mode 100644 tools/tester-utils.h--
2.44.0
Signature · 1 line
Luiz Augusto von Dentz