can-dev: fix real payload length return value for RTR frames
RFC PATCH 1/1 can-dev: fix real payload length return value for RTR frames
The can_get_echo_skb() function returns the number of received bytes to be used for netdev statistics. In the case of RTR frames we get a valid (potential non-zero) data length value which has to be passed for further operations. But on the wire RTR frames have no payload length. Therefore the value to be used in the statistics has to be zero for RTR frames.
--- drivers/net/can/dev.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/net/can/dev.c +6 -2
@@ -510,13 +510,17 @@ __can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr)/* Using "struct canfd_frame::len" for the frame * length is supported on both CAN and CANFD frames. */ struct sk_buff *skb = priv->echo_skb[idx];struct canfd_frame *cf = (struct canfd_frame *)skb->data; -u8 len = cf->len; - *len_ptr = len; +/* get the real payload length for netdev statistics */ +if (cf->can_id &CAN_RTR_FLAG ) + *len_ptr =0 ; +else + *len_ptr = cf->len; + priv->echo_skb[idx] =NULL ;return skb; }
Signature · 1 line
2.28.0
Marc Kleine-Budde
maintainerQuoted 26 lines · Oliver Hartkopp
The
can_get_echo_skb()function returns the number of received bytes to be used for netdev statistics. In the case of RTR frames we get a valid (potential non-zero) data length value which has to be passed for further operations. But on the wire RTR frames have no payload length. Therefore the value to be used in the statistics has to be zero for RTR frames.Reported-by Vincent Mailhol <[email protected]>Signed-off-by Oliver Hartkopp <[email protected]>--- drivers/net/can/dev.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)drivers/net/can/dev.c +0
-2@@ -510,13 +510,17 @@ __can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr)/* Using "struct canfd_frame::len" for the frame * length is supported on both CAN and CANFD frames. */ struct sk_buff *skb = priv->echo_skb[idx];struct canfd_frame *cf = (struct canfd_frame *)skb->data; -u8 len = cf->len; - *len_ptr = len;
drivers/net/can/dev.c __can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr) · line 525
Quoted 10 lines
drivers/net/can/dev.c +6
-0+/* get the real payload length for netdev statistics */ +if (cf->can_id &CAN_RTR_FLAG ) + *len_ptr =0 ; +else + *len_ptr = cf->len; + priv->echo_skb[idx] =NULL ;return skb; }
Looks good. I've replaced patches 4 and 5 by this one.
tnx,
Marc
Signature · 4 lines
Pengutronix e.K. | Marc Kleine-Budde | Embedded Linux | https://www.pengutronix.de | Vertretung West/Dortmund | Phone: +49-231-2826-924 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |