From 9973d44464b3cc73a8cb6a6acd72c0739176039c Mon Sep 17 00:00:00 2001 From: Javier Casas Date: Mon, 12 May 2025 15:52:22 +0200 Subject: [PATCH 1/2] Enable error frame reception in raw mode --- src/state_raw.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/state_raw.c b/src/state_raw.c index 8246f1f..0207154 100644 --- a/src/state_raw.c +++ b/src/state_raw.c @@ -21,6 +21,7 @@ #include #include +#include int raw_socket; struct ifreq ifr; @@ -62,6 +63,13 @@ void state_raw() return; } + can_err_mask_t err_mask = CAN_ERR_MASK; + if (setsockopt(raw_socket, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, sizeof(err_mask)) < 0) { + PRINT_ERROR("Could not enable CAN_RAW_ERR_FILTER\n"); + state = STATE_SHUTDOWN; + return; + } + if (bind(raw_socket, (struct sockaddr *)&addr, sizeof(addr)) < 0) { PRINT_ERROR("Error while binding RAW socket %s\n", strerror(errno)); state = STATE_SHUTDOWN; From cd56d6629e889c4c817845504d08e419ff7698df Mon Sep 17 00:00:00 2001 From: Javier Casas Date: Mon, 12 May 2025 17:48:25 +0200 Subject: [PATCH 2/2] add error_mask option --- src/socketcand.c | 9 ++++++++- src/socketcand.h | 2 ++ src/state_raw.c | 12 +++++++----- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/socketcand.c b/src/socketcand.c index f481d11..089f97d 100644 --- a/src/socketcand.c +++ b/src/socketcand.c @@ -64,6 +64,7 @@ int cmd_index = 0; char *description; char *afuxname; int more_elements = 0; +can_err_mask_t error_mask = 0; struct sockaddr_in saddr, broadcast_addr; struct sockaddr_un unaddr; socklen_t unaddrlen; @@ -212,11 +213,12 @@ int main(int argc, char **argv) { "daemon", no_argument, 0, 'd' }, { "version", no_argument, 0, 'z' }, { "no-beacon", no_argument, 0, 'n' }, + { "error-mask", required_argument, 0, 'e' }, { "help", no_argument, 0, 'h' }, { 0, 0, 0, 0 } }; - c = getopt_long(argc, argv, "vi:p:qu:l:dznh", long_options, &option_index); + c = getopt_long(argc, argv, "vi:p:qu:l:dzne:h", long_options, &option_index); if (c == -1) break; @@ -269,6 +271,10 @@ int main(int argc, char **argv) disable_beacon = 1; break; + case 'e': + error_mask = strtoul(optarg, NULL, 16); + break; + case 'h': print_usage(); return 0; @@ -651,6 +657,7 @@ void print_usage(void) printf("\t-l (changes the default network interface the daemon will\n\t\tbind to - default: %s)\n", DEFAULT_INTERFACE); printf("\t-u (the AF_UNIX socket path - abstract name when leading '/' is missing)\n\t\t(N.B. the AF_UNIX binding will supersede the port/interface settings)\n"); printf("\t-n (deactivates the discovery beacon)\n"); + printf("\t-e (enable CAN error frames in raw mode providing an hexadecimal error mask, e.g: 0x1FFFFFFF)\n"); printf("\t-d (set this flag if you want log to syslog instead of STDOUT)\n"); printf("\t-h (prints this message)\n"); } diff --git a/src/socketcand.h b/src/socketcand.h index 5747fcf..e094d1f 100644 --- a/src/socketcand.h +++ b/src/socketcand.h @@ -2,6 +2,7 @@ #include #include +#include /* max. length for ISO 15765-2 PDUs */ #define ISOTPLEN 4095 @@ -69,6 +70,7 @@ extern pthread_t statistics_thread; extern int more_elements; extern struct sockaddr_in broadcast_addr; extern struct sockaddr_in saddr; +extern can_err_mask_t error_mask; int receive_command(int socket, char *buf); int state_changed(char *buf, int current_state); diff --git a/src/state_raw.c b/src/state_raw.c index 0207154..7f99c81 100644 --- a/src/state_raw.c +++ b/src/state_raw.c @@ -63,11 +63,13 @@ void state_raw() return; } - can_err_mask_t err_mask = CAN_ERR_MASK; - if (setsockopt(raw_socket, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, sizeof(err_mask)) < 0) { - PRINT_ERROR("Could not enable CAN_RAW_ERR_FILTER\n"); - state = STATE_SHUTDOWN; - return; + if (error_mask != 0) { + can_err_mask_t err_mask = (error_mask & CAN_ERR_MASK); + if (setsockopt(raw_socket, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, sizeof(err_mask)) < 0) { + PRINT_ERROR("Could not enable CAN_RAW_ERR_FILTER\n"); + state = STATE_SHUTDOWN; + return; + } } if (bind(raw_socket, (struct sockaddr *)&addr, sizeof(addr)) < 0) {