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 #ifdef CONFIG_ANDROID_PARANOID_NETWORK
45 #include <linux/android_aid.h>
48 #ifndef CONFIG_BT_SOCK_DEBUG
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
;
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
)
102 if (proto
< 0 || proto
>= BT_MAX_PROTO
)
105 write_lock(&bt_proto_lock
);
110 bt_proto
[proto
] = ops
;
112 write_unlock(&bt_proto_lock
);
116 EXPORT_SYMBOL(bt_sock_register
);
118 int bt_sock_unregister(int proto
)
122 if (proto
< 0 || proto
>= BT_MAX_PROTO
)
125 write_lock(&bt_proto_lock
);
127 if (!bt_proto
[proto
])
130 bt_proto
[proto
] = NULL
;
132 write_unlock(&bt_proto_lock
);
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
));
149 static inline int current_has_bt_admin(void)
154 static inline int current_has_bt(void)
160 static int bt_sock_create(struct net
*net
, struct socket
*sock
, int proto
)
164 if (proto
== BTPROTO_RFCOMM
|| proto
== BTPROTO_SCO
||
165 proto
== BTPROTO_L2CAP
) {
166 if (!current_has_bt())
168 } else if (!current_has_bt_admin())
171 if (net
!= &init_net
)
172 return -EAFNOSUPPORT
;
174 if (proto
< 0 || proto
>= BT_MAX_PROTO
)
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
);
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
);
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
;
231 EXPORT_SYMBOL(bt_accept_unlink
);
233 struct sock
*bt_accept_dequeue(struct sock
*parent
, struct socket
*newsock
)
235 struct list_head
*p
, *n
;
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
);
245 /* FIXME: Is this check still needed */
246 if (sk
->sk_state
== BT_CLOSED
) {
248 bt_accept_unlink(sk
);
252 if (sk
->sk_state
== BT_CONNECTED
|| !newsock
||
253 bt_sk(parent
)->defer_setup
) {
254 bt_accept_unlink(sk
);
256 sock_graft(sk
, newsock
);
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
;
276 BT_DBG("sock %p sk %p len %zu", sock
, sk
, len
);
278 if (flags
& (MSG_OOB
))
281 if (!(skb
= skb_recv_datagram(sk
, flags
, noblock
, &err
))) {
282 if (sk
->sk_shutdown
& RCV_SHUTDOWN
)
287 msg
->msg_namelen
= 0;
291 msg
->msg_flags
|= MSG_TRUNC
;
295 skb_reset_transport_header(skb
);
296 err
= skb_copy_datagram_iovec(skb
, 0, msg
->msg_iov
, copied
);
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
;
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
;
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
))
337 if (sk
->sk_shutdown
& RCV_SHUTDOWN
)
340 if (sk
->sk_shutdown
== SHUTDOWN_MASK
)
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
)
350 if (sk
->sk_state
== BT_CONNECT
||
351 sk
->sk_state
== BT_CONNECT2
||
352 sk
->sk_state
== BT_CONFIG
)
355 if (sock_writeable(sk
))
356 mask
|= POLLOUT
| POLLWRNORM
| POLLWRBAND
;
358 set_bit(SOCK_ASYNC_NOSPACE
, &sk
->sk_socket
->flags
);
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
;
371 BT_DBG("sk %p cmd %x arg %lx", sk
, cmd
, arg
);
375 if (sk
->sk_state
== BT_LISTEN
)
378 amount
= sk
->sk_sndbuf
- sk_wmem_alloc_get(sk
);
381 err
= put_user(amount
, (int __user
*) arg
);
385 if (sk
->sk_state
== BT_LISTEN
)
389 skb
= skb_peek(&sk
->sk_receive_queue
);
390 amount
= skb
? skb
->len
: 0;
392 err
= put_user(amount
, (int __user
*) arg
);
396 err
= sock_get_timestamp(sk
, (struct timeval __user
*) arg
);
400 err
= sock_get_timestampns(sk
, (struct timespec __user
*) arg
);
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
);
419 add_wait_queue(sk
->sk_sleep
, &wait
);
420 while (sk
->sk_state
!= state
) {
421 set_current_state(TASK_INTERRUPTIBLE
);
428 if (signal_pending(current
)) {
429 err
= sock_intr_errno(timeo
);
434 timeo
= schedule_timeout(timeo
);
437 err
= sock_error(sk
);
441 set_current_state(TASK_RUNNING
);
442 remove_wait_queue(sk
->sk_sleep
, &wait
);
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)
457 BT_INFO("Core ver %s", VERSION
);
459 err
= bt_sysfs_init();
463 err
= sock_register(&bt_sock_family_ops
);
469 BT_INFO("HCI device and connection manager initialized");
476 static void __exit
bt_exit(void)
480 sock_unregister(PF_BLUETOOTH
);
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
);