Skip to content

Commit 148571a

Browse files
committed
add error_mask option
1 parent 9973d44 commit 148571a

File tree

3 files changed

+18
-7
lines changed

3 files changed

+18
-7
lines changed

src/socketcand.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ int cmd_index = 0;
6464
char *description;
6565
char *afuxname;
6666
int more_elements = 0;
67+
int error_mask = 0;
6768
struct sockaddr_in saddr, broadcast_addr;
6869
struct sockaddr_un unaddr;
6970
socklen_t unaddrlen;
@@ -212,11 +213,12 @@ int main(int argc, char **argv)
212213
{ "daemon", no_argument, 0, 'd' },
213214
{ "version", no_argument, 0, 'z' },
214215
{ "no-beacon", no_argument, 0, 'n' },
216+
{ "error-mask", required_argument, 0, 'e' },
215217
{ "help", no_argument, 0, 'h' },
216218
{ 0, 0, 0, 0 }
217219
};
218220

219-
c = getopt_long(argc, argv, "vi:p:qu:l:dznh", long_options, &option_index);
221+
c = getopt_long(argc, argv, "vi:p:qu:l:dzne:h", long_options, &option_index);
220222

221223
if (c == -1)
222224
break;
@@ -269,6 +271,10 @@ int main(int argc, char **argv)
269271
disable_beacon = 1;
270272
break;
271273

274+
case 'e':
275+
error_mask = strtol(optarg, NULL, 16);
276+
break;
277+
272278
case 'h':
273279
print_usage();
274280
return 0;
@@ -651,6 +657,7 @@ void print_usage(void)
651657
printf("\t-l <interface> (changes the default network interface the daemon will\n\t\tbind to - default: %s)\n", DEFAULT_INTERFACE);
652658
printf("\t-u <name> (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");
653659
printf("\t-n (deactivates the discovery beacon)\n");
660+
printf("\t-e <error_mask> (enable CAN error frames in raw mode providing an hexadecimal error mask, e.g: 0x1FFFFFFF)\n");
654661
printf("\t-d (set this flag if you want log to syslog instead of STDOUT)\n");
655662
printf("\t-h (prints this message)\n");
656663
}

src/socketcand.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,10 @@ extern pthread_t statistics_thread;
6969
extern int more_elements;
7070
extern struct sockaddr_in broadcast_addr;
7171
extern struct sockaddr_in saddr;
72+
extern int error_mask;
7273

7374
int receive_command(int socket, char *buf);
7475
int state_changed(char *buf, int current_state);
7576
char *element_start(char *buf, int element);
7677
int element_length(char *buf, int element);
77-
int asc2nibble(char c);
78+
int asc2nibble(char c);

src/state_raw.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,14 @@ void state_raw()
6363
return;
6464
}
6565

66-
can_err_mask_t err_mask = CAN_ERR_MASK;
67-
if (setsockopt(raw_socket, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, sizeof(err_mask)) < 0) {
68-
PRINT_ERROR("Could not enable CAN_RAW_ERR_FILTER\n");
69-
state = STATE_SHUTDOWN;
70-
return;
66+
if (error_mask != 0)
67+
{
68+
can_err_mask_t err_mask = (error_mask & CAN_ERR_MASK);
69+
if (setsockopt(raw_socket, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, sizeof(err_mask)) < 0) {
70+
PRINT_ERROR("Could not enable CAN_RAW_ERR_FILTER\n");
71+
state = STATE_SHUTDOWN;
72+
return;
73+
}
7174
}
7275

7376
if (bind(raw_socket, (struct sockaddr *)&addr, sizeof(addr)) < 0) {

0 commit comments

Comments
 (0)