@@ -54,7 +54,6 @@ static void iso_sock_kill(struct sock *sk);
54
54
enum {
55
55
BT_SK_BIG_SYNC ,
56
56
BT_SK_PA_SYNC ,
57
- BT_SK_PA_SYNC_TERM ,
58
57
};
59
58
60
59
struct iso_pinfo {
@@ -81,6 +80,7 @@ static bool check_ucast_qos(struct bt_iso_qos *qos);
81
80
static bool check_bcast_qos (struct bt_iso_qos * qos );
82
81
static bool iso_match_sid (struct sock * sk , void * data );
83
82
static bool iso_match_sync_handle (struct sock * sk , void * data );
83
+ static bool iso_match_sync_handle_pa_report (struct sock * sk , void * data );
84
84
static void iso_sock_disconn (struct sock * sk );
85
85
86
86
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)
197
197
sock_set_flag (sk , SOCK_ZAPPED );
198
198
}
199
199
200
- static bool iso_match_conn_sync_handle (struct sock * sk , void * data )
201
- {
202
- struct hci_conn * hcon = data ;
203
-
204
- if (test_bit (BT_SK_PA_SYNC , & iso_pi (sk )-> flags ))
205
- return false;
206
-
207
- return hcon -> sync_handle == iso_pi (sk )-> sync_handle ;
208
- }
209
-
210
200
static void iso_conn_del (struct hci_conn * hcon , int err )
211
201
{
212
202
struct iso_conn * conn = hcon -> iso_data ;
213
203
struct sock * sk ;
214
- struct sock * parent ;
215
204
216
205
if (!conn )
217
206
return ;
@@ -227,26 +216,6 @@ static void iso_conn_del(struct hci_conn *hcon, int err)
227
216
228
217
if (sk ) {
229
218
lock_sock (sk );
230
-
231
- /* While a PA sync hcon is in the process of closing,
232
- * mark parent socket with a flag, so that any residual
233
- * BIGInfo adv reports that arrive before PA sync is
234
- * terminated are not processed anymore.
235
- */
236
- if (test_bit (BT_SK_PA_SYNC , & iso_pi (sk )-> flags )) {
237
- parent = iso_get_sock (& hcon -> src ,
238
- & hcon -> dst ,
239
- BT_LISTEN ,
240
- iso_match_conn_sync_handle ,
241
- hcon );
242
-
243
- if (parent ) {
244
- set_bit (BT_SK_PA_SYNC_TERM ,
245
- & iso_pi (parent )-> flags );
246
- sock_put (parent );
247
- }
248
- }
249
-
250
219
iso_sock_clear_timer (sk );
251
220
iso_chan_del (sk , err );
252
221
release_sock (sk );
@@ -860,6 +829,7 @@ static struct sock *iso_sock_alloc(struct net *net, struct socket *sock,
860
829
iso_pi (sk )-> src_type = BDADDR_LE_PUBLIC ;
861
830
862
831
iso_pi (sk )-> qos = default_qos ;
832
+ iso_pi (sk )-> sync_handle = -1 ;
863
833
864
834
bt_sock_link (& iso_sk_list , sk );
865
835
return sk ;
@@ -907,7 +877,6 @@ static int iso_sock_bind_bc(struct socket *sock, struct sockaddr *addr,
907
877
return - EINVAL ;
908
878
909
879
iso_pi (sk )-> dst_type = sa -> iso_bc -> bc_bdaddr_type ;
910
- iso_pi (sk )-> sync_handle = -1 ;
911
880
912
881
if (sa -> iso_bc -> bc_sid > 0x0f )
913
882
return - EINVAL ;
@@ -984,7 +953,8 @@ static int iso_sock_bind(struct socket *sock, struct sockaddr *addr,
984
953
/* Allow the user to bind a PA sync socket to a number
985
954
* of BISes to sync to.
986
955
*/
987
- if (sk -> sk_state == BT_CONNECT2 &&
956
+ if ((sk -> sk_state == BT_CONNECT2 ||
957
+ sk -> sk_state == BT_CONNECTED ) &&
988
958
test_bit (BT_SK_PA_SYNC , & iso_pi (sk )-> flags )) {
989
959
err = iso_sock_bind_pa_sk (sk , sa , addr_len );
990
960
goto done ;
@@ -1396,6 +1366,16 @@ static int iso_sock_recvmsg(struct socket *sock, struct msghdr *msg,
1396
1366
}
1397
1367
release_sock (sk );
1398
1368
return 0 ;
1369
+ case BT_CONNECTED :
1370
+ if (test_bit (BT_SK_PA_SYNC , & iso_pi (sk )-> flags )) {
1371
+ iso_conn_big_sync (sk );
1372
+ sk -> sk_state = BT_LISTEN ;
1373
+ release_sock (sk );
1374
+ return 0 ;
1375
+ }
1376
+
1377
+ release_sock (sk );
1378
+ break ;
1399
1379
case BT_CONNECT :
1400
1380
release_sock (sk );
1401
1381
return iso_connect_cis (sk );
@@ -1541,7 +1521,9 @@ static int iso_sock_setsockopt(struct socket *sock, int level, int optname,
1541
1521
1542
1522
case BT_ISO_QOS :
1543
1523
if (sk -> sk_state != BT_OPEN && sk -> sk_state != BT_BOUND &&
1544
- sk -> sk_state != BT_CONNECT2 ) {
1524
+ sk -> sk_state != BT_CONNECT2 &&
1525
+ (!test_bit (BT_SK_PA_SYNC , & iso_pi (sk )-> flags ) ||
1526
+ sk -> sk_state != BT_CONNECTED )) {
1545
1527
err = - EINVAL ;
1546
1528
break ;
1547
1529
}
@@ -1762,7 +1744,7 @@ static void iso_conn_ready(struct iso_conn *conn)
1762
1744
struct sock * sk = conn -> sk ;
1763
1745
struct hci_ev_le_big_sync_estabilished * ev = NULL ;
1764
1746
struct hci_ev_le_pa_sync_established * ev2 = NULL ;
1765
- struct hci_evt_le_big_info_adv_report * ev3 = NULL ;
1747
+ struct hci_ev_le_per_adv_report * ev3 = NULL ;
1766
1748
struct hci_conn * hcon ;
1767
1749
1768
1750
BT_DBG ("conn %p" , conn );
@@ -1799,12 +1781,12 @@ static void iso_conn_ready(struct iso_conn *conn)
1799
1781
iso_match_sid , ev2 );
1800
1782
} else if (test_bit (HCI_CONN_PA_SYNC , & hcon -> flags )) {
1801
1783
ev3 = hci_recv_event_data (hcon -> hdev ,
1802
- HCI_EVT_LE_BIG_INFO_ADV_REPORT );
1784
+ HCI_EV_LE_PER_ADV_REPORT );
1803
1785
if (ev3 )
1804
1786
parent = iso_get_sock (& hcon -> src ,
1805
1787
& hcon -> dst ,
1806
1788
BT_LISTEN ,
1807
- iso_match_sync_handle ,
1789
+ iso_match_sync_handle_pa_report ,
1808
1790
ev3 );
1809
1791
}
1810
1792
@@ -1847,7 +1829,6 @@ static void iso_conn_ready(struct iso_conn *conn)
1847
1829
1848
1830
if (ev3 ) {
1849
1831
iso_pi (sk )-> qos = iso_pi (parent )-> qos ;
1850
- iso_pi (sk )-> qos .bcast .encryption = ev3 -> encryption ;
1851
1832
hcon -> iso_qos = iso_pi (sk )-> qos ;
1852
1833
iso_pi (sk )-> bc_num_bis = iso_pi (parent )-> bc_num_bis ;
1853
1834
memcpy (iso_pi (sk )-> bc_bis , iso_pi (parent )-> bc_bis , ISO_MAX_NUM_BIS );
@@ -1941,26 +1922,29 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
1941
1922
1942
1923
ev2 = hci_recv_event_data (hdev , HCI_EVT_LE_BIG_INFO_ADV_REPORT );
1943
1924
if (ev2 ) {
1944
- /* Try to get PA sync listening socket, if it exists */
1945
- sk = iso_get_sock (& hdev -> bdaddr , bdaddr , BT_LISTEN ,
1946
- iso_match_pa_sync_flag , NULL );
1947
-
1948
- if (!sk ) {
1949
- sk = iso_get_sock (& hdev -> bdaddr , bdaddr , BT_LISTEN ,
1950
- iso_match_sync_handle , ev2 );
1951
-
1952
- /* If PA Sync is in process of terminating,
1953
- * do not handle any more BIGInfo adv reports.
1954
- */
1955
-
1956
- if (sk && test_bit (BT_SK_PA_SYNC_TERM ,
1957
- & iso_pi (sk )-> flags ))
1958
- return 0 ;
1925
+ /* Check if BIGInfo report has already been handled */
1926
+ sk = iso_get_sock (& hdev -> bdaddr , bdaddr , BT_CONNECTED ,
1927
+ iso_match_sync_handle , ev2 );
1928
+ if (sk ) {
1929
+ sock_put (sk );
1930
+ sk = NULL ;
1931
+ goto done ;
1959
1932
}
1960
1933
1934
+ /* Try to get PA sync socket, if it exists */
1935
+ sk = iso_get_sock (& hdev -> bdaddr , bdaddr , BT_CONNECT2 ,
1936
+ iso_match_sync_handle , ev2 );
1937
+ if (!sk )
1938
+ sk = iso_get_sock (& hdev -> bdaddr , bdaddr ,
1939
+ BT_LISTEN ,
1940
+ iso_match_sync_handle ,
1941
+ ev2 );
1942
+
1961
1943
if (sk ) {
1962
1944
int err ;
1963
1945
1946
+ iso_pi (sk )-> qos .bcast .encryption = ev2 -> encryption ;
1947
+
1964
1948
if (ev2 -> num_bis < iso_pi (sk )-> bc_num_bis )
1965
1949
iso_pi (sk )-> bc_num_bis = ev2 -> num_bis ;
1966
1950
@@ -1979,6 +1963,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
1979
1963
}
1980
1964
}
1981
1965
}
1966
+
1967
+ goto done ;
1982
1968
}
1983
1969
1984
1970
ev3 = hci_recv_event_data (hdev , HCI_EV_LE_PER_ADV_REPORT );
0 commit comments