2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
25 /* Bluetooth address family and sockets. */
27 #include <linux/module.h>
29 #include <linux/types.h>
30 #include <linux/list.h>
31 #include <linux/errno.h>
32 #include <linux/kernel.h>
33 #include <linux/sched.h>
34 #include <linux/slab.h>
35 #include <linux/skbuff.h>
36 #include <linux/init.h>
37 #include <linux/poll.h>
39 #include <asm/ioctls.h>
40 #include <linux/kmod.h>
42 #include <net/bluetooth/bluetooth.h>
44 #ifndef CONFIG_BT_SOCK_DEBUG
49 #define VERSION "2.13"
51 /* Bluetooth sockets */
52 #define BT_MAX_PROTO 8
53 static struct net_proto_family *bt_proto[BT_MAX_PROTO];
55 static struct lock_class_key bt_slock_key[BT_MAX_PROTO];
56 static struct lock_class_key bt_lock_key[BT_MAX_PROTO];
57 static const char *bt_key_strings[BT_MAX_PROTO] = {
58 "sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP",
59 "sk_lock-AF_BLUETOOTH-BTPROTO_HCI",
60 "sk_lock-AF_BLUETOOTH-BTPROTO_SCO",
61 "sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM",
62 "sk_lock-AF_BLUETOOTH-BTPROTO_BNEP",
63 "sk_lock-AF_BLUETOOTH-BTPROTO_CMTP",
64 "sk_lock-AF_BLUETOOTH-BTPROTO_HIDP",
65 "sk_lock-AF_BLUETOOTH-BTPROTO_AVDTP",
68 static const char *bt_slock_key_strings[BT_MAX_PROTO] = {
69 "slock-AF_BLUETOOTH-BTPROTO_L2CAP",
70 "slock-AF_BLUETOOTH-BTPROTO_HCI",
71 "slock-AF_BLUETOOTH-BTPROTO_SCO",
72 "slock-AF_BLUETOOTH-BTPROTO_RFCOMM",
73 "slock-AF_BLUETOOTH-BTPROTO_BNEP",
74 "slock-AF_BLUETOOTH-BTPROTO_CMTP",
75 "slock-AF_BLUETOOTH-BTPROTO_HIDP",
76 "slock-AF_BLUETOOTH-BTPROTO_AVDTP",
78 static DEFINE_RWLOCK(bt_proto_lock);
80 int bt_sock_register(int proto, struct net_proto_family *ops)
84 if (proto < 0 || proto >= BT_MAX_PROTO)
87 write_lock(&bt_proto_lock);
92 bt_proto[proto] = ops;
94 write_unlock(&bt_proto_lock);
98 EXPORT_SYMBOL(bt_sock_register);
100 int bt_sock_unregister(int proto)
104 if (proto < 0 || proto >= BT_MAX_PROTO)
107 write_lock(&bt_proto_lock);
109 if (!bt_proto[proto])
112 bt_proto[proto] = NULL;
114 write_unlock(&bt_proto_lock);
118 EXPORT_SYMBOL(bt_sock_unregister);
120 static void bt_reclassify_sock_lock(struct socket *sock, int proto)
122 struct sock *sk = sock->sk;
126 BUG_ON(sock_owned_by_user(sk));
128 sock_lock_init_class_and_name(sk,
129 bt_slock_key_strings[proto],
130 &bt_slock_key[proto],
131 bt_key_strings[proto],
132 &bt_lock_key[proto]);
135 static int bt_sock_create(struct net *net, struct socket *sock, int proto)
139 if (net != &init_net)
140 return -EAFNOSUPPORT;
142 if (proto < 0 || proto >= BT_MAX_PROTO)
145 if (!bt_proto[proto])
146 request_module("bt-proto-%d", proto);
148 err = -EPROTONOSUPPORT;
150 read_lock(&bt_proto_lock);
152 if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
153 err = bt_proto[proto]->create(net, sock, proto);
154 bt_reclassify_sock_lock(sock, proto);
155 module_put(bt_proto[proto]->owner);
158 read_unlock(&bt_proto_lock);
163 void bt_sock_link(struct bt_sock_list *l, struct sock *sk)
165 write_lock_bh(&l->lock);
166 sk_add_node(sk, &l->head);
167 write_unlock_bh(&l->lock);
169 EXPORT_SYMBOL(bt_sock_link);
171 void bt_sock_unlink(struct bt_sock_list *l, struct sock *sk)
173 write_lock_bh(&l->lock);
174 sk_del_node_init(sk);
175 write_unlock_bh(&l->lock);
177 EXPORT_SYMBOL(bt_sock_unlink);
179 void bt_accept_enqueue(struct sock *parent, struct sock *sk)
181 BT_DBG("parent %p, sk %p", parent, sk);
184 list_add_tail(&bt_sk(sk)->accept_q, &bt_sk(parent)->accept_q);
185 bt_sk(sk)->parent = parent;
186 parent->sk_ack_backlog++;
188 EXPORT_SYMBOL(bt_accept_enqueue);
190 void bt_accept_unlink(struct sock *sk)
192 BT_DBG("sk %p state %d", sk, sk->sk_state);
194 list_del_init(&bt_sk(sk)->accept_q);
195 bt_sk(sk)->parent->sk_ack_backlog--;
196 bt_sk(sk)->parent = NULL;
199 EXPORT_SYMBOL(bt_accept_unlink);
201 struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock)
203 struct list_head *p, *n;
206 BT_DBG("parent %p", parent);
208 list_for_each_safe(p, n, &bt_sk(parent)->accept_q) {
209 sk = (struct sock *) list_entry(p, struct bt_sock, accept_q);
213 /* FIXME: Is this check still needed */
214 if (sk->sk_state == BT_CLOSED) {
216 bt_accept_unlink(sk);
220 if (sk->sk_state == BT_CONNECTED || !newsock) {
221 bt_accept_unlink(sk);
223 sock_graft(sk, newsock);
232 EXPORT_SYMBOL(bt_accept_dequeue);
234 int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
235 struct msghdr *msg, size_t len, int flags)
237 int noblock = flags & MSG_DONTWAIT;
238 struct sock *sk = sock->sk;
243 BT_DBG("sock %p sk %p len %d", sock, sk, len);
245 if (flags & (MSG_OOB))
248 if (!(skb = skb_recv_datagram(sk, flags, noblock, &err))) {
249 if (sk->sk_shutdown & RCV_SHUTDOWN)
254 msg->msg_namelen = 0;
258 msg->msg_flags |= MSG_TRUNC;
262 skb_reset_transport_header(skb);
263 err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
265 sock_recv_timestamp(msg, sk, skb);
267 skb_free_datagram(sk, skb);
269 return err ? : copied;
271 EXPORT_SYMBOL(bt_sock_recvmsg);
273 static inline unsigned int bt_accept_poll(struct sock *parent)
275 struct list_head *p, *n;
278 list_for_each_safe(p, n, &bt_sk(parent)->accept_q) {
279 sk = (struct sock *) list_entry(p, struct bt_sock, accept_q);
280 if (sk->sk_state == BT_CONNECTED)
281 return POLLIN | POLLRDNORM;
287 unsigned int bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait)
289 struct sock *sk = sock->sk;
290 unsigned int mask = 0;
292 BT_DBG("sock %p, sk %p", sock, sk);
294 poll_wait(file, sk->sk_sleep, wait);
296 if (sk->sk_state == BT_LISTEN)
297 return bt_accept_poll(sk);
299 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
302 if (sk->sk_shutdown & RCV_SHUTDOWN)
305 if (sk->sk_shutdown == SHUTDOWN_MASK)
308 if (!skb_queue_empty(&sk->sk_receive_queue) ||
309 (sk->sk_shutdown & RCV_SHUTDOWN))
310 mask |= POLLIN | POLLRDNORM;
312 if (sk->sk_state == BT_CLOSED)
315 if (sk->sk_state == BT_CONNECT ||
316 sk->sk_state == BT_CONNECT2 ||
317 sk->sk_state == BT_CONFIG)
320 if (sock_writeable(sk))
321 mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
323 set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
327 EXPORT_SYMBOL(bt_sock_poll);
329 int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
331 struct sock *sk = sock->sk;
336 BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg);
340 if (sk->sk_state == BT_LISTEN)
343 amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
346 err = put_user(amount, (int __user *) arg);
350 if (sk->sk_state == BT_LISTEN)
354 skb = skb_peek(&sk->sk_receive_queue);
355 amount = skb ? skb->len : 0;
357 err = put_user(amount, (int __user *) arg);
361 err = sock_get_timestamp(sk, (struct timeval __user *) arg);
365 err = sock_get_timestampns(sk, (struct timespec __user *) arg);
375 EXPORT_SYMBOL(bt_sock_ioctl);
377 int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
379 DECLARE_WAITQUEUE(wait, current);
384 add_wait_queue(sk->sk_sleep, &wait);
385 while (sk->sk_state != state) {
386 set_current_state(TASK_INTERRUPTIBLE);
393 if (signal_pending(current)) {
394 err = sock_intr_errno(timeo);
399 timeo = schedule_timeout(timeo);
402 err = sock_error(sk);
406 set_current_state(TASK_RUNNING);
407 remove_wait_queue(sk->sk_sleep, &wait);
410 EXPORT_SYMBOL(bt_sock_wait_state);
412 static struct net_proto_family bt_sock_family_ops = {
413 .owner = THIS_MODULE,
414 .family = PF_BLUETOOTH,
415 .create = bt_sock_create,
418 static int __init bt_init(void)
422 BT_INFO("Core ver %s", VERSION);
424 err = bt_sysfs_init();
428 err = sock_register(&bt_sock_family_ops);
434 BT_INFO("HCI device and connection manager initialized");
441 static void __exit bt_exit(void)
445 sock_unregister(PF_BLUETOOTH);
450 subsys_initcall(bt_init);
451 module_exit(bt_exit);
453 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
454 MODULE_DESCRIPTION("Bluetooth Core ver " VERSION);
455 MODULE_VERSION(VERSION);
456 MODULE_LICENSE("GPL");
457 MODULE_ALIAS_NETPROTO(PF_BLUETOOTH);