linux-can.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
	linux-can@vger.kernel.org,
	Wolfgang Grandegger <wg@grandegger.com>,
	Marc Kleine-Budde <mkl@pengutronix.de>,
	"David S . Miller" <davem@davemloft.net>
Cc: Vincent Mailhol <mailhol.vincent@wanadoo.fr>,
	Jakub Kicinski <kuba@kernel.org>,
	Oliver Neukum <oneukum@suse.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Masahiro Yamada <masahiroy@kernel.org>,
	Arunachalam Santhanam <arunachalam.santhanam@in.bosch.com>,
	linux-usb@vger.kernel.org (open list:USB ACM DRIVER)
Subject: [PATCH v2 2/6] can: dev: add a helper function to get the correct length of Classical frames
Date: Wed, 30 Sep 2020 23:45:29 +0900	[thread overview]
Message-ID: <20200930144602.10290-3-mailhol.vincent@wanadoo.fr> (raw)
In-Reply-To: <20200926175810.278529-1-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>
---
 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 5e3d45525bd3..72a8a60c0094 100644
--- a/include/linux/can/dev.h
+++ b/include/linux/can/dev.h
@@ -177,6 +177,29 @@ u8 can_dlc2len(u8 can_dlc);
 /* map the sanitized data length to an appropriate data length code */
 u8 can_len2dlc(u8 len);
 
+/*
+ * get_can_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 int get_can_len(struct sk_buff *skb)
+{
+	struct canfd_frame *cf = (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);
+}
+
 struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max,
 				    unsigned int txqs, unsigned int rxqs);
 #define alloc_candev(sizeof_priv, echo_skb_max) \
-- 
2.26.2


  parent reply	other threads:[~2020-09-30 14:51 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-26 17:57 [PATCH 0/6] can: add support for ETAS ES58X CAN USB Vincent Mailhol
2020-09-26 17:57 ` [PATCH 1/6] can: dev: can_get_echo_skb(): prevent call to kfree_skb() in hard IRQ context Vincent Mailhol
2020-09-26 17:57 ` [PATCH 2/6] can: dev: add a helper function to get the correct length of Classical frames Vincent Mailhol
2020-09-26 17:57 ` [PATCH 3/6] can: dev: __can_get_echo_skb(): fix the return length Vincent Mailhol
2020-09-26 17:57 ` [PATCH 4/6] can: dev: add a helper function to calculate the duration of one bit Vincent Mailhol
2020-09-26 17:57 ` [PATCH 6/6] USB: cdc-acm: blacklist ETAS ES58X device Vincent Mailhol
2020-09-27  5:45   ` Greg Kroah-Hartman
2020-09-27  5:52     ` Greg Kroah-Hartman
2020-09-29  2:15       ` Vincent Mailhol
2020-09-30 14:45 ` [PATCH v2 0/6] can: add support for ETAS ES58X CAN USB Vincent Mailhol
2020-09-30 14:45 ` [PATCH v2 1/6] can: dev: can_get_echo_skb(): prevent call to kfree_skb() in hard IRQ context Vincent Mailhol
2020-09-30 14:45 ` Vincent Mailhol [this message]
2020-09-30 15:21   ` [PATCH v2 2/6] can: dev: add a helper function to get the correct length of Classical frames Marc Kleine-Budde
2020-10-01 15:45     ` [PATCH v2 2/6] can: dev: add a helper function Vincent Mailhol
2020-10-01 15:51       ` Marc Kleine-Budde
2020-09-30 14:45 ` [PATCH v2 3/6] can: dev: __can_get_echo_skb(): fix the return length Vincent Mailhol
2020-09-30 14:45 ` [PATCH v2 4/6] can: dev: add a helper function to calculate the duration of one bit Vincent Mailhol
2020-09-30 14:45 ` [PATCH v2 6/6] usb: cdc-acm: add quirk to blacklist ETAS ES58X devices Vincent Mailhol
     [not found] ` <20200930144602.10290-6-mailhol.vincent@wanadoo.fr>
2020-09-30 16:18   ` [PATCH v2 5/6] can: usb: etas_es58X: add support for ETAS ES58X CAN USB interfaces Greg Kroah-Hartman
2020-10-01 15:56     ` Vincent Mailhol
2020-10-02 15:41 ` [PATCH v3 0/7] can: add support for ETAS ES58X CAN USB Vincent Mailhol
2020-10-02 15:41   ` [PATCH v3 1/7] can: dev: can_get_echo_skb(): prevent call to kfree_skb() in hard IRQ context Vincent Mailhol
2020-10-02 15:41   ` [PATCH v3 2/7] can: dev: fix type of get_can_dlc() and get_canfd_dlc() macros Vincent Mailhol
2020-10-02 15:41   ` [PATCH v3 3/7] can: dev: add a helper function to get the correct length of Classical frames Vincent Mailhol
2020-10-02 15:41   ` [PATCH v3 4/7] can: dev: __can_get_echo_skb(): fix the return length Vincent Mailhol
2020-10-02 15:41   ` [PATCH v3 5/7] can: dev: add a helper function to calculate the duration of one bit Vincent Mailhol
2020-10-04 11:06     ` Marc Kleine-Budde
2020-10-04 11:10       ` Marc Kleine-Budde
2020-10-02 15:41   ` [PATCH v3 7/7] usb: cdc-acm: add quirk to blacklist ETAS ES58X devices Vincent Mailhol
2020-10-05 11:14     ` Greg Kroah-Hartman
     [not found]   ` <20201002154219.4887-7-mailhol.vincent@wanadoo.fr>
2020-10-04 12:06     ` [PATCH v3 6/7] can: usb: etas_es58X: add support for ETAS ES58X CAN USB interfaces Marc Kleine-Budde
2020-10-10  8:12       ` Vincent Mailhol

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=20200930144602.10290-3-mailhol.vincent@wanadoo.fr \
    --to=mailhol.vincent@wanadoo.fr \
    --cc=arunachalam.santhanam@in.bosch.com \
    --cc=davem@davemloft.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=kuba@kernel.org \
    --cc=linux-can@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=masahiroy@kernel.org \
    --cc=mkl@pengutronix.de \
    --cc=netdev@vger.kernel.org \
    --cc=oneukum@suse.com \
    --cc=wg@grandegger.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).