Lines Matching refs:sk
31 struct sock *sk; member
44 static void iso_sock_close(struct sock *sk);
45 static void iso_sock_kill(struct sock *sk);
48 #define iso_pi(sk) ((struct iso_pinfo *)sk) argument
82 static bool iso_match_sid(struct sock *sk, void *data);
83 static bool iso_match_sync_handle(struct sock *sk, void *data);
84 static bool iso_match_sync_handle_pa_report(struct sock *sk, void *data);
85 static void iso_sock_disconn(struct sock *sk);
87 typedef bool (*iso_sock_match_t)(struct sock *sk, void *data);
103 if (conn->sk) in iso_conn_free()
104 iso_pi(conn->sk)->conn = NULL; in iso_conn_free()
142 if (!conn || !bt_sock_linked(&iso_sk_list, conn->sk)) in iso_sock_hold()
145 sock_hold(conn->sk); in iso_sock_hold()
147 return conn->sk; in iso_sock_hold()
154 struct sock *sk; in iso_sock_timeout() local
161 sk = iso_sock_hold(conn); in iso_sock_timeout()
165 if (!sk) in iso_sock_timeout()
168 BT_DBG("sock %p state %d", sk, sk->sk_state); in iso_sock_timeout()
170 lock_sock(sk); in iso_sock_timeout()
171 sk->sk_err = ETIMEDOUT; in iso_sock_timeout()
172 sk->sk_state_change(sk); in iso_sock_timeout()
173 release_sock(sk); in iso_sock_timeout()
174 sock_put(sk); in iso_sock_timeout()
177 static void iso_sock_set_timer(struct sock *sk, long timeout) in iso_sock_set_timer() argument
179 if (!iso_pi(sk)->conn) in iso_sock_set_timer()
182 BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout); in iso_sock_set_timer()
183 cancel_delayed_work(&iso_pi(sk)->conn->timeout_work); in iso_sock_set_timer()
184 schedule_delayed_work(&iso_pi(sk)->conn->timeout_work, timeout); in iso_sock_set_timer()
187 static void iso_sock_clear_timer(struct sock *sk) in iso_sock_clear_timer() argument
189 if (!iso_pi(sk)->conn) in iso_sock_clear_timer()
192 BT_DBG("sock %p state %d", sk, sk->sk_state); in iso_sock_clear_timer()
193 cancel_delayed_work(&iso_pi(sk)->conn->timeout_work); in iso_sock_clear_timer()
230 static void iso_chan_del(struct sock *sk, int err) in iso_chan_del() argument
235 conn = iso_pi(sk)->conn; in iso_chan_del()
236 iso_pi(sk)->conn = NULL; in iso_chan_del()
238 BT_DBG("sk %p, conn %p, err %d", sk, conn, err); in iso_chan_del()
242 conn->sk = NULL; in iso_chan_del()
247 sk->sk_state = BT_CLOSED; in iso_chan_del()
248 sk->sk_err = err; in iso_chan_del()
250 parent = bt_sk(sk)->parent; in iso_chan_del()
252 bt_accept_unlink(sk); in iso_chan_del()
255 sk->sk_state_change(sk); in iso_chan_del()
258 sock_set_flag(sk, SOCK_ZAPPED); in iso_chan_del()
264 struct sock *sk; in iso_conn_del() local
274 sk = iso_sock_hold(conn); in iso_conn_del()
278 if (!sk) { in iso_conn_del()
283 lock_sock(sk); in iso_conn_del()
284 iso_sock_clear_timer(sk); in iso_conn_del()
285 iso_chan_del(sk, err); in iso_conn_del()
286 release_sock(sk); in iso_conn_del()
287 sock_put(sk); in iso_conn_del()
290 static int __iso_chan_add(struct iso_conn *conn, struct sock *sk, in __iso_chan_add() argument
295 if (iso_pi(sk)->conn == conn && conn->sk == sk) in __iso_chan_add()
298 if (conn->sk) { in __iso_chan_add()
303 iso_pi(sk)->conn = conn; in __iso_chan_add()
304 conn->sk = sk; in __iso_chan_add()
307 bt_accept_enqueue(parent, sk, true); in __iso_chan_add()
312 static int iso_chan_add(struct iso_conn *conn, struct sock *sk, in iso_chan_add() argument
318 err = __iso_chan_add(conn, sk, parent); in iso_chan_add()
332 static int iso_connect_bis(struct sock *sk) in iso_connect_bis() argument
339 BT_DBG("%pMR", &iso_pi(sk)->src); in iso_connect_bis()
341 hdev = hci_get_route(&iso_pi(sk)->dst, &iso_pi(sk)->src, in iso_connect_bis()
342 iso_pi(sk)->src_type); in iso_connect_bis()
354 if (iso_pi(sk)->qos_user_set && !check_bcast_qos(&iso_pi(sk)->qos)) { in iso_connect_bis()
355 iso_pi(sk)->qos = default_qos; in iso_connect_bis()
361 if (!iso_pi(sk)->qos.bcast.out.phy) { in iso_connect_bis()
367 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in iso_connect_bis()
368 hcon = hci_bind_bis(hdev, &iso_pi(sk)->dst, in iso_connect_bis()
369 &iso_pi(sk)->qos, iso_pi(sk)->base_len, in iso_connect_bis()
370 iso_pi(sk)->base); in iso_connect_bis()
376 hcon = hci_connect_bis(hdev, &iso_pi(sk)->dst, in iso_connect_bis()
377 le_addr_type(iso_pi(sk)->dst_type), in iso_connect_bis()
378 &iso_pi(sk)->qos, iso_pi(sk)->base_len, in iso_connect_bis()
379 iso_pi(sk)->base); in iso_connect_bis()
393 lock_sock(sk); in iso_connect_bis()
395 err = iso_chan_add(conn, sk, NULL); in iso_connect_bis()
397 release_sock(sk); in iso_connect_bis()
402 bacpy(&iso_pi(sk)->src, &hcon->src); in iso_connect_bis()
405 iso_sock_clear_timer(sk); in iso_connect_bis()
406 sk->sk_state = BT_CONNECTED; in iso_connect_bis()
407 } else if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in iso_connect_bis()
408 iso_sock_clear_timer(sk); in iso_connect_bis()
409 sk->sk_state = BT_CONNECT; in iso_connect_bis()
411 sk->sk_state = BT_CONNECT; in iso_connect_bis()
412 iso_sock_set_timer(sk, sk->sk_sndtimeo); in iso_connect_bis()
415 release_sock(sk); in iso_connect_bis()
423 static int iso_connect_cis(struct sock *sk) in iso_connect_cis() argument
430 BT_DBG("%pMR -> %pMR", &iso_pi(sk)->src, &iso_pi(sk)->dst); in iso_connect_cis()
432 hdev = hci_get_route(&iso_pi(sk)->dst, &iso_pi(sk)->src, in iso_connect_cis()
433 iso_pi(sk)->src_type); in iso_connect_cis()
445 if (iso_pi(sk)->qos_user_set && !check_ucast_qos(&iso_pi(sk)->qos)) { in iso_connect_cis()
446 iso_pi(sk)->qos = default_qos; in iso_connect_cis()
452 if (!iso_pi(sk)->qos.ucast.in.phy && !iso_pi(sk)->qos.ucast.out.phy) { in iso_connect_cis()
458 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in iso_connect_cis()
459 hcon = hci_bind_cis(hdev, &iso_pi(sk)->dst, in iso_connect_cis()
460 le_addr_type(iso_pi(sk)->dst_type), in iso_connect_cis()
461 &iso_pi(sk)->qos); in iso_connect_cis()
467 hcon = hci_connect_cis(hdev, &iso_pi(sk)->dst, in iso_connect_cis()
468 le_addr_type(iso_pi(sk)->dst_type), in iso_connect_cis()
469 &iso_pi(sk)->qos); in iso_connect_cis()
483 lock_sock(sk); in iso_connect_cis()
485 err = iso_chan_add(conn, sk, NULL); in iso_connect_cis()
487 release_sock(sk); in iso_connect_cis()
492 bacpy(&iso_pi(sk)->src, &hcon->src); in iso_connect_cis()
495 iso_sock_clear_timer(sk); in iso_connect_cis()
496 sk->sk_state = BT_CONNECTED; in iso_connect_cis()
497 } else if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in iso_connect_cis()
498 iso_sock_clear_timer(sk); in iso_connect_cis()
499 sk->sk_state = BT_CONNECT; in iso_connect_cis()
501 sk->sk_state = BT_CONNECT; in iso_connect_cis()
502 iso_sock_set_timer(sk, sk->sk_sndtimeo); in iso_connect_cis()
505 release_sock(sk); in iso_connect_cis()
513 static struct bt_iso_qos *iso_sock_get_qos(struct sock *sk) in iso_sock_get_qos() argument
515 if (sk->sk_state == BT_CONNECTED || sk->sk_state == BT_CONNECT2) in iso_sock_get_qos()
516 return &iso_pi(sk)->conn->hcon->iso_qos; in iso_sock_get_qos()
518 return &iso_pi(sk)->qos; in iso_sock_get_qos()
521 static int iso_send_frame(struct sock *sk, struct sk_buff *skb) in iso_send_frame() argument
523 struct iso_conn *conn = iso_pi(sk)->conn; in iso_send_frame()
524 struct bt_iso_qos *qos = iso_sock_get_qos(sk); in iso_send_frame()
528 BT_DBG("sk %p len %d", sk, skb->len); in iso_send_frame()
541 if (sk->sk_state == BT_CONNECTED) in iso_send_frame()
551 struct sock *sk; in iso_recv_frame() local
554 sk = conn->sk; in iso_recv_frame()
557 if (!sk) in iso_recv_frame()
560 BT_DBG("sk %p len %d", sk, skb->len); in iso_recv_frame()
562 if (sk->sk_state != BT_CONNECTED) in iso_recv_frame()
565 if (!sock_queue_rcv_skb(sk, skb)) in iso_recv_frame()
575 struct sock *sk; in __iso_get_sock_listen_by_addr() local
577 sk_for_each(sk, &iso_sk_list.head) { in __iso_get_sock_listen_by_addr()
578 if (sk->sk_state != BT_LISTEN) in __iso_get_sock_listen_by_addr()
581 if (bacmp(&iso_pi(sk)->dst, dst)) in __iso_get_sock_listen_by_addr()
584 if (!bacmp(&iso_pi(sk)->src, src)) in __iso_get_sock_listen_by_addr()
585 return sk; in __iso_get_sock_listen_by_addr()
594 struct sock *sk; in __iso_get_sock_listen_by_sid() local
596 sk_for_each(sk, &iso_sk_list.head) { in __iso_get_sock_listen_by_sid()
597 if (sk->sk_state != BT_LISTEN) in __iso_get_sock_listen_by_sid()
600 if (bacmp(&iso_pi(sk)->src, ba)) in __iso_get_sock_listen_by_sid()
603 if (bacmp(&iso_pi(sk)->dst, bc)) in __iso_get_sock_listen_by_sid()
606 if (iso_pi(sk)->bc_sid == sid) in __iso_get_sock_listen_by_sid()
607 return sk; in __iso_get_sock_listen_by_sid()
624 struct sock *sk = NULL, *sk1 = NULL; in iso_get_sock() local
628 sk_for_each(sk, &iso_sk_list.head) { in iso_get_sock()
629 if (sk->sk_state != state) in iso_get_sock()
633 if (bacmp(dst, BDADDR_ANY) && bacmp(&iso_pi(sk)->dst, dst)) in iso_get_sock()
637 if (match && !match(sk, data)) in iso_get_sock()
641 if (!bacmp(&iso_pi(sk)->src, src)) { in iso_get_sock()
642 sock_hold(sk); in iso_get_sock()
647 if (!bacmp(&iso_pi(sk)->src, BDADDR_ANY)) { in iso_get_sock()
651 sk1 = sk; in iso_get_sock()
656 if (sk && sk1) in iso_get_sock()
661 return sk ? sk : sk1; in iso_get_sock()
667 struct sock *sk = NULL; in iso_get_sock_big() local
671 sk_for_each(sk, &iso_sk_list.head) { in iso_get_sock_big()
672 if (match_sk == sk) in iso_get_sock_big()
678 if (sk->sk_state != BT_CONNECTED && in iso_get_sock_big()
679 sk->sk_state != BT_CONNECT) in iso_get_sock_big()
683 if (bacmp(&iso_pi(sk)->dst, dst)) in iso_get_sock_big()
687 if (iso_pi(sk)->qos.bcast.big != big) in iso_get_sock_big()
691 if (bacmp(&iso_pi(sk)->src, src)) in iso_get_sock_big()
694 sock_hold(sk); in iso_get_sock_big()
700 return sk; in iso_get_sock_big()
703 static void iso_sock_destruct(struct sock *sk) in iso_sock_destruct() argument
705 BT_DBG("sk %p", sk); in iso_sock_destruct()
707 iso_conn_put(iso_pi(sk)->conn); in iso_sock_destruct()
709 skb_queue_purge(&sk->sk_receive_queue); in iso_sock_destruct()
710 skb_queue_purge(&sk->sk_write_queue); in iso_sock_destruct()
715 struct sock *sk; in iso_sock_cleanup_listen() local
720 while ((sk = bt_accept_dequeue(parent, NULL))) { in iso_sock_cleanup_listen()
721 iso_sock_close(sk); in iso_sock_cleanup_listen()
722 iso_sock_kill(sk); in iso_sock_cleanup_listen()
738 static void iso_sock_kill(struct sock *sk) in iso_sock_kill() argument
740 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket || in iso_sock_kill()
741 sock_flag(sk, SOCK_DEAD)) in iso_sock_kill()
744 BT_DBG("sk %p state %d", sk, sk->sk_state); in iso_sock_kill()
747 bt_sock_unlink(&iso_sk_list, sk); in iso_sock_kill()
748 sock_set_flag(sk, SOCK_DEAD); in iso_sock_kill()
749 sock_put(sk); in iso_sock_kill()
752 static void iso_sock_disconn(struct sock *sk) in iso_sock_disconn() argument
755 struct hci_conn *hcon = iso_pi(sk)->conn->hcon; in iso_sock_disconn()
758 bis_sk = iso_get_sock_big(sk, &iso_pi(sk)->src, in iso_sock_disconn()
759 &iso_pi(sk)->dst, in iso_sock_disconn()
760 iso_pi(sk)->qos.bcast.big); in iso_sock_disconn()
769 iso_pi(sk)->conn->hcon = NULL; in iso_sock_disconn()
770 iso_sock_clear_timer(sk); in iso_sock_disconn()
771 iso_chan_del(sk, bt_to_errno(hcon->abort_reason)); in iso_sock_disconn()
777 sk->sk_state = BT_DISCONN; in iso_sock_disconn()
778 iso_conn_lock(iso_pi(sk)->conn); in iso_sock_disconn()
779 hci_conn_drop(iso_pi(sk)->conn->hcon); in iso_sock_disconn()
780 iso_pi(sk)->conn->hcon = NULL; in iso_sock_disconn()
781 iso_conn_unlock(iso_pi(sk)->conn); in iso_sock_disconn()
784 static void __iso_sock_close(struct sock *sk) in __iso_sock_close() argument
786 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket); in __iso_sock_close()
788 switch (sk->sk_state) { in __iso_sock_close()
790 iso_sock_cleanup_listen(sk); in __iso_sock_close()
796 if (iso_pi(sk)->conn->hcon) in __iso_sock_close()
797 iso_sock_disconn(sk); in __iso_sock_close()
799 iso_chan_del(sk, ECONNRESET); in __iso_sock_close()
803 if (iso_pi(sk)->conn->hcon && in __iso_sock_close()
804 (test_bit(HCI_CONN_PA_SYNC, &iso_pi(sk)->conn->hcon->flags) || in __iso_sock_close()
805 test_bit(HCI_CONN_PA_SYNC_FAILED, &iso_pi(sk)->conn->hcon->flags))) in __iso_sock_close()
806 iso_sock_disconn(sk); in __iso_sock_close()
808 iso_chan_del(sk, ECONNRESET); in __iso_sock_close()
811 iso_chan_del(sk, ECONNRESET); in __iso_sock_close()
815 sock_set_flag(sk, SOCK_ZAPPED); in __iso_sock_close()
821 static void iso_sock_close(struct sock *sk) in iso_sock_close() argument
823 iso_sock_clear_timer(sk); in iso_sock_close()
824 lock_sock(sk); in iso_sock_close()
825 __iso_sock_close(sk); in iso_sock_close()
826 release_sock(sk); in iso_sock_close()
827 iso_sock_kill(sk); in iso_sock_close()
830 static void iso_sock_init(struct sock *sk, struct sock *parent) in iso_sock_init() argument
832 BT_DBG("sk %p", sk); in iso_sock_init()
835 sk->sk_type = parent->sk_type; in iso_sock_init()
836 bt_sk(sk)->flags = bt_sk(parent)->flags; in iso_sock_init()
837 security_sk_clone(parent, sk); in iso_sock_init()
879 struct sock *sk; in iso_sock_alloc() local
881 sk = bt_sock_alloc(net, sock, &iso_proto, proto, prio, kern); in iso_sock_alloc()
882 if (!sk) in iso_sock_alloc()
885 sk->sk_destruct = iso_sock_destruct; in iso_sock_alloc()
886 sk->sk_sndtimeo = ISO_CONN_TIMEOUT; in iso_sock_alloc()
889 iso_pi(sk)->src_type = BDADDR_LE_PUBLIC; in iso_sock_alloc()
891 iso_pi(sk)->qos = default_qos; in iso_sock_alloc()
892 iso_pi(sk)->sync_handle = -1; in iso_sock_alloc()
894 bt_sock_link(&iso_sk_list, sk); in iso_sock_alloc()
895 return sk; in iso_sock_alloc()
901 struct sock *sk; in iso_sock_create() local
912 sk = iso_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern); in iso_sock_create()
913 if (!sk) in iso_sock_create()
916 iso_sock_init(sk, NULL); in iso_sock_create()
924 struct sock *sk = sock->sk; in iso_sock_bind_bc() local
927 BT_DBG("sk %p bc_sid %u bc_num_bis %u", sk, sa->iso_bc->bc_sid, in iso_sock_bind_bc()
933 bacpy(&iso_pi(sk)->dst, &sa->iso_bc->bc_bdaddr); in iso_sock_bind_bc()
939 iso_pi(sk)->dst_type = sa->iso_bc->bc_bdaddr_type; in iso_sock_bind_bc()
944 iso_pi(sk)->bc_sid = sa->iso_bc->bc_sid; in iso_sock_bind_bc()
949 iso_pi(sk)->bc_num_bis = sa->iso_bc->bc_num_bis; in iso_sock_bind_bc()
951 for (i = 0; i < iso_pi(sk)->bc_num_bis; i++) in iso_sock_bind_bc()
956 memcpy(iso_pi(sk)->bc_bis, sa->iso_bc->bc_bis, in iso_sock_bind_bc()
957 iso_pi(sk)->bc_num_bis); in iso_sock_bind_bc()
962 static int iso_sock_bind_pa_sk(struct sock *sk, struct sockaddr_iso *sa, in iso_sock_bind_pa_sk() argument
967 if (sk->sk_type != SOCK_SEQPACKET) { in iso_sock_bind_pa_sk()
982 iso_pi(sk)->bc_num_bis = sa->iso_bc->bc_num_bis; in iso_sock_bind_pa_sk()
984 for (int i = 0; i < iso_pi(sk)->bc_num_bis; i++) in iso_sock_bind_pa_sk()
991 memcpy(iso_pi(sk)->bc_bis, sa->iso_bc->bc_bis, in iso_sock_bind_pa_sk()
992 iso_pi(sk)->bc_num_bis); in iso_sock_bind_pa_sk()
1002 struct sock *sk = sock->sk; in iso_sock_bind() local
1005 BT_DBG("sk %p %pMR type %u", sk, &sa->iso_bdaddr, sa->iso_bdaddr_type); in iso_sock_bind()
1011 lock_sock(sk); in iso_sock_bind()
1016 if ((sk->sk_state == BT_CONNECT2 || in iso_sock_bind()
1017 sk->sk_state == BT_CONNECTED) && in iso_sock_bind()
1018 test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags)) { in iso_sock_bind()
1019 err = iso_sock_bind_pa_sk(sk, sa, addr_len); in iso_sock_bind()
1023 if (sk->sk_state != BT_OPEN) { in iso_sock_bind()
1028 if (sk->sk_type != SOCK_SEQPACKET) { in iso_sock_bind()
1039 bacpy(&iso_pi(sk)->src, &sa->iso_bdaddr); in iso_sock_bind()
1040 iso_pi(sk)->src_type = sa->iso_bdaddr_type; in iso_sock_bind()
1049 sk->sk_state = BT_BOUND; in iso_sock_bind()
1052 release_sock(sk); in iso_sock_bind()
1060 struct sock *sk = sock->sk; in iso_sock_connect() local
1063 BT_DBG("sk %p", sk); in iso_sock_connect()
1069 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) in iso_sock_connect()
1072 if (sk->sk_type != SOCK_SEQPACKET) in iso_sock_connect()
1079 lock_sock(sk); in iso_sock_connect()
1081 bacpy(&iso_pi(sk)->dst, &sa->iso_bdaddr); in iso_sock_connect()
1082 iso_pi(sk)->dst_type = sa->iso_bdaddr_type; in iso_sock_connect()
1084 release_sock(sk); in iso_sock_connect()
1086 if (bacmp(&iso_pi(sk)->dst, BDADDR_ANY)) in iso_sock_connect()
1087 err = iso_connect_cis(sk); in iso_sock_connect()
1089 err = iso_connect_bis(sk); in iso_sock_connect()
1094 lock_sock(sk); in iso_sock_connect()
1096 if (!test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in iso_sock_connect()
1097 err = bt_sock_wait_state(sk, BT_CONNECTED, in iso_sock_connect()
1098 sock_sndtimeo(sk, flags & O_NONBLOCK)); in iso_sock_connect()
1101 release_sock(sk); in iso_sock_connect()
1105 static int iso_listen_bis(struct sock *sk) in iso_listen_bis() argument
1112 BT_DBG("%pMR -> %pMR (SID 0x%2.2x)", &iso_pi(sk)->src, in iso_listen_bis()
1113 &iso_pi(sk)->dst, iso_pi(sk)->bc_sid); in iso_listen_bis()
1117 if (__iso_get_sock_listen_by_sid(&iso_pi(sk)->src, &iso_pi(sk)->dst, in iso_listen_bis()
1118 iso_pi(sk)->bc_sid)) in iso_listen_bis()
1126 hdev = hci_get_route(&iso_pi(sk)->dst, &iso_pi(sk)->src, in iso_listen_bis()
1127 iso_pi(sk)->src_type); in iso_listen_bis()
1132 lock_sock(sk); in iso_listen_bis()
1135 if (iso_pi(sk)->qos_user_set && !check_bcast_qos(&iso_pi(sk)->qos)) { in iso_listen_bis()
1136 iso_pi(sk)->qos = default_qos; in iso_listen_bis()
1141 hcon = hci_pa_create_sync(hdev, &iso_pi(sk)->dst, in iso_listen_bis()
1142 le_addr_type(iso_pi(sk)->dst_type), in iso_listen_bis()
1143 iso_pi(sk)->bc_sid, &iso_pi(sk)->qos); in iso_listen_bis()
1156 err = iso_chan_add(conn, sk, NULL); in iso_listen_bis()
1163 release_sock(sk); in iso_listen_bis()
1169 static int iso_listen_cis(struct sock *sk) in iso_listen_cis() argument
1173 BT_DBG("%pMR", &iso_pi(sk)->src); in iso_listen_cis()
1177 if (__iso_get_sock_listen_by_addr(&iso_pi(sk)->src, &iso_pi(sk)->dst)) in iso_listen_cis()
1187 struct sock *sk = sock->sk; in iso_sock_listen() local
1190 BT_DBG("sk %p backlog %d", sk, backlog); in iso_sock_listen()
1192 sock_hold(sk); in iso_sock_listen()
1193 lock_sock(sk); in iso_sock_listen()
1195 if (sk->sk_state != BT_BOUND) { in iso_sock_listen()
1200 if (sk->sk_type != SOCK_SEQPACKET) { in iso_sock_listen()
1205 if (!bacmp(&iso_pi(sk)->dst, BDADDR_ANY)) { in iso_sock_listen()
1206 err = iso_listen_cis(sk); in iso_sock_listen()
1211 release_sock(sk); in iso_sock_listen()
1212 err = iso_listen_bis(sk); in iso_sock_listen()
1213 lock_sock(sk); in iso_sock_listen()
1219 sk->sk_max_ack_backlog = backlog; in iso_sock_listen()
1220 sk->sk_ack_backlog = 0; in iso_sock_listen()
1222 sk->sk_state = BT_LISTEN; in iso_sock_listen()
1225 release_sock(sk); in iso_sock_listen()
1226 sock_put(sk); in iso_sock_listen()
1234 struct sock *sk = sock->sk, *ch; in iso_sock_accept() local
1242 lock_sock_nested(sk, SINGLE_DEPTH_NESTING); in iso_sock_accept()
1244 timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK); in iso_sock_accept()
1246 BT_DBG("sk %p timeo %ld", sk, timeo); in iso_sock_accept()
1249 add_wait_queue_exclusive(sk_sleep(sk), &wait); in iso_sock_accept()
1251 if (sk->sk_state != BT_LISTEN) { in iso_sock_accept()
1256 ch = bt_accept_dequeue(sk, newsock); in iso_sock_accept()
1270 release_sock(sk); in iso_sock_accept()
1273 lock_sock_nested(sk, SINGLE_DEPTH_NESTING); in iso_sock_accept()
1275 remove_wait_queue(sk_sleep(sk), &wait); in iso_sock_accept()
1290 if (test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags)) { in iso_sock_accept()
1295 for (int i = 0; i < iso_pi(sk)->bc_num_bis; i++) { in iso_sock_accept()
1296 if (iso_pi(sk)->bc_bis[i] > 0) { in iso_sock_accept()
1297 iso_pi(sk)->bc_bis[i] = 0; in iso_sock_accept()
1298 iso_pi(sk)->bc_num_bis--; in iso_sock_accept()
1303 if (iso_pi(sk)->bc_num_bis == 0) { in iso_sock_accept()
1314 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in iso_sock_accept()
1315 clear_bit(BT_SK_BIG_SYNC, &iso_pi(sk)->flags); in iso_sock_accept()
1316 sk->sk_state = BT_CONNECTED; in iso_sock_accept()
1321 release_sock(sk); in iso_sock_accept()
1329 struct sock *sk = sock->sk; in iso_sock_getname() local
1331 BT_DBG("sock %p, sk %p", sock, sk); in iso_sock_getname()
1336 bacpy(&sa->iso_bdaddr, &iso_pi(sk)->dst); in iso_sock_getname()
1337 sa->iso_bdaddr_type = iso_pi(sk)->dst_type; in iso_sock_getname()
1339 bacpy(&sa->iso_bdaddr, &iso_pi(sk)->src); in iso_sock_getname()
1340 sa->iso_bdaddr_type = iso_pi(sk)->src_type; in iso_sock_getname()
1349 struct sock *sk = sock->sk; in iso_sock_sendmsg() local
1354 BT_DBG("sock %p, sk %p", sock, sk); in iso_sock_sendmsg()
1356 err = sock_error(sk); in iso_sock_sendmsg()
1363 lock_sock(sk); in iso_sock_sendmsg()
1365 if (sk->sk_state != BT_CONNECTED) { in iso_sock_sendmsg()
1366 release_sock(sk); in iso_sock_sendmsg()
1370 mtu = iso_pi(sk)->conn->hcon->mtu; in iso_sock_sendmsg()
1372 release_sock(sk); in iso_sock_sendmsg()
1374 skb = bt_skb_sendmsg(sk, msg, len, mtu, HCI_ISO_DATA_HDR_SIZE, 0); in iso_sock_sendmsg()
1380 BT_DBG("skb %p len %d", sk, skb->len); in iso_sock_sendmsg()
1387 tmp = bt_skb_sendmsg(sk, msg, len, mtu, 0, 0); in iso_sock_sendmsg()
1405 lock_sock(sk); in iso_sock_sendmsg()
1407 if (sk->sk_state == BT_CONNECTED) in iso_sock_sendmsg()
1408 err = iso_send_frame(sk, skb); in iso_sock_sendmsg()
1412 release_sock(sk); in iso_sock_sendmsg()
1433 static void iso_conn_big_sync(struct sock *sk) in iso_conn_big_sync() argument
1438 hdev = hci_get_route(&iso_pi(sk)->dst, &iso_pi(sk)->src, in iso_conn_big_sync()
1439 iso_pi(sk)->src_type); in iso_conn_big_sync()
1450 lock_sock(sk); in iso_conn_big_sync()
1452 if (!test_and_set_bit(BT_SK_BIG_SYNC, &iso_pi(sk)->flags)) { in iso_conn_big_sync()
1453 err = hci_le_big_create_sync(hdev, iso_pi(sk)->conn->hcon, in iso_conn_big_sync()
1454 &iso_pi(sk)->qos, in iso_conn_big_sync()
1455 iso_pi(sk)->sync_handle, in iso_conn_big_sync()
1456 iso_pi(sk)->bc_num_bis, in iso_conn_big_sync()
1457 iso_pi(sk)->bc_bis); in iso_conn_big_sync()
1463 release_sock(sk); in iso_conn_big_sync()
1470 struct sock *sk = sock->sk; in iso_sock_recvmsg() local
1471 struct iso_pinfo *pi = iso_pi(sk); in iso_sock_recvmsg()
1475 BT_DBG("sk %p", sk); in iso_sock_recvmsg()
1477 if (test_and_clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in iso_sock_recvmsg()
1478 sock_hold(sk); in iso_sock_recvmsg()
1479 lock_sock(sk); in iso_sock_recvmsg()
1481 switch (sk->sk_state) { in iso_sock_recvmsg()
1484 release_sock(sk); in iso_sock_recvmsg()
1485 iso_conn_big_sync(sk); in iso_sock_recvmsg()
1486 lock_sock(sk); in iso_sock_recvmsg()
1488 sk->sk_state = BT_LISTEN; in iso_sock_recvmsg()
1491 sk->sk_state = BT_CONFIG; in iso_sock_recvmsg()
1497 if (test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags)) { in iso_sock_recvmsg()
1498 release_sock(sk); in iso_sock_recvmsg()
1499 iso_conn_big_sync(sk); in iso_sock_recvmsg()
1500 lock_sock(sk); in iso_sock_recvmsg()
1502 sk->sk_state = BT_LISTEN; in iso_sock_recvmsg()
1508 release_sock(sk); in iso_sock_recvmsg()
1509 err = iso_connect_cis(sk); in iso_sock_recvmsg()
1510 lock_sock(sk); in iso_sock_recvmsg()
1518 release_sock(sk); in iso_sock_recvmsg()
1519 sock_put(sk); in iso_sock_recvmsg()
1622 struct sock *sk = sock->sk; in iso_sock_setsockopt() local
1627 BT_DBG("sk %p", sk); in iso_sock_setsockopt()
1629 lock_sock(sk); in iso_sock_setsockopt()
1633 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in iso_sock_setsockopt()
1643 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in iso_sock_setsockopt()
1645 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in iso_sock_setsockopt()
1654 set_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); in iso_sock_setsockopt()
1656 clear_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); in iso_sock_setsockopt()
1660 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in iso_sock_setsockopt()
1661 sk->sk_state != BT_CONNECT2 && in iso_sock_setsockopt()
1662 (!test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags) || in iso_sock_setsockopt()
1663 sk->sk_state != BT_CONNECTED)) { in iso_sock_setsockopt()
1672 iso_pi(sk)->qos = qos; in iso_sock_setsockopt()
1673 iso_pi(sk)->qos_user_set = true; in iso_sock_setsockopt()
1678 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in iso_sock_setsockopt()
1679 sk->sk_state != BT_CONNECT2) { in iso_sock_setsockopt()
1684 if (optlen > sizeof(iso_pi(sk)->base)) { in iso_sock_setsockopt()
1689 err = copy_safe_from_sockptr(iso_pi(sk)->base, optlen, optval, in iso_sock_setsockopt()
1694 iso_pi(sk)->base_len = optlen; in iso_sock_setsockopt()
1703 release_sock(sk); in iso_sock_setsockopt()
1710 struct sock *sk = sock->sk; in iso_sock_getsockopt() local
1716 BT_DBG("sk %p", sk); in iso_sock_getsockopt()
1721 lock_sock(sk); in iso_sock_getsockopt()
1725 if (sk->sk_state == BT_CONNECTED) { in iso_sock_getsockopt()
1730 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), in iso_sock_getsockopt()
1737 if (put_user(test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags), in iso_sock_getsockopt()
1743 qos = iso_sock_get_qos(sk); in iso_sock_getsockopt()
1752 if (sk->sk_state == BT_CONNECTED && in iso_sock_getsockopt()
1753 !bacmp(&iso_pi(sk)->dst, BDADDR_ANY)) { in iso_sock_getsockopt()
1754 base_len = iso_pi(sk)->conn->hcon->le_per_adv_data_len; in iso_sock_getsockopt()
1755 base = iso_pi(sk)->conn->hcon->le_per_adv_data; in iso_sock_getsockopt()
1757 base_len = iso_pi(sk)->base_len; in iso_sock_getsockopt()
1758 base = iso_pi(sk)->base; in iso_sock_getsockopt()
1774 release_sock(sk); in iso_sock_getsockopt()
1780 struct sock *sk = sock->sk; in iso_sock_shutdown() local
1783 BT_DBG("sock %p, sk %p, how %d", sock, sk, how); in iso_sock_shutdown()
1785 if (!sk) in iso_sock_shutdown()
1788 sock_hold(sk); in iso_sock_shutdown()
1789 lock_sock(sk); in iso_sock_shutdown()
1793 if (sk->sk_shutdown & RCV_SHUTDOWN) in iso_sock_shutdown()
1795 sk->sk_shutdown |= RCV_SHUTDOWN; in iso_sock_shutdown()
1798 if (sk->sk_shutdown & SEND_SHUTDOWN) in iso_sock_shutdown()
1800 sk->sk_shutdown |= SEND_SHUTDOWN; in iso_sock_shutdown()
1803 if (sk->sk_shutdown & SHUTDOWN_MASK) in iso_sock_shutdown()
1805 sk->sk_shutdown |= SHUTDOWN_MASK; in iso_sock_shutdown()
1809 iso_sock_clear_timer(sk); in iso_sock_shutdown()
1810 __iso_sock_close(sk); in iso_sock_shutdown()
1812 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in iso_sock_shutdown()
1814 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime); in iso_sock_shutdown()
1817 release_sock(sk); in iso_sock_shutdown()
1818 sock_put(sk); in iso_sock_shutdown()
1825 struct sock *sk = sock->sk; in iso_sock_release() local
1828 BT_DBG("sock %p, sk %p", sock, sk); in iso_sock_release()
1830 if (!sk) in iso_sock_release()
1833 iso_sock_close(sk); in iso_sock_release()
1835 if (sock_flag(sk, SOCK_LINGER) && READ_ONCE(sk->sk_lingertime) && in iso_sock_release()
1837 lock_sock(sk); in iso_sock_release()
1838 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime); in iso_sock_release()
1839 release_sock(sk); in iso_sock_release()
1842 sock_orphan(sk); in iso_sock_release()
1843 iso_sock_kill(sk); in iso_sock_release()
1847 static void iso_sock_ready(struct sock *sk) in iso_sock_ready() argument
1849 BT_DBG("sk %p", sk); in iso_sock_ready()
1851 if (!sk) in iso_sock_ready()
1854 lock_sock(sk); in iso_sock_ready()
1855 iso_sock_clear_timer(sk); in iso_sock_ready()
1856 sk->sk_state = BT_CONNECTED; in iso_sock_ready()
1857 sk->sk_state_change(sk); in iso_sock_ready()
1858 release_sock(sk); in iso_sock_ready()
1861 static bool iso_match_big(struct sock *sk, void *data) in iso_match_big() argument
1865 return ev->handle == iso_pi(sk)->qos.bcast.big; in iso_match_big()
1868 static bool iso_match_big_hcon(struct sock *sk, void *data) in iso_match_big_hcon() argument
1872 return hcon->iso_qos.bcast.big == iso_pi(sk)->qos.bcast.big; in iso_match_big_hcon()
1875 static bool iso_match_pa_sync_flag(struct sock *sk, void *data) in iso_match_pa_sync_flag() argument
1877 return test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags); in iso_match_pa_sync_flag()
1883 struct sock *sk = conn->sk; in iso_conn_ready() local
1891 if (sk) { in iso_conn_ready()
1892 iso_sock_ready(conn->sk); in iso_conn_ready()
1949 sk = iso_sock_alloc(sock_net(parent), NULL, in iso_conn_ready()
1951 if (!sk) { in iso_conn_ready()
1956 iso_sock_init(sk, parent); in iso_conn_ready()
1958 bacpy(&iso_pi(sk)->src, &hcon->src); in iso_conn_ready()
1962 iso_pi(sk)->src_type = BDADDR_LE_PUBLIC; in iso_conn_ready()
1964 iso_pi(sk)->src_type = BDADDR_LE_RANDOM; in iso_conn_ready()
1977 iso_pi(sk)->qos = iso_pi(parent)->qos; in iso_conn_ready()
1978 hcon->iso_qos = iso_pi(sk)->qos; in iso_conn_ready()
1979 iso_pi(sk)->bc_num_bis = iso_pi(parent)->bc_num_bis; in iso_conn_ready()
1980 memcpy(iso_pi(sk)->bc_bis, iso_pi(parent)->bc_bis, ISO_MAX_NUM_BIS); in iso_conn_ready()
1981 set_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags); in iso_conn_ready()
1984 bacpy(&iso_pi(sk)->dst, &hcon->dst); in iso_conn_ready()
1985 iso_pi(sk)->dst_type = hcon->dst_type; in iso_conn_ready()
1986 iso_pi(sk)->sync_handle = iso_pi(parent)->sync_handle; in iso_conn_ready()
1987 memcpy(iso_pi(sk)->base, iso_pi(parent)->base, iso_pi(parent)->base_len); in iso_conn_ready()
1988 iso_pi(sk)->base_len = iso_pi(parent)->base_len; in iso_conn_ready()
1991 iso_chan_add(conn, sk, parent); in iso_conn_ready()
1996 sk->sk_err = ECONNREFUSED; in iso_conn_ready()
1997 sk->sk_error_report(sk); in iso_conn_ready()
2001 sk->sk_state = BT_CONNECT2; in iso_conn_ready()
2003 sk->sk_state = BT_CONNECTED; in iso_conn_ready()
2013 static bool iso_match_sid(struct sock *sk, void *data) in iso_match_sid() argument
2017 return ev->sid == iso_pi(sk)->bc_sid; in iso_match_sid()
2020 static bool iso_match_sync_handle(struct sock *sk, void *data) in iso_match_sync_handle() argument
2024 return le16_to_cpu(ev->sync_handle) == iso_pi(sk)->sync_handle; in iso_match_sync_handle()
2027 static bool iso_match_sync_handle_pa_report(struct sock *sk, void *data) in iso_match_sync_handle_pa_report() argument
2031 return le16_to_cpu(ev->sync_handle) == iso_pi(sk)->sync_handle; in iso_match_sync_handle_pa_report()
2041 struct sock *sk; in iso_connect_ind() local
2061 sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN, in iso_connect_ind()
2063 if (sk && !ev1->status) in iso_connect_ind()
2064 iso_pi(sk)->sync_handle = le16_to_cpu(ev1->handle); in iso_connect_ind()
2072 sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_CONNECTED, in iso_connect_ind()
2074 if (sk) { in iso_connect_ind()
2075 sock_put(sk); in iso_connect_ind()
2076 sk = NULL; in iso_connect_ind()
2081 sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_CONNECT2, in iso_connect_ind()
2083 if (!sk) in iso_connect_ind()
2084 sk = iso_get_sock(&hdev->bdaddr, bdaddr, in iso_connect_ind()
2089 if (sk) { in iso_connect_ind()
2091 struct hci_conn *hcon = iso_pi(sk)->conn->hcon; in iso_connect_ind()
2093 iso_pi(sk)->qos.bcast.encryption = ev2->encryption; in iso_connect_ind()
2095 if (ev2->num_bis < iso_pi(sk)->bc_num_bis) in iso_connect_ind()
2096 iso_pi(sk)->bc_num_bis = ev2->num_bis; in iso_connect_ind()
2098 if (!test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags) && in iso_connect_ind()
2099 !test_and_set_bit(BT_SK_BIG_SYNC, &iso_pi(sk)->flags)) { in iso_connect_ind()
2102 &iso_pi(sk)->qos, in iso_connect_ind()
2103 iso_pi(sk)->sync_handle, in iso_connect_ind()
2104 iso_pi(sk)->bc_num_bis, in iso_connect_ind()
2105 iso_pi(sk)->bc_bis); in iso_connect_ind()
2109 sock_put(sk); in iso_connect_ind()
2110 sk = NULL; in iso_connect_ind()
2124 sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN, in iso_connect_ind()
2126 if (!sk) in iso_connect_ind()
2129 hcon = iso_pi(sk)->conn->hcon; in iso_connect_ind()
2165 memcpy(iso_pi(sk)->base, base, base_len); in iso_connect_ind()
2166 iso_pi(sk)->base_len = base_len; in iso_connect_ind()
2174 sk = iso_get_sock(&hdev->bdaddr, BDADDR_ANY, in iso_connect_ind()
2179 if (!sk) in iso_connect_ind()
2182 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) in iso_connect_ind()
2185 sock_put(sk); in iso_connect_ind()
2377 struct sock *sk; in iso_debugfs_show() local
2381 sk_for_each(sk, &iso_sk_list.head) { in iso_debugfs_show()
2382 seq_printf(f, "%pMR %pMR %d\n", &iso_pi(sk)->src, in iso_debugfs_show()
2383 &iso_pi(sk)->dst, sk->sk_state); in iso_debugfs_show()