]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: can: add support for CAN-FD related properties 15238/head
authorRichard Petri <git@rpls.de>
Thu, 26 Mar 2020 21:27:41 +0000 (22:27 +0100)
committerRichard Petri <git@rpls.de>
Wed, 1 Apr 2020 18:07:20 +0000 (20:07 +0200)
man/systemd.network.xml
src/network/networkd-can.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.h
test/fuzz/fuzz-network-parser/directives.network

index be0756513ff2ca3522dee7ca2a0d743dd03d78d9..9468a548f6ce9fe5f137d92be4155255861f0da9 100644 (file)
             <literal>87.5%</literal>) or permille (e.g. <literal>875‰</literal>).</para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>DataBitRate=</varname></term>
+          <term><varname>DataSamplePoint=</varname></term>
+          <listitem>
+            <para>The bitrate and sample point for the data phase, if CAN-FD is used. These settings are
+            analogous to the <varname>BitRate=</varname> and <varname>SamplePoint=</varname> keys.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>FDMode=</varname></term>
+          <listitem>
+            <para>Takes a boolean. When <literal>yes</literal>, CAN-FD mode is enabled for the interface.
+            Note, that a bitrate and optional sample point should also be set for the CAN-FD data phase using
+            the <varname>DataBitRate=</varname> and <varname>DataSamplePoint=</varname> keys.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>FDNonISO=</varname></term>
+          <listitem>
+            <para>Takes a boolean. When <literal>yes</literal>, non-ISO CAN-FD mode is enabled for the
+            interface. When unset, the kernel's default will be used.</para>
+          </listitem>
+        </varlistentry>
         <varlistentry>
           <term><varname>RestartSec=</varname></term>
           <listitem>
index 4118fcf859b17bd4033d1f29c3cc153b2f000ea4..fdd99a3a18955a9f2eb2e85038a5bd3cc7e71bdc 100644 (file)
@@ -155,6 +155,35 @@ static int link_set_can(Link *link) {
                         return log_link_error_errno(link, r, "Could not append IFLA_CAN_BITTIMING attribute: %m");
         }
 
+        if (link->network->can_data_bitrate > 0 || link->network->can_data_sample_point > 0) {
+                struct can_bittiming bt = {
+                        .bitrate = link->network->can_data_bitrate,
+                        .sample_point = link->network->can_data_sample_point,
+                };
+
+                log_link_debug(link, "Setting data bitrate = %d bit/s", bt.bitrate);
+                if (link->network->can_data_sample_point > 0)
+                        log_link_debug(link, "Setting data sample point = %d.%d%%", bt.sample_point / 10, bt.sample_point % 10);
+                else
+                        log_link_debug(link, "Using default data sample point");
+
+                r = sd_netlink_message_append_data(m, IFLA_CAN_DATA_BITTIMING, &bt, sizeof(bt));
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append IFLA_CAN_DATA_BITTIMING attribute: %m");
+        }
+
+        if (link->network->can_fd_mode >= 0) {
+                cm.mask |= CAN_CTRLMODE_FD;
+                SET_FLAG(cm.flags, CAN_CTRLMODE_FD, link->network->can_fd_mode > 0);
+                log_link_debug(link, "%sabling FD mode", link->network->can_fd_mode > 0 ? "En" : "Dis");
+        }
+
+        if (link->network->can_non_iso >= 0) {
+                cm.mask |= CAN_CTRLMODE_FD_NON_ISO;
+                SET_FLAG(cm.flags, CAN_CTRLMODE_FD_NON_ISO, link->network->can_non_iso > 0);
+                log_link_debug(link, "%sabling FD non-ISO mode", link->network->can_non_iso > 0 ? "En" : "Dis");
+        }
+
         if (link->network->can_restart_us > 0) {
                 char time_string[FORMAT_TIMESPAN_MAX];
                 uint64_t restart_ms;
index ee50da098d67b0429a0940e090e90d953bb2f6be..7833eec1cf5f717146aa1874e8329401918ea527 100644 (file)
@@ -260,6 +260,10 @@ IPv6RoutePrefix.Route,                       config_parse_route_prefix,
 IPv6RoutePrefix.LifetimeSec,                 config_parse_route_prefix_lifetime,                       0,                             0
 CAN.BitRate,                                 config_parse_can_bitrate,                                 0,                             offsetof(Network, can_bitrate)
 CAN.SamplePoint,                             config_parse_permille,                                    0,                             offsetof(Network, can_sample_point)
+CAN.DataBitRate,                             config_parse_can_bitrate,                                 0,                             offsetof(Network, can_data_bitrate)
+CAN.DataSamplePoint,                         config_parse_permille,                                    0,                             offsetof(Network, can_data_sample_point)
+CAN.FDMode,                                  config_parse_tristate,                                    0,                             offsetof(Network, can_fd_mode)
+CAN.FDNonISO,                                config_parse_tristate,                                    0,                             offsetof(Network, can_non_iso)
 CAN.RestartSec,                              config_parse_sec,                                         0,                             offsetof(Network, can_restart_us)
 CAN.TripleSampling,                          config_parse_tristate,                                    0,                             offsetof(Network, can_triple_sampling)
 CAN.Termination,                             config_parse_tristate,                                    0,                             offsetof(Network, can_termination)
index 7acb4a5461dfb4c76f36422cf3393006a3aeeb35..8bd380c6a8e7e2a3e41ac9ce042f7426bdb16d38 100644 (file)
@@ -207,10 +207,14 @@ struct Network {
         /* CAN support */
         uint32_t can_bitrate;
         unsigned can_sample_point;
+        uint32_t can_data_bitrate;
+        unsigned can_data_sample_point;
         usec_t can_restart_us;
         int can_triple_sampling;
         int can_termination;
         int can_listen_only;
+        int can_fd_mode;
+        int can_non_iso;
 
         AddressFamily ip_forward;
         bool ip_masquerade;
index 01b1b50ff6a26bea7eb25f122613590cf935ea24..fe70429ffe64452bf8c3d8e23a57663481c4d470 100644 (file)
@@ -201,6 +201,10 @@ PVID=
 [CAN]
 SamplePoint=
 BitRate=
+DataSamplePoint=
+DataBitRate=
+FDMode=
+FDNonISO=
 RestartSec=
 TripleSampling=
 Termination=