|
13 | 13 | #define CAN_TERMINATION_OHM_VALUE 120 |
14 | 14 |
|
15 | 15 | int can_set_netlink_message(Link *link, sd_netlink_message *m) { |
16 | | - struct can_ctrlmode cm = {}; |
17 | 16 | int r; |
18 | 17 |
|
19 | 18 | assert(link); |
@@ -80,37 +79,12 @@ int can_set_netlink_message(Link *link, sd_netlink_message *m) { |
80 | 79 | return log_link_debug_errno(link, r, "Could not append IFLA_CAN_RESTART_MS attribute: %m"); |
81 | 80 | } |
82 | 81 |
|
83 | | - if (link->network->can_fd_mode >= 0) { |
84 | | - cm.mask |= CAN_CTRLMODE_FD; |
85 | | - SET_FLAG(cm.flags, CAN_CTRLMODE_FD, link->network->can_fd_mode); |
86 | | - log_link_debug(link, "Setting FD mode to '%s'.", yes_no(link->network->can_fd_mode)); |
87 | | - } |
88 | | - |
89 | | - if (link->network->can_non_iso >= 0) { |
90 | | - cm.mask |= CAN_CTRLMODE_FD_NON_ISO; |
91 | | - SET_FLAG(cm.flags, CAN_CTRLMODE_FD_NON_ISO, link->network->can_non_iso); |
92 | | - log_link_debug(link, "Setting FD non-ISO mode to '%s'.", yes_no(link->network->can_non_iso)); |
93 | | - } |
94 | | - |
95 | | - if (link->network->can_triple_sampling >= 0) { |
96 | | - cm.mask |= CAN_CTRLMODE_3_SAMPLES; |
97 | | - SET_FLAG(cm.flags, CAN_CTRLMODE_3_SAMPLES, link->network->can_triple_sampling); |
98 | | - log_link_debug(link, "Setting triple-sampling to '%s'.", yes_no(link->network->can_triple_sampling)); |
99 | | - } |
100 | | - |
101 | | - if (link->network->can_berr_reporting >= 0) { |
102 | | - cm.mask |= CAN_CTRLMODE_BERR_REPORTING; |
103 | | - SET_FLAG(cm.flags, CAN_CTRLMODE_BERR_REPORTING, link->network->can_berr_reporting); |
104 | | - log_link_debug(link, "Setting bus error reporting to '%s'.", yes_no(link->network->can_berr_reporting)); |
105 | | - } |
106 | | - |
107 | | - if (link->network->can_listen_only >= 0) { |
108 | | - cm.mask |= CAN_CTRLMODE_LISTENONLY; |
109 | | - SET_FLAG(cm.flags, CAN_CTRLMODE_LISTENONLY, link->network->can_listen_only); |
110 | | - log_link_debug(link, "Setting listen-only mode to '%s'.", yes_no(link->network->can_listen_only)); |
111 | | - } |
| 82 | + if (link->network->can_control_mode_mask != 0) { |
| 83 | + struct can_ctrlmode cm = { |
| 84 | + .mask = link->network->can_control_mode_mask, |
| 85 | + .flags = link->network->can_control_mode_flags, |
| 86 | + }; |
112 | 87 |
|
113 | | - if (cm.mask != 0) { |
114 | 88 | r = sd_netlink_message_append_data(m, IFLA_CAN_CTRLMODE, &cm, sizeof(cm)); |
115 | 89 | if (r < 0) |
116 | 90 | return log_link_debug_errno(link, r, "Could not append IFLA_CAN_CTRLMODE attribute: %m"); |
@@ -213,3 +187,43 @@ int config_parse_can_restart_usec( |
213 | 187 | *restart_usec = usec; |
214 | 188 | return 0; |
215 | 189 | } |
| 190 | + |
| 191 | +int config_parse_can_control_mode( |
| 192 | + const char* unit, |
| 193 | + const char *filename, |
| 194 | + unsigned line, |
| 195 | + const char *section, |
| 196 | + unsigned section_line, |
| 197 | + const char *lvalue, |
| 198 | + int ltype, |
| 199 | + const char *rvalue, |
| 200 | + void *data, |
| 201 | + void *userdata) { |
| 202 | + |
| 203 | + Network *network = userdata; |
| 204 | + uint32_t mask = ltype; |
| 205 | + int r; |
| 206 | + |
| 207 | + assert(filename); |
| 208 | + assert(lvalue); |
| 209 | + assert(rvalue); |
| 210 | + assert(userdata); |
| 211 | + assert(mask != 0); |
| 212 | + |
| 213 | + if (isempty(rvalue)) { |
| 214 | + network->can_control_mode_mask &= ~mask; |
| 215 | + network->can_control_mode_flags &= ~mask; |
| 216 | + return 0; |
| 217 | + } |
| 218 | + |
| 219 | + r = parse_boolean(rvalue); |
| 220 | + if (r < 0) { |
| 221 | + log_syntax(unit, LOG_WARNING, filename, line, r, |
| 222 | + "Failed to parse CAN control mode '%s', ignoring: %s", lvalue, rvalue); |
| 223 | + return 0; |
| 224 | + } |
| 225 | + |
| 226 | + network->can_control_mode_mask |= mask; |
| 227 | + SET_FLAG(network->can_control_mode_flags, mask, r); |
| 228 | + return 0; |
| 229 | +} |
0 commit comments