Skip to content

Commit 3241ad8

Browse files
committed
[Bluetooth] Add timestamp support to L2CAP, RFCOMM and SCO
Enable the common timestamp functionality that the network subsystem provides for L2CAP, RFCOMM and SCO sockets. It is possible to either use SO_TIMESTAMP or the IOCTLs to retrieve the timestamp of the current packet. Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
1 parent 40be492 commit 3241ad8

File tree

5 files changed

+42
-6
lines changed

5 files changed

+42
-6
lines changed

include/net/bluetooth/bluetooth.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ void bt_sock_link(struct bt_sock_list *l, struct sock *s);
121121
void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
122122
int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags);
123123
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);
124125
int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
125126

126127
void bt_accept_enqueue(struct sock *parent, struct sock *sk);

net/bluetooth/af_bluetooth.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <linux/init.h>
3737
#include <linux/poll.h>
3838
#include <net/sock.h>
39+
#include <asm/ioctls.h>
3940

4041
#if defined(CONFIG_KMOD)
4142
#include <linux/kmod.h>
@@ -266,6 +267,8 @@ int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
266267

267268
skb_reset_transport_header(skb);
268269
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
270+
if (err == 0)
271+
sock_recv_timestamp(msg, sk, skb);
269272

270273
skb_free_datagram(sk, skb);
271274

@@ -329,6 +332,31 @@ unsigned int bt_sock_poll(struct file * file, struct socket *sock, poll_table *w
329332
}
330333
EXPORT_SYMBOL(bt_sock_poll);
331334

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+
332360
int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
333361
{
334362
DECLARE_WAITQUEUE(wait, current);

net/bluetooth/l2cap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2388,9 +2388,9 @@ static const struct proto_ops l2cap_sock_ops = {
23882388
.sendmsg = l2cap_sock_sendmsg,
23892389
.recvmsg = bt_sock_recvmsg,
23902390
.poll = bt_sock_poll,
2391+
.ioctl = bt_sock_ioctl,
23912392
.mmap = sock_no_mmap,
23922393
.socketpair = sock_no_socketpair,
2393-
.ioctl = sock_no_ioctl,
23942394
.shutdown = l2cap_sock_shutdown,
23952395
.setsockopt = l2cap_sock_setsockopt,
23962396
.getsockopt = l2cap_sock_getsockopt

net/bluetooth/rfcomm/sock.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,8 @@ static int rfcomm_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
690690
copied += chunk;
691691
size -= chunk;
692692

693+
sock_recv_timestamp(msg, sk, skb);
694+
693695
if (!(flags & MSG_PEEK)) {
694696
atomic_sub(chunk, &sk->sk_rmem_alloc);
695697

@@ -795,15 +797,20 @@ static int rfcomm_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned lon
795797
struct sock *sk = sock->sk;
796798
int err;
797799

798-
lock_sock(sk);
800+
BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg);
799801

802+
err = bt_sock_ioctl(sock, cmd, arg);
803+
804+
if (err == -ENOIOCTLCMD) {
800805
#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);
802809
#else
803-
err = -EOPNOTSUPP;
810+
err = -EOPNOTSUPP;
804811
#endif
812+
}
805813

806-
release_sock(sk);
807814
return err;
808815
}
809816

net/bluetooth/sco.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -921,7 +921,7 @@ static const struct proto_ops sco_sock_ops = {
921921
.sendmsg = sco_sock_sendmsg,
922922
.recvmsg = bt_sock_recvmsg,
923923
.poll = bt_sock_poll,
924-
.ioctl = sock_no_ioctl,
924+
.ioctl = bt_sock_ioctl,
925925
.mmap = sock_no_mmap,
926926
.socketpair = sock_no_socketpair,
927927
.shutdown = sock_no_shutdown,

0 commit comments

Comments
 (0)