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>
40 #if defined(CONFIG_KMOD)
41 #include <linux/kmod.h>
44 #include <net/bluetooth/bluetooth.h>
46 #ifndef CONFIG_BT_SOCK_DEBUG
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
)
65 bt_proto
[proto
] = ops
;
68 EXPORT_SYMBOL(bt_sock_register
);
70 int bt_sock_unregister(int proto
)
72 if (proto
< 0 || proto
>= BT_MAX_PROTO
)
78 bt_proto
[proto
] = NULL
;
81 EXPORT_SYMBOL(bt_sock_unregister
);
83 static int bt_sock_create(struct socket
*sock
, int proto
)
87 if (proto
< 0 || proto
>= BT_MAX_PROTO
)
90 #if defined(CONFIG_KMOD)
91 if (!bt_proto
[proto
]) {
92 request_module("bt-proto-%d", proto
);
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
);
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
);
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
;
139 EXPORT_SYMBOL(bt_accept_unlink
);
141 struct sock
*bt_accept_dequeue(struct sock
*parent
, struct socket
*newsock
)
143 struct list_head
*p
, *n
;
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
);
153 /* FIXME: Is this check still needed */
154 if (sk
->sk_state
== BT_CLOSED
) {
156 bt_accept_unlink(sk
);
160 if (sk
->sk_state
== BT_CONNECTED
|| !newsock
) {
161 bt_accept_unlink(sk
);
163 sock_graft(sk
, newsock
);
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
;
183 BT_DBG("sock %p sk %p len %d", sock
, sk
, len
);
185 if (flags
& (MSG_OOB
))
188 if (!(skb
= skb_recv_datagram(sk
, flags
, noblock
, &err
))) {
189 if (sk
->sk_shutdown
& RCV_SHUTDOWN
)
194 msg
->msg_namelen
= 0;
198 msg
->msg_flags
|= MSG_TRUNC
;
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
;
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
;
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
))
240 if (sk
->sk_shutdown
& RCV_SHUTDOWN
)
243 if (sk
->sk_shutdown
== SHUTDOWN_MASK
)
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
)
253 if (sk
->sk_state
== BT_CONNECT
||
254 sk
->sk_state
== BT_CONNECT2
||
255 sk
->sk_state
== BT_CONFIG
)
258 if (sock_writeable(sk
))
259 mask
|= POLLOUT
| POLLWRNORM
| POLLWRBAND
;
261 set_bit(SOCK_ASYNC_NOSPACE
, &sk
->sk_socket
->flags
);
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
);
274 add_wait_queue(sk
->sk_sleep
, &wait
);
275 while (sk
->sk_state
!= state
) {
276 set_current_state(TASK_INTERRUPTIBLE
);
283 if (signal_pending(current
)) {
284 err
= sock_intr_errno(timeo
);
289 timeo
= schedule_timeout(timeo
);
292 err
= sock_error(sk
);
296 set_current_state(TASK_RUNNING
);
297 remove_wait_queue(sk
->sk_sleep
, &wait
);
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)
312 BT_INFO("Core ver %s", VERSION
);
314 err
= bt_sysfs_init();
318 err
= sock_register(&bt_sock_family_ops
);
324 BT_INFO("HCI device and connection manager initialized");
331 static void __exit
bt_exit(void)
335 sock_unregister(PF_BLUETOOTH
);
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
);