From 6ed6c4780f74d803c55a257a87f7c5f993c27fe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulrich=20=C3=96lmann?= Date: Fri, 8 Jan 2021 18:39:42 +0100 Subject: [PATCH 1/3] network: can: simplify usage of booleans Harmonize with what is done for TripleSampling, Termination & ListenOnly. --- src/network/networkd-can.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/network/networkd-can.c b/src/network/networkd-can.c index 8610320698..b767558acd 100644 --- a/src/network/networkd-can.c +++ b/src/network/networkd-can.c @@ -174,14 +174,14 @@ static int link_set_can(Link *link) { 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"); + SET_FLAG(cm.flags, CAN_CTRLMODE_FD, link->network->can_fd_mode); + log_link_debug(link, "%sabling FD mode", link->network->can_fd_mode ? "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"); + SET_FLAG(cm.flags, CAN_CTRLMODE_FD_NON_ISO, link->network->can_non_iso); + log_link_debug(link, "%sabling FD non-ISO mode", link->network->can_non_iso ? "En" : "Dis"); } if (link->network->can_restart_us > 0) { From 3757912db405404b96da4c704f9ee57749e40c5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulrich=20=C3=96lmann?= Date: Fri, 8 Jan 2021 18:12:36 +0100 Subject: [PATCH 2/3] network: can: pretty up debug messages Do not construct the english words "Enabling"/"Disabling" but use one of the smart helper functions here. --- src/network/networkd-can.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/network/networkd-can.c b/src/network/networkd-can.c index b767558acd..d3aefe1970 100644 --- a/src/network/networkd-can.c +++ b/src/network/networkd-can.c @@ -175,13 +175,13 @@ static int link_set_can(Link *link) { if (link->network->can_fd_mode >= 0) { cm.mask |= CAN_CTRLMODE_FD; SET_FLAG(cm.flags, CAN_CTRLMODE_FD, link->network->can_fd_mode); - log_link_debug(link, "%sabling FD mode", link->network->can_fd_mode ? "En" : "Dis"); + log_link_debug(link, "Setting FD mode to '%s'.", yes_no(link->network->can_fd_mode)); } 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); - log_link_debug(link, "%sabling FD non-ISO mode", link->network->can_non_iso ? "En" : "Dis"); + log_link_debug(link, "Setting FD non-ISO mode to '%s'.", yes_no(link->network->can_non_iso)); } if (link->network->can_restart_us > 0) { @@ -208,13 +208,13 @@ static int link_set_can(Link *link) { if (link->network->can_triple_sampling >= 0) { cm.mask |= CAN_CTRLMODE_3_SAMPLES; SET_FLAG(cm.flags, CAN_CTRLMODE_3_SAMPLES, link->network->can_triple_sampling); - log_link_debug(link, "%sabling triple-sampling", link->network->can_triple_sampling ? "En" : "Dis"); + log_link_debug(link, "Setting triple-sampling to '%s'.", yes_no(link->network->can_triple_sampling)); } if (link->network->can_listen_only >= 0) { cm.mask |= CAN_CTRLMODE_LISTENONLY; SET_FLAG(cm.flags, CAN_CTRLMODE_LISTENONLY, link->network->can_listen_only); - log_link_debug(link, "%sabling listen-only mode", link->network->can_listen_only ? "En" : "Dis"); + log_link_debug(link, "Setting listen-only mode to '%s'.", yes_no(link->network->can_listen_only)); } if (cm.mask != 0) { @@ -225,7 +225,7 @@ static int link_set_can(Link *link) { if (link->network->can_termination >= 0) { - log_link_debug(link, "%sabling can-termination", link->network->can_termination ? "En" : "Dis"); + log_link_debug(link, "Setting can-termination to '%s'.", yes_no(link->network->can_termination)); r = sd_netlink_message_append_u16(m, IFLA_CAN_TERMINATION, link->network->can_termination ? CAN_TERMINATION_OHM_VALUE : 0); From 77b674049b19c437e9cd5dcbfe4502149de6ea42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulrich=20=C3=96lmann?= Date: Tue, 5 Jan 2021 18:53:44 +0100 Subject: [PATCH 3/3] network: can: add support for bus error reporting 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 | 10 ++++++++++ src/network/networkd-can.c | 6 ++++++ src/network/networkd-network-gperf.gperf | 1 + src/network/networkd-network.c | 1 + src/network/networkd-network.h | 1 + test/fuzz/fuzz-network-parser/directives.network | 1 + 6 files changed, 20 insertions(+) diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 422268b0f7..5a6613ab60 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -2742,6 +2742,16 @@ IPv6Token=prefixstable:2002:da8:1:: the value of a received bit by majority rule. When unset, the kernel's default will be used. + + BusErrorReporting= + + Takes a boolean. When yes, 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. + + ListenOnly= diff --git a/src/network/networkd-can.c b/src/network/networkd-can.c index d3aefe1970..c0018c306f 100644 --- a/src/network/networkd-can.c +++ b/src/network/networkd-can.c @@ -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); diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 444c6c78bc..55c404a19b 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -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 diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 6f1afed091..6b7c9aaa3f 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -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, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 762dc971db..2b7dc4e94b 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -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; diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index e7860702c6..a8324b3b01 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -246,6 +246,7 @@ FDMode= FDNonISO= RestartSec= TripleSampling= +BusErrorReporting= Termination= ListenOnly= [Address]