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()
156 static void sco_chan_del(struct sock *sk, int err) in sco_chan_del() argument
160 conn = sco_pi(sk)->conn; in sco_chan_del()
162 BT_DBG("sk %p, conn %p, err %d", sk, conn, err); in sco_chan_del()
166 conn->sk = NULL; in sco_chan_del()
167 sco_pi(sk)->conn = NULL; in sco_chan_del()
174 sk->sk_state = BT_CLOSED; in sco_chan_del()
175 sk->sk_err = err; in sco_chan_del()
176 sk->sk_state_change(sk); in sco_chan_del()
178 sock_set_flag(sk, SOCK_ZAPPED); in sco_chan_del()
184 struct sock *sk; in sco_conn_del() local
193 sk = conn->sk; in sco_conn_del()
194 if (sk) in sco_conn_del()
195 sock_hold(sk); in sco_conn_del()
198 if (sk) { in sco_conn_del()
199 lock_sock(sk); in sco_conn_del()
200 sco_sock_clear_timer(sk); in sco_conn_del()
201 sco_chan_del(sk, err); in sco_conn_del()
202 release_sock(sk); in sco_conn_del()
203 sock_put(sk); in sco_conn_del()
213 static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, in __sco_chan_add() argument
218 sco_pi(sk)->conn = conn; in __sco_chan_add()
219 conn->sk = sk; in __sco_chan_add()
222 bt_accept_enqueue(parent, sk, true); in __sco_chan_add()
225 static int sco_chan_add(struct sco_conn *conn, struct sock *sk, in sco_chan_add() argument
231 if (conn->sk) in sco_chan_add()
234 __sco_chan_add(conn, sk, parent); in sco_chan_add()
240 static int sco_connect(struct sock *sk) in sco_connect() argument
247 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst); in sco_connect()
249 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR); in sco_connect()
260 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT && in sco_connect()
266 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst, in sco_connect()
267 sco_pi(sk)->setting, &sco_pi(sk)->codec); in sco_connect()
280 lock_sock(sk); in sco_connect()
282 err = sco_chan_add(conn, sk, NULL); in sco_connect()
284 release_sock(sk); in sco_connect()
289 bacpy(&sco_pi(sk)->src, &hcon->src); in sco_connect()
292 sco_sock_clear_timer(sk); in sco_connect()
293 sk->sk_state = BT_CONNECTED; in sco_connect()
295 sk->sk_state = BT_CONNECT; in sco_connect()
296 sco_sock_set_timer(sk, sk->sk_sndtimeo); in sco_connect()
299 release_sock(sk); in sco_connect()
307 static int sco_send_frame(struct sock *sk, struct sk_buff *skb) in sco_send_frame() argument
309 struct sco_conn *conn = sco_pi(sk)->conn; in sco_send_frame()
316 BT_DBG("sk %p len %d", sk, len); in sco_send_frame()
325 struct sock *sk; in sco_recv_frame() local
328 sk = conn->sk; in sco_recv_frame()
331 if (!sk) in sco_recv_frame()
334 BT_DBG("sk %p len %u", sk, skb->len); in sco_recv_frame()
336 if (sk->sk_state != BT_CONNECTED) in sco_recv_frame()
339 if (!sock_queue_rcv_skb(sk, skb)) in sco_recv_frame()
349 struct sock *sk; in __sco_get_sock_listen_by_addr() local
351 sk_for_each(sk, &sco_sk_list.head) { in __sco_get_sock_listen_by_addr()
352 if (sk->sk_state != BT_LISTEN) in __sco_get_sock_listen_by_addr()
355 if (!bacmp(&sco_pi(sk)->src, ba)) in __sco_get_sock_listen_by_addr()
356 return sk; in __sco_get_sock_listen_by_addr()
367 struct sock *sk = NULL, *sk1 = NULL; in sco_get_sock_listen() local
371 sk_for_each(sk, &sco_sk_list.head) { in sco_get_sock_listen()
372 if (sk->sk_state != BT_LISTEN) in sco_get_sock_listen()
376 if (!bacmp(&sco_pi(sk)->src, src)) in sco_get_sock_listen()
380 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY)) in sco_get_sock_listen()
381 sk1 = sk; in sco_get_sock_listen()
386 return sk ? sk : sk1; in sco_get_sock_listen()
389 static void sco_sock_destruct(struct sock *sk) in sco_sock_destruct() argument
391 BT_DBG("sk %p", sk); in sco_sock_destruct()
393 skb_queue_purge(&sk->sk_receive_queue); in sco_sock_destruct()
394 skb_queue_purge(&sk->sk_write_queue); in sco_sock_destruct()
399 struct sock *sk; in sco_sock_cleanup_listen() local
404 while ((sk = bt_accept_dequeue(parent, NULL))) { in sco_sock_cleanup_listen()
405 sco_sock_close(sk); in sco_sock_cleanup_listen()
406 sco_sock_kill(sk); in sco_sock_cleanup_listen()
416 static void sco_sock_kill(struct sock *sk) in sco_sock_kill() argument
418 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket) in sco_sock_kill()
421 BT_DBG("sk %p state %d", sk, sk->sk_state); in sco_sock_kill()
424 bt_sock_unlink(&sco_sk_list, sk); in sco_sock_kill()
425 sock_set_flag(sk, SOCK_DEAD); in sco_sock_kill()
426 sock_put(sk); in sco_sock_kill()
429 static void __sco_sock_close(struct sock *sk) in __sco_sock_close() argument
431 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket); in __sco_sock_close()
433 switch (sk->sk_state) { in __sco_sock_close()
435 sco_sock_cleanup_listen(sk); in __sco_sock_close()
440 if (sco_pi(sk)->conn->hcon) { in __sco_sock_close()
441 sk->sk_state = BT_DISCONN; in __sco_sock_close()
442 sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT); in __sco_sock_close()
443 sco_conn_lock(sco_pi(sk)->conn); in __sco_sock_close()
444 hci_conn_drop(sco_pi(sk)->conn->hcon); in __sco_sock_close()
445 sco_pi(sk)->conn->hcon = NULL; in __sco_sock_close()
446 sco_conn_unlock(sco_pi(sk)->conn); in __sco_sock_close()
448 sco_chan_del(sk, ECONNRESET); in __sco_sock_close()
454 sco_chan_del(sk, ECONNRESET); in __sco_sock_close()
458 sock_set_flag(sk, SOCK_ZAPPED); in __sco_sock_close()
465 static void sco_sock_close(struct sock *sk) in sco_sock_close() argument
467 lock_sock(sk); in sco_sock_close()
468 sco_sock_clear_timer(sk); in sco_sock_close()
469 __sco_sock_close(sk); in sco_sock_close()
470 release_sock(sk); in sco_sock_close()
473 static void sco_sock_init(struct sock *sk, struct sock *parent) in sco_sock_init() argument
475 BT_DBG("sk %p", sk); in sco_sock_init()
478 sk->sk_type = parent->sk_type; in sco_sock_init()
479 bt_sk(sk)->flags = bt_sk(parent)->flags; in sco_sock_init()
480 security_sk_clone(parent, sk); in sco_sock_init()
493 struct sock *sk; in sco_sock_alloc() local
495 sk = bt_sock_alloc(net, sock, &sco_proto, proto, prio, kern); in sco_sock_alloc()
496 if (!sk) in sco_sock_alloc()
499 sk->sk_destruct = sco_sock_destruct; in sco_sock_alloc()
500 sk->sk_sndtimeo = SCO_CONN_TIMEOUT; in sco_sock_alloc()
502 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT; in sco_sock_alloc()
503 sco_pi(sk)->codec.id = BT_CODEC_CVSD; in sco_sock_alloc()
504 sco_pi(sk)->codec.cid = 0xffff; in sco_sock_alloc()
505 sco_pi(sk)->codec.vid = 0xffff; in sco_sock_alloc()
506 sco_pi(sk)->codec.data_path = 0x00; 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
574 BT_DBG("sk %p", sk); in sco_sock_connect()
580 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) in sco_sock_connect()
583 if (sk->sk_type != SOCK_SEQPACKET) in sco_sock_connect()
586 lock_sock(sk); in sco_sock_connect()
588 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr); in sco_sock_connect()
589 release_sock(sk); in sco_sock_connect()
591 err = sco_connect(sk); in sco_sock_connect()
595 lock_sock(sk); in sco_sock_connect()
597 err = bt_sock_wait_state(sk, BT_CONNECTED, in sco_sock_connect()
598 sock_sndtimeo(sk, flags & O_NONBLOCK)); in sco_sock_connect()
600 release_sock(sk); in sco_sock_connect()
606 struct sock *sk = sock->sk; in sco_sock_listen() local
607 bdaddr_t *src = &sco_pi(sk)->src; in sco_sock_listen()
610 BT_DBG("sk %p backlog %d", sk, backlog); in sco_sock_listen()
612 lock_sock(sk); in sco_sock_listen()
614 if (sk->sk_state != BT_BOUND) { in sco_sock_listen()
619 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_listen()
631 sk->sk_max_ack_backlog = backlog; in sco_sock_listen()
632 sk->sk_ack_backlog = 0; in sco_sock_listen()
634 sk->sk_state = BT_LISTEN; in sco_sock_listen()
640 release_sock(sk); in sco_sock_listen()
648 struct sock *sk = sock->sk, *ch; in sco_sock_accept() local
652 lock_sock(sk); in sco_sock_accept()
654 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); in sco_sock_accept()
656 BT_DBG("sk %p timeo %ld", sk, timeo); in sco_sock_accept()
659 add_wait_queue_exclusive(sk_sleep(sk), &wait); in sco_sock_accept()
661 if (sk->sk_state != BT_LISTEN) { in sco_sock_accept()
666 ch = bt_accept_dequeue(sk, newsock); in sco_sock_accept()
680 release_sock(sk); in sco_sock_accept()
683 lock_sock(sk); in sco_sock_accept()
685 remove_wait_queue(sk_sleep(sk), &wait); in sco_sock_accept()
695 release_sock(sk); in sco_sock_accept()
703 struct sock *sk = sock->sk; in sco_sock_getname() local
705 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_getname()
710 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst); in sco_sock_getname()
712 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src); in sco_sock_getname()
720 struct sock *sk = sock->sk; in sco_sock_sendmsg() local
724 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_sendmsg()
726 err = sock_error(sk); in sco_sock_sendmsg()
733 skb = bt_skb_sendmsg(sk, msg, len, len, 0, 0); in sco_sock_sendmsg()
737 lock_sock(sk); in sco_sock_sendmsg()
739 if (sk->sk_state == BT_CONNECTED) in sco_sock_sendmsg()
740 err = sco_send_frame(sk, skb); in sco_sock_sendmsg()
744 release_sock(sk); in sco_sock_sendmsg()
803 struct sock *sk = sock->sk; in sco_sock_recvmsg() local
804 struct sco_pinfo *pi = sco_pi(sk); in sco_sock_recvmsg()
806 lock_sock(sk); in sco_sock_recvmsg()
808 if (sk->sk_state == BT_CONNECT2 && in sco_sock_recvmsg()
809 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in sco_sock_recvmsg()
811 sk->sk_state = BT_CONFIG; in sco_sock_recvmsg()
813 release_sock(sk); in sco_sock_recvmsg()
817 release_sock(sk); in sco_sock_recvmsg()
825 struct sock *sk = sock->sk; in sco_sock_setsockopt() local
833 BT_DBG("sk %p", sk); in sco_sock_setsockopt()
835 lock_sock(sk); in sco_sock_setsockopt()
840 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_setsockopt()
851 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
853 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
857 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in sco_sock_setsockopt()
858 sk->sk_state != BT_CONNECT2) { in sco_sock_setsockopt()
863 voice.setting = sco_pi(sk)->setting; in sco_sock_setsockopt()
878 sco_pi(sk)->setting = voice.setting; in sco_sock_setsockopt()
879 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, in sco_sock_setsockopt()
887 sco_pi(sk)->codec.id = BT_CODEC_TRANSPARENT; in sco_sock_setsockopt()
898 set_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); in sco_sock_setsockopt()
900 clear_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); in sco_sock_setsockopt()
904 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in sco_sock_setsockopt()
905 sk->sk_state != BT_CONNECT2) { in sco_sock_setsockopt()
910 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, in sco_sock_setsockopt()
950 sco_pi(sk)->codec = codecs->codecs[0]; in sco_sock_setsockopt()
959 release_sock(sk); in sco_sock_setsockopt()
966 struct sock *sk = sock->sk; in sco_sock_getsockopt_old() local
971 BT_DBG("sk %p", sk); in sco_sock_getsockopt_old()
976 lock_sock(sk); in sco_sock_getsockopt_old()
980 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
981 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
982 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
987 opts.mtu = sco_pi(sk)->conn->mtu; in sco_sock_getsockopt_old()
998 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
999 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
1000 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
1006 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle; in sco_sock_getsockopt_old()
1007 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3); in sco_sock_getsockopt_old()
1020 release_sock(sk); in sco_sock_getsockopt_old()
1027 struct sock *sk = sock->sk; in sco_sock_getsockopt() local
1038 BT_DBG("sk %p", sk); in sco_sock_getsockopt()
1046 lock_sock(sk); in sco_sock_getsockopt()
1051 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_getsockopt()
1056 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), in sco_sock_getsockopt()
1063 voice.setting = sco_pi(sk)->setting; in sco_sock_getsockopt()
1072 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1077 phys = hci_conn_get_phy(sco_pi(sk)->conn->hcon); in sco_sock_getsockopt()
1084 if (put_user(test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags), in sco_sock_getsockopt()
1091 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1096 if (put_user(sco_pi(sk)->conn->mtu, (u32 __user *)optval)) in sco_sock_getsockopt()
1104 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR); in sco_sock_getsockopt()
1122 release_sock(sk); in sco_sock_getsockopt()
1190 lock_sock(sk); in sco_sock_getsockopt()
1202 release_sock(sk); in sco_sock_getsockopt()
1208 struct sock *sk = sock->sk; in sco_sock_shutdown() local
1211 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_shutdown()
1213 if (!sk) in sco_sock_shutdown()
1216 sock_hold(sk); in sco_sock_shutdown()
1217 lock_sock(sk); in sco_sock_shutdown()
1219 if (!sk->sk_shutdown) { in sco_sock_shutdown()
1220 sk->sk_shutdown = SHUTDOWN_MASK; in sco_sock_shutdown()
1221 sco_sock_clear_timer(sk); in sco_sock_shutdown()
1222 __sco_sock_close(sk); in sco_sock_shutdown()
1224 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in sco_sock_shutdown()
1226 err = bt_sock_wait_state(sk, BT_CLOSED, in sco_sock_shutdown()
1227 sk->sk_lingertime); in sco_sock_shutdown()
1230 release_sock(sk); in sco_sock_shutdown()
1231 sock_put(sk); in sco_sock_shutdown()
1238 struct sock *sk = sock->sk; in sco_sock_release() local
1241 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_release()
1243 if (!sk) in sco_sock_release()
1246 sco_sock_close(sk); in sco_sock_release()
1248 if (sock_flag(sk, SOCK_LINGER) && READ_ONCE(sk->sk_lingertime) && in sco_sock_release()
1250 lock_sock(sk); in sco_sock_release()
1251 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime); in sco_sock_release()
1252 release_sock(sk); in sco_sock_release()
1255 sock_orphan(sk); in sco_sock_release()
1256 sco_sock_kill(sk); in sco_sock_release()
1263 struct sock *sk = conn->sk; in sco_conn_ready() local
1267 if (sk) { in sco_conn_ready()
1268 lock_sock(sk); in sco_conn_ready()
1269 sco_sock_clear_timer(sk); in sco_conn_ready()
1270 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1271 sk->sk_state_change(sk); in sco_conn_ready()
1272 release_sock(sk); in sco_conn_ready()
1289 sk = sco_sock_alloc(sock_net(parent), NULL, in sco_conn_ready()
1291 if (!sk) { in sco_conn_ready()
1297 sco_sock_init(sk, parent); in sco_conn_ready()
1299 bacpy(&sco_pi(sk)->src, &conn->hcon->src); in sco_conn_ready()
1300 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst); in sco_conn_ready()
1303 __sco_chan_add(conn, sk, parent); in sco_conn_ready()
1306 sk->sk_state = BT_CONNECT2; in sco_conn_ready()
1308 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1322 struct sock *sk; in sco_connect_ind() local
1329 sk_for_each(sk, &sco_sk_list.head) { in sco_connect_ind()
1330 if (sk->sk_state != BT_LISTEN) in sco_connect_ind()
1333 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) || in sco_connect_ind()
1334 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) { in sco_connect_ind()
1337 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) in sco_connect_ind()
1400 struct sock *sk; in sco_debugfs_show() local
1404 sk_for_each(sk, &sco_sk_list.head) { in sco_debugfs_show()
1405 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src, in sco_debugfs_show()
1406 &sco_pi(sk)->dst, sk->sk_state); in sco_debugfs_show()