diff options
-rw-r--r-- | include/net/bluetooth/bluetooth.h | 1 | ||||
-rw-r--r-- | net/bluetooth/af_bluetooth.c | 28 | ||||
-rw-r--r-- | net/bluetooth/l2cap.c | 2 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/sock.c | 15 | ||||
-rw-r--r-- | net/bluetooth/sco.c | 2 |
5 files changed, 42 insertions, 6 deletions
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 750648df13f4..6f8418bf4241 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
@@ -121,6 +121,7 @@ void bt_sock_link(struct bt_sock_list *l, struct sock *s); | |||
121 | void bt_sock_unlink(struct bt_sock_list *l, struct sock *s); | 121 | void bt_sock_unlink(struct bt_sock_list *l, struct sock *s); |
122 | int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags); | 122 | int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags); |
123 | uint bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait); | 123 | uint bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait); |
124 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); | ||
124 | int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo); | 125 | int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo); |
125 | 126 | ||
126 | void bt_accept_enqueue(struct sock *parent, struct sock *sk); | 127 | void bt_accept_enqueue(struct sock *parent, struct sock *sk); |
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index d366423c8392..88afe25003d8 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/init.h> | 36 | #include <linux/init.h> |
37 | #include <linux/poll.h> | 37 | #include <linux/poll.h> |
38 | #include <net/sock.h> | 38 | #include <net/sock.h> |
39 | #include <asm/ioctls.h> | ||
39 | 40 | ||
40 | #if defined(CONFIG_KMOD) | 41 | #if defined(CONFIG_KMOD) |
41 | #include <linux/kmod.h> | 42 | #include <linux/kmod.h> |
@@ -266,6 +267,8 @@ int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
266 | 267 | ||
267 | skb_reset_transport_header(skb); | 268 | skb_reset_transport_header(skb); |
268 | err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); | 269 | err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); |
270 | if (err == 0) | ||
271 | sock_recv_timestamp(msg, sk, skb); | ||
269 | 272 | ||
270 | skb_free_datagram(sk, skb); | 273 | skb_free_datagram(sk, skb); |
271 | 274 | ||
@@ -329,6 +332,31 @@ unsigned int bt_sock_poll(struct file * file, struct socket *sock, poll_table *w | |||
329 | } | 332 | } |
330 | EXPORT_SYMBOL(bt_sock_poll); | 333 | EXPORT_SYMBOL(bt_sock_poll); |
331 | 334 | ||
335 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | ||
336 | { | ||
337 | struct sock *sk = sock->sk; | ||
338 | int err; | ||
339 | |||
340 | BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg); | ||
341 | |||
342 | switch (cmd) { | ||
343 | case SIOCGSTAMP: | ||
344 | err = sock_get_timestamp(sk, (struct timeval __user *) arg); | ||
345 | break; | ||
346 | |||
347 | case SIOCGSTAMPNS: | ||
348 | err = sock_get_timestampns(sk, (struct timespec __user *) arg); | ||
349 | break; | ||
350 | |||
351 | default: | ||
352 | err = -ENOIOCTLCMD; | ||
353 | break; | ||
354 | } | ||
355 | |||
356 | return err; | ||
357 | } | ||
358 | EXPORT_SYMBOL(bt_sock_ioctl); | ||
359 | |||
332 | int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo) | 360 | int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo) |
333 | { | 361 | { |
334 | DECLARE_WAITQUEUE(wait, current); | 362 | DECLARE_WAITQUEUE(wait, current); |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 30ad59b717d5..4fcf24af7590 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -2388,9 +2388,9 @@ static const struct proto_ops l2cap_sock_ops = { | |||
2388 | .sendmsg = l2cap_sock_sendmsg, | 2388 | .sendmsg = l2cap_sock_sendmsg, |
2389 | .recvmsg = bt_sock_recvmsg, | 2389 | .recvmsg = bt_sock_recvmsg, |
2390 | .poll = bt_sock_poll, | 2390 | .poll = bt_sock_poll, |
2391 | .ioctl = bt_sock_ioctl, | ||
2391 | .mmap = sock_no_mmap, | 2392 | .mmap = sock_no_mmap, |
2392 | .socketpair = sock_no_socketpair, | 2393 | .socketpair = sock_no_socketpair, |
2393 | .ioctl = sock_no_ioctl, | ||
2394 | .shutdown = l2cap_sock_shutdown, | 2394 | .shutdown = l2cap_sock_shutdown, |
2395 | .setsockopt = l2cap_sock_setsockopt, | 2395 | .setsockopt = l2cap_sock_setsockopt, |
2396 | .getsockopt = l2cap_sock_getsockopt | 2396 | .getsockopt = l2cap_sock_getsockopt |
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index cacb1ab51f99..c3ed076481d8 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
@@ -690,6 +690,8 @@ static int rfcomm_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
690 | copied += chunk; | 690 | copied += chunk; |
691 | size -= chunk; | 691 | size -= chunk; |
692 | 692 | ||
693 | sock_recv_timestamp(msg, sk, skb); | ||
694 | |||
693 | if (!(flags & MSG_PEEK)) { | 695 | if (!(flags & MSG_PEEK)) { |
694 | atomic_sub(chunk, &sk->sk_rmem_alloc); | 696 | atomic_sub(chunk, &sk->sk_rmem_alloc); |
695 | 697 | ||
@@ -795,15 +797,20 @@ static int rfcomm_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned lon | |||
795 | struct sock *sk = sock->sk; | 797 | struct sock *sk = sock->sk; |
796 | int err; | 798 | int err; |
797 | 799 | ||
798 | lock_sock(sk); | 800 | BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg); |
799 | 801 | ||
802 | err = bt_sock_ioctl(sock, cmd, arg); | ||
803 | |||
804 | if (err == -ENOIOCTLCMD) { | ||
800 | #ifdef CONFIG_BT_RFCOMM_TTY | 805 | #ifdef CONFIG_BT_RFCOMM_TTY |
801 | err = rfcomm_dev_ioctl(sk, cmd, (void __user *)arg); | 806 | lock_sock(sk); |
807 | err = rfcomm_dev_ioctl(sk, cmd, (void __user *) arg); | ||
808 | release_sock(sk); | ||
802 | #else | 809 | #else |
803 | err = -EOPNOTSUPP; | 810 | err = -EOPNOTSUPP; |
804 | #endif | 811 | #endif |
812 | } | ||
805 | 813 | ||
806 | release_sock(sk); | ||
807 | return err; | 814 | return err; |
808 | } | 815 | } |
809 | 816 | ||
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index b0d487e2db20..1ad226c9788c 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
@@ -921,7 +921,7 @@ static const struct proto_ops sco_sock_ops = { | |||
921 | .sendmsg = sco_sock_sendmsg, | 921 | .sendmsg = sco_sock_sendmsg, |
922 | .recvmsg = bt_sock_recvmsg, | 922 | .recvmsg = bt_sock_recvmsg, |
923 | .poll = bt_sock_poll, | 923 | .poll = bt_sock_poll, |
924 | .ioctl = sock_no_ioctl, | 924 | .ioctl = bt_sock_ioctl, |
925 | .mmap = sock_no_mmap, | 925 | .mmap = sock_no_mmap, |
926 | .socketpair = sock_no_socketpair, | 926 | .socketpair = sock_no_socketpair, |
927 | .shutdown = sock_no_shutdown, | 927 | .shutdown = sock_no_shutdown, |