@@ -85,8 +85,9 @@ static void iso_sock_disconn(struct sock *sk);
85
85
86
86
typedef bool (* iso_sock_match_t )(struct sock * sk , void * data );
87
87
88
- static struct sock * iso_get_sock_listen (bdaddr_t * src , bdaddr_t * dst ,
89
- iso_sock_match_t match , void * data );
88
+ static struct sock * iso_get_sock (bdaddr_t * src , bdaddr_t * dst ,
89
+ enum bt_sock_state state ,
90
+ iso_sock_match_t match , void * data );
90
91
91
92
/* ---- ISO timers ---- */
92
93
#define ISO_CONN_TIMEOUT (HZ * 40)
@@ -233,10 +234,11 @@ static void iso_conn_del(struct hci_conn *hcon, int err)
233
234
* terminated are not processed anymore.
234
235
*/
235
236
if (test_bit (BT_SK_PA_SYNC , & iso_pi (sk )-> flags )) {
236
- parent = iso_get_sock_listen (& hcon -> src ,
237
- & hcon -> dst ,
238
- iso_match_conn_sync_handle ,
239
- hcon );
237
+ parent = iso_get_sock (& hcon -> src ,
238
+ & hcon -> dst ,
239
+ BT_LISTEN ,
240
+ iso_match_conn_sync_handle ,
241
+ hcon );
240
242
241
243
if (parent ) {
242
244
set_bit (BT_SK_PA_SYNC_TERM ,
@@ -581,22 +583,23 @@ static struct sock *__iso_get_sock_listen_by_sid(bdaddr_t *ba, bdaddr_t *bc,
581
583
return NULL ;
582
584
}
583
585
584
- /* Find socket listening :
586
+ /* Find socket in given state :
585
587
* source bdaddr (Unicast)
586
588
* destination bdaddr (Broadcast only)
587
589
* match func - pass NULL to ignore
588
590
* match func data - pass -1 to ignore
589
591
* Returns closest match.
590
592
*/
591
- static struct sock * iso_get_sock_listen (bdaddr_t * src , bdaddr_t * dst ,
592
- iso_sock_match_t match , void * data )
593
+ static struct sock * iso_get_sock (bdaddr_t * src , bdaddr_t * dst ,
594
+ enum bt_sock_state state ,
595
+ iso_sock_match_t match , void * data )
593
596
{
594
597
struct sock * sk = NULL , * sk1 = NULL ;
595
598
596
599
read_lock (& iso_sk_list .lock );
597
600
598
601
sk_for_each (sk , & iso_sk_list .head ) {
599
- if (sk -> sk_state != BT_LISTEN )
602
+ if (sk -> sk_state != state )
600
603
continue ;
601
604
602
605
/* Match Broadcast destination */
@@ -1777,32 +1780,37 @@ static void iso_conn_ready(struct iso_conn *conn)
1777
1780
HCI_EVT_LE_BIG_SYNC_ESTABILISHED );
1778
1781
1779
1782
/* Get reference to PA sync parent socket, if it exists */
1780
- parent = iso_get_sock_listen (& hcon -> src ,
1781
- & hcon -> dst ,
1782
- iso_match_pa_sync_flag , NULL );
1783
+ parent = iso_get_sock (& hcon -> src , & hcon -> dst ,
1784
+ BT_LISTEN ,
1785
+ iso_match_pa_sync_flag ,
1786
+ NULL );
1783
1787
if (!parent && ev )
1784
- parent = iso_get_sock_listen (& hcon -> src ,
1785
- & hcon -> dst ,
1786
- iso_match_big , ev );
1788
+ parent = iso_get_sock (& hcon -> src ,
1789
+ & hcon -> dst ,
1790
+ BT_LISTEN ,
1791
+ iso_match_big , ev );
1787
1792
} else if (test_bit (HCI_CONN_PA_SYNC_FAILED , & hcon -> flags )) {
1788
1793
ev2 = hci_recv_event_data (hcon -> hdev ,
1789
1794
HCI_EV_LE_PA_SYNC_ESTABLISHED );
1790
1795
if (ev2 )
1791
- parent = iso_get_sock_listen (& hcon -> src ,
1792
- & hcon -> dst ,
1793
- iso_match_sid , ev2 );
1796
+ parent = iso_get_sock (& hcon -> src ,
1797
+ & hcon -> dst ,
1798
+ BT_LISTEN ,
1799
+ iso_match_sid , ev2 );
1794
1800
} else if (test_bit (HCI_CONN_PA_SYNC , & hcon -> flags )) {
1795
1801
ev3 = hci_recv_event_data (hcon -> hdev ,
1796
1802
HCI_EVT_LE_BIG_INFO_ADV_REPORT );
1797
1803
if (ev3 )
1798
- parent = iso_get_sock_listen (& hcon -> src ,
1799
- & hcon -> dst ,
1800
- iso_match_sync_handle , ev3 );
1804
+ parent = iso_get_sock (& hcon -> src ,
1805
+ & hcon -> dst ,
1806
+ BT_LISTEN ,
1807
+ iso_match_sync_handle ,
1808
+ ev3 );
1801
1809
}
1802
1810
1803
1811
if (!parent )
1804
- parent = iso_get_sock_listen (& hcon -> src ,
1805
- BDADDR_ANY , NULL , NULL );
1812
+ parent = iso_get_sock (& hcon -> src , BDADDR_ANY ,
1813
+ BT_LISTEN , NULL , NULL );
1806
1814
1807
1815
if (!parent )
1808
1816
return ;
@@ -1923,8 +1931,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
1923
1931
*/
1924
1932
ev1 = hci_recv_event_data (hdev , HCI_EV_LE_PA_SYNC_ESTABLISHED );
1925
1933
if (ev1 ) {
1926
- sk = iso_get_sock_listen (& hdev -> bdaddr , bdaddr , iso_match_sid ,
1927
- ev1 );
1934
+ sk = iso_get_sock (& hdev -> bdaddr , bdaddr , BT_LISTEN ,
1935
+ iso_match_sid , ev1 );
1928
1936
if (sk && !ev1 -> status )
1929
1937
iso_pi (sk )-> sync_handle = le16_to_cpu (ev1 -> handle );
1930
1938
@@ -1934,12 +1942,12 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
1934
1942
ev2 = hci_recv_event_data (hdev , HCI_EVT_LE_BIG_INFO_ADV_REPORT );
1935
1943
if (ev2 ) {
1936
1944
/* Try to get PA sync listening socket, if it exists */
1937
- sk = iso_get_sock_listen (& hdev -> bdaddr , bdaddr ,
1938
- iso_match_pa_sync_flag , NULL );
1945
+ sk = iso_get_sock (& hdev -> bdaddr , bdaddr , BT_LISTEN ,
1946
+ iso_match_pa_sync_flag , NULL );
1939
1947
1940
1948
if (!sk ) {
1941
- sk = iso_get_sock_listen (& hdev -> bdaddr , bdaddr ,
1942
- iso_match_sync_handle , ev2 );
1949
+ sk = iso_get_sock (& hdev -> bdaddr , bdaddr , BT_LISTEN ,
1950
+ iso_match_sync_handle , ev2 );
1943
1951
1944
1952
/* If PA Sync is in process of terminating,
1945
1953
* do not handle any more BIGInfo adv reports.
@@ -1979,8 +1987,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
1979
1987
u8 * base ;
1980
1988
struct hci_conn * hcon ;
1981
1989
1982
- sk = iso_get_sock_listen (& hdev -> bdaddr , bdaddr ,
1983
- iso_match_sync_handle_pa_report , ev3 );
1990
+ sk = iso_get_sock (& hdev -> bdaddr , bdaddr , BT_LISTEN ,
1991
+ iso_match_sync_handle_pa_report , ev3 );
1984
1992
if (!sk )
1985
1993
goto done ;
1986
1994
@@ -2029,7 +2037,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
2029
2037
hcon -> le_per_adv_data_len = 0 ;
2030
2038
}
2031
2039
} else {
2032
- sk = iso_get_sock_listen (& hdev -> bdaddr , BDADDR_ANY , NULL , NULL );
2040
+ sk = iso_get_sock (& hdev -> bdaddr , BDADDR_ANY ,
2041
+ BT_LISTEN , NULL , NULL );
2033
2042
}
2034
2043
2035
2044
done :
0 commit comments