]> www.infradead.org Git - users/hch/misc.git/commitdiff
can: netlink: add can_validate_databittiming()
authorVincent Mailhol <mailhol@kernel.org>
Tue, 23 Sep 2025 06:58:31 +0000 (15:58 +0900)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 24 Sep 2025 15:09:44 +0000 (17:09 +0200)
Factorise the databittiming validation out of can_validate() and move
it in the new add can_validate_databittiming() function. Also move
can_validate()'s comment because it is specific to CAN FD. This is a
preparation patch for the introduction of CAN XL as this databittiming
validation will be reused later on.

Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
Link: https://patch.msgid.link/20250923-canxl-netlink-prep-v4-6-e720d28f66fe@kernel.org
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/dev/netlink.c

index 25c08adee9ade22a5dabdd3dec1b5eb1ee16a78e..549a2247d847dd26c8cb8c76ecb609256f549eb2 100644 (file)
@@ -100,10 +100,13 @@ static int can_validate_tdc(struct nlattr *data_tdc,
        return 0;
 }
 
-static int can_validate(struct nlattr *tb[], struct nlattr *data[],
-                       struct netlink_ext_ack *extack)
+static int can_validate_databittiming(struct nlattr *data[],
+                                     struct netlink_ext_ack *extack,
+                                     int ifla_can_data_bittiming, u32 flags)
 {
-       bool is_can_fd = false;
+       struct nlattr *data_tdc;
+       u32 tdc_flags;
+       bool is_on;
        int err;
 
        /* Make sure that valid CAN FD configurations always consist of
@@ -113,35 +116,56 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],
         * - TDC parameters are coherent (details in can_validate_tdc())
         */
 
+       if (ifla_can_data_bittiming == IFLA_CAN_DATA_BITTIMING) {
+               data_tdc = data[IFLA_CAN_TDC];
+               tdc_flags = flags & CAN_CTRLMODE_FD_TDC_MASK;
+               is_on = flags & CAN_CTRLMODE_FD;
+       } else {
+               return -EOPNOTSUPP; /* Place holder for CAN XL */
+       }
+
+       if (is_on) {
+               if (!data[IFLA_CAN_BITTIMING] || !data[ifla_can_data_bittiming])
+                       return -EOPNOTSUPP;
+       }
+
+       if (data[ifla_can_data_bittiming] || data_tdc) {
+               if (!is_on)
+                       return -EOPNOTSUPP;
+       }
+
+       err = can_validate_bittiming(data, extack, ifla_can_data_bittiming);
+       if (err)
+               return err;
+
+       err = can_validate_tdc(data_tdc, extack, tdc_flags);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static int can_validate(struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
+{
+       u32 flags = 0;
+       int err;
+
        if (!data)
                return 0;
 
        if (data[IFLA_CAN_CTRLMODE]) {
                struct can_ctrlmode *cm = nla_data(data[IFLA_CAN_CTRLMODE]);
 
-               is_can_fd = cm->flags & cm->mask & CAN_CTRLMODE_FD;
-
-               err = can_validate_tdc(data[IFLA_CAN_TDC], extack,
-                                      cm->flags & CAN_CTRLMODE_FD_TDC_MASK);
-               if (err)
-                       return err;
+               flags = cm->flags & cm->mask;
        }
 
        err = can_validate_bittiming(data, extack, IFLA_CAN_BITTIMING);
        if (err)
                return err;
 
-       if (is_can_fd) {
-               if (!data[IFLA_CAN_BITTIMING] || !data[IFLA_CAN_DATA_BITTIMING])
-                       return -EOPNOTSUPP;
-       }
-
-       if (data[IFLA_CAN_DATA_BITTIMING] || data[IFLA_CAN_TDC]) {
-               if (!is_can_fd)
-                       return -EOPNOTSUPP;
-       }
-
-       err = can_validate_bittiming(data, extack, IFLA_CAN_DATA_BITTIMING);
+       err = can_validate_databittiming(data, extack,
+                                        IFLA_CAN_DATA_BITTIMING, flags);
        if (err)
                return err;