[PATCH] Bluetooth: fix socket matching ambiguity between BIS and CIS

Yang Li via B4 Relay posted 1 patch 7 months, 1 week ago
There is a newer version of this series
net/bluetooth/hci_event.c | 35 ++++++++++++++++++++---------------
net/bluetooth/iso.c       | 12 +++++++++---
2 files changed, 29 insertions(+), 18 deletions(-)
[PATCH] Bluetooth: fix socket matching ambiguity between BIS and CIS
Posted by Yang Li via B4 Relay 7 months, 1 week ago
From: Yang Li <yang.li@amlogic.com>

The iso_get_sock function adds dst address matching to
distinguish BIS and CIS sockets.

Link: https://github.com/bluez/bluez/issues/1224

Signed-off-by: Yang Li <yang.li@amlogic.com>
---
 net/bluetooth/hci_event.c | 35 ++++++++++++++++++++---------------
 net/bluetooth/iso.c       | 12 +++++++++---
 2 files changed, 29 insertions(+), 18 deletions(-)

diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 66052d6aaa1d..c1f32e98ef8a 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -6413,6 +6413,8 @@ static void hci_le_pa_sync_estabilished_evt(struct hci_dev *hdev, void *data,
 
 	conn->sync_handle = le16_to_cpu(ev->handle);
 	conn->sid = HCI_SID_INVALID;
+	conn->dst = ev->bdaddr;
+	conn->dst_type = ev->bdaddr_type;
 
 	mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, BIS_LINK,
 				      &flags);
