Lines Matching refs:sk

49 	struct sock	*sk;  member
59 static void sco_sock_close(struct sock *sk);
60 static void sco_sock_kill(struct sock *sk);
63 #define sco_pi(sk) ((struct sco_pinfo *) sk) argument
83 struct sock *sk; in sco_sock_timeout() local
86 sk = conn->sk; in sco_sock_timeout()
87 if (sk) in sco_sock_timeout()
88 sock_hold(sk); in sco_sock_timeout()
91 if (!sk) in sco_sock_timeout()
94 BT_DBG("sock %p state %d", sk, sk->sk_state); in sco_sock_timeout()
96 lock_sock(sk); in sco_sock_timeout()
97 sk->sk_err = ETIMEDOUT; in sco_sock_timeout()
98 sk->sk_state_change(sk); in sco_sock_timeout()
99 release_sock(sk); in sco_sock_timeout()
100 sock_put(sk); in sco_sock_timeout()
103 static void sco_sock_set_timer(struct sock *sk, long timeout) in sco_sock_set_timer() argument
105 if (!sco_pi(sk)->conn) in sco_sock_set_timer()
108 BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout); in sco_sock_set_timer()
109 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work); in sco_sock_set_timer()
110 schedule_delayed_work(&sco_pi(sk)->conn->timeout_work, timeout); in sco_sock_set_timer()
113 static void sco_sock_clear_timer(struct sock *sk) in sco_sock_clear_timer() argument
115 if (!sco_pi(sk)->conn) in sco_sock_clear_timer()
118 BT_DBG("sock %p state %d", sk, sk->sk_state); in sco_sock_clear_timer()
119 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work); in sco_sock_clear_timer()
152 static void sco_chan_del(struct sock *sk, int err) in sco_chan_del() argument
156 conn = sco_pi(sk)->conn; in sco_chan_del()
158 BT_DBG("sk %p, conn %p, err %d", sk, conn, err); in sco_chan_del()
162 conn->sk = NULL; in sco_chan_del()
163 sco_pi(sk)->conn = NULL; in sco_chan_del()
170 sk->sk_state = BT_CLOSED; in sco_chan_del()
171 sk->sk_err = err; in sco_chan_del()
172 sk->sk_state_change(sk); in sco_chan_del()
174 sock_set_flag(sk, SOCK_ZAPPED); in sco_chan_del()
180 struct sock *sk; in sco_conn_del() local
189 sk = conn->sk; in sco_conn_del()
192 if (sk) { in sco_conn_del()
193 sock_hold(sk); in sco_conn_del()
194 lock_sock(sk); in sco_conn_del()
195 sco_sock_clear_timer(sk); in sco_conn_del()
196 sco_chan_del(sk, err); in sco_conn_del()
197 release_sock(sk); in sco_conn_del()
198 sock_put(sk); in sco_conn_del()
208 static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, in __sco_chan_add() argument
213 sco_pi(sk)->conn = conn; in __sco_chan_add()
214 conn->sk = sk; in __sco_chan_add()
219 bt_accept_enqueue(parent, sk, true); in __sco_chan_add()
222 static int sco_chan_add(struct sco_conn *conn, struct sock *sk, in sco_chan_add() argument
228 if (conn->sk) in sco_chan_add()
231 __sco_chan_add(conn, sk, parent); in sco_chan_add()
237 static int sco_connect(struct hci_dev *hdev, struct sock *sk) in sco_connect() argument
243 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst); in sco_connect()
250 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT && in sco_connect()
254 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst, in sco_connect()
255 sco_pi(sk)->setting); in sco_connect()
266 bacpy(&sco_pi(sk)->src, &hcon->src); in sco_connect()
268 err = sco_chan_add(conn, sk, NULL); in sco_connect()
273 sco_sock_clear_timer(sk); in sco_connect()
274 sk->sk_state = BT_CONNECTED; in sco_connect()
276 sk->sk_state = BT_CONNECT; in sco_connect()
277 sco_sock_set_timer(sk, sk->sk_sndtimeo); in sco_connect()
283 static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len) in sco_send_frame() argument
285 struct sco_conn *conn = sco_pi(sk)->conn; in sco_send_frame()
293 BT_DBG("sk %p len %d", sk, len); in sco_send_frame()
295 skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err); in sco_send_frame()
311 struct sock *sk; in sco_recv_frame() local
314 sk = conn->sk; in sco_recv_frame()
317 if (!sk) in sco_recv_frame()
320 BT_DBG("sk %p len %u", sk, skb->len); in sco_recv_frame()
322 if (sk->sk_state != BT_CONNECTED) in sco_recv_frame()
325 if (!sock_queue_rcv_skb(sk, skb)) in sco_recv_frame()
335 struct sock *sk; in __sco_get_sock_listen_by_addr() local
337 sk_for_each(sk, &sco_sk_list.head) { in __sco_get_sock_listen_by_addr()
338 if (sk->sk_state != BT_LISTEN) in __sco_get_sock_listen_by_addr()
341 if (!bacmp(&sco_pi(sk)->src, ba)) in __sco_get_sock_listen_by_addr()
342 return sk; in __sco_get_sock_listen_by_addr()
353 struct sock *sk = NULL, *sk1 = NULL; in sco_get_sock_listen() local
357 sk_for_each(sk, &sco_sk_list.head) { in sco_get_sock_listen()
358 if (sk->sk_state != BT_LISTEN) in sco_get_sock_listen()
362 if (!bacmp(&sco_pi(sk)->src, src)) in sco_get_sock_listen()
366 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY)) in sco_get_sock_listen()
367 sk1 = sk; in sco_get_sock_listen()
372 return sk ? sk : sk1; in sco_get_sock_listen()
375 static void sco_sock_destruct(struct sock *sk) in sco_sock_destruct() argument
377 BT_DBG("sk %p", sk); in sco_sock_destruct()
379 skb_queue_purge(&sk->sk_receive_queue); in sco_sock_destruct()
380 skb_queue_purge(&sk->sk_write_queue); in sco_sock_destruct()
385 struct sock *sk; in sco_sock_cleanup_listen() local
390 while ((sk = bt_accept_dequeue(parent, NULL))) { in sco_sock_cleanup_listen()
391 sco_sock_close(sk); in sco_sock_cleanup_listen()
392 sco_sock_kill(sk); in sco_sock_cleanup_listen()
402 static void sco_sock_kill(struct sock *sk) in sco_sock_kill() argument
404 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket) in sco_sock_kill()
407 BT_DBG("sk %p state %d", sk, sk->sk_state); in sco_sock_kill()
410 bt_sock_unlink(&sco_sk_list, sk); in sco_sock_kill()
411 sock_set_flag(sk, SOCK_DEAD); in sco_sock_kill()
412 sock_put(sk); in sco_sock_kill()
415 static void __sco_sock_close(struct sock *sk) in __sco_sock_close() argument
417 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket); in __sco_sock_close()
419 switch (sk->sk_state) { in __sco_sock_close()
421 sco_sock_cleanup_listen(sk); in __sco_sock_close()
426 if (sco_pi(sk)->conn->hcon) { in __sco_sock_close()
427 sk->sk_state = BT_DISCONN; in __sco_sock_close()
428 sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT); in __sco_sock_close()
429 sco_conn_lock(sco_pi(sk)->conn); in __sco_sock_close()
430 hci_conn_drop(sco_pi(sk)->conn->hcon); in __sco_sock_close()
431 sco_pi(sk)->conn->hcon = NULL; in __sco_sock_close()
432 sco_conn_unlock(sco_pi(sk)->conn); in __sco_sock_close()
434 sco_chan_del(sk, ECONNRESET); in __sco_sock_close()
440 sco_chan_del(sk, ECONNRESET); in __sco_sock_close()
444 sock_set_flag(sk, SOCK_ZAPPED); in __sco_sock_close()
450 static void sco_sock_close(struct sock *sk) in sco_sock_close() argument
452 lock_sock(sk); in sco_sock_close()
453 sco_sock_clear_timer(sk); in sco_sock_close()
454 __sco_sock_close(sk); in sco_sock_close()
455 release_sock(sk); in sco_sock_close()
459 struct sock *sk) in sco_skb_put_cmsg() argument
461 if (sco_pi(sk)->cmsg_mask & SCO_CMSG_PKT_STATUS) in sco_skb_put_cmsg()
467 static void sco_sock_init(struct sock *sk, struct sock *parent) in sco_sock_init() argument
469 BT_DBG("sk %p", sk); in sco_sock_init()
472 sk->sk_type = parent->sk_type; in sco_sock_init()
473 bt_sk(sk)->flags = bt_sk(parent)->flags; in sco_sock_init()
474 security_sk_clone(parent, sk); in sco_sock_init()
476 bt_sk(sk)->skb_put_cmsg = sco_skb_put_cmsg; in sco_sock_init()
489 struct sock *sk; in sco_sock_alloc() local
491 sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto, kern); in sco_sock_alloc()
492 if (!sk) in sco_sock_alloc()
495 sock_init_data(sock, sk); in sco_sock_alloc()
496 INIT_LIST_HEAD(&bt_sk(sk)->accept_q); in sco_sock_alloc()
498 sk->sk_destruct = sco_sock_destruct; in sco_sock_alloc()
499 sk->sk_sndtimeo = SCO_CONN_TIMEOUT; in sco_sock_alloc()
501 sock_reset_flag(sk, SOCK_ZAPPED); in sco_sock_alloc()
503 sk->sk_protocol = proto; in sco_sock_alloc()
504 sk->sk_state = BT_OPEN; in sco_sock_alloc()
506 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT; in sco_sock_alloc()
508 bt_sock_link(&sco_sk_list, sk); in sco_sock_alloc()
509 return sk; in sco_sock_alloc()
515 struct sock *sk; in sco_sock_create() local
526 sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern); in sco_sock_create()
527 if (!sk) in sco_sock_create()
530 sco_sock_init(sk, NULL); in sco_sock_create()
538 struct sock *sk = sock->sk; in sco_sock_bind() local
545 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr); in sco_sock_bind()
547 lock_sock(sk); in sco_sock_bind()
549 if (sk->sk_state != BT_OPEN) { in sco_sock_bind()
554 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_bind()
559 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr); in sco_sock_bind()
561 sk->sk_state = BT_BOUND; in sco_sock_bind()
564 release_sock(sk); in sco_sock_bind()
571 struct sock *sk = sock->sk; in sco_sock_connect() local
575 BT_DBG("sk %p", sk); in sco_sock_connect()
581 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) in sco_sock_connect()
584 if (sk->sk_type != SOCK_SEQPACKET) in sco_sock_connect()
587 hdev = hci_get_route(&sa->sco_bdaddr, &sco_pi(sk)->src, BDADDR_BREDR); in sco_sock_connect()
592 lock_sock(sk); in sco_sock_connect()
595 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr); in sco_sock_connect()
597 err = sco_connect(hdev, sk); in sco_sock_connect()
603 err = bt_sock_wait_state(sk, BT_CONNECTED, in sco_sock_connect()
604 sock_sndtimeo(sk, flags & O_NONBLOCK)); in sco_sock_connect()
607 release_sock(sk); in sco_sock_connect()
613 struct sock *sk = sock->sk; in sco_sock_listen() local
614 bdaddr_t *src = &sco_pi(sk)->src; in sco_sock_listen()
617 BT_DBG("sk %p backlog %d", sk, backlog); in sco_sock_listen()
619 lock_sock(sk); in sco_sock_listen()
621 if (sk->sk_state != BT_BOUND) { in sco_sock_listen()
626 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_listen()
638 sk->sk_max_ack_backlog = backlog; in sco_sock_listen()
639 sk->sk_ack_backlog = 0; in sco_sock_listen()
641 sk->sk_state = BT_LISTEN; in sco_sock_listen()
647 release_sock(sk); in sco_sock_listen()
655 struct sock *sk = sock->sk, *ch; in sco_sock_accept() local
659 lock_sock(sk); in sco_sock_accept()
661 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); in sco_sock_accept()
663 BT_DBG("sk %p timeo %ld", sk, timeo); in sco_sock_accept()
666 add_wait_queue_exclusive(sk_sleep(sk), &wait); in sco_sock_accept()
668 if (sk->sk_state != BT_LISTEN) { in sco_sock_accept()
673 ch = bt_accept_dequeue(sk, newsock); in sco_sock_accept()
687 release_sock(sk); in sco_sock_accept()
690 lock_sock(sk); in sco_sock_accept()
692 remove_wait_queue(sk_sleep(sk), &wait); in sco_sock_accept()
702 release_sock(sk); in sco_sock_accept()
710 struct sock *sk = sock->sk; in sco_sock_getname() local
712 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_getname()
717 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst); in sco_sock_getname()
719 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src); in sco_sock_getname()
727 struct sock *sk = sock->sk; in sco_sock_sendmsg() local
730 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_sendmsg()
732 err = sock_error(sk); in sco_sock_sendmsg()
739 lock_sock(sk); in sco_sock_sendmsg()
741 if (sk->sk_state == BT_CONNECTED) in sco_sock_sendmsg()
742 err = sco_send_frame(sk, msg, len); in sco_sock_sendmsg()
746 release_sock(sk); in sco_sock_sendmsg()
802 struct sock *sk = sock->sk; in sco_sock_recvmsg() local
803 struct sco_pinfo *pi = sco_pi(sk); in sco_sock_recvmsg()
805 lock_sock(sk); in sco_sock_recvmsg()
807 if (sk->sk_state == BT_CONNECT2 && in sco_sock_recvmsg()
808 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in sco_sock_recvmsg()
810 sk->sk_state = BT_CONFIG; in sco_sock_recvmsg()
812 release_sock(sk); in sco_sock_recvmsg()
816 release_sock(sk); in sco_sock_recvmsg()
824 struct sock *sk = sock->sk; in sco_sock_setsockopt() local
829 BT_DBG("sk %p", sk); in sco_sock_setsockopt()
831 lock_sock(sk); in sco_sock_setsockopt()
836 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_setsockopt()
847 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
849 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
853 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in sco_sock_setsockopt()
854 sk->sk_state != BT_CONNECT2) { in sco_sock_setsockopt()
859 voice.setting = sco_pi(sk)->setting; in sco_sock_setsockopt()
874 sco_pi(sk)->setting = voice.setting; in sco_sock_setsockopt()
884 sco_pi(sk)->cmsg_mask |= SCO_CMSG_PKT_STATUS; in sco_sock_setsockopt()
886 sco_pi(sk)->cmsg_mask &= SCO_CMSG_PKT_STATUS; in sco_sock_setsockopt()
894 release_sock(sk); in sco_sock_setsockopt()
901 struct sock *sk = sock->sk; in sco_sock_getsockopt_old() local
906 BT_DBG("sk %p", sk); in sco_sock_getsockopt_old()
911 lock_sock(sk); in sco_sock_getsockopt_old()
915 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
916 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
917 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
922 opts.mtu = sco_pi(sk)->conn->mtu; in sco_sock_getsockopt_old()
933 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
934 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
935 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
941 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle; in sco_sock_getsockopt_old()
942 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3); in sco_sock_getsockopt_old()
955 release_sock(sk); in sco_sock_getsockopt_old()
962 struct sock *sk = sock->sk; in sco_sock_getsockopt() local
968 BT_DBG("sk %p", sk); in sco_sock_getsockopt()
976 lock_sock(sk); in sco_sock_getsockopt()
981 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_getsockopt()
986 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), in sco_sock_getsockopt()
993 voice.setting = sco_pi(sk)->setting; in sco_sock_getsockopt()
1002 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1007 phys = hci_conn_get_phy(sco_pi(sk)->conn->hcon); in sco_sock_getsockopt()
1014 pkt_status = (sco_pi(sk)->cmsg_mask & SCO_CMSG_PKT_STATUS); in sco_sock_getsockopt()
1022 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1027 if (put_user(sco_pi(sk)->conn->mtu, (u32 __user *)optval)) in sco_sock_getsockopt()
1036 release_sock(sk); in sco_sock_getsockopt()
1042 struct sock *sk = sock->sk; in sco_sock_shutdown() local
1045 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_shutdown()
1047 if (!sk) in sco_sock_shutdown()
1050 sock_hold(sk); in sco_sock_shutdown()
1051 lock_sock(sk); in sco_sock_shutdown()
1053 if (!sk->sk_shutdown) { in sco_sock_shutdown()
1054 sk->sk_shutdown = SHUTDOWN_MASK; in sco_sock_shutdown()
1055 sco_sock_clear_timer(sk); in sco_sock_shutdown()
1056 __sco_sock_close(sk); in sco_sock_shutdown()
1058 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in sco_sock_shutdown()
1060 err = bt_sock_wait_state(sk, BT_CLOSED, in sco_sock_shutdown()
1061 sk->sk_lingertime); in sco_sock_shutdown()
1064 release_sock(sk); in sco_sock_shutdown()
1065 sock_put(sk); in sco_sock_shutdown()
1072 struct sock *sk = sock->sk; in sco_sock_release() local
1075 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_release()
1077 if (!sk) in sco_sock_release()
1080 sco_sock_close(sk); in sco_sock_release()
1082 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in sco_sock_release()
1084 lock_sock(sk); in sco_sock_release()
1085 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime); in sco_sock_release()
1086 release_sock(sk); in sco_sock_release()
1089 sock_orphan(sk); in sco_sock_release()
1090 sco_sock_kill(sk); in sco_sock_release()
1097 struct sock *sk = conn->sk; in sco_conn_ready() local
1101 if (sk) { in sco_conn_ready()
1102 lock_sock(sk); in sco_conn_ready()
1103 sco_sock_clear_timer(sk); in sco_conn_ready()
1104 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1105 sk->sk_state_change(sk); in sco_conn_ready()
1106 release_sock(sk); in sco_conn_ready()
1123 sk = sco_sock_alloc(sock_net(parent), NULL, in sco_conn_ready()
1125 if (!sk) { in sco_conn_ready()
1131 sco_sock_init(sk, parent); in sco_conn_ready()
1133 bacpy(&sco_pi(sk)->src, &conn->hcon->src); in sco_conn_ready()
1134 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst); in sco_conn_ready()
1137 __sco_chan_add(conn, sk, parent); in sco_conn_ready()
1140 sk->sk_state = BT_CONNECT2; in sco_conn_ready()
1142 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1156 struct sock *sk; in sco_connect_ind() local
1163 sk_for_each(sk, &sco_sk_list.head) { in sco_connect_ind()
1164 if (sk->sk_state != BT_LISTEN) in sco_connect_ind()
1167 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) || in sco_connect_ind()
1168 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) { in sco_connect_ind()
1171 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) in sco_connect_ind()
1234 struct sock *sk; in sco_debugfs_show() local
1238 sk_for_each(sk, &sco_sk_list.head) { in sco_debugfs_show()
1239 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src, in sco_debugfs_show()
1240 &sco_pi(sk)->dst, sk->sk_state); in sco_debugfs_show()