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
84 struct sock *sk; in sco_sock_timeout() local
87 sk = conn->sk; in sco_sock_timeout()
88 if (sk) in sco_sock_timeout()
89 sock_hold(sk); in sco_sock_timeout()
92 if (!sk) in sco_sock_timeout()
95 BT_DBG("sock %p state %d", sk, sk->sk_state); in sco_sock_timeout()
97 lock_sock(sk); in sco_sock_timeout()
98 sk->sk_err = ETIMEDOUT; in sco_sock_timeout()
99 sk->sk_state_change(sk); in sco_sock_timeout()
100 release_sock(sk); in sco_sock_timeout()
101 sock_put(sk); in sco_sock_timeout()
104 static void sco_sock_set_timer(struct sock *sk, long timeout) in sco_sock_set_timer() argument
106 if (!sco_pi(sk)->conn) in sco_sock_set_timer()
109 BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout); in sco_sock_set_timer()
110 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work); in sco_sock_set_timer()
111 schedule_delayed_work(&sco_pi(sk)->conn->timeout_work, timeout); in sco_sock_set_timer()
114 static void sco_sock_clear_timer(struct sock *sk) in sco_sock_clear_timer() argument
116 if (!sco_pi(sk)->conn) in sco_sock_clear_timer()
119 BT_DBG("sock %p state %d", sk, sk->sk_state); in sco_sock_clear_timer()
120 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work); in sco_sock_clear_timer()
154 static void sco_chan_del(struct sock *sk, int err) in sco_chan_del() argument
158 conn = sco_pi(sk)->conn; in sco_chan_del()
160 BT_DBG("sk %p, conn %p, err %d", sk, conn, err); in sco_chan_del()
164 conn->sk = NULL; in sco_chan_del()
165 sco_pi(sk)->conn = NULL; in sco_chan_del()
172 sk->sk_state = BT_CLOSED; in sco_chan_del()
173 sk->sk_err = err; in sco_chan_del()
174 sk->sk_state_change(sk); in sco_chan_del()
176 sock_set_flag(sk, SOCK_ZAPPED); in sco_chan_del()
182 struct sock *sk; in sco_conn_del() local
191 sk = conn->sk; in sco_conn_del()
192 if (sk) in sco_conn_del()
193 sock_hold(sk); in sco_conn_del()
196 if (sk) { in sco_conn_del()
197 lock_sock(sk); in sco_conn_del()
198 sco_sock_clear_timer(sk); in sco_conn_del()
199 sco_chan_del(sk, err); in sco_conn_del()
200 release_sock(sk); in sco_conn_del()
201 sock_put(sk); in sco_conn_del()
211 static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, in __sco_chan_add() argument
216 sco_pi(sk)->conn = conn; in __sco_chan_add()
217 conn->sk = sk; in __sco_chan_add()
220 bt_accept_enqueue(parent, sk, true); in __sco_chan_add()
223 static int sco_chan_add(struct sco_conn *conn, struct sock *sk, in sco_chan_add() argument
229 if (conn->sk) in sco_chan_add()
232 __sco_chan_add(conn, sk, parent); in sco_chan_add()
238 static int sco_connect(struct hci_dev *hdev, struct sock *sk) in sco_connect() argument
244 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst); in sco_connect()
251 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT && in sco_connect()
255 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst, in sco_connect()
256 sco_pi(sk)->setting, &sco_pi(sk)->codec); in sco_connect()
267 bacpy(&sco_pi(sk)->src, &hcon->src); in sco_connect()
269 err = sco_chan_add(conn, sk, NULL); in sco_connect()
274 sco_sock_clear_timer(sk); in sco_connect()
275 sk->sk_state = BT_CONNECTED; in sco_connect()
277 sk->sk_state = BT_CONNECT; in sco_connect()
278 sco_sock_set_timer(sk, sk->sk_sndtimeo); in sco_connect()
284 static int sco_send_frame(struct sock *sk, struct sk_buff *skb) in sco_send_frame() argument
286 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()
302 struct sock *sk; in sco_recv_frame() local
305 sk = conn->sk; in sco_recv_frame()
308 if (!sk) in sco_recv_frame()
311 BT_DBG("sk %p len %u", sk, skb->len); in sco_recv_frame()
313 if (sk->sk_state != BT_CONNECTED) in sco_recv_frame()
316 if (!sock_queue_rcv_skb(sk, skb)) in sco_recv_frame()
326 struct sock *sk; in __sco_get_sock_listen_by_addr() local
328 sk_for_each(sk, &sco_sk_list.head) { in __sco_get_sock_listen_by_addr()
329 if (sk->sk_state != BT_LISTEN) in __sco_get_sock_listen_by_addr()
332 if (!bacmp(&sco_pi(sk)->src, ba)) in __sco_get_sock_listen_by_addr()
333 return sk; in __sco_get_sock_listen_by_addr()
344 struct sock *sk = NULL, *sk1 = NULL; in sco_get_sock_listen() local
348 sk_for_each(sk, &sco_sk_list.head) { in sco_get_sock_listen()
349 if (sk->sk_state != BT_LISTEN) in sco_get_sock_listen()
353 if (!bacmp(&sco_pi(sk)->src, src)) in sco_get_sock_listen()
357 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY)) in sco_get_sock_listen()
358 sk1 = sk; in sco_get_sock_listen()
363 return sk ? sk : sk1; in sco_get_sock_listen()
366 static void sco_sock_destruct(struct sock *sk) in sco_sock_destruct() argument
368 BT_DBG("sk %p", sk); in sco_sock_destruct()
370 skb_queue_purge(&sk->sk_receive_queue); in sco_sock_destruct()
371 skb_queue_purge(&sk->sk_write_queue); in sco_sock_destruct()
376 struct sock *sk; in sco_sock_cleanup_listen() local
381 while ((sk = bt_accept_dequeue(parent, NULL))) { in sco_sock_cleanup_listen()
382 sco_sock_close(sk); in sco_sock_cleanup_listen()
383 sco_sock_kill(sk); in sco_sock_cleanup_listen()
393 static void sco_sock_kill(struct sock *sk) in sco_sock_kill() argument
395 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket) in sco_sock_kill()
398 BT_DBG("sk %p state %d", sk, sk->sk_state); in sco_sock_kill()
401 bt_sock_unlink(&sco_sk_list, sk); in sco_sock_kill()
402 sock_set_flag(sk, SOCK_DEAD); in sco_sock_kill()
403 sock_put(sk); in sco_sock_kill()
406 static void __sco_sock_close(struct sock *sk) in __sco_sock_close() argument
408 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket); in __sco_sock_close()
410 switch (sk->sk_state) { in __sco_sock_close()
412 sco_sock_cleanup_listen(sk); in __sco_sock_close()
417 if (sco_pi(sk)->conn->hcon) { in __sco_sock_close()
418 sk->sk_state = BT_DISCONN; in __sco_sock_close()
419 sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT); in __sco_sock_close()
420 sco_conn_lock(sco_pi(sk)->conn); in __sco_sock_close()
421 hci_conn_drop(sco_pi(sk)->conn->hcon); in __sco_sock_close()
422 sco_pi(sk)->conn->hcon = NULL; in __sco_sock_close()
423 sco_conn_unlock(sco_pi(sk)->conn); in __sco_sock_close()
425 sco_chan_del(sk, ECONNRESET); in __sco_sock_close()
431 sco_chan_del(sk, ECONNRESET); in __sco_sock_close()
435 sock_set_flag(sk, SOCK_ZAPPED); in __sco_sock_close()
442 static void sco_sock_close(struct sock *sk) in sco_sock_close() argument
444 lock_sock(sk); in sco_sock_close()
445 sco_sock_clear_timer(sk); in sco_sock_close()
446 __sco_sock_close(sk); in sco_sock_close()
447 release_sock(sk); in sco_sock_close()
451 struct sock *sk) in sco_skb_put_cmsg() argument
453 if (sco_pi(sk)->cmsg_mask & SCO_CMSG_PKT_STATUS) in sco_skb_put_cmsg()
459 static void sco_sock_init(struct sock *sk, struct sock *parent) in sco_sock_init() argument
461 BT_DBG("sk %p", sk); in sco_sock_init()
464 sk->sk_type = parent->sk_type; in sco_sock_init()
465 bt_sk(sk)->flags = bt_sk(parent)->flags; in sco_sock_init()
466 security_sk_clone(parent, sk); in sco_sock_init()
468 bt_sk(sk)->skb_put_cmsg = sco_skb_put_cmsg; in sco_sock_init()
481 struct sock *sk; in sco_sock_alloc() local
483 sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto, kern); in sco_sock_alloc()
484 if (!sk) in sco_sock_alloc()
487 sock_init_data(sock, sk); in sco_sock_alloc()
488 INIT_LIST_HEAD(&bt_sk(sk)->accept_q); in sco_sock_alloc()
490 sk->sk_destruct = sco_sock_destruct; in sco_sock_alloc()
491 sk->sk_sndtimeo = SCO_CONN_TIMEOUT; in sco_sock_alloc()
493 sock_reset_flag(sk, SOCK_ZAPPED); in sco_sock_alloc()
495 sk->sk_protocol = proto; in sco_sock_alloc()
496 sk->sk_state = BT_OPEN; in sco_sock_alloc()
498 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT; in sco_sock_alloc()
499 sco_pi(sk)->codec.id = BT_CODEC_CVSD; in sco_sock_alloc()
500 sco_pi(sk)->codec.cid = 0xffff; in sco_sock_alloc()
501 sco_pi(sk)->codec.vid = 0xffff; in sco_sock_alloc()
502 sco_pi(sk)->codec.data_path = 0x00; in sco_sock_alloc()
504 bt_sock_link(&sco_sk_list, sk); in sco_sock_alloc()
505 return sk; in sco_sock_alloc()
511 struct sock *sk; in sco_sock_create() local
522 sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern); in sco_sock_create()
523 if (!sk) in sco_sock_create()
526 sco_sock_init(sk, NULL); in sco_sock_create()
534 struct sock *sk = sock->sk; in sco_sock_bind() local
541 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr); in sco_sock_bind()
543 lock_sock(sk); in sco_sock_bind()
545 if (sk->sk_state != BT_OPEN) { in sco_sock_bind()
550 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_bind()
555 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr); in sco_sock_bind()
557 sk->sk_state = BT_BOUND; in sco_sock_bind()
560 release_sock(sk); in sco_sock_bind()
567 struct sock *sk = sock->sk; in sco_sock_connect() local
571 BT_DBG("sk %p", sk); in sco_sock_connect()
577 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) in sco_sock_connect()
580 if (sk->sk_type != SOCK_SEQPACKET) in sco_sock_connect()
583 hdev = hci_get_route(&sa->sco_bdaddr, &sco_pi(sk)->src, BDADDR_BREDR); in sco_sock_connect()
588 lock_sock(sk); in sco_sock_connect()
591 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr); in sco_sock_connect()
593 err = sco_connect(hdev, sk); in sco_sock_connect()
599 err = bt_sock_wait_state(sk, BT_CONNECTED, in sco_sock_connect()
600 sock_sndtimeo(sk, flags & O_NONBLOCK)); in sco_sock_connect()
603 release_sock(sk); in sco_sock_connect()
609 struct sock *sk = sock->sk; in sco_sock_listen() local
610 bdaddr_t *src = &sco_pi(sk)->src; in sco_sock_listen()
613 BT_DBG("sk %p backlog %d", sk, backlog); in sco_sock_listen()
615 lock_sock(sk); in sco_sock_listen()
617 if (sk->sk_state != BT_BOUND) { in sco_sock_listen()
622 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_listen()
634 sk->sk_max_ack_backlog = backlog; in sco_sock_listen()
635 sk->sk_ack_backlog = 0; in sco_sock_listen()
637 sk->sk_state = BT_LISTEN; in sco_sock_listen()
643 release_sock(sk); in sco_sock_listen()
651 struct sock *sk = sock->sk, *ch; in sco_sock_accept() local
655 lock_sock(sk); in sco_sock_accept()
657 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); in sco_sock_accept()
659 BT_DBG("sk %p timeo %ld", sk, timeo); in sco_sock_accept()
662 add_wait_queue_exclusive(sk_sleep(sk), &wait); in sco_sock_accept()
664 if (sk->sk_state != BT_LISTEN) { in sco_sock_accept()
669 ch = bt_accept_dequeue(sk, newsock); in sco_sock_accept()
683 release_sock(sk); in sco_sock_accept()
686 lock_sock(sk); in sco_sock_accept()
688 remove_wait_queue(sk_sleep(sk), &wait); in sco_sock_accept()
698 release_sock(sk); in sco_sock_accept()
706 struct sock *sk = sock->sk; in sco_sock_getname() local
708 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_getname()
713 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst); in sco_sock_getname()
715 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src); in sco_sock_getname()
723 struct sock *sk = sock->sk; in sco_sock_sendmsg() local
727 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_sendmsg()
729 err = sock_error(sk); in sco_sock_sendmsg()
736 skb = bt_skb_sendmsg(sk, msg, len, len, 0, 0); in sco_sock_sendmsg()
740 lock_sock(sk); in sco_sock_sendmsg()
742 if (sk->sk_state == BT_CONNECTED) in sco_sock_sendmsg()
743 err = sco_send_frame(sk, skb); in sco_sock_sendmsg()
747 release_sock(sk); in sco_sock_sendmsg()
806 struct sock *sk = sock->sk; in sco_sock_recvmsg() local
807 struct sco_pinfo *pi = sco_pi(sk); in sco_sock_recvmsg()
809 lock_sock(sk); in sco_sock_recvmsg()
811 if (sk->sk_state == BT_CONNECT2 && in sco_sock_recvmsg()
812 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { in sco_sock_recvmsg()
814 sk->sk_state = BT_CONFIG; in sco_sock_recvmsg()
816 release_sock(sk); in sco_sock_recvmsg()
820 release_sock(sk); in sco_sock_recvmsg()
828 struct sock *sk = sock->sk; in sco_sock_setsockopt() local
836 BT_DBG("sk %p", sk); in sco_sock_setsockopt()
838 lock_sock(sk); in sco_sock_setsockopt()
843 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_setsockopt()
854 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
856 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in sco_sock_setsockopt()
860 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in sco_sock_setsockopt()
861 sk->sk_state != BT_CONNECT2) { in sco_sock_setsockopt()
866 voice.setting = sco_pi(sk)->setting; in sco_sock_setsockopt()
881 sco_pi(sk)->setting = voice.setting; in sco_sock_setsockopt()
882 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, in sco_sock_setsockopt()
890 sco_pi(sk)->codec.id = BT_CODEC_TRANSPARENT; in sco_sock_setsockopt()
901 sco_pi(sk)->cmsg_mask |= SCO_CMSG_PKT_STATUS; in sco_sock_setsockopt()
903 sco_pi(sk)->cmsg_mask &= SCO_CMSG_PKT_STATUS; in sco_sock_setsockopt()
907 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && in sco_sock_setsockopt()
908 sk->sk_state != BT_CONNECT2) { in sco_sock_setsockopt()
913 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, in sco_sock_setsockopt()
953 sco_pi(sk)->codec = codecs->codecs[0]; in sco_sock_setsockopt()
962 release_sock(sk); in sco_sock_setsockopt()
969 struct sock *sk = sock->sk; in sco_sock_getsockopt_old() local
974 BT_DBG("sk %p", sk); in sco_sock_getsockopt_old()
979 lock_sock(sk); in sco_sock_getsockopt_old()
983 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
984 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
985 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
990 opts.mtu = sco_pi(sk)->conn->mtu; in sco_sock_getsockopt_old()
1001 if (sk->sk_state != BT_CONNECTED && in sco_sock_getsockopt_old()
1002 !(sk->sk_state == BT_CONNECT2 && in sco_sock_getsockopt_old()
1003 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in sco_sock_getsockopt_old()
1009 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle; in sco_sock_getsockopt_old()
1010 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3); in sco_sock_getsockopt_old()
1023 release_sock(sk); in sco_sock_getsockopt_old()
1030 struct sock *sk = sock->sk; in sco_sock_getsockopt() local
1042 BT_DBG("sk %p", sk); in sco_sock_getsockopt()
1050 lock_sock(sk); in sco_sock_getsockopt()
1055 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_getsockopt()
1060 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), in sco_sock_getsockopt()
1067 voice.setting = sco_pi(sk)->setting; in sco_sock_getsockopt()
1076 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1081 phys = hci_conn_get_phy(sco_pi(sk)->conn->hcon); in sco_sock_getsockopt()
1088 pkt_status = (sco_pi(sk)->cmsg_mask & SCO_CMSG_PKT_STATUS); in sco_sock_getsockopt()
1096 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1101 if (put_user(sco_pi(sk)->conn->mtu, (u32 __user *)optval)) in sco_sock_getsockopt()
1109 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR); in sco_sock_getsockopt()
1205 release_sock(sk); in sco_sock_getsockopt()
1211 struct sock *sk = sock->sk; in sco_sock_shutdown() local
1214 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_shutdown()
1216 if (!sk) in sco_sock_shutdown()
1219 sock_hold(sk); in sco_sock_shutdown()
1220 lock_sock(sk); in sco_sock_shutdown()
1222 if (!sk->sk_shutdown) { in sco_sock_shutdown()
1223 sk->sk_shutdown = SHUTDOWN_MASK; in sco_sock_shutdown()
1224 sco_sock_clear_timer(sk); in sco_sock_shutdown()
1225 __sco_sock_close(sk); in sco_sock_shutdown()
1227 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in sco_sock_shutdown()
1229 err = bt_sock_wait_state(sk, BT_CLOSED, in sco_sock_shutdown()
1230 sk->sk_lingertime); in sco_sock_shutdown()
1233 release_sock(sk); in sco_sock_shutdown()
1234 sock_put(sk); in sco_sock_shutdown()
1241 struct sock *sk = sock->sk; in sco_sock_release() local
1244 BT_DBG("sock %p, sk %p", sock, sk); in sco_sock_release()
1246 if (!sk) in sco_sock_release()
1249 sco_sock_close(sk); in sco_sock_release()
1251 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in sco_sock_release()
1253 lock_sock(sk); in sco_sock_release()
1254 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime); in sco_sock_release()
1255 release_sock(sk); in sco_sock_release()
1258 sock_orphan(sk); in sco_sock_release()
1259 sco_sock_kill(sk); in sco_sock_release()
1266 struct sock *sk = conn->sk; in sco_conn_ready() local
1270 if (sk) { in sco_conn_ready()
1271 lock_sock(sk); in sco_conn_ready()
1272 sco_sock_clear_timer(sk); in sco_conn_ready()
1273 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1274 sk->sk_state_change(sk); in sco_conn_ready()
1275 release_sock(sk); in sco_conn_ready()
1292 sk = sco_sock_alloc(sock_net(parent), NULL, in sco_conn_ready()
1294 if (!sk) { in sco_conn_ready()
1300 sco_sock_init(sk, parent); in sco_conn_ready()
1302 bacpy(&sco_pi(sk)->src, &conn->hcon->src); in sco_conn_ready()
1303 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst); in sco_conn_ready()
1306 __sco_chan_add(conn, sk, parent); in sco_conn_ready()
1309 sk->sk_state = BT_CONNECT2; in sco_conn_ready()
1311 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1325 struct sock *sk; in sco_connect_ind() local
1332 sk_for_each(sk, &sco_sk_list.head) { in sco_connect_ind()
1333 if (sk->sk_state != BT_LISTEN) in sco_connect_ind()
1336 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) || in sco_connect_ind()
1337 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) { in sco_connect_ind()
1340 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) in sco_connect_ind()
1403 struct sock *sk; in sco_debugfs_show() local
1407 sk_for_each(sk, &sco_sk_list.head) { in sco_debugfs_show()
1408 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src, in sco_debugfs_show()
1409 &sco_pi(sk)->dst, sk->sk_state); in sco_debugfs_show()