fixed netfilter errors and missing dependencies
[htc-linux.git] / net / bluetooth / af_bluetooth.c
blob1707efb7cb0faf039035b5e8ca1f6f00de6a91fc
1 /*
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>
38 #include <net/sock.h>
39 #include <asm/ioctls.h>
40 #include <linux/kmod.h>
42 #include <net/bluetooth/bluetooth.h>
44 #ifdef CONFIG_ANDROID_PARANOID_NETWORK
45 #include <linux/android_aid.h>
46 #endif
48 #ifndef CONFIG_BT_SOCK_DEBUG
49 #undef BT_DBG
50 #define BT_DBG(D...)
51 #endif
53 #define VERSION "2.15"
55 /* Bluetooth sockets */
56 #define BT_MAX_PROTO 8
57 static struct net_proto_family *bt_proto[BT_MAX_PROTO];
58 static DEFINE_RWLOCK(bt_proto_lock);
60 static struct lock_class_key bt_lock_key[BT_MAX_PROTO];
61 static const char *const bt_key_strings[BT_MAX_PROTO] = {
62 "sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP",
63 "sk_lock-AF_BLUETOOTH-BTPROTO_HCI",
64 "sk_lock-AF_BLUETOOTH-BTPROTO_SCO",
65 "sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM",
66 "sk_lock-AF_BLUETOOTH-BTPROTO_BNEP",
67 "sk_lock-AF_BLUETOOTH-BTPROTO_CMTP",
68 "sk_lock-AF_BLUETOOTH-BTPROTO_HIDP",
69 "sk_lock-AF_BLUETOOTH-BTPROTO_AVDTP",
72 static struct lock_class_key bt_slock_key[BT_MAX_PROTO];
73 static const char *const bt_slock_key_strings[BT_MAX_PROTO] = {
74 "slock-AF_BLUETOOTH-BTPROTO_L2CAP",
75 "slock-AF_BLUETOOTH-BTPROTO_HCI",
76 "slock-AF_BLUETOOTH-BTPROTO_SCO",
77 "slock-AF_BLUETOOTH-BTPROTO_RFCOMM",
78 "slock-AF_BLUETOOTH-BTPROTO_BNEP",
79 "slock-AF_BLUETOOTH-BTPROTO_CMTP",
80 "slock-AF_BLUETOOTH-BTPROTO_HIDP",
81 "slock-AF_BLUETOOTH-BTPROTO_AVDTP",
84 static inline void bt_sock_reclassify_lock(struct socket *sock, int proto)
86 struct sock *sk = sock->sk;
88 if (!sk)
89 return;
91 BUG_ON(sock_owned_by_user(sk));
93 sock_lock_init_class_and_name(sk,
94 bt_slock_key_strings[proto], &bt_slock_key[proto],
95 bt_key_strings[proto], &bt_lock_key[proto]);
98 int bt_sock_register(int proto, struct net_proto_family *ops)
100 int err = 0;
102 if (proto < 0 || proto >= BT_MAX_PROTO)
103 return -EINVAL;
105 write_lock(&bt_proto_lock);
107 if (bt_proto[proto])
108 err = -EEXIST;
109 else
110 bt_proto[proto] = ops;
112 write_unlock(&bt_proto_lock);
114 return err;
116 EXPORT_SYMBOL(bt_sock_register);
118 int bt_sock_unregister(int proto)
120 int err = 0;
122 if (proto < 0 || proto >= BT_MAX_PROTO)
123 return -EINVAL;
125 write_lock(&bt_proto_lock);
127 if (!bt_proto[proto])
128 err = -ENOENT;
129 else
130 bt_proto[proto] = NULL;
132 write_unlock(&bt_proto_lock);
134 return err;
136 EXPORT_SYMBOL(bt_sock_unregister);
138 #ifdef CONFIG_ANDROID_PARANOID_NETWORK
139 static inline int current_has_bt_admin(void)
141 return (!current_euid() || in_egroup_p(AID_NET_BT_ADMIN));
144 static inline int current_has_bt(void)
146 return (current_has_bt_admin() || in_egroup_p(AID_NET_BT));
148 # else
149 static inline int current_has_bt_admin(void)
151 return 1;
154 static inline int current_has_bt(void)
156 return 1;
158 #endif
160 static int bt_sock_create(struct net *net, struct socket *sock, int proto)
162 int err;
164 if (proto == BTPROTO_RFCOMM || proto == BTPROTO_SCO ||
165 proto == BTPROTO_L2CAP) {
166 if (!current_has_bt())
167 return -EPERM;
168 } else if (!current_has_bt_admin())
169 return -EPERM;
171 if (net != &init_net)
172 return -EAFNOSUPPORT;
174 if (proto < 0 || proto >= BT_MAX_PROTO)
175 return -EINVAL;
177 if (!bt_proto[proto])
178 request_module("bt-proto-%d", proto);
180 err = -EPROTONOSUPPORT;
182 read_lock(&bt_proto_lock);
184 if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
185 err = bt_proto[proto]->create(net, sock, proto);
186 bt_sock_reclassify_lock(sock, proto);
187 module_put(bt_proto[proto]->owner);
190 read_unlock(&bt_proto_lock);
192 return err;
195 void bt_sock_link(struct bt_sock_list *l, struct sock *sk)
197 write_lock_bh(&l->lock);
198 sk_add_node(sk, &l->head);
199 write_unlock_bh(&l->lock);
201 EXPORT_SYMBOL(bt_sock_link);
203 void bt_sock_unlink(struct bt_sock_list *l, struct sock *sk)
205 write_lock_bh(&l->lock);
206 sk_del_node_init(sk);
207 write_unlock_bh(&l->lock);
209 EXPORT_SYMBOL(bt_sock_unlink);
211 void bt_accept_enqueue(struct sock *parent, struct sock *sk)
213 BT_DBG("parent %p, sk %p", parent, sk);
215 sock_hold(sk);
216 list_add_tail(&bt_sk(sk)->accept_q, &bt_sk(parent)->accept_q);
217 bt_sk(sk)->parent = parent;
218 parent->sk_ack_backlog++;
220 EXPORT_SYMBOL(bt_accept_enqueue);
222 void bt_accept_unlink(struct sock *sk)
224 BT_DBG("sk %p state %d", sk, sk->sk_state);
226 list_del_init(&bt_sk(sk)->accept_q);
227 bt_sk(sk)->parent->sk_ack_backlog--;
228 bt_sk(sk)->parent = NULL;
229 sock_put(sk);
231 EXPORT_SYMBOL(bt_accept_unlink);
233 struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock)
235 struct list_head *p, *n;
236 struct sock *sk;
238 BT_DBG("parent %p", parent);
240 list_for_each_safe(p, n, &bt_sk(parent)->accept_q) {
241 sk = (struct sock *) list_entry(p, struct bt_sock, accept_q);
243 lock_sock(sk);
245 /* FIXME: Is this check still needed */
246 if (sk->sk_state == BT_CLOSED) {
247 release_sock(sk);
248 bt_accept_unlink(sk);
249 continue;
252 if (sk->sk_state == BT_CONNECTED || !newsock ||
253 bt_sk(parent)->defer_setup) {
254 bt_accept_unlink(sk);
255 if (newsock)
256 sock_graft(sk, newsock);
257 release_sock(sk);
258 return sk;
261 release_sock(sk);
263 return NULL;
265 EXPORT_SYMBOL(bt_accept_dequeue);
267 int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
268 struct msghdr *msg, size_t len, int flags)
270 int noblock = flags & MSG_DONTWAIT;
271 struct sock *sk = sock->sk;
272 struct sk_buff *skb;
273 size_t copied;
274 int err;
276 BT_DBG("sock %p sk %p len %zu", sock, sk, len);
278 if (flags & (MSG_OOB))
279 return -EOPNOTSUPP;
281 if (!(skb = skb_recv_datagram(sk, flags, noblock, &err))) {
282 if (sk->sk_shutdown & RCV_SHUTDOWN)
283 return 0;
284 return err;
287 msg->msg_namelen = 0;
289 copied = skb->len;
290 if (len < copied) {
291 msg->msg_flags |= MSG_TRUNC;
292 copied = len;
295 skb_reset_transport_header(skb);
296 err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
297 if (err == 0)
298 sock_recv_timestamp(msg, sk, skb);
300 skb_free_datagram(sk, skb);
302 return err ? : copied;
304 EXPORT_SYMBOL(bt_sock_recvmsg);
306 static inline unsigned int bt_accept_poll(struct sock *parent)
308 struct list_head *p, *n;
309 struct sock *sk;
311 list_for_each_safe(p, n, &bt_sk(parent)->accept_q) {
312 sk = (struct sock *) list_entry(p, struct bt_sock, accept_q);
313 if (sk->sk_state == BT_CONNECTED ||
314 (bt_sk(parent)->defer_setup &&
315 sk->sk_state == BT_CONNECT2))
316 return POLLIN | POLLRDNORM;
319 return 0;
322 unsigned int bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait)
324 struct sock *sk = sock->sk;
325 unsigned int mask = 0;
327 BT_DBG("sock %p, sk %p", sock, sk);
329 poll_wait(file, sk->sk_sleep, wait);
331 if (sk->sk_state == BT_LISTEN)
332 return bt_accept_poll(sk);
334 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
335 mask |= POLLERR;
337 if (sk->sk_shutdown & RCV_SHUTDOWN)
338 mask |= POLLRDHUP;
340 if (sk->sk_shutdown == SHUTDOWN_MASK)
341 mask |= POLLHUP;
343 if (!skb_queue_empty(&sk->sk_receive_queue) ||
344 (sk->sk_shutdown & RCV_SHUTDOWN))
345 mask |= POLLIN | POLLRDNORM;
347 if (sk->sk_state == BT_CLOSED)
348 mask |= POLLHUP;
350 if (sk->sk_state == BT_CONNECT ||
351 sk->sk_state == BT_CONNECT2 ||
352 sk->sk_state == BT_CONFIG)
353 return mask;
355 if (sock_writeable(sk))
356 mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
357 else
358 set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
360 return mask;
362 EXPORT_SYMBOL(bt_sock_poll);
364 int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
366 struct sock *sk = sock->sk;
367 struct sk_buff *skb;
368 long amount;
369 int err;
371 BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg);
373 switch (cmd) {
374 case TIOCOUTQ:
375 if (sk->sk_state == BT_LISTEN)
376 return -EINVAL;
378 amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
379 if (amount < 0)
380 amount = 0;
381 err = put_user(amount, (int __user *) arg);
382 break;
384 case TIOCINQ:
385 if (sk->sk_state == BT_LISTEN)
386 return -EINVAL;
388 lock_sock(sk);
389 skb = skb_peek(&sk->sk_receive_queue);
390 amount = skb ? skb->len : 0;
391 release_sock(sk);
392 err = put_user(amount, (int __user *) arg);
393 break;
395 case SIOCGSTAMP:
396 err = sock_get_timestamp(sk, (struct timeval __user *) arg);
397 break;
399 case SIOCGSTAMPNS:
400 err = sock_get_timestampns(sk, (struct timespec __user *) arg);
401 break;
403 default:
404 err = -ENOIOCTLCMD;
405 break;
408 return err;
410 EXPORT_SYMBOL(bt_sock_ioctl);
412 int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
414 DECLARE_WAITQUEUE(wait, current);
415 int err = 0;
417 BT_DBG("sk %p", sk);
419 add_wait_queue(sk->sk_sleep, &wait);
420 while (sk->sk_state != state) {
421 set_current_state(TASK_INTERRUPTIBLE);
423 if (!timeo) {
424 err = -EINPROGRESS;
425 break;
428 if (signal_pending(current)) {
429 err = sock_intr_errno(timeo);
430 break;
433 release_sock(sk);
434 timeo = schedule_timeout(timeo);
435 lock_sock(sk);
437 err = sock_error(sk);
438 if (err)
439 break;
441 set_current_state(TASK_RUNNING);
442 remove_wait_queue(sk->sk_sleep, &wait);
443 return err;
445 EXPORT_SYMBOL(bt_sock_wait_state);
447 static struct net_proto_family bt_sock_family_ops = {
448 .owner = THIS_MODULE,
449 .family = PF_BLUETOOTH,
450 .create = bt_sock_create,
453 static int __init bt_init(void)
455 int err;
457 BT_INFO("Core ver %s", VERSION);
459 err = bt_sysfs_init();
460 if (err < 0)
461 return err;
463 err = sock_register(&bt_sock_family_ops);
464 if (err < 0) {
465 bt_sysfs_cleanup();
466 return err;
469 BT_INFO("HCI device and connection manager initialized");
471 hci_sock_init();
473 return 0;
476 static void __exit bt_exit(void)
478 hci_sock_cleanup();
480 sock_unregister(PF_BLUETOOTH);
482 bt_sysfs_cleanup();
485 subsys_initcall(bt_init);
486 module_exit(bt_exit);
488 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
489 MODULE_DESCRIPTION("Bluetooth Core ver " VERSION);
490 MODULE_VERSION(VERSION);
491 MODULE_LICENSE("GPL");
492 MODULE_ALIAS_NETPROTO(PF_BLUETOOTH);