[PATCH] x86: implement always-locked bit ops, for memory shared with an SMP hypervisor
[linux-2.6/mini2440.git] / net / bluetooth / af_bluetooth.c
blob788ea7a2b74498c10534501e62c3e91fd17c117e
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>
40 #if defined(CONFIG_KMOD)
41 #include <linux/kmod.h>
42 #endif
44 #include <net/bluetooth/bluetooth.h>
46 #ifndef CONFIG_BT_SOCK_DEBUG
47 #undef BT_DBG
48 #define BT_DBG(D...)
49 #endif
51 #define VERSION "2.10"
53 /* Bluetooth sockets */
54 #define BT_MAX_PROTO 8
55 static struct net_proto_family *bt_proto[BT_MAX_PROTO];
57 int bt_sock_register(int proto, struct net_proto_family *ops)
59 if (proto < 0 || proto >= BT_MAX_PROTO)
60 return -EINVAL;
62 if (bt_proto[proto])
63 return -EEXIST;
65 bt_proto[proto] = ops;
66 return 0;
68 EXPORT_SYMBOL(bt_sock_register);
70 int bt_sock_unregister(int proto)
72 if (proto < 0 || proto >= BT_MAX_PROTO)
73 return -EINVAL;
75 if (!bt_proto[proto])
76 return -ENOENT;
78 bt_proto[proto] = NULL;
79 return 0;
81 EXPORT_SYMBOL(bt_sock_unregister);
83 static int bt_sock_create(struct socket *sock, int proto)
85 int err = 0;
87 if (proto < 0 || proto >= BT_MAX_PROTO)
88 return -EINVAL;
90 #if defined(CONFIG_KMOD)
91 if (!bt_proto[proto]) {
92 request_module("bt-proto-%d", proto);
94 #endif
95 err = -EPROTONOSUPPORT;
96 if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
97 err = bt_proto[proto]->create(sock, proto);
98 module_put(bt_proto[proto]->owner);
100 return err;
103 void bt_sock_link(struct bt_sock_list *l, struct sock *sk)
105 write_lock_bh(&l->lock);
106 sk_add_node(sk, &l->head);
107 write_unlock_bh(&l->lock);
109 EXPORT_SYMBOL(bt_sock_link);
111 void bt_sock_unlink(struct bt_sock_list *l, struct sock *sk)
113 write_lock_bh(&l->lock);
114 sk_del_node_init(sk);
115 write_unlock_bh(&l->lock);
117 EXPORT_SYMBOL(bt_sock_unlink);
119 void bt_accept_enqueue(struct sock *parent, struct sock *sk)
121 BT_DBG("parent %p, sk %p", parent, sk);
123 sock_hold(sk);
124 list_add_tail(&bt_sk(sk)->accept_q, &bt_sk(parent)->accept_q);
125 bt_sk(sk)->parent = parent;
126 parent->sk_ack_backlog++;
128 EXPORT_SYMBOL(bt_accept_enqueue);
130 void bt_accept_unlink(struct sock *sk)
132 BT_DBG("sk %p state %d", sk, sk->sk_state);
134 list_del_init(&bt_sk(sk)->accept_q);
135 bt_sk(sk)->parent->sk_ack_backlog--;
136 bt_sk(sk)->parent = NULL;
137 sock_put(sk);
139 EXPORT_SYMBOL(bt_accept_unlink);
141 struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock)
143 struct list_head *p, *n;
144 struct sock *sk;
146 BT_DBG("parent %p", parent);
148 list_for_each_safe(p, n, &bt_sk(parent)->accept_q) {
149 sk = (struct sock *) list_entry(p, struct bt_sock, accept_q);
151 lock_sock(sk);
153 /* FIXME: Is this check still needed */
154 if (sk->sk_state == BT_CLOSED) {
155 release_sock(sk);
156 bt_accept_unlink(sk);
157 continue;
160 if (sk->sk_state == BT_CONNECTED || !newsock) {
161 bt_accept_unlink(sk);
162 if (newsock)
163 sock_graft(sk, newsock);
164 release_sock(sk);
165 return sk;
168 release_sock(sk);
170 return NULL;
172 EXPORT_SYMBOL(bt_accept_dequeue);
174 int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
175 struct msghdr *msg, size_t len, int flags)
177 int noblock = flags & MSG_DONTWAIT;
178 struct sock *sk = sock->sk;
179 struct sk_buff *skb;
180 size_t copied;
181 int err;
183 BT_DBG("sock %p sk %p len %d", sock, sk, len);
185 if (flags & (MSG_OOB))
186 return -EOPNOTSUPP;
188 if (!(skb = skb_recv_datagram(sk, flags, noblock, &err))) {
189 if (sk->sk_shutdown & RCV_SHUTDOWN)
190 return 0;
191 return err;
194 msg->msg_namelen = 0;
196 copied = skb->len;
197 if (len < copied) {
198 msg->msg_flags |= MSG_TRUNC;
199 copied = len;
202 skb->h.raw = skb->data;
203 err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
205 skb_free_datagram(sk, skb);
207 return err ? : copied;
209 EXPORT_SYMBOL(bt_sock_recvmsg);
211 static inline unsigned int bt_accept_poll(struct sock *parent)
213 struct list_head *p, *n;
214 struct sock *sk;
216 list_for_each_safe(p, n, &bt_sk(parent)->accept_q) {
217 sk = (struct sock *) list_entry(p, struct bt_sock, accept_q);
218 if (sk->sk_state == BT_CONNECTED)
219 return POLLIN | POLLRDNORM;
222 return 0;
225 unsigned int bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait)
227 struct sock *sk = sock->sk;
228 unsigned int mask = 0;
230 BT_DBG("sock %p, sk %p", sock, sk);
232 poll_wait(file, sk->sk_sleep, wait);
234 if (sk->sk_state == BT_LISTEN)
235 return bt_accept_poll(sk);
237 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
238 mask |= POLLERR;
240 if (sk->sk_shutdown & RCV_SHUTDOWN)
241 mask |= POLLRDHUP;
243 if (sk->sk_shutdown == SHUTDOWN_MASK)
244 mask |= POLLHUP;
246 if (!skb_queue_empty(&sk->sk_receive_queue) ||
247 (sk->sk_shutdown & RCV_SHUTDOWN))
248 mask |= POLLIN | POLLRDNORM;
250 if (sk->sk_state == BT_CLOSED)
251 mask |= POLLHUP;
253 if (sk->sk_state == BT_CONNECT ||
254 sk->sk_state == BT_CONNECT2 ||
255 sk->sk_state == BT_CONFIG)
256 return mask;
258 if (sock_writeable(sk))
259 mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
260 else
261 set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
263 return mask;
265 EXPORT_SYMBOL(bt_sock_poll);
267 int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
269 DECLARE_WAITQUEUE(wait, current);
270 int err = 0;
272 BT_DBG("sk %p", sk);
274 add_wait_queue(sk->sk_sleep, &wait);
275 while (sk->sk_state != state) {
276 set_current_state(TASK_INTERRUPTIBLE);
278 if (!timeo) {
279 err = -EAGAIN;
280 break;
283 if (signal_pending(current)) {
284 err = sock_intr_errno(timeo);
285 break;
288 release_sock(sk);
289 timeo = schedule_timeout(timeo);
290 lock_sock(sk);
292 err = sock_error(sk);
293 if (err)
294 break;
296 set_current_state(TASK_RUNNING);
297 remove_wait_queue(sk->sk_sleep, &wait);
298 return err;
300 EXPORT_SYMBOL(bt_sock_wait_state);
302 static struct net_proto_family bt_sock_family_ops = {
303 .owner = THIS_MODULE,
304 .family = PF_BLUETOOTH,
305 .create = bt_sock_create,
308 static int __init bt_init(void)
310 int err;
312 BT_INFO("Core ver %s", VERSION);
314 err = bt_sysfs_init();
315 if (err < 0)
316 return err;
318 err = sock_register(&bt_sock_family_ops);
319 if (err < 0) {
320 bt_sysfs_cleanup();
321 return err;
324 BT_INFO("HCI device and connection manager initialized");
326 hci_sock_init();
328 return 0;
331 static void __exit bt_exit(void)
333 hci_sock_cleanup();
335 sock_unregister(PF_BLUETOOTH);
337 bt_sysfs_cleanup();
340 subsys_initcall(bt_init);
341 module_exit(bt_exit);
343 MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
344 MODULE_DESCRIPTION("Bluetooth Core ver " VERSION);
345 MODULE_VERSION(VERSION);
346 MODULE_LICENSE("GPL");
347 MODULE_ALIAS_NETPROTO(PF_BLUETOOTH);