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
81 if (!conn || !bt_sock_linked(&sco_sk_list, conn->sk)) in sco_sock_hold()
84 sock_hold(conn->sk); in sco_sock_hold()
86 return conn->sk; in sco_sock_hold()
93 struct sock *sk; in sco_sock_timeout() local
100 sk = sco_sock_hold(conn); in sco_sock_timeout()
103 if (!sk) in sco_sock_timeout()
106 BT_DBG("sock %p state %d", sk, sk->sk_state); in sco_sock_timeout()
108 lock_sock(sk); in sco_sock_timeout()
109 sk->sk_err = ETIMEDOUT; in sco_sock_timeout()
110 sk->sk_state_change(sk); in sco_sock_timeout()
111 release_sock(sk); in sco_sock_timeout()
112 sock_put(sk); in sco_sock_timeout()
115 static void sco_sock_set_timer(struct sock *sk, long timeout) in sco_sock_set_timer() argument
117 if (!sco_pi(sk)->conn) in sco_sock_set_timer()
120 BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout); in sco_sock_set_timer()
121 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work); in sco_sock_set_timer()
122 schedule_delayed_work(&sco_pi(sk)->conn->timeout_work, timeout); in sco_sock_set_timer()
125 static void sco_sock_clear_timer(struct sock *sk) in sco_sock_clear_timer() argument
127 if (!sco_pi(sk)->conn) in sco_sock_clear_timer()
130 BT_DBG("sock %p state %d", sk, sk->sk_state); in sco_sock_clear_timer()
131 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work); in sco_sock_clear_timer()
168 static void sco_chan_del(struct sock *sk, int err) in sco_chan_del() argument
172 conn = sco_pi(sk)->conn; in sco_chan_del()
174 BT_DBG("sk %p, conn %p, err %d", sk, conn, err); in sco_chan_del()
178 conn->sk = NULL; in sco_chan_del()
179 sco_pi(sk)->conn = NULL; in sco_chan_del()
186 sk->sk_state = BT_CLOSED; in sco_chan_del()
187 sk->sk_err = err; in sco_chan_del()
188 sk->sk_state_change(sk); in sco_chan_del()
190 sock_set_flag(sk, SOCK_ZAPPED); in sco_chan_del()
196 struct sock *sk; in sco_conn_del() local
205 sk = sco_sock_hold(conn); in sco_conn_del()
208 if (sk) { in sco_conn_del()
209 lock_sock(sk); in sco_conn_del()
210 sco_sock_clear_timer(sk); in sco_conn_del()
211 sco_chan_del(sk, err); in sco_conn_del()
212 release_sock(sk); in sco_conn_del()
213 sock_put(sk); in sco_conn_del()
223 static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, in __sco_chan_add() argument
228 sco_pi(sk)->conn = conn; in __sco_chan_add()
229 conn->sk = sk; in __sco_chan_add()
232 bt_accept_enqueue(parent, sk, true); in __sco_chan_add()
235 static int sco_chan_add(struct sco_conn *conn, struct sock *sk, in sco_chan_add() argument
241 if (conn->sk) in sco_chan_add()
244 __sco_chan_add(conn, sk, parent); in sco_chan_add()
250 static int sco_connect(struct sock *sk) in sco_connect() argument
257 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst); in sco_connect()
259 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR); in sco_connect()
270 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT && in sco_connect()
276 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst, in sco_connect()
277 sco_pi(sk)->setting, &sco_pi(sk)->codec, in sco_connect()
278 sk->sk_sndtimeo); in sco_connect()
291 lock_sock(sk); in sco_connect()
293 err = sco_chan_add(conn, sk, NULL); in sco_connect()
295 release_sock(sk); in sco_connect()
300 bacpy(&sco_pi(sk)->src, &hcon->src); in sco_connect()
303 sco_sock_clear_timer(sk); in sco_connect()
304 sk->sk_state = BT_CONNECTED; in sco_connect()
306 sk->sk_state = BT_CONNECT; in sco_connect()
307 sco_sock_set_timer(sk, sk->sk_sndtimeo); in sco_connect()
310 release_sock(sk); in sco_connect()
318 static int sco_send_frame(struct sock *sk, struct sk_buff *skb) in sco_send_frame() argument
320 struct sco_conn *conn = sco_pi(sk)->conn; in sco_send_frame()
327 BT_DBG("sk %p len %d", sk, len); in sco_send_frame()
336 struct sock *sk; in sco_recv_frame() local
339 sk = conn->sk; in sco_recv_frame()
342 if (!sk) in sco_recv_frame()
345 BT_DBG("sk %p len %u", sk, skb->len); in sco_recv_frame()
347 if (sk->sk_state != BT_CONNECTED) in sco_recv_frame()
350 if (!sock_queue_rcv_skb(sk, skb)) in sco_recv_frame()
360 struct sock *sk; in __sco_get_sock_listen_by_addr() local
362 sk_for_each(sk, &sco_sk_list.head) { in __sco_get_sock_listen_by_addr()
363 if (sk->sk_state != BT_LISTEN) in __sco_get_sock_listen_by_addr()
366 if (!bacmp(&sco_pi(sk)->src, ba)) in __sco_get_sock_listen_by_addr()
367 return sk; in __sco_get_sock_listen_by_addr()
378 struct sock *sk = NULL, *sk1 = NULL; in sco_get_sock_listen() local
382 sk_for_each(sk, &sco_sk_list.head) { in sco_get_sock_listen()
383 if (sk->sk_state != BT_LISTEN) in sco_get_sock_listen()
387 if (!bacmp(&sco_pi(sk)->src, src)) in sco_get_sock_listen()
391 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY)) in sco_get_sock_listen()
392 sk1 = sk; in sco_get_sock_listen()
397 return sk ? sk : sk1; in sco_get_sock_listen()
400 static void sco_sock_destruct(struct sock *sk) in sco_sock_destruct() argument
402 BT_DBG("sk %p", sk); in sco_sock_destruct()
404 skb_queue_purge(&sk->sk_receive_queue); in sco_sock_destruct()
405 skb_queue_purge(&sk->sk_write_queue); in sco_sock_destruct()
410 struct sock *sk; in sco_sock_cleanup_listen() local
415 while ((sk = bt_accept_dequeue(parent, NULL))) { in sco_sock_cleanup_listen()
416 sco_sock_close(sk); in sco_sock_cleanup_listen()
417 sco_sock_kill(sk); in sco_sock_cleanup_listen()
427 static void sco_sock_kill(struct sock *sk) in sco_sock_kill() argument
429 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket) in sco_sock_kill()
432 BT_DBG("sk %p state %d", sk, sk->sk_state); in sco_sock_kill()
435 bt_sock_unlink(&sco_sk_list, sk); in sco_sock_kill()
436 sock_set_flag(sk, SOCK_DEAD); in sco_sock_kill()
437 sock_put(sk); in sco_sock_kill()
440 static void __sco_sock_close(struct sock *sk) in __sco_sock_close() argument
442 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket); in __sco_sock_close()
444 switch (sk->sk_state) { in __sco_sock_close()
446 sco_sock_cleanup_listen(sk); in __sco_sock_close()
451 if (sco_pi(sk)->conn->hcon) { in __sco_sock_close()
452 sk->sk_state = BT_DISCONN; in __sco_sock_close()
453 sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT); in __sco_sock_close()
454 sco_conn_lock(sco_pi(sk)->conn); in __sco_sock_close()
455 hci_conn_drop(sco_pi(sk)->conn->hcon); in __sco_sock_close()
456 sco_pi(sk)->conn->hcon = NULL; in __sco_sock_close()
457 sco_conn_unlock(sco_pi(sk)->conn); in __sco_sock_close()
459 sco_chan_del(sk, ECONNRESET); in __sco_sock_close()
465 sco_chan_del(sk, ECONNRESET); in __sco_sock_close()
469 sock_set_flag(sk, SOCK_ZAPPED); in __sco_sock_close()
476 static void sco_sock_close(struct sock *sk) in sco_sock_close() argument
478 lock_sock(sk); in sco_sock_close()
479 sco_sock_clear_timer(sk); in sco_sock_close()
480 __sco_sock_close(sk); in sco_sock_close()
481 release_sock(sk); in sco_sock_close()
484 static void sco_sock_init(struct sock *sk, struct sock *parent) in sco_sock_init() argument
486 BT_DBG("sk %p", sk); in sco_sock_init()
489 sk->sk_type = parent->sk_type; in sco_sock_init()
490 bt_sk(sk)->flags = bt_sk(parent)->flags; in sco_sock_init()
491 security_sk_clone(parent, sk); in sco_sock_init()
504 struct sock *sk; in sco_sock_alloc() local
506 sk = bt_sock_alloc(net, sock, &sco_proto, proto, prio, kern); in sco_sock_alloc()
507 if (!sk) in sco_sock_alloc()
510 sk->sk_destruct = sco_sock_destruct; in sco_sock_alloc()
511 sk->sk_sndtimeo = SCO_CONN_TIMEOUT; in sco_sock_alloc()
513 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT; in sco_sock_alloc()
514 sco_pi(sk)->codec.id = BT_CODEC_CVSD; in sco_sock_alloc()
515 sco_pi(sk)->codec.cid = 0xffff; in sco_sock_alloc()
516 sco_pi(sk)->codec.vid = 0xffff; in sco_sock_alloc()
517 sco_pi(sk)->codec.data_path = 0x00; in sco_sock_alloc()
519 bt_sock_link(&sco_sk_list, sk); in sco_sock_alloc()
520 return sk; in sco_sock_alloc()
526 struct sock *sk; in sco_sock_create() local
537 sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern); in sco_sock_create()
538 if (!sk) in sco_sock_create()
541 sco_sock_init(sk, NULL); in sco_sock_create()
549 struct sock *sk = sock->sk; in sco_sock_bind() local
556 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr); in sco_sock_bind()
558 lock_sock(sk); in sco_sock_bind()
560 if (sk->sk_state != BT_OPEN) { in sco_sock_bind()
565 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_bind()
570 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr); in sco_sock_bind()
572 sk->sk_state = BT_BOUND; in sco_sock_bind()
575 release_sock(sk); in sco_sock_bind()
582 struct sock *sk = sock->sk; in sco_sock_connect() local
585 BT_DBG("sk %p", sk); in sco_sock_connect()
591 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) in sco_sock_connect()
594 if (sk->sk_type != SOCK_SEQPACKET) in sco_sock_connect()
597 lock_sock(sk); in sco_sock_connect()
599 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr); in sco_sock_connect()
600 release_sock(sk); in sco_sock_connect()
602 err = sco_connect(sk); in sco_sock_connect()
606 lock_sock(sk); in sco_sock_connect()
608 err = bt_sock_wait_state(sk, BT_CONNECTED, in sco_sock_connect()
609 sock_sndtimeo(sk, flags & O_NONBLOCK)); in sco_sock_connect()
611 release_sock(sk); in sco_sock_connect()
617 struct sock *sk = sock->sk; in sco_sock_listen() local
618 bdaddr_t *src = &sco_pi(sk)->src; in sco_sock_listen()
621 BT_DBG("sk %p backlog %d", sk, backlog); in sco_sock_listen()
623 lock_sock(sk); in sco_sock_listen()
625 if (sk->sk_state != BT_BOUND) { in sco_sock_listen()
630 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_listen()
642 sk->sk_max_ack_backlog = backlog; in sco_sock_listen()
643 sk->sk_ack_backlog = 0; in sco_sock_listen()
645 sk->sk_state = BT_LISTEN; in sco_sock_listen()
651 release_sock(sk); in sco_sock_listen()
659 struct sock *sk = sock->sk, *ch; in sco_sock_accept() local
663 lock_sock(sk); in sco_sock_accept()
665 timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK); in sco_sock_accept()
667 BT_DBG("sk %p timeo %ld", sk, timeo); in sco_sock_accept()
670 add_wait_queue_exclusive(sk_sleep(sk), &wait); in sco_sock_accept()
672 if (sk->sk_state != BT_LISTEN) { in sco_sock_accept()
677 ch = bt_accept_dequeue(sk, newsock); in sco_sock_accept()
691 release_sock(sk); in sco_sock_accept()
694 lock_sock(sk); in sco_sock_accept()
696 remove_wait_queue(sk_sleep(sk), &wait); in sco_sock_accept()
706 release_sock(sk); in sco_sock_accept()
714 struct sock *sk = sock->sk; in sco_sock_getname() local
716 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_getname()
721 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst); in sco_sock_getname()
723 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src); in sco_sock_getname()
731 struct sock *sk = sock->sk; in sco_sock_sendmsg() local
735 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_sendmsg()
737 err = sock_error(sk); in sco_sock_sendmsg()
744 skb = bt_skb_sendmsg(sk, msg, len, len, 0, 0); in sco_sock_sendmsg()
748 lock_sock(sk); in sco_sock_sendmsg()
750 if (sk->sk_state == BT_CONNECTED) in sco_sock_sendmsg()
751 err = sco_send_frame(sk, skb); in sco_sock_sendmsg()
755 release_sock(sk); in sco_sock_sendmsg()
814 struct sock *sk = sock->sk; in sco_sock_recvmsg() local
815 struct sco_pinfo *pi = sco_pi(sk); in sco_sock_recvmsg()
817 lock_sock(sk); in sco_sock_recvmsg()
819 if (sk->sk_state == BT_CONNECT2 && in sco_sock_recvmsg()
820 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in sco_sock_recvmsg()
822 sk->sk_state = BT_CONFIG; in sco_sock_recvmsg()
824 release_sock(sk); in sco_sock_recvmsg()
828 release_sock(sk); in sco_sock_recvmsg()
836 struct sock *sk = sock->sk; in sco_sock_setsockopt() local
844 BT_DBG("sk %p", sk); in sco_sock_setsockopt()
846 lock_sock(sk); in sco_sock_setsockopt()
851 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_setsockopt()
861 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
863 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
867 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in sco_sock_setsockopt()
868 sk->sk_state != BT_CONNECT2) { in sco_sock_setsockopt()
873 voice.setting = sco_pi(sk)->setting; in sco_sock_setsockopt()
887 sco_pi(sk)->setting = voice.setting; in sco_sock_setsockopt()
888 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, in sco_sock_setsockopt()
896 sco_pi(sk)->codec.id = BT_CODEC_TRANSPARENT; in sco_sock_setsockopt()
906 set_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); in sco_sock_setsockopt()
908 clear_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); in sco_sock_setsockopt()
912 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in sco_sock_setsockopt()
913 sk->sk_state != BT_CONNECT2) { in sco_sock_setsockopt()
918 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, in sco_sock_setsockopt()
958 sco_pi(sk)->codec = codecs->codecs[0]; in sco_sock_setsockopt()
967 release_sock(sk); in sco_sock_setsockopt()
974 struct sock *sk = sock->sk; in sco_sock_getsockopt_old() local
980 BT_DBG("sk %p", sk); in sco_sock_getsockopt_old()
985 lock_sock(sk); in sco_sock_getsockopt_old()
989 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
990 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
991 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
996 opts.mtu = sco_pi(sk)->conn->mtu; in sco_sock_getsockopt_old()
1007 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
1008 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
1009 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
1015 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle; in sco_sock_getsockopt_old()
1016 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3); in sco_sock_getsockopt_old()
1029 release_sock(sk); in sco_sock_getsockopt_old()
1036 struct sock *sk = sock->sk; in sco_sock_getsockopt() local
1047 BT_DBG("sk %p", sk); in sco_sock_getsockopt()
1055 lock_sock(sk); in sco_sock_getsockopt()
1060 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_getsockopt()
1065 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), in sco_sock_getsockopt()
1072 voice.setting = sco_pi(sk)->setting; in sco_sock_getsockopt()
1081 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1086 phys = hci_conn_get_phy(sco_pi(sk)->conn->hcon); in sco_sock_getsockopt()
1093 if (put_user(test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags), in sco_sock_getsockopt()
1100 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1105 if (put_user(sco_pi(sk)->conn->mtu, (u32 __user *)optval)) in sco_sock_getsockopt()
1113 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR); in sco_sock_getsockopt()
1131 release_sock(sk); in sco_sock_getsockopt()
1199 lock_sock(sk); in sco_sock_getsockopt()
1211 release_sock(sk); in sco_sock_getsockopt()
1217 struct sock *sk = sock->sk; in sco_sock_shutdown() local
1220 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_shutdown()
1222 if (!sk) in sco_sock_shutdown()
1225 sock_hold(sk); in sco_sock_shutdown()
1226 lock_sock(sk); in sco_sock_shutdown()
1228 if (!sk->sk_shutdown) { in sco_sock_shutdown()
1229 sk->sk_shutdown = SHUTDOWN_MASK; in sco_sock_shutdown()
1230 sco_sock_clear_timer(sk); in sco_sock_shutdown()
1231 __sco_sock_close(sk); in sco_sock_shutdown()
1233 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in sco_sock_shutdown()
1235 err = bt_sock_wait_state(sk, BT_CLOSED, in sco_sock_shutdown()
1236 sk->sk_lingertime); in sco_sock_shutdown()
1239 release_sock(sk); in sco_sock_shutdown()
1240 sock_put(sk); in sco_sock_shutdown()
1247 struct sock *sk = sock->sk; in sco_sock_release() local
1250 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_release()
1252 if (!sk) in sco_sock_release()
1255 sco_sock_close(sk); in sco_sock_release()
1257 if (sock_flag(sk, SOCK_LINGER) && READ_ONCE(sk->sk_lingertime) && in sco_sock_release()
1259 lock_sock(sk); in sco_sock_release()
1260 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime); in sco_sock_release()
1261 release_sock(sk); in sco_sock_release()
1264 sock_orphan(sk); in sco_sock_release()
1265 sco_sock_kill(sk); in sco_sock_release()
1272 struct sock *sk = conn->sk; in sco_conn_ready() local
1276 if (sk) { in sco_conn_ready()
1277 lock_sock(sk); in sco_conn_ready()
1278 sco_sock_clear_timer(sk); in sco_conn_ready()
1279 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1280 sk->sk_state_change(sk); in sco_conn_ready()
1281 release_sock(sk); in sco_conn_ready()
1298 sk = sco_sock_alloc(sock_net(parent), NULL, in sco_conn_ready()
1300 if (!sk) { in sco_conn_ready()
1306 sco_sock_init(sk, parent); in sco_conn_ready()
1308 bacpy(&sco_pi(sk)->src, &conn->hcon->src); in sco_conn_ready()
1309 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst); in sco_conn_ready()
1312 __sco_chan_add(conn, sk, parent); in sco_conn_ready()
1315 sk->sk_state = BT_CONNECT2; in sco_conn_ready()
1317 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1331 struct sock *sk; in sco_connect_ind() local
1338 sk_for_each(sk, &sco_sk_list.head) { in sco_connect_ind()
1339 if (sk->sk_state != BT_LISTEN) in sco_connect_ind()
1342 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) || in sco_connect_ind()
1343 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) { in sco_connect_ind()
1346 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) in sco_connect_ind()
1409 struct sock *sk; in sco_debugfs_show() local
1413 sk_for_each(sk, &sco_sk_list.head) { in sco_debugfs_show()
1414 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src, in sco_debugfs_show()
1415 &sco_pi(sk)->dst, sk->sk_state); in sco_debugfs_show()