@@ -6425,7 +6427,8 @@ static void hci_le_pa_sync_estabilished_evt(struct hci_dev *hdev, void *data,
 		goto unlock;
 
 	/* Add connection to indicate PA sync event */
-	pa_sync = hci_conn_add_unset(hdev, BIS_LINK, BDADDR_ANY,
+
+	pa_sync = hci_conn_add_unset(hdev, BIS_LINK, &ev->bdaddr,
 				     HCI_ROLE_SLAVE);
 
 	if (IS_ERR(pa_sync))
@@ -6456,13 +6459,6 @@ static void hci_le_per_adv_report_evt(struct hci_dev *hdev, void *data,
 
 	hci_dev_lock(hdev);
 
-	mask |= hci_proto_connect_ind(hdev, BDADDR_ANY, BIS_LINK, &flags);
-	if (!(mask & HCI_LM_ACCEPT))
-		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));
@@ -6470,6 +6466,13 @@ static void hci_le_per_adv_report_evt(struct hci_dev *hdev, void *data,
 	if (!pa_sync)
 		goto unlock;
 
+	mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
+	if (!(mask & HCI_LM_ACCEPT))
+		goto unlock;
+
+	if (!(flags & HCI_PROTO_DEFER))
+		goto unlock;
+
 	if (ev->data_status == LE_PA_DATA_COMPLETE &&
 	    !test_and_set_bit(HCI_CONN_PA_SYNC, &pa_sync->flags)) {
 		/* Notify iso layer */
@@ -6993,6 +6996,8 @@ static void hci_le_big_sync_established_evt(struct hci_dev *hdev, void *data,
 			set_bit(HCI_CONN_PA_SYNC, &bis->flags);
 
 		bis->sync_handle = conn->sync_handle;
+		bis->dst = conn->dst;
+		bis->dst_type = conn->dst_type;
 		bis->iso_qos.bcast.big = ev->handle;
 		memset(&interval, 0, sizeof(interval));
 		memcpy(&interval, ev->latency, sizeof(ev->latency));
@@ -7038,13 +7043,6 @@ 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, BIS_LINK, &flags);
-	if (!(mask & HCI_LM_ACCEPT))
-		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));
@@ -7054,6 +7052,13 @@ static void hci_le_big_info_adv_report_evt(struct hci_dev *hdev, void *data,
 
 	pa_sync->iso_qos.bcast.encryption = ev->encryption;
 
+	mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
+	if (!(mask & HCI_LM_ACCEPT))
+		goto unlock;
+
+	if (!(flags & HCI_PROTO_DEFER))
+		goto unlock;
+
 	/* Notify iso layer */
 	hci_connect_cfm(pa_sync, 0);
 
diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c
index 6e2c752aaa8f..1dc233f04dbe 100644
--- a/net/bluetooth/iso.c
+++ b/net/bluetooth/iso.c
@@ -641,11 +641,12 @@ static struct sock *iso_get_sock(bdaddr_t *src, bdaddr_t *dst,
 			continue;
 
 		/* Exact match. */
-		if (!bacmp(&iso_pi(sk)->src, src)) {
+		if (!bacmp(&iso_pi(sk)->src, src)
+		     && !bacmp(&iso_pi(sk)->dst, dst)
+			){
 			sock_hold(sk);
 			break;
 		}
-
 		/* Closest match */
 		if (!bacmp(&iso_pi(sk)->src, BDADDR_ANY)) {
 			if (sk1)
@@ -1962,7 +1963,7 @@ static void iso_conn_ready(struct iso_conn *conn)
 		}
 
 		if (!parent)
-			parent = iso_get_sock(&hcon->src, BDADDR_ANY,
+			parent = iso_get_sock(&hcon->src, &hcon->dst,
 					      BT_LISTEN, NULL, NULL);
 
 		if (!parent)
@@ -2203,6 +2204,11 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
 	} else {
 		sk = iso_get_sock(&hdev->bdaddr, BDADDR_ANY,
 				  BT_LISTEN, NULL, NULL);
+		if (!sk)
+			sk = iso_get_sock(&hdev->bdaddr, bdaddr,
+					  BT_LISTEN, NULL, NULL);
+		else
+			iso_pi(sk)->dst = *bdaddr;
 	}
 
 done:

---
base-commit: f3daca9b490154fbb0459848cc2ed61e8367bddc
change-id: 20250506-iso-6515893b5bb3

Best regards,
-- 
Yang Li <yang.li@amlogic.com>
Re: [PATCH] Bluetooth: fix socket matching ambiguity between BIS and CIS
Posted by kernel test robot 7 months, 1 week ago
Hi Yang,

kernel test robot noticed the following build errors:

[auto build test ERROR on f3daca9b490154fbb0459848cc2ed61e8367bddc]

url:    https://github.com/intel-lab-lkp/linux/commits/Yang-Li-via-B4-Relay/Bluetooth-fix-socket-matching-ambiguity-between-BIS-and-CIS/20250507-153347
base:   f3daca9b490154fbb0459848cc2ed61e8367bddc
patch link:    https://lore.kernel.org/r/20250507-iso-v1-1-6f60d243e037%40amlogic.com
patch subject: [PATCH] Bluetooth: fix socket matching ambiguity between BIS and CIS
config: i386-allmodconfig (https://download.01.org/0day-ci/archive/20250508/202505081427.1Y3wyo7v-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250508/202505081427.1Y3wyo7v-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202505081427.1Y3wyo7v-lkp@intel.com/

All errors (new ones prefixed by >>):

   net/bluetooth/hci_event.c: In function 'hci_le_per_adv_report_evt':
>> net/bluetooth/hci_event.c:6469:60: error: 'ISO_LINK' undeclared (first use in this function); did you mean 'SCO_LINK'?
    6469 |         mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
         |                                                            ^~~~~~~~
         |                                                            SCO_LINK
   net/bluetooth/hci_event.c:6469:60: note: each undeclared identifier is reported only once for each function it appears in
   net/bluetooth/hci_event.c: In function 'hci_le_big_info_adv_report_evt':
   net/bluetooth/hci_event.c:7055:60: error: 'ISO_LINK' undeclared (first use in this function); did you mean 'SCO_LINK'?
    7055 |         mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
         |                                                            ^~~~~~~~
         |                                                            SCO_LINK


vim +6469 net/bluetooth/hci_event.c

  6449	
  6450	static void hci_le_per_adv_report_evt(struct hci_dev *hdev, void *data,
  6451					      struct sk_buff *skb)
  6452	{
  6453		struct hci_ev_le_per_adv_report *ev = data;
  6454		int mask = hdev->link_mode;
  6455		__u8 flags = 0;
  6456		struct hci_conn *pa_sync;
  6457	
  6458		bt_dev_dbg(hdev, "sync_handle 0x%4.4x", le16_to_cpu(ev->sync_handle));
  6459	
  6460		hci_dev_lock(hdev);
  6461	
  6462		pa_sync = hci_conn_hash_lookup_pa_sync_handle
  6463				(hdev,
  6464				le16_to_cpu(ev->sync_handle));
  6465	
  6466		if (!pa_sync)
  6467			goto unlock;
  6468	
> 6469		mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
  6470		if (!(mask & HCI_LM_ACCEPT))
  6471			goto unlock;
  6472	
  6473		if (!(flags & HCI_PROTO_DEFER))
  6474			goto unlock;
  6475	
  6476		if (ev->data_status == LE_PA_DATA_COMPLETE &&
  6477		    !test_and_set_bit(HCI_CONN_PA_SYNC, &pa_sync->flags)) {
  6478			/* Notify iso layer */
  6479			hci_connect_cfm(pa_sync, 0);
  6480	
  6481			/* Notify MGMT layer */
  6482			mgmt_device_connected(hdev, pa_sync, NULL, 0);
  6483		}
  6484	
  6485	unlock:
  6486		hci_dev_unlock(hdev);
  6487	}
  6488	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Re: [PATCH] Bluetooth: fix socket matching ambiguity between BIS and CIS
Posted by Luiz Augusto von Dentz 7 months, 1 week ago
Hi,

On Thu, May 8, 2025 at 2:54 AM kernel test robot <lkp@intel.com> wrote:
>
> Hi Yang,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on f3daca9b490154fbb0459848cc2ed61e8367bddc]
>
> url:    https://github.com/intel-lab-lkp/linux/commits/Yang-Li-via-B4-Relay/Bluetooth-fix-socket-matching-ambiguity-between-BIS-and-CIS/20250507-153347
> base:   f3daca9b490154fbb0459848cc2ed61e8367bddc
> patch link:    https://lore.kernel.org/r/20250507-iso-v1-1-6f60d243e037%40amlogic.com
> patch subject: [PATCH] Bluetooth: fix socket matching ambiguity between BIS and CIS
> config: i386-allmodconfig (https://download.01.org/0day-ci/archive/20250508/202505081427.1Y3wyo7v-lkp@intel.com/config)
> compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250508/202505081427.1Y3wyo7v-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202505081427.1Y3wyo7v-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
>    net/bluetooth/hci_event.c: In function 'hci_le_per_adv_report_evt':
> >> net/bluetooth/hci_event.c:6469:60: error: 'ISO_LINK' undeclared (first use in this function); did you mean 'SCO_LINK'?
>     6469 |         mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
>          |                                                            ^~~~~~~~
>          |                                                            SCO_LINK
>    net/bluetooth/hci_event.c:6469:60: note: each undeclared identifier is reported only once for each function it appears in
>    net/bluetooth/hci_event.c: In function 'hci_le_big_info_adv_report_evt':
>    net/bluetooth/hci_event.c:7055:60: error: 'ISO_LINK' undeclared (first use in this function); did you mean 'SCO_LINK'?
>     7055 |         mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
>          |                                                            ^~~~~~~~
>          |                                                            SCO_LINK
>
>
> vim +6469 net/bluetooth/hci_event.c
>
>   6449
>   6450  static void hci_le_per_adv_report_evt(struct hci_dev *hdev, void *data,
>   6451                                        struct sk_buff *skb)
>   6452  {
>   6453          struct hci_ev_le_per_adv_report *ev = data;
>   6454          int mask = hdev->link_mode;
>   6455          __u8 flags = 0;
>   6456          struct hci_conn *pa_sync;
>   6457
>   6458          bt_dev_dbg(hdev, "sync_handle 0x%4.4x", le16_to_cpu(ev->sync_handle));
>   6459
>   6460          hci_dev_lock(hdev);
>   6461
>   6462          pa_sync = hci_conn_hash_lookup_pa_sync_handle
>   6463                          (hdev,
>   6464                          le16_to_cpu(ev->sync_handle));
>   6465
>   6466          if (!pa_sync)
>   6467                  goto unlock;
>   6468
> > 6469          mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
>   6470          if (!(mask & HCI_LM_ACCEPT))
>   6471                  goto unlock;
>   6472
>   6473          if (!(flags & HCI_PROTO_DEFER))
>   6474                  goto unlock;
>   6475
>   6476          if (ev->data_status == LE_PA_DATA_COMPLETE &&
>   6477              !test_and_set_bit(HCI_CONN_PA_SYNC, &pa_sync->flags)) {
>   6478                  /* Notify iso layer */
>   6479                  hci_connect_cfm(pa_sync, 0);
>   6480
>   6481                  /* Notify MGMT layer */
>   6482                  mgmt_device_connected(hdev, pa_sync, NULL, 0);
>   6483          }
>   6484
>   6485  unlock:
>   6486          hci_dev_unlock(hdev);
>   6487  }
>   6488
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki

This is probably already solved by:

https://github.com/bluez/bluetooth-next/commit/f3daca9b490154fbb0459848cc2ed61e8367bddc

-- 
Luiz Augusto von Dentz
Re: [PATCH] Bluetooth: fix socket matching ambiguity between BIS and CIS
Posted by Yang Li 7 months, 1 week ago
Hi Luzi,
> [ EXTERNAL EMAIL ]
>
> Hi,
>
> On Thu, May 8, 2025 at 2:54 AM kernel test robot <lkp@intel.com> wrote:
>> Hi Yang,
>>
>> kernel test robot noticed the following build errors:
>>
>> [auto build test ERROR on f3daca9b490154fbb0459848cc2ed61e8367bddc]
>>
>> url:    https://github.com/intel-lab-lkp/linux/commits/Yang-Li-via-B4-Relay/Bluetooth-fix-socket-matching-ambiguity-between-BIS-and-CIS/20250507-153347
>> base:   f3daca9b490154fbb0459848cc2ed61e8367bddc
>> patch link:    https://lore.kernel.org/r/20250507-iso-v1-1-6f60d243e037%40amlogic.com
>> patch subject: [PATCH] Bluetooth: fix socket matching ambiguity between BIS and CIS
>> config: i386-allmodconfig (https://download.01.org/0day-ci/archive/20250508/202505081427.1Y3wyo7v-lkp@intel.com/config)
>> compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
>> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250508/202505081427.1Y3wyo7v-lkp@intel.com/reproduce)
>>
>> If you fix the issue in a separate patch/commit (i.e. not just a new version of
>> the same patch/commit), kindly add following tags
>> | Reported-by: kernel test robot <lkp@intel.com>
>> | Closes: https://lore.kernel.org/oe-kbuild-all/202505081427.1Y3wyo7v-lkp@intel.com/
>>
>> All errors (new ones prefixed by >>):
>>
>>     net/bluetooth/hci_event.c: In function 'hci_le_per_adv_report_evt':
>>>> net/bluetooth/hci_event.c:6469:60: error: 'ISO_LINK' undeclared (first use in this function); did you mean 'SCO_LINK'?
>>      6469 |         mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
>>           |                                                            ^~~~~~~~
>>           |                                                            SCO_LINK
>>     net/bluetooth/hci_event.c:6469:60: note: each undeclared identifier is reported only once for each function it appears in
>>     net/bluetooth/hci_event.c: In function 'hci_le_big_info_adv_report_evt':
>>     net/bluetooth/hci_event.c:7055:60: error: 'ISO_LINK' undeclared (first use in this function); did you mean 'SCO_LINK'?
>>      7055 |         mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
>>           |                                                            ^~~~~~~~
>>           |                                                            SCO_LINK
>>
>>
>> vim +6469 net/bluetooth/hci_event.c
>>
>>    6449
>>    6450  static void hci_le_per_adv_report_evt(struct hci_dev *hdev, void *data,
>>    6451                                        struct sk_buff *skb)
>>    6452  {
>>    6453          struct hci_ev_le_per_adv_report *ev = data;
>>    6454          int mask = hdev->link_mode;
>>    6455          __u8 flags = 0;
>>    6456          struct hci_conn *pa_sync;
>>    6457
>>    6458          bt_dev_dbg(hdev, "sync_handle 0x%4.4x", le16_to_cpu(ev->sync_handle));
>>    6459
>>    6460          hci_dev_lock(hdev);
>>    6461
>>    6462          pa_sync = hci_conn_hash_lookup_pa_sync_handle
>>    6463                          (hdev,
>>    6464                          le16_to_cpu(ev->sync_handle));
>>    6465
>>    6466          if (!pa_sync)
>>    6467                  goto unlock;
>>    6468
>>> 6469          mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
>>    6470          if (!(mask & HCI_LM_ACCEPT))
>>    6471                  goto unlock;
>>    6472
>>    6473          if (!(flags & HCI_PROTO_DEFER))
>>    6474                  goto unlock;
>>    6475
>>    6476          if (ev->data_status == LE_PA_DATA_COMPLETE &&
>>    6477              !test_and_set_bit(HCI_CONN_PA_SYNC, &pa_sync->flags)) {
>>    6478                  /* Notify iso layer */
>>    6479                  hci_connect_cfm(pa_sync, 0);
>>    6480
>>    6481                  /* Notify MGMT layer */
>>    6482                  mgmt_device_connected(hdev, pa_sync, NULL, 0);
>>    6483          }
>>    6484
>>    6485  unlock:
>>    6486          hci_dev_unlock(hdev);
>>    6487  }
>>    6488
>>
>> --
>> 0-DAY CI Kernel Test Service
>> https://github.com/intel/lkp-tests/wiki
> This is probably already solved by:
>
> https://github.com/bluez/bluetooth-next/commit/f3daca9b490154fbb0459848cc2ed61e8367bddc


I'm currently working with kernel 6.12, but this patch seems to conflict 
with it. Do you know if there's a plan to backport it to v6.12?

>
> --
> Luiz Augusto von Dentz
Re: [PATCH] Bluetooth: fix socket matching ambiguity between BIS and CIS
Posted by Paul Menzel 7 months, 1 week ago
Dear Yang,


Thank you for your patch.

Am 07.05.25 um 09:30 schrieb Yang Li via B4 Relay:
> From: Yang Li <yang.li@amlogic.com>

It’d be great if you could start by describing the problem.

> The iso_get_sock function adds dst address matching to
> distinguish BIS and CIS sockets.
> 
> Link: https://github.com/bluez/bluez/issues/1224

How can this patch be tested?

> Signed-off-by: Yang Li <yang.li@amlogic.com>
> ---
>   net/bluetooth/hci_event.c | 35 ++++++++++++++++++++---------------
>   net/bluetooth/iso.c       | 12 +++++++++---
>   2 files changed, 29 insertions(+), 18 deletions(-)
> 
> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> index 66052d6aaa1d..c1f32e98ef8a 100644
> --- a/net/bluetooth/hci_event.c
> +++ b/net/bluetooth/hci_event.c
> @@ -6413,6 +6413,8 @@ static void hci_le_pa_sync_estabilished_evt(struct hci_dev *hdev, void *data,
>   
>   	conn->sync_handle = le16_to_cpu(ev->handle);
>   	conn->sid = HCI_SID_INVALID;
> +	conn->dst = ev->bdaddr;
> +	conn->dst_type = ev->bdaddr_type;
>   
>   	mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, BIS_LINK,
>   				      &flags);
> @@ -6425,7 +6427,8 @@ static void hci_le_pa_sync_estabilished_evt(struct hci_dev *hdev, void *data,
>   		goto unlock;
>   
>   	/* Add connection to indicate PA sync event */
> -	pa_sync = hci_conn_add_unset(hdev, BIS_LINK, BDADDR_ANY,
> +

Why the extra blank line?

> +	pa_sync = hci_conn_add_unset(hdev, BIS_LINK, &ev->bdaddr,
>   				     HCI_ROLE_SLAVE);
>   
>   	if (IS_ERR(pa_sync))


Kind regards,

Paul


> @@ -6456,13 +6459,6 @@ static void hci_le_per_adv_report_evt(struct hci_dev *hdev, void *data,
>   
>   	hci_dev_lock(hdev);
>   
> -	mask |= hci_proto_connect_ind(hdev, BDADDR_ANY, BIS_LINK, &flags);
> -	if (!(mask & HCI_LM_ACCEPT))
> -		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));
> @@ -6470,6 +6466,13 @@ static void hci_le_per_adv_report_evt(struct hci_dev *hdev, void *data,
>   	if (!pa_sync)
>   		goto unlock;
>   
> +	mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
> +	if (!(mask & HCI_LM_ACCEPT))
> +		goto unlock;
> +
> +	if (!(flags & HCI_PROTO_DEFER))
> +		goto unlock;
> +
>   	if (ev->data_status == LE_PA_DATA_COMPLETE &&
>   	    !test_and_set_bit(HCI_CONN_PA_SYNC, &pa_sync->flags)) {
>   		/* Notify iso layer */
> @@ -6993,6 +6996,8 @@ static void hci_le_big_sync_established_evt(struct hci_dev *hdev, void *data,
>   			set_bit(HCI_CONN_PA_SYNC, &bis->flags);
>   
>   		bis->sync_handle = conn->sync_handle;
> +		bis->dst = conn->dst;
> +		bis->dst_type = conn->dst_type;
>   		bis->iso_qos.bcast.big = ev->handle;
>   		memset(&interval, 0, sizeof(interval));
>   		memcpy(&interval, ev->latency, sizeof(ev->latency));
> @@ -7038,13 +7043,6 @@ 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, BIS_LINK, &flags);
> -	if (!(mask & HCI_LM_ACCEPT))
> -		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));
> @@ -7054,6 +7052,13 @@ static void hci_le_big_info_adv_report_evt(struct hci_dev *hdev, void *data,
>   
>   	pa_sync->iso_qos.bcast.encryption = ev->encryption;
>   
> +	mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, &flags);
> +	if (!(mask & HCI_LM_ACCEPT))
> +		goto unlock;
> +
> +	if (!(flags & HCI_PROTO_DEFER))
> +		goto unlock;
> +
>   	/* Notify iso layer */
>   	hci_connect_cfm(pa_sync, 0);
>   
> diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c
> index 6e2c752aaa8f..1dc233f04dbe 100644
> --- a/net/bluetooth/iso.c
> +++ b/net/bluetooth/iso.c
> @@ -641,11 +641,12 @@ static struct sock *iso_get_sock(bdaddr_t *src, bdaddr_t *dst,
>   			continue;
>   
>   		/* Exact match. */
> -		if (!bacmp(&iso_pi(sk)->src, src)) {
> +		if (!bacmp(&iso_pi(sk)->src, src)
> +		     && !bacmp(&iso_pi(sk)->dst, dst)
> +			){
>   			sock_hold(sk);
>   			break;
>   		}
> -
>   		/* Closest match */
>   		if (!bacmp(&iso_pi(sk)->src, BDADDR_ANY)) {
>   			if (sk1)
> @@ -1962,7 +1963,7 @@ static void iso_conn_ready(struct iso_conn *conn)
>   		}
>   
>   		if (!parent)
> -			parent = iso_get_sock(&hcon->src, BDADDR_ANY,
> +			parent = iso_get_sock(&hcon->src, &hcon->dst,
>   					      BT_LISTEN, NULL, NULL);
>   
>   		if (!parent)
> @@ -2203,6 +2204,11 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
>   	} else {
>   		sk = iso_get_sock(&hdev->bdaddr, BDADDR_ANY,
>   				  BT_LISTEN, NULL, NULL);
> +		if (!sk)
> +			sk = iso_get_sock(&hdev->bdaddr, bdaddr,
> +					  BT_LISTEN, NULL, NULL);
> +		else
> +			iso_pi(sk)->dst = *bdaddr;
>   	}
>   
>   done:
Re: [PATCH] Bluetooth: fix socket matching ambiguity between BIS and CIS
Posted by Yang Li 7 months, 1 week ago
Hi Paul,

> [ EXTERNAL EMAIL ]
>
> Dear Yang,
>
>
> Thank you for your patch.
>
> Am 07.05.25 um 09:30 schrieb Yang Li via B4 Relay:
>> From: Yang Li <yang.li@amlogic.com>
>
> It’d be great if you could start by describing the problem.

Sorry for the confusion—I initially thought the linked BlueZ issue 
provided enough detail.

To clarify: the problem occurs when the DUT is acting as a sink device. 
If a BIS already exists, and a CIS  connection is then created, the 
kernel mistakenly references the BIS socket. This happens because the 
socket selection only checks for |state == BT_LISTEN|, without further 
distinguishing between BIS and CIS contexts.

To resolve this, I believe the destination address (|dst addr|) should 
also be matched when retrieving the ISO socket, so BIS and CIS sockets 
can be properly differentiated.

>
>> The iso_get_sock function adds dst address matching to
>> distinguish BIS and CIS sockets.
>>
>> Link: https://github.com/bluez/bluez/issues/1224
>
> How can this patch be tested?


DUT environment:BlueZ 5.82+pipewire 1.3.83+kernel 6.12

Assistant:Redmi K70 phone

BIS Source:1BIG 2BISes

Steps to reproduce:
1> Use K70 mobile phone to connect to DUT, and configure BIS source for 
DUT as Assistant, and DUT audio plays normally;
2> Do not end listening, K70 mobile phone plays music, DUT still uses 
BIS source audio, check HCI log, CIS link is disconnected;

After testing, the modification resolves the issue I encountered. 
However, I'm not certain whether this approach might introduce new 
issues elsewhere.

>
>> Signed-off-by: Yang Li <yang.li@amlogic.com>
>> ---
>>   net/bluetooth/hci_event.c | 35 ++++++++++++++++++++---------------
>>   net/bluetooth/iso.c       | 12 +++++++++---
>>   2 files changed, 29 insertions(+), 18 deletions(-)
>>
>> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
>> index 66052d6aaa1d..c1f32e98ef8a 100644
>> --- a/net/bluetooth/hci_event.c
>> +++ b/net/bluetooth/hci_event.c
>> @@ -6413,6 +6413,8 @@ static void 
>> hci_le_pa_sync_estabilished_evt(struct hci_dev *hdev, void *data,
>>
>>       conn->sync_handle = le16_to_cpu(ev->handle);
>>       conn->sid = HCI_SID_INVALID;
>> +     conn->dst = ev->bdaddr;
>> +     conn->dst_type = ev->bdaddr_type;
>>
>>       mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, BIS_LINK,
>>                                     &flags);
>> @@ -6425,7 +6427,8 @@ static void 
>> hci_le_pa_sync_estabilished_evt(struct hci_dev *hdev, void *data,
>>               goto unlock;
>>
>>       /* Add connection to indicate PA sync event */
>> -     pa_sync = hci_conn_add_unset(hdev, BIS_LINK, BDADDR_ANY,
>> +
>
> Why the extra blank line?


Sorry, I will remove this modification in the next version.

>
>> +     pa_sync = hci_conn_add_unset(hdev, BIS_LINK, &ev->bdaddr,
>>                                    HCI_ROLE_SLAVE);
>>
>>       if (IS_ERR(pa_sync))
>
>
> Kind regards,
>
> Paul
>
>
>> @@ -6456,13 +6459,6 @@ static void hci_le_per_adv_report_evt(struct 
>> hci_dev *hdev, void *data,
>>
>>       hci_dev_lock(hdev);
>>
>> -     mask |= hci_proto_connect_ind(hdev, BDADDR_ANY, BIS_LINK, &flags);
>> -     if (!(mask & HCI_LM_ACCEPT))
>> -             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));
>> @@ -6470,6 +6466,13 @@ static void hci_le_per_adv_report_evt(struct 
>> hci_dev *hdev, void *data,
>>       if (!pa_sync)
>>               goto unlock;
>>
>> +     mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, 
>> &flags);
>> +     if (!(mask & HCI_LM_ACCEPT))
>> +             goto unlock;
>> +
>> +     if (!(flags & HCI_PROTO_DEFER))
>> +             goto unlock;
>> +
>>       if (ev->data_status == LE_PA_DATA_COMPLETE &&
>>           !test_and_set_bit(HCI_CONN_PA_SYNC, &pa_sync->flags)) {
>>               /* Notify iso layer */
>> @@ -6993,6 +6996,8 @@ static void 
>> hci_le_big_sync_established_evt(struct hci_dev *hdev, void *data,
>>                       set_bit(HCI_CONN_PA_SYNC, &bis->flags);
>>
>>               bis->sync_handle = conn->sync_handle;
>> +             bis->dst = conn->dst;
>> +             bis->dst_type = conn->dst_type;
>>               bis->iso_qos.bcast.big = ev->handle;
>>               memset(&interval, 0, sizeof(interval));
>>               memcpy(&interval, ev->latency, sizeof(ev->latency));
>> @@ -7038,13 +7043,6 @@ 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, BIS_LINK, &flags);
>> -     if (!(mask & HCI_LM_ACCEPT))
>> -             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));
>> @@ -7054,6 +7052,13 @@ static void 
>> hci_le_big_info_adv_report_evt(struct hci_dev *hdev, void *data,
>>
>>       pa_sync->iso_qos.bcast.encryption = ev->encryption;
>>
>> +     mask |= hci_proto_connect_ind(hdev, &pa_sync->dst, ISO_LINK, 
>> &flags);
>> +     if (!(mask & HCI_LM_ACCEPT))
>> +             goto unlock;
>> +
>> +     if (!(flags & HCI_PROTO_DEFER))
>> +             goto unlock;
>> +
>>       /* Notify iso layer */
>>       hci_connect_cfm(pa_sync, 0);
>>
>> diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c
>> index 6e2c752aaa8f..1dc233f04dbe 100644
>> --- a/net/bluetooth/iso.c
>> +++ b/net/bluetooth/iso.c
>> @@ -641,11 +641,12 @@ static struct sock *iso_get_sock(bdaddr_t *src, 
>> bdaddr_t *dst,
>>                       continue;
>>
>>               /* Exact match. */
>> -             if (!bacmp(&iso_pi(sk)->src, src)) {
>> +             if (!bacmp(&iso_pi(sk)->src, src)
>> +                  && !bacmp(&iso_pi(sk)->dst, dst)
>> +                     ){
>>                       sock_hold(sk);
>>                       break;
>>               }
>> -
>>               /* Closest match */
>>               if (!bacmp(&iso_pi(sk)->src, BDADDR_ANY)) {
>>                       if (sk1)
>> @@ -1962,7 +1963,7 @@ static void iso_conn_ready(struct iso_conn *conn)
>>               }
>>
>>               if (!parent)
>> -                     parent = iso_get_sock(&hcon->src, BDADDR_ANY,
>> +                     parent = iso_get_sock(&hcon->src, &hcon->dst,
>>                                             BT_LISTEN, NULL, NULL);
>>
>>               if (!parent)
>> @@ -2203,6 +2204,11 @@ int iso_connect_ind(struct hci_dev *hdev, 
>> bdaddr_t *bdaddr, __u8 *flags)
>>       } else {
>>               sk = iso_get_sock(&hdev->bdaddr, BDADDR_ANY,
>>                                 BT_LISTEN, NULL, NULL);
>> +             if (!sk)
>> +                     sk = iso_get_sock(&hdev->bdaddr, bdaddr,
>> +                                       BT_LISTEN, NULL, NULL);
>> +             else
>> +                     iso_pi(sk)->dst = *bdaddr;
>>       }
>>
>>   done: