Lines Matching refs:sk

48 	struct sock	*sk;  member
56 static void sco_sock_close(struct sock *sk);
57 static void sco_sock_kill(struct sock *sk);
60 #define sco_pi(sk) ((struct sco_pinfo *) sk) argument
77 struct sock *sk = (struct sock *) arg; in sco_sock_timeout() local
79 BT_DBG("sock %p state %d", sk, sk->sk_state); in sco_sock_timeout()
81 bh_lock_sock(sk); in sco_sock_timeout()
82 sk->sk_err = ETIMEDOUT; in sco_sock_timeout()
83 sk->sk_state_change(sk); in sco_sock_timeout()
84 bh_unlock_sock(sk); in sco_sock_timeout()
86 sco_sock_kill(sk); in sco_sock_timeout()
87 sock_put(sk); in sco_sock_timeout()
90 static void sco_sock_set_timer(struct sock *sk, long timeout) in sco_sock_set_timer() argument
92 BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout); in sco_sock_set_timer()
93 sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout); in sco_sock_set_timer()
96 static void sco_sock_clear_timer(struct sock *sk) in sco_sock_clear_timer() argument
98 BT_DBG("sock %p state %d", sk, sk->sk_state); in sco_sock_clear_timer()
99 sk_stop_timer(sk, &sk->sk_timer); in sco_sock_clear_timer()
132 static void sco_chan_del(struct sock *sk, int err) in sco_chan_del() argument
136 conn = sco_pi(sk)->conn; in sco_chan_del()
138 BT_DBG("sk %p, conn %p, err %d", sk, conn, err); in sco_chan_del()
142 conn->sk = NULL; in sco_chan_del()
143 sco_pi(sk)->conn = NULL; in sco_chan_del()
150 sk->sk_state = BT_CLOSED; in sco_chan_del()
151 sk->sk_err = err; in sco_chan_del()
152 sk->sk_state_change(sk); in sco_chan_del()
154 sock_set_flag(sk, SOCK_ZAPPED); in sco_chan_del()
160 struct sock *sk; in sco_conn_del() local
169 sk = conn->sk; in sco_conn_del()
172 if (sk) { in sco_conn_del()
173 bh_lock_sock(sk); in sco_conn_del()
174 sco_sock_clear_timer(sk); in sco_conn_del()
175 sco_chan_del(sk, err); in sco_conn_del()
176 bh_unlock_sock(sk); in sco_conn_del()
177 sco_sock_kill(sk); in sco_conn_del()
185 static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent) in __sco_chan_add() argument
189 sco_pi(sk)->conn = conn; in __sco_chan_add()
190 conn->sk = sk; in __sco_chan_add()
193 bt_accept_enqueue(parent, sk); in __sco_chan_add()
196 static int sco_chan_add(struct sco_conn *conn, struct sock *sk, in sco_chan_add() argument
202 if (conn->sk) in sco_chan_add()
205 __sco_chan_add(conn, sk, parent); in sco_chan_add()
211 static int sco_connect(struct sock *sk) in sco_connect() argument
218 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst); in sco_connect()
220 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src); in sco_connect()
231 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT && in sco_connect()
237 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst, in sco_connect()
238 sco_pi(sk)->setting); in sco_connect()
252 bacpy(&sco_pi(sk)->src, &hcon->src); in sco_connect()
254 err = sco_chan_add(conn, sk, NULL); in sco_connect()
259 sco_sock_clear_timer(sk); in sco_connect()
260 sk->sk_state = BT_CONNECTED; in sco_connect()
262 sk->sk_state = BT_CONNECT; in sco_connect()
263 sco_sock_set_timer(sk, sk->sk_sndtimeo); in sco_connect()
272 static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len) in sco_send_frame() argument
274 struct sco_conn *conn = sco_pi(sk)->conn; in sco_send_frame()
282 BT_DBG("sk %p len %d", sk, len); in sco_send_frame()
284 skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err); in sco_send_frame()
300 struct sock *sk; in sco_recv_frame() local
303 sk = conn->sk; in sco_recv_frame()
306 if (!sk) in sco_recv_frame()
309 BT_DBG("sk %p len %d", sk, skb->len); in sco_recv_frame()
311 if (sk->sk_state != BT_CONNECTED) in sco_recv_frame()
314 if (!sock_queue_rcv_skb(sk, skb)) in sco_recv_frame()
324 struct sock *sk; in __sco_get_sock_listen_by_addr() local
326 sk_for_each(sk, &sco_sk_list.head) { in __sco_get_sock_listen_by_addr()
327 if (sk->sk_state != BT_LISTEN) in __sco_get_sock_listen_by_addr()
330 if (!bacmp(&sco_pi(sk)->src, ba)) in __sco_get_sock_listen_by_addr()
331 return sk; in __sco_get_sock_listen_by_addr()
342 struct sock *sk = NULL, *sk1 = NULL; in sco_get_sock_listen() local
346 sk_for_each(sk, &sco_sk_list.head) { in sco_get_sock_listen()
347 if (sk->sk_state != BT_LISTEN) in sco_get_sock_listen()
351 if (!bacmp(&sco_pi(sk)->src, src)) in sco_get_sock_listen()
355 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY)) in sco_get_sock_listen()
356 sk1 = sk; in sco_get_sock_listen()
361 return sk ? sk : sk1; in sco_get_sock_listen()
364 static void sco_sock_destruct(struct sock *sk) in sco_sock_destruct() argument
366 BT_DBG("sk %p", sk); in sco_sock_destruct()
368 skb_queue_purge(&sk->sk_receive_queue); in sco_sock_destruct()
369 skb_queue_purge(&sk->sk_write_queue); in sco_sock_destruct()
374 struct sock *sk; in sco_sock_cleanup_listen() local
379 while ((sk = bt_accept_dequeue(parent, NULL))) { in sco_sock_cleanup_listen()
380 sco_sock_close(sk); in sco_sock_cleanup_listen()
381 sco_sock_kill(sk); in sco_sock_cleanup_listen()
391 static void sco_sock_kill(struct sock *sk) in sco_sock_kill() argument
393 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket) in sco_sock_kill()
396 BT_DBG("sk %p state %d", sk, sk->sk_state); in sco_sock_kill()
399 bt_sock_unlink(&sco_sk_list, sk); in sco_sock_kill()
400 sock_set_flag(sk, SOCK_DEAD); in sco_sock_kill()
401 sock_put(sk); in sco_sock_kill()
404 static void __sco_sock_close(struct sock *sk) in __sco_sock_close() argument
406 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket); in __sco_sock_close()
408 switch (sk->sk_state) { in __sco_sock_close()
410 sco_sock_cleanup_listen(sk); in __sco_sock_close()
415 if (sco_pi(sk)->conn->hcon) { in __sco_sock_close()
416 sk->sk_state = BT_DISCONN; in __sco_sock_close()
417 sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT); in __sco_sock_close()
418 hci_conn_drop(sco_pi(sk)->conn->hcon); in __sco_sock_close()
419 sco_pi(sk)->conn->hcon = NULL; in __sco_sock_close()
421 sco_chan_del(sk, ECONNRESET); in __sco_sock_close()
427 sco_chan_del(sk, ECONNRESET); in __sco_sock_close()
431 sock_set_flag(sk, SOCK_ZAPPED); in __sco_sock_close()
437 static void sco_sock_close(struct sock *sk) in sco_sock_close() argument
439 sco_sock_clear_timer(sk); in sco_sock_close()
440 lock_sock(sk); in sco_sock_close()
441 __sco_sock_close(sk); in sco_sock_close()
442 release_sock(sk); in sco_sock_close()
443 sco_sock_kill(sk); in sco_sock_close()
446 static void sco_sock_init(struct sock *sk, struct sock *parent) in sco_sock_init() argument
448 BT_DBG("sk %p", sk); in sco_sock_init()
451 sk->sk_type = parent->sk_type; in sco_sock_init()
452 bt_sk(sk)->flags = bt_sk(parent)->flags; in sco_sock_init()
453 security_sk_clone(parent, sk); in sco_sock_init()
465 struct sock *sk; in sco_sock_alloc() local
467 sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto); in sco_sock_alloc()
468 if (!sk) in sco_sock_alloc()
471 sock_init_data(sock, sk); in sco_sock_alloc()
472 INIT_LIST_HEAD(&bt_sk(sk)->accept_q); in sco_sock_alloc()
474 sk->sk_destruct = sco_sock_destruct; in sco_sock_alloc()
475 sk->sk_sndtimeo = SCO_CONN_TIMEOUT; in sco_sock_alloc()
477 sock_reset_flag(sk, SOCK_ZAPPED); in sco_sock_alloc()
479 sk->sk_protocol = proto; in sco_sock_alloc()
480 sk->sk_state = BT_OPEN; in sco_sock_alloc()
482 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT; in sco_sock_alloc()
484 setup_timer(&sk->sk_timer, sco_sock_timeout, (unsigned long)sk); in sco_sock_alloc()
486 bt_sock_link(&sco_sk_list, sk); in sco_sock_alloc()
487 return sk; in sco_sock_alloc()
493 struct sock *sk; in sco_sock_create() local
504 sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC); in sco_sock_create()
505 if (!sk) in sco_sock_create()
508 sco_sock_init(sk, NULL); in sco_sock_create()
515 struct sock *sk = sock->sk; in sco_sock_bind() local
518 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr); in sco_sock_bind()
526 lock_sock(sk); in sco_sock_bind()
528 if (sk->sk_state != BT_OPEN) { in sco_sock_bind()
533 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_bind()
538 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr); in sco_sock_bind()
540 sk->sk_state = BT_BOUND; in sco_sock_bind()
543 release_sock(sk); in sco_sock_bind()
550 struct sock *sk = sock->sk; in sco_sock_connect() local
553 BT_DBG("sk %p", sk); in sco_sock_connect()
559 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) in sco_sock_connect()
562 if (sk->sk_type != SOCK_SEQPACKET) in sco_sock_connect()
565 lock_sock(sk); in sco_sock_connect()
568 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr); in sco_sock_connect()
570 err = sco_connect(sk); in sco_sock_connect()
574 err = bt_sock_wait_state(sk, BT_CONNECTED, in sco_sock_connect()
575 sock_sndtimeo(sk, flags & O_NONBLOCK)); in sco_sock_connect()
578 release_sock(sk); in sco_sock_connect()
584 struct sock *sk = sock->sk; in sco_sock_listen() local
585 bdaddr_t *src = &sco_pi(sk)->src; in sco_sock_listen()
588 BT_DBG("sk %p backlog %d", sk, backlog); in sco_sock_listen()
590 lock_sock(sk); in sco_sock_listen()
592 if (sk->sk_state != BT_BOUND) { in sco_sock_listen()
597 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_listen()
609 sk->sk_max_ack_backlog = backlog; in sco_sock_listen()
610 sk->sk_ack_backlog = 0; in sco_sock_listen()
612 sk->sk_state = BT_LISTEN; in sco_sock_listen()
618 release_sock(sk); in sco_sock_listen()
625 struct sock *sk = sock->sk, *ch; in sco_sock_accept() local
629 lock_sock(sk); in sco_sock_accept()
631 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); in sco_sock_accept()
633 BT_DBG("sk %p timeo %ld", sk, timeo); in sco_sock_accept()
636 add_wait_queue_exclusive(sk_sleep(sk), &wait); in sco_sock_accept()
638 if (sk->sk_state != BT_LISTEN) { in sco_sock_accept()
643 ch = bt_accept_dequeue(sk, newsock); in sco_sock_accept()
657 release_sock(sk); in sco_sock_accept()
660 lock_sock(sk); in sco_sock_accept()
662 remove_wait_queue(sk_sleep(sk), &wait); in sco_sock_accept()
672 release_sock(sk); in sco_sock_accept()
679 struct sock *sk = sock->sk; in sco_sock_getname() local
681 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_getname()
687 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst); in sco_sock_getname()
689 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src); in sco_sock_getname()
697 struct sock *sk = sock->sk; in sco_sock_sendmsg() local
700 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_sendmsg()
702 err = sock_error(sk); in sco_sock_sendmsg()
709 lock_sock(sk); in sco_sock_sendmsg()
711 if (sk->sk_state == BT_CONNECTED) in sco_sock_sendmsg()
712 err = sco_send_frame(sk, msg, len); in sco_sock_sendmsg()
716 release_sock(sk); in sco_sock_sendmsg()
767 struct sock *sk = sock->sk; in sco_sock_recvmsg() local
768 struct sco_pinfo *pi = sco_pi(sk); in sco_sock_recvmsg()
770 lock_sock(sk); in sco_sock_recvmsg()
772 if (sk->sk_state == BT_CONNECT2 && in sco_sock_recvmsg()
773 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in sco_sock_recvmsg()
775 sk->sk_state = BT_CONFIG; in sco_sock_recvmsg()
777 release_sock(sk); in sco_sock_recvmsg()
781 release_sock(sk); in sco_sock_recvmsg()
788 struct sock *sk = sock->sk; in sco_sock_setsockopt() local
793 BT_DBG("sk %p", sk); in sco_sock_setsockopt()
795 lock_sock(sk); in sco_sock_setsockopt()
800 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_setsockopt()
811 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
813 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
817 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in sco_sock_setsockopt()
818 sk->sk_state != BT_CONNECT2) { in sco_sock_setsockopt()
823 voice.setting = sco_pi(sk)->setting; in sco_sock_setsockopt()
838 sco_pi(sk)->setting = voice.setting; in sco_sock_setsockopt()
846 release_sock(sk); in sco_sock_setsockopt()
852 struct sock *sk = sock->sk; in sco_sock_getsockopt_old() local
857 BT_DBG("sk %p", sk); in sco_sock_getsockopt_old()
862 lock_sock(sk); in sco_sock_getsockopt_old()
866 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
867 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
868 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
873 opts.mtu = sco_pi(sk)->conn->mtu; in sco_sock_getsockopt_old()
884 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
885 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
886 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
892 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle; in sco_sock_getsockopt_old()
893 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3); in sco_sock_getsockopt_old()
906 release_sock(sk); in sco_sock_getsockopt_old()
912 struct sock *sk = sock->sk; in sco_sock_getsockopt() local
916 BT_DBG("sk %p", sk); in sco_sock_getsockopt()
924 lock_sock(sk); in sco_sock_getsockopt()
929 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_getsockopt()
934 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), in sco_sock_getsockopt()
941 voice.setting = sco_pi(sk)->setting; in sco_sock_getsockopt()
954 release_sock(sk); in sco_sock_getsockopt()
960 struct sock *sk = sock->sk; in sco_sock_shutdown() local
963 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_shutdown()
965 if (!sk) in sco_sock_shutdown()
968 lock_sock(sk); in sco_sock_shutdown()
969 if (!sk->sk_shutdown) { in sco_sock_shutdown()
970 sk->sk_shutdown = SHUTDOWN_MASK; in sco_sock_shutdown()
971 sco_sock_clear_timer(sk); in sco_sock_shutdown()
972 __sco_sock_close(sk); in sco_sock_shutdown()
974 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in sco_sock_shutdown()
976 err = bt_sock_wait_state(sk, BT_CLOSED, in sco_sock_shutdown()
977 sk->sk_lingertime); in sco_sock_shutdown()
979 release_sock(sk); in sco_sock_shutdown()
985 struct sock *sk = sock->sk; in sco_sock_release() local
988 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_release()
990 if (!sk) in sco_sock_release()
993 sco_sock_close(sk); in sco_sock_release()
995 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in sco_sock_release()
997 lock_sock(sk); in sco_sock_release()
998 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime); in sco_sock_release()
999 release_sock(sk); in sco_sock_release()
1002 sock_orphan(sk); in sco_sock_release()
1003 sco_sock_kill(sk); in sco_sock_release()
1010 struct sock *sk = conn->sk; in sco_conn_ready() local
1014 if (sk) { in sco_conn_ready()
1015 sco_sock_clear_timer(sk); in sco_conn_ready()
1016 bh_lock_sock(sk); in sco_conn_ready()
1017 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1018 sk->sk_state_change(sk); in sco_conn_ready()
1019 bh_unlock_sock(sk); in sco_conn_ready()
1031 sk = sco_sock_alloc(sock_net(parent), NULL, in sco_conn_ready()
1033 if (!sk) { in sco_conn_ready()
1039 sco_sock_init(sk, parent); in sco_conn_ready()
1041 bacpy(&sco_pi(sk)->src, &conn->hcon->src); in sco_conn_ready()
1042 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst); in sco_conn_ready()
1045 __sco_chan_add(conn, sk, parent); in sco_conn_ready()
1048 sk->sk_state = BT_CONNECT2; in sco_conn_ready()
1050 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1064 struct sock *sk; in sco_connect_ind() local
1071 sk_for_each(sk, &sco_sk_list.head) { in sco_connect_ind()
1072 if (sk->sk_state != BT_LISTEN) in sco_connect_ind()
1075 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) || in sco_connect_ind()
1076 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) { in sco_connect_ind()
1079 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) in sco_connect_ind()
1143 struct sock *sk; in sco_debugfs_show() local
1147 sk_for_each(sk, &sco_sk_list.head) { in sco_debugfs_show()
1148 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src, in sco_debugfs_show()
1149 &sco_pi(sk)->dst, sk->sk_state); in sco_debugfs_show()