]> git.itanic.dy.fi Git - linux-stable/commitdiff
can: bittiming: can_sjw_check(): check that SJW is not longer than either Phase Buffe...
authorMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 6 Sep 2022 17:15:28 +0000 (19:15 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Mon, 6 Feb 2023 12:57:27 +0000 (13:57 +0100)
According to "The Configuration of the CAN Bit Timing" [1] the SJW
"may not be longer than either Phase Buffer Segment".

Check SJW against length of both Phase buffers. In case the SJW is
greater, report an error via netlink to user space and bail out.

[1] http://web.archive.org/http://www.oertel-halle.de/files/cia99paper.pdf

Link: https://lore.kernel.org/all/20230202110854.2318594-14-mkl@pengutronix.de
Suggested-by: Vincent Mailhol <vincent.mailhol@gmail.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/dev/bittiming.c

index 0a2a9b12565fddaa100539fa5c1ff7999cd8a8c0..68287b79afe89159762e1b75ab751e4b3643060c 100644 (file)
@@ -24,6 +24,20 @@ int can_sjw_check(const struct net_device *dev, const struct can_bittiming *bt,
                return -EINVAL;
        }
 
+       if (bt->sjw > bt->phase_seg1) {
+               NL_SET_ERR_MSG_FMT(extack,
+                                  "sjw: %u greater than phase-seg1: %u",
+                                  bt->sjw, bt->phase_seg1);
+               return -EINVAL;
+       }
+
+       if (bt->sjw > bt->phase_seg2) {
+               NL_SET_ERR_MSG_FMT(extack,
+                                  "sjw: %u greater than phase-seg2: %u",
+                                  bt->sjw, bt->phase_seg2);
+               return -EINVAL;
+       }
+
        return 0;
 }