can: raw: add support for SO_TXTIME/SCM_TXTIME
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>
This commit is contained in:
@ -772,6 +772,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
|
|||||||
{
|
{
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = sock->sk;
|
||||||
struct raw_sock *ro = raw_sk(sk);
|
struct raw_sock *ro = raw_sk(sk);
|
||||||
|
struct sockcm_cookie sockc;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
int ifindex;
|
int ifindex;
|
||||||
@ -817,10 +818,18 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
|
|||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto free_skb;
|
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->dev = dev;
|
||||||
skb->priority = sk->sk_priority;
|
skb->priority = sk->sk_priority;
|
||||||
|
skb->tstamp = sockc.transmit_time;
|
||||||
|
|
||||||
|
skb_setup_tx_timestamp(skb, sockc.tsflags);
|
||||||
|
|
||||||
err = can_send(skb, ro->loopback);
|
err = can_send(skb, ro->loopback);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user