]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
can: raw: add support for SO_TXTIME/SCM_TXTIME
authorMarc Kleine-Budde <mkl@pengutronix.de>
Thu, 21 Apr 2022 10:31:52 +0000 (12:31 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 15 Jan 2024 17:51:13 +0000 (18:51 +0100)
[ Upstream commit 51a0d5e51178fcd147c1b8fdab2ed16b561326db ]

This patch calls into sock_cmsg_send() to parse the user supplied
control information into a struct sockcm_cookie. Then assign the
requested transmit time to the skb.

This makes it possible to use the Earliest TXTIME First (ETF) packet
scheduler with the CAN_RAW protocol. The user can send a CAN_RAW frame
with a TXTIME and the kernel (with the ETF scheduler) will take care
of sending it to the network interface.

Link: https://lore.kernel.org/all/20220502091946.1916211-3-mkl@pengutronix.de
Acked-by: Oliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Stable-dep-of: 7f6ca95d16b9 ("net: Implement missing getsockopt(SO_TIMESTAMPING_NEW)")
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/can/raw.c

index 8877d22da67ee040ee584201201c6be13927a05e..ed8834b853bee37ff0a0d82188470e48169cbaf9 100644 (file)
@@ -780,6 +780,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
 {
        struct sock *sk = sock->sk;
        struct raw_sock *ro = raw_sk(sk);
+       struct sockcm_cookie sockc;
        struct sk_buff *skb;
        struct net_device *dev;
        int ifindex;
@@ -825,11 +826,19 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
        if (err < 0)
                goto free_skb;
 
-       skb_setup_tx_timestamp(skb, sk->sk_tsflags);
+       sockcm_init(&sockc, sk);
+       if (msg->msg_controllen) {
+               err = sock_cmsg_send(sk, msg, &sockc);
+               if (unlikely(err))
+                       goto free_skb;
+       }
 
        skb->dev = dev;
        skb->sk = sk;
        skb->priority = sk->sk_priority;
+       skb->tstamp = sockc.transmit_time;
+
+       skb_setup_tx_timestamp(skb, sockc.tsflags);
 
        err = can_send(skb, ro->loopback);