Lines Matching +full:bt +full:- +full:sco
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
25 /* Bluetooth SCO sockets. */
34 #include <net/bluetooth/sco.h>
44 /* ---- SCO connections ---- */
56 #define sco_conn_lock(c) spin_lock(&c->lock)
57 #define sco_conn_unlock(c) spin_unlock(&c->lock)
62 /* ----- SCO socket info ----- */
66 struct bt_sock bt; member
75 /* ---- SCO timers ---- */
86 sk = conn->sk; in sco_sock_timeout()
94 BT_DBG("sock %p state %d", sk, sk->sk_state); in sco_sock_timeout()
97 sk->sk_err = ETIMEDOUT; in sco_sock_timeout()
98 sk->sk_state_change(sk); in sco_sock_timeout()
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()
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()
122 /* ---- SCO connections ---- */
125 struct hci_dev *hdev = hcon->hdev; in sco_conn_add()
126 struct sco_conn *conn = hcon->sco_data; in sco_conn_add()
129 if (!conn->hcon) in sco_conn_add()
130 conn->hcon = hcon; in sco_conn_add()
138 spin_lock_init(&conn->lock); in sco_conn_add()
139 INIT_DELAYED_WORK(&conn->timeout_work, sco_sock_timeout); in sco_conn_add()
141 hcon->sco_data = conn; in sco_conn_add()
142 conn->hcon = hcon; in sco_conn_add()
144 if (hdev->sco_mtu > 0) in sco_conn_add()
145 conn->mtu = hdev->sco_mtu; in sco_conn_add()
147 conn->mtu = 60; in sco_conn_add()
160 conn = sco_pi(sk)->conn; in sco_chan_del()
166 conn->sk = NULL; in sco_chan_del()
167 sco_pi(sk)->conn = NULL; in sco_chan_del()
170 if (conn->hcon) in sco_chan_del()
171 hci_conn_drop(conn->hcon); 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()
183 struct sco_conn *conn = hcon->sco_data; in sco_conn_del()
193 sk = conn->sk; in sco_conn_del()
207 cancel_delayed_work_sync(&conn->timeout_work); in sco_conn_del()
209 hcon->sco_data = NULL; in sco_conn_del()
218 sco_pi(sk)->conn = conn; in __sco_chan_add()
219 conn->sk = sk; in __sco_chan_add()
231 if (conn->sk) in sco_chan_add()
232 err = -EBUSY; in sco_chan_add()
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()
251 return -EHOSTUNREACH; in sco_connect()
260 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT && in sco_connect()
262 err = -EOPNOTSUPP; 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()
276 err = -ENOMEM; in sco_connect()
289 bacpy(&sco_pi(sk)->src, &hcon->src); in sco_connect()
291 if (hcon->state == BT_CONNECTED) { 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()
309 struct sco_conn *conn = sco_pi(sk)->conn; in sco_send_frame()
310 int len = skb->len; in sco_send_frame()
313 if (len > conn->mtu) in sco_send_frame()
314 return -EINVAL; in sco_send_frame()
318 hci_send_sco(conn->hcon, skb); in sco_send_frame()
328 sk = conn->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()
346 /* -------- Socket interface ---------- */
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()
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()
393 skb_queue_purge(&sk->sk_receive_queue); in sco_sock_destruct()
394 skb_queue_purge(&sk->sk_write_queue); in sco_sock_destruct()
409 parent->sk_state = BT_CLOSED; in sco_sock_cleanup_listen()
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()
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()
440 if (sco_pi(sk)->conn->hcon) { in __sco_sock_close()
441 sk->sk_state = BT_DISCONN; 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()
478 sk->sk_type = parent->sk_type; in sco_sock_init()
479 bt_sk(sk)->flags = bt_sk(parent)->flags; in sco_sock_init()
485 .name = "SCO",
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()
519 sock->state = SS_UNCONNECTED; in sco_sock_create()
521 if (sock->type != SOCK_SEQPACKET) in sco_sock_create()
522 return -ESOCKTNOSUPPORT; in sco_sock_create()
524 sock->ops = &sco_sock_ops; in sco_sock_create()
528 return -ENOMEM; in sco_sock_create()
538 struct sock *sk = sock->sk; in sco_sock_bind()
542 addr->sa_family != AF_BLUETOOTH) in sco_sock_bind()
543 return -EINVAL; in sco_sock_bind()
545 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr); in sco_sock_bind()
549 if (sk->sk_state != BT_OPEN) { in sco_sock_bind()
550 err = -EBADFD; in sco_sock_bind()
554 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_bind()
555 err = -EINVAL; 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()
571 struct sock *sk = sock->sk; in sco_sock_connect()
577 addr->sa_family != AF_BLUETOOTH) in sco_sock_connect()
578 return -EINVAL; in sco_sock_connect()
580 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) in sco_sock_connect()
581 return -EBADFD; in sco_sock_connect()
583 if (sk->sk_type != SOCK_SEQPACKET) in sco_sock_connect()
584 err = -EINVAL; in sco_sock_connect()
588 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr); in sco_sock_connect()
606 struct sock *sk = sock->sk; in sco_sock_listen()
607 bdaddr_t *src = &sco_pi(sk)->src; in sco_sock_listen()
614 if (sk->sk_state != BT_BOUND) { in sco_sock_listen()
615 err = -EBADFD; in sco_sock_listen()
619 if (sk->sk_type != SOCK_SEQPACKET) { in sco_sock_listen()
620 err = -EINVAL; in sco_sock_listen()
627 err = -EADDRINUSE; 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()
648 struct sock *sk = sock->sk, *ch; in sco_sock_accept()
658 /* Wait for an incoming connection. (wake-one). */ in sco_sock_accept()
661 if (sk->sk_state != BT_LISTEN) { in sco_sock_accept()
662 err = -EBADFD; in sco_sock_accept()
671 err = -EAGAIN; in sco_sock_accept()
690 newsock->state = SS_CONNECTED; in sco_sock_accept()
703 struct sock *sk = sock->sk; in sco_sock_getname()
707 addr->sa_family = AF_BLUETOOTH; 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()
730 if (msg->msg_flags & MSG_OOB) in sco_sock_sendmsg()
731 return -EOPNOTSUPP; in sco_sock_sendmsg()
739 if (sk->sk_state == BT_CONNECTED) in sco_sock_sendmsg()
742 err = -ENOTCONN; in sco_sock_sendmsg()
753 struct hci_dev *hdev = conn->hdev; in sco_conn_defer_accept()
757 conn->state = BT_CONFIG; in sco_conn_defer_accept()
762 bacpy(&cp.bdaddr, &conn->dst); in sco_conn_defer_accept()
769 bacpy(&cp.bdaddr, &conn->dst); in sco_conn_defer_accept()
770 cp.pkt_type = cpu_to_le16(conn->pkt_type); in sco_conn_defer_accept()
778 if (conn->pkt_type & ESCO_2EV3) in sco_conn_defer_accept()
803 struct sock *sk = 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()
810 sco_conn_defer_accept(pi->conn->hcon, pi->setting); in sco_sock_recvmsg()
811 sk->sk_state = BT_CONFIG; in sco_sock_recvmsg()
825 struct sock *sk = sock->sk; in sco_sock_setsockopt()
840 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_setsockopt()
841 err = -EINVAL; in sco_sock_setsockopt()
846 err = -EFAULT; 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()
859 err = -EINVAL; in sco_sock_setsockopt()
863 voice.setting = sco_pi(sk)->setting; in sco_sock_setsockopt()
867 err = -EFAULT; in sco_sock_setsockopt()
874 err = -EINVAL; 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()
882 err = -EBADFD; in sco_sock_setsockopt()
887 sco_pi(sk)->codec.id = BT_CODEC_TRANSPARENT; in sco_sock_setsockopt()
893 err = -EFAULT; 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()
906 err = -EINVAL; in sco_sock_setsockopt()
910 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, in sco_sock_setsockopt()
913 err = -EBADFD; in sco_sock_setsockopt()
919 err = -EOPNOTSUPP; in sco_sock_setsockopt()
923 if (!hdev->get_data_path_id) { in sco_sock_setsockopt()
925 err = -EOPNOTSUPP; in sco_sock_setsockopt()
932 err = -EINVAL; in sco_sock_setsockopt()
938 err = -EFAULT; in sco_sock_setsockopt()
944 if (codecs->num_codecs > 1) { in sco_sock_setsockopt()
946 err = -EINVAL; in sco_sock_setsockopt()
950 sco_pi(sk)->codec = codecs->codecs[0]; in sco_sock_setsockopt()
955 err = -ENOPROTOOPT; in sco_sock_setsockopt()
966 struct sock *sk = sock->sk; in sco_sock_getsockopt_old()
974 return -EFAULT; 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()
983 err = -ENOTCONN; in sco_sock_getsockopt_old()
987 opts.mtu = sco_pi(sk)->conn->mtu; in sco_sock_getsockopt_old()
993 err = -EFAULT; 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()
1001 err = -ENOTCONN; 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()
1011 err = -EFAULT; in sco_sock_getsockopt_old()
1016 err = -ENOPROTOOPT; in sco_sock_getsockopt_old()
1027 struct sock *sk = sock->sk; in sco_sock_getsockopt()
1044 return -EFAULT; in sco_sock_getsockopt()
1051 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in sco_sock_getsockopt()
1052 err = -EINVAL; in sco_sock_getsockopt()
1056 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), in sco_sock_getsockopt()
1058 err = -EFAULT; in sco_sock_getsockopt()
1063 voice.setting = sco_pi(sk)->setting; in sco_sock_getsockopt()
1067 err = -EFAULT; in sco_sock_getsockopt()
1072 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1073 err = -ENOTCONN; in sco_sock_getsockopt()
1077 phys = hci_conn_get_phy(sco_pi(sk)->conn->hcon); in sco_sock_getsockopt()
1080 err = -EFAULT; in sco_sock_getsockopt()
1084 if (put_user(test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags), in sco_sock_getsockopt()
1086 err = -EFAULT; in sco_sock_getsockopt()
1091 if (sk->sk_state != BT_CONNECTED) { in sco_sock_getsockopt()
1092 err = -ENOTCONN; in sco_sock_getsockopt()
1096 if (put_user(sco_pi(sk)->conn->mtu, (u32 __user *)optval)) in sco_sock_getsockopt()
1097 err = -EFAULT; in sco_sock_getsockopt()
1104 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR); in sco_sock_getsockopt()
1106 err = -EBADFD; in sco_sock_getsockopt()
1112 err = -EOPNOTSUPP; in sco_sock_getsockopt()
1116 if (!hdev->get_data_path_id) { in sco_sock_getsockopt()
1118 err = -EOPNOTSUPP; in sco_sock_getsockopt()
1126 list_for_each_entry(c, &hdev->local_codecs, list) { in sco_sock_getsockopt()
1127 if (c->transport != HCI_TRANSPORT_SCO_ESCO) in sco_sock_getsockopt()
1130 for (i = 0, caps = c->caps; i < c->num_caps; i++) { in sco_sock_getsockopt()
1131 buf_len += 1 + caps->len; in sco_sock_getsockopt()
1132 caps = (void *)&caps->data[caps->len]; in sco_sock_getsockopt()
1141 return -ENOBUFS; in sco_sock_getsockopt()
1147 return -EFAULT; in sco_sock_getsockopt()
1151 /* Iterate all the codecs supported over SCO and populate in sco_sock_getsockopt()
1155 list_for_each_entry(c, &hdev->local_codecs, list) { in sco_sock_getsockopt()
1156 if (c->transport != HCI_TRANSPORT_SCO_ESCO) in sco_sock_getsockopt()
1159 codec.id = c->id; in sco_sock_getsockopt()
1160 codec.cid = c->cid; in sco_sock_getsockopt()
1161 codec.vid = c->vid; in sco_sock_getsockopt()
1162 err = hdev->get_data_path_id(hdev, &codec.data_path); in sco_sock_getsockopt()
1165 codec.num_caps = c->num_caps; in sco_sock_getsockopt()
1167 err = -EFAULT; in sco_sock_getsockopt()
1174 for (i = 0, caps = c->caps; i < c->num_caps; i++) { in sco_sock_getsockopt()
1175 len += 1 + caps->len; in sco_sock_getsockopt()
1176 caps = (void *)&caps->data[caps->len]; in sco_sock_getsockopt()
1180 if (len && copy_to_user(ptr, c->caps, len)) { in sco_sock_getsockopt()
1181 err = -EFAULT; in sco_sock_getsockopt()
1193 err = -EFAULT; in sco_sock_getsockopt()
1198 err = -ENOPROTOOPT; in sco_sock_getsockopt()
1208 struct sock *sk = 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()
1224 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in sco_sock_shutdown()
1225 !(current->flags & PF_EXITING)) in sco_sock_shutdown()
1227 sk->sk_lingertime); in sco_sock_shutdown()
1238 struct sock *sk = sock->sk; in sco_sock_release()
1248 if (sock_flag(sk, SOCK_LINGER) && READ_ONCE(sk->sk_lingertime) && in sco_sock_release()
1249 !(current->flags & PF_EXITING)) { in sco_sock_release()
1251 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime); in sco_sock_release()
1263 struct sock *sk = conn->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()
1276 if (!conn->hcon) { in sco_conn_ready()
1281 parent = sco_get_sock_listen(&conn->hcon->src); 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()
1302 hci_conn_hold(conn->hcon); in sco_conn_ready()
1305 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags)) in sco_conn_ready()
1306 sk->sk_state = BT_CONNECT2; in sco_conn_ready()
1308 sk->sk_state = BT_CONNECTED; in sco_conn_ready()
1311 parent->sk_data_ready(parent); in sco_conn_ready()
1319 /* ----- SCO interface with lower layer (HCI) ----- */
1325 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr); 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()
1349 if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK) in sco_connect_cfm()
1352 BT_DBG("hcon %p bdaddr %pMR status %u", hcon, &hcon->dst, status); in sco_connect_cfm()
1366 if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK) in sco_disconn_cfm()
1376 struct sco_conn *conn = hcon->sco_data; in sco_recv_scodata()
1381 BT_DBG("conn %p len %u", conn, skb->len); in sco_recv_scodata()
1383 if (skb->len) { in sco_recv_scodata()
1393 .name = "SCO",
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()
1457 BT_ERR("SCO socket registration failed"); in sco_init()
1461 err = bt_procfs_init(&init_net, "sco", &sco_sk_list, NULL); in sco_init()
1463 BT_ERR("Failed to create SCO proc file"); in sco_init()
1468 BT_INFO("SCO socket layer initialized"); in sco_init()
1475 sco_debugfs = debugfs_create_file("sco", 0444, bt_debugfs, in sco_init()
1487 bt_procfs_cleanup(&init_net, "sco"); in sco_exit()