1 From 1e6ffb3129340291027d2690631f62eb7d0e0a78 Mon Sep 17 00:00:00 2001
2 From: Matt Ranostay <matt.ranostay@konsulko.com>
3 Date: Tue, 11 Feb 2020 18:13:45 -0800
4 Subject: [PATCH] network: add CAN Termination tristate option
6 Upstream-Status: Submitted
7 Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
9 src/libsystemd/sd-netlink/netlink-types.c | 1 +
10 src/network/networkd-can.c | 13 +++++++++++++
11 src/network/networkd-network-gperf.gperf | 1 +
12 src/network/networkd-network.c | 1 +
13 src/network/networkd-network.h | 1 +
14 test/fuzz/fuzz-network-parser/directives.network | 1 +
15 6 files changed, 18 insertions(+)
17 diff --git a/src/libsystemd/sd-netlink/netlink-types.c b/src/libsystemd/sd-netlink/netlink-types.c
18 index de9b8b21ab..69ca675a8d 100644
19 --- a/src/libsystemd/sd-netlink/netlink-types.c
20 +++ b/src/libsystemd/sd-netlink/netlink-types.c
21 @@ -310,6 +310,7 @@ static const NLType rtnl_link_info_data_can_types[] = {
22 [IFLA_CAN_BITTIMING] = { .size = sizeof(struct can_bittiming) },
23 [IFLA_CAN_RESTART_MS] = { .type = NETLINK_TYPE_U32 },
24 [IFLA_CAN_CTRLMODE] = { .size = sizeof(struct can_ctrlmode) },
25 + [IFLA_CAN_TERMINATION] = { .type = NETLINK_TYPE_U16 },
28 static const NLType rtnl_link_info_data_macsec_types[] = {
29 diff --git a/src/network/networkd-can.c b/src/network/networkd-can.c
30 index 5755df57bd..3abe8ae2ed 100644
31 --- a/src/network/networkd-can.c
32 +++ b/src/network/networkd-can.c
34 #include "networkd-manager.h"
35 #include "string-util.h"
37 +#define CAN_TERMINATION_OHM_VALUE 120
39 static int link_up_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
42 @@ -152,6 +154,17 @@ static int link_set_can(Link *link) {
43 return log_link_error_errno(link, r, "Could not append IFLA_CAN_CTRLMODE attribute: %m");
46 + if (link->network->can_termination >= 0) {
48 + log_link_debug(link, "%sabling can-termination", link->network->can_termination ? "En" : "Dis");
50 + r = sd_netlink_message_append_u16(m, IFLA_CAN_TERMINATION,
51 + link->network->can_termination ? CAN_TERMINATION_OHM_VALUE : 0);
53 + return log_link_error_errno(link, r, "Could not append IFLA_CAN_TERMINATION attribute: %m");
57 r = sd_netlink_message_close_container(m);
59 return log_link_error_errno(link, r, "Failed to close netlink container: %m");
60 diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
61 index d4d108ad25..f6814c2213 100644
62 --- a/src/network/networkd-network-gperf.gperf
63 +++ b/src/network/networkd-network-gperf.gperf
64 @@ -227,6 +227,7 @@ CAN.BitRate, config_parse_si_size,
65 CAN.SamplePoint, config_parse_permille, 0, offsetof(Network, can_sample_point)
66 CAN.RestartSec, config_parse_sec, 0, offsetof(Network, can_restart_us)
67 CAN.TripleSampling, config_parse_tristate, 0, offsetof(Network, can_triple_sampling)
68 +CAN.Termination, config_parse_tristate, 0, offsetof(Network, can_termination)
69 /* backwards compatibility: do not add new entries to this section */
70 Network.IPv4LL, config_parse_ipv4ll, 0, offsetof(Network, link_local)
71 DHCP.ClientIdentifier, config_parse_dhcp_client_identifier, 0, offsetof(Network, dhcp_client_identifier)
72 diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
73 index 2b8d0eb2fb..00f309b738 100644
74 --- a/src/network/networkd-network.c
75 +++ b/src/network/networkd-network.c
76 @@ -436,6 +436,7 @@ int network_load_one(Manager *manager, const char *filename) {
77 .keep_configuration = _KEEP_CONFIGURATION_INVALID,
79 .can_triple_sampling = -1,
80 + .can_termination = -1,
83 r = config_parse_many(filename, NETWORK_DIRS, dropin_dirname,
84 diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h
85 index bc760744e5..ed803ee746 100644
86 --- a/src/network/networkd-network.h
87 +++ b/src/network/networkd-network.h
88 @@ -170,6 +170,7 @@ struct Network {
89 unsigned can_sample_point;
90 usec_t can_restart_us;
91 int can_triple_sampling;
92 + int can_termination;
94 AddressFamily ip_forward;
96 diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network
97 index 848d4bd187..66a7557f29 100644
98 --- a/test/fuzz/fuzz-network-parser/directives.network
99 +++ b/test/fuzz/fuzz-network-parser/directives.network
100 @@ -183,6 +183,7 @@ SamplePoint=
106 DuplicateAddressDetection=