Lines Matching refs:sk
49 struct sock *sk; member
60 static void sco_sock_close(struct sock *sk);
61 static void sco_sock_kill(struct sock *sk);
64 #define sco_pi(sk) ((struct sco_pinfo *) sk) argument
86 if (conn->sk) in sco_conn_free()
87 sco_pi(conn->sk)->conn = NULL; in sco_conn_free()
133 if (!conn || !bt_sock_linked(&sco_sk_list, conn->sk)) in sco_sock_hold()
136 sock_hold(conn->sk); in sco_sock_hold()
138 return conn->sk; in sco_sock_hold()
145 struct sock *sk; in sco_sock_timeout() local
157 sk = sco_sock_hold(conn); in sco_sock_timeout()
161 if (!sk) in sco_sock_timeout()
164 BT_DBG("sock %p state %d", sk, sk->sk_state); in sco_sock_timeout()
166 lock_sock(sk); in sco_sock_timeout()
167 sk->sk_err = ETIMEDOUT; in sco_sock_timeout()
168 sk->sk_state_change(sk); in sco_sock_timeout()
169 release_sock(sk); in sco_sock_timeout()
170 sock_put(sk); in sco_sock_timeout()
173 static void sco_sock_set_timer(struct sock *sk, long timeout) in sco_sock_set_timer() argument
175 if (!sco_pi(sk)->conn) in sco_sock_set_timer()
178 BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout); in sco_sock_set_timer()
179 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work); in sco_sock_set_timer()
180 schedule_delayed_work(&sco_pi(sk)->conn->timeout_work, timeout); in sco_sock_set_timer()
183 static void sco_sock_clear_timer(struct sock *sk) in sco_sock_clear_timer() argument
185 if (!sco_pi(sk)->conn) in sco_sock_clear_timer()
188 BT_DBG("sock %p state %d", sk, sk->sk_state); in sco_sock_clear_timer()
189 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work); in sco_sock_clear_timer()
231 static void sco_chan_del(struct sock *sk, int err) in sco_chan_del() argument
235 conn = sco_pi(sk)->conn; in sco_chan_del()
236 sco_pi(sk)->conn = NULL; in sco_chan_del()
238 BT_DBG("sk %p, conn %p, err %d", sk, conn, err); in sco_chan_del()
242 conn->sk = NULL; in sco_chan_del()
247 sk->sk_state = BT_CLOSED; in sco_chan_del()
248 sk->sk_err = err; in sco_chan_del()
249 sk->sk_state_change(sk); in sco_chan_del()
251 sock_set_flag(sk, SOCK_ZAPPED); in sco_chan_del()
257 struct sock *sk; in sco_conn_del() local
266 sk = sco_sock_hold(conn); in sco_conn_del()
270 if (!sk) { in sco_conn_del()
276 lock_sock(sk); in sco_conn_del()
277 sco_sock_clear_timer(sk); in sco_conn_del()
278 sco_chan_del(sk, err); in sco_conn_del()
279 release_sock(sk); in sco_conn_del()
280 sock_put(sk); in sco_conn_del()
283 static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, in __sco_chan_add() argument
288 sco_pi(sk)->conn = conn; in __sco_chan_add()
289 conn->sk = sk; in __sco_chan_add()
292 bt_accept_enqueue(parent, sk, true); in __sco_chan_add()
295 static int sco_chan_add(struct sco_conn *conn, struct sock *sk, in sco_chan_add() argument
301 if (conn->sk) in sco_chan_add()
304 __sco_chan_add(conn, sk, parent); in sco_chan_add()
310 static int sco_connect(struct sock *sk) in sco_connect() argument
317 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst); in sco_connect()
319 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR); in sco_connect()
330 switch (sco_pi(sk)->setting & SCO_AIRMODE_MASK) { in sco_connect()
339 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst, in sco_connect()
340 sco_pi(sk)->setting, &sco_pi(sk)->codec, in sco_connect()
341 sk->sk_sndtimeo); in sco_connect()
354 lock_sock(sk); in sco_connect()
356 err = sco_chan_add(conn, sk, NULL); in sco_connect()
358 release_sock(sk); in sco_connect()
363 bacpy(&sco_pi(sk)->src, &hcon->src); in sco_connect()
366 sco_sock_clear_timer(sk); in sco_connect()
367 sk->sk_state = BT_CONNECTED; in sco_connect()
369 sk->sk_state = BT_CONNECT; in sco_connect()
370 sco_sock_set_timer(sk, sk->sk_sndtimeo); in sco_connect()
373 release_sock(sk); in sco_connect()
381 static int sco_send_frame(struct sock *sk, struct sk_buff *skb) in sco_send_frame() argument
383 struct sco_conn *conn = sco_pi(sk)->conn; in sco_send_frame()
390 BT_DBG("sk %p len %d", sk, len); in sco_send_frame()
399 struct sock *sk; in sco_recv_frame() local
402 sk = conn->sk; in sco_recv_frame()
405 if (!sk) in sco_recv_frame()
408 BT_DBG("sk %p len %u", sk, skb->len); in sco_recv_frame()
410 if (sk->sk_state != BT_CONNECTED) in sco_recv_frame()
413 if (!sock_queue_rcv_skb(sk, skb)) in sco_recv_frame()
423 struct sock *sk; in __sco_get_sock_listen_by_addr() local
425 sk_for_each(sk, &sco_sk_list.head) { in __sco_get_sock_listen_by_addr()
426 if (sk->sk_state != BT_LISTEN) in __sco_get_sock_listen_by_addr()
429 if (!bacmp(&sco_pi(sk)->src, ba)) in __sco_get_sock_listen_by_addr()
430 return sk; in __sco_get_sock_listen_by_addr()
441 struct sock *sk = NULL, *sk1 = NULL; in sco_get_sock_listen() local
445 sk_for_each(sk, &sco_sk_list.head) { in sco_get_sock_listen()
446 if (sk->sk_state != BT_LISTEN) in sco_get_sock_listen()
450 if (!bacmp(&sco_pi(sk)->src, src)) in sco_get_sock_listen()
454 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY)) in sco_get_sock_listen()
455 sk1 = sk; in sco_get_sock_listen()
460 return sk ? sk : sk1; in sco_get_sock_listen()
463 static void sco_sock_destruct(struct sock *sk) in sco_sock_destruct() argument
465 BT_DBG("sk %p", sk); in sco_sock_destruct()
467 sco_conn_put(sco_pi(sk)->conn); in sco_sock_destruct()
469 skb_queue_purge(&sk->sk_receive_queue); in sco_sock_destruct()
470 skb_queue_purge(&sk->sk_write_queue); in sco_sock_destruct()
475 struct sock *sk; in sco_sock_cleanup_listen() local
480 while ((sk = bt_accept_dequeue(parent, NULL))) { in sco_sock_cleanup_listen()
481 sco_sock_close(sk); in sco_sock_cleanup_listen()
482 sco_sock_kill(sk); in sco_sock_cleanup_listen()
492 static void sco_sock_kill(struct sock *sk) in sco_sock_kill() argument
494 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket) in sco_sock_kill()
497 BT_DBG("sk %p state %d", sk, sk->sk_state); in sco_sock_kill()
500 bt_sock_unlink(&sco_sk_list, sk); in sco_sock_kill()
501 sock_set_flag(sk, SOCK_DEAD); in sco_sock_kill()
502 sock_put(sk); in sco_sock_kill()
505 static void __sco_sock_close(struct sock *sk) in __sco_sock_close() argument
507 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket); in __sco_sock_close()
509 switch (sk->sk_state) { in __sco_sock_close()
511 sco_sock_cleanup_listen(sk); in __sco_sock_close()
519 sco_chan_del(sk, ECONNRESET); in __sco_sock_close()
523 sock_set_flag(sk, SOCK_ZAPPED); in __sco_sock_close()
530 static void sco_sock_close(struct sock *sk) in sco_sock_close() argument
532 lock_sock(sk); in sco_sock_close()
533 sco_sock_clear_timer(sk); in sco_sock_close()
534 __sco_sock_close(sk); in sco_sock_close()
535 release_sock(sk); in sco_sock_close()
538 static void sco_sock_init(struct sock *sk, struct sock *parent) in sco_sock_init() argument
540 BT_DBG("sk %p", sk); in sco_sock_init()
543 sk->sk_type = parent->sk_type; in sco_sock_init()
544 bt_sk(sk)->flags = bt_sk(parent)->flags; in sco_sock_init()
545 security_sk_clone(parent, sk); in sco_sock_init()
558 struct sock *sk; in sco_sock_alloc() local
560 sk = bt_sock_alloc(net, sock, &sco_proto, proto, prio, kern); in sco_sock_alloc()
561 if (!sk) in sco_sock_alloc()
564 sk->sk_destruct = sco_sock_destruct; in sco_sock_alloc()
565 sk->sk_sndtimeo = SCO_CONN_TIMEOUT; in sco_sock_alloc()
567 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT; in sco_sock_alloc()
568 sco_pi(sk)->codec.id = BT_CODEC_CVSD; in sco_sock_alloc()
569 sco_pi(sk)->codec.cid = 0xffff; in sco_sock_alloc()
570 sco_pi(sk)->codec.vid = 0xffff; in sco_sock_alloc()
571 sco_pi(sk)->codec.data_path = 0x00; in sco_sock_alloc()
573 bt_sock_link(&sco_sk_list, sk); in sco_sock_alloc()
574 return sk; in sco_sock_alloc()
580 struct sock *sk; in sco_sock_create() local
591 sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern); in sco_sock_create()
592 if (!sk) in sco_sock_create()
595 sco_sock_init(sk, NULL); in sco_sock_create()
603 struct sock *sk = sock->sk; in sco_sock_bind() local
610 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr); in sco_sock_bind()
612 lock_sock(sk); in sco_sock_bind()
614 if (sk->sk_state != BT_OPEN) { in sco_sock_bind()
619 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_bind()
624 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr); in sco_sock_bind()
626 sk->sk_state = BT_BOUND; in sco_sock_bind()
629 release_sock(sk); in sco_sock_bind()
636 struct sock *sk = sock->sk; in sco_sock_connect() local
639 BT_DBG("sk %p", sk); in sco_sock_connect()
645 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) in sco_sock_connect()
648 if (sk->sk_type != SOCK_SEQPACKET) in sco_sock_connect()
651 lock_sock(sk); in sco_sock_connect()
653 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr); in sco_sock_connect()
654 release_sock(sk); in sco_sock_connect()
656 err = sco_connect(sk); in sco_sock_connect()
660 lock_sock(sk); in sco_sock_connect()
662 err = bt_sock_wait_state(sk, BT_CONNECTED, in sco_sock_connect()
663 sock_sndtimeo(sk, flags & O_NONBLOCK)); in sco_sock_connect()
665 release_sock(sk); in sco_sock_connect()
671 struct sock *sk = sock->sk; in sco_sock_listen() local
672 bdaddr_t *src = &sco_pi(sk)->src; in sco_sock_listen()
675 BT_DBG("sk %p backlog %d", sk, backlog); in sco_sock_listen()
677 lock_sock(sk); in sco_sock_listen()
679 if (sk->sk_state != BT_BOUND) { in sco_sock_listen()
684 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_listen()
696 sk->sk_max_ack_backlog = backlog; in sco_sock_listen()
697 sk->sk_ack_backlog = 0; in sco_sock_listen()
699 sk->sk_state = BT_LISTEN; in sco_sock_listen()
705 release_sock(sk); in sco_sock_listen()
713 struct sock *sk = sock->sk, *ch; in sco_sock_accept() local
717 lock_sock(sk); in sco_sock_accept()
719 timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK); in sco_sock_accept()
721 BT_DBG("sk %p timeo %ld", sk, timeo); in sco_sock_accept()
724 add_wait_queue_exclusive(sk_sleep(sk), &wait); in sco_sock_accept()
726 if (sk->sk_state != BT_LISTEN) { in sco_sock_accept()
731 ch = bt_accept_dequeue(sk, newsock); in sco_sock_accept()
745 release_sock(sk); in sco_sock_accept()
748 lock_sock(sk); in sco_sock_accept()
750 remove_wait_queue(sk_sleep(sk), &wait); in sco_sock_accept()
760 release_sock(sk); in sco_sock_accept()
768 struct sock *sk = sock->sk; in sco_sock_getname() local
770 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_getname()
775 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst); in sco_sock_getname()
777 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src); in sco_sock_getname()
785 struct sock *sk = sock->sk; in sco_sock_sendmsg() local
789 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_sendmsg()
791 err = sock_error(sk); in sco_sock_sendmsg()
798 skb = bt_skb_sendmsg(sk, msg, len, len, 0, 0); in sco_sock_sendmsg()
802 lock_sock(sk); in sco_sock_sendmsg()
804 if (sk->sk_state == BT_CONNECTED) in sco_sock_sendmsg()
805 err = sco_send_frame(sk, skb); in sco_sock_sendmsg()
809 release_sock(sk); in sco_sock_sendmsg()
868 struct sock *sk = sock->sk; in sco_sock_recvmsg() local
869 struct sco_pinfo *pi = sco_pi(sk); in sco_sock_recvmsg()
871 lock_sock(sk); in sco_sock_recvmsg()
873 if (sk->sk_state == BT_CONNECT2 && in sco_sock_recvmsg()
874 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in sco_sock_recvmsg()
876 sk->sk_state = BT_CONFIG; in sco_sock_recvmsg()
878 release_sock(sk); in sco_sock_recvmsg()
882 release_sock(sk); in sco_sock_recvmsg()
890 struct sock *sk = sock->sk; in sco_sock_setsockopt() local
898 BT_DBG("sk %p", sk); in sco_sock_setsockopt()
900 lock_sock(sk); in sco_sock_setsockopt()
905 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_setsockopt()
915 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
917 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
921 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in sco_sock_setsockopt()
922 sk->sk_state != BT_CONNECT2) { in sco_sock_setsockopt()
927 voice.setting = sco_pi(sk)->setting; in sco_sock_setsockopt()
934 sco_pi(sk)->setting = voice.setting; in sco_sock_setsockopt()
935 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, in sco_sock_setsockopt()
942 switch (sco_pi(sk)->setting & SCO_AIRMODE_MASK) { in sco_sock_setsockopt()
945 sco_pi(sk)->codec.id = BT_CODEC_TRANSPARENT; in sco_sock_setsockopt()
958 set_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); in sco_sock_setsockopt()
960 clear_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); in sco_sock_setsockopt()
964 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in sco_sock_setsockopt()
965 sk->sk_state != BT_CONNECT2) { in sco_sock_setsockopt()
970 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, in sco_sock_setsockopt()
1011 sco_pi(sk)->codec = codecs->codecs[0]; in sco_sock_setsockopt()
1020 release_sock(sk); in sco_sock_setsockopt()
1027 struct sock *sk = sock->sk; in sco_sock_getsockopt_old() local
1033 BT_DBG("sk %p", sk); in sco_sock_getsockopt_old()
1038 lock_sock(sk); in sco_sock_getsockopt_old()
1042 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
1043 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
1044 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
1049 opts.mtu = sco_pi(sk)->conn->mtu; in sco_sock_getsockopt_old()
1060 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
1061 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
1062 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
1068 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle; in sco_sock_getsockopt_old()
1069 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3); in sco_sock_getsockopt_old()
1082 release_sock(sk); in sco_sock_getsockopt_old()
1089 struct sock *sk = sock->sk; in sco_sock_getsockopt() local
1100 BT_DBG("sk %p", sk); in sco_sock_getsockopt()
1108 lock_sock(sk); in sco_sock_getsockopt()
1113 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_getsockopt()
1118 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), in sco_sock_getsockopt()
1125 voice.setting = sco_pi(sk)->setting; in sco_sock_getsockopt()
1134 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1139 phys = hci_conn_get_phy(sco_pi(sk)->conn->hcon); in sco_sock_getsockopt()
1146 if (put_user(test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags), in sco_sock_getsockopt()
1153 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1158 if (put_user(sco_pi(sk)->conn->mtu, (u32 __user *)optval)) in sco_sock_getsockopt()
1166 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR); in sco_sock_getsockopt()
1184 release_sock(sk); in sco_sock_getsockopt()
1252 lock_sock(sk); in sco_sock_getsockopt()
1264 release_sock(sk); in sco_sock_getsockopt()
1270 struct sock *sk = sock->sk; in sco_sock_shutdown() local
1273 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_shutdown()
1275 if (!sk) in sco_sock_shutdown()
1278 sock_hold(sk); in sco_sock_shutdown()
1279 lock_sock(sk); in sco_sock_shutdown()
1281 if (!sk->sk_shutdown) { in sco_sock_shutdown()
1282 sk->sk_shutdown = SHUTDOWN_MASK; in sco_sock_shutdown()
1283 sco_sock_clear_timer(sk); in sco_sock_shutdown()
1284 __sco_sock_close(sk); in sco_sock_shutdown()
1286 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in sco_sock_shutdown()
1288 err = bt_sock_wait_state(sk, BT_CLOSED, in sco_sock_shutdown()
1289 sk->sk_lingertime); in sco_sock_shutdown()
1292 release_sock(sk); in sco_sock_shutdown()
1293 sock_put(sk); in sco_sock_shutdown()
1300 struct sock *sk = sock->sk; in sco_sock_release() local
1303 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_release()
1305 if (!sk) in sco_sock_release()
1308 sco_sock_close(sk); in sco_sock_release()
1310 if (sock_flag(sk, SOCK_LINGER) && READ_ONCE(sk->sk_lingertime) && in sco_sock_release()
1312 lock_sock(sk); in sco_sock_release()
1313 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime); in sco_sock_release()
1314 release_sock(sk); in sco_sock_release()
1317 sock_orphan(sk); in sco_sock_release()
1318 sco_sock_kill(sk); in sco_sock_release()
1325 struct sock *sk = conn->sk; in sco_conn_ready() local
1329 if (sk) { in sco_conn_ready()
1330 lock_sock(sk); in sco_conn_ready()
1331 sco_sock_clear_timer(sk); in sco_conn_ready()
1332 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1333 sk->sk_state_change(sk); in sco_conn_ready()
1334 release_sock(sk); in sco_conn_ready()
1351 sk = sco_sock_alloc(sock_net(parent), NULL, in sco_conn_ready()
1353 if (!sk) { in sco_conn_ready()
1359 sco_sock_init(sk, parent); in sco_conn_ready()
1361 bacpy(&sco_pi(sk)->src, &conn->hcon->src); in sco_conn_ready()
1362 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst); in sco_conn_ready()
1366 __sco_chan_add(conn, sk, parent); in sco_conn_ready()
1369 sk->sk_state = BT_CONNECT2; in sco_conn_ready()
1371 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1385 struct sock *sk; in sco_connect_ind() local
1392 sk_for_each(sk, &sco_sk_list.head) { in sco_connect_ind()
1393 if (sk->sk_state != BT_LISTEN) in sco_connect_ind()
1396 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) || in sco_connect_ind()
1397 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) { in sco_connect_ind()
1400 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) in sco_connect_ind()
1465 struct sock *sk; in sco_debugfs_show() local
1469 sk_for_each(sk, &sco_sk_list.head) { in sco_debugfs_show()
1470 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src, in sco_debugfs_show()
1471 &sco_pi(sk)->dst, sk->sk_state); in sco_debugfs_show()