diff options
author | Vincent Mailhol <mailhol.vincent@wanadoo.fr> | 2021-01-12 10:54:37 +0100 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2021-01-14 08:43:44 +0100 |
commit | 741b91f1b0ea34f00f6a7d4539b767c409291fcf (patch) | |
tree | f73dcd9c8325b554f81ec3fe369489a85a409f68 /drivers/net/can | |
parent | can: dev: can_rx_offload_get_echo_skb(): extend to return can frame length (diff) | |
download | linux-741b91f1b0ea34f00f6a7d4539b767c409291fcf.tar.xz linux-741b91f1b0ea34f00f6a7d4539b767c409291fcf.zip |
can: dev: can_put_echo_skb(): add software tx timestamps
Call skb_tx_timestamp() within can_put_echo_skb() so that a software tx
timestamp gets attached to the skb.
There two main reasons to include this call in can_put_echo_skb():
* It easily allow to enable the tx timestamp on all devices with
just one small change.
* According to Documentation/networking/timestamping.rst, the tx
timestamps should be generated in the device driver as close as possible,
but always prior to passing the packet to the network interface. During the
call to can_put_echo_skb(), the skb gets cloned meaning that the driver
should not dereference the skb variable anymore after can_put_echo_skb()
returns. This makes can_put_echo_skb() the very last place we can use the
skb without having to access the echo_skb[] array.
Remark: by default, skb_tx_timestamp() does nothing. It needs to be activated
by passing the SOF_TIMESTAMPING_TX_SOFTWARE flag either through socket options
or control messages.
References:
* Support for the error queue in CAN RAW sockets (which is needed for
tx timestamps) was introduced in:
https://git.kernel.org//torvalds/c/eb88531bdbfaafb827192d1fc6c5a3fcc4fadd96
* Put the call to skb_tx_timestamp() just before adding it to the
array:
https://lore.kernel.org/r/043c3ea1-6bdd-59c0-0269-27b2b5b36cec@victronenergy.com
* About Tx hardware timestamps
https://lore.kernel.org/r/20210111171152.GB11715@hoboy.vegasvil.org
Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Link: https://lore.kernel.org/r/20210112095437.6488-2-mailhol.vincent@wanadoo.fr
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can')
-rw-r--r-- | drivers/net/can/dev/skb.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c index 53683d4312f1..6a64fe410987 100644 --- a/drivers/net/can/dev/skb.c +++ b/drivers/net/can/dev/skb.c @@ -65,6 +65,8 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, /* save frame_len to reuse it when transmission is completed */ can_skb_prv(skb)->frame_len = frame_len; + skb_tx_timestamp(skb); + /* save this skb for tx interrupt echo handling */ priv->echo_skb[idx] = skb; } else { |