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>
28 #include <asm/ioctls.h>
30 #include <net/bluetooth/bluetooth.h>
32 #define VERSION "2.16"
34 /* Bluetooth sockets */
35 #define BT_MAX_PROTO 8
36 static const struct net_proto_family
*bt_proto
[BT_MAX_PROTO
];
37 static DEFINE_RWLOCK(bt_proto_lock
);
39 static struct lock_class_key bt_lock_key
[BT_MAX_PROTO
];
40 static const char *const bt_key_strings
[BT_MAX_PROTO
] = {
41 "sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP",
42 "sk_lock-AF_BLUETOOTH-BTPROTO_HCI",
43 "sk_lock-AF_BLUETOOTH-BTPROTO_SCO",
44 "sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM",
45 "sk_lock-AF_BLUETOOTH-BTPROTO_BNEP",
46 "sk_lock-AF_BLUETOOTH-BTPROTO_CMTP",
47 "sk_lock-AF_BLUETOOTH-BTPROTO_HIDP",
48 "sk_lock-AF_BLUETOOTH-BTPROTO_AVDTP",
51 static struct lock_class_key bt_slock_key
[BT_MAX_PROTO
];
52 static const char *const bt_slock_key_strings
[BT_MAX_PROTO
] = {
53 "slock-AF_BLUETOOTH-BTPROTO_L2CAP",
54 "slock-AF_BLUETOOTH-BTPROTO_HCI",
55 "slock-AF_BLUETOOTH-BTPROTO_SCO",
56 "slock-AF_BLUETOOTH-BTPROTO_RFCOMM",
57 "slock-AF_BLUETOOTH-BTPROTO_BNEP",
58 "slock-AF_BLUETOOTH-BTPROTO_CMTP",
59 "slock-AF_BLUETOOTH-BTPROTO_HIDP",
60 "slock-AF_BLUETOOTH-BTPROTO_AVDTP",
63 void bt_sock_reclassify_lock(struct sock
*sk
, int proto
)
66 BUG_ON(sock_owned_by_user(sk
));
68 sock_lock_init_class_and_name(sk
,
69 bt_slock_key_strings
[proto
], &bt_slock_key
[proto
],
70 bt_key_strings
[proto
], &bt_lock_key
[proto
]);
72 EXPORT_SYMBOL(bt_sock_reclassify_lock
);
74 int bt_sock_register(int proto
, const struct net_proto_family
*ops
)
78 if (proto
< 0 || proto
>= BT_MAX_PROTO
)
81 write_lock(&bt_proto_lock
);
86 bt_proto
[proto
] = ops
;
88 write_unlock(&bt_proto_lock
);
92 EXPORT_SYMBOL(bt_sock_register
);
94 int bt_sock_unregister(int proto
)
98 if (proto
< 0 || proto
>= BT_MAX_PROTO
)
101 write_lock(&bt_proto_lock
);
103 if (!bt_proto
[proto
])
106 bt_proto
[proto
] = NULL
;
108 write_unlock(&bt_proto_lock
);
112 EXPORT_SYMBOL(bt_sock_unregister
);
114 static int bt_sock_create(struct net
*net
, struct socket
*sock
, int proto
,
119 if (net
!= &init_net
)
120 return -EAFNOSUPPORT
;
122 if (proto
< 0 || proto
>= BT_MAX_PROTO
)
125 if (!bt_proto
[proto
])
126 request_module("bt-proto-%d", proto
);
128 err
= -EPROTONOSUPPORT
;
130 read_lock(&bt_proto_lock
);
132 if (bt_proto
[proto
] && try_module_get(bt_proto
[proto
]->owner
)) {
133 err
= bt_proto
[proto
]->create(net
, sock
, proto
, kern
);
135 bt_sock_reclassify_lock(sock
->sk
, proto
);
136 module_put(bt_proto
[proto
]->owner
);
139 read_unlock(&bt_proto_lock
);
144 void bt_sock_link(struct bt_sock_list
*l
, struct sock
*sk
)
146 write_lock(&l
->lock
);
147 sk_add_node(sk
, &l
->head
);
148 write_unlock(&l
->lock
);
150 EXPORT_SYMBOL(bt_sock_link
);
152 void bt_sock_unlink(struct bt_sock_list
*l
, struct sock
*sk
)
154 write_lock(&l
->lock
);
155 sk_del_node_init(sk
);
156 write_unlock(&l
->lock
);
158 EXPORT_SYMBOL(bt_sock_unlink
);
160 void bt_accept_enqueue(struct sock
*parent
, struct sock
*sk
)
162 BT_DBG("parent %p, sk %p", parent
, sk
);
165 list_add_tail(&bt_sk(sk
)->accept_q
, &bt_sk(parent
)->accept_q
);
166 bt_sk(sk
)->parent
= parent
;
167 parent
->sk_ack_backlog
++;
169 EXPORT_SYMBOL(bt_accept_enqueue
);
171 void bt_accept_unlink(struct sock
*sk
)
173 BT_DBG("sk %p state %d", sk
, sk
->sk_state
);
175 list_del_init(&bt_sk(sk
)->accept_q
);
176 bt_sk(sk
)->parent
->sk_ack_backlog
--;
177 bt_sk(sk
)->parent
= NULL
;
180 EXPORT_SYMBOL(bt_accept_unlink
);
182 struct sock
*bt_accept_dequeue(struct sock
*parent
, struct socket
*newsock
)
184 struct list_head
*p
, *n
;
187 BT_DBG("parent %p", parent
);
189 list_for_each_safe(p
, n
, &bt_sk(parent
)->accept_q
) {
190 sk
= (struct sock
*) list_entry(p
, struct bt_sock
, accept_q
);
194 /* FIXME: Is this check still needed */
195 if (sk
->sk_state
== BT_CLOSED
) {
197 bt_accept_unlink(sk
);
201 if (sk
->sk_state
== BT_CONNECTED
|| !newsock
||
202 test_bit(BT_SK_DEFER_SETUP
, &bt_sk(parent
)->flags
)) {
203 bt_accept_unlink(sk
);
205 sock_graft(sk
, newsock
);
216 EXPORT_SYMBOL(bt_accept_dequeue
);
218 int bt_sock_recvmsg(struct kiocb
*iocb
, struct socket
*sock
,
219 struct msghdr
*msg
, size_t len
, int flags
)
221 int noblock
= flags
& MSG_DONTWAIT
;
222 struct sock
*sk
= sock
->sk
;
227 BT_DBG("sock %p sk %p len %zu", sock
, sk
, len
);
229 if (flags
& (MSG_OOB
))
232 skb
= skb_recv_datagram(sk
, flags
, noblock
, &err
);
234 if (sk
->sk_shutdown
& RCV_SHUTDOWN
)
239 msg
->msg_namelen
= 0;
243 msg
->msg_flags
|= MSG_TRUNC
;
247 skb_reset_transport_header(skb
);
248 err
= skb_copy_datagram_iovec(skb
, 0, msg
->msg_iov
, copied
);
250 sock_recv_ts_and_drops(msg
, sk
, skb
);
252 skb_free_datagram(sk
, skb
);
254 return err
? : copied
;
256 EXPORT_SYMBOL(bt_sock_recvmsg
);
258 static long bt_sock_data_wait(struct sock
*sk
, long timeo
)
260 DECLARE_WAITQUEUE(wait
, current
);
262 add_wait_queue(sk_sleep(sk
), &wait
);
264 set_current_state(TASK_INTERRUPTIBLE
);
266 if (!skb_queue_empty(&sk
->sk_receive_queue
))
269 if (sk
->sk_err
|| (sk
->sk_shutdown
& RCV_SHUTDOWN
))
272 if (signal_pending(current
) || !timeo
)
275 set_bit(SOCK_ASYNC_WAITDATA
, &sk
->sk_socket
->flags
);
277 timeo
= schedule_timeout(timeo
);
279 clear_bit(SOCK_ASYNC_WAITDATA
, &sk
->sk_socket
->flags
);
282 __set_current_state(TASK_RUNNING
);
283 remove_wait_queue(sk_sleep(sk
), &wait
);
287 int bt_sock_stream_recvmsg(struct kiocb
*iocb
, struct socket
*sock
,
288 struct msghdr
*msg
, size_t size
, int flags
)
290 struct sock
*sk
= sock
->sk
;
292 size_t target
, copied
= 0;
298 msg
->msg_namelen
= 0;
300 BT_DBG("sk %p size %zu", sk
, size
);
304 target
= sock_rcvlowat(sk
, flags
& MSG_WAITALL
, size
);
305 timeo
= sock_rcvtimeo(sk
, flags
& MSG_DONTWAIT
);
311 skb
= skb_dequeue(&sk
->sk_receive_queue
);
313 if (copied
>= target
)
316 err
= sock_error(sk
);
319 if (sk
->sk_shutdown
& RCV_SHUTDOWN
)
326 timeo
= bt_sock_data_wait(sk
, timeo
);
328 if (signal_pending(current
)) {
329 err
= sock_intr_errno(timeo
);
335 chunk
= min_t(unsigned int, skb
->len
, size
);
336 if (skb_copy_datagram_iovec(skb
, 0, msg
->msg_iov
, chunk
)) {
337 skb_queue_head(&sk
->sk_receive_queue
, skb
);
345 sock_recv_ts_and_drops(msg
, sk
, skb
);
347 if (!(flags
& MSG_PEEK
)) {
348 int skb_len
= skb_headlen(skb
);
350 if (chunk
<= skb_len
) {
351 __skb_pull(skb
, chunk
);
353 struct sk_buff
*frag
;
355 __skb_pull(skb
, skb_len
);
358 skb_walk_frags(skb
, frag
) {
359 if (chunk
<= frag
->len
) {
360 /* Pulling partial data */
362 skb
->data_len
-= chunk
;
363 __skb_pull(frag
, chunk
);
365 } else if (frag
->len
) {
366 /* Pulling all frag data */
368 skb
->len
-= frag
->len
;
369 skb
->data_len
-= frag
->len
;
370 __skb_pull(frag
, frag
->len
);
376 skb_queue_head(&sk
->sk_receive_queue
, skb
);
382 /* put message back and return */
383 skb_queue_head(&sk
->sk_receive_queue
, skb
);
390 return copied
? : err
;
392 EXPORT_SYMBOL(bt_sock_stream_recvmsg
);
394 static inline unsigned int bt_accept_poll(struct sock
*parent
)
396 struct list_head
*p
, *n
;
399 list_for_each_safe(p
, n
, &bt_sk(parent
)->accept_q
) {
400 sk
= (struct sock
*) list_entry(p
, struct bt_sock
, accept_q
);
401 if (sk
->sk_state
== BT_CONNECTED
||
402 (test_bit(BT_SK_DEFER_SETUP
, &bt_sk(parent
)->flags
) &&
403 sk
->sk_state
== BT_CONNECT2
))
404 return POLLIN
| POLLRDNORM
;
410 unsigned int bt_sock_poll(struct file
*file
, struct socket
*sock
,
413 struct sock
*sk
= sock
->sk
;
414 unsigned int mask
= 0;
416 BT_DBG("sock %p, sk %p", sock
, sk
);
418 poll_wait(file
, sk_sleep(sk
), wait
);
420 if (sk
->sk_state
== BT_LISTEN
)
421 return bt_accept_poll(sk
);
423 if (sk
->sk_err
|| !skb_queue_empty(&sk
->sk_error_queue
))
426 if (sk
->sk_shutdown
& RCV_SHUTDOWN
)
427 mask
|= POLLRDHUP
| POLLIN
| POLLRDNORM
;
429 if (sk
->sk_shutdown
== SHUTDOWN_MASK
)
432 if (!skb_queue_empty(&sk
->sk_receive_queue
))
433 mask
|= POLLIN
| POLLRDNORM
;
435 if (sk
->sk_state
== BT_CLOSED
)
438 if (sk
->sk_state
== BT_CONNECT
||
439 sk
->sk_state
== BT_CONNECT2
||
440 sk
->sk_state
== BT_CONFIG
)
443 if (!test_bit(BT_SK_SUSPEND
, &bt_sk(sk
)->flags
) && sock_writeable(sk
))
444 mask
|= POLLOUT
| POLLWRNORM
| POLLWRBAND
;
446 set_bit(SOCK_ASYNC_NOSPACE
, &sk
->sk_socket
->flags
);
450 EXPORT_SYMBOL(bt_sock_poll
);
452 int bt_sock_ioctl(struct socket
*sock
, unsigned int cmd
, unsigned long arg
)
454 struct sock
*sk
= sock
->sk
;
459 BT_DBG("sk %p cmd %x arg %lx", sk
, cmd
, arg
);
463 if (sk
->sk_state
== BT_LISTEN
)
466 amount
= sk
->sk_sndbuf
- sk_wmem_alloc_get(sk
);
469 err
= put_user(amount
, (int __user
*) arg
);
473 if (sk
->sk_state
== BT_LISTEN
)
477 skb
= skb_peek(&sk
->sk_receive_queue
);
478 amount
= skb
? skb
->len
: 0;
480 err
= put_user(amount
, (int __user
*) arg
);
484 err
= sock_get_timestamp(sk
, (struct timeval __user
*) arg
);
488 err
= sock_get_timestampns(sk
, (struct timespec __user
*) arg
);
498 EXPORT_SYMBOL(bt_sock_ioctl
);
500 int bt_sock_wait_state(struct sock
*sk
, int state
, unsigned long timeo
)
502 DECLARE_WAITQUEUE(wait
, current
);
507 add_wait_queue(sk_sleep(sk
), &wait
);
508 set_current_state(TASK_INTERRUPTIBLE
);
509 while (sk
->sk_state
!= state
) {
515 if (signal_pending(current
)) {
516 err
= sock_intr_errno(timeo
);
521 timeo
= schedule_timeout(timeo
);
523 set_current_state(TASK_INTERRUPTIBLE
);
525 err
= sock_error(sk
);
529 __set_current_state(TASK_RUNNING
);
530 remove_wait_queue(sk_sleep(sk
), &wait
);
533 EXPORT_SYMBOL(bt_sock_wait_state
);
535 static struct net_proto_family bt_sock_family_ops
= {
536 .owner
= THIS_MODULE
,
537 .family
= PF_BLUETOOTH
,
538 .create
= bt_sock_create
,
541 static int __init
bt_init(void)
545 BT_INFO("Core ver %s", VERSION
);
547 err
= bt_sysfs_init();
551 err
= sock_register(&bt_sock_family_ops
);
557 BT_INFO("HCI device and connection manager initialized");
559 err
= hci_sock_init();
579 sock_unregister(PF_BLUETOOTH
);
585 static void __exit
bt_exit(void)
594 sock_unregister(PF_BLUETOOTH
);
599 subsys_initcall(bt_init
);
600 module_exit(bt_exit
);
602 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
603 MODULE_DESCRIPTION("Bluetooth Core ver " VERSION
);
604 MODULE_VERSION(VERSION
);
605 MODULE_LICENSE("GPL");
606 MODULE_ALIAS_NETPROTO(PF_BLUETOOTH
);