All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Kleine-Budde <mkl@pengutronix.de>
To: Oliver Hartkopp <socketcan@hartkopp.net>, linux-can@vger.kernel.org
Cc: Vincent Mailhol <mailhol.vincent@wanadoo.fr>, kernel@pengutronix.de
Subject: Re: [net-rfc 04/16] can: dev: can_get_len(): add a helper function to get the correct length of Classical frames
Date: Tue, 20 Oct 2020 08:35:34 +0200	[thread overview]
Message-ID: <ebf50f35-f093-b2c9-a27c-cef73d403efb@pengutronix.de> (raw)
In-Reply-To: <fbbe1b80-c012-dc87-1eb0-4878cd08cce1@hartkopp.net>


[-- Attachment #1.1: Type: text/plain, Size: 3533 bytes --]

On 10/19/20 10:35 PM, Oliver Hartkopp wrote:
> 
> 
> On 19.10.20 21:05, Marc Kleine-Budde wrote:
>> From: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
>>
>> In classical CAN, the length of the data (i.e. CAN payload) is not
>> always equal to the DLC! If the frame is a Remote Transmission Request
>> (RTR), data length is always zero regardless of DLC value and else, if
>> the DLC is greater than 8, the length is 8. Contrary to common belief,
>> ISO 11898-1 Chapter 8.4.2.3 (DLC field) do allow DLCs greater than 8
>> for Classical Frames and specifies that those DLCs shall indicate that
>> the data field is 8 bytes long.
>>
>> Above facts are widely unknown and so many developpers uses the "len"
>> field of "struct canfd_frame" to get the length of classical CAN
>> frames: this is incorrect!
>>
>> This patch introduces function get_can_len() which can be used in
>> remediation. The function takes the SKB as an input in order to be
>> able to determine if the frame is classical or FD.
>>
>> Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
>> Link: https://lore.kernel.org/r/20201002154219.4887-4-mailhol.vincent@wanadoo.fr
>> [mkl: renamed get_can_len() -> can_get_len()]
>> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
>> ---
>>   include/linux/can/dev.h | 23 +++++++++++++++++++++++
>>   1 file changed, 23 insertions(+)
>>
>> diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
>> index 41ff31795320..2bb132fc6d88 100644
>> --- a/include/linux/can/dev.h
>> +++ b/include/linux/can/dev.h
>> @@ -192,6 +192,29 @@ u8 can_dlc2len(u8 can_dlc);
>>   /* map the sanitized data length to an appropriate data length code */
>>   u8 can_len2dlc(u8 len);
>>   
>> +/*
>> + * can_get_len(skb) - get the length of the CAN payload.
>> + *
>> + * In classical CAN, the length of the data (i.e. CAN payload) is not
>> + * always equal to the DLC! If the frame is a Remote Transmission
>> + * Request (RTR), data length is always zero regardless of DLC value
>> + * and else, if the DLC is greater than 8, the length is 8. Contrary
>> + * to common belief, ISO 11898-1 Chapter 8.4.2.3 (DLC field) do allow
>> + * DLCs greater than 8 for Classical Frames and specifies that those
>> + * DLCs shall indicate that the data field is 8 bytes long.
>> + */
>> +static inline u8 can_get_len(const struct sk_buff *skb)
>> +{
>> +	const struct canfd_frame *cf = (const struct canfd_frame *)skb->data;
>> +
>> +	if (can_is_canfd_skb(skb))
>> +		return min_t(u8, cf->len, CANFD_MAX_DLEN);
>> +	else if (cf->can_id & CAN_RTR_FLAG)
>> +		return 0;
>> +	else
>> +		return min_t(u8, cf->len, CAN_MAX_DLEN);
>> +}
> 
> The main idea behind this patch and patch 05/16 is to provide a correct 
> statistic in the tx bytes, right?
> 
> A simple test for the CAN_RTR_FLAG will do the job as all the length 
> sanitizing is already done in the tx path by can_dropped_invalid_skb() 
> in all known drivers right *before* the skb is stored in the echo skb array.
> 
> IMO there's no need for a separate helper function. Maybe a macro which 
> should have something with 'payload' in its name - to determine the tx 
> byte statistics based on CAN_RTR_FLAG ...

Good point!

Marc

-- 
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 |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  reply	other threads:[~2020-10-20  6:40 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-19 19:05 [RFC]: can 2020-10-19 Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 01/16] can: proc: can_remove_proc(): silence remove_proc_entry warning Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 02/16] can: rx-offload: don't call kfree_skb() from IRQ context Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 03/16] can: dev: can_get_echo_skb(): prevent call to kfree_skb() in hard " Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 04/16] can: dev: can_get_len(): add a helper function to get the correct length of Classical frames Marc Kleine-Budde
2020-10-19 20:35   ` Oliver Hartkopp
2020-10-20  6:35     ` Marc Kleine-Budde [this message]
2020-10-20 11:30       ` Vincent Mailhol
2020-10-20 11:48         ` Marc Kleine-Budde
2020-10-20 12:38         ` Oliver Hartkopp
2020-10-20 15:02           ` Marc Kleine-Budde
2020-10-20 16:07           ` Vincent Mailhol
2020-10-20 17:04             ` Oliver Hartkopp
2020-10-20 18:50               ` Marc Kleine-Budde
2020-10-21  0:52               ` Vincent Mailhol
2020-10-21  6:23                 ` Vincent MAILHOL
2020-10-21  7:11                   ` Joakim Zhang
2020-10-21  7:21                     ` Marc Kleine-Budde
2020-10-21  7:48                       ` Joakim Zhang
2020-10-21  9:21                   ` Oliver Hartkopp
2020-10-21  9:48                     ` Oliver Hartkopp
2020-10-21 11:55                     ` Vincent MAILHOL
2020-10-21 17:52                       ` Oliver Hartkopp
2020-10-22  3:30                         ` Vincent MAILHOL
2020-10-22  7:15                           ` Oliver Hartkopp
2020-10-22 12:23                             ` Vincent MAILHOL
2020-10-22 13:28                               ` Oliver Hartkopp
2020-10-22 15:46                                 ` Vincent MAILHOL
2020-10-22 17:06                                   ` Oliver Hartkopp
2020-10-23 10:36                                     ` Vincent MAILHOL
2020-10-23 16:47                                       ` Oliver Hartkopp
2020-10-24  5:25                                         ` Vincent MAILHOL
2020-10-24 11:31                                           ` Oliver Hartkopp
2020-10-19 19:05 ` [net-rfc 05/16] can: dev: __can_get_echo_skb(): fix the returned length of CAN frame Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 06/16] can: can_create_echo_skb(): fix echo skb generation: always use skb_clone() Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 07/16] can: j1939: j1939_sk_bind(): return failure if netdev is down Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 08/16] can: isotp: Explain PDU in CAN_ISOTP help text Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 09/16] can: isotp: enable RX timeout handling in listen-only mode Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 10/16] can: ti_hecc: add missed clk_disable_unprepare() in error path Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 11/16] can: xilinx_can: handle failure cases of pm_runtime_get_sync Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 12/16] can: peak_usb: fix timestamp wrapping Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 13/16] can: peak_canfd: fix echo management when loopback is on Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 14/16] can: mcp251xfd: mcp251xfd_regmap_crc_read(): increase severity of CRC read error messages Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 15/16] can: mcp251xfd: mcp251xfd_regmap_nocrc_read(): fix semicolon.cocci warnings Marc Kleine-Budde
2020-10-19 19:05 ` [net-rfc 16/16] can: mcp251xfd: remove unneeded break Marc Kleine-Budde

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ebf50f35-f093-b2c9-a27c-cef73d403efb@pengutronix.de \
    --to=mkl@pengutronix.de \
    --cc=kernel@pengutronix.de \
    --cc=linux-can@vger.kernel.org \
    --cc=mailhol.vincent@wanadoo.fr \
    --cc=socketcan@hartkopp.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.