2024-04-02 11:39:47

by Iulia Tanasescu

[permalink] [raw]
Subject: [PATCH 0/2] Bluetooth: ISO: Handle PA sync when no BIGInfo reports are generated

In case of a Broadcast Source that has PA enabled but no active BIG,
a Broadcast Sink needs to establish PA sync and parse BASE from PA
reports.

This commit moves the allocation of a PA sync hcon from the BIGInfo
advertising report event to the PA sync established event. After the
first complete PA report, the hcon is notified to the ISO layer. A
child socket is allocated and enqueued in the parent's accept queue.

BIGInfo reports also need to be processed, to extract the encryption
field and inform userspace. After the first BIGInfo report is received,
the PA sync hcon is notified again to the ISO layer. Since a socket will
be found this time, the socket state will transition to BT_CONNECTED and
the userspace will be woken up using sk_state_change.

Iulia Tanasescu (2):
Bluetooth: ISO: Make iso_get_sock_listen generic
Bluetooth: ISO: Handle PA sync when no BIGInfo reports are generated

include/net/bluetooth/hci_core.h | 3 +-
net/bluetooth/hci_event.c | 58 ++++++------
net/bluetooth/iso.c | 149 +++++++++++++++----------------
3 files changed, 106 insertions(+), 104 deletions(-)


base-commit: 2216e1eabc7ca013eb1e8007846253dee72dcb76
--
2.39.2



2024-04-02 11:39:51

by Iulia Tanasescu

[permalink] [raw]
Subject: [PATCH 1/2] Bluetooth: ISO: Make iso_get_sock_listen generic

This makes iso_get_sock_listen more generic, to return matching socket
in the state provided as argument.

Signed-off-by: Iulia Tanasescu <[email protected]>
---
net/bluetooth/iso.c | 75 +++++++++++++++++++++++++--------------------
1 file changed, 42 insertions(+), 33 deletions(-)

diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c
index 42b4495e019e..3fcaef506bde 100644
--- a/net/bluetooth/iso.c
+++ b/net/bluetooth/iso.c
@@ -85,8 +85,9 @@ static void iso_sock_disconn(struct sock *sk);

typedef bool (*iso_sock_match_t)(struct sock *sk, void *data);

-static struct sock *iso_get_sock_listen(bdaddr_t *src, bdaddr_t *dst,
- iso_sock_match_t match, void *data);
+static struct sock *iso_get_sock(bdaddr_t *src, bdaddr_t *dst,
+ unsigned char state,
+ iso_sock_match_t match, void *data);

/* ---- ISO timers ---- */
#define ISO_CONN_TIMEOUT (HZ * 40)
@@ -233,10 +234,11 @@ static void iso_conn_del(struct hci_conn *hcon, int err)
* terminated are not processed anymore.
*/
if (test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags)) {
- parent = iso_get_sock_listen(&hcon->src,
- &hcon->dst,
- iso_match_conn_sync_handle,
- hcon);
+ parent = iso_get_sock(&hcon->src,
+ &hcon->dst,
+ BT_LISTEN,
+ iso_match_conn_sync_handle,
+ hcon);

if (parent) {
set_bit(BT_SK_PA_SYNC_TERM,
@@ -584,22 +586,23 @@ static struct sock *__iso_get_sock_listen_by_sid(bdaddr_t *ba, bdaddr_t *bc,
return NULL;
}

-/* Find socket listening:
+/* Find socket in given state:
* source bdaddr (Unicast)
* destination bdaddr (Broadcast only)
* match func - pass NULL to ignore
* match func data - pass -1 to ignore
* Returns closest match.
*/
-static struct sock *iso_get_sock_listen(bdaddr_t *src, bdaddr_t *dst,
- iso_sock_match_t match, void *data)
+static struct sock *iso_get_sock(bdaddr_t *src, bdaddr_t *dst,
+ unsigned char state,
+ iso_sock_match_t match, void *data)
{
struct sock *sk = NULL, *sk1 = NULL;

read_lock(&iso_sk_list.lock);

sk_for_each(sk, &iso_sk_list.head) {
- if (sk->sk_state != BT_LISTEN)
+ if (sk->sk_state != state)
continue;

/* Match Broadcast destination */
@@ -1805,32 +1808,37 @@ static void iso_conn_ready(struct iso_conn *conn)
HCI_EVT_LE_BIG_SYNC_ESTABILISHED);

/* Get reference to PA sync parent socket, if it exists */
- parent = iso_get_sock_listen(&hcon->src,
- &hcon->dst,
- iso_match_pa_sync_flag, NULL);
+ parent = iso_get_sock(&hcon->src, &hcon->dst,
+ BT_LISTEN,
+ iso_match_pa_sync_flag,
+ NULL);
if (!parent && ev)
- parent = iso_get_sock_listen(&hcon->src,
- &hcon->dst,
- iso_match_big, ev);
+ parent = iso_get_sock(&hcon->src,
+ &hcon->dst,
+ BT_LISTEN,
+ iso_match_big, ev);
} else if (test_bit(HCI_CONN_PA_SYNC_FAILED, &hcon->flags)) {
ev2 = hci_recv_event_data(hcon->hdev,
HCI_EV_LE_PA_SYNC_ESTABLISHED);
if (ev2)
- parent = iso_get_sock_listen(&hcon->src,
- &hcon->dst,
- iso_match_sid, ev2);
+ parent = iso_get_sock(&hcon->src,
+ &hcon->dst,
+ BT_LISTEN,
+ iso_match_sid, ev2);
} else if (test_bit(HCI_CONN_PA_SYNC, &hcon->flags)) {
ev3 = hci_recv_event_data(hcon->hdev,
HCI_EVT_LE_BIG_INFO_ADV_REPORT);
if (ev3)
- parent = iso_get_sock_listen(&hcon->src,
- &hcon->dst,
- iso_match_sync_handle, ev3);
+ parent = iso_get_sock(&hcon->src,
+ &hcon->dst,
+ BT_LISTEN,
+ iso_match_sync_handle,
+ ev3);
}

if (!parent)
- parent = iso_get_sock_listen(&hcon->src,
- BDADDR_ANY, NULL, NULL);
+ parent = iso_get_sock(&hcon->src, BDADDR_ANY,
+ BT_LISTEN, NULL, NULL);

if (!parent)
return;
@@ -1951,8 +1959,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
*/
ev1 = hci_recv_event_data(hdev, HCI_EV_LE_PA_SYNC_ESTABLISHED);
if (ev1) {
- sk = iso_get_sock_listen(&hdev->bdaddr, bdaddr, iso_match_sid,
- ev1);
+ sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN,
+ iso_match_sid, ev1);
if (sk && !ev1->status)
iso_pi(sk)->sync_handle = le16_to_cpu(ev1->handle);

@@ -1962,12 +1970,12 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
ev2 = hci_recv_event_data(hdev, HCI_EVT_LE_BIG_INFO_ADV_REPORT);
if (ev2) {
/* Try to get PA sync listening socket, if it exists */
- sk = iso_get_sock_listen(&hdev->bdaddr, bdaddr,
- iso_match_pa_sync_flag, NULL);
+ sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN,
+ iso_match_pa_sync_flag, NULL);

if (!sk) {
- sk = iso_get_sock_listen(&hdev->bdaddr, bdaddr,
- iso_match_sync_handle, ev2);
+ sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN,
+ iso_match_sync_handle, ev2);

/* If PA Sync is in process of terminating,
* do not handle any more BIGInfo adv reports.
@@ -2007,8 +2015,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
u8 *base;
struct hci_conn *hcon;

- sk = iso_get_sock_listen(&hdev->bdaddr, bdaddr,
- iso_match_sync_handle_pa_report, ev3);
+ sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN,
+ iso_match_sync_handle_pa_report, ev3);
if (!sk)
goto done;

@@ -2057,7 +2065,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
hcon->le_per_adv_data_len = 0;
}
} else {
- sk = iso_get_sock_listen(&hdev->bdaddr, BDADDR_ANY, NULL, NULL);
+ sk = iso_get_sock(&hdev->bdaddr, BDADDR_ANY,
+ BT_LISTEN, NULL, NULL);
}

done:
--
2.39.2


2024-04-02 11:39:53

by Iulia Tanasescu

[permalink] [raw]
Subject: [PATCH 2/2] Bluetooth: ISO: Handle PA sync when no BIGInfo reports are generated

In case of a Broadcast Source that has PA enabled but no active BIG,
a Broadcast Sink needs to establish PA sync and parse BASE from PA
reports.

This commit moves the allocation of a PA sync hcon from the BIGInfo
advertising report event to the PA sync established event. After the
first complete PA report, the hcon is notified to the ISO layer. A
child socket is allocated and enqueued in the parent's accept queue.

BIGInfo reports also need to be processed, to extract the encryption
field and inform userspace. After the first BIGInfo report is received,
the PA sync hcon is notified again to the ISO layer. Since a socket will
be found this time, the socket state will transition to BT_CONNECTED and
the userspace will be woken up using sk_state_change.

Signed-off-by: Iulia Tanasescu <[email protected]>
---
include/net/bluetooth/hci_core.h | 3 +-
net/bluetooth/hci_event.c | 58 +++++++++++---------
net/bluetooth/iso.c | 94 ++++++++++++++------------------
3 files changed, 74 insertions(+), 81 deletions(-)

diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 90ddbf88ed9f..fd6fd4029452 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -1379,8 +1379,7 @@ hci_conn_hash_lookup_pa_sync_handle(struct hci_dev *hdev, __u16 sync_handle)
rcu_read_lock();

list_for_each_entry_rcu(c, &h->list, list) {
- if (c->type != ISO_LINK ||
- !test_bit(HCI_CONN_PA_SYNC, &c->flags))
+ if (c->type != ISO_LINK)
continue;

if (c->sync_handle == sync_handle) {
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 4220c80c1c4e..868ffccff773 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -1,7 +1,7 @@
/*
BlueZ - Bluetooth protocol stack for Linux
Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
- Copyright 2023 NXP
+ Copyright 2023-2024 NXP

Written 2000,2001 by Maxim Krasnyansky <[email protected]>

@@ -6498,14 +6498,16 @@ static void hci_le_pa_sync_estabilished_evt(struct hci_dev *hdev, void *data,
if (!(flags & HCI_PROTO_DEFER))
goto unlock;

- if (ev->status) {
- /* Add connection to indicate the failed PA sync event */
- pa_sync = hci_conn_add_unset(hdev, ISO_LINK, BDADDR_ANY,
- HCI_ROLE_SLAVE);
+ /* Add connection to indicate PA sync event */
+ pa_sync = hci_conn_add_unset(hdev, ISO_LINK, BDADDR_ANY,
+ HCI_ROLE_SLAVE);

- if (!pa_sync)
- goto unlock;
+ if (!pa_sync)
+ goto unlock;
+
+ pa_sync->sync_handle = le16_to_cpu(ev->handle);

+ if (ev->status) {
set_bit(HCI_CONN_PA_SYNC_FAILED, &pa_sync->flags);

/* Notify iso layer */
@@ -6522,6 +6524,7 @@ static void hci_le_per_adv_report_evt(struct hci_dev *hdev, void *data,
struct hci_ev_le_per_adv_report *ev = data;
int mask = hdev->link_mode;
__u8 flags = 0;
+ struct hci_conn *pa_sync;

bt_dev_dbg(hdev, "sync_handle 0x%4.4x", le16_to_cpu(ev->sync_handle));

@@ -6529,8 +6532,28 @@ static void hci_le_per_adv_report_evt(struct hci_dev *hdev, void *data,

mask |= hci_proto_connect_ind(hdev, BDADDR_ANY, ISO_LINK, &flags);
if (!(mask & HCI_LM_ACCEPT))
- hci_le_pa_term_sync(hdev, ev->sync_handle);
+ goto unlock;

+ if (!(flags & HCI_PROTO_DEFER))
+ goto unlock;
+
+ pa_sync = hci_conn_hash_lookup_pa_sync_handle
+ (hdev,
+ le16_to_cpu(ev->sync_handle));
+
+ if (!pa_sync)
+ goto unlock;
+
+ if (ev->data_status == LE_PA_DATA_COMPLETE &&
+ !test_and_set_bit(HCI_CONN_PA_SYNC, &pa_sync->flags)) {
+ /* Notify iso layer */
+ hci_connect_cfm(pa_sync, 0);
+
+ /* Notify MGMT layer */
+ mgmt_device_connected(hdev, pa_sync, NULL, 0);
+ }
+
+unlock:
hci_dev_unlock(hdev);
}

@@ -7063,10 +7086,8 @@ static void hci_le_big_info_adv_report_evt(struct hci_dev *hdev, void *data,
hci_dev_lock(hdev);

mask |= hci_proto_connect_ind(hdev, BDADDR_ANY, ISO_LINK, &flags);
- if (!(mask & HCI_LM_ACCEPT)) {
- hci_le_pa_term_sync(hdev, ev->sync_handle);
+ if (!(mask & HCI_LM_ACCEPT))
goto unlock;
- }

if (!(flags & HCI_PROTO_DEFER))
goto unlock;
@@ -7075,24 +7096,11 @@ static void hci_le_big_info_adv_report_evt(struct hci_dev *hdev, void *data,
(hdev,
le16_to_cpu(ev->sync_handle));

- if (pa_sync)
- goto unlock;
-
- /* Add connection to indicate the PA sync event */
- pa_sync = hci_conn_add_unset(hdev, ISO_LINK, BDADDR_ANY,
- HCI_ROLE_SLAVE);
-
if (!pa_sync)
goto unlock;

- pa_sync->sync_handle = le16_to_cpu(ev->sync_handle);
- set_bit(HCI_CONN_PA_SYNC, &pa_sync->flags);
-
/* Notify iso layer */
- hci_connect_cfm(pa_sync, 0x00);
-
- /* Notify MGMT layer */
- mgmt_device_connected(hdev, pa_sync, NULL, 0);
+ hci_connect_cfm(pa_sync, 0);

unlock:
hci_dev_unlock(hdev);
diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c
index 3fcaef506bde..73aea27d8498 100644
--- a/net/bluetooth/iso.c
+++ b/net/bluetooth/iso.c
@@ -54,7 +54,6 @@ static void iso_sock_kill(struct sock *sk);
enum {
BT_SK_BIG_SYNC,
BT_SK_PA_SYNC,
- BT_SK_PA_SYNC_TERM,
};

struct iso_pinfo {
@@ -81,6 +80,7 @@ static bool check_ucast_qos(struct bt_iso_qos *qos);
static bool check_bcast_qos(struct bt_iso_qos *qos);
static bool iso_match_sid(struct sock *sk, void *data);
static bool iso_match_sync_handle(struct sock *sk, void *data);
+static bool iso_match_sync_handle_pa_report(struct sock *sk, void *data);
static void iso_sock_disconn(struct sock *sk);

typedef bool (*iso_sock_match_t)(struct sock *sk, void *data);
@@ -197,21 +197,10 @@ static void iso_chan_del(struct sock *sk, int err)
sock_set_flag(sk, SOCK_ZAPPED);
}

-static bool iso_match_conn_sync_handle(struct sock *sk, void *data)
-{
- struct hci_conn *hcon = data;
-
- if (test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags))
- return false;
-
- return hcon->sync_handle == iso_pi(sk)->sync_handle;
-}
-
static void iso_conn_del(struct hci_conn *hcon, int err)
{
struct iso_conn *conn = hcon->iso_data;
struct sock *sk;
- struct sock *parent;

if (!conn)
return;
@@ -227,26 +216,6 @@ static void iso_conn_del(struct hci_conn *hcon, int err)

if (sk) {
lock_sock(sk);
-
- /* While a PA sync hcon is in the process of closing,
- * mark parent socket with a flag, so that any residual
- * BIGInfo adv reports that arrive before PA sync is
- * terminated are not processed anymore.
- */
- if (test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags)) {
- parent = iso_get_sock(&hcon->src,
- &hcon->dst,
- BT_LISTEN,
- iso_match_conn_sync_handle,
- hcon);
-
- if (parent) {
- set_bit(BT_SK_PA_SYNC_TERM,
- &iso_pi(parent)->flags);
- sock_put(parent);
- }
- }
-
iso_sock_clear_timer(sk);
iso_chan_del(sk, err);
release_sock(sk);
@@ -863,6 +832,7 @@ static struct sock *iso_sock_alloc(struct net *net, struct socket *sock,
iso_pi(sk)->src_type = BDADDR_LE_PUBLIC;

iso_pi(sk)->qos = default_qos;
+ iso_pi(sk)->sync_handle = -1;

bt_sock_link(&iso_sk_list, sk);
return sk;
@@ -910,7 +880,6 @@ static int iso_sock_bind_bc(struct socket *sock, struct sockaddr *addr,
return -EINVAL;

iso_pi(sk)->dst_type = sa->iso_bc->bc_bdaddr_type;
- iso_pi(sk)->sync_handle = -1;

if (sa->iso_bc->bc_sid > 0x0f)
return -EINVAL;
@@ -987,7 +956,8 @@ static int iso_sock_bind(struct socket *sock, struct sockaddr *addr,
/* Allow the user to bind a PA sync socket to a number
* of BISes to sync to.
*/
- if (sk->sk_state == BT_CONNECT2 &&
+ if ((sk->sk_state == BT_CONNECT2 ||
+ sk->sk_state == BT_CONNECTED) &&
test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags)) {
err = iso_sock_bind_pa_sk(sk, sa, addr_len);
goto done;
@@ -1412,6 +1382,16 @@ static int iso_sock_recvmsg(struct socket *sock, struct msghdr *msg,
}
release_sock(sk);
return 0;
+ case BT_CONNECTED:
+ if (test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags)) {
+ iso_conn_big_sync(sk);
+ sk->sk_state = BT_LISTEN;
+ release_sock(sk);
+ return 0;
+ }
+
+ release_sock(sk);
+ break;
case BT_CONNECT:
release_sock(sk);
return iso_connect_cis(sk);
@@ -1559,7 +1539,9 @@ static int iso_sock_setsockopt(struct socket *sock, int level, int optname,

case BT_ISO_QOS:
if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND &&
- sk->sk_state != BT_CONNECT2) {
+ sk->sk_state != BT_CONNECT2 &&
+ (!test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags) ||
+ sk->sk_state != BT_CONNECTED)) {
err = -EINVAL;
break;
}
@@ -1790,7 +1772,7 @@ static void iso_conn_ready(struct iso_conn *conn)
struct sock *sk = conn->sk;
struct hci_ev_le_big_sync_estabilished *ev = NULL;
struct hci_ev_le_pa_sync_established *ev2 = NULL;
- struct hci_evt_le_big_info_adv_report *ev3 = NULL;
+ struct hci_ev_le_per_adv_report *ev3 = NULL;
struct hci_conn *hcon;

BT_DBG("conn %p", conn);
@@ -1827,12 +1809,12 @@ static void iso_conn_ready(struct iso_conn *conn)
iso_match_sid, ev2);
} else if (test_bit(HCI_CONN_PA_SYNC, &hcon->flags)) {
ev3 = hci_recv_event_data(hcon->hdev,
- HCI_EVT_LE_BIG_INFO_ADV_REPORT);
+ HCI_EV_LE_PER_ADV_REPORT);
if (ev3)
parent = iso_get_sock(&hcon->src,
&hcon->dst,
BT_LISTEN,
- iso_match_sync_handle,
+ iso_match_sync_handle_pa_report,
ev3);
}

@@ -1875,7 +1857,6 @@ static void iso_conn_ready(struct iso_conn *conn)

if (ev3) {
iso_pi(sk)->qos = iso_pi(parent)->qos;
- iso_pi(sk)->qos.bcast.encryption = ev3->encryption;
hcon->iso_qos = iso_pi(sk)->qos;
iso_pi(sk)->bc_num_bis = iso_pi(parent)->bc_num_bis;
memcpy(iso_pi(sk)->bc_bis, iso_pi(parent)->bc_bis, ISO_MAX_NUM_BIS);
@@ -1969,26 +1950,29 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)

ev2 = hci_recv_event_data(hdev, HCI_EVT_LE_BIG_INFO_ADV_REPORT);
if (ev2) {
- /* Try to get PA sync listening socket, if it exists */
- sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN,
- iso_match_pa_sync_flag, NULL);
-
- if (!sk) {
- sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN,
- iso_match_sync_handle, ev2);
-
- /* If PA Sync is in process of terminating,
- * do not handle any more BIGInfo adv reports.
- */
-
- if (sk && test_bit(BT_SK_PA_SYNC_TERM,
- &iso_pi(sk)->flags))
- return 0;
+ /* Check if BIGInfo report has already been handled */
+ sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_CONNECTED,
+ iso_match_sync_handle, ev2);
+ if (sk) {
+ sock_put(sk);
+ sk = NULL;
+ goto done;
}

+ /* Try to get PA sync socket, if it exists */
+ sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_CONNECT2,
+ iso_match_sync_handle, ev2);
+ if (!sk)
+ sk = iso_get_sock(&hdev->bdaddr, bdaddr,
+ BT_LISTEN,
+ iso_match_sync_handle,
+ ev2);
+
if (sk) {
int err;

+ iso_pi(sk)->qos.bcast.encryption = ev2->encryption;
+
if (ev2->num_bis < iso_pi(sk)->bc_num_bis)
iso_pi(sk)->bc_num_bis = ev2->num_bis;

@@ -2007,6 +1991,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
}
}
}
+
+ goto done;
}

ev3 = hci_recv_event_data(hdev, HCI_EV_LE_PER_ADV_REPORT);
--
2.39.2


2024-04-02 12:58:49

by bluez.test.bot

[permalink] [raw]
Subject: RE: Bluetooth: ISO: Handle PA sync when no BIGInfo reports are generated

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=840593

---Test result---

Test Summary:
CheckPatch PASS 3.18 seconds
GitLint PASS 0.71 seconds
SubjectPrefix PASS 0.38 seconds
BuildKernel PASS 29.86 seconds
CheckAllWarning PASS 32.45 seconds
CheckSparse WARNING 38.07 seconds
CheckSmatch FAIL 41.55 seconds
BuildKernel32 PASS 28.85 seconds
TestRunnerSetup PASS 519.08 seconds
TestRunner_l2cap-tester PASS 17.95 seconds
TestRunner_iso-tester FAIL 38.42 seconds
TestRunner_bnep-tester PASS 4.69 seconds
TestRunner_mgmt-tester PASS 110.75 seconds
TestRunner_rfcomm-tester PASS 7.29 seconds
TestRunner_sco-tester PASS 14.86 seconds
TestRunner_ioctl-tester PASS 7.67 seconds
TestRunner_mesh-tester PASS 5.83 seconds
TestRunner_smp-tester PASS 7.54 seconds
TestRunner_userchan-tester PASS 10.42 seconds
IncrementalBuild PASS 51.97 seconds

Details
##############################
Test: CheckSparse - WARNING
Desc: Run sparse tool with linux kernel
Output:
net/bluetooth/hci_event.c: note: in included file (through include/net/bluetooth/hci_core.h):
##############################
Test: CheckSmatch - FAIL
Desc: Run smatch tool with source
Output:

Segmentation fault (core dumped)
make[4]: *** [scripts/Makefile.build:244: net/bluetooth/hci_core.o] Error 139
make[4]: *** Deleting file 'net/bluetooth/hci_core.o'
make[3]: *** [scripts/Makefile.build:485: net/bluetooth] Error 2
make[2]: *** [scripts/Makefile.build:485: net] Error 2
make[2]: *** Waiting for unfinished jobs....
Segmentation fault (core dumped)
make[4]: *** [scripts/Makefile.build:244: drivers/bluetooth/bcm203x.o] Error 139
make[4]: *** Deleting file 'drivers/bluetooth/bcm203x.o'
make[4]: *** Waiting for unfinished jobs....
make[3]: *** [scripts/Makefile.build:485: drivers/bluetooth] Error 2
make[2]: *** [scripts/Makefile.build:485: drivers] Error 2
make[1]: *** [/github/workspace/src/src/Makefile:1919: .] Error 2
make: *** [Makefile:240: __sub-make] Error 2
##############################
Test: TestRunner_iso-tester - FAIL
Desc: Run iso-tester with test-runner
Output:
Total: 117, Passed: 116 (99.1%), Failed: 1, Not Run: 0

Failed Test Cases
ISO Connect2 Suspend - Success Failed 8.248 seconds


---
Regards,
Linux Bluetooth

2024-04-02 15:48:05

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [PATCH 1/2] Bluetooth: ISO: Make iso_get_sock_listen generic

Hi Iulia,

On Tue, Apr 2, 2024 at 7:39 AM Iulia Tanasescu <[email protected]> wrote:
>
> This makes iso_get_sock_listen more generic, to return matching socket
> in the state provided as argument.
>
> Signed-off-by: Iulia Tanasescu <[email protected]>
> ---
> net/bluetooth/iso.c | 75 +++++++++++++++++++++++++--------------------
> 1 file changed, 42 insertions(+), 33 deletions(-)
>
> diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c
> index 42b4495e019e..3fcaef506bde 100644
> --- a/net/bluetooth/iso.c
> +++ b/net/bluetooth/iso.c
> @@ -85,8 +85,9 @@ static void iso_sock_disconn(struct sock *sk);
>
> typedef bool (*iso_sock_match_t)(struct sock *sk, void *data);
>
> -static struct sock *iso_get_sock_listen(bdaddr_t *src, bdaddr_t *dst,
> - iso_sock_match_t match, void *data);
> +static struct sock *iso_get_sock(bdaddr_t *src, bdaddr_t *dst,
> + unsigned char state,

Lets add a name to the enum in bluetooth.h when the socket states are
defined then we can use it here instead of passing as unsigned char.

> + iso_sock_match_t match, void *data);
>
> /* ---- ISO timers ---- */
> #define ISO_CONN_TIMEOUT (HZ * 40)
> @@ -233,10 +234,11 @@ static void iso_conn_del(struct hci_conn *hcon, int err)
> * terminated are not processed anymore.
> */
> if (test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags)) {
> - parent = iso_get_sock_listen(&hcon->src,
> - &hcon->dst,
> - iso_match_conn_sync_handle,
> - hcon);
> + parent = iso_get_sock(&hcon->src,
> + &hcon->dst,
> + BT_LISTEN,
> + iso_match_conn_sync_handle,
> + hcon);
>
> if (parent) {
> set_bit(BT_SK_PA_SYNC_TERM,
> @@ -584,22 +586,23 @@ static struct sock *__iso_get_sock_listen_by_sid(bdaddr_t *ba, bdaddr_t *bc,
> return NULL;
> }
>
> -/* Find socket listening:
> +/* Find socket in given state:
> * source bdaddr (Unicast)
> * destination bdaddr (Broadcast only)
> * match func - pass NULL to ignore
> * match func data - pass -1 to ignore
> * Returns closest match.
> */
> -static struct sock *iso_get_sock_listen(bdaddr_t *src, bdaddr_t *dst,
> - iso_sock_match_t match, void *data)
> +static struct sock *iso_get_sock(bdaddr_t *src, bdaddr_t *dst,
> + unsigned char state,
> + iso_sock_match_t match, void *data)
> {
> struct sock *sk = NULL, *sk1 = NULL;
>
> read_lock(&iso_sk_list.lock);
>
> sk_for_each(sk, &iso_sk_list.head) {
> - if (sk->sk_state != BT_LISTEN)
> + if (sk->sk_state != state)
> continue;
>
> /* Match Broadcast destination */
> @@ -1805,32 +1808,37 @@ static void iso_conn_ready(struct iso_conn *conn)
> HCI_EVT_LE_BIG_SYNC_ESTABILISHED);
>
> /* Get reference to PA sync parent socket, if it exists */
> - parent = iso_get_sock_listen(&hcon->src,
> - &hcon->dst,
> - iso_match_pa_sync_flag, NULL);
> + parent = iso_get_sock(&hcon->src, &hcon->dst,
> + BT_LISTEN,
> + iso_match_pa_sync_flag,
> + NULL);
> if (!parent && ev)
> - parent = iso_get_sock_listen(&hcon->src,
> - &hcon->dst,
> - iso_match_big, ev);
> + parent = iso_get_sock(&hcon->src,
> + &hcon->dst,
> + BT_LISTEN,
> + iso_match_big, ev);
> } else if (test_bit(HCI_CONN_PA_SYNC_FAILED, &hcon->flags)) {
> ev2 = hci_recv_event_data(hcon->hdev,
> HCI_EV_LE_PA_SYNC_ESTABLISHED);
> if (ev2)
> - parent = iso_get_sock_listen(&hcon->src,
> - &hcon->dst,
> - iso_match_sid, ev2);
> + parent = iso_get_sock(&hcon->src,
> + &hcon->dst,
> + BT_LISTEN,
> + iso_match_sid, ev2);
> } else if (test_bit(HCI_CONN_PA_SYNC, &hcon->flags)) {
> ev3 = hci_recv_event_data(hcon->hdev,
> HCI_EVT_LE_BIG_INFO_ADV_REPORT);
> if (ev3)
> - parent = iso_get_sock_listen(&hcon->src,
> - &hcon->dst,
> - iso_match_sync_handle, ev3);
> + parent = iso_get_sock(&hcon->src,
> + &hcon->dst,
> + BT_LISTEN,
> + iso_match_sync_handle,
> + ev3);
> }
>
> if (!parent)
> - parent = iso_get_sock_listen(&hcon->src,
> - BDADDR_ANY, NULL, NULL);
> + parent = iso_get_sock(&hcon->src, BDADDR_ANY,
> + BT_LISTEN, NULL, NULL);
>
> if (!parent)
> return;
> @@ -1951,8 +1959,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
> */
> ev1 = hci_recv_event_data(hdev, HCI_EV_LE_PA_SYNC_ESTABLISHED);
> if (ev1) {
> - sk = iso_get_sock_listen(&hdev->bdaddr, bdaddr, iso_match_sid,
> - ev1);
> + sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN,
> + iso_match_sid, ev1);
> if (sk && !ev1->status)
> iso_pi(sk)->sync_handle = le16_to_cpu(ev1->handle);
>
> @@ -1962,12 +1970,12 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
> ev2 = hci_recv_event_data(hdev, HCI_EVT_LE_BIG_INFO_ADV_REPORT);
> if (ev2) {
> /* Try to get PA sync listening socket, if it exists */
> - sk = iso_get_sock_listen(&hdev->bdaddr, bdaddr,
> - iso_match_pa_sync_flag, NULL);
> + sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN,
> + iso_match_pa_sync_flag, NULL);
>
> if (!sk) {
> - sk = iso_get_sock_listen(&hdev->bdaddr, bdaddr,
> - iso_match_sync_handle, ev2);
> + sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN,
> + iso_match_sync_handle, ev2);
>
> /* If PA Sync is in process of terminating,
> * do not handle any more BIGInfo adv reports.
> @@ -2007,8 +2015,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
> u8 *base;
> struct hci_conn *hcon;
>
> - sk = iso_get_sock_listen(&hdev->bdaddr, bdaddr,
> - iso_match_sync_handle_pa_report, ev3);
> + sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN,
> + iso_match_sync_handle_pa_report, ev3);
> if (!sk)
> goto done;
>
> @@ -2057,7 +2065,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
> hcon->le_per_adv_data_len = 0;
> }
> } else {
> - sk = iso_get_sock_listen(&hdev->bdaddr, BDADDR_ANY, NULL, NULL);
> + sk = iso_get_sock(&hdev->bdaddr, BDADDR_ANY,
> + BT_LISTEN, NULL, NULL);
> }
>
> done:
> --
> 2.39.2
>


--
Luiz Augusto von Dentz

2024-04-02 17:30:49

by patchwork-bot+bluetooth

[permalink] [raw]
Subject: Re: [PATCH 0/2] Bluetooth: ISO: Handle PA sync when no BIGInfo reports are generated

Hello:

This series was applied to bluetooth/bluetooth-next.git (master)
by Luiz Augusto von Dentz <[email protected]>:

On Tue, 2 Apr 2024 14:39:29 +0300 you wrote:
> In case of a Broadcast Source that has PA enabled but no active BIG,
> a Broadcast Sink needs to establish PA sync and parse BASE from PA
> reports.
>
> This commit moves the allocation of a PA sync hcon from the BIGInfo
> advertising report event to the PA sync established event. After the
> first complete PA report, the hcon is notified to the ISO layer. A
> child socket is allocated and enqueued in the parent's accept queue.
>
> [...]

Here is the summary with links:
- [1/2] Bluetooth: ISO: Make iso_get_sock_listen generic
(no matching commit)
- [2/2] Bluetooth: ISO: Handle PA sync when no BIGInfo reports are generated
https://git.kernel.org/bluetooth/bluetooth-next/c/3e3fa13686bf

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html