Bluetooth: ISO: Pass BIG encryption info through QoS
[platform/kernel/linux-starfive.git] / net / bluetooth / iso.c
index 7124816..2132a16 100644 (file)
@@ -77,6 +77,7 @@ static struct bt_iso_qos default_qos;
 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 void iso_sock_disconn(struct sock *sk);
 
 /* ---- ISO timers ---- */
@@ -1202,7 +1203,6 @@ static int iso_sock_recvmsg(struct socket *sock, struct msghdr *msg,
                            test_bit(HCI_CONN_PA_SYNC, &pi->conn->hcon->flags)) {
                                iso_conn_big_sync(sk);
                                sk->sk_state = BT_LISTEN;
-                               set_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags);
                        } else {
                                iso_conn_defer_accept(pi->conn->hcon);
                                sk->sk_state = BT_CONFIG;
@@ -1579,6 +1579,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_conn *hcon;
 
        BT_DBG("conn %p", conn);
@@ -1603,14 +1604,20 @@ static void iso_conn_ready(struct iso_conn *conn)
                                parent = iso_get_sock_listen(&hcon->src,
                                                             &hcon->dst,
                                                             iso_match_big, ev);
-               } else if (test_bit(HCI_CONN_PA_SYNC, &hcon->flags) ||
-                               test_bit(HCI_CONN_PA_SYNC_FAILED, &hcon->flags)) {
+               } 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);
+               } 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);
                }
 
                if (!parent)
@@ -1650,11 +1657,13 @@ static void iso_conn_ready(struct iso_conn *conn)
                        hcon->sync_handle = iso_pi(parent)->sync_handle;
                }
 
-               if (ev2 && !ev2->status) {
-                       iso_pi(sk)->sync_handle = iso_pi(parent)->sync_handle;
+               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);
+                       set_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags);
                }
 
                bacpy(&iso_pi(sk)->dst, &hcon->dst);