]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: can: add support for bus error reporting 18169/head
authorUlrich Ölmann <u.oelmann@pengutronix.de>
Tue, 5 Jan 2021 17:53:44 +0000 (18:53 +0100)
committerUlrich Ölmann <u.oelmann@pengutronix.de>
Fri, 8 Jan 2021 19:23:12 +0000 (20:23 +0100)
Enhance systemd-networkd to be able to control a CAN device's berr-reporting
flag via the new boolean directive BusErrorReporting= to be used in network
files.

man/systemd.network.xml
src/network/networkd-can.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
test/fuzz/fuzz-network-parser/directives.network

index 422268b0f7c9ae1cb07dea87d31fb47641dfd0a4..5a6613ab60a45ee8c169c5c0d8d7db16916f2b08 100644 (file)
@@ -2742,6 +2742,16 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
             the value of a received bit by majority rule. When unset, the kernel's default will be used.</para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>BusErrorReporting=</varname></term>
+          <listitem>
+            <para>Takes a boolean. When <literal>yes</literal>, reporting of CAN bus errors is activated
+            (those include single bit, frame format, and bit stuffing errors, unable to send dominant bit,
+            unable to send recessive bit, bus overload, active error announcement, error occurred on
+            transmission). When unset, the kernel's default will be used. Note: in case of a CAN bus with a
+            single CAN device, sending a CAN frame may result in a huge number of CAN bus errors.</para>
+          </listitem>
+        </varlistentry>
         <varlistentry>
           <term><varname>ListenOnly=</varname></term>
           <listitem>
index d3aefe197062670f92c6781ab43f737143d6d339..c0018c306f9212b5caf7bc559a4a929edeb9cef7 100644 (file)
@@ -211,6 +211,12 @@ static int link_set_can(Link *link) {
                 log_link_debug(link, "Setting triple-sampling to '%s'.", yes_no(link->network->can_triple_sampling));
         }
 
+        if (link->network->can_berr_reporting >= 0) {
+                cm.mask |= CAN_CTRLMODE_BERR_REPORTING;
+                SET_FLAG(cm.flags, CAN_CTRLMODE_BERR_REPORTING, link->network->can_berr_reporting);
+                log_link_debug(link, "Setting bus error reporting to '%s'.", yes_no(link->network->can_berr_reporting));
+        }
+
         if (link->network->can_listen_only >= 0) {
                 cm.mask |= CAN_CTRLMODE_LISTENONLY;
                 SET_FLAG(cm.flags, CAN_CTRLMODE_LISTENONLY, link->network->can_listen_only);
index 444c6c78bc144432a8706204cf6d19c042b11784..55c404a19b5f3bed8945642527d7ce3d90f2452a 100644 (file)
@@ -320,6 +320,7 @@ CAN.FDMode,                                  config_parse_tristate,
 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.BusErrorReporting,                       config_parse_tristate,                                    0,                             offsetof(Network, can_berr_reporting)
 CAN.Termination,                             config_parse_tristate,                                    0,                             offsetof(Network, can_termination)
 CAN.ListenOnly,                              config_parse_tristate,                                    0,                             offsetof(Network, can_listen_only)
 QDisc.Parent,                                config_parse_qdisc_parent,                                _QDISC_KIND_INVALID,           0
index 6f1afed091d2eb192b61b5b27b6b06e0f32a20d7..6b7c9aaa3f062951a14ea008cee4e80dc9298719 100644 (file)
@@ -415,6 +415,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                 .ipv6_accept_ra_start_dhcp6_client = IPV6_ACCEPT_RA_START_DHCP6_CLIENT_YES,
 
                 .can_triple_sampling = -1,
+                .can_berr_reporting = -1,
                 .can_termination = -1,
                 .can_listen_only = -1,
                 .can_fd_mode = -1,
index 762dc971dbb84b81a9000ccf05980ae3fd2d162a..2b7dc4e94b3cdc2b647a012e23583f9eee261d34 100644 (file)
@@ -231,6 +231,7 @@ struct Network {
         unsigned can_data_sample_point;
         usec_t can_restart_us;
         int can_triple_sampling;
+        int can_berr_reporting;
         int can_termination;
         int can_listen_only;
         int can_fd_mode;
index e7860702c6a4a1d8ce35f75c4570a4378b72963c..a8324b3b01d31a2fea22a8eece79c8a3aa132906 100644 (file)
@@ -246,6 +246,7 @@ FDMode=
 FDNonISO=
 RestartSec=
 TripleSampling=
+BusErrorReporting=
 Termination=
 ListenOnly=
 [Address]