SOFTWARE IS DISCLAIMED.
*/
-/*
- * Bluetooth SCO sockets.
- *
- * $Id: sco.c,v 1.3 2002/04/17 17:37:16 maxk Exp $
- */
-#define VERSION "0.3"
+/* Bluetooth SCO sockets. */
#include <linux/config.h>
#include <linux/module.h>
#ifndef CONFIG_BT_SCO_DEBUG
#undef BT_DBG
-#define BT_DBG( A... )
+#define BT_DBG(D...)
#endif
+#define VERSION "0.3"
+
static struct proto_ops sco_sock_ops;
static struct bt_sock_list sco_sk_list = {
static void sco_sock_set_timer(struct sock *sk, long timeout)
{
BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout);
-
- if (!mod_timer(&sk->sk_timer, jiffies + timeout))
- sock_hold(sk);
+ sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout);
}
static void sco_sock_clear_timer(struct sock *sk)
{
BT_DBG("sock %p state %d", sk, sk->sk_state);
-
- if (timer_pending(&sk->sk_timer) && del_timer(&sk->sk_timer))
- __sock_put(sk);
+ sk_stop_timer(sk, &sk->sk_timer);
}
static void sco_sock_init_timer(struct sock *sk)
conn->src = &hdev->bdaddr;
conn->dst = &hcon->dst;
-
+
if (hdev->sco_mtu > 0)
conn->mtu = hdev->sco_mtu;
else
}
write_lock_bh(&sco_sk_list.lock);
-
+
if (bacmp(src, BDADDR_ANY) && __sco_get_sock_by_addr(src)) {
err = -EADDRINUSE;
} else {
bacpy(&bt_sk(sk)->src, &sa->sco_bdaddr);
sk->sk_state = BT_BOUND;
}
-
+
write_unlock_bh(&sco_sk_list.lock);
done:
return err;
}
-static int sco_sock_setsockopt(struct socket *sock, int level, int optname, char *optval, int optlen)
+static int sco_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen)
{
struct sock *sk = sock->sk;
int err = 0;
return err;
}
-static int sco_sock_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen)
+static int sco_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
{
struct sock *sk = sock->sk;
struct sco_options opts;
err = -ENOTCONN;
break;
}
-
+
opts.mtu = sco_pi(sk)->conn->mtu;
BT_DBG("mtu %d", opts.mtu);
if (!sk)
return 0;
-
+
sco_sock_close(sk);
if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) {
sk = sco_sock_alloc(NULL, BTPROTO_SCO, GFP_ATOMIC);
if (!sk) {
bh_unlock_sock(parent);
- goto done;
+ goto done;
}
sco_sock_init(sk, parent);
bacpy(&bt_sk(sk)->dst, conn->dst);
hci_conn_hold(conn->hcon);
- __sco_chan_add(conn, sk, parent);
+ __sco_chan_add(conn, sk, parent);
- sk->sk_state = BT_CONNECTED;
+ sk->sk_state = BT_CONNECTED;
/* Wake up parent */
parent->sk_data_ready(parent, 1);
-
- bh_unlock_sock(parent);
+
+ bh_unlock_sock(parent);
}
done:
sco_conn_ready(conn);
} else
sco_conn_del(hcon, bt_err(status));
-
+
return 0;
}
}
static struct seq_operations sco_seq_ops = {
- .start = sco_seq_start,
- .next = sco_seq_next,
- .stop = sco_seq_stop,
- .show = sco_seq_show
+ .start = sco_seq_start,
+ .next = sco_seq_next,
+ .stop = sco_seq_stop,
+ .show = sco_seq_show
};
static int sco_seq_open(struct inode *inode, struct file *file)
}
static struct file_operations sco_seq_fops = {
- .owner = THIS_MODULE,
- .open = sco_seq_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
+ .owner = THIS_MODULE,
+ .open = sco_seq_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
};
-static int __init sco_proc_init(void)
+static int __init sco_proc_init(void)
{
- struct proc_dir_entry *p = create_proc_entry("sco", S_IRUGO, proc_bt);
- if (!p)
- return -ENOMEM;
+ struct proc_dir_entry *p = create_proc_entry("sco", S_IRUGO, proc_bt);
+ if (!p)
+ return -ENOMEM;
p->owner = THIS_MODULE;
- p->proc_fops = &sco_seq_fops;
- return 0;
+ p->proc_fops = &sco_seq_fops;
+ return 0;
}
static void __exit sco_proc_cleanup(void)
{
- remove_proc_entry("sco", proc_bt);
+ remove_proc_entry("sco", proc_bt);
}
#else /* CONFIG_PROC_FS */
-static int __init sco_proc_init(void)
+static int __init sco_proc_init(void)
{
- return 0;
+ return 0;
}
static void __exit sco_proc_cleanup(void)
{
- return;
+ return;
}
#endif /* CONFIG_PROC_FS */
static struct proto_ops sco_sock_ops = {
- .family = PF_BLUETOOTH,
- .owner = THIS_MODULE,
- .release = sco_sock_release,
- .bind = sco_sock_bind,
- .connect = sco_sock_connect,
- .listen = sco_sock_listen,
- .accept = sco_sock_accept,
- .getname = sco_sock_getname,
- .sendmsg = sco_sock_sendmsg,
- .recvmsg = bt_sock_recvmsg,
- .poll = bt_sock_poll,
- .ioctl = sock_no_ioctl,
- .mmap = sock_no_mmap,
- .socketpair = sock_no_socketpair,
- .shutdown = sock_no_shutdown,
- .setsockopt = sco_sock_setsockopt,
- .getsockopt = sco_sock_getsockopt
+ .family = PF_BLUETOOTH,
+ .owner = THIS_MODULE,
+ .release = sco_sock_release,
+ .bind = sco_sock_bind,
+ .connect = sco_sock_connect,
+ .listen = sco_sock_listen,
+ .accept = sco_sock_accept,
+ .getname = sco_sock_getname,
+ .sendmsg = sco_sock_sendmsg,
+ .recvmsg = bt_sock_recvmsg,
+ .poll = bt_sock_poll,
+ .ioctl = sock_no_ioctl,
+ .mmap = sock_no_mmap,
+ .socketpair = sock_no_socketpair,
+ .shutdown = sock_no_shutdown,
+ .setsockopt = sco_sock_setsockopt,
+ .getsockopt = sco_sock_getsockopt
};
static struct net_proto_family sco_sock_family_ops = {
- .family = PF_BLUETOOTH,
- .create = sco_sock_create,
- .owner = THIS_MODULE,
+ .family = PF_BLUETOOTH,
+ .owner = THIS_MODULE,
+ .create = sco_sock_create,
};
static struct hci_proto sco_hci_proto = {
- .name = "SCO",
- .id = HCI_PROTO_SCO,
- .connect_ind = sco_connect_ind,
- .connect_cfm = sco_connect_cfm,
- .disconn_ind = sco_disconn_ind,
- .recv_scodata = sco_recv_scodata
+ .name = "SCO",
+ .id = HCI_PROTO_SCO,
+ .connect_ind = sco_connect_ind,
+ .connect_cfm = sco_connect_cfm,
+ .disconn_ind = sco_disconn_ind,
+ .recv_scodata = sco_recv_scodata
};
static int __init sco_init(void)
}
sco_proc_init();
-
+
BT_INFO("SCO (Voice Link) ver %s", VERSION);
BT_INFO("SCO socket layer initialized